avr 間の [3線式] DATA転送です!
LEDのDATAを別avrに送る実験をしました。 2線式のIILでは、DATA/CLOCK両方の信号を[L]にした時に作動開始の合図でした。今回は処理が面倒になるので、スタート開始信号を別に付けこの信号がLになった時に信号スタートとしました。 受け取り側はLEDの表示を常時しておき、スタート信号があれば割り込みとして処理し、DATAの取り込みが始まります。 16bitのDATAとしたので16個のシリアル信号を受け取りLEDの処理をして、次の割り込み待ちとなります。 テストプログラム 送信側はまずスタート信号を送り、後に16bitの信号を送ります。 送信ボタンを押すと、DATAを[+1]して再度信号を送出する。これで順次別の信号が送られる事になる。 受け取る側はこの逆で、前記のように信号を受け取るとLEDに転送して表示します。これで「受け取る度にLEDのDATAが変わり、表示が変更される」ことになります。 実際のプログラム 16bitDATAを受け取ると10進DATAに変換して、それをLEDの各桁に変換してレジスターに保管しています。 メイン・プログラム自体はLEDを常時表示し、約1mSごとに桁を移したダイナミック点灯式です。 プログラム中に遭遇した問題点 1.割込みをEX0端子で受け付けた所、直ぐ割込みが発生して動作がおかしくなっていた(これは当初かなりまごついた)。 スイッチオン後、少し待ち時間を入れた。これによって初期スタートのタイミングを送らせて防止出来た。 2.ノイズかもしれないが、取り込みミスをした時入力待ちでフリーズ状態(Stop)になる事があった(毎回ではない)。 ループカウンターを付け、オーバーしたらループから抜け出せる方式とした。これによりミスでとまることは無くなった。 3.当初スイッチのチヤッタリング処理が甘く、途中で不安定で動作がおかしくなった。 待ち時間を長くして対応、かなりよくなったのと新しいスイッチと交換した。古いスイッチにガタがあったようで、チヤッタリングの発生が予想より多かったようです。 2005/NOV/14 TX プログラム (DATA送出の所のみ) X0: ;Send to LED /BinLow.BinHi mov BBL,BinLow mov BBH,BinHi ldi T_count,16 cbi PortD,L_enb ;begin TX rcall TXe ;7uS*2 rcall TXe sbi PortD,L_enb TX1: rol BinLow ;1data set rol BinHi ;1 cbi PortD,L_data ;2Carry set brcc TX2 ;2 sbi PortD,L_data ;2 Tx2: cbi PortD,L_ck ;2clock set nop ;1 nop ;1 nop ;1 sbi PortD,L_ck ;2clock dec T_count ;1 brne TX1 ;2 mov BinLow,BBL mov BinHi,BBH TXe: ret RX プログラム (割り込み、DATA取り込みの所のみ) exprg: in bkr,SREG ;keep ldi b_count,16 clr BinLow clr BinHi ex0: clr loop_c ex1: sbis PinD,L_ck ;2ck:LED_clock=L? rjmp ex2 ;yes to dec loop_c brne ex1 rjmp exit ;Time over ex2: clc ;1:clear carry sbic PinD,L_data ;2: sec ;1:set carry rol BinLow ;1:left+c rol BinHi ;1: dec b_count ;1: brne ex1 ;2:16bit end ?この後 binary to BCD (10進DATAに変換) to LED displayに変換 |
もどる [MAIN MENU]