PICのUSARTの使い方

JA2KAI, Usagi Pyon Copyright (c) 2003, all rights reserved
USART I/Oの設定
TRISCのRC7(RX) を1、RC6(TX) をにセットします。他のビットはポートの使用目的により設
定します。
SYNCビットを0、RCSTAのSPENビットを1にセットすると、非同期シリアルポートが動作する
ようになります。
ボーレイトの設定
SPBRG及びTXSTAのBRGHを必要とするボーレイトになるように設定します。
割込みの設定
GIE、PEIE及びRCIEまたはTXIEをセットするとUARTの割り込みのうち、受信または送信完
了の際の割り込みが有効になります。
他の割り込みが必要なら、それに応じたイネーブルビットをセットします。
なお、割り込みが掛かるとGIEが自動的にクリアされそれ以上の割り込みが掛からないよう
に制御されます。割り込みサービスルーチンからRETFIEでリターンするとGIEが自動的に
セットされ、次の割り込みが掛かるようになります。
非同期送信
1.ビットTXEN をセットすることにより送信をイネーブルにします。これによりTXIF ビットもセット
されます。TXIFビットのセットは、割込を発生します。(割込有効ならば)
2. TXREG レジスタにデータをソフトウェアでロードします(TXIFがリセットされ、
同時に送
信が開始されます)。
*TXREGにデータをセットしてからTXENをセットしてもよい。
3. 送信が完了すると、割込が発生します。(割込有効の場合)割込サービスルーチンで
TXIFがセットされていることを確認すれば、送信終了による割込であることを確認できま
す。
非同期受信
1. イネーブルビットCRENをセットして受信をイネーブルにします。
2. 受信が完了するとRCIFビットがセットされて割込が発生します (割込有効の場合) ので、
割込サービスルーチンでRCIFビットが1になっていることでRCREGにデータが受信されて
いることが確認できます。
3. RCSTA レジスタをリードして、受信中に何かエラーが発生したかどうかを判定します。
4. エラーが発生した場合、イネーブルビットCREN をクリアしてエラーをクリアし、再びCREN
をセットします。
4. RCREGからデータバイトをリードするとRCIFビットがクリアされ、次の割込ができるようにな
ります。
このプログラムで使用するレジスタの設定内容(全二重 同期調歩のセッティング)
TRISC (C Port の入出力コントールレジスタ) (87H)
RC6/TX/CK,RC7/RX/DTのセット
bit7
6
5
4
3
2
1
0
RC7
RC6
RC5 RC4 RC3 RC2 RC1 RC0
1
0
x
x
x
x
x
x
TXSTA (送信ステータス及びコントールレジスタ) (98H)
TSR:送信シフトレジスタ
bit7
6
5
4
3
2
1
0 TX9Dは使用しない。
CSRC TX9
TXEN SYNC
BRGH TRMT TX9D TRMT:送信シフトレジスタステータ
送信 0:非同
X
0
0 ボーレイ 1:TSR空
期
1:可
ト1:高速 0:TSRフ
0:不可
0:低速 ル
SPBRG (ボーレイト設定レジスタ)
(99H)
TXSTAのBRGHと次式で決まる。
bit7
6
5
4
3
2
1
0 BRGH=0の場合FOSC/64(X+1)
RC7
RC6
RC5 RC4 RC3 RC2 RC1 RC0 bps
0
0
0
0
0
1
0
1 BRGH=1の場合FOSC/16(X+1)
bps
RCSTA (受信ステータス及びコントールレジスタ) (18H)
RX9Dは使用しない。
bit7
6
5
4
3
2
1
0 CREN:
SPEN RX9 SREN CREN AD- FERR OERR RX9D 1=連続受信可/0=連続受信不
可
1
0
X
1
0 フレーム オーバラン
1:エラー 1:エラー
有
有
INTCON (コントールレジスタ) (0BH、8BH)
GIEは、割込が掛かるとそれ以上
bit7
6
5
4
3
2
1
0 割込
GIE
PEIE
T0IE
INTE
RBIE TOIF
INTF
RBIF が掛からないようになり、RETFIEで
全割込 全周辺 Timer0 RB0 RBport Timer0 RB0 Rbport 割 込 ルー チ ン から 帰 る 際 に 1 に
の
割込 割込 割込 割込 フラグ フラグ フラグ
0
0
0
0
0
0
1:可能 1:可能
周辺割込みの中の各機器の割込
PIE1
( 周辺機能割込イネーブルビット)
(8CH)
0:不可
0:不可
bit7
6
5
4
3
2
1
0 み
PSPIE ADIE RCIE TXIE SSPIE CCP1I TMR2IE TMR1IE 可/不可を設定します。
0
0
USART USART
0
0
0
0
受信割 送信割
込
込
割込があった際にこのレジスタの
PIR1 ( 割込フラグビットジスタ)
(0CH)
1:可能 1:可能
bit7
6
5
4
3
2
1
0 各bit
を調べ
PSPIF ADIF RCIF
TXIF SSPIF CCP1I TMR2IF TMR1IF
TXREG(19H) 送信buff る と 割
X
X
X
X
X
0
USART USART
RCREG(1AH) 受信buff
受信 送信
buff
buff
1:フル 1:空
モデムからデータを受信して
受信バッファの文字を
受信バッファの
RTTEMP=RT?
Y
Y
TCount=0?
N
N(変化あり)
Y
MEを“L”にする
RTTEMP=RT
RT=1?
(MN6127の)ME=0?
N
Y
N
Y (立上り)
RDを読んでバイトに組替える
Y
DEC(RCount)
N
RTTEMP:MN6127の読出しクロックRTの変化を検出するための旧状態保持フラグ
(1が初期値)
RCount:MN6127から受信する際にビットを8回読んで1バイトになったことを数える
カウンタ(9が初期値)
MECount:MN6127のMEをHにしてから一定時間キャリアのみ送出するための時
間を設定
Tcount:MN6127にSDを送出する際に、ビットを8回数えるためのカウンタ(8が初期
値)
STTEMP:MN6127の送出クロックSTの変化を検出するための旧状態保持フラグ
(0が初期値)
MEを“H”にする
MECount=0?
N
MECountを0FFHにする
DEC(MECount)
RCount=0?
N
割り込み発生
Y (1バイト完
TCount=0?
受信したデータをバッファにセー
送信したいデータありフラグON
Y
受信バッファ→送信ワークレジス
TCount=8
RCount=9
STTemp=ST?
送信可フラグON?
N
N
Y
シリアルポートに送信
Y
ST=H?
N
他の原因による割り込み
N
Y (立上り)
1BitをMN6127のSDへ出力
DEC(TCount)
Y
受信処理
受信データありフラグON
送信バッファが
N (変 化 あ
SHR(送信ワークレジスタ)
送信したいデータありフラグOFF
受信バッファに受
N
STTemp=ST
Y
送信したいデータあ
N
RETFIE
Y
送信可フラグON