2016年3月22日火曜日

基本: AVRのUARTとC#でシリアル通信 (受信割り込み)

概要

今回は、AVRでUSART受信割り込みを使ったプログラムを作成したいと思います。

要件

  • AVRはPCから送信された値を受信し、受信割り込みを発生する。
  • 受信割り込み時に"echo back: <val> \n"という文字列をPCに送信できる。
  • <val>はPCから送信された値で置換する。

準備

ハードウェア

もちろんこれは必須ではなく、AVR168Pもしくはこれと互換性のあるAVRマイコンとFT232RLが実装されており、USBでパソコンと接続できればOKです。
AVRとFT232RLの取り付けの解説は割愛しますが、次のように実装します。
  • AVRのTXDとFT232RLのRXDが接続されている。
  • AVRのRXDとFT232RLのTXDが接続されている。
AVRとFT232RLを使ったUSB-シリアル通信の実験に解説されているとおりです。

ライブラリ

UARTを使った処理をかんたんに実装するために、次のコードを実装しました。初期化と読み書き、割り込み処理といった基本的なレジスタ操作をまとめたものです。

開発

AVR

dev3/usartsample/main.cを作成しました。割り込みなしのコードとほぼ同じですが、割り込み設定をしている箇所が異なります。
/**
* 受信割り込み発生時に実行される関数
* @param data 受信データ
*/
void rxEventListener(uint8_t data) {    
    printf("echo back: %d \n", data);
}

int main(void) {
    // 受信割り込みありでUSARTを初期化(8MHzクロック時, 9600ボーレート)
    USART_init(RX_COMPLETION_INTERRUPT, 51);

    // 受信割り込み発生時に実行する関数を登録
    USART_setRxCompletionInterruptListener(*rxEventListener);

    // printfで使用する関数を登録
    fdevopen(*USART_sendData, NULL);

    // 割り込み全許可
    sei();

    printf("Initialized>>\n");
    while (1) {
    }
}
  • UCSRnBレジスタのRXCIEn(7bit目)を1(true)にして、受信割り込み許可を行っています。(該当コード
  • 割り込みベクタUSART_RX_vectで受信割り込みを駆動できます。(該当コード)
  • 初期化しても、sei()を唱えないと割り込みは発生しません。
これで、PC側からの値に応じて、処理を変えたり、レスポンスする内容を変更したりできますね。

C#

前回同様にSerialSample/Program.csを使用します。