LED回路 工作部屋 > PIC16F886 シリアル通信ポートの使い方 【最終更新日:2011/2/1】
PIC16F886 シリアル通信ポートの使い方
シリアル通信ポートの設定手順

@ I/O設定を行う。RC6/TXを出力、RC7/RXを入力に設定 (TRIS設定)

A シリアル通信で使用するポートをデジタルにする (ANSEL設定)

B ボーレートの設定

C TXSTAの設定
   SYNC=0 , BRGH=0 , TXEN=1 , TX9=0

D RCSTAの設定
   SPEN=1 , CREN=0 , RX9=0

E 設定終了なので、メインルーチンへ



シリアルデータの受信手順

@ PIR1,RCIFのフラグを監視する

A RCREGがシリアルデータを受信するとRCIFフラグが"1"になる (btfsc PIR1,RCIF)

B RCREGの受信内容をリードする。リードするとRCIFフラグが自動で"0"に戻る (movfw RCREG)

C @へ戻る



シリアルデータの送信手順

@ 送信するデータを TXREG へ (movwf TXREG)

A 送信完了を確認する。TXSTA,TRMTフラグが 1=送信完了 0=送信中 (btfss TXSTA,TRMT)

B @へ戻る




PIC16F886 のピン配置図
主に使用するレジスタ
Bank0
PIR1 - ADIF RCIF TXIF SSPIF CCP1IF TMR2IF TMR1IF
RCSTA SPEN RX9 SREN CREN ADDEN FERR OERR RX9D
TXREG EUSART Transmit Data Register (送信データ格納レジスタ)
RCREG EUSART Receive Data Register (受信データ格納レジスタ)
Bank1
TXSTA CSRC TX9 TXEN SYNC SENDB BRGH TRMT TX9D
SPBRG BAUD RATES (ボーレート設定 格納レジスタ)
SPBRGH BAUD RATES (ボーレート設定 格納レジスタ ※16bit設定で使用 普通は使わない)
レジスタの説明
PIR1
RCIF USART 受信割り込みフラグビット
1 = USART 受信バッファがフル
0 = USART 受信バッファが空
RCREGが受信データを受信するとRCIFフラグが"1"になる。フラグは受信内容をリードすると自動で"0"に戻る
RCSTA
SPEN シリアルポート通信選択ビット
1 = シリアルポート通信有効(RX,TXピンはシリアルポートピンとして構成) 【○】
0 = シリアルポート通信無効
RX9 9ビット受信選択ビット
1 = 9ビット受信を選択 ※パリティを使用する場合
0 = 8ビット受信を選択 【○】
SREN シングル受信選択ビット
非同期モードでは使用しない
CREN 連続受信選択ビット
非同期モード時:
1 = 連続受信有効 【○】
0 = 連続受信無効
このビットは受信完了後クリアされる

ADDEN アドレス検出選択ビット
1 = アドレス検出有効
0 = アドレス検出無効
FERR フレーミングエラービット
1 = エラー (RCREGレジスタのリードにより、次の有効バイトを受信する)
0 = なし
OERR オーバーランエラービット
1 = エラー (CRENのクリアによりクリア可能)
0 = なし
RX9D 受信データの第9ビット(パリティビットとして使用可能)
TXSTA
TX9 9ビット送信選択
1 = 9ビット送信を選択
0 = 8ビット送信を選択 【○】
TXEN 送信許可選択ビット
1 = 送信可能 【○】
0 = 送信停止
SYNC USARTモード選択ビット
1 = 同期モード
0 = 非同期モード 【○】
SENDB 送信確認
BRGH 高速ボーレート選択ビット
1 = 高速(16)
0 = 低速(64) 【○】
TRMT 送信シフトレジスタステータスビット
1 = TSRが空
0 = TSRがフル
TX9D 送信データの第9ビット(パリティビットとして使用可能)
【図1】シリアルポート 送受信のブロック図
【図2】ボーレートの計算
【図3】参考 ボーレート表
プログラム記述例

【シリアルポートの設定】
call Bank1
;I/Oポートの設定 Rx=1(入力) Tx=0(出力)
movlw b'10000000' ;<><><><><><>
movwf TRISC

;ボーレートの設定 8MHz 9600bps
movlw d'12' ;ボードレート12で設定
movwf SPBRG

;TXSTAの設定
bcf TXSTA,SYNC ; 0=非同期
bcf TXSTA,BRGH ; 0=低速(64)
bsf TXSTA,TXEN ; 1=送信許可
bcf TXSTA,TX9 ; 0=8ビット送信
call Bank0

;RCSTAの設定
bsf RCSTA,SPEN ; '1'=シリアルポート許可
bsf RCSTA,CREN ; '1'=連続受信許可


【データの受信】
Main
btfsc PIR1,RCIF ;受信したシリアルデータがRCREGにはいるとRCIFフラグが"1"になる
goto Rx_Data ;データ受信
goto Main

Rx_Data
movfw RCREG ;データをWへ。この時点でRCIFフラグが"0"に自動で戻る
movwf Data1 ;データをWからData1へ保存
goto Main ;Mainへ戻り、再び受信待ち


【データの送信】
;<1バイト送信>
Tx_Data
movfw Data1 ;送信するデータ[Data1]をWへ
movwf TXREG ;WのデータをTXREGへ入れると、自動で送信される
call Bank1 ;
Tx_Data1 ;送信チェック
btfss TXSTA,TRMT ;データをTXREGに入れた時点でTRMTは"0"(フル)になり、送信してTRREG内のデータが空になるとTRMTは"1"(空)になる
goto Tx_Data_1
call Bank0