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 |