PICでUART受信とコマンド制御|エコーバックからLED制御へ

前回の記事では、PIC16F1938を使ってUART送信を実装しました。

今回はUART受信を使って、
実際にマイコンを制御してみます。

まずは受信したデータをそのまま返す「エコーバック」を実装し、
その後、コマンドとして扱う方法を解説します。

UART受信の流れ

UART受信は以下の流れで動きます。

  1. データがRXピンに入る
  2. 内部でシフトレジスタに取り込まれる
  3. 1バイト完成するとRCREGに格納される
  4. 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受信時のエラー処理について確認していきます。

コメント

タイトルとURLをコピーしました