PIC : MPLABXのStimulusでEUSART疑似入力

関連

MPLABX IDE v5.35でSimulatorのUARTウィンドウが表示されない
MPLABX IDEシミュレータの使い方( Stimulus その2 )

過去の投稿でStimulusをざっくり使い方を覚えたので、その応用としてPICをシリアル通信の受信側として、外部からシリアル入力をシミュレートしてみる。

StimulusでEUSART疑似入力

あらかじめ、入力したい文字を記述したテキストファイルを用意しておく。このファイルをRegister Injectionを使ってシリアル通信の受信用レジスタRCREGに書き込んでいく。といった方法を使う。

受信については割り込み処理を有効にして、1文字受信したらそのままオウム返しのように書き込みを行う。書き込まれた文字もIDEのウィンドウに表示されるようにしてみる。

参考

http://zattouka.net/GarageHouse/micon/MPLABX/Simulator3.htm

UART出力のウィンドウ表示方法、Register Injectionについては上記の投稿リンクを参照。

検証用テキストファイル

以下の様なテキストを用意した。

"ABC"
"DEF"
0D 0A
"GHI"
0D 0A
  • 文字列はダブルクォートで囲む
  • 改行はASCIIコードで表現する。(0D 0A) テキストの改行は無視される

なので、受信側は以下のような文字が実際に書き込まれる。

ABCDEF
GHI

Register Injectionの設定のポイントは、

Register Injection
Reg/Var RCREG
Trigger Message
Datafile テキストファイルパス

フォーマットはMessageを選択すると、Pkt固定になる。(何かは不明)

debug_uart

デバッグを実行すると、上記テキストの文字列が1文字ずつRCREGに書き込まれる。

EUSARTの設定はMCCで行った。

debug_uart02

オウム返しのように受信したら送信したかったので、MCCが出力した以下の割り込み関数内にEUSART_Write()を追加した。

void EUSART_RxDataHandler(void){
    // use this default receive interrupt handler code
    eusartRxBuffer[eusartRxHead++] = RCREG;
    if(sizeof(eusartRxBuffer) <= eusartRxHead)
    {
        eusartRxHead = 0;
    }
    eusartRxCount++;
    
    EUSART_Write(RCREG); // <= とりあえずコレ追加
}

割り込みを有効にするためには、MCCで出力されたmain.cにもコメントアウトして出力されているが、以下のINTERRUPT_GlobalInterruptEnable()INTERRUPT_PeripheralInterruptEnable()をコールする必要がある。

void main(void)
{
    // initialize the device
    SYSTEM_Initialize();
    
    INTERRUPT_GlobalInterruptEnable(); // <= 割り込みの為に追加
    INTERRUPT_PeripheralInterruptEnable(); // <= 割り込みの為に追加
    
    uint16_t adval = 0;
    while (1)
    {
    }
}

EUSART_RxDataHandler内の先頭行にでもブレークポイントを設定してデバッグを実行すると、Injectionが有効だと、割り込みが発生してこの関数がコールされることがわかる。RCREGの値を見ると、テキストで設定した内容が1文字ずつ設定される。

debug_uart03