I/O回路の要求には高速応答性が必要で、到底AVRの割り込み反応時間では間に合わないことがわかったので、バッファを入れる実験をしました。
例により、簡略化した回路です。
手持ちのラッチがLS373しかなかったので、電圧が混在しています。
プログラムのほうは、なんかoutしたら、そのタイミングでデータを出力し、inで読めるようにしてみました。単純にデータをインクリメントしているだけです。
.org 0
rjmp RESET
rjmp INT_IN
rjmp INT_OUT
INT_IN:
inc Data
; buffer input close
cbi PORTB, 1
reti
INT_OUT:
; output data
mov Temp, Data
ori Temp, 0x40
out PORTC, Temp
mov Temp, Data
ori Temp, 0x3f
out PORTD, Temp
; load data to the buffer
sbi PORTB, 1
reti
RESET:
ldi Temp, low(RAMEND)
out SPL, Temp
ldi Temp, high(RAMEND)
out SPH, Temp
ldi Data, 0x00
ldi Temp, 0x12
out DDRB, Temp
ldi Temp, 0x3f
out DDRC, Temp
ldi Temp, 0xc0
out DDRD, Temp
ldi Temp, 0x0a
out MCUCR, Temp
ldi Temp, 0xc0
out GICR, Temp
sei
LOOP:
rjmp LOOP
とりあえずの「データを読ませる」という結果としては良好です。
AVRからのデータらしきものがPC側から読めています。
ただ、なんかD0がふらふらする変な挙動です。
outしないでinし続けると0が入力され続けるはずなのに、ときどき1が混じります。
out/inを交互に繰り返すと、大部分が2回ずつ同じ値を読んで、次は2インクリメントします。
データラインがショートしたりているわけではなさそうなのですが、いまのところ原因はわかりません。接触が悪い可能性はありますが、直しても同じなのが謎。そこら辺から剥ぎ取ったラッチが変なのかも。
とりあえずラッチ意味があったということで勘弁しといてあげよう(弱気)。
最近のコメント