Вот текст interrupt проги целиком Хотелось узнать бы еще мнение специалиста по вопросу перевода ее на С. Камень Tiny45, генератор IntRC 8 Мгц, частота прерываний 32 кГц. ИМХО один из подводных камней - размер кода, полученного от С компилятора. Поскольку на выполнение sr можно выделить максимум 30 мкс , а там цикл повторяется 6 раз и еще подпрограмма умножения 8*8, то может не успеть.
;***************************************************************************;
; 32 kHz wave form synthesising interrupt ;
;===========================================================================;
isr_tc0_coma: ;============================================;
in _Sreg, SREG ; Save regs... In Port Rd P ;
movw _Zreg, ZL ; Move Word Between Registers ;
movw _Yreg, YL ;/ ;
; ; ;
ldiw Y, Notes ;Process all notes Load Immediate ;
clrw T2 ;Clear accumlator ;
tone_lp: ; ;
ldd EH, Y+ns_rptr ;Load wave table pointer ( ns_rptr ) ;
lddw Z, Y+ns_rptr+1 ;/ ;
lpm EL, Z ;Get a sample Load Program Memory ;
lddw T4, Y+ns_freq ;Load angular speed ;
add EH, T4L ;Increase wave table ptr (next angle) ;
adc ZL, T4H ;======; ;
adc ZH, _0 ; / Add with Carry two Registers ;
cpi ZH, high(wt_end*2) ; Repeat sustain area ;
brcs tn110 ; Branch if Carry Set ;
; ; ;
subiw Z, (wt_end-wt_loop)*2 ; ;
std Y+ns_wrap, _0 ; / ;
tn110: ; ;
std Y+ns_rptr, EH ; Save wave table ptr ;
stdw Y+ns_rptr+1, Z ; / ;
ldd EH, Y+ns_lvl ; Apply envelope curve Load Indirect ;
MULT ; / ;
addw T2, T0 ; Add the sample to accumlator ;
adiw YL, 9 ; Next note ;
cpi YL, low(Notes+nsize*N_NOTE); Compare Register with Immediate;
; ; ;
brne tone_lp ; / Branch if Not Equal if (Z = 0) t;
;-------------------------------------; ;
asrw T2 ;======; ;
asrw T2 ;Divide it by 4 Arithmetic Shift Right ;
ldiw E, 253 ;Clip it between -255 to 253 ;
cpw T2, E ; ;
brlt tn120 ; ;
; ; ;
movw T2L, EL ; ;
tn120: ; ;
ldiw E, -255 ; ;
cpw T2, E ; ;
brge tn100 ; ;
; ; ;
movw T2L, EL ;/ ;
tn100: ; ;
asrw T2 ;Set it to PWM modulator ;
ror T2H ; ;
mov EL, T2L ; ;
subi EL, 0x80 ; ;
mov EH, EL ; ;
com EH ; ;
sbrc T2H, 7 ; ;
inc EL ; ;
out OCR1A, EL ; ;
out OCR1B, EH ; / ;
; ; ;
sec ; Increment sequense timer ;
adc _TmrS, _0 ; Ќ Є ¦¤лҐ 256 ЁЄаҐ¬. _TmrS ¤Ґ« Ґвбп 1 ;
adc _TmrL, _0 ; ЁЄаҐ¬Ґв _Tmr, Є®в®ал© Ї®«гз Ґвбп а ўҐ ;
adc _TmrH, _0 ; 8 ¬‘ ;
; ; ;
movw ZL, _Zreg ; Restore regs... ;
movw YL, _Yreg ; ;
out SREG, _Sreg ; / ;
; ; ;
reti ;============================================;