AVRマイコン(ATmega164)で、RS485(半二重)の制御ソフトの動作を検証したのでメモ。
トランシーバはMAX1487を使用。
半二重のため、通常は受信状態にしておき送信時のみREと/DEを制御して送信。
PRINT文で送信完了後に、DEをLowにしてしまうと、バッファに入っているデータを全て送り終える前に送信禁止にしてしまうので、全てデータを出し終えてからDEを切りかえる必要あり。
制御方法・・UCSR1Aレジスタのbit6(TXC1 Transmit Complete) を読んで、送信完了かを調べて、完了であればDEをLowにし、その後/REをLowにして受信有効とする。
Check_txc:
If Ucsr1a.6 = 0 Then Goto Check_txc
Set Ucsr1a.6 ‘clear TXC1 (これを行わないと次回以降送信できず)
Reset Ucsr1a.6 ‘bit6をLowに戻す(あえてLowに戻さなくても動作OK)
Reset Portb.4 ’DE–>L
Waitus 1 ‘
Reset Porta.7 ‘/RE–>L(ENABLE RX)
上記のコードで動作検証済み。
(全ての文字を送出後、直ちに受信状態に切り替わります。)
注意・・使用したのはシリアル通信が2組あるATmega164の2チャンネル目なので、1チャンネルしかないマイコンのときはUcsr1aではなくUcsr0aレジスタです。
DEと/REのPortb.4及びPortb.7は、当方の回路に合わせたものであるので、参考にされるときは各自の回路に合わせてください。
DEと/REの間の「Waitus 1」は、あえて入れる必要は無いはず。
ここから余談。
初め、バッファのチェックでできるかな? と思い、BUFSPACEコマンドを使ってみました。
BUFSPACEの使い方・・・
Config Serialout1 = Buffered , Size = 20 ‘
と宣言しておき、Print文で送信後に
Check_buf:
Buf_check = Bufspace(2) ‘check tx buffer
If Buf_check <> 20 Then Goto Check_buf
としたのですが、これではバッファが空になったことがわかるだけで、送信終了のタイミングはわかりませんでした。(考えてみれば、確かにそう。)
そこで、TXCをチェックする方法に。
ちなみに、BUFSPACEを使うときは、必ず「Config Serialout・・」を宣言しておく必要があります。(宣言しておかないと、コンパイルでエラーが出ます)