;****************************************************** ; ;    お気楽レヴロガーG ; ; 00/09/03 Masashi Kawanishi ; PIC16F84:20MHz用(1cycle=0.2us) ; ; 電源入れて20秒間の後計測開始 ; はじめの1秒の間にSW押すとセンサー調整モード ; 調整モード中にもう一回押すとRS232Cデータ送信モード ; データ送信モード: ;  9600bps, 8bit, 1stopbit ;  パリティーなし、フロー制御なし ;  テキストデータが0000番地から順に流れてくる ; ; 10msおきに30回Gセンサーのパルスを測定、 ; サーボパルスを一回測定(+20ms)、 ; タイマ0で測定した回転数を記録(+10ms) ; それぞれの値をすべて16ビットデータで順に ; EEPROMに書きこみ ; ; ピンアサイン ; RA0 <- サーボシグナル (1がON 0がOFF) ; RA1 <- Gセンサーパルス (1がON 0がOFF) ; RA3 -> LED (1でOFF 0でON) ; RA4 <- 回転センサー入力 (1で暗 0で明) ; RB1 <- プッシュSW (1でOFF 0でON) ; RB2 -> RS232C送信 ; RB3 <- RS232C受信 ; RB6 -> SCLK ; RB7 <-> SDA ; ;****************************************************** LIST P=PIC16F84A INCLUDE "P16F84A.INC" ;****************************** ; 変数レジスタ定義 ;****************************** eeprom equ 0CH ; eeprom bit buffer bycnt equ 0DH ; eeprom byte counter addrl equ 0EH ; eeprom address(low) addrh equ 0FH ; eeprom address(high) datai equ 10H ; eeprom data input datao equ 11H ; eeprom data output 1st byte datao2 equ 12H ; eeprom data output 2nd byte slave equ 15H ; eeprom slave address txbuf equ 16H ; eeprom transmit buffer count equ 17H ; eeprom bit counter bcount equ 18H ; bcount CNTa equ 19H ; Time counter CNTb equ 1AH CNTc equ 1BH CNTd equ 1CH CNTe equ 1DH CNTf equ 1EH ; fは汎用 SENDT equ 1FH ; ウェイト時間調整用 BITW equ 20H ; ビット数 TXDATA equ 21H ; 送信データ(8ビット) DISBUF equ 22H ;RSキャラクタ送信用 cyclecnt equ 24H ;測定サイクルカウンター tmcnth equ 26H ;サイクル内タイムカウンター(10 or 20ms)上位 tmcntl equ 27H ;サイクル内タイムカウンター(10 or 20ms)下位 adcnth equ 28H ;書き込みアドレスカウンタ上位 adcntl equ 29H ;書きこみアドレスカウンタ下位 plscnth equ 2AH ; パルスカウンタ上位 plscntl equ 2BH ; パルスカウンタ下位 ;******************************* ; ビット定義他 ;******************************* di equ 7 ;eeprom input bit do equ 6 ;eeprom output bit sdata equ 7 ;serial EE data line (port_b ,pin13) sclk equ 6 ;serial EE clock line (port_b, pin12) ackf equ 3 ; acknowledge fail LED (port_a, pin2) BTIME equ D'170' ; 9600bps @20MHz org 0 ;******************** ; ポートセット、初期化 ;******************** bsf STATUS, RP0 movlw b'00010011' ;RA set : port 0,1,4 for input, other output movwf TRISA movlw b'00001010' ;RB set : Port 1,3 for input movwf TRISB movlw b'11101000' ; pullup off, clk=RA4, たち上がりエッジ, ; プリスケーラなし movwf OPTION_REG bcf STATUS, RP0 movlw b'00001000' movwf PORTA ;LED消灯 movlw b'00000100' movwf PORTB ;RS232C初期化 ; ■■■■■■■■■■■■■■■■■■■■ ; テスト用サブルーチン ; ■■■■■■■■■■■■■■■■■■■■ goto MENU1 test1 bcf PORTA, 3 ; LED点灯 call TIM1S bsf PORTA, 3 call TIM1S goto test1 ;******************************* ;  メインルーチン ;******************************* MENU1 ;1秒間SWが押されたか監視、おされたら調整モードへ ; その間はLEDが早く(100ms周期で)点滅 movlw 0AH ; set 10 movwf CNTf MENU2 MOVLW 0AH ; set 10 MOVWF CNTe bcf PORTA, 3 ; LED点灯 MENU3 CALL TIME5M ; BTFSS PORTB,1 ; SWが1(off)だったらスキップ GOTO SNSADJ ; onだったらセンサー調整モードへ DECFSZ CNTe,F GOTO MENU3 MOVLW 0AH ; set 10 MOVWF CNTe bsf PORTA, 3 ; LED消灯 MENU4 CALL TIME5M ; BTFSS PORTB,1 ; SWが1(off)だったらスキップ GOTO SNSADJ ; onだったらセンサー調整モードへ DECFSZ CNTe,F GOTO MENU4 decfsz CNTf, f goto MENU2 ;********* 測定モード ******************** bcf PORTA, 3 ; LED点灯 MOVLW 13H ; set 19 MOVWF CNTf T_LP9 MOVLW 64H ; set 100 MOVWF CNTe bcf PORTA, 3 ; LED点灯 T_LP10 call TIME5M decfsz CNTe, f goto T_LP10 MOVLW 64H ; set 100 MOVWF CNTe bsf PORTA, 3 ; LED消灯 T_LP11 call TIME5M decfsz CNTe, f goto T_LP11 DECFSZ CNTf, F GOTO T_LP9 ;*******19秒待った後(計20秒)測定開始******* MEAMAIN0 movlw 80H movwf adcnth ; アドレス最上位bitはeeprom上で無視される ; 32kbyte超えた時にオーバーフローするようにセット clrf adcntl clrf TMR0 bcf INTCON, T0IF ; タイマ0クリア  MEAMAIN1 movlw 1EH ; cyclecnt=30 movwf cyclecnt ; 30回Gパルス測定、その後サーボパルス、回転を記録 MEAMAIN2 movlw 0D9H movwf tmcnth movlw 0AFH movwf tmcntl ; 10000カウント(10ms)+で0000Hになるように ; 1カウント1us ; カウント外stepが955(191us) : 10000-191= 9809カウントで0000 ; 65536-9809 = 55727 = D9AFH clrf plscnth ; パルスカウンタのクリア clrf plscntl ; *** Gパルス計測開始 ********** Gsens0 btfss PORTA, 1 goto Gsens1 ; パルスがlowになったらGsens1へ ; パルスがハイなので待つ incf tmcntl, f ; ワンサイクル2us incfsz tmcntl, f ; 0になったらスキップ goto tm1 ; 下位が0になった incfsz tmcnth, f goto tm2 ; 10ms 経過してしまった goto Gsens4 ; 仕方ないので書きこみ処理へ tm1 ; tmcntl減算、オーバーフローなし nop nop tm2 goto Gsens0 Gsens1 btfsc PORTA, 1 goto Gsens2 ; パルスがhighになったらGsens2へ ; パルスがローなので待つ incf tmcntl, f ; ワンサイクル2us incfsz tmcntl, f ; 0になったらスキップ goto tm3 ; 下位が0になった incfsz tmcnth, f goto tm4 ; 10ms 経過してしまった goto Gsens4 ; 仕方ないので書きこみ処理へ tm3 ; tmcntl減算、オーバーフローなし nop nop tm4 goto Gsens1 Gsens2 ;**** Gパルス計測開始 **** btfss PORTA, 1 goto Gsens3 ; パルスがlowになったらGsens3へ incf plscntl, f ; ワンサイクル2us incfsz plscntl, f ; 0になったらスキップ goto tm5 ; 下位が0になった incfsz plscnth, f goto tm6 ; 65ms 経過してしまった goto Gsens4 ; 仕方ないので書きこみ処理へ tm5 ; tmcntl減算、オーバーフローなし nop nop tm6 goto Gsens2 Gsens3 ;*** 計測後10ms経過まで待ち *** movf plscntl, w addwf tmcntl, f btfsc STATUS, C incf tmcnth, f movf plscnth, w addwf tmcnth, f btfsc STATUS, C goto Gsens4 ; オーバーフローしたので書きこみ処理へ Gsens31 bsf tmcntl, 0 ; +1、必ず奇数になるように incfsz tmcntl, f goto tm8 ; オーバーフローしなかったらtm8へ incfsz tmcnth, f goto tm9 ; オーバーフローしなかったらtm9へ goto Gsens4 ; オーバーフローしたので書きこみ処理へ tm8 nop nop tm9 nop nop goto Gsens31 Gsens4 ; 書きこみ処理 movf adcnth, w movwf addrh movf adcntl, w movwf addrl movf plscnth, w movwf datao movf plscntl, w movwf datao2 call EEPWT ; subroutine EEPWT=907steps clrf plscnth clrf plscntl incf adcntl, f incfsz adcntl, f ;アドレスカウンター下位がオーバーフローしたら次をスキップ goto EEP3 ;下位オーバーフローせず(6) incfsz adcnth, f ;下位がオーバーフローしたので上位+1、さらにオーバーフローしたら次をスキップ goto EEP4 ;上位オーバーフローせず(8) ENDLOOP ;上位もオーバーフロー bcf PORTA,3 ;LED点灯 call TIM1S ; bsf PORTA,3 ;LED消灯 call TIM1S goto ENDLOOP ;無限ループ EEP3 nop nop ; EEP4 nop nop nop nop decfsz cyclecnt, f goto MEAMAIN2 ; 30回 X 10ms測定するまでループ ; カウント外step 6+9+8+18+907+7 = 955= 191us ; ******* サーボパルス計測 *********** movlw 0B2H movwf tmcnth movlw 09EH movwf tmcntl ; 20000カウント(20ms)+で0000Hになるように ; 1カウント1us ; カウント外stepが955(191us) : 20000-190= 19810カウントで0000 ; 65536-19810 = 45726 = B29EH clrf plscnth ; パルスカウンタのクリア clrf plscntl ; *** パルス計測開始 ********** Ssens0 btfss PORTA, 0 goto Ssens1 ; パルスがlowになったらGsens1へ ; パルスがハイなので待つ incf tmcntl, f ; ワンサイクル2us incfsz tmcntl, f ; 0になったらスキップ goto tm11 ; 下位が0になった incfsz tmcnth, f goto tm12 ; 20ms 経過してしまった goto Ssens4 ; 仕方ないので書きこみ処理へ tm11 ; tmcntl減算、オーバーフローなし nop nop tm12 goto Ssens0 Ssens1 btfsc PORTA, 0 goto Ssens2 ; パルスがhighになったらSsens2へ ; パルスがローなので待つ incf tmcntl, f ; ワンサイクル2us incfsz tmcntl, f ; 0になったらスキップ goto tm13 ; 下位が0になった incfsz tmcnth, f goto tm14 ; 10ms 経過してしまった goto Ssens4 ; 仕方ないので書きこみ処理へ tm13 ; tmcntl減算、オーバーフローなし nop nop tm14 goto Ssens1 Ssens2 ;**** パルス計測開始 **** btfss PORTA, 0 goto Ssens3 ; パルスがlowになったらGsens3へ incf plscntl, f ; ワンサイクル2us incfsz plscntl, f ; 0になったらスキップ goto tm15 ; 下位が0になった incfsz plscnth, f goto tm16 ; 65ms 経過してしまった goto Ssens4 ; 仕方ないので書きこみ処理へ tm15 ; tmcntl減算、オーバーフローなし nop nop tm16 goto Ssens2 Ssens3 ;*** 計測後20ms経過まで待ち *** movf plscntl, w addwf tmcntl, f btfsc STATUS, C incf tmcnth, f movf plscnth, w addwf tmcnth, f btfsc STATUS, C goto Ssens4 ; オーバーフローしたので書きこみ処理へ Ssens31 bsf tmcntl, 0 ; +1、必ず奇数になるように incfsz tmcntl, f goto tm18 ; オーバーフローしなかったらtm8へ incfsz tmcnth, f goto tm19 ; オーバーフローしなかったらtm9へ goto Ssens4 ; オーバーフローしたので書きこみ処理へ tm18 nop nop tm19 nop nop goto Ssens31 Ssens4 ; 書きこみ処理 movf adcnth, w movwf addrh movf adcntl, w movwf addrl movf plscnth, w movwf datao movf plscntl, w movwf datao2 call EEPWT ; subroutine EEPWT=907steps clrf plscnth clrf plscntl incf adcntl, f incfsz adcntl, f ;アドレスカウンター下位がオーバーフローしたら次をスキップ goto EEP13 ;下位オーバーフローせず(6) incfsz adcnth, f ;下位がオーバーフローしたので上位+1、さらにオーバーフローしたら次をスキップ goto EEP14 ;上位オーバーフローせず(8) ENDLOOP2 ;上位もオーバーフロー bcf PORTA,3 ;LED点灯 call TIM1S ; bsf PORTA,3 ;LED消灯 call TIM1S goto ENDLOOP2 ;無限ループ EEP13 nop nop ; EEP14 nop nop ; カウント外step 6+9+8+18+907+2 = 950= 190us ; ***** ここまででGパルス300ms+サーボパルス20ms ******** ; ************* 回転数記録 ************ ; ; カウント外ステップ =940steps = 188us ; (33+907 = 940) ; 10ms(50000steps)まで残り9812us(49060steps) nop nop movlw 0D9H ; 65536-9812 = 55724 movwf tmcnth ; = 0D9ACH movlw 0ACH movwf tmcntl tm20 incf tmcntl, f incfsz tmcntl, f goto tm21 incfsz tmcnth, f goto tm22 goto RW1 tm21 nop nop tm22 nop nop goto tm20 RW1 movf TMR0, W movwf plscntl clrf TMR0 bcf INTCON, T0IF ; タイマ0クリア movf adcnth, w movwf addrh movf adcntl, w movwf addrl clrf datao movf plscntl, w movwf datao2 call EEPWT ; subroutine EEPWT=907steps clrf plscnth clrf plscntl incf adcntl, f incfsz adcntl, f ;アドレスカウンター下位がオーバーフローしたら次をスキップ goto EEP23 ;下位オーバーフローせず(6) incfsz adcnth, f ;下位がオーバーフローしたので上位+1、さらにオーバーフローしたら次をスキップ goto EEP24 ;上位オーバーフローせず(8) ENDLOOP3 ;上位もオーバーフロー bcf PORTA,3 ;LED点灯 call TIM1S ; bsf PORTA,3 ;LED消灯 call TIM1S goto ENDLOOP3 ;無限ループ EEP23 nop nop ; EEP24 goto MEAMAIN1 ; ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ ;********* センサー感度調整モード ************ SNSADJ call TIME5M ;5ms待ち btfss PORTB, 1 ;SWがおされていたら(0)戻る goto SNSADJ call TIME5M call TIME5M btfss PORTB, 1 goto SNSADJ SENSOR2 btfss PORTB, 1 ;スイッチが押されていなかったら(1)スキップ goto DATTMT ;おされたらデータ送信モードへ BTFSS PORTA,4 ;現在センサが1(暗)だったら次をスキップ GOTO SENSOR3 BSF PORTA,3 ;LED消灯 GOTO SENSOR2 SENSOR3 BCF PORTA,3 ;LED点灯 GOTO SENSOR2 ;********* データ送信モード ********** DATTMT nop bsf PORTB, 2 ;232C初期化 call TIM1S TMT0 btfsc PORTB, 3 goto TMT0 clrf addrl movlw 80H movwf addrh TMT1 call EEPRD ; datai に読み出し movlw 0F0H andwf datai ,w ;datai上位をWに抽出 movwf DISBUF swapf DISBUF, f movlw 0AH subwf DISBUF,w ;DISBUF - 0AH ...DISBUF<=09HのときC=0 btfsc STATUS, C ;DISBUF<09Hのとき次をスキップ goto DISB1 movlw 30H ;DISBUF <= 09H addwf DISBUF, f goto DISB2 DISB1 movlw 37H ;DISBUF => 0AH addwf DISBUF, f DISB2 movf DISBUF, w movwf TXDATA call RSTRANS ;RS232C出力 movlw 0FH andwf datai ,w ;datai下位をWに抽出 movwf DISBUF movlw 0AH subwf DISBUF,w ;DISBUF - 0AH ...DISBUF<=09HのときC=0 btfsc STATUS, C ;DISBUF<09Hのとき次をスキップ goto DISB3 movlw 30H ;DISBUF <= 09H addwf DISBUF, f goto DISB4 DISB3 movlw 37H ;DISBUF => 0AH addwf DISBUF, f DISB4 movf DISBUF, w movwf TXDATA call RSTRANS ;RS232C出力 btfss addrl, 0 ;アドレス下位の0ビット目が1の場合(奇数アドレス)次をスキップ goto TMT2 ;偶数アドレスの場合CRを出力せずに次のアドレスへ ; 改行はCR(0DH)+LF(0AH) movlw 0DH ; CR movwf TXDATA call RSTRANS ;RS232C出力 movlw 0AH ; LF movwf TXDATA call RSTRANS ;RS232C出力 TMT2 incfsz addrl, f ;アドレス下位+1、オーバーフローで次をスキップ goto TMT1 ;オーバーフローなしでループ incfsz addrh, f ;アドレス上位+1、オーバーフローで次をスキップ goto TMT1 ;オーバーフローなしでループ TMT3 ;addrがオーバーフロー bcf PORTA,3 ;LED点灯 call TIM1S ; bsf PORTA,3 ;LED消灯 call TIM1S goto TMT3 ;無限ループ ;**************************************** ; write サブルーチン(4byte) ; アドレス : addrh, addrl ; データ : datao, datao2, datao3, datao4 ;**************************************** EEPWT movlw b'10100000' ;スレーブアドレス=0, write mode(1) movwf slave call BSTART ;generate start bit ;(25) ;****** data transmit ********** movf slave,w ; move slave address(26) movwf txbuf ; into transmit buffer call TX ; and send it ; movf addrh,w ; move word address(h) movwf txbuf ; into transmit buffer call TX ; and send it movf addrl,w ; move word address(l) movwf txbuf ; into transmit buffer call TX ; and send it movf datao,w ; move data byte(1st) movwf txbuf ; to tranmit buffer call TX ; and transmit it movf datao2,w ; move data byte(2nd) movwf txbuf ; to tranmit buffer call TX ; and transmit it ; 45+(169*5)=890 ;****** stop bit 発生 ******* bcf PORTB, sdata ; make sure data line is low nop nop nop bsf PORTB, sclk ; set clock high nop nop nop bsf PORTB, sdata ; data goes high while clock high ; for stop bit nop ; (900) nop bcf PORTB, sclk ; set clock low again nop nop nop ; **** End of stop bit **** retlw 0 ; (907) ;******************************* ; read サブルーチン ; アドレス : addrh, addrl ; データ : datai ;******************************* EEPRD call BSTART ;generate start bit ;****** data transmit & recieve ********** movlw b'10100000' ; get slave address (write mode) movwf txbuf ; into transmit buffer call TX ; and send it movf addrh,w ; move word address(h) movwf txbuf ; into transmit buffer call TX ; and send it movf addrl,w ; move word address(l) movwf txbuf ; into transmit buffer call TX ; and send it call BSTART ;generate start bit movlw b'10100001' ; get slave address (read mode) movwf txbuf ; into transmit buffer call TX ; and send it call RX ;****** stop bit 発生 ******* bcf PORTB, sdata ; make sure data line is low nop nop nop bsf PORTB, sclk ; set clock high nop nop nop bsf PORTB, sdata ; data goes high while clock high ; for stop bit nop nop bcf PORTB, sclk ; set clock low again nop nop nop ; **** End of stop bit **** retlw 0 ; ********************************** ; ****** Transmit data subroutine ******* ; ********************************** ; TX movlw .8 ;(1) movwf count ; set the #bits to 8 ; TXLP bcf eeprom,do ; assume bit out is low btfsc txbuf, 7 ; is bit out really low? bsf eeprom,do ; otherwise data bit =1 ;** bit out *** btfss eeprom,do ; check for state of data bit to xmit goto bitlow ; bsf PORTB, sdata ; set data line high goto clkout ; go toggle the clock bitlow bcf PORTB, sdata ; output a low bit nop ;Time adjustment clkout bsf PORTB, sclk ; set clock line high nop nop nop nop bcf PORTB, sclk ; return clock line low ;** End of bit out *** rlf txbuf, F ; rotate txbuf left decfsz count, F ; 8 bits done? goto TXLP ; no - go again ;** bit in *** bsf eeprom,di ; assume input bit is high bsf STATUS, RP0 movlw b'10001010' ; make sdata an input line movwf TRISB bcf STATUS, RP0 bsf PORTB, sclk ; set clock line high nop ; just sit here a sec nop nop nop nop ; btfss PORTB, sdata ; read the data bit bcf eeprom, di ; input bit was low bcf PORTB, sclk ; set clock line low nop bsf STATUS, RP0 movlw b'00001010' ; make sdata an input line movwf TRISB bcf STATUS, RP0 ;** End of bit in *** nop btfsc eeprom,di ; check ack bit bsf PORTA, ackf ; set acknowledge fail LED if no ack retlw 0 ;******************************* ;**** Receive data routine ********* ;******************************* RX clrf datai ; clear input buffer movlw .8 ; set # bits to 8 movwf count bcf STATUS,0 ; make sure carry bit is low RXLP rlf datai, F ; rotate datai 1 bit left ;** bit in *** bsf eeprom,di ; assume input bit is high bsf STATUS, RP0 movlw b'10001010' ; make sdata an input line movwf TRISB bcf STATUS, RP0 bsf PORTB, sclk ; set clock line high nop ; just sit here a sec nop nop nop nop ; btfss PORTB, sdata ; read the data bit bcf eeprom, di ; input bit was low bcf PORTB, sclk ; set clock line low nop bsf STATUS, RP0 movlw b'00001010' ; make sdata an input line movwf TRISB bcf STATUS, RP0 ;** End of bit in *** btfsc eeprom,di bsf datai,0 ; set bit 0 if necessary decfsz count, F ; 8 bits done? goto RXLP ; no, do another bsf eeprom,do ; set ack bit = 1 ;** bit out *** btfss eeprom,do ; check for state of data bit to xmit goto bitlow2 ; bsf PORTB, sdata ; set data line high goto clkout2 ; go toggle the clock bitlow2 bcf PORTB, sdata ; output a low bit nop ;Time adjustment clkout2 bsf PORTB, sclk ; set clock line high nop nop nop nop bcf PORTB, sclk ; return clock line low ;** End of bit out *** retlw 0 ;****** start bit Subroutine (21steps) ******* BSTART bsf PORTB, sdata ; make sure data is high nop bcf PORTB, sclk ; make sure clock is low nop bsf PORTB, sclk ; set clock high nop nop nop nop nop bcf PORTB, sdata ; data line goes low during ; high clock for start bit nop nop nop nop nop ; timing adjustment bcf PORTB, sclk ; start clock train nop nop retlw 0 ;****** End of start bit ******** ;************************************************ ;* RS232C transmit routine * ;* input TXDATA * ;************************************************ RSTRANS BCF PORTB, 2 MOVLW BTIME MOVWF SENDT TRANS10 DECFSZ SENDT,F GOTO TRANS10 MOVLW 08H MOVWF BITW NOP TRANS0 RRF TXDATA,F NOP BTFSS STATUS,C ; データ出力(LSBから) BCF PORTB, 2 BTFSC STATUS,C BSF PORTB, 2 MOVLW BTIME MOVWF SENDT TRANS11 DECFSZ SENDT,F GOTO TRANS11 DECFSZ BITW,F GOTO TRANS0 NOP NOP NOP NOP NOP NOP BSF PORTB, 2 MOVLW BTIME MOVWF SENDT TRANS12 DECFSZ SENDT,F ; STOPビット分ウェイト GOTO TRANS12 RETLW 00H ;********************************* ; タイマーサブルーチン ; TIME10 :10usec ; TIME100 :100usec ; TIME1M :1msec ; TIME5M :5msec ; TIM1S :1sec ;********************************* TIME100 ;100usec MOVLW 9H MOVWF CNTa T_LP1 CALL TIME10 ;2+(2+50+3)*9-1=496 DECFSZ CNTa,F GOTO T_LP1 NOP NOP RETURN ;500*0.2=100usec TIME10 ;10usec MOVLW 0FH MOVWF CNTb T_LP2 DECFSZ CNTb,F ;2+3*15-1=46 GOTO T_LP2 NOP NOP RETURN ;46+4=50, 50*0.2=10usec TIME1M ;1msec (approx.) MOVLW 0AH MOVWF CNTc T_LP3 CALL TIME100 ;2+(500+5)*10-1=5051 DECFSZ CNTc,F GOTO T_LP3 RETURN ;5053 (=1.0106msec) TIME5M ;5msec(about) MOVLW 32H MOVWF CNTd T_LP4 CALL TIME100 ;2+(500+5)*50-1=25251 DECFSZ CNTd,F GOTO T_LP4 RETURN ;25253 (=5050.6usec) TIM1S MOVLW 0C8H ;set 200 MOVWF CNTe T_LP5 CALL TIME5M ;2+(25253+5)*200-1=5051601 DECFSZ CNTe,F GOTO T_LP5 RETURN ;5051603 (=1,010,320.6usec) END