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


超ローコストPICWRITERの製作

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

[第241回]



●PIC16F1503(5)バグ発見!!

PIC16F1503はPIC16F628などと違ってCONFIGのアドレスが8000番地台(16bit幅)になっています。
データ幅を8bitに直すとアドレスは010000番地台になります。
通常のプログラムアドレスは000000〜00FFFFの範囲にあります。
読み込んだデータがプログラムなのかCONFIGなのかはアドレスの最上位8ビットが00か00以外なのかをチェックすることで区別できます。
今までのWRITERプログラムでは対象になるアドレスがCONFIGも含めて16ビット(0000〜FFFF)の範囲にありましたので16ビットアドレスの上位8ビットを見ることでプログラムかCONFIGかを区別していました。
そこのところを今までと同じプログラムにしていたのがCONFIGが書き込めなかった原因でした。
そこで16F1503WRITERプログラムでは24bitアドレスの最上位8ビットを見るように変更した上で先に/ERASEを実行したあと/HLOAD、/PICWRと/VERIFYを実行し最後に/PICRDを実行しました。
すると。
>/picrd
400C[E2][2C][E4][3F]
type=04,uadrs=00
[08]
0000[10][05][28][21][00][68][30][99][00][8E][01][23][00][8E][01][20][00]
0010[10][14][20][14][20][14][20][14][20][21][08][8E][00][A1][0A][0C][28]
0020[10][19][20][19][20][19][20][19][20][08][00][00][00][A0][0B][19][28]
0030[10][08][00][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]


type=04,uadrs=01
[03]
400E[E4][3F]
[10]
>

CONFIGが正しく書き込めるようになりました。
最後の400Eのところです。
本当はここのアドレスは10000Eにすべきところなのですが、ここだけのためにWindows側の表示プログラムを直さなくてはなりません。
それも面倒なことなのでとりあえずは従来の表示のままでいくことにしました。
それはいいとして、ここでおかしなことに気が付きました。
プログラム本体の値が変です。
下は前回テストしたときのログです。
>/picrdf 16f1503test250321.hex
400C[E2][2C][FF][3F]
type=04,uadrs=00
[08]
0000[10][05][28][FF][3F][FF][3F][FF][3F][FF][3F][21][00][68][30][99][00]
0010[10][8E][01][23][00][8E][01][20][00][14][20][14][20][14][20][14][20]
0020[10][21][08][8E][00][A1][0A][0C][28][19][20][19][20][19][20][19][20]
0030[10][08][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][E4][3F][FF][3F][FF][3F][FF][3F]


type=04,uadrs=01
[08]
400E[FF][3F]
[10]
>/exit

アドレス0000の行が異なっています。
おかしいのは今回のログの表示です。
0000のデータは[05][28]のあと[FF][3F]が4回続いたあと[21][00][68]と続きます。
今回は間の[FF][3F]がなくてすぐに[21][00][68]が続いています。
ありえない現象です。

さては。
魔物の仕業かっ。
悪霊よ去れ!
繰り返しテストしたのですがこの部分については前回のプログラムでは正しく表示されるのに今回のプログラムでは何回やっても同じ結果になってしまいます。
結局終日あれこれ考えるだけで終ってしまいました。
こういうときはもう寝てしまうのが一番です。
一晩寝ると頭がクリアされます。
じっくり考え直してみたところどうもプログラムかCONFIGかを判定しているところに問題があるとしか考えられないという結論になりました。
そこでその部分のプログラムをよくよく見たところ。
あっ!
だめじゃん。
プログラムが間違っておりました。
バグ発見です。
確か以前にも同じミスをしたことがあったように記憶しています。
もう同じことを繰り返さないために、恥ではありますが備忘録として書いておくことにします。
バグは下の部分にありました。
prwr
        call pdatard
        movff cnfgmk,w;zero check
        bnz prwr01


正しいのはこちらです。
prwr
        call pdatard
        movf cnfgmk,w;zero check
        bnz prwr01

movfはレジスタの値をwにコピーするときに使う命令ですがこのとき同時にノンゼロチェックが行なわれます。
レジスタの値が0のときにはZフラグがセットされます。
1命令で0か0でないかがチェックできるのでその目的で使うことがあります。
movffはmovfを拡張した命令ですがこちらはフラグを変化させません。
movfを使わなければならないのにうっかりmovffを使ってしまったのが今回の異常表示の原因でした。
そのためにbnzが効いていなかったのでした。
いや。おはずかしい。
その部分を修正したところ正しい結果が得られました。
>/picrdf 16f1503test250323.hex
400C[E2][2C][E4][3F]
type=04,uadrs=00
[08]
0000[10][05][28][FF][3F][FF][3F][FF][3F][FF][3F][21][00][68][30][99][00]
0010[10][8E][01][23][00][8E][01][20][00][14][20][14][20][14][20][14][20]
0020[10][21][08][8E][00][A1][0A][0C][28][19][20][19][20][19][20][19][20]
0030[10][08][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]
0050[10][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F]


type=04,uadrs=01
[03]
400E[E4][3F]
[10]
>

なお/PICRDを実行したとき(/ERASEも同じですが)CONFIGとともにデバイスIDの値も読み出されます。
デバイスIDは[E2][2C]になっています。
普通の表記に直すと2CE2になります。
下はPIC16F1503のData Sheetです。

[出典]Microchip Technology Inc.PIC16F1503 Data Sheet

ビット15、14はありませんからそのビットをともに0とすると0010 1100 111x xxxxになります(PIC16F1503は表の下段)。
デバイスIDも正しく読み出せています。

これにて。
一件落着です。

超ローコストPICWRITERの製作[第241回]
2025.3.24 upload

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