PIC/AVRを100個数珠つなぎにする計画(1)


(前回までのあらすじ)


私は先日、ATtiny2313を200個とPIC16F877Aと887を併せて200個ほど買った。(http://d.hatena.ne.jp/yaneurao/20080714)


とりあえず100個ほど数珠つなぎにするのが流行っているようなので、これを100個ほど繋いで何かを作ってみたい。


何を作るかは何も考えていないので何も出来ないかも知れない。ただただ100個繋いで、どれくらいの伝達遅延があるかを調べたり、「何番目のAVRマイコンの何番ピンを1に!!」とか、そういう指令をPCから出してみたいだけなのだ。


(ここに従順な100人のメイドさんが1本の縄で数珠つなぎにしばられている図があると想像すべし)



■ PIC16Fの変態アーキテクチャには泣かされる


・TRISレジスタが大変嫌らしい。


TRISレジスタはI/Oを出力に使いたいbitは0にすると書いたが、出力しないところは入力だから1にしておかないと気持ち悪い。(16F877→887でI/Oの数が増えるので、増えた時にもきちんと動くように)


ところが1にしてしまうと、16F877のTRISEなんかはbit4が「パラレルスレーブポートモードセレクトビット」だったりして、1にすると普通のI/Oにならない。16F887ではこのbit4は未使用になっているので気づかなかった。(887ならきちんと動くのに877では動かないプログラムになっていた。)


I/Oに使いたいのにならない!!と言う人は、16F877と877Aと887のすべてのデータシートのSPECIAL FUNCTION REGISTER SUMMARYを見て、TRISレジスタをよくチェックしておかないといけない。(16F8XXに限った話ではないが)


あと、以前書いたが、I/Oに使いたいなら、ANCON1=7(16F877/16F877A),ANSEL=0(16F887)にしないといけないというのもハマりどころ。


・PORTCのRC6がTxD


PORTC = 0;などとするとTxDがまきぞえを食う。PORTCを0で初期化したければ、

RC0 = RC1 = RC2 = RC3 = RC4 = RC5 = 0;


としないといけないようだ…。TRISレジスタのようにポートのin/outを切り替えるレジスタだけではなく、出力したいポートを都度選択できるようなmaskレジスタが必要なのではないかと思うのだが…。


・16F877/877AではRA4はopen drain


16F887ではopen drainではない。デジタルI/Oとして使いたいので個人的にはopen drainではないほうが有り難い。


■ 16F887を100個数珠つなぎ


USBに秋月のFT232RLモジュールを繋いで、ここから電源をとる。よって、Vddは5V。
57600bps通信のため3.58MHzで動作させる。data sheetを見る限り、16F887は16F877と比べると消費電力は半分以下のようだ。


・ Operating Current:


16F877

  • 2mA typical @ 5V, 4MHz


16F877A

  • 1.6mA typical @5.5V , 4MHz


16F887

  • 0.9 mA typical @ 5.0V, 4 MHz (max 1.4mA)


100個繋ぐと90mA(typical)である。最大で計算しておくべきかも知れないので、そうなると140mAである。


USBのバスパワーは500mAまでと言われているが、500mAは規格上、出力できる最大の値が500mAなだけで、実際は50mAだったり100mAだったりする。まあ、デスクトップ機なら100mAぐらいはあるだろうから、16F887なら100個でもギリギリ大丈夫かも知れない。


一方、ATtiny2313のほうは、data sheetによると

  • VCC=3V, 4MHz 2mA(max)
  • VCC=5V, 8MHz 6mA(max)

と書かれている。


typicalの値が書かれていないが、typicalにはmaxの6,7割ぐらいだと思う。それにしても35(36?)もI/OのあるPIC16F887よりずいぶん多いように思うが、PICは4clockで1命令しか実行できないのでPICの4MHzと比較するならATtiny2313の1MHzとにすべきだろうか?