PICBASICコンパイラ
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
まるでインタプリタ。でもコンパイラです。超カンタン超シンプルです。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
[第99回]
●SDカードIF(19)ND80Z3.5に接続(12)解決しておきたい問題
もう詰めの作業に入っておりましたのにまたもや訳のわからないエラーに遭遇してしまいました。
おかげで解決するまでに数日間しっかり悩むことになってしまいました。
その問題はRB(Read Byte)コマンドの動作テスト中に突然意味不明のエラーが発生したことから始まりました。
最初はそのとき1回きりの誤動作のように思われたのですがさらにテストを重ねていくうちにときどき同じ異常が発生するのを確認しました。
下は異常が発生したときのログです。
)rb 05 04 )rb 05 90 )rb E:89 )e >jp a000 )i FF E:FF )e >jp a000 )i 13 00 |
ROコマンドでファイルをOPENしたあとRBコマンドを繰り返し実行してファイルエンドまで来たあと、さらにRBコマンドを実行したためE:89エラーが表示されました。
E:89はファイルエンドを越えてReadコマンドを実行したときに表示されるエラーコードです。
このエラー自体は問題ではありません。
問題はそのあとに発生しました。
Eコマンドで一旦プログラムを終了してからもう一度JP A000でプログラムにエントリしました。
そのあとIコマンドでSDカードのイニシャライズを実行したときに異常が発生しました。
通常ならばIコマンドのエコーとしてコマンドコード13が表示されたあと00が表示されるはずなのにFFが表示されたあとE:FFが表示されました。
エコーFFはあり得ないコードです。
またE:FFというエラーコードもありません。
もう一度Eコマンドでプログラムを終了してから再度JP A000に続いてIコマンドを実行したところ今度は正しく実行されました。
なんなのだ、これは?
しかもあらためて同じ手順で再実行してみると殆ど同じように異常が発生します。
当初はRBコマンドのバグを疑ったのですがどこにもそれらしいところはみつかりません。
ありえないことが起きています。
この怪奇現象にはまるっと1日考えても全く原因がわからずほとほと疲れてしまいました。
こ、これはあれだ。
悪霊の仕業に違いない。
こういうときは金麦を飲んで寝てしまうに限る。
朝になればきっと平常に戻っているにちがいない。
んなわけにはいきませんでした。
そうなるとここはじっくり腰をすえて考えるしかありません。
そのうちに。
何かの原因でND80Z3.5からの送信とPIC18F2550の受信のタイミングが合わなくなってしまうのではないか?
という疑いが頭をかすめました。
2つのプログラムを何回見比べてみてもそんなことは起こるはずはないと思えるのですが。
しかし現実に異常が発生しています。
さらにあれこれテストをしていくとどういう場合に異常が発生するのかがだんだんはっきりしてきました。
この時点では原因は不明だったのですがどうやらND80Z3.5側のプログラムとPIC18F2550のプログラムの両方が「入力モード」になってしまうようです。
すると当然PIC18F2550からデータが出力されませんからラインはハイインピーダンスになります。
ND80Z3.5側の82C55の入出力端子は抵抗でプルアップされていますからその結果としてFFが入力されることになります。
[2023.11.16注記]この説明は間違っていました。[第101回]を参照願います。
どうもそういうことのようです。
しかしなぜそんなことが起きるのか。
ND80Z3.5のプログラムもPIC18F2550のプログラムも送受信のタイミングが合うようにきちんと設計したはずです。
しかし現実にありえないはずの送受信の食い違いが起きているということになるとその設計のどこかにアナがあるに違いありません。
それはどこなのか?
毎々書いておりますように当ブログ風記事は私自身の備忘録を兼ねております。
いえ。
勿論製作ノートは作成しておりますです。
しかしそこには思いついたあれこれを試行錯誤のままに書いていきますから、しかも気ばかりあせって書いたりしますから後からは判読不明の文字になってしまったりします。
今回の苦闘の記録です。
これを整理して後から読んでもわかるようにすればよいのですがそんなことをやっている暇はありません。
どうせ時間をかけるのならばこうやってホームページの記事にしたほうが少しは世の中のためになったような自己満足を得ることができます。
自分だけでわかったつもりになっていてもその実わかってないことがよくあります。
自分だけのノートではなくてこうやって皆様に説明するつもりで書いていますと考えのアナがみつかったりして思わぬ果実を得ることができたりします。
また後から私自身が参考にできる格好の備忘録として重宝しますから努力のしがいがあるというものです。
とはいえやはり時間のないなかでの作業ですので、とても説明を尽くすというにはほど遠い内容になりがちです。
まま、そのあたりはどうかお許しいただきますようお願いいたします。
そんな次第でとにかくはノートを整理しつつ説明を続けることにいたします。
まずはND80Z3.5とPIC18F2550との間のデータの送受信はどのように行なっているのかについてその概略を説明しておきます。
こちらはND80Z3.5側がコマンド、データを送信してPIC18F2550がそれを受信するときの信号波形です。
ND80Z3.5側がマスターでクロックパルスを送るとともにコマンド、データを送出します。
ND80Z3.5からの送信クロックと送信データライン、それに対するPIC18F2550から出力するREADY/BUSY信号ラインとPIC18F2550からND80Z3.5にデータを送信するラインの4本とGNDの合計5本のラインで送受信を行ないます。
この部分を含む回路図は[第85回]にあります。
送受信データは8ビットのデータをシリアル信号に変換して送ります。
ビット0が先でビット7が後です。
ND80Z3.5は送信に先立ってPIC18F2550からのREADY信号を確認します。
READY/BUSY信号は82C55のPC7に入力されます。
ND80Z3.5はPC7入力がLになるのを待ってから最初のクロックを立ち上げます。
クロックは82C55のPC1から出力されます。
続いてコマンド、データのビット0のH、LにしたがってPC0からH、L信号が出力されます。
クロックはH、Lそれぞれが約80μsecのパルスです。
1周期が160μsecですから1000/0.16=6250bpsの割とゆっくりした送信速度です。
もっと速くすることもできますが今はテストですし何より安全第一です。
このくらいが無理のない速度でしょう。
PIC18F2550はクロックの下がりエッジでデータを読み取ります。
上の図はコード13を送信しているところです。
PIC18F2550は8ビットのデータを読み終わるとREADY/BUSYラインをH(BUSY)にします。
この間PIC18F2550のデータ出力ライン(82C55のPC6入力)はH、Lのどちらかで変化しません。
下はPIC18F2550がデータを出力してそれをND80Z3.5が受信するときの信号波形です。
このときもクロック信号はND80Z3.5側が出力します。
送受信のタイミングは最初にND80Z3.5の側のコマンド入力から始まりコマンドによって送信、受信のデータの順序、データ数は決定されています。
PIC18F2550の側から送信、受信の要求を出すことはありません。
ND80Z3.5がPIC18F2550からデータを受信するタイミングではPIC18F2550からのREADY信号(82C55のPC7入力)がLになったことを確認してからクロックをHにします。
PIC18F2550はそれに先立って送信データのビット0のH、Lに従ってデータ送信ライン(82C55のPC6入力)をH、Lにします。
送信データはクロックの下がりエッジが過ぎてから次のビットの出力に変わります。
ND80Z3.5の側はクロックの下がりエッジでデータを読み取ります。
PIC18F2550からのREADY/BUSY信号ラインはクロックの下がりエッジのタイミングで短いパルスが出力されます。
これはデバッグのための仕様でND80Z3.5の側はこのパルスは読みません。
PIC18F2550はデータの送出を終えるとREADY/BUSY信号をH(BUSY)にします。
説明の途中ですが本日は時間がなくなってしまいました。
この続きは次回にいたします。
PICBASICコンパイラ[第99回]
2023.11.13upload
前へ
次へ
ホームページトップへ戻る