здеся
clr mac_ll
movw mac_lm,r2
movw mac_hm,r2 ;очистка МАС
ldi zl,low(FIR_coeff_25*2)
ldi zh,high(FIR_coeff_25*2) ;загрузка индекса коэффициентов
ldi temporary2,200 ;кол-во tap`s
FIR_loop:
cpi yl,low(circular_buffer) 1
brne test_by_load_pointer 2
cpi yh,high(circular_buffer)
brne test_by_load_pointer ;проверка на выход за кольцевой буффер выборок АЦП
ldi yl,low(circular_buffer+circular_buffer_depth) 1
ldi yh,high(circular_buffer+circular_buffer_depth) 1
; если вышли - становимся на начало
test_by_load_pointer:
ld sy_s_h,-y ;берём выборку сигнала 2
ld sy_s_l,-y 2
lpm coff_s_h,z+ ;берём коэффициент фильтра 3
lpm coff_s_m,z+ 3
lpm coff_s_l,z+ 3
adiw zl,1 1 ;выравниваю индекс коэффициентов на границу 4 байт (можно выкинуть, если сделать массив коэфф. из 3-х байтных чисел)
;ld temporary1,z+
mul coff_s_l,sy_s_l ;signed 24x16 2
movw mres_0,r0 1
mulsu sy_s_h,coff_s_m 2
movw mres_2,r0 1
muls sy_s_h,coff_s_h 2
add mres_3,r0 1
mul coff_s_m,sy_s_l 2
add mres_1,r0 1
adc mres_2,r1 1
adc mres_3,zero_reg 1
mulsu sy_s_h,coff_s_l 2
sbc mres_3,zero_reg 1
add mres_1,r0 1
adc mres_2,r1
adc mres_3,zero_reg 1
mulsu coff_s_h,sy_s_l 2
add mres_2,r0 1
adc mres_3,r1 1
adition_mac:
add mac_ll,mres_0 1 ;суммирование signed
adc mac_lm,mres_1 1
adc mac_mm,mres_2 1
adc mac_hm,mres_3 1
ldi temporary1,0 1 ;sign propagate
sbrc mres_3,7 2
ldi temporary1,$ff
adc mac_hh,temporary1 1
;movw r0,xl
;sub r0,yl
;sbc r1,yh
;or r0,r1
dec temporary2 1
brne FIR_loop 2 ;цикл, если не уже ;О)
fir_exit: