PICマイコンの書込みプログラムの留意点
こんにちは、リゲル・インテリジェンスです。
USBマスストレージ、Dual core対応、PIOモジュール利用にてPICマイコン書込みに必要な部品は揃いましたので、あとは粛々とデータをPICマイコンへ流し込めば良い、のですが実装中に気になった(引っかかった)点がいくつかあったのでまとめておきます。
Latch
PICマイコンのFlashエリアに書込みを行う際に複数ワードを一気に書込めるようにデータラッチ(キャッシュ)が備わっています。データラッチの数はチップによって異なりますが、Flashへの書込みコマンドはmsec単位のウェイトが必要でICSPCLKの200nsecサイクルで動作するLOAD系のコマンドに比べ桁違いに時間がかかります。よってLatchを最大限に使用してFlash書込みの回数を極力減らすことが高速化には非常に重要です。
PIC16F1823のMemory Programming Specificationにはセクション5.0 PROGRAMMING ALGORITHMに「さらっと」書かれていますが、これ一読してデータラッチの動作が想像出来ますかね。。
実際に書込みプログラムを作ってみて、このデータラッチ構成(配置)は下記のようになっているようです。
データラッチ(PIC16F1823では0〜F) | |||||||||||||||
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F |
Flash word address:(PIC16F1823では0〜7FF) | |||||||||||||||
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F |
10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 1A | 1B | 1C | 1D | 1E | 1F |
・・・ | |||||||||||||||
7F0 | 7F1 | 7F2 | 7F3 | 7F4 | 7F5 | 7F6 | 7F7 | 7F8 | 7F9 | 7FA | 7FB | 7FC | 7FD | 7FE | 7FF |
LOAD DATA FOR PROGRAMMING MEMORYコマンドでデータは現在のワードアドレスの下位に相当する場所のラッチに書込まれます。例えば下記のようなコマンド列を実行すると、
RESET ADDRESS → 現在のアドレスを0へ
INCREMENT ADDRESS → アドレスを1へ
LOAD DATA FOR PROGRAMMING MEMORY → ラッチ1へデータを書込み
INCREMENT ADDRESS → アドレスを2へ
LOAD DATA FOR PROGRAMMING MEMORY → ラッチ2へデータを書込み
INCREMENT ADDRESS → アドレスを3へ
LOAD DATA FOR PROGRAMMING MEMORY → ラッチ3へデータを書込み
データラッチ(PIC16F1823では0〜F) | |||||||||||||||
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F |
Flash word address:(PIC16F1823では0〜7FF) | |||||||||||||||
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F |
10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 1A | 1B | 1C | 1D | 1E | 1F |
・・・ | |||||||||||||||
7F0 | 7F1 | 7F2 | 7F3 | 7F4 | 7F5 | 7F6 | 7F7 | 7F8 | 7F9 | 7FA | 7FB | 7FC | 7FD | 7FE | 7FF |
ピンクがデータをLoadした場所です。ここで、BEGIN INTERNALLY TIMED PROGRAMMINGもしくはBEGIN EXTERNALLY TIMED PROGRAMMINGにてラッチからFlashへの転送を行うと、下記のようになります。
データラッチ(PIC16F1823では0〜F) | |||||||||||||||
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F |
Flash word address:(PIC16F1823では0〜7FF) | |||||||||||||||
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F |
10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 1A | 1B | 1C | 1D | 1E | 1F |
・・・ | |||||||||||||||
7F0 | 7F1 | 7F2 | 7F3 | 7F4 | 7F5 | 7F6 | 7F7 | 7F8 | 7F9 | 7FA | 7FB | 7FC | 7FD | 7FE | 7FF |
上記の例では3ワードを書込んでいますがこれが1回のPROGRAMMINGコマンドで行えるのがミソで、データラッチをフルに使うことで書込み時間を短縮出来ます。
続けて16ワードを書込みたい場合、データラッチ4からFになったところで一旦12ワード分でPROGRAMMINGコマンドを実行し、残りのデータラッチ0から3の4ワード分を2回めのPROGRAMMINGコマンドにてFlashに書込みます。
図に示すと下記のように2回の書込みになります。
12ワードのLOADコマンド実行(ワードオフセット4h〜Fh)
データラッチ(PIC16F1823では0〜F) | |||||||||||||||
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F |
PROGRAMMINGコマンド実行 | |||||||||||||||
Flash word address:(PIC16F1823では0〜7FF) | |||||||||||||||
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F |
10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 1A | 1B | 1C | 1D | 1E | 1F |
・・・ | |||||||||||||||
7F0 | 7F1 | 7F2 | 7F3 | 7F4 | 7F5 | 7F6 | 7F7 | 7F8 | 7F9 | 7FA | 7FB | 7FC | 7FD | 7FE | 7FF |
4ワードのLOADコマンド実行(ワードオフセット10h〜13h)
データラッチ(PIC16F1823では0〜F) | |||||||||||||||
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F |
PROGRAMMINGコマンド実行 | |||||||||||||||
Flash word address:(PIC16F1823では0〜7FF) | |||||||||||||||
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F |
10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 1A | 1B | 1C | 1D | 1E | 1F |
・・・ | |||||||||||||||
7F0 | 7F1 | 7F2 | 7F3 | 7F4 | 7F5 | 7F6 | 7F7 | 7F8 | 7F9 | 7FA | 7FB | 7FC | 7FD | 7FE | 7FF |
いかかでしょうか。要はデータラッチは物理境界である”F”を超えられませんので、ワードオフセット4から13までを一気にデータラッチへロードしてしまうと、PROGRAMMINGコマンドでデータラッチ0〜FのデータはFlashの10〜1Fに書き込まれてしまいます。(ワードオフセットが10の行=10〜1Fの物理境界内にあるので)
ここまで試してみて、やっとPIC16F1823 Memory Programming Specificationのセクション5.0 PROGRAMMING ALGORITHMにある下記の1文の意味が分かりました。
For example, with the PIC16F1827, attempting to write from address 0002h- 0009h will result in data being written to 0008h-000Fh.
PIC16F1827はデータラッチの数が8ですので、ワードオフセット2〜9に一気にLOADさせてしまうと、PROGRAMMINGコマンドでワードオフセット8の行=8〜Fの物理境界、のFlashに書込んでしまいます。
8ワードのLOADコマンド実行(ワードオフセット2h〜9h)
データラッチ(PIC16F1827では0〜7) | |||||||
0(8) | 1(9) | 2 | 3 | 4 | 5 | 6 | 7 |
PROGRAMMINGコマンド実行
Flash word address | |||||||
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | A | B | C | D | E | F |
・・・ |
XC8コンパイラが出力するHEXファイルはデータラッチの境界にアラインされているわけではないので、端数になる部分の処理を含め、データラッチを最大限に使うようにプログラムを組む必要があります。
コメント