AT90S1200による増設出力モジュール 【どんなもの】 AVRに限らず、ワンチップマイコンで応用回路を設計 していると、出力ポートが足りなくなることがあります。 こういう時は、シフトレジスタにラッチの付いたIC( 4094とか74HC595)を外付けすることが多いようです。 これらのICは、3本の通信線で8ビットの出力が得られま す。より多くの出力が欲しい時はこれらのICを数珠繋ぎ にします。 こういうICの代わりに、内蔵RC発振器で動くAT90S1200が 使えないかと考えました。 まずホストとの通信は非同期シリアル通信にします。 こうすれば1本の通信線でOKです。AT90S1200は15ビット のI/Oポートがありますから、そのうちの1本を通信に使う とすると残り14ビットを出力ポートとして使えます。 AT90S1200の内蔵RC発振器はそれほど安定に発振する わけではありませんし、またホスト側もそうである可能 性があります。どうせAT90S1200にはシリアル通信のた めのハードウェアはありませんし、柔軟にいろいろなボー レートに対応するために、最初の通信で、ボーレートを 決定する方法を取りました。 |
|
![]() |
|
非同期シリアル通信のフォーマットは、上記のようになっています。 (8ビット長、パリティ無し) 通信していない時はHレベル スタートビットは Lレベル 以下、LSBからMSBまで出力して ストップビットは Hレベル LSBを必ずHレベルとすれば、Lレベルの時間を測定す ればストップビットの長さ(=ボーレート)がわかりま す。 4800bps、9600bps、19200bpsのいずれでも通信できました。 もちろん、この間の中途半端なボーレートでもかまいません。 またこの増設出力モジュールは複数接続できるようにもしましょう。(下図) 最大8台としておけば、まず足りないことはないはずです。 |
|
![]() |
|
回路図です。↓ |
|
![]() |
|
ソフトウェア この回路は複数繋がることから、自分に対する送信データであることを 識別するために、回路毎にID(3ビット)を持つことにします。つまり最大で 8個の回路を繋ぐことができることになります。 自分宛ではない送信データは無視します。そのために、送信するデータの バイト数も最初に知らせることにします。 具体的には↓をご覧下さい。 |
|
![]() |
|
フォーマット1では、14ビットのポート全部を直接H/Lできます。 フォーマット2では、14ビットのうちのどれか1ビットをHまたはLにできます。 (0=PD0、13=PB7) では、テストしてみます。 |
|
![]() |
|
14ビットの出力にはそれぞれLEDを繋ぎ、通信ポート(PD2)には簡易なEIA-232インターフェース を入れて、PCと接続しました。 |
|
うまく動いています。 19200bpsで、3バイト送信するのに、1.5msかかります。2バイト送信なら1msです。 この程度の頻度でしか出力を変化できませんが、リレーのON/OFF程度でしたら 充分でしょう。 単純にポートをON/OFFするのではなく、7セグLEDを繋いで、ローカル側でスキャン すれば、ダイナミック点灯もできるでしょう。それはこれからです。デコーダを使わない とすれば、7セグ×7桁、もしくは8セグ×6桁の制御ができますね。 |
|
![]() |
4800bpsで$55を受信させました。 サンプリングするところで、ポートを Low/Highして、受信しているシリアル データのどこをサンプリングしているか 観測しました。 黄色がサンプリング位置 空色がシリアルデータ ちょっとズレもありますが、だいたい ほぼ中央部でサンプリングしていて 問題ないようです。 |
![]() |
これは9600bps。 サンプリング位置がよくわかるように 重ねてみました。 問題ありませんね。 |
![]() |
これは19200bps。 問題ありません。 |
![]() |
ここでソフトを変えました。 割込処理の入口でLow、 割込処理の出口でHighにしてみました。 Lowの期間が割込処理していることに なります。(黄色の方) 19200bpsです。 3バイト連続受信したところ。 |
![]() |
上記の時間軸を拡大しました。 割込処理の時間に問題ないようです。 (シリアルデータの1ビットが約50μ秒、 割込処理の時間は、最後が一番長く かかっていて30μ秒弱です。 最後が長くなるのは、今まで受信した データをポートに出力する処理がある からです。 もし38400bpsになるともう処理が追い つかないことになります。) |
以上より、19200bpsには充分追従することがわかりました。 おそらくあと2〜3割早くても大丈夫でしょう。 AT90S1200のクロックは1MHz(=周期1μ秒)ですので、 1命令実行するのに1〜2μ秒かかります。割込処理に30μ秒 ということは20命令分ぐらいでしょうか。 クロックに比例して処理速度は上がりますから、素直にセラロック か何かを外付けすれば、もっと早いボーレートにも対応できます。 (早い方の限界はAT90S1200の処理速度に起因しています。) 遅い方の限界は、タイマ割込を使う関係で、タイマのカウンタが8ビット だということに起因しています。現状で、4800bpsが遅い方の限界です。 これは、なるべく処理速度を早くするために、1回のタイマオーバーフロー 割込を使っているからで、ソフト次第で遅い方にはいくらでも対応できる のは言うまでもないことです。 AT90S1200は最高で12MHzクロックで動作しますから、スピード狂の方 はやってみて下さい。今の12倍、maxで300kbpsぐらいまで追従するはず です。遅い方は今のソフトのままで60kbpsぐらいまで追従しますから、 Windows PCの一般的なボーレートの最大である115.2kbpsにぴったり です。8台まで繋げますので、あまり高速に書き換えることはできませんが (115.2kbpsですと、1台分の書き換えに200〜300μ秒ぐらい)、PCのCOM ポートに繋ぐ汎用出力ポートとしても用途がありそうです。 ソフトはこちら。 |
|
戻る |