PICBASICコンパイラ
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
まるでインタプリタ。でもコンパイラです。超カンタン超シンプルです。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
[第104回]
●SDカードIF(24)ND80Z3.5に接続(17)解決編(2)
前回からの続きです。
「論より証拠」という言葉があります。
前回はあれこれ試して考えた結果ひとつの推論に到達しました。
しかしそれだけではただの推測、理屈に過ぎません。
推測したならば次にはそれを実際に確かめてみる必要があります。
下は前回推測したND80Z3.5とPIC18F2550の起動時の通信ラインの波形です。
PIC18F2550がTRISA命令でPORTAを出力に設定したときの出力をND80Z3.5がそれ以後に出力されるはずの波形と誤認してしまう可能性を示唆したチャートです。
それには条件があります。
前回は書き漏らしてしまいましたが上記の問題はおそらく電源投入後の最初のプログラム実行時には発生せず、電源を入力したまま1回目のプログラムを実行時、一旦プログラムの実行を終了したあとふたたび2回目にプログラムを実行してそこでPIC18F2550のリセットが行なわれた場合に限って発生するということです。
実際にそれは繰り返してテストをすることによって確認できています。
そして1回目のプログラムを実行したときにもそのプログラムを終了する直前にPIC18F2550が実行する命令にはある条件があります。
そのことについては後ほど検証します。
まずは「論より証拠」です。
ここはやっぱりCPLDロジアナの出番でありましょう。
上記の条件でキャッチした各ラインの波形です。
PROBE5を82C55のPC2(PIC18F2550のMCLR)につなぎました。
PIC18F2550のリセットラインです。
そのラインがH(↑)になるときがトリガになって測定が開始されます。
画面の上部でトリガ条件とサンプリング周波数を設定します。
先にSTARTボタンを押してからND80Z3.5側のプログラムを実行します(JP A000を実行)。
測定した結果は上で推測した通りだったのですが、波形は私の推測とは少し異なっていました(なるほどそうなるのか。これは気が付かなかったなあ)。
PROBE0〜PROBE3は先ほどの図と同じ並びです。
PROBE0はND80Z3.5からのCLK出力(PC1)です。
PROBE1はND80Z3.5からのDATA出力(PC0)です。
PROBE2はPIC18F2550からのREADY_/BUSY出力(RA3、PC7)です。
PROBE3はPIC18F2550からのDATA出力(RA2、PC6)です。
PIC18F2550のRESET信号(PLOBE5)がHになってから40μs後にPROBE2がLになっています。
ここでTRISAが実行されたことを示しています。
PROBE3はHのまま変化していません。
PROBE2は約4μs後にHになりその後はずっとHのままのように見えます。
それについては続きがありますが、まずはPROBE0とPROBE1の波形について説明をしておきます。
PROBE2がLになってからPROBE0、PROBE1がHになるまでに10μsほどかかっています。
これはND80Z3.5側のプログラムの遅れによるものです。
下はND80Z3.5のその部分のプログラムです。
LD A,F0;pic reset on OUT (82),A CALL TM3;27ms LD A,FC OUT (82),A;pic reset off LD BC,$0400 LOOP1:IN A,(82);11---- AND C0;7 | 59/6=9.83us CP 40;7 | JP Z,LOOP11;10--|-> DEC BC;6 | | LD A,B;4 | | OR C;4 | | JP NZ,LOOP1;10-- | JP ERR90; | LOOP11:LD A,FF;7---------|53/6=8.83 OUT (82),A;11------ LOOP2:IN A,(82);11------- AND C0;7 | CP C0;7 | JP NZ,LOOP2;10 |53/6=8.83us LD A,FC;7 | OUT (82),A;7/26 11- |
LOOP1のところで10μsに1回PC7=0、PC6=1をチェックしています。
PC7(RA3)がLの期間は3.5μs(前回参照)ですから読み取れなくてスルーしてしまう可能性もあります。
たまたまほぼ毎回のようにここでひっかかってしまうのはPIC18F2550のリセットが解除されてから約40μs後にRA3=0になるタイミングとND80Z3.5の読み取りサイクルがたまたま同期してしまうからだと考えられます。
たまたまそうなっていたため今回の問題に気が付ついたわけで、これは恐ろしいことです。
ときどきATMとか携帯の通信システムなどでトラブルが発生したりすることがあります。
おそらくは相当念入りにテストをしているはずだと思いますがこういう思いも依らぬタイミングでそれをすり抜けてしまうバグがあったりするのではと思います。
特にこのようにタイミングが歯車のようにきっちりかみ合って動くようなプログラムではよほど念入りに思考を重ねる必要があるとあらためて痛感しました。
上記プログラムの説明を続けます。
上記のプログラムではLOOP1:のところでIN A,(82)でラインの状態を読み取ってからLOOP11:のところでOUT (82),AでPC7、PC6をHにするまでに9μsかかっています。
Hの期間も9μsです。
CPLDロジアナの測定波形と一致しました。
そこまで確認しましたので再度CPLDロジアナの波形に戻ります。
先ほどの波形ではPROBE2は約4μsの間LになったあとはずっとHのままのように見えます。
実はリセット解除後490μs経ってからPROBE2がLになっています。
さきほどのロジアナ波形でPROBE0、PROBE1がリセット解除後50μsのところで約10μsの間Hになっています。
PIC18F2550はそれを検出すると初期的な処理を行い約300μs後にRA3(PROBE2)をLにします。
50〜60+300=350〜360μsですからそれより150μsほど遅れてLになっています。
計算よりも少し遅いですがここの初期的な処理ではSDカードのアクセスを行なっていますのでSDカードによって変動があってもおかしいことではありません。
前回は思考とテストの結果ひとつの推論に達しました。
今回はそのことをCPLDロジアナを使って確認しました。
すると次はなぜそういうことが起こるのか、というその原因を解明しなければなりません。
というところで今回も時間がなくなってしまいました。
次回に続きます。
PICBASICコンパイラ[第104回]
2023.11.21upload
前へ
次へ
ホームページトップへ戻る