PICBASICコンパイラ
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
まるでインタプリタ。でもコンパイラです。超カンタン超シンプルです。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
[第222回]
●PIC16F84(7)CP解除?
前回までPIC16F627用のPIC WRITERプログラムについて書いてきました。
問題はBULK ERASEだったのですがそれはWRITERプログラムのバグが原因だったことがわかり解決できました。
ところで過去記事にありますようにプログラムの作成を進める過程でPIC16F627とPIC16F84は同じ書き込みプログラムでいけることがわかってきました。
問題のBULK ERASEについても同じプログラムでいけそうです。
ということで今回はPIC16F84の書き込みと消去のテストをしてみます。
PIC16F84の書き込みとテスト、消去については[第205回]〜に書いていますがそのときは前回のPIC16F627用のプログラムに行き着く前のプログラムでしたしそこではPIC16F84用として作成したプログラムでした。
今回はPIC16F84に対してもPIC16F627用のプログラムがそのまま使えることの確認です。
ですから今回は前回PIC16F627に使ったのと同じWRITERプログラムをPIC16F84に対して使います。
下はそのテストを行なった記録です。
まずはPIC16F84に対して/PICRDFを実行して消去済みを確認しました。
logfile piciolog\0221062128.txt open *** pic i/o *** picio-30 connected >/picrd startcode=01 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] 07C0[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] 400C[10][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F] [01] > |
全部3FFFです。
消去済みであることが確認できました。
冗長になるので途中は省略してあります。
このPIC16F84はPICKITUでは不明なデバイスになってしまったものです([第210回])。
でも前回までで作成したPIC16F627用WRITERプログラムではこの通り普通に読み出せています。
消去済みを確認しましたからここにテストプログラムを書きます。
/HLOADでテストプログラム16F84TEST.HEXをロードして/PICWRを実行しました。
>/hload 16f84test.hex loading 16f84test.hex ... i=167,binbfend=68 >/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][83][16][85][01][86][01][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF] [01] i=42,b=16,[00]0010 [05][00][10][00][10][83][12][21][08][85][00][10][20][A2][0B][0B][28][A1][03][09][28] [01] i=58,b=12,[00]0020 [05][00][0C][00][20][3E][30][A0][00][86][06][A0][0B][12][28][08][00][FF][FF][FF][FF] [01] i=64,b=2,[00]400e [05][00][02][40][0E][FB][3F][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF] [03] picwrend > |
念のため/VERIFYを実行しました。
>/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)(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)(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][83][16][85][01][86][01][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF] (06)(83)(16)(85)(01)(86)(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][83][12][21][08][85][00][10][20][A2][0B][0B][28][A1][03][09][28] (10)(83)(12)(21)(08)(85)(00)(10)(20)(A2)(0B)(0B)(28)(A1)(03)(09)(28) [o][o][o][o][o][o][o][o][o][o][o][o][o][o][o][o] i=58,b=12,[00]0020 [06][00][0C][00][20][3E][30][A0][00][86][06][A0][0B][12][28][08][00][FF][FF][FF][FF] (0C)(3E)(30)(A0)(00)(86)(06)(A0)(0B)(12)(28)(08)(00)(A1)(03)(09)(28) [o][o][o][o][o][o][o][o][o][o][o][o] i=64,b=2,[00]400e [06][00][02][40][0E][FB][3F][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF] (10)(FB)(3F)(FF)(3F)(FF)(3F)(FF)(3F)(FF)(3F)(FF)(3F)(FF)(3F)(FF)(3F) [o][o] vfend error=0 > |
正しく書き込みできたようです。
さらに念のために/PICRDFで読み込んでちゃんと書けていることを確認し、同時に16F84TEST250221.HEXファイルを作成しました。
>/picrdf 16f84test250221.hex startcode=01 type=04,uadrs=00 [08] 0000[10][05][28][FF][3F][FF][3F][FF][3F][FF][3F][83][16][85][01][86][01] 0010[10][83][12][21][08][85][00][10][20][A2][0B][0B][28][A1][03][09][28] 0020[10][3E][30][A0][00][86][06][A0][0B][12][28][08][00][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] 07C0[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] 400C[10][FB][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F] [01] > |
ここまではOKです。
次はBULK ERASEのテストです。
/ERASEを実行しました。
そのあと/PICRDFで読み込んで消去されていることを確認し、同時に16F84ER250221.HEXファイルを作成しました。
>/erase endcode=01 >/picrdf 16f84er250221.hex startcode=01 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] 07C0[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] 400C[10][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F] [01] > |
全部消去できたようです。
ここまでは今までの「但し書き付き」のプログラムでもできていました。
問題はコピープロテクトをかけたPIC16F84を消去できるかどうかです。
それをテストするためにコピープロテクトをかけたPICプログラム16F84TEST2.ASMを用意しました。
下はソースプログラムです。
;;;pic p16f84 test ;from 16f627test ;25/1/28 25/2/21 ; #include <p16f84.inc> __CONFIG _CP_ON & _WDT_OFF & _RC_OSC ; ;R=5.1K,C=100pF FOSC=about1MHz ; w=0 f=1 c=0 z=2 ; cntr0=20 testcntr=21 testcntr2=22 ; org 0 goto start ; org 5 start bsf STATUS,5 ;bank 1 clrf TRISA clrf TRISB bcf STATUS,5 ;bank0 ; testloop movf testcntr,w movwf PORTA testloop2 call t1ms decfsz testcntr2 goto testloop2 decf testcntr goto testloop ; ;1msec timer t1ms movlw 3e;=62 movwf cntr0 t1ms2;16micros xorwf PORTB;1 decfsz cntr0;1 goto t1ms2;2 return ; end ; |
__CONFIGのところに_CP_ONを追加しました。
HEXファイル16F84TEST2.HEXをロードして/PICWRを実行しました。
>/hload 16f84test2.hex loading 16f84test2.hex ... i=167,binbfend=68 >/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][83][16][85][01][86][01][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF] [01] i=42,b=16,[00]0010 [05][00][10][00][10][83][12][21][08][85][00][10][20][A2][0B][0B][28][A1][03][09][28] [01] i=58,b=12,[00]0020 [05][00][0C][00][20][3E][30][A0][00][86][06][A0][0B][12][28][08][00][FF][FF][FF][FF] [01] i=64,b=2,[00]400e [05][00][02][40][0E][0B][00][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF] [03] picwrend > |
コピープロテクトをかけたので書き込みを行なった後は読み出してベリファイをすることはできません(全部エラーになってしまいます)。
念のために/PICRDFを実行して読み出し確認をしてみました。
>/picrdf startcode=01 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] 07C0[10][00][00][00][00][00][00][00][00][00][00][00][00][00][00][00][00] 07D0[10][00][00][00][00][00][00][00][00][00][00][00][00][00][00][00][00] 07E0[10][00][00][00][00][00][00][00][00][00][00][00][00][00][00][00][00] 07F0[10][00][00][00][00][00][00][00][00][00][00][00][00][00][00][00][00] [01] type=04,uadrs=01 [08] 400C[10][F9][03][00][00][00][00][00][00][00][00][00][00][00][00][00][00] [01] > |
コピープロテクトがかかっているので中身は読み出せません。
読み出したデータはすべて00です。
CONFIGは読み出せています。
いよいよBULK ERASEです。
/ERASEを実行しました。
そのあと/PICRDFで読み出してみたのですが…。
>/erase endcode=01 >/picrdf 16f64test2er250221.hex startcode=01 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] 07C0[10][00][00][00][00][00][00][00][00][00][00][00][00][00][00][00][00] 07D0[10][00][00][00][00][00][00][00][00][00][00][00][00][00][00][00][00] 07E0[10][00][00][00][00][00][00][00][00][00][00][00][00][00][00][00][00] 07F0[10][00][00][00][00][00][00][00][00][00][00][00][00][00][00][00][00] [01] type=04,uadrs=01 [08] 400C[10][00][00][00][00][00][00][00][00][00][00][00][00][00][00][00][00] [01] >/exit リモート接続を終了しました logfile closed at Fri Feb 21 06:50:01 2025 |
あれえ。
消去できてない…?
となるとこのPIC16F84は使い物になりません。
てっきりBULK ERASEができると思ったのですけれど。
うむむむ。
このまま終るのはいかにも残念です。
こうなったらどうせ駄目元です。
ここに強引にプログラムを書いてみることにしました。
最初のところと同じように16F84TEST.HEXをロードして/PICWRを実行しました。
logfile piciolog\0221073102.txt open *** pic i/o *** picio-30 connected >/hload 16f84test.hex loading 16f84test.hex ... i=167,binbfend=68 >/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][83][16][85][01][86][01][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF] [01] i=42,b=16,[00]0010 [05][00][10][00][10][83][12][21][08][85][00][10][20][A2][0B][0B][28][A1][03][09][28] [01] i=58,b=12,[00]0020 [05][00][0C][00][20][3E][30][A0][00][86][06][A0][0B][12][28][08][00][FF][FF][FF][FF] [01] i=64,b=2,[00]400e [05][00][02][40][0E][FB][3F][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF] [03] picwrend |
駄目かもと思いながら/VERIFYを実行してみましたら。
>/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)(00)(00)(00)(00)(00)(00)(00)(00)(00)(00)(00)(00)(00)(00)(00)(00) 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)(00)(00)(00)(00)(00)(00)(00)(00)(00)(00)(00)(00)(00)(00) [o][o] i=22,b=6,[00]000a [06][00][06][00][0A][83][16][85][01][86][01][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF] (06)(83)(16)(85)(01)(86)(01)(00)(00)(00)(00)(00)(00)(00)(00)(00)(00) [o][o][o][o][o][o] i=42,b=16,[00]0010 [06][00][10][00][10][83][12][21][08][85][00][10][20][A2][0B][0B][28][A1][03][09][28] (10)(83)(12)(21)(08)(85)(00)(10)(20)(A2)(0B)(0B)(28)(A1)(03)(09)(28) [o][o][o][o][o][o][o][o][o][o][o][o][o][o][o][o] i=58,b=12,[00]0020 [06][00][0C][00][20][3E][30][A0][00][86][06][A0][0B][12][28][08][00][FF][FF][FF][FF] (0C)(3E)(30)(A0)(00)(86)(06)(A0)(0B)(12)(28)(08)(00)(A1)(03)(09)(28) [o][o][o][o][o][o][o][o][o][o][o][o] i=64,b=2,[00]400e [06][00][02][40][0E][FB][3F][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF] (10)(FB)(3F)(FF)(3F)(FF)(3F)(FF)(3F)(FF)(3F)(FF)(3F)(FF)(3F)(FF)(3F) [o][o] vfend error=0 |
あれ?
書き込みできた???
/PICRDFで読み出してみました。
>/picrdf 16f84test250221_2.hex startcode=01 type=04,uadrs=00 [08] 0000[10][05][28][FF][3F][FF][3F][FF][3F][FF][3F][83][16][85][01][86][01] 0010[10][83][12][21][08][85][00][10][20][A2][0B][0B][28][A1][03][09][28] 0020[10][3E][30][A0][00][86][06][A0][0B][12][28][08][00][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] 07C0[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] 400C[10][FB][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F] [01] >/exit リモート接続を終了しました logfile closed at Fri Feb 21 07:39:19 2025 |
なんと。
正しく書き込みできただけではなくて、プログラムを書き込まなかった残りのエリアは全て3FFFになっています。
おおおお。
ひょっとすると。
このPIC16F84だけのことかもしれませんが。
/ERASEコマンドで全消去は正しく行なわれたのだけれどそれ以前に設定してあったCPフラグのようなものが残っていて読み出しをかけるとFFではなくて00が出てくる状態になっていたのかも。
そこにCPをかけないプログラムを書き込んだことでそのフラグが外れて読み出せるようになった、ということではないかと思います。
そうであるかないかを追求しようにもPIC16F84はこれ1個しかないのでこれ以上は追求できません。
手元にはPIC16F84Aならたくさんあります。
次はPIC16F84Aで試してみることにしましょう。
PICBASICコンパイラ[第222回]
2025.2.21 upload
前へ
ホームページトップへ戻る