BASCOMでRS485通信

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・・」を宣言しておく必要があります。(宣言しておかないと、コンパイルでエラーが出ます)

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)