超ローコストPICWRITERの製作
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
「PICBASICコンパイラ」からスピンオフ!!
過去記事を参照することなどを考えて該当する過去記事は「PICBASICコンパイラ」のまま連載回もそのままとします。
以後は前回記事からの流れで[第236回]からとします。
「PICBASICコンパイラ」はなるべく早く連載を再開したいと考えています。
PICはローコスト、高機能で種類も豊富なお手軽マイコンですがプログラムを書き込むためのWRITERが必要です。
それをできるだけ安価に作ってしまおうというプロジェクトです。
最終的には製品化を考えています(組立キット、完成品)。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
[第247回]
●PIC16F88(5)テストプログラム(2)
前回は今年1月に作った簡単なテストプログラムにみっともないバグがあったために大変な1日になってしまったことの顛末について書きました。
問題の直接的な原因はそのバグのせいだったため前回はそのバグについて書いたのですが実はそれ以外にも問題はあったのでした。
前回のテストプログラムはPORTBからパルスを出力するだけの簡単なプログラムでした。
しかしそのパルスはμsオーダーの高速なパルスなのでそれまでの動作テストのようにポート出力にLEDを接続して動作状態を目視で確認することができません。
オシロスコープかロジアナでの観測が必要になります。
それはそれで動作の確認には必要なことでもあるのですがやはり簡便な方法としては今までのテストプログラムのようにLEDによる目視ができるとより便利です。
そこで今までのテストプログラムをPIC16F88用にアレンジしたものを作成しました。
下はそのソースプログラムリストです。
;;;PIC 16F88 testprogram ;09/12/31 ;25/1/17 3/29 3/30 ;clock=4MHz #include <p16f88.inc> ; ;Program Configuration Register 1 __CONFIG _CONFIG1,_CP_OFF & _LVP_OFF & _MCLR_ON & _PWRTE_ON & _WDT_OFF & _INTRC_CLKOUT __CONFIG _CONFIG2, ; w=0 f=1 c=0 z=2 ; cntr0=20 testcntr=21 testcntr2=22 ; org 00 goto start ; org 05 start bsf STATUS,5 ;bank 1 goto jp1 ; org 12 jp1 movlw 6c;=4MHz goto jp2 ; org 1a jp2 movwf OSCCON movlw 0;port=out movwf ANSEL;porta=digital movwf TRISB movwf TRISA bcf STATUS,5;bank 0 testloop movf testcntr,w movwf PORTA testloop2 call t1ms decfsz testcntr2 goto testloop2 decf testcntr goto testloop ; ;1msec timer t1ms movlw 0fa;=250 movwf cntr0 t1ms2;4micros xorwf PORTB;1 decfsz cntr0;1 goto t1ms2;2 return ; end ; |
このプログラムをいつものようにMPLABでアセンブルしてHEXファイルを作成してそれを/PICWRコマンドでPIC16F88に書き込みました。
そのあと/VERIFYを実行したところまさかのエラーになってしまいました。
/PICRDを実行したのですがなんとオール[00]になってしまいました。
>/hload 16f88test1g.hex loading 16f88test1g.hex ... i=234,binbfend=94 >/picwr 400C[FF][3F][FF][3F] *********picwrend >/verify inbfend=0 400C[FF][3F][FF][3F] (01)(FF)(3F)(FF)(3F)(FF)(3F)(FF)(3F)(FF)(3F)(FF)(3F)(FF)(3F)(FF)(3F) (02)(00)(00)(FF)(3F)(FF)(3F)(FF)(3F)(FF)(3F)(FF)(3F)(FF)(3F)(FF)(3F) error! (04)(00)(00)(00)(00)(FF)(3F)(FF)(3F)(FF)(3F)(FF)(3F)(FF)(3F)(FF)(3F) error! (04)(00)(00)(00)(00)(FF)(3F)(FF)(3F)(FF)(3F)(FF)(3F)(FF)(3F)(FF)(3F) error! (0C)(00)(00)(00)(00)(00)(00)(00)(00)(00)(00)(00)(00)(FF)(3F)(FF)(3F) error! (10)(00)(00)(00)(00)(00)(00)(00)(00)(00)(00)(00)(00)(00)(00)(00)(00) error! (0A)(00)(00)(00)(00)(00)(00)(00)(00)(00)(00)(00)(00)(00)(00)(00)(00) error! (10)(00)(00)(FF)(3F)(FF)(3F)(FF)(3F)(FF)(3F)(FF)(3F)(FF)(3F)(FF)(3F) error! (10)(00)(00)(FF)(3F)(FF)(3F)(FF)(3F)(FF)(3F)(FF)(3F)(FF)(3F)(FF)(3F) vfend error=42 >/picrdf 400C[00][00][FF][3F] 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] |
もう半ばパニックであります。
これはもう悪霊の仕業でありますね。
一時はそのように思ったのですが、ここはひとつ冷静に。
前回作ったテストプログラムではこんなことはおきなかったはず。
それで試しに前回のテストプログラムをPIC16F88に書いて/VERIFYと/PICRDを実行しましたが悪霊の仕業のようなおかしなことはおきません。
つうことになるとこれは悪霊の仕業などではなくて原因は今回新しく作ったテストプログラムにあるらしい。
しかしプログラムの中身がWRITERプログラムの挙動に影響を及ぼすことなどは普通は考えられません。
うむむむ。
ここは思案のしどころであります。
そもそも。
一体以前のプログラムと今回のプログラムのどこが違うのか。
両者で大きく違うところといえば。
おお。
__CONFIG _CONFIG2,
を追加したことが原因ではなかろうか。
実は先のプログラムを秋月のPICプログラマで書き込みしようとすると「CONFIGの一部が未指定」という警告メッセージが出されます。
どうもCONFIG2を省略したことが原因のようです。
PIC16F88はそれより前にテストしたPICと違ってCONFRIGが2つあります。
CONFIG1とCONFIG2です。
しかしCONFIG2は特に設定すべき項目はなかったのでその指定を省略していました。
PIC16F88がまともに動作しない問題の原因を追求するなかでCONFIG2を指定しないことがその原因かもしれないと考えてその行を追加したのでした。
原因がそこではなかったことについては前回書いた通りです。
しかし混乱の中でテストプログラムにCONFIG2の記述も追加しました。
その時点では原因の追求のために自前のPIC WRITERを使うのではなくて秋月のPICプログラマを使ってテストをしていました。
その限りではPIC16F88へのプログラムの書き込みには問題はありませんでした。
PIC16F88がうまく動作しない原因がテストプログラムのバグにあることがわかってから、あらためて自前のPIC WRITERのテストに戻ったところで今回の異常に遭遇したのでした。
以上のような流れを整理してみると次のように考えられます。
今回の異常にはCONFIG2の追加が関係しているらしい。
CONFIG2を追加したテストプログラムでも秋月のPICプログラマでは正しく書き込みができる。
しかしそれを自前のPIC WRITERで行なうと上に書いたような異常が発生する。
ということになるとやっぱりこれはPIC WRITERプログラムの特にCONFIGの書き込みのところにまずい点があるのではないか。
それであらためてWRITERプログラムを確認してみたところCONFIGについては1つのみにしか対応していないことがわかりました。
詳細なプログラムの話になりますから細部については省きますがHEXファイルではCONFIGについては2度データを指定しています。
しかしWRITERプログラムでは2度の指定は想定外でしたので本来はCONFIG1とCONFIG2に値を書き込むべきところをCONFIG1にCONFIG2の値も上書きしてしまっていました。
悪いことにCONFIG2は何も値を指定しないでただ _CONFIG2, とだけ書いたので値としては0000を書き込んでしまったのでした。
CONFIG2にではなくてCONFIG1に、です。
CONFIG1に0000を書き込むとどうなるか?
CONFIG1にはCP(コピープロテクト)ビットがあります。
そこに0を書き込んだためにCPオンになってしまい何も読み出せなくなってしまったと考えられます。
そこでPIC WRITERプログラムを修正したところ無事に書き込み読み出しができるようになりました。
やれやれ、であります。
WRITERプログラムを直して/PICWRを再度テストしました。
>/hload 16f88test1g.hex loading 16f88test1g.hex ... i=234,binbfend=94 >/picwr 400C[FF][3F][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] 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=20,b=4,[00]000a [05][00][04][00][0A][83][16][12][28][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF] [01] i=84,b=2,[00]400e [05][00][02][40][0E][71][3F][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF] [03] i=90,b=2,[00]4010 [05][00][02][40][10][00][00][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF] [03] picwrend > |
/PICWRと/VERIFYは表示を簡単にしたプログラムに変更したのですが今回のデバッグのために以前のプログラムで表示を行なっています。
冗長になりますから途中は省略しています。
最後の2ブロックがCONFIGへの書き込みです。
CONFIG1はアドレスが400Eで値は[3F][71]です(値はLow8ビット、High8ビットの順になります)。
CONFIG2はアドレスが4010で値は[00][00]です。
次に/VERIFYを実行しました。
>/verify inbfend=0 400C[FF][3F][FF][3F] 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=84,b=2,[00]400e [06][00][02][40][0E][71][3F][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF] (10)(71)(3F)(FC)(3F)(FF)(3F)(FF)(3F)(FF)(3F)(FF)(3F)(FF)(3F)(FF)(3F) [o][o] i=90,b=2,[00]4010 [06][00][02][40][10][00][00][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF] (10)(FC)(3F)(FF)(3F)(FF)(3F)(FF)(3F)(FF)(3F)(FF)(3F)(FF)(3F)(FF)(3F) [x][x]error! vfend error=2 > |
WRITERプログラムを直したのでCPオンにはならずに書き込んだ値がそのまま読み出されています。
CONFIG1の値は(71)(3F)が読み出されてそれは書き込んだ値と一致しましたから[o][o]と表示されました。
問題はCONFIG2です。
書き込んだ値は[00][00]なのですが読み出した値は(FC)(3F)です。
不一致ですから[x][x]と表示されてerror=2になりました。
えっ?
まだプログラムミスがある?
一瞬あせったのですがエラーではありませんでした。
まっことPICは心臓に悪いです。
下はPIC16F87/88のCONFIG2の説明です。
[出典]Microchip Technology Inc.PIC16F87/88 Flash Memory Programming Specification
PIC16F87/88のCONFIG2は下位2ビットしかありません。
上位13〜2ビットはRead as ’1’と書いてあります。
つまりCONFIG2に[00][00]を書き込んでもベリファイでは3FFCが読み出されます。
比較した値としては不一致なのですがそれは当然の結果なので本当はエラーではありません。
最終的なWRITERプログラムとしてはPIC名を指定して書き込みを行なうことになると思いますからその段階ではここはエラーならないような対策をすることになるかと思います。
まだ説明の途中ですが本日は時間がなくなってしまいました。
次回に続きます。
超ローコストPICWRITERの製作[第245回]
2025.3.31 upload
前へ
次へ
ホームページトップへ戻る