前回の記事では、PIC16F1938を使ってUART送信を実装しました。
今回はUART受信を使って、
実際にマイコンを制御してみます。
まずは受信したデータをそのまま返す「エコーバック」を実装し、
その後、コマンドとして扱う方法を解説します。
UART受信の流れ
UART受信は以下の流れで動きます。
- データがRXピンに入る
- 内部でシフトレジスタに取り込まれる
- 1バイト完成するとRCREGに格納される
- RCIFフラグが立つ
つまり、
「RCIFが立ったらRCREGを読む」
これが基本になります。
USART初期化(受信あり)
送信の記事とほぼ同じですが、
受信では以下が重要です。
c
void USART_Init(void) {
OSCCON = 0b01110010; // 8MHz
TRISCbits.TRISC6 = 1; // TX
TRISCbits.TRISC7 = 1; // RX
SPBRG = 51; // 9600bps
TXSTAbits.BRGH = 1;
BAUDCONbits.BRG16 = 0;
RCSTAbits.SPEN = 1;
TXSTAbits.TXEN = 1;
RCSTAbits.CREN = 1; // ← 受信有効(重要)
}
エコーバック
エコーバックは、
UARTの送信と受信が正しく動作しているかを
確認するための基本的なテストです。
Tera-termを使って、キーボード入力した文字を
PICを経由して、画面に出力させます。
コードは以下のものをmainに書き込んでいます。
c
while(1)
{
if(PIR1bits.RCIF) {
unsigned char data = RCREG;
while(!PIR1bits.TXIF);
TXREG = data;
}
}
受信したデータをそのまま送信することで、
通信が正常に行われていることを確認できます。
打ち込んでいる文字はめちゃくちゃです。
コマンド制御
エコーバックで通信確認ができたので、
次は受信した文字に意味を持たせてLEDを制御します。
c
while(1)
{
if(PIR1bits.RCIF)
{
unsigned char data = RCREG;
while(!PIR1bits.TXIF);
TXREG = data;
if(data == 'A')
{
LATAbits.LATA1 = 1;
}
else if(data == 'B'){
LATAbits.LATA1 = 0;
}
else if(data == 'T'){
LATAbits.LATA1 = !LATAbits.LATA1;
}
}
}
このようにUARTでコマンドを受け取ることで、
マイコンを外部から制御できるようになります。
これは実際の機器でもよく使われる方法です。
まとめ
今回はUARTで受信した文字を使って、
エコーバックとLED制御を実装しました。
エコーバックでは通信確認を行い、
コマンド制御では受信データに意味を持たせて、
LEDをON/OFF/トグルさせました。
単純な処理ですが、
外部からマイコンを操作する基本形になります。
次回は、UART受信時のエラー処理について確認していきます。


コメント