ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Среда
27 ноября
91741 Топик полностью
=L.A.= (15.06.2007 09:22, просмотров: 1) ответил ReAl на Ну да.
Вот текст 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                   ;============================================;