TOPへ戻る


pic12f1822,pic12f683用書き込み器を作るには

Arduino用SmileWriter5in1シールド用pic書き込み器はArdpicprogのスケッチを使用しています。
このスケッチはpic12f1822,pic12f683に対応していませんので、対応させました。

■pic12f683の対応

deviceInfoの追加には、以下の項目の設定を用意します。
struct deviceInfo
{
    const prog_char *name;      // User-readable name of the device.
    prog_int16_t deviceId;      // Device ID for the PIC (-1 if no id).
    prog_uint32_t programSize;  // Size of program memory (words).
    prog_uint32_t configStart;  // Flat address start of configuration memory.
    prog_uint32_t dataStart;    // Flat address start of EEPROM data memory.
    prog_uint16_t configSize;   // Number of configuration words.
    prog_uint16_t dataSize;     // Size of EEPROM data memory (bytes).
    prog_uint16_t reservedWords;// Reserved program words (e.g. for OSCCAL).
    prog_uint16_t configSave;   // Bits in config word to be saved.
    prog_uint8_t progFlashType; // Type of flash for program memory.
    prog_uint8_t dataFlashType; // Type of flash for data memory.
};
データシートと、PIC12F6XX/16F6XX Memory Programming Specificationを調べた結果
こんな感じ。
{s_pic12f683, 0x0460, 2048, 0x2000, 0x2100, 8, 256, 0, 0x3000, FLASH4, EEPROM}, // aya add


■pic12f1822の対応

データシートと、PIC12(L)F1822/PIC16(L)F182X Memory Programming Specificationを調べた結果
こんな感じ。
{s_pic12f1822, 0x2700, 2048, 0x8000, 0xF000, 9, 256, 0, 0x3000, FLASH4, EEPROM}, // aya add

pic12f1822のHEXファイルを調べてみると、レコードタイプ0x04(拡張リニアアドレス)が使われています。
Ardpicprogスケッチは、レコードタイプ0x04に対応していませんでした。



実アドレスを算出するには、32bitに拡張する計算が必要です。
((0x0001<<16) + 0x0000+0x0001) / 2 = 0x8000
0x0001 を左に16bitシフトして、LoadOffset(0x0000)を加算、Data(0x0001)を加算して、2で割ります。

PeripheralPinMapのブログさんの、MPLABが出力するHEXファイルの見方がすごく参考になりました。


・EEP-ROMのアドレスを調べる
データシートは0x1E000〜、HEXファイルは0xE0000、ソースファイルは0xF000 となっており、どうなってんの。
KO-IBO project blogさんの、Pic12F1822のデータEEPROMに書き込むのはを参考にしました。
結局PIC12F1822のEEP-ROM領域は0xF000〜です。

・HEXファイル内のアドレスと実アドレスの違いについて


HEX ファイル上のLOAD OFFSETが0008の時、PICのアドレスは4になります
ArdPicProgHostのソースでアドレスを取り込む部分で、
intDataAddress = Val("&H" + strSourceFileIntelHex.Substring(intFilePointer, 4)) >> 1
というソースになっており、「>>1」で右に1bitシフトさせています。

このint型への変換でValを使っていますが、これは負号付き16bitなので、
pic12f1822の場合、configuration memoryが8000h〜なので、HEXファイルのアドレスは0xE000になっています。
※0x8000 << 1 で、0xE000です。
16bit負号ありで10進数に変換されると、「-8192」になって、後の処理が誤動作していました。

粗療法として、int型から、Long型に変えて、
longDataAddress = Clng("&H" + strSourceFileIntelHex.Substring(intFilePointer, 4)) >> 1
10進数変換は、Val()からClng()に変更しました。

02 これを元にプログラムにパッチを当てます。
【Windows7用ホストプログラムArdPicProgHost.vb】
1、Extended segment addressに対応させました。
  従来のプログラムは RECTYPE=04 を無視していたので、処理を追加しました。



2、EEPROMdump表示部分で、アドレスが0xF000だと、FFFFF000で表示されてしまうので、
  とりあえず何も考えずに、myRightという関数作って右から4文字を表示する様に変更。




【ProgramPICスケッチ】
pic12F1822のdeviceInfoを設定します




動作確認
SmileWriter5in1には、Ardpicprogを書き込みます。
Windows7用HostProgramを用意します。




PIC12F1822のプログラムの書き込みが出来ました。

PIC12F1822の書き込み電圧について

pic12f1822のデータシートをチェックしていたところ、

PIC12F1822の,VIHHは Min8.0V 〜 Max9.0Vでした。
しかし、保証しませんが、12Vでも書き込めているようです。

PIC12F683,PIC12F1822対応書き込みソフト

ベースのスケッチはArdpicprogArdpicprogです。
変更点
deviceInfoにpic12f683とpic12f1822を追加。#define DELAY_TERA 6000 → 5000 短くしないと,ArdPicProgHost.exeがエラーとなりました
上記のパッチを当てたスケッチ【こっちをダウンロードします】

WindowsのHost Program
ベースはPiKoder Homeの、Arduino Pic Programmerです。
変更点
pic12F1822のHEXがextended segment addressを使用していたので、その対応
上記のパッチを当てたスケッチ【こっちをダウンロードします】


関連記事

2016/08/07 ワンコインデコーダ4の組み立ての紹介
2016/07/17 Smile Writer 5in1を使ってた icテストクリップによる書き込みの紹介
SmileWriter5in1のブログ記事



2016/09/02 1版