JH7UBCブログ

アマチュア無線 電子工作 家庭菜園など趣味のブログです

MPLABアセンブラ PIC16F648A USARTテスト

2024-10-29 19:22:30 | MPLAB アセンブラ
 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に表示されます。