init: set ovflwTMRT AA.0 clr ICflg set TMRT=FF ;;TMRA (pre256?? toff256??) scanDs: scan D1 && D2 (set Dflg) ↓ call ICon && goto FwdFront || ↑ nop FwdFront: stop TMRT ; TMRT → T ; [re]start TMRT mov LastData -> _ActData (pTMR[off|on] AA.0) goto ScanD ScanD: scan D1 || D2 (Dflg) ↓ goto FwdFront || ↑ goto RearFront RearFront: stop TMRA ; if ICflag=1 call ICoff swap D1-D2 Dflag if ovflwTMRT ; not start TMRA clr ovflwTMRT delay5ms call ICon else start TMRA (toff) clr AA.0 goto compAA compAA: comp tonH:tonL=TH:TL/4 (>>2) tonH = tonH:tonL/FF (>>8) comp след за старш ед битом веса tonH ; предделитель TMR0, OPTION:0:[PS2:0] TMRon = FF-tonH:tonL/[pTMRon] ; TMR0, где pTMRon = закодированный Коэф в OPTION:0:[PS2:0] if T < 7RPM | T > 1RPM ; AA=0 (Stsflg:AA.0=1) ; goto comp toff find xDPZ let loAA hiAA loRPM hiRPM sub 2b - 2b loDPZ=loRPM-T mul 2b * 2b hiDPZ=xDPZ-loDPZ add 4b + 4b AA=(hiAA*loDPZ+loAA*hiDPZ)/xDPZ div 4b : 2b toffH:toffL=TH:TL-AAH:AAL-tonH:tonL pTMRoff = toffH:toffL/FF*2 (>>7) ; предделитель TMR0, OPTION:0:[PS2:0] TMRoff = FF-toffH:toffL/[pTMRoff] ; TMR0, где pTMRoff = закодированный Коэф в OPTION:0:[PS2:0] goto ScanD ICon: if D1; PORTB IC1=1 (Dflag) ; else PORTB IC2=1 TAH=1 RMW!!! set ICflag return ICoff: clr PORTB RMW!!! clr ICflag return int004h: if TMRA stop TMRA if ICflag=0 call ICon ; if Stsflg:_AA.0=0 start TMRA (ton) ; retfie else call ICoff ; retfie else TMRT stop TMRT ; set ovflwTMRT ; set AA.0 ; 0xFF → TMRT ; retfie факт переполнения на малых оборотах, значение для след цикла Dflg = D1 | D2 log1 activ ICflag=PORTB IC1 | IC2=1 ??tonflag в цикле (ICoff по зад фронту и последующее прерывание TMRA)