PIC−USBIO using BASIC
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
USBインターフェースを内蔵したPICを使ってWindowsパソコンで外部回路を制御するための各種I/O基板の製作記事です。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
[第152回]
●PICUSBIO−03(101)EUSART(3)非同期モード(2)非同期受信
今回は非同期受信です。
[出典]Microchip Technology Inc. PIC18F13K50/14K50 Data Sheet
非同期通信の典型的な使い方としてはRS232Cシステムが考えられます。
非同期受信のブロック図は[第150回]でお見せしました。
RX/DT端子から入力された受信データは復調回路に通されます。
復調回路はボーレートの16倍という高速でデータをシフトしますが、シリアル受信シフトレジスタ(RSR)はボーレートと同じビットレートで動作します。
8ビットまたは9ビットの文字データのシフト入力が完了するとそのデータは直ちに2文字分のファーストインファーストアウト(FIFO)メモリに送られます。
FIFOバッファがあることで2文字分の完全な受信が可能になり、ソフトウェアがEUSART受信プログラムの実行を開始するよりも前に3番目の受信を開始することができます。
FIFOとRSRレジスタはソフトウェアで直接アクセスすることはできません。
受信したデータはRCREGレジスタを通して受け取ります。
●受信を可能にする
次の3つのコントロールビットによってEUSART非同期受信が可能になります。
・CREN=1
・SYNC=0
・SPEN=1
その他のEUSARTコントロールビットについてはそれぞれ必要な設定を行ないます。
RCSTAレジスタのCRENビットをセットすることでEUSARTの受信回路がイネーブルになります。
TXSTAレジスタのSYNCビットをクリアするとEUSARTが非同期通信モードになります。
RCSTAレジスタのSPENビットをセットすることでEUSARTモジュールがイネーブルになります。
RX/DT I/O端子はTRISの対応するビットをセットすることでその向きを入力にしなければなりません。
この文は前回の「●送信を可能にする」のNote1:の記述と矛盾しています。
どちらが本当なのかわかりませんがここに書いてある通りRX/DT端子は入力に設定しておくのが無難でしょう。
RX/DT端子がアナログ回路と端子を共用している場合にはANSELの対応するビットをクリアしてアナログI/Oをディスイネーブルにする必要があります。
NOTE1:SPENビットをセットするとTX/CK I/O端子は対応するTRISビットの状態に関係なくまたEUSART送信がイネーブルかどうかに関係なく自動的に出力になります。
I/Oポート出力ラッチは出力回路から切り離されます。
したがってTX/CK端子を通常のPORT出力として使うことはできません。
[出典]Microchip Technology Inc. PIC18F13K50/14K50 Data Sheet
●受信データ
受信データ復調回路は最初のビットの下がりエッジで初期化されます。
最初のビットはスタートビットで常にゼロです。
データ復調回路はスタートビットの中央まで1/2ビットカウントしてそこでまだゼロであることを確認します。
もしもゼロでなかったらそこで復調回路は処理を中止し、エラー信号は出さずにスタートビットの下がりエッジの検出を再開します。
スタートビット=0の確認に成功するとデータ復調回路は1ビット分カウントして次のビットの中央まで進みます。
このあと’majority detect circuit’という表現があります。
何でしょう?
ブロック図を見てもわかりません。
ふつうは過半数とか多数とかの意味になります。
ビットの中央でサンプリングするのではなくてその前後で複数回サンプリングして多いほうを採るというような回路と解されます。
で。
その回路によって’0’か’1’が決定されるとそのビットがRSRにシフトされます。
それが全てのビット分繰り返されます。
そして最後のビットがチェックされます。
最後のビットはストップビットで常に’1’です。
ここで’0’が検出されるとこの文字データについてのフレーミングエラーがセットされます。
’1’であればこの文字データのフレーミングエラーはクリアされます。
(どうもフレーミングエラーは各受信文字ごとにセット、リセットされるようです)
全てのデータビットとストップビットの受信が完了するとRSRの文字データは直ちにEUSART受信FIFOに送られてPIR1レジスタのRCIF割込みフラグがセットされます。
RCREGレジスタを読むとFIFOのトップにある文字データが読み出されます。
Note:もしも受信FIFOがオーバーランするとオーバラン状態が解消されるまで受信は行なわれなくなります。
[出典]Microchip Technology Inc. PIC18F13K50/14K50 Data Sheet
●受信データの極性
受信データの極性はBAUDCONレジスタのDTRXPビットで設定できます。
デフォルトではこのビットは’0’で受信アイドルおよびデータは正論理です。
DTRXPビットを’1’にすると受信データは反転され受信アイドルおよびデータは負論理になります。
DTRXPビットによる受信データの極性の設定は非同期モードに限られます。
同期モードでのDTRXPビットは別の役割になります。
[出典]Microchip Technology Inc. PIC18F13K50/14K50 Data Sheet
●受信割込みフラグ
PIR1レジスタのRCIF割込みフラグビットはEUSART受信がイネーブルで受信FIFOに未読データが残っているときにセットされます。
RCIFビットはリードオンリーです。
ソフトウェアでセット、リセットすることはできません。
今のところPICUSBIO用BASICインタプリタではEUSART通信の割込みは使わないつもりですので、割り込みについての説明は省略します。
[出典]Microchip Technology Inc. PIC18F13K50/14K50 Data Sheet
●受信フレーミングエラー
受信FIFO内の各文字データごとにフレーミングエラービットが付与されます。
フレーミングエラーはストップビットが検出されなかったことを示しています。
フレーミングエラーはRCSTAレジスタのFERRビットにアクセスすることで確認することができます。
FERRビットは受信FIFOトップの未読文字データの状態を示しています。
ですからFERRビットはRCREGを読む前に確認しなければなりません。
FERRビットはリードオンリーで受信FIFOトップの未読文字データのみの状態を示しています。
フレーミングエラー(FERR=1)は新たなデータ受信を妨げません。
FERRビットをクリアする必要はありません(もともとFERRはリードオンリーです)。
FIFOバッファから次の文字データを読むと(RCSTAレジスタを読むと)FIFO(のトップ)は次の文字データになりフレーミングエラーも次の文字データのものになります。
FERRビットはRCSTAレジスタのSPENビットをクリアすることで強制的にクリアされます。
SPENビットをクリアするとEUSARTはリセットされます。
RCSTAレジスタのCRENビットをクリアしてもFERRビットには影響しません。
フレーミングエラーそのものは割込みを発生させません。
Note:受信FIFOにある全てのデータがフレーミングエラーであるときは繰り返しRCREGを読んでもFERRビットはクリアされません。
[出典]Microchip Technology Inc. PIC18F13K50/14K50 Data Sheet
●受信オーバーランエラー
受信FIFOバッファは2文字分のデータを保持できます。
FIFOが2文字分のデータを保持しているときにFIFOがアクセスされる前にそこに3番目のデータが来るとオーバーランエラーが発生します。
するとRCSTAレジスタのOERRビットがセットされます。
すでにFIFOバッファにある文字データは読み出せますがエラーが解消されるまでは新しい文字データは受信できません。
エラーをクリアするにはRCSTAレジスタのCRENビットをクリアするか、RCSTAレジスタのSPENビットをクリアしてEUSARTをリセットするしかありません。
[出典]Microchip Technology Inc. PIC18F13K50/14K50 Data Sheet
●非同期受信のセットアップ
1.SPBRGH:SPBRGレジスタペアとBRGHおよびBRG16ビットを設定することで必要なボーレートを決定します。
2.SPENビットをセットすることで非同期シリアルポートをイネーブルにします。
またTRISビットをセットしてRX/DT端子を有効にします。
非同期通信を可能にするためにSYNCビットをクリアしなければなりません。
3.省略
4.省略
5.受信データの極性を反転させたいときにはDTRXPビットをセットします。
6.CRENビットをセットすることで受信をイネーブルにします。
7.文字データがRSRから受信バッファに転送されるとRCIF割込みフラグがセットされます。
8.エラーフラグを確認するためにRCSTAレジスタを読みます。
9.RCREGレジスタを読むことで受信バッファから受信データを受け取ります。
10.もしオーバーランエラーが発生したらCREN受信イネーブルビットをクリアしてOERRフラグをクリアします。
下は非同期受信のタイミング図です。
[出典]Microchip Technology Inc. PIC18F13K50/14K50 Data Sheet
下は非同期受信に関係するレジスタです。
[出典]Microchip Technology Inc. PIC18F13K50/14K50 Data Sheet
−未記載のところは’0’が読み出されます。
アミがかかっているところは非同期送信では使われません。
PIC−USBIO using BASIC[第152回]
2023.1.10upload
前へ
次へ
ホームページトップへ戻る