![](https://blogimg.goo.ne.jp/user_image/19/b4/957865ebdb184bdff14f3ef4f8ed44fd.jpg)
V850は3つのシリアルポートを使うことができます(UARTA0~UARTA2)。デバッグするときはUARTA0を使うのでシリアルポートを使うプログラムのデバッグができない問題があります。そこでシリアルポートをUARTA2に増設してみました。
UARTA0を使う方法については本誌5月号の7章、appliletを使う方法についてはjsskさんがレポートされています(4/19の記事)。
シリアル基板の作り方についてはPC watchの記事(槻ノ木隆のPC実験室 玄人志向「玄箱PRO」を使う【改造編1】)とごださんの記事(シリアル基板を作ろう)を参考にしました。どちらの記事も秋月電子で売っているレベル変換用のIC、ADM3202ANを使っています。このICは3.3Vでも動作するので便利です。2つの記事の違いはダンピング抵抗をつけているかいないかくらいです。ADM3202はチャージポンプ用のスイッチングノイズがあるので気になる方はダンピング抵抗をつけておくといいかもしれません。
UARTA2の送信TXDA2はpin38でCON2のpin14に接続されています。受信RXDA2はpin39でCON2のpin11です。ちなみにUART1はTXDA1がpin90でCON1のpin1に、RXDA1がpin91でCON1のpin2に接続されています。
デバッガがポートを間違えないようにするために「ID850QB-MON V3.3 Portconfig」というプログラムでデバッグ用のポート番号を設定します。デフォルトはAUTOになっています。
試しに1文字受信するたびにLEDが反転してエコーバックするプログラムを作ってみます。
appliletの設定です。
- システムの基本設定はサブクロックとウォッチドックタイマー2を使用しない、オンチップディバグ設定は使用するにします。
- ポートはPCT6を出力にします(LED用)
- シリアルはUARTA2を使用するに変更すると、UARTA2という新しいタブができます。UARTA2のタブでは送信/受信、8bit、ボーレートは115200を選びます。割り込みレベルは受信を6、送信を7にしました。コールバック機能設定の受信完了もチェックしておきます。
appliletで作ると自動でAPIを生成してくれます。UARTA2については送信用のUART2_SendDataと受信用のUART2_ReceiveDataです。どちらもブロックしてくれないので完了待ちをしたいときは受信完了のコールバック関数CALL_UART2_Receiveを利用します。この関数はSERIAL_user.cの中に生成されています。最初は空なので受信完了通知のコードを2行追加しました。
今回は横着して受信完了コールバックだけ使いましたが送信完了コールバックも使ってもよかったかもしれません。受信はブロックするけど送信はブロックしていないので次の文字の受信と送信が時間的にかぶっていることになります。
一応、これらのコールバック関数は割り込み処理ルーチンから直接呼ばれているので、あまり重いことはしないほうがよさそうです。送受信APIや割り込み処理ルーチンはSERIAL.cにあるので何をしているかは読めば分かるようになっています。
メイン関数は次のようにしました。1文字受信したらエコーバックしてLEDを反転しています。
appliletを使うとCPUやポートの設定のコードを書かなくてすむのが楽です。
UARTA0を使う方法については本誌5月号の7章、appliletを使う方法についてはjsskさんがレポートされています(4/19の記事)。
シリアル基板の作り方についてはPC watchの記事(槻ノ木隆のPC実験室 玄人志向「玄箱PRO」を使う【改造編1】)とごださんの記事(シリアル基板を作ろう)を参考にしました。どちらの記事も秋月電子で売っているレベル変換用のIC、ADM3202ANを使っています。このICは3.3Vでも動作するので便利です。2つの記事の違いはダンピング抵抗をつけているかいないかくらいです。ADM3202はチャージポンプ用のスイッチングノイズがあるので気になる方はダンピング抵抗をつけておくといいかもしれません。
UARTA2の送信TXDA2はpin38でCON2のpin14に接続されています。受信RXDA2はpin39でCON2のpin11です。ちなみにUART1はTXDA1がpin90でCON1のpin1に、RXDA1がpin91でCON1のpin2に接続されています。
デバッガがポートを間違えないようにするために「ID850QB-MON V3.3 Portconfig」というプログラムでデバッグ用のポート番号を設定します。デフォルトはAUTOになっています。
試しに1文字受信するたびにLEDが反転してエコーバックするプログラムを作ってみます。
appliletの設定です。
- システムの基本設定はサブクロックとウォッチドックタイマー2を使用しない、オンチップディバグ設定は使用するにします。
- ポートはPCT6を出力にします(LED用)
- シリアルはUARTA2を使用するに変更すると、UARTA2という新しいタブができます。UARTA2のタブでは送信/受信、8bit、ボーレートは115200を選びます。割り込みレベルは受信を6、送信を7にしました。コールバック機能設定の受信完了もチェックしておきます。
appliletで作ると自動でAPIを生成してくれます。UARTA2については送信用のUART2_SendDataと受信用のUART2_ReceiveDataです。どちらもブロックしてくれないので完了待ちをしたいときは受信完了のコールバック関数CALL_UART2_Receiveを利用します。この関数はSERIAL_user.cの中に生成されています。最初は空なので受信完了通知のコードを2行追加しました。
void CALL_UART2_Receive( void ) { extern volatile int rxrdy; rxrdy = 1; }
今回は横着して受信完了コールバックだけ使いましたが送信完了コールバックも使ってもよかったかもしれません。受信はブロックするけど送信はブロックしていないので次の文字の受信と送信が時間的にかぶっていることになります。
一応、これらのコールバック関数は割り込み処理ルーチンから直接呼ばれているので、あまり重いことはしないほうがよさそうです。送受信APIや割り込み処理ルーチンはSERIAL.cにあるので何をしているかは読めば分かるようになっています。
メイン関数は次のようにしました。1文字受信したらエコーバックしてLEDを反転しています。
volatile int rxrdy; // 1のとき受信完了 void main( void ) { unsigned char rbuf, wbuf; // 通信用バッファ while(1){ rxrdy = 0; UART2_ReceiveData(&rbuf, 1); // 受信 while(!rxrdy) ; // 受信完了待ち wbuf = rbuf; // UART2_SendData(&wbuf, 1); // 送信 PCT.6 ^= 1; // LED反転 } }
appliletを使うとCPUやポートの設定のコードを書かなくてすむのが楽です。
何か気力がなくなって試すことができない。。。。
お願いします。
>これらのコールバック関数は割り込み処理ルーチンから直接呼ばれているので、あまり重いことはしないほうがよさそうです
これって正解なんですけど。でも、「この棚に物を載せないでください」だと思うのですけどどうでしょう?78K0S/KA1では9600bpsでも受信リングバッファにしないと文字抜けします。
こんにちは、ごださん
色々と難しそうな課題ですね。考えてみます。
コールバックですが、割り込み処理ルーチンの中ではバッファリングみたいなことをしていて、バッファが一杯になったときだけコールバックがくる作りみたいです。リングになっていないので、とりこぼしが怖い時は自分で割り込み処理ルーチンを書き直してやらないといけけないような気がします。