PICBASICコンパイラ
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
まるでインタプリタ。でもコンパイラです。超カンタン超シンプルです。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
[第235回]
●PIC16F628A(3)/PICWRも/ERASEもOKになりました!
現行のPIC WRITERプログラムではPIC16F628Aは/ERASEと/PICWRはエラーになってしまいます。
そこでまずは/ERASEについて検討しました。
考えるべき点は2つです。
一つ目はVddとVppの起動順序です。
それについては[第189回]に書きました。
当初はそれを受けてそれまでのPIC16F84用WRITERプログラムをもとにPIC16F627専用のWRITERプログラムを作ってテストをしてきました。
その後にPIC16F84Aがまともに書けないという問題にぶつかってしまいその対策として最初にVddをONにしてから数百msウェイトした後にVppをONにするようにしたところ/PICWRも/PICRDもまともにできるようになりました。
その時点でPIC16F84用とPIC16F627用とPIC16F84A用のWRITERプログラムができてしまいました。
各プログラムを比較したところ最初の電圧を投入するところ以外は同じプログラムでいけそうということがわかってきました。
そこでPIC16F84A用に作ったWRITERプログラムでPIC16F84とPIC16F627を再度テストしたところどちらも正しく書き込み読み出し消去できました。
最終的にPIC16F84A用WRITERプログラムが共通して使えることになったのですが。
ということからするとPIC16F627も電圧の投入順序にはこだわらなくてもよいということになります。
なんだかなあという感じではありましたが、それでいけるなら回路もプログラムもそれだけシンプルになるので助かります。
ところがそのWRITERプログラムはPIC16F628Aでは通用しませんでした。
PIC16F84/84AはVppが12V〜14VでPIC16F627はVdd+3.5V〜13.5VなのですがVpp=9Vでも正しく機能しました。
しかしPIC16F628AのVppは10V〜13.5Vとなっていて事実Vpp=9Vでは正しくREADできませんでした。
[2025.3.16注記]上記には記憶違いがありました。ノートを確認したところ16F84も16F84Aも16F627もVpp=9Vでは駄目な場合があると書いていました。いずれもVpp=13.5Vが必要でした。
Vpp=13.5Vにしたところ/PICRDは正しく実行できましたが/PICWRと/ERASEは上に書きましたようにエラーになってしまいました。
そういうことからここはまずはルール通りということでVddとVppの起動順序についてはDataSheetの通り、最初にVppをONにしてから次にVddをONにするようにプログラムを改めました。
もうひとつDataSheetをよくよく確認したところバルクイレーズについてはPIC16F628AはPIC16F627/628とはコマンドが異なっていました。
どうして同じコマンドにしないのでしょうかねえ。
文句を言っても仕方がありませんからそこもプログラムを変更しました。
そのように直して作成したPIC16F628A用WRITERプログラムを使ってPIC16F628Aに/ERASEを実行し、続いて確認のために/PICRDを実行しました。
logfile piciolog\0311104215.txt open *** pic i/o *** picio-30 connected >/erase 400C[FF][3F][FF][3F] >/picrd 400C[FF][3F][FF][3F] type=04,uadrs=00 [08] 0000[10][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F] 0010[10][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F] 0020[10][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F] 0030[10][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F] 0040[10][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F] 0050[10][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F] 07D0[10][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F] 07E0[10][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F] 07F0[10][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F] [01] type=04,uadrs=01 [08] 400E[FF][3F] [10] > |
おお。
/ERASEはうまくいったようです。
それならひょっとして/PICWRもうまくいくかと期待したのですが…。
テストプログラム16F628ATEST.HEXをロードして/PICWRを実行しました。
>/hload 16f628atest.hex loading 16f628atest.hex ... i=175,binbfend=72 >/picwr 400C[FF][3F][FF][3F] 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][07][30][9F][00][83][16][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF] [01] i=42,b=16,[00]0010 [05][00][10][00][10][85][01][86][01][83][12][21][08][85][00][12][20][A2][0B][0D][28] [01] i=62,b=16,[00]0020 [05][00][10][00][20][A1][03][0B][28][FA][30][A0][00][86][06][A0][0B][14][28][08][00] [01] i=68,b=2,[00]400e [05][00][02][40][0E][F9][3F][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF] [03] picwrend > |
続いてベリファイを実行しました。
>/verify inbfend=0 400C[FF][3F][FF][3F] 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)(FF)(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)(00)(00)(FF)(3F)(FF)(3F)(FF)(3F)(FF)(3F)(FF)(3F)(FF)(3F)(FF)(3F) [x][x]error! i=22,b=6,[00]000a [06][00][06][00][0A][07][30][9F][00][83][16][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF] (06)(00)(00)(00)(00)(00)(00)(FF)(3F)(FF)(3F)(FF)(3F)(FF)(3F)(FF)(3F) [x][x][x][o][x][x]error! i=42,b=16,[00]0010 [06][00][10][00][10][85][01][86][01][83][12][21][08][85][00][12][20][A2][0B][0D][28] (10)(00)(00)(00)(00)(00)(00)(00)(00)(00)(00)(00)(00)(00)(00)(00)(00) [x][x][x][x][x][x][x][x][x][o][x][x][x][x][x][x]error! i=62,b=16,[00]0020 [06][00][10][00][20][A1][03][0B][28][FA][30][A0][00][86][06][A0][0B][14][28][08][00] (10)(00)(00)(00)(00)(00)(00)(00)(00)(00)(00)(00)(00)(00)(00)(00)(00) [x][x][x][x][x][x][x][o][x][x][x][x][x][x][x][o]error! i=68,b=2,[00]400e [06][00][02][40][0E][F9][3F][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF] (10)(BD)(1E)(50)(28)(FF)(3F)(FF)(3F)(FF)(3F)(FF)(3F)(FF)(3F)(FF)(3F) [x][x]error! vfend error=38 > |
エラーになってしまいました。
/PICRDコマンドを実行しました。
>/picrd 400C[FF][3F][FF][3F] type=04,uadrs=00 [08] 0000[10][00][00][00][00][00][00][00][00][00][00][00][00][00][00][00][00] 0010[10][00][00][00][00][00][00][00][00][00][00][00][00][00][00][00][00] 0020[10][00][00][00][00][00][00][00][00][00][00][00][00][00][00][00][00] 0030[10][00][00][00][00][00][00][00][00][00][00][00][00][00][00][00][00] 0040[10][00][00][00][00][00][00][00][00][00][00][00][00][00][00][00][00] 0050[10][00][00][00][00][00][00][00][00][00][00][00][00][00][00][00][00] |
やっぱり/PICWRは駄目でした。
あらためてPIC16F628AのDataSheetを確認してみたところ書き込みプログラムも変更が必要ということがわかりました。
PIC16F628とPIC16F628Aで書き込みプログラムが違っているなんて。
ほんとため息が出てしまいます。
再テストのための準備として/ERASEを実行し全部消去しました。
そのあと/PICRDを実行して消去できていることを確認しました。
>/erase 400C[FF][3F][FF][3F] >/picrd 400C[FF][3F][FF][3F] type=04,uadrs=00 [08] 0000[10][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F] 0010[10][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F] 0020[10][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F] 0030[10][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F] 0040[10][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F] 0050[10][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F] 07D0[10][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F] 07E0[10][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F] 07F0[10][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F] [01] type=04,uadrs=01 [08] 400E[FF][3F] [10] >/exit リモート接続を終了しました logfile closed at Tue Mar 11 10:52:22 2025 |
全部消去されていることを確認しました。
そこまで準備したあとWRITEプログラムを直して再テストをしました。
/HLOADコヒマンドで18F628ATEST.HEXをロードしたあと/PICWRを実行しました。
logfile piciolog\0311113305.txt open *** pic i/o *** picio-30 connected >/hload 16f628atest.hex loading 16f628atest.hex ... i=175,binbfend=72 >/picwr 400C[FF][3F][FF][3F] 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][07][30][9F][00][83][16][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF] [01] i=42,b=16,[00]0010 [05][00][10][00][10][85][01][86][01][83][12][21][08][85][00][12][20][A2][0B][0D][28] [01] i=62,b=16,[00]0020 [05][00][10][00][20][A1][03][0B][28][FA][30][A0][00][86][06][A0][0B][14][28][08][00] [01] i=68,b=2,[00]400e [05][00][02][40][0E][F9][3F][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF] [03] picwrend > |
/VERIFYを実行しました。
>/verify inbfend=0 400C[FF][3F][FF][3F] 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)(FF)(3F)(FF)(3F)(46)(D3)(A3)(24)(9B)(E5)(30)(08)(50)(80)(B8)(05) 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)(46)(D3)(A3)(24)(9B)(E5)(30)(08)(50)(80)(B8)(05) [o][o] i=22,b=6,[00]000a [06][00][06][00][0A][07][30][9F][00][83][16][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF] (06)(07)(30)(9F)(00)(83)(16)(A3)(24)(9B)(E5)(30)(08)(50)(80)(B8)(05) [o][o][o][o][o][o] i=42,b=16,[00]0010 [06][00][10][00][10][85][01][86][01][83][12][21][08][85][00][12][20][A2][0B][0D][28] (10)(85)(01)(86)(01)(83)(12)(21)(08)(85)(00)(12)(20)(A2)(0B)(0D)(28) [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][A1][03][0B][28][FA][30][A0][00][86][06][A0][0B][14][28][08][00] (10)(A1)(03)(0B)(28)(FA)(30)(A0)(00)(86)(06)(A0)(0B)(14)(28)(08)(00) [o][o][o][o][o][o][o][o][o][o][o][o][o][o][o][o] i=68,b=2,[00]400e [06][00][02][40][0E][F9][3F][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF] (10)(F9)(3F)(FF)(3F)(FF)(3F)(FF)(3F)(FF)(3F)(FF)(3F)(FF)(3F)(FF)(3F) [o][o] vfend error=0 > |
今度はERROR=0になりました。
/PICWRもうまくいきました。
念のために/PICRDを実行して確認しました。
>/picrdf 16f628atest250311.hex 400C[FF][3F][FF][3F] type=04,uadrs=00 [08] 0000[10][05][28][FF][3F][FF][3F][FF][3F][FF][3F][07][30][9F][00][83][16] 0010[10][85][01][86][01][83][12][21][08][85][00][12][20][A2][0B][0D][28] 0020[10][A1][03][0B][28][FA][30][A0][00][86][06][A0][0B][14][28][08][00] 0030[10][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F] 0040[10][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F] 0050[10][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F] 07D0[10][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F] 07E0[10][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F] 07F0[10][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F] [01] type=04,uadrs=01 [08] 400E[F9][3F] [10] >/exit リモート接続を終了しました logfile closed at Tue Mar 11 11:42:06 2025 |
やっと。
PIC16F628A用のWRITERプログラムができました。
ところで。
結局のところ/ERASEも/PICWRもプログラムが正しく対応できていなかったことがエラーの原因でした。
ひょっとするとVddとVppの起動順序はエラーとは無関係だったかも。
そこで。
とりあえずうまくいったPIC16F628A用のWRITERプログラムのうちVddとVppの起動順序のところだけをPIC16F84A用WRITERプログラムと同じにしたプログラムを作成しました。
テスト結果は冗長になりますから省略しますがそのようにしたWRITERプログラムでもPIC16F628Aは正しく書き込み読み出し消去できました。
PIC16F628Aにテストプログラムを書き込んだあと実際に動作テストをしてみました。
PIC16F84、PIC16F627と同じように正しく動作しました。
あとはコピープロテクトについてですが。
本日も時間がありません。
それは次回に書くことにいたします。
PICBASICコンパイラ[第235回]
2025.3.15 upload
前へ
次へ
ホームページトップへ戻る