関連
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固定になる。(何かは不明)
デバッグを実行すると、上記テキストの文字列が1文字ずつRCREGに書き込まれる。
EUSARTの設定はMCCで行った。
オウム返しのように受信したら送信したかったので、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文字ずつ設定される。