PIC16F883で、シリアル通信の実験をしました。
PIC16F883は、基本的にPIC16F886と同じですから、「LED回路 工作部屋」というWebサイトの記事が参考になります。
PIC16F883には、EUSART(Enhansed Universal Sychronous Asynchronous Reciever Transmitter) という強化された同期または非同期送受信機能があり、簡単にシリアル通信を行うことができます。
今回は、FT234Xという小さいUSBシリアル変換モジュールと直接接続して、シリアル通信実験をしました。
シリアル通信の設定手順は、
①I/0ポートの設定 RC6/TXを出力に、RC7/RXを入力に設定する。
②シリアル通信に使うポートは、デジタルに設定する。(ANSELを0)
③ボーレートの設定
今回は、低速モード(BRGH=0)とし、ボーレートは、9600bpsにします。
ボーレートジェネレータにセットする値Xは、次の式で計算します。
低速モードでは、Fosc=クロック周波数(Hz)のとき
希望のボーレート=Fosc/(64(X+1))
今回は、Fosc=8MHz=8000000(Hz)なので、
9600=8000000/(64(X+1)
X=8000000/(9600*64)-1
=13-1
=12
となり、エラーは、0.16%です。
④TXSTAの設定
非同期モードなので、SYNC=0、低速モードなので、BRGH=0、送信を有効にするので、TXEN=1、8ビットなので、TX9=0
⑤RCSTAの設定
シリアルポート通信を有効にするので、SPEN=1、連続受信を有効にするので、CREN=1、8ビットなので、RX9=0
以上の設定をすれば、シリアル通信が可能になります。
実際のプログラムは、
SETUP
BANKSEL ANSEL
CLRF ANSEL ;アナログモードを使用しない
CLRF ANSELH
BANKSEL OSCCON
MOVLW 70h
MOVWF OSCCON ;CLOCK=8MHz 1Clock=0.125μs
BANKSEL TRISA
CLRF TRISA ;RAは全て出力
MOVLW 0FFh
MOVWF TRISB ;RBは全て入力
MOVLW 80h
MOVWF TRISC ;RC0~RC6は出力、RC7は入力(RC6=TX,RC7=RX)
BANKSEL ANSEL
CLRF ANSEL ;アナログモードを使用しない
CLRF ANSELH
BANKSEL OSCCON
MOVLW 70h
MOVWF OSCCON ;CLOCK=8MHz 1Clock=0.125μs
BANKSEL TRISA
CLRF TRISA ;RAは全て出力
MOVLW 0FFh
MOVWF TRISB ;RBは全て入力
MOVLW 80h
MOVWF TRISC ;RC0~RC6は出力、RC7は入力(RC6=TX,RC7=RX)
;--------------------
;シリアル通信の設定
;--------------------
;シリアル通信の設定
;--------------------
;ボーレートの設定8MHz,9600bps
BANKSEL SPBRG
MOVLW d'12'
MOVWF SPBRG
;TXSTAの設定
BANKSEL TXSTA
BCF TXSTA,SYNC ;SYNC=0 非同期
BCF TXSTA,BRGH ;BRGH=0(Low Speed)
BSF TXSTA,TXEN ;TXEN=1 送信許可
BCF TXSTA,TX9 ;TX9=0 8ビット
;RCSTAの設定
BANKSEL RCSTA
BSF RCSTA,SPEN ;SPEN=1 シリアルポート許可
BSF RCSTA,CREN ;CREN=1 連続受信許可
BANKSEL SPBRG
MOVLW d'12'
MOVWF SPBRG
;TXSTAの設定
BANKSEL TXSTA
BCF TXSTA,SYNC ;SYNC=0 非同期
BCF TXSTA,BRGH ;BRGH=0(Low Speed)
BSF TXSTA,TXEN ;TXEN=1 送信許可
BCF TXSTA,TX9 ;TX9=0 8ビット
;RCSTAの設定
BANKSEL RCSTA
BSF RCSTA,SPEN ;SPEN=1 シリアルポート許可
BSF RCSTA,CREN ;CREN=1 連続受信許可
これで、シリアル通信可能になります。
受信した文字を送信するプログラム(エコーバック)のMAINプログラム、受信ルーチン、送信ルーチンです。
;-------------------------
;MAINプログラム
;-------------------------
MAIN
CALL Read
CALL Send
GOTO MAIN
;MAINプログラム
;-------------------------
MAIN
CALL Read
CALL Send
GOTO MAIN
;-------------------------
;シリアル通信サブルーチン
;-------------------------
;-----受信したデータをWに入れる -----
Read
BANKSEL PIR1
BTFSS PIR1,RCIF ;RCIF=1なら受信
GOTO $-1 ;RCIF=0ならチェックを繰り返す
MOVF RCREG,W
RETURN
;-----Wに入っているデータを送信 -----
Send
BANKSEL TXSTA
BTFSS TXSTA,TRMT ;送信可能かチェック(1:可能, 0:禁止)
GOTO $-1 ;禁止であれば チェックを繰り返す
BANKSEL TXREG
MOVWF TXREG ;シリアル送信
RETURN
;シリアル通信サブルーチン
;-------------------------
;-----受信したデータをWに入れる -----
Read
BANKSEL PIR1
BTFSS PIR1,RCIF ;RCIF=1なら受信
GOTO $-1 ;RCIF=0ならチェックを繰り返す
MOVF RCREG,W
RETURN
;-----Wに入っているデータを送信 -----
Send
BANKSEL TXSTA
BTFSS TXSTA,TRMT ;送信可能かチェック(1:可能, 0:禁止)
GOTO $-1 ;禁止であれば チェックを繰り返す
BANKSEL TXREG
MOVWF TXREG ;シリアル送信
RETURN
TeraTermで動作テストをしました。