PICBASICコンパイラ
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
まるでインタプリタ。でもコンパイラです。超カンタン超シンプルです。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
[第172回]
●PIC18F14K22でまさかのエラー(2)
前回は全消去もプログラムの書き込みもできなかったPIC18F14K22に対して規定の書き込み時Vpp電圧+9Vを+12Vにしたところ全消去もプログラム書き込みもできるようになりました、と書きました。
しかしごく限られた一部で異常な書き込みが行なわれていました。
そのベリファイエラーについても気になるところなのですが、それ以前にVpp=+12Vというのはいかにもおかしい。
もっとも相手はフラッシュメモリですから理屈としては有り得る話です。
なにしろトランジスタにキャリアをムリムリに詰め込んで動作を固定してしまおうという乱暴なことをやるのですから電圧が高いほうがより効果的なはず。
勿論やり過ぎれば破損してしまいます。
そういうことなのですけれど、とにかくND80Z3.5に接続してテストしたときにはちゃんと書き込みも消去もできたのになんでPICのプログラムでやると規定電圧では全く駄目なのか。
あ。
念のために[第72回]と全く同じことを今回もやってみました。
ええ。
PIC WRITER回路をND80Z3.5につないで、昨年と同じZ80プログラムで。
それだとちゃんとエラーなくできてしまうのですよお。
Vpp=+9Vで。
これは余りにおかしい。
ひょっとするとクロックが関係しているのではあるまいか。
ND80Z3.5のCPUクロックは6MHzです。
勿論PIC WRITERプログラムはBASICなどではありません。
Z80アセンブラで書いたマシン語プログラムです。
マシン語プログラムでもPICに比べると実行時間はかなり遅くなります。
命令によって4クロックから20クロックを越えるものまで様々。
OUT命令は11クロックもかかります。
その一方でPIC18F13K50の場合CPUクロックは48MHzです。
命令クロックはその1/4の12MHz。
PICの驚異的なところは命令は1命令クロックまたは2命令クロックで実行してしまうところにあります。
OUT命令は1命令クロックです。
実行時間はなんと1/12≒83nS。
対してND80Z3.5のOUT命令の実行時間は1/6*11≒1.833μS。
PICの実行時間は桁が違います。
ひょっとするとそこが関係しているのではないか?
勿論Z80プログラムをPICプログラムに書き直すときはその違いは意識していたのでそこはDataSheetを確認しながら書いたのですけれど。
こうなってみると、なんとなくそのあたりかなあ、という疑いがでてきます。
PICの書き込みプログラムはシリアルで行なわれます。
コマンドやデータをビットに変換してクロックに同期して送出します。
下がその説明です。
[出典]Microchip Technology Inc.PIC18F1XK22 Flash Memory Programming Specification
PGCがクロックでPGDがコマンド、データです。
タイミングの規定は色々ありますが最も基本的なものはP2、P2A、P2BとP3、P4です。
下はそのスペックです。
[出典]Microchip Technology Inc.PIC18F1XK50/PIC18F1XK22 Flash Memory Programming Specification
左がPIC18F13K50用で右がPIC14K22用です。
比べてみると数値は全く同じです。
通常+5Vで使う場合にはVdd=3.6Vのところを参考にします。
P2(PGCの1クロック)は100nsです。
P2A(PGCのLクロック巾)とP2B(PGCのHクロック巾)は40nsです。
P3(PGCの立下り前のPGDのホールド期間)とP4(PGCの立下り後のPGDのホールド期間)は15nsです。
いずれも最小値です。
さてそれで。
下がPIC18F13K50プログラムで出力されるクロックです。
PROBE01がPGCでPROBE02がPGDです。
PGCのLクロック巾は200ns、Hクロック巾は400nsです。
PGCの立下がり前、立下り後のPGDのホールド期間は100nsです。
いずれも最小値より十分大きい値です。
それではND80Z3.5プログラムで出力されるクロックはどうでしょうか。
下がその波形です。
PGCのLクロック巾は2μs、Hクロック巾は10μsです。
PGCの立下がり前、立下り後のPGDのホールド期間は1μs〜3μsです。
これはもう十分過ぎるほどの値です。
しかし。
PICプログラムで書けなくてZ80プログラムで書けるということから考えると、ここはやっぱりPICのプログラムのパルス出力の値をもう少し大きくして試してみるとよいかもしれません。
というよりそれ以外に考えられる両者の違いは無いように思えました。
そこで。
PIC18F13K50のプログラムのP3とP4のところにそれぞれ1μsの時間を挿入しました。
そしたらなんと。
PIC18F13K50のプログラムでVpp=9VにしてもPIC18F14K22に対して全消去も書き込みもベリファイもできてしまいました。
やっぱりそこだったのか。
が。
しかし。
あの不可思議なベリファイエラーはやっぱり出てしまいました。
なかなかに厳しい年の暮れであります。
次回に続きます。
PICBASICコンパイラ[第172回]
2024.12.6 upload
前へ
次へ
ホームページトップへ戻る