AVR 117 :avr 間のDATA転送


avr 間の [3線式] DATA転送です!

 LEDのDATAを別avrに送る実験をしました。
avr 間のDATA転送機  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

inserted by FC2 system