2023.11.16
前へ
次へ
ホームページトップへ戻る


PICBASICコンパイラ

〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
まるでインタプリタ。でもコンパイラです。超カンタン超シンプルです。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜

[第101回]



●SDカードIF(21)ND80Z3.5に接続(14)解決しておきたい問題(3)PICのプログラムを修正しました(2)

今回の問題は今では全て解決済みです。
しかし製作ノートをもとに整理しながら書いておりますので今回の記事の時点ではまだ問題は未解決です。
未解決だからといって時々にせよわけのわからないエラーが出るのをそのままにしておくというのも気持ちが悪いものです。
そこでとりあえずFFが表示されてしまったときにその次のコマンド入力からは正常動作に復帰するようにプログラムを修正しました。
異常動作についてテストを重ねていくうちにどういう時に”FF”になってしまうのかということがわかってきました。
そこが修正のポイントです。
その前に補足説明です。
前回までのところでは”FF”が表示されたときにさらに続けてコマンドを入力するとどうなるかについては書いていませんでした。
[第99回]では”FF”が表示されたときにそこで一旦プログラムを終了しあらためてJP A000でプログラムを再実行すると”FF”エラーは発生しなくなるということをログをお見せして説明しました。
そのときプログラムを終了しないで続けてコマンドを入力したときにどうなるかについては説明していませんでしたが、続けてコマンドを入力すると下のログのようになってしまいます。
>jp a000

)i
FF
E:FF
)i
FF
E:FF  

ひとたび”FF”エラーが発生してしまうと一旦プログラムを終了してからもう一度JP A000コマンドでプログラムを再実行しない限り”FF”エラーが繰り返し発生します。
もう少し正確に書きますとコマンドによってエラーの出方は異なるのですが正しく実行されなくなるという点では一致しています。
この状態をクリアするために毎回プログラムを終了してからまたプログラムを再実行しなければならないというのではこれはもう典型的な「欠陥プログラム」です。
エラーの原因がわからないとしてもせめてエラーが表示されたときでも次に入力するコマンドは正しく実行されるようにしたいと考えました。
病気の治療などではこういうのを対症療法というのだそうです。
下はプログラムを「対症療法的に」修正したあとのログです。
logfile nd80zlog\11141145.txt open

ND80ZVに接続しました
0001 0000 - z
1000 00C3 - 
*** nd80z3 basic ****
ndwr2h.bin loaded,from E23F to E535
>jp a000

)i
13
E:92
)i
13
00
)ro test24.bin
04
00
00
0006
)rb
05
00
)rb
05
90
)e
>in 82
7D
>jp a000

)i
FF
E:82
)i
13
00
)e
>/exit
0000 00C3 - 
リモート接続を終了しました
logfile closed at Tue Nov 14 11:48:18 2023

このログでは最初のIコマンドの入力に対してE:92が表示されていますがこれは今回の問題とは関係ありません。
電源を投入したときに最初にIコマンドを実行すると1回だけこのエラーが表示されます。
E:92はSDカードの情報が正しく読み取られなかったときに表示されるエラーコードです。
このエラーの回避方法についても後ほど考えてみるつもりです。

ということで今回の問題についてです。
ログの終わりに近いところでIコマンドの入力に対するエコーがFFと表示されたあとE:82と表示されています。
ここは今までのログではE:FFになっていました。
今まではそこのところは何の対策もとっていませんでした。
何も対策をしないままだと同じエラーが繰り返されます。
そこでプログラムを修正してE:FFの代わりにE:82を表示するようにしました。
E:82は「コマンドコードではない」というエラーです。
これは新しく作ったエラーコードです。
そしてプログラムが不正な流れにはまってしまっていると判断してその流れから抜け出して通常のコマンド入力処理に戻るようにしました。

ちなみにその上のところで
IN 82
を実行して
7D
という値を得ています。
エラーが発生するメカニズムにちょいと気がついたところです(問題解決への伏線です)。
このことについては後で説明することになると思います。
この”82”は82C55のアドレス(PORTC)のことでE:82の表記とは関係ありません。

動作の確認のため送受信の波形をCPLDロジアナでモニタしました。
CPLDロジアナの画面です。

CPLDロジアナについてはこちらを参照願います。
確かに。
ロジアナは強力な助っ人でありました。
PROBE0は82C55のPC1からのクロック出力です。
PROBE1は82C55のPC0からのデータ出力です。
Iコマンドのコマンドコード13(11001000)が出力されています。
PROBE2はPIC18F2550からのREADY/BUSY出力です。
受信または送信時にはL(READY)を出力します。
PROBE3はPIC18F2550からのデータ出力です。
このときはHになっています。
このあと通常なら出力したコマンドコードのエコーがPIC18F2550から返されます。

