PICBASICコンパイラ
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
まるでインタプリタ。でもコンパイラです。超カンタン超シンプルです。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
[第192回]
●PIC16F1827(5)internal?external?
16FのWRITERプログラムは18Fに比べればシンプルで簡単なはず、と少し侮っていたのですが、どうしてどうしてなかなかにホネでありました。
ドキュメントを参考に少しずつ攻略していったのですがそもそもそのドキュメントがちょいと舌足らずな感じでしっかり苦労させられてしまいました。
なんとかERASEもREADもWRITEもできてきていよいよこれで完成かというところまできたのですが最後の最後にカベにぶつかってしまいました。
どうしてもCONFIGの値が書き込めません。
ユーザープログラムのエリアはちゃんと書けるのにCONFIGだけはどうやっても書けません。
書き込み時間が不足なのかと思ってしっかりウエイトをかけてみたのですがそれでも駄目。
いくらなんでもこれは余りにおかしい。
最後にまさかと思いつつ駄目元で試してみたところなんとすんなり書き込めてしまいました。
こちらがWRITEプログラムのフローチャートです。
[出典]Microchip Technology Inc.PIC16F1827 Flash Memory Programming Specification
ユーザープログラムエリアもCONFIGエリアも同じプログラムです。
なのにCONFIGのみ書けません。
こちらがコマンドの一覧です。
[出典]Microchip Technology Inc.PIC16F1827 Flash Memory Programming Specification
こちらがざっくりとした説明です。
[出典]Microchip Technology Inc.PIC16F1827 Flash Memory Programming Specification
こんな程度ですもんね。
これってやっつけなんじゃありませんか?
ええ。
しっかり苦労させられてしまいました。
結局のところCONFIGが書けない問題はコマンドとしてBegin Externally Timed Programming commandを使っていたところを
Begin Internally Timed Programming commandを使うように変更したところなんとあっけなくクリアできてしまったのでした。
しかし。
そもそもExternally commandとInternally commandってどこがどう違うの?
ってことにはMicrochip様は全然説明してくれてません。
まあ用語としてはクロックモードの違いかとも思うのですが、PIC WRITERにセットしたPICにクロック発振など関係あるの?
なんて考えれば考えるだけ沼にはまっていってしまいます。
ここは対症療法です。
原因とか理由はわからないけれど。
そのようにするとうまくできてしまいます。
ですのでそこは深入りしないようにさらっと通ってしまうことにしました。
そうそう。
PIC16FのWITERプログラムを書くにあたって悩んだことがもうひとつありました。
先に作成したPIC18F用とPIC16F用は中身が全然異なってしまいます。
その区別をどうするか。
やっぱり最終的には一本のプログラムにまとめてしまってWindows側のプログラムで18Fか16Fかを選択して実行するべきと思います。
しかししかし。
恐らくPIC18FもPIC16Fも作業が進むにしたがってその型式ごとにさらに細分化したプログラムにならざるをえないのではないかと思われます。
そうすると今の段階でそこを区別するようなプログラムにしたとしてもどうせ先には直さなければならなくなることは必定です。
ならば。
今のところはPIC18F用とは別にPIC16F用のWRITERプログラムを書いてそれをWindowsにUSB接続するほうのPIC18F用のPIC18F13K50とは別のPIC18F13K50に書いてしまって、Windows側のプログラム(CPPプログラム)もそれぞれに個々に対応するプログラムにしてしまったほうが楽ではないかと考えました。
うまく説明できませんが、とにかくそういう方針でPIC16F1827用のPIC WRITERプログラムを作成しました。
下はPIC WRITERプログラムをテスト実行したときのログです。
PIC18F13K50用のPIC WRITERプログラムに比べると表示データがかなり増えています。
あれこれ苦闘するなかで情報を得るためにUSB接続したPIC18F13K50との間でやり取りしたデータの殆ど全てを表示したためです。
ちょっとわずらわしいところもありますがここまでの表示があると後々助かることもありそうですからしばらくはこの方式でやってみます。
>/hload 16f1827teste.hex loading 16f1827teste.hex ... i=287,binbfend=118 >/erase endcode=01 >/picwr startcode=01 i=6,b=2,[04]0000 [05][04][02][00][00][00][00][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF] [01] i=12,b=2,[00]0000 [05][00][02][00][00][05][28][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF] [01] i=22,b=6,[00]000a [05][00][06][00][0A][23][00][8C][01][8D][01][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF] [01] i=42,b=16,[00]0010 [05][00][10][00][10][21][00][8C][01][8D][01][F3][30][99][00][22][00][22][08][8C][00] [01] i=62,b=16,[00]0020 [05][00][10][00][20][15][20][A3][0B][10][28][A2][03][0E][28][0A][30][A1][00][1B][20] [01] i=82,b=16,[00]0030 [05][00][10][00][30][A1][0B][17][28][08][00][64][30][A0][00][00][00][00][00][00][00] [01] i=96,b=10,[00]0040 [05][00][0A][00][40][FF][30][8D][06][A0][0B][1D][28][08][00][FF][FF][FF][FF][FF][FF] [01] i=102,b=2,[04]0000 [05][04][02][00][00][00][01][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF] [03] i=108,b=2,[00]000e [05][00][02][00][0E][E4][3F][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF] [03] i=114,b=2,[00]0010 [05][00][02][00][10][FF][3F][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF] [03] end |
16F1827teste.hexはテスト用に作成したHEXファイルです。
/HLOADコマンドで読み込みます。
まずは/ERASEコマンドで全消去します。
/PICWRコマンドでターゲットのPIC16F1827に書き込みを実行です。
この段階では書き込み中のデータが正しく書き込めたかどうかの確認はしていません。
その確認は次のベリファイコマンドで行います。
>/verify inbfend=0 startcode=01 i=6,b=2,[04]0000 [06][04][02][00][00][00][00][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF] (01)(E4)(3F)(FF)(3F)(FF)(3F)(FF)(3F)(FF)(3F)(FF)(3F)(FF)(3F)(FF)(3F) i=12,b=2,[00]0000 [06][00][02][00][00][05][28][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF] (02)(05)(28)(FF)(3F)(FF)(3F)(FF)(3F)(FF)(3F)(FF)(3F)(FF)(3F)(FF)(3F) [o][o] i=22,b=6,[00]000a [06][00][06][00][0A][23][00][8C][01][8D][01][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF] (06)(23)(00)(8C)(01)(8D)(01)(FF)(3F)(FF)(3F)(FF)(3F)(FF)(3F)(FF)(3F) [o][o][o][o][o][o] i=42,b=16,[00]0010 [06][00][10][00][10][21][00][8C][01][8D][01][F3][30][99][00][22][00][22][08][8C][00] (10)(21)(00)(8C)(01)(8D)(01)(F3)(30)(99)(00)(22)(00)(22)(08)(8C)(00) [o][o][o][o][o][o][o][o][o][o][o][o][o][o][o][o] i=62,b=16,[00]0020 [06][00][10][00][20][15][20][A3][0B][10][28][A2][03][0E][28][0A][30][A1][00][1B][20] (10)(15)(20)(A3)(0B)(10)(28)(A2)(03)(0E)(28)(0A)(30)(A1)(00)(1B)(20) [o][o][o][o][o][o][o][o][o][o][o][o][o][o][o][o] i=82,b=16,[00]0030 [06][00][10][00][30][A1][0B][17][28][08][00][64][30][A0][00][00][00][00][00][00][00] (10)(A1)(0B)(17)(28)(08)(00)(64)(30)(A0)(00)(00)(00)(00)(00)(00)(00) [o][o][o][o][o][o][o][o][o][o][o][o][o][o][o][o] i=96,b=10,[00]0040 [06][00][0A][00][40][FF][30][8D][06][A0][0B][1D][28][08][00][FF][FF][FF][FF][FF][FF] (0A)(FF)(30)(8D)(06)(A0)(0B)(1D)(28)(08)(00)(00)(00)(00)(00)(00)(00) [o][o][o][o][o][o][o][o][o][o] i=102,b=2,[04]0000 [06][04][02][00][00][00][01][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF] (03)(FF)(30)(8D)(06)(A0)(0B)(1D)(28)(08)(00)(00)(00)(00)(00)(00)(00) i=108,b=2,[00]000e [06][00][02][00][0E][E4][3F][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF] (10)(E4)(3F)(FF)(3F)(A0)(32)(6D)(16)(FF)(3F)(FF)(3F)(FF)(3F)(FF)(3F) [o][o] i=114,b=2,[00]0010 [06][00][02][00][10][FF][3F][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF] (10)(FF)(3F)(FF)(3F)(FF)(3F)(FF)(3F)(FF)(3F)(FF)(3F)(FF)(3F)(FF)(3F) [o][o] vfend error=0 |
PIC18F13K50用のWRITERプログラムと比べてここが一番大きく変わったところです。
[06][04]…はWindows側から送信した書き込みデータです。
(01)(E4)…はPIC WRITER側のPIC18F13K50から送られてきたデータです。
最初の送信データは上位Highアドレス設定用のデータ(行タイプ04)です。
このときの応答は(01)のみで残りはゴミデータです。
次からが行タイプ00の送信データとそれを書き込んだ後で読み出したデータです。
(02)は返信データが2バイトであることを示しています。
(05)(28)は書き込み後に読み出したデータです。
その後ろはゴミです。
上の行の送信データ[05][28]と一致していることがわかります。
その下の行の[o][o]は1バイトごとに比較して一致していることを示す表示です。
不一致のときはそこに[x]を表示します。
そのように全部比較してエラーがないときにerror=0と表示します。
念のためにもとになったHEXファイルと比較するためにもう一度書き込んだデータを読み出してHEXファイルを作成しました。
この作業は必須ではありません。
>/picrdf 16f1827te250104.hex startcode=01 type=04,uadrs=00 [01] 0000[10][05][28][FF][3F][FF][3F][FF][3F][FF][3F][23][00][8C][01][8D][01] 0010[10][21][00][8C][01][8D][01][F3][30][99][00][22][00][22][08][8C][00] 0020[10][15][20][A3][0B][10][28][A2][03][0E][28][0A][30][A1][00][1B][20] 0030[10][A1][0B][17][28][08][00][64][30][A0][00][00][00][00][00][00][00] 0040[10][FF][30][8D][06][A0][0B][1D][28][08][00][FF][3F][FF][3F][FF][3F] 0050[10][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F] 0060[10][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F] 0070[10][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F] 0080[10][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F] 0FD0[10][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F] 0FE0[10][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F] 0FF0[10][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F] [01] type=04,uadrs=01 [03] 1000[10][E4][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F] [01] >/exit リモート接続を終了しました logfile closed at Sat Jan 04 16:42:23 2025 |
/PICRD(/PICRDF)はターゲットのPICの全プログラム範囲を読み出すため空のエリアも全部表示されます。
PIC16F1827のプログラムエリアは14バイト長なので空のときはFFFFではなくて3FFFになります。
データの並び順は下位バイト、上位バイトの順です。
冗長なので途中の行はカットしてあります。
HEXファイルを比較しました。
読み出して作成したファイルは空の領域も全て記録しているのでその部分はもとのHEXファイルにはありません。
その間は不一致で赤表示です。
冗長ですからカットしてあります。
3行目の06000A…は赤表示ですが元のファイルはアドレス000Aからの6バイトであるのに対して読み出したデータはその上の行のアドレス000Aからに一致しています。
行末の1バイトはチェックサム値です。
左側020000040001は右側下から3行目に対応しています。
CONFIGエリアの上位アドレスの指定行です。
右側のチェックサム値が違っていますね。
後で確認してみることにします。
その次の行がCONFIG値です。
アドレス000Eからの2バイトです。
E43Fで一致しています(CONFIGも書き込めています!)。
最後のアドレス0010は多分Calibration wordエリア(2バイト)だと思います。
今のところプログラムとCONFIG以外のエリアはパスしています。
最終的には全部対応するつもりです。
PICBASICコンパイラ[第192回]
2025.1.5 upload
前へ
次へ
ホームページトップへ戻る