私は今までワンチップマイコンでは、主に AVRマイコンを使っていまして、

PICマイコンは使ったことがなかったのですが、こちらのサイト

自分で作るDCCデコーダ - ワンコインデコーダ6(Web Nucky)」では、

DCCデコーダ用に PICマイコン(PIC12F1822)が使われていましたので、

それのファームの書込み環境を Seeeduino XIAOで作ってみました。

 

MPLAB PicKit 4MPLAB SNAP などの純正ライタは、

お試しで気軽に買える値段ではないですしね。

 

■ ファームの書込み仕様

 

ファームの書込み仕様は、PIC12F1822マイコンのサイトにあります

PIC12(L)F1822/PIC16(L)F182X Memory Programming Specification」を

見まして、LV-ICSP (Low Voltage In-Circuit Serial Programming)モードのみに

対応することにしました。

 

■ Seeeduino XIAOと PIC12F1822マイコンの接続

 

当初は Seeeduino XIAOの SPI機能を使った通信を考えていましたので

SPIピンと接続しましたが、ICSPの 6ビットのコマンドを

送信できないことが分かり、結局 GPIOによるソフトウェア制御にしたため、

GPIOの割当て設定を変えればどのピンと接続しても大丈夫です。

 

Seeeduino XIAO - WIRE PIC12F1822
3V3 3V3 - RED 1-pin VDD
GND GND - BLACK 8-pin VSS
D7 GPO (SPI.CSn) - YELLOW 4-pin (RA3) nMCLR
D8 GPO (SPI.SCK) - BLUE 6-pin (RA1) ICSPCLK
D9 GPI (SPI.MISO) 4.7 kΩ GREEN 7-pin (RA0) ICSPDATA
D10 GPO (SPI.MOSI) 4.7 kΩ

 

 

■ Seeeduino XIAOのプログラム

 

ファームの書込み環境を準備することは手段であって目的ではないため、

Seeeduino XIAOのプログラムのために別途開発環境のインストールが

必要になることは避けたく、その必要のない CircuitPythonで作成しました。

 

ただ、CircuitPythonのスクリプトファイル(main.py)と、

書込むファームのイメージファイル(image.hex)を

CIRCUITPYドライブにコピーするだけで済むようにしたかったのですが、

途中でメモリ不足になってしまったため、

残念ながら Intel HEXフォーマットのパース処理は削除して、

事前に変換した専用イメージファイルをコピーすることにせざるを

得ませんでした。

 

最終的に書込み作業は下記の流れで行うことになりました。

コピーとシリアルコンソールの作業も PowerShellスクリプトで行えば

よいのですが、そこはやる気がなくなりました。

 

(1) パソコンで PowerShellスクリプトを実行して、

  Intel HEXイメージファイル(.hex)から、PIC12F1822マイコンの

  プログラム領域/データ領域/コンフィグレジスタ設定に分けた

  3つの専用イメージファイル(.program/.data/.config)に変換する。

(2) CircuitPythonのスクリプトファイルと変換した専用イメージファイルを

  Seeeduino XIAOの CIRCUITPYドライブにコピーする。

(3) パソコンのシリアルコンソールで Seeeduino XIAOを操作して、

  PIC12F1822マイコンのファーム書込みを行う。

 

■ 専用イメージファイルの変換

 

元の Intel HEXイメージファイル: image.hex

:020000040000FA
:020000000428D2
:080008008C0123008C01210092
:100010007A30990021000C308C0022009D141D14B0
:10002000250091010830BF23AB00AB1D1C28200028
…
:020000040001F9
:02000E00A40943
:02001000FF3CB3
:10E000000300000000000000FF0000005C009C0016
…

 

変換後の専用イメージファイル

image.hex.program image.hex.data image.hex.config
2804
3FFF
3FFF
3FFF
018C
0023
018C
0021
0003
0000
0000
0000
00FF
0000
005C
009C
…
09A4
3CFF

 

■ Seeeduino XIAOの操作

 

CircuitPythonのスクリプトファイルを CIRCUITPYドライブにコピーすると

自動的にスクリプトが実行され、

PIC12F1822マイコンを LV-ICSPモードへ遷移させてコンフィグ設定を

読み出します。

Adafruit CircuitPython 7.3.2 on 2022-07-20; Seeeduino XIAO with samd21g18
>>>
soft reboot

Auto-reload is on. Simply save files over USB to run them or enter REPL to disable.
main.py output:
User ID Location   : 3FFF 3FFF 3FFF 3FFF
Device ID          : 2700 (REV: 09)
Configuration Word : 3FFF 3FFF
Calibration Word   : 28F1 1A8C

# PIC16F1xxx LV-ICSP Programmer
MI/MO    : Enter/Exit LV-ICSP Mode
RP/RD/RC : Read  Program/Data/Configuration Memory
EP/ED    : Erase Program/Data               Memory
WP/WD/WC : Write Program/Data/Configuration Memory
> 

 

WP、WD、WCのコマンドを実行して、

プログラム領域/データ領域/コンフィグレジスタ設定を書込みます。

> wp
0000: 2804 3FFF 3FFF 3FFF 018C 0023 018C 0021 307A 0099 0021 300C 008C 0022 149D 141D
0010: 0025 0191 3008 23BF 00AB 1DAB 281C 0020 30FF 009B 0020 2821 0020 307F 009B 0020
0020: 2821 0020 300B 052B 009C 0020 018C 01B7 01BF 0020 301D 23BF 00B0 18B0 284B 0837
0030: 1903 2842 3001 23BF 00A9 0237 1803 283A 0829 00B7 3004 23BF 00AA 0237 1C03 2842
…

> wd
0000: 0003 0000 0000 0000 00FF 0000 005C 009C 0000 0000 0000 0000 0001 0000 0000 0000
0010: 00C0 0080 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0002 0000 0000 0000
0020: 0010 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
0030: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
…

> wc

 

RP、RD、RCのコマンドを実行して、

プログラム領域/データ領域/コンフィグレジスタ設定を読出します。

ベリファイ機能はありませんので自分で確認します。

> rp
0000: 2804 3FFF 3FFF 3FFF 018C 0023 018C 0021 307A 0099 0021 300C 008C 0022 149D 141D
0010: 0025 0191 3008 23BF 00AB 1DAB 281C 0020 30FF 009B 0020 2821 0020 307F 009B 0020
0020: 2821 0020 300B 052B 009C 0020 018C 01B7 01BF 0020 301D 23BF 00B0 18B0 284B 0837
0030: 1903 2842 3001 23BF 00A9 0237 1803 283A 0829 00B7 3004 23BF 00AA 0237 1C03 2842
…

> rd
0000: 0003 0000 0000 0000 00FF 0000 005C 009C 0000 0000 0000 0000 0001 0000 0000 0000
0010: 00C0 0080 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0002 0000 0000 0000
0020: 0010 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
0030: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
…

> rc
User ID Location   : 3FFF 3FFF 3FFF 3FFF
Device ID          : 2700 (REV: 09)
Configuration Word : 09A4 3CFF
Calibration Word   : 28F1 1A8C

 

■ ICSP通信波形

 

最後にオシロで測定した ICSP通信波形です。

CH1(赤色)がクロック ICSPCLK で、CH2(黄色)がデータ ICSPDAT です。

 

PIC12F1822マイコンを LV-ICSPモードへ遷移させるために、

キーシーケンスとして 0x4D434850 ("MCHP"のASCIIコード)のデータを

LSB Firstで送信するのですが、32ビット分のクロックとデータを送信した後に、

クロックをもう 1ビット送信して計 33ビットのクロックが必要なことがミソです。

 

 

 

以上です。