下は問題の”FF”が返っているところです。

この応答があるまでに5ms以上かかっています。
この間PIC18F2550は何をやっているのか?
それについても今はそういうことだったかと合点しています。
PROBE3はずっとHになっているのでデータとしては”FF”になります。
全てがわかった今では理解できることなのですが、実はこのときPIC18F2550は「受信モード」になっていてコマンドコードの受信待ちになっています(食い違いが起きています)。
PIC18F2550は「受信モード」なので”FF”を出力しているのではなくて何も出力していなくて出力ラインがずっとHになっているのですがそれが結果としてコマンドエコー”FF”としてND80Z3.5に読み取られます。
[第99回]の説明では「受信なのでラインがハイインピーダンスになるが82C55の入力ラインはプルアップされているのでその結果として”FF”が入力される」と書きましたがそれは誤りでした。
PIC18F2550が受信モードのときでもPIC18F2550のデータ出力がハイインピーダンスになることはありません。
PIC18F2550のデータ出力ラインは最後に出力したデータのビット7の状態によってHかLを継続します。
しかしこのときは別の理由によってPIC18F2550のデータ出力ライン(PROBE3)はHになっていたのでした。
一方でND80Z3.5の側は「受信モード」のときはデータ出力ラインは常にH出力になります。
こちらも出力がハイインピーダンスになっているのではありません。
(こういうことが手間がかかっても当ブログ風記事を書いているからこそ気が付く大きなメリットです。自分のためにノートに製作メモを書いているだけでは気が付かずに思い違いをしたまま過ぎてしまいます)

コマンドのエコーを受信した次の受信です(上で書きましたように食い違いがおきているために実際はエコーではないのですが)。

正常ならばここは正常に処理が行なわれたというしるしとして”00”がPIC18F2550から送られます。
今回のプログラム修正をする前は食い違いのためPIC18F2550からは「エコー」として”FF”が出力されていたのですが、ND80Z3.5の側はそれをエラーコードとして受信しE:FFと表示しました。
今回の修正によってPIC18F2550はエラーコード”82”を出力しています。

ここで「食い違い」が起きたときのその後のND80Z3.5とPIC18F2550の動作について整理しておきます(「食い違い」の原因についてはまた後での説明になります)。
上記の後、ND80Z3.5は次のコマンドを出力します。
PIC18F2550は”FF”をコマンドコードとして受信したのでここでエラーコードを出力します。
両方とも出力ですが双方の出力ラインは別になっているのでデータの衝突は起きません。
どちらも出力モードのときはデータの入力は行ないませんからこのときは両方とも正しく出力が行なわれたと判断して次のステップに進みます。

その次のステップではND80Z3.5は「受信」モードとなって「エコー」の受信待ちになります。
PIC18F2550も「受信モード」となってコマンドの受信待ちになります。
ということで食い違いが起きたままエラーの発生が繰り返されます。
それはプログラム修正をする前のプログラムの動作です。
今回のプログラム修正によってそのような繰り返しが起こらないように改めました。

上は食い違いが起きたときのプログラム修正後の送受信波形でしたが、参考までに食い違いが起きなくてIコマンドが正しく処理されたときの送受信波形を下に示します。

最初にND80Z3.5(の82C55)からコマンドコード13(11001000)が送信されその直後に今度はPIC18F2550からエコーとして同じコード13が出力されています。
先ほどはPIC18F2550から応答があるまで5ms以上かかっていましたが今回は即答しています。

続いてIコマンドの処理が正常に完了したことを示すコード00がPIC18F2550から出力されました。

出力されるまでに約18msかかっています。
SDカードの初期設定にはそのくらいの時間が必要なようです。
PIC18F2550のデータ出力ラインはずっとLのままで”00”が出力されていることを示しています。

こちらも参考までに、上のほうで書きましたE:92が表示されたときの波形です。

コード”13”を出力してエコーで同じコードが返ってくるところまでは上と同じです。

その後PIC18F2550からエラーコード”92”が出力されました。

エラーコードが返ってくるまでに72msもかかっています。
正しくアクセスできたときは18msでしたからそれに比べるとちょっと長いようです。
上のほうに書きましたようにこのエラーは電源投入後の最初のIコマンドのときだけ表示されます。
なぜそうなるのか、またどうすればそれを回避できるのか、時間ができたときに考えてみることにします。

PICBASICコンパイラ[第101回]
2023.11.16upload

前へ
次へ
ホームページトップへ戻る