PIC16F887その後


PIC16F887が70個届いたので、いくつか抜き取ってテストしてみた。ほとんど個体差は無かった。これ以上調べるだけ無駄だと思い、そこで調べるのをやめた。やはり16F887ではOSCTUNEの値は49〜59でないとうまく通信できなかった。


そのあとセラロックをつけて16F877,887A,887でテストしてみた。4MHzのセラロックでは19200bpsでときどき文字落ちしていたのに、3.58MHzのセラロックでは57600bpsでも文字落ち・文字化けなしに通信できていた。


「16F877で3.58MHzのセラロック」と「16F887でRC発振(7.3728MHz)」を57600bpsで双方向のやりとりをテストしたがうまく動いていた。


AVRとPICの両方のシリアル通信のプログラムが書けたので、次に数珠につなぎ(TxDを次のマイコンのRxDに接続)して、それぞれのマイコンのI/Oを制御するソフトを書いた。


プロトコルは、命令は常に2バイト。
・1バイト目はdevice ID(255なら全デバイスが対象)
・2バイト目が制御するI/Oの番号(7bit)とOn/Offのどちらにするのかが1bit
という至ってシンプルな実装だ。


命令を受け取ったマイコンはdevice IDが0か255なら自分用の命令なので、それを実行し、そうでなければ、deviceIDを1引いて次のマイコンにforwardingする。(device IDが255のときは1引かずにforwardingする)


こうすれば、FT232RLモジュールに直結しているマイコンのdevice IDが0になり、そこから数珠つなぎになっているマイコンのdeviceIDが1ずつ増えていく(ようにパソコンの制御ソフト側からは見える)のだ。


この方式ならマイコンごとに異なるdeviceIDを持たせるためにそれぞれのマイコンに異なるプログラムを書き込む必要はない。ATtiny2313を100個繋ぐとしてもすべてに同じプログラムを書き込むだけだから楽ちんだ。


もっとも、ATtiny2313を200個買ったものの、それらを繋いで何をするかについてはまだ何も考えてないのだが…。