не, ребята, ну я вас умоляю ;О), вот ядро FIR, исполняется 53 такта в среднем, напишите на 51, Н8, и посчитайте результат... это не отвлечённые цифры, это конкретная задача, можно использовать в изделии. И она определяет область применения МК. Однозначно и жёстко. И тут не катят рассказы про компилятор, пмехоустойчивость и прочее. Если не сделать на АВРе, значит надо ставить более скоростной и более "восприимчивый к помехам" МК. Дальше только хуже. ;О)
clr mac_ll
movw mac_lm,r2
movw mac_hm,r2
clr mac_hu
ldi zl,low(FIR_coeff_25*2)
ldi zh,high(FIR_coeff_25*2)
ldi temporary2,200
FIR_loop:
cpi yl,low(circular_buffer)
brne test_by_load_pointer
cpi yh,high(circular_buffer)
brne test_by_load_pointer
ldi yl,low(circular_buffer+circular_buffer_depth)
ldi yh,high(circular_buffer+circular_buffer_depth)
test_by_load_pointer:
ld sy_s_h,-y
ld sy_s_l,-y
lpm coff_s_h,z+
lpm coff_s_m,z+
lpm coff_s_l,z+
adiw zl,1
;ld temporary1,z+
mul coff_s_l,sy_s_l
movw mres_0,r0
mulsu sy_s_h,coff_s_m
movw mres_2,r0
muls sy_s_h,coff_s_h
add mres_3,r0
mul coff_s_m,sy_s_l
add mres_1,r0
adc mres_2,r1
adc mres_3,zero_reg
mulsu sy_s_h,coff_s_l
sbc mres_3,zero_reg
add mres_1,r0
adc mres_2,r1
adc mres_3,zero_reg
mulsu coff_s_h,sy_s_l
add mres_2,r0
adc mres_3,r1
adition_mac:
add mac_ll,mres_0
adc mac_lm,mres_1
adc mac_mm,mres_2
adc mac_hm,mres_3
ldi temporary1,0
sbrc mres_3,7
ldi temporary1,$ff
adc mac_hh,temporary1
dec temporary2
brne FIR_loop
fir_exit: