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


超ローコストPICWRITERの製作

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

[第262回]



●PIC12F629(4)PIC WRITERのテスト

今回はやっと主テーマPIC WRITERです。
いままでPIC WRITERを作成するというテーマを軸にしていくつかのPICをさわってきました。
PIC WRITERプログラムを作成する過程は試行錯誤の連続でした。
今から振り返ってみるとたまたまさわったPICが片寄っていたのかもしれません。
とにかくPIC毎に書き込みプログラムや消去プログラムが違っているといった感じでその度に悩まされてきました。
しかしそうやって行きつ戻りつを繰り返しているとだんだん焦点が合ってきたように思います。
今のところプログラムREADは同じプログラムでできます。
WRITEはPICによって一部に違いがあります。
BULK ERASE(全消去)はもっと異なっています。
が。
試行錯誤を重ねた後で整理してみると、これまでのところタイプ0〜タイプ3の4つのどれかに当てはまっていることがわかりました。
今回のPIC12F629はわずか8pinのPICでpin数から見ると他のPICとは大きく相違していますがWRITERプログラムから見るとタイプ3のようです。

ここでPICのpin数についても書いておきます。
今までさわってきたPICの多くは18pinですがPIC16F1503は14pinでした。
PIC WRITERとして必要な端子に注目してみるとPIC16F627などの18pin型を別にすると1pinを基準にして見ると8pin、14pin、20pinはともに同じ配置になっています。

[出典]Microchip Technology Inc. PIC16F627A 16F1503 12F629 18F1XK50 Memory Programming Specification

PICにユーザープログラムやCONFIGデータを書き込んだり読み出したりするために使う端子はVdd、VssのほかにVpp端子とPGC(プログラムクロック)およびPGD(プログラムデータ)端子の合わせて5本です。
ドキュメントによってPGCとPGDは別の名称になっているものもありますがいずれも同じ機能端子です。

私が最初にさわったPICは16F84(18pin)だったと記憶しています。
TTLと同じ形状なのに電源端子が中央にあることに違和感を覚えました。
おそらくこのあたりのPICは初期のものだったことと関係があるかもしれません。
WRITERプログラムがまちまちだったことからするとMicrochip自体が試行錯誤をしていたのかもしれません。
今回PIC12F629のWRITERプログラムがPIC16F1503と同じでいけるかもということに気が付いたのですが、Pin配列が同じであることとも関係しているのかもしれません。
もしそうだとするとWRITERプログラムもパターン化できるかもしれません。
そのように考えたので書き込みの型を指定できるようにWRITERプログラムに機能追加を行ないました。
これは最終的な機能ではなくてプログラム開発を容易にするための改良です。
最終的にどのような機能にまとめるかはまだ決めていません。

下はPIC12F629のWRITERプログラムコマンドです。

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

[第260回]のアセンブラ命令とは違います。
Vpp電圧のもとでPGCのクロックタイミングに合わせてPGD端子に対してシリアルリード、ライトするためのコマンドです。

こちらはPIC16F1503のWRITERプログラムコマンドです。

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

このコマンドとPIC12F629コマンドは同じ機能で同じコードになっています。
PIC WRITERプログラムは複雑なところがあって同じプログラムコマンドでもシーケンスなどが異なる場合があるので必ずしも同じWRITERプログラムでいけるとは言えないのですが、出来る可能性は高いと思います。
試してみる価値はあります。
あれ?
PIC16F1503にはLoad Data for Data Memory(03)、Read Data from Data Memory(05)がありませんね。
Data MemoryはREAD/WRITEできるEEPROMです。
こちらはPIC12F629のData Sheetです。

[出典]Microchip Technology Inc. PIC12F629 Data Sheet

EEPROMは128bytesとなっています。
そしてこちらはPIC16F1503のData Sheetです。

[出典]Microchip Technology Inc. PIC16F1503 Data Sheet

Data SRAMはありますがData EEPROMはありません。
そういうPICもあるのですねえ。
もっともPICのData EEPROMはちょいと上級者向きです。
私は使ったことがありません。
今のところEEPROMに対するREAD/WRITEはしないつもりでおります。

ということで。
下はPIC12F629のテストを行なったときのログです。
最初に/PICIDCKでDEVICE IDを読み出しました。
logfile piciolog\0414221132.txt open
*** pic i/o ***
picio-30 connected
>/picidck
400C[8B][0F]
>

DEVICE IDとして0F8Bが読み出されました。
PIC12F629のDEVICE IDは0F8X/9Xです。


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

あれ?
表のDevice名が違っています。
ミスプリントのようです。
一瞬私がミスをしたかと焦ってしまいました。
まだこのDEVICE IDはWRITERプログラムには組み込んでいません。
そこで試験的に組み込んだ/PICTYPEコマンドを使ってみました。
>/pictype=3
pictype=33
[8B][0F][F5][11]
>

これでPIC12F629が3型だと仮に認識されたはずです。
続いて/PICRDFを実行しました。
>/picrdf
400E[8B][0F][F5][11]
type=04,uadrs=00
[08]
0000[10][05][28][FF][3F][FF][3F][FF][3F][FF][3F][83][16][85][01][83][12]
0010[10][85][01][14][20][FF][30][85][00][14][20][08][28][FA][30][A0][00]
0020[10][00][00][A0][0B][10][28][08][00][FA][30][A1][00][0E][20][0E][20]
0030[10][A1][0B][16][28][08][00][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]


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][30][34]
[01]
type=04,uadrs=01
[08]
400E[F5][11][FF][3F]
[10]
>

続いて実行した/PICRDFでは先に秋月のPICプログラマで書き込んでみたテストプログラムが読み出されました。
/PICRDはOKのようです。

/ERASEを実行したあともう一度/PICRDFコマンドを入力しました。
>/erase
400E[F5][11][FF][3F]
>/picrdf
400E[F5][11][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]


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][31][FF][3F]
[10]
>

下から3行目のCONFIGが3FFFではありませんね。

PIC12F629のCONFIGです。

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

この文書によるとbit 11〜bit9は’0’になっています。
だから全消去後に読み出すと3FFFではなくて31FFになってしまうわけです。
納得。

/HLOADを実行してテスト用のHEXファイルをロードしたあと/PICWRを実行し続いて/VERIFYを実行しました。
>/hload pic12f629test.hex
loading pic12f629test.hex ...
i=200,binbfend=82
>/picwr
400E[FF][31][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)(FF)(31)(FF)(3F)(FF)(3F)(FF)(3F)(FF)(3F)(FF)(3F)(FF)(3F)(FF)(3F)
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)(FF)(3F)(FF)(3F)(FF)(3F)


i=78,b=2,[00]400e
[05][00][02][40][0E][F5][3F][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF]
(10)(03)(00)(02)(40)(0E)(00)(00)(00)(36)(03)(FF)(3F)(FF)(3F)(FF)(3F)
picwrend

>/verify
inbfend=0
400E[03][00][02][40]
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)(40)(0E)(00)(00)(00)(36)(03)(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)(02)(40)(0E)(00)(00)(00)(36)(03)(FF)(3F)(FF)(3F)(FF)(3F)
[o][o]


i=78,b=2,[00]400e
[06][00][02][40][0E][F5][3F][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF]
(10)(F5)(31)(FF)(3F)(FF)(3F)(FF)(3F)(FF)(3F)(FF)(3F)(FF)(3F)(FF)(3F)
[o][x]error!
vfend
error=1
>

ベリファイで最後のCONFIGのところでerror=1になることについては上で説明しました。

念のため/PICRDFを実行しました。
>/picrdf 12f629test250415.hex
400E[F5][31][FF][3F]
type=04,uadrs=00
[08]
0000[10][05][28][FF][3F][FF][3F][FF][3F][FF][3F][83][16][85][01][83][12]
0010[10][85][01][14][20][FF][30][85][00][14][20][08][28][FA][30][A0][00]
0020[10][00][00][A0][0B][10][28][08][00][FA][30][A1][00][0E][20][0E][20]
0030[10][A1][0B][16][28][08][00][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[F5][31][FF][3F]
[10]
>/exit


/ERASE、/PICRD、/PICWRの全てうまくできたようです。
今回のPIC12F629に対するWRITERプログラムのテストはVpp=9Vで実行しました。
PIC12F629のVppはVdd+3.5V〜13.5Vということになっています。
Vdd=5VですからVppは8.5V〜13.5Vになります。

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

Vpp=9Vはぎりぎりの値ですがうまくERASEもWRITEもできました。
以上でPIC12F629のテストは無事終了です。

超ローコストPICWRITERの製作[第262回]
2025.4.17 upload

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