;*********************************************************** ; Ver1.0 2003.10.19 KOKURA ; Ver1.2 2003,10.23 Aorc規格の00H〜0FHは、使用しないに合わせてみた ; Ver1.3 2003,10.23 入力ピンをPB4,5に変更 ; MPLABでコンパイル可能 ; Configuration Bit →OSC XT (10MHz)、WDT OFF ; AKI-PIC18キャリーボードキットでテスト LIST P=PIC16F84 INCLUDE "P16F84.INC" __CONFIG _HS_OSC & _WDT_OFF ;****************************** ; 変数レジスタ割付定義 ;****************************** #define rs1rxb PORTA, 4 ;RS-232C データ入力用ポート(porta, 4) #define rs1txb PORTA, 3 ;RS-232C データ出力用ポート(porta, 3) ;定数 btime はRS-232C のボーレイトから以下の式で計算できます。 ;btime ={(動作周波数(Hz) ÷ 転送スピード(bps) ÷4)−10}÷3 btime equ 53h ;9600bps 10MHz 時のウエイトタイム 53h = d'83' ;btime equ 1fh ;9600bps 4MHz 時のウエイトタイム ;btime equ 28h ;19200bps 10MHz 時のウエイトタイム ;btime equ 0eh ;19200bps 4MHz 時のウエイトタイム STATUS EQU 3 PORTA EQU 5 PORTB EQU 6 TRISA EQU H'85' TRISB EQU H'86' rs EQU H'0C' ;ビットタイムの作業用 flg EQU H'0D' ;受信データ有り無しフラグ cn EQU H'0E' ;8ビットシフトの作業用 rxd EQU H'0F' ;受信データ txd EQU H'10' ;送信データ COUNT1 EQU H'12' PIN1 EQU H'13' ;PIN1にch1のパルス幅が入る PIN2 EQU H'14' ;PIN2にch2のパルス幅が入る ORG 0 ;******************************** ; メインプログラム ;******************************** ;*** 初期化 **** MAIN CALL PORT_INI ;Port A,B initialize CLRF PORTB ;all clear ;**** メインループ ***** MAINLP CALL PULSIN1 ;ch1パルス幅取得 CALL PULSIN2 ;ch2パルス幅取得 movlw 01h movwf txd call rs1tx MOVF PIN1,0 ;PIN1の内容をWレジスタに書き込む movwf txd call rs1tx movlw 04h movwf txd call rs1tx MOVF PIN2,0 ;PIN2の内容をWレジスタに書き込む movwf txd call rs1tx GOTO MAINLP ;************************************ ; 入出力ピンモード初期化サブルーチン ;************************************ PORT_INI BSF STATUS,RP0 ;Set page 1 MOVLW B'11111111' ;RB all input MOVWF TRISB ;PortB set MOVLW B'11110111' ;RA3 output MOVWF TRISA ;PortA set bsf TRISA, 4 ;RS-232C データ入力用ポート(porta, 4) bcf TRISA, 3 ;RS-232C データ出力用ポート(porta, 3) BCF STATUS,RP0 ;Set Page 0 RETURN ;------------- 20サイクルタイマー(実際は19サイクル) TIM20 GOTO $+1 ;2 GOTO $+1 ;+2=4 GOTO $+1 ;+2=6 GOTO $+1 ;+2=8 GOTO $+1 ;+2=10 GOTO $+1 ;+2=12 GOTO $+1 ;+2=14 GOTO $+1 ;+2=16 NOP ;+1=17 RETURN ;+2=19 ;-----------パルス幅測定(PIN1)----------- PULSIN1 BTFSS PORTB,4 ;RB4=0の時OFF GOTO PULSIN1 ;入力待ちループ MOVLW 0 MOVWF PIN1 ;カウンター初期化 PULSIN11 CALL TIM20 ;20サイクル待ち (19+2) INCF PIN1,1 ;PIN1=PIN1+1 (22) BTFSC PORTB,4 ;ONの時は (23) GOTO PULSIN11 ;カウント継続 (25) MOVLW 0FH ;カウントが0F以下だったら SUBWF PIN1,0 ;カウントしなおし! BTFSS STATUS,0 ;(CY=0) PIN1<90 GOTO PULSIN1 ; RETURN ;-----------パルス幅測定(PIN2)----------- PULSIN2 BTFSS PORTB,5 ;RB5=0の時OFF GOTO PULSIN2 ;入力待ちループ MOVLW 0 MOVWF PIN2 ;カウンター初期化 PULSIN21 CALL TIM20 ;20サイクル待ち (19+2) INCF PIN2,1 ;PIN1=PIN1+1 (22) BTFSC PORTB,5 ;ONの時は (23) GOTO PULSIN21 ;カウント継続 (25) MOVLW 0FH ;カウントが0FH以下だったら SUBWF PIN2,0 ;カウントしなおし! BTFSS STATUS,0 ;(CY=0) PIN1<90 GOTO PULSIN2 ; RETURN ;******************************************** ;RS-232C 1文字送信サブルーチン ;MAX232C を使用 ;【呼出】送信文字を[txd]にセット ;【戻り】 ;【備考】 ;******************************************** rs1tx bcf rs1txb ;RS-232C データ出力用ポート(porta, 1) ビットクリア movlw btime ;btime → w スタートビット movwf rs ;btime → [rs] rs1tx_1 decfsz rs, F ;if(--[rs] == 0)Skip goto rs1tx_1 movlw 8 ;8 → w movwf cn ;8 → [cn] ビット位置 nop rs1tx_2 rrf txd, F ;(C,[txd])>>1 nop btfss STATUS, C ;if(C == 1)Skip ポートに出力 bcf rs1txb ;RS-232C データ出力用ポート(porta, 1) ビットクリア btfsc STATUS, C ;if(C != 1)Skip ポートに出力 bsf rs1txb ;RS-232C データ出力用ポート(porta, 1) ビットセット movlw btime ;btime → w movwf rs ;btime → [rs] rs1tx_3 decfsz rs, F ;if(--[rs] == 0)Skip goto rs1tx_3 ;1ビットのウエイト decfsz cn, F ;if(--[cn] == 0)Skip goto rs1tx_2 ;8ビット分繰り返し nop nop nop nop nop nop bsf rs1txb ;rs1txb を1に ストップビット movlw btime ;btime → w movwf rs ;btime → [rs] rs1tx_4 decfsz rs, F ;if(--[rs] == 0)Skip goto rs1tx_4 ;1ビットのウエイト return ;1文字送信終了、戻る END