PicWriterUSB:ソフトウェア編【PICマイコンへの書込み】

all_area_log

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ファイルはデータラッチの境界にアラインされているわけではないので、端数になる部分の処理を含め、データラッチを最大限に使うようにプログラムを組む必要があります。

コメント

タイトルとURLをコピーしました