DATA-通信 Ver 2
[ ICのタイミングを合せる ][10:DATA-通信]で1線式の通信の実験をしました。その後プログラムは一部修正しています(HP上も)。
更に今回は
1] タイミングを合わせることにし、送受信共にクロックをカウントしています。送信側のクロックは精度が必要なので1.2MHz動作とし、受信は1.2MHzと0.6MHzの実験し両方使える様にしました。
2] 前は使わなかった割り込みを使って、信号が来た時だけ受信処理をしています。何かのプログラムを実行しながら、割り込みを受け信号を受信出来ます。
3] 速度は4bitのDATAを約0.34mSec程で受け取れます(50uS/bit)。[ 全体の流れ式 ]メインプログラムは
1]初期設定をする。メインプログラムでピン設定等を開始する。
2]割り込み処理関係を設定する。
a どのPinを使うか、Pin Chainge Mask Registerを指定する。
b Pin変化割り込みを許可する。:PCIE_bit=1
c Global Interruptを許可する。:SREG_I_bit=1
3]割り込みプログラム
a 割り込みプログラムを作る。
フラッグをクリヤーしてサブルーチン(自作)を呼び出す。サブルーチン プログラムは
シリアルDATAを受け取るものです。
a start bitをチエックする。
b 4bit分のDATAを受け取る(4bitは仮設定です)。
c 受け取った4bitのDATAをピンに出力する。
d 終了後は、割り込み前に復帰する。 [ ハード関連 ]受信側(RX)は
今回は前回より精度良くと思い、動作クロックを送受信共に数え直し、タイミングを取り直しました。
これにより、1.2MHzで8bit動作も可能です。
tiny13aは使えるPinが6本なので、Maxは5bitとなる。チョコチョコ確認するには4bitという所でしょうか。信号待ち
信号取り込みは「割り込み式」にしました。ただ途中切れには対応させていませんので、タイミング待ちで、常に書き換える場合は良いのですが「重要なDATAで狂うと困る場合」まだ工夫が必要です。
信号が来たら、DATAを取り込んで表示します。常時入力監視するのでは無いので、Soft的には軽くなります。
今回は処理が無いので無限ループにしました。信号が来ると受信してPin表示をしています。終わったら何もしないで次の信号が入って来るのを待っているだけです。DATAの書き換えは信号が入って来た時だけですので、何も来ない場合は直前に受信した信号DATAをしばらく使うわけです(この辺はSOFTで確認を!)。
[ MCUのソフト ]ソフトですが、発振周波数は何時も使う1.2MHzに設定しました(受信は0.6MHzも実験)。
細かいプログラムは前回と基本の説明は同じなので省略します。ICのhex DATAです。プログラムはこれです。
2014/11 サブルーチン方式にした(Ver 2)。S-TX :1000000039C0FECFFDCFFCCFFBCFFACFF9CFF8CF71 :04001000F7CFF6CF61 :10007400BFE9BDBFB0E0BEBF2F92B0E1B7BBB8B31C :10008400B061B8BB12E00EE80A95F1F71A95E1F7F2 :100094000000B1E0B093610000916100093090F478 :1000A40020906100B5DF23E013E006E40A95F1F740 :1000B4001A95E1F72A95D1F7009161000F5F00933B :0800C4006100EACFE6CFFFCF97 :10001400B8B3BF7EB8BB03E10A95F1F70000B8B3EB :10002400B061B8BB03E10A95F1F70000B6E0B09304 :100034006000022D0072003221F4B8B3B061B8BB85 :1000440003C0B8B3BF7EB8BB022D000F202E0091B1 :1000540060000150009360000DE00A95F1F7000084 :1000640000916000002329F7B8B3B061B8BB0895CC :000074008C :00000001FF S-RX :1000000053C0FECF42C0FCCFFBCFFACFF9CFF8CF21 :04001000F7CFF6CF61 :1000A800BFE9BDBFB0E0BEBFBFE0B7BBB0E0B8BB03 :1000B800B0E1B5BBBBB7B062BBBFBFB7B068BFBF2D :0400C800FFCFFFCF98 :10008A00EF93FF93BF93BFB7BF93BAB7BF7DBABF12 :0E009A00BCDFBF91BFBFBF91FF91EF911895E2 :10001400B6B3B4FF01C0FCCF0EE00A95F1F7B6B356 :100024004E7FB4FF416040FF01C0F9CF0AE10A9559 :10003400F1F7B6E0B0936000B0E0B09361000091D6 :100044006100000F00936100B6B3B4FF06C00091D5 :1000540061000F5F0093610003C002E00A95F1F7AD :10006400009160000150009360000BE00A95F1F7E5 :100074000000000000916000002309F70091610076 :060084000F7008BB089597 :00000001FF [ 作業が終わって ]6bitでSoftを作りました。これって1bit分余りますがここの部分を「アドレスとして利用」すれば2つのICに別々の情報が送れます。何か使い道を考えたと思います。
実験では1-8までの数字を時間を区切って(0.3秒間隔)送り、受けた方は3つのLEDでそれを表示しているだけです。これでもLEDはくるくる動いている感じです。
本当は待ち時間の方がはるかに大きいのですが…。
6bitで50uSec/bitですから約0.45mSecで1回送れます(Stert bitの0.1msを含む)。[ トラブル ]作動するまで経験したトラブルは「0.6MHzで動作実験して、そのまま1.2MHz動作に戻さず動かしていて」動かなくなって、戸惑いました。
当初クロックをカウントせずに実験していたので、込み合って来ると作動しなかった。そしてなかなか思った通りに動作しなかったです。クロックを下げれば解決出来るのですが…ここは、微妙な所です。製作 2014/11/11
[MAIN MENU へ戻る]