どうもうまく動いてくれないSDカードインタフェースですが、問題はクリアになりました。 わかりにくいので、シーケンス図にします。
この図で、PCからのリクエストがin/out命令で、OUT buffer/IN bufferがそれぞれフリップフロップやラッチです。
最初にコマンドをout命令で送出し、その後inを繰り返してデータを取得するという典型的な例です。 コマンド処理中はbusyをあらわすステータスがIN bufferに入っているので、PC側からはポーリングしながら待ちます。
問題は、赤い部分です。 ここは本来、INT1の処理の最後で書き込んだステータスが返されるはずなのですが、実際にはステータスは稀にしか返りません。 なぜか、ここでINT0の出力が返ります。
しかし、ときどきステータスも返ることがあるため、INT0の出力データの最初のバイトにステータスを埋め込んだとしても、データのずれが発生してしまいます。
なんでこんなことが発生するのか、まだ解明できていません。 busyが返るin命令でも割り込み信号自体はAVRに伝わっているので、それが何か影響しているのかもしれません。 プログラム上は、INT0/INT1の処理中(=割り込み処理中)は割り込みは禁止になっているはずなのですが。
なお、プログラムのメインループはsleepによりアイドル状態(スリープではない)の無限ループとしています。
while (1) { sleep_mode(); }
こんな感じです。 基本的に割り込みでしか動作しません。
匿名
画面が真っ暗、でもカーソルは出てる状況。
探して、ここにたどり着きました。
パスワード入力で、復活!
修理に出す寸前でした。ホントにありがとう!