MPLAB IDE v8.92 MPASM v5.51 PICKit3の環境で、PIC16F648AのUSART(Universal Synchronous Asynchronous Receiver Transmitter)の使い方を勉強します。今回は、PICとパソコンの間で通信テストをします。
回路図です。今回もICSPでテストを行います。PIC16F648AのUSARTの入出力は、入力RXが7ピン(RB1)、出力TXが8ピン(RB2)に設定されています。RX,TXとも入力に設定します。ここにUSBシリアル変換モジュールFT234を接続します。FT234の入出力は3.3Vですが、入力は5Vトレラント(耐性)なので、直接接続しても大丈夫です。
パソコン側は通信ソフトTeraTermを使います。SWを押したら文字「Hello World!」を送出するプログラムを組みます。
PICとパソコンの間の通信プロトコルを決めます。非同期モードで、通信速度は9600bpsとします。これらの設定は、TXSTAとRCSTAレジスタで行います。
まず、TXSTAレジスタでは、bit4のSYNCはデフォルト0(非同期),bit2のBRGHは1(高速モード)とし、bit5のTXENは1(送信可)とします。TXSTA=b'00100100'=024h
次にRCSTAレジスタは、bit7のSPENは1(シリアル)とし、bit4のCRENは1(継続受信可)とします。RCSTA=b'10010000'=090h
通信速度(Baud Rate)の設定は、SPBRGで行います。
BRGH=1の時は、次の式で設定値xを計算します。
Baud Rate=Fosc/16(x+1)
x = Fosc/(16*Baud Rate) -1
クロック周波数Fosc=4MHz=4000000Hz
Baud Rate = 9600bps
とすると
x=4000000/(16*9600) - 1 = 25 = 019h
となり、エラーは0.16%です。
プログラムです。PICのプログラムでやっかいなのが、SFRのBANK指定です。PIC16F648Aの場合、BANK0からBANK3ですので、それほどではありませんが、BANKSELというマクロ命令を使うとSFRに対するBANKを自動的に設定してくれます。
ERRORLEVEL -302は、エラー番号302のエラー表示をしないようにするマクロ命令です。
-----------------------------------------------------
LIST P=PIC16F648A
INCLUDE P16F648A.INC
__CONFIG _INTOSC_OSC_NOCLKOUT & _CP_OFF & _CPD_OFF & _WDTE_OFF & _PWRTE_ON & _BOREN_OFF & _LVP_OFF & _MCLRE_OFF
ERRORLEVEL -302
;入出力設定
BANKSEL TRISA
MOVLW b'00100001'
MOVWF TRISA ;RA0とRA5は入力、他は出力
MOVLW b'00010110'
MOVWF TRISB ;RB1,RB2は入力、他は出力
BANKSEL CMCON
MOVLW b'00000111'
MOVWF CMCON ;コンパレータOFF
;USART設定
BANKSEL TXSTA
MOVLW b'00100100'
MOVWF TXSTA ;非同期モード、高速通信モード
MOVLW 019h ;
MOVWF SPBRG ;4MHz,9600bps
BANKSEL RCSTA
MOVLW 090h
MOVWF RCSTA ;受信可、非同期モード
MAIN
BANKSEL PORTA
BTFSC PORTA,0 ;RA0=0ならスキップ
GOTO MAIN
MOVLW "H"
CALL SENDCHR
MOVLW "e"
CALL SENDCHR
MOVLW "l"
CALL SENDCHR
MOVLW "l"
CALL SENDCHR
MOVLW "o"
CALL SENDCHR
MOVLW " "
CALL SENDCHR
MOVLW "W"
CALL SENDCHR
MOVLW "o"
CALL SENDCHR
MOVLW "r"
CALL SENDCHR
MOVLW "l"
CALL SENDCHR
MOVLW "d"
CALL SENDCHR
MOVLW "!"
CALL SENDCHR
MOVLW " "
CALL SENDCHR
GOTO MAIN
SENDCHR
BANKSEL TXSTA
BTFSS TXSTA,TRMT ;送信可能かチェック(1:可 0:禁止)
GOTO $-1
BANKSEL TXREG
MOVWF TXREG
RETURN
END
-----------------------------------------------------
ブレッドボードです。ICSPで書き込みます。
SWを押すとTeraTermに「Hello World!」がSWを押している間表示されました。
これで送信機能は確認できました。次に受信機能を確認します。同じ回路で、Tera Termから送信された文字を受信して送り返すエコーバックをやってみます。
プログラムです。
----------------------------------------------------
LIST P=PIC16F648A
INCLUDE P16F648A.INC
__CONFIG _INTOSC_OSC_NOCLKOUT & _CP_OFF & _CPD_OFF & _WDTE_OFF & _PWRTE_ON & _BOREN_OFF & _LVP_OFF & _MCLRE_OFF
ERRORLEVEL -302
;入出力設定
BANKSEL TRISA
CLRF TRISA ;PORTAはすべて出力、ただし、RA5は入力
MOVLW b'00010110'
MOVWF TRISB ;RB1,RB2は入力、他は出力
BANKSEL CMCON
MOVLW b'00000111'
MOVWF CMCON ;コンパレータOFF
;USART設定
BANKSEL TXSTA
MOVLW b'00100100'
MOVWF TXSTA ;非同期モード、高速通信モード
MOVLW 019h ;
MOVWF SPBRG ;4MHz,9600bps
BANKSEL RCSTA
MOVLW 090h
MOVWF RCSTA ;受信可、非同期モード
MAIN
CALL GETCHR ;1文字受信
CALL SENDCHR ;1文字送信
GOTO MAIN
;1文字受信
GETCHR
BANKSEL PIR1
BTFSS PIR1,RCIF ;RCIF=1ならスキップ
GOTO $-1
BANKSEL RCREG
MOVFW RCREG
RETURN
;1文字送信
SENDCHR
BANKSEL TXSTA
BTFSS TXSTA,TRMT ;送信可能かチェック(1:可 0:禁止)
GOTO $-1
BANKSEL TXREG
MOVWF TXREG
RETURN
END
----------------------------------------------------
パソコンのキーボードを押した文字がPICに送信され、PICから送り出された文字がTera Termに表示されます。