2025.2.21
前へ

ホームページトップへ戻る


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

前へ

ホームページトップへ戻る