2025.5.10
前へ
次へ
ホームページトップへ戻る


超ローコストPICWRITERの製作

〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
「PICBASICコンパイラ」からスピンオフ!!
過去記事を参照することなどを考えて該当する過去記事は「PICBASICコンパイラ」のまま連載回もそのままとします。
以後は前回記事からの流れで[第236回]からとします。
「PICBASICコンパイラ」はなるべく早く連載を再開したいと考えています。
PICはローコスト、高機能で種類も豊富なお手軽マイコンですがプログラムを書き込むためのWRITERが必要です。
それをできるだけ安価に作ってしまおうというプロジェクトです。
最終的には製品化を考えています(組立キット、完成品)。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜

[第281回]



●PIC16F1938(9)PICWRITERのテスト

今回はやっとPICWRITERのテストです。
簡単に済ませてしまうつもりだったのですけれど。
なかなか思った通りにはいかないものです。
ま。
ものは考えようです。
それだけ皆様にお伝えしたいことがあった(と同時に備忘録として残しておきたいことがあった)とも言えます。
それはそうなのですけれどこんな調子でやっていますとじきに寿命が尽きてしまいまする。
中身を濃くしつつ加速していきたいと思います(うーむ。むつかしいいい)。

今回はPIC16F1938の締めくくりとして/PICRD、/PICWR、/ERASEのテストを行ないます。
PIC16F1938はPIC16F1503などと同じWRITEプログラムでいけそうということがわかりました。
TYPE=3になります。
下はPIC16F1938のテストを行なったときのログです。
最初に/PICIDCKでDEVICE IDを読み出しました。
logfile piciolog\0508183142.txt open
*** pic i/o ***
picio-30 connected
>/picidck
400C[A3][23]
>

DEVICE IDとして23A3が読み出されました。
PIC16F1938のDEVICE IDは23AX/BXです。


[出典]Microchip Technology Inc. PIC16F193X Memory Programming Specification

/PICTYPEコマンドを実行しました。
PIC16F1938はTYPE=3です。
>/pictype=3
pictype=33
[03][15][00][69]
>

実はこれよりも前に何回か書き込みを行っていますのでそれをクリアするために/ERASEを実行しました。
>/erase
400E[03][15][00][69]
>

今までですと/ERASEのあとは完全に消去されているかどうかを確認するために/PICRDを実行するのですがそれもすでに確認済みですので今回は省略します。
/HLOADを実行してテスト用のHEXファイルをロードしたあと/PICWRを実行し続いて/VERIFYを実行しました。
>/hload pic16f1938test3.hex
loading pic16f1938test3.hex ...
i=242,binbfend=98
>/picwr
400E[03][15][00][69]
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)(03)(15)(00)(69)(FF)(DC)(00)(04)(E2)(03)(08)(A0)(47)(1A)(00)(33)
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]
(10)(01)(00)(02)(00)(00)(00)(00)(00)(02)(03)(08)(A0)(47)(1A)(00)(33)
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]
(10)(01)(00)(06)(00)(0A)(00)(00)(00)(10)(03)(08)(A0)(47)(1A)(00)(33)


i=88,b=2,[00]000e
[05][00][02][00][0E][E2][E9][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF]
(10)(03)(00)(02)(00)(0E)(01)(01)(00)(3A)(03)(08)(A0)(47)(1A)(00)(33)
picwrend

>/verify
inbfend=0
400E[03][00][02][00]
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)(03)(00)(02)(00)(0E)(01)(01)(00)(3A)(03)(08)(A0)(47)(1A)(00)(33)
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)(02)(00)(0E)(01)(01)(00)(3A)(03)(08)(A0)(47)(1A)(00)(33)
[o][o]

i=88,b=2,[00]000e
[06][00][02][00][0E][E2][E9][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF]
(10)(E2)(29)(FF)(3F)(8B)(2D)(88)(1A)(FD)(3F)(FF)(3F)(FF)(3F)(FF)(3F)
[o][x]error!
vfend
error=1
>

ベリファイの結果はerror=1になってしまいました。
そういうことになるとここは確認が必要になります。
errorは最後のところで出ています。
Verifyではもとのデータは[]で表示した行です。
その行の前から4番目と5番目が書き込みを行なうアドレスです。
[00][0E]はCONFIG1です。
実はCONFIGデータの先頭で上位アドレスに”01”を指定しています。
HEXファイルは8ビットなのですがPICのメモリは16ビット(実際は14ビット)です。
そのアドレスを8ビットで示すと2バイトでは不足で3バイト必要になります。
上で指定した8ビットでの”01000E”は16ビットメモリのアドレス表記では”8007”になります。
うーん。
わからんなあ、とお思いかもしれません。
説明の都合上そのように書きましたがこんなことはわからなくても全然構いません。
PICWRITERなんてものを作ろうとすると理解が必要になります。
ここは軽くスルーしてください。


[出典]Microchip Technology Inc. PIC16F193X Memory Programming Specification

そこで先ほどの説明に戻ります。
i=88,b=2,[00]000e
[06][00][02][00][0E][E2][E9][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF]
(10)(E2)(29)(FF)(3F)(8B)(2D)(88)(1A)(FD)(3F)(FF)(3F)(FF)(3F)(FF)(3F)
[o][x]error!
vfend
error=1
>

6番目からが書き込むべきデータです。
PIC16F1938はCONFIG1とCONFIG2の4バイトですがこの時点ではCONFIG2はデフォルトのままというつもりでしたからソースプログラムでは何も指定せずに済ますつもりでした。
その場合CONFIG2の値はFFFFになります(この点について後ほど補足説明をします)。
そして作成中のPICWRITERのWindows側のプログラムは読み込んだHEXファイルの1行(16バイト以下)のデータを確認して行末までFFが連続していたらそこでその行のデータをPICWRITER回路に送出するのを終了します。
ちょっとわかりにくい説明ですがそういうわけでもとのCONFIGデータはCONFIG1の[E2][E9]だけでCONFIG2は省略されます。
Verifyもそれを踏襲するのでCONFIG1の2バイトのみをチェックします。
Verifyで読み込んだデータは()の行です。
このときは指定されたアドレスから16バイトのデータを読み込みます。
先頭の(10)は読み込んだバイト数(10H=16)でその次からが読み込んだデータです。
書き込み時に送出したデータ[E2][E9]に対して読み込んだデータは(E2)(29)でした。
CONFIG1の上位バイトがエラーになりその下の行に[o][x]と表示されました。
CONFIG1は前回お見せしましたが下に再掲します。


[出典]Microchip Technology Inc. PIC16F193X Memory Programming Specification

前回はbit4−0のところを省略していました。
下は続きの部分です。


[出典]Microchip Technology Inc. PIC16F193X Memory Programming Specification

下はテストプログラムPIC16F1938TEST3.ASMのソースプログラムリストの先頭のCONFIG部分です。
;pic16f1938test from pic16f883test
;25/04/28 5/3
;
; internal 4MHz
        #include <p16f1938.inc>
        __CONFIG _CONFIG1,_WDTE_OFF & _MCLRE_ON & _IESO_OFF & _BOREN_OFF & _FOSC_HS
        __CONFIG _CONFIG2,_WRT_OFF
;

CONFIG2は_WRT_OFFのみ設定しています。
実は_WRT_OFFはWRITE PROTECT OFFでデフォルトではOFFになっていてそのビット(2ビット)はデフォルトでは’11’です。
ここで_WRT_OFFを記述したことについては[第277回]に書いています。
そこでは思い違いでそのようにしたと書いていますがそうではありませんでした。
ここは必要があってそのようにしたのでした。
もうなにもかも見事にすっかり忘れてしまいます。
この時点ではCONFIG2は何も指定しなくてもよいと思ったのでそれならCONFIG2には何も記述しなくてもよいはずのところなのですが。
そのようにするとMPLABのアセンブラはHEXコードとして”0000”を吐き出してしまいます。
このことについては[第266回]に書きました。
そうならないようにするためにここはわざわざ_WRT_OFFを記述したのでした。
それで。
問題はCONFIG1です。
CONFIG1もデフォルトの値はFFFFでそこに_IESO_OFF(ビット12=’0’)、_BOREN_OFF(ビット10−9=’00’)、_WDT_OFF(ビット4−3=’00’)、_FOSC_HS(ビット2−0=’010’)を記述します。
_MCLRE(ビット6)は’1’です(これは書く必要がなかったですね)。
するとビット12、ビット10、9、ビット4、3、ビット2、0が’0’なのでCONFIG1のHEXデータは’1110 1001 1110 0010’(”E9E2”)になります。
PIC16F1938のプログラムメモリは14ビットなので上位2ビットは実装されていません。
PICのCONFIGデータを読み出すと実装されていないビットは’0’になるので読み出したCONFIG1のデータは”E9E2”ではなくて”29E2”になります。
そのためベリファイでエラーになったのでした。
本来はエラーではなくてここは正しく書き込みできていました。
このあたりは今は作成中のプログラムなのでこのようになりますが正規版のプログラムではここはエラーにしないようにするつもりです。

最後に/PICRDFを実行しました。
>/picrdf 16f1938test3_250508.hex
400E[E2][29][FF][3F]
type=04,uadrs=00
[08]
0000[10][05][28][FF][3F][FF][3F][FF][3F][FF][3F][23][00][8C][01][8D][01]
0010[10][21][00][68][30][99][00][8D][01][8C][01][20][00][21][08][8C][00]
0020[10][17][20][A1][0F][0E][28][A2][0A][22][08][8D][00][0E][28][FA][30]
0030[10][A0][00][00][00][A0][0B][19][28][08][00][FF][3F][FF][3F][FF][3F]
0040[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[E2][29][FF][3F]
[10]
>/exit


PIC16F1938については今回で終わりです。

超ローコストPICWRITERの製作[第281回]
2025.5.10 upload

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