PICBASICコンパイラ
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
まるでインタプリタ。でもコンパイラです。超カンタン超シンプルです。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
[第167回]
●/VERIFYの問題表示
前回はすでにプログラムを書き込み済みのPIC18F2550に対して全消去をしないでテストプログラムを書き込んでしまったためにベリファイでエラーになってしまったことについて書きました。
エラーになるのは当たり前のことなのでそれ自体は問題はないのですが、その表示に問題がありました。
前回はちょっと時間がなくてどこがどのように問題なのかについて詳しく説明ができませんでした。
今回はそこのところをもう少し詳しく説明します。
下は前回もお見せしたログのうちのベリファイエラーになった部分のみを取り出したものです。
>/verify startcode=01 i=6,b=2,[04]0000[01]*i=14,b=4,[00]0000[01]*i=22,b=4,[00]0008[0f]*verify error! 0,28-08 i=42,b=16,[00]0020[0f]*verify error! 8,a4-80 i=62,b=16,[00]0030[0f]*verify error!20,58-08 i=82,b=16,[00]0040[0f]*verify error!30,8e-82 i=102,b=16,[00]0050[0f]*verify error!41,ef-6e i=122,b=16,[00]0060[0f]*verify error!50,7d-2c i=142,b=16,[00]0070[0f]*verify error!61,f0-00 i=162,b=16,[00]0080[01]*i=182,b=16,[00]0090[01]*i=202,b=16,[00]00a0[01]*i=222,b=16,[00]00b0[01]*i=242,b=16,[00]00c0[01]*i=262,b=16,[00] |
前回の繰り返しですが。
最初にエラーが発生したところの表示は
i=22,b=4,[00]0008[0f]*verify error! 0,28−08
です。
ここの表示がおかしいのです。
i=22はもとのファイルの22バイト目のデータでb=4は書き込みをするデータが4バイトあって、[00]はそれがHEXファイルの行コードで通常のデータであることを示していて、0008は書き込みデータの先頭アドレスを示しています。
そこまでがWindows側からのUSB送信データです。
そのあとの[0F]はPIC側からの応答コードでエラーが発生したことを示します。
0,はそのアドレスの下位8ビットを示していて、28−08はもとのデータと書き込み後に読み出したデータです。
ここで問題なのは下位アドレスの0です。
HEXファイルの1行のデータは最大16バイトなのでその行の開始アドレスが0008の場合その行のアドレスは0008〜0017です。
ここで下位アドレス0はおかしいです。
もしもこの行のデータでベリファイエラーが起きたならばそのときの下位アドレスは08〜17のいずれかでなければなりません。
まずはここがおかしいのです。
エラーになった下位アドレスが00ということからすると、それよりも前の位置だと推測できます。
その1行前の表示は(改行はされていませんが)
i=14,b=4,[00]0000[01]*
です。
この部分ではどういうデータを書き込んだのか、それを確認してみました。
下はPIC18F2550に上書きしてしまったデータのHEXファイルの先頭部分です。
:020000040000FA :0400000028EF01F0F4 :04000800A4EF02F06F :1000200058EF01F02EEF00F049EF00F07EEF00F006 |
上から2行目の
:0400000028EF01F0F4
が該当する部分です。
04はデータバイト数(b=4)です。
その後ろの0000はデータの先頭アドレスでその後ろの00はこの行の型コードです。
/PICWR、/VERIFYでは表示順序は逆になっています。
その後ろの28EF01F0が書き込みを行なった4バイトのデータです。
最後のF4はチェックサムです。
ここにもとのデータの28があります。
そのアドレスは0000です。
ベリファイエラーで表示された28−08はここに間違いありません。
なぜかそれがその次の行のところで表示されています。
そのこと自体はWindows側の送信データとUSB経由で送られてくるベリファイ情報とに時間差があるかもしれないということで納得できそうです。
しかし納得できないのは、このアドレス0000のところの表示が
i=14,b=4,[00]0000[01]*
であることです。
i=14,b=4,[00]0000
までがWindows側のデータ表示です。
それに対してUSB経由での返信が
[01]
なのです!
ここで有り得ないことが起きています。
ここでベリファイエラーが起きていることはほぼ間違いありません。
その情報が遅延してその次のデータ(アドレス0008のデータ)の送出後に届いたとしたら、この[01]の返信は何なのかということです。
PICからUSB経由で送られてくる[01]は、「正常完了」を示すコードです。
もしもベリファイでエラーが発生したら[01]の代わりに[0F]が送られてきます。
PICのプログラムでは異常終了のときに[01]を送信することはありません。
すると。
可能性としてはWindows側のプログラム(Cppコンパイラプログラム)が誤ってすでに受信済みのそれ以前の着信データを二重に表示してしまったことぐらいしか考えられません。
そんなことがあるのでしょうか?
さらに追求して確かめてみようとしたのですが、このエラーのあとでよく考えもしないで/ERASEを実行したあと/PICWRを実行してしまったのでPIC18F2550にもとからあったプログラムは消去されてしまい再現テストができなくなってしまいました。
PIC18F2550にもとは何が書かれていたのかは全く不明で今となっては再現テストをすることはほぼ不可能です。
次回に続きます。
PICBASICコンパイラ[第167回]
2024.11.30 upload
前へ
次へ
ホームページトップへ戻る