;******************************************************************** ; 受信機用パルス幅測定プログラム ; ver 1.00 ; 測定範囲は 0〜3000usec ;******************************************************************** LIST P=PIC16F84 INCLUDE "P16F84.INC" ;****************************** ; 変数レジスタ割付定義 ;****************************** DPDT EQU 0CH ;LCD output data DISLOW EQU 0DH ;表示カウンタ下位 DISHIGH EQU 0EH ;表示カウンタ上位 CNT1 EQU 0FH ;タイマ用カウンタ CNT2 EQU 10H CNT3 EQU 11H CNT4 EQU 12H CNT5 EQU 13H WORK1 EQU 14H ;work TEMP EQU 15H ;tempolary work ZFLG EQU 16H ;zero supress flag TRCNT EQU 17H ;Transimit counter TRINTVL EQU 18H ;Transmit interval BINL EQU 19H ;binary couter low BINH EQU 1AH ;Binary counter upper ORG 0 ;******************************** ; メインプログラム ;******************************** ;*** 初期化 **** MAIN CALL PORT_INI ;Port A,B initialize CLRF PORTB ;all clear CALL LCD_INI ;Reset LCD ;**** 測定メインループ ***** MAIN0 CLRF BINL CLRF BINH MAIN1 BTFSC PORTA,3 ;信号が0になるまで待つ GOTO MAIN1 MAIN2 BTFSS PORTA,3 ;信号が1になるまで待つ GOTO MAIN2 MAIN3 INCFSZ BINL,F ;(1)BINLカウントアップして GOTO MAIN4 ;オーバーフローしなかったらMAIN4へ INCF BINH,F MAIN4 BTFSC PORTA,3 GOTO MAIN3 ;(6) CALL CONV ;バイナリからBCDに変換 CALL LCD_CLR ;表示クリア CALL DISP ;距離データ表示 CALL TIM1S ;1秒待ち GOTO MAIN0 ;************************************* ; バイナリからBCDへの変換 ; バイナリ-1と同時にBCD+1 ;************************************* CONV CLRF DISLOW ;初期クリア CLRF DISHIGH INCF BINH,F ;上位+1 COLP CALL DISUP ;BCD+1 DECFSZ BINL,F ;バイナリ下位−1 GOTO COLP ;ゼロで無い DECFSZ BINH,F ;バイナリ上位−1 GOTO COLP ;ゼロで無い RETURN ;全部ゼロで完了 ;************************************ ; 3桁BCDカウントアップサブルーチン ; 最大9024までと仮定 ;************************************ DISUP INCF DISLOW,F ;1桁目+1 MOVF DISLOW,W ;1桁目オーバーフローチェック ANDLW 0FH ;下位4ビット SUBLW 0AH ;W-10 BTFSS STATUS,Z ;W=10か RETURN ;カウントアップ終了 ;*** 2桁目カウントアップ **** MOVF DISLOW,W ;再取り出し ANDLW 0F0H ;1桁目0セット ADDLW 010H ;2桁目カウントアップ MOVWF DISLOW ;更新 ANDLW 0F0H ;上位4ビット SUBLW 0A0H ;2桁目オーバーフロー BTFSS STATUS,Z RETURN ;終了 ;**** 3桁目カウントアップ **** CLRF DISLOW ;1,2桁目更新 INCF DISHIGH,F ;3桁目カウントアップ MOVF DISHIGH,W ANDLW 0FH ;下位4ビット SUBLW 0AH BTFSS STATUS,Z ;3桁目オーバーフロー? RETURN ;終了 ;**** 4桁目 **** MOVF DISHIGH,W ANDLW 0F0H ADDLW 010H MOVWF DISHIGH RETURN ;****************************************** ; 3桁表示サブルーチン ゼロサプレス付き ; 単位"cm"表示 ;***************************************** DISP BCF ZFLG,0 ;reset zero flag MOVF DISHIGH,W CALL DISP_D ;display 1,2digits MOVF DISLOW,W CALL DISP_D ;display 3,4digits ;**** 単位表示 **** MOVLW "X" ;display cm CALL LCD_DATA MOVLW "2" CALL LCD_DATA MOVLW "." CALL LCD_DATA MOVLW "4" CALL LCD_DATA MOVLW "u" CALL LCD_DATA MOVLW "s" CALL LCD_DATA MOVLW "e" CALL LCD_DATA MOVLW "c" CALL LCD_DATA RETURN ;**** 2桁BCD表示 ***** DISP_D MOVWF WORK1 ;一時保存 SWAPF WORK1,W ;桁入れ替え ANDLW 0FH ;上位だけ取り出し MOVWF TEMP ;一時保管 BTFSS ZFLG,0 ;既にゼロでないか? CALL ZEROSUP ;ゼロチェック MOVF TEMP,W SUBLW 0FH ;ゼロサプレスか? BTFSS STATUS,Z GOTO NUM1 ;サプレスしない MOVLW 020H ;ゼロサプレス GOTO DISP1 ;ブランク表示 ;**** 数字表示 **** NUM1 MOVF TEMP,W ;再取り出し IORLW 030H ;ASCIIコードに変換 ;**** 表示制御 **** DISP1 CALL LCD_DATA ;表示 ;**** 下位桁の表示 **** MOVF WORK1,W ;再取り出し ANDLW 0FH ;下位桁取り出し MOVWF TEMP ;一時保管 BTFSS ZFLG,0 ;既にゼロでないか? CALL ZEROSUP ;ゼロチェック MOVF TEMP,W ; SUBLW 0FH ;再取り出し BTFSS STATUS,Z ;ゼロサプレスか? GOTO NUM2 ;数字表示へ MOVLW 020H ;ゼロサプレス GOTO DISP2 ;**** 数字表示 **** NUM2 MOVF TEMP,W IORLW 030H ;ASCIIコードに変換 DISP2 CALL LCD_DATA ;表示 RETURN ;**** ゼロチェック、ゼロのときOFを返す **** ZEROSUP ANDLW 0FH ;check zero BTFSS STATUS,Z GOTO ZEND ;not zero MOVLW 0FH MOVWF TEMP ;set blank BCF ZFLG,0 ;zero flag off RETURN ZEND BSF ZFLG,0 ;not zero flag on MOVF TEMP,W RETURN ;*************************************************** ; 液晶表示器制御サブルーチン ;*************************************************** ;**** 表示データ書込み **** LCD_DATA MOVWF DPDT ;save dat ANDLW 0F0H ;mask lower MOVWF PORTB BCF PORTA,1 ;R/W BSF PORTA,2 ;RS high BSF PORTA,0 ;E high BCF PORTA,0 ;E low SWAPF DPDT,W ;get data lower ANDLW 0F0H MOVWF PORTB BSF PORTA,0 BCF PORTA,0 CALL LCD_BUSY RETURN ;**** コマンドデータ出力 ***** LCD_CMD MOVWF DPDT ;save dat ANDLW 0F0H ;mask lower MOVWF PORTB BCF PORTA,1 ;R/W BCF PORTA,2 ;RS low BSF PORTA,0 ;E high BCF PORTA,0 ;E low SWAPF DPDT,W ;get data lower ANDLW 0F0H MOVWF PORTB BSF PORTA,0 BCF PORTA,0 CALL LCD_BUSY RETURN ;**** 表示クリアコマンド出力 **** LCD_CLR MOVLW 01H ;clear command CALL LCD_CMD RETURN ;**** 初期化 ***** LCD_INI CALL TIME5M ;wait MOVLW 030H ;Function set 8bits MOVWF PORTB BCF PORTA,1 ;R/W BCF PORTA,2 ;RS BSF PORTA,0 ;E high BCF PORTA,0 ;E low CALL TIME5M ;wait MOVLW 030H ;Function reset 8bits MOVWF PORTB BCF PORTA,1 ;R/W BCF PORTA,2 ;RS BSF PORTA,0 ;E high BCF PORTA,0 ;E low CALL TIME100 MOVLW 030H ;Function reset 8bits MOVWF PORTB BCF PORTA,1 BCF PORTA,2 BSF PORTA,0 BCF PORTA,0 CALL TIME100 MOVLW 020H ;Function set 4bits mode MOVWF PORTB ;under the 8bits mode BCF PORTA,1 BCF PORTA,2 BSF PORTA,0 BCF PORTA,0 CALL TIME100 ;From here 4bits mode MOVLW 02CH ;function DL=0 4bit mode CALL LCD_CMD MOVLW 08H ;Display off D=C=B=0 CALL LCD_CMD MOVLW 0CH ;Display on D=1 C=B=0 CALL LCD_CMD MOVLW 06H ;Entry I/D=1 S=0 CALL LCD_CMD RETURN ;**** ビジーチェック ************ LCD_BUSY CLRF DPDT BSF STATUS,RP0 ;Bank 1 BSF OPTION_REG,7 ;Turn off PORTB pull up MOVLW 0FEH ;PORTB input MOVWF TRISB BCF STATUS,RP0 ;Bank 0 BCF PORTA,2 ;RS low BSF PORTA,1 ;R/W high BSF PORTA,0 ;E high BCF PORTA,0 ;E low MOVF PORTB,W ;get upper ANDLW 0F0H ;Mask out lower MOVWF DPDT BSF PORTA,0 ;E high BCF PORTA,0 ;E low MOVF PORTB,W ;get lower ANDLW 0FH ;Mask out upper IORWF DPDT,F ;upper+lower BTFSC DPDT,7 ;BUSY flag check GOTO LCD_BUSY ;retry BCF PORTA,1 ;R/W low BSF STATUS,RP0 ;Bank 1 MOVLW 0EH ;RB1,2,3 input MOVWF TRISB ;PORTB BCF STATUS,RP0 ;Bank 0 RETURN ;************************************ ; 入出力ピンモード初期化サブルーチン ;************************************ PORT_INI BSF STATUS,RP0 ;Set page 1 MOVLW 0EH ;only RB1,2,3 input MOVWF TRISB ;PortB set all output MOVLW 08H ;only RA3 input MOVWF TRISA ;PortA set BCF STATUS,RP0 ;Set Page 0 RETURN ;********************************* ; タイマーサブルーチン ; TIME10 :10usec ; TIME100 :100usec ; TIME1M :1msec ; TIME5M :5msec ; TIM1S :1sec ;********************************* TIME100 ;100usec MOVLW 9H MOVWF CNT1 T_LP1 CALL TIME10 ;2+(26+3)*9-1=262 DECFSZ CNT1,F GOTO T_LP1 RETURN ;264*0.4=106usec(about) TIME10 ;10usec MOVLW 7H MOVWF CNT2 T_LP2 DECFSZ CNT2,F ;2+3*7-1=22 GOTO T_LP2 RETURN ;22+2=24 TIME1M ;1msec(about) MOVLW 0AH MOVWF CNT3 T_LP3 CALL TIME100 ;2+(266+3)*10-1=2691 DECFSZ CNT3,F GOTO T_LP3 RETURN ;2693 TIME5M ;5msec(about) MOVLW 38H MOVWF CNT4 T_LP4 CALL TIME100 ;2+(266+3)*56-1=15065 DECFSZ CNT4,F GOTO T_LP4 RETURN ;15067 TIM1S MOVLW 0C8H ;set 200 MOVWF CNT5 T_LP5 CALL TIME5M DECFSZ CNT5,F GOTO T_LP5 RETURN END