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インクリメントします。
データラインがショートしたりているわけではなさそうなのですが、いまのところ原因はわかりません。接触が悪い可能性はありますが、直しても同じなのが謎。そこら辺から剥ぎ取ったラッチが変なのかも。
とりあえずラッチ意味があったということで勘弁しといてあげよう(弱気)。
匿名
画面が真っ暗、でもカーソルは出てる状況。
探して、ここにたどり着きました。
パスワード入力で、復活!
修理に出す寸前でした。ホントにありがとう!