はじめに
秋月の2階にフラっと寄ったらPIC16F747を10個入りレールを200円で売ってた。80 vs 68(僕は65派)とかVHS vs β(もちろんβ)とかPIC vs AVR(5Vで焼けるしSDCCよりGCC派なんでAVR)の神話時代を思い出しつつ、1個20円って74LSより安いじゃん、こないだAVR焼いたから久しぶりにPICでも焼いてみるかなんて歳を取るとついノスタルジックになって何の使いモノにならん買物をしてしまった。という訳で神棚に置いといても御利益ないんでLチカでも奉納しましょうかね。
開発環境のインストール
PIC16F747なら手持ちのPICKit2で焼けるはず。という事で大昔に買ったPICKit2を押し入れから見つけてきた。まずはMPLAB X IDE v6.25をインストールしたけど古(いにしえ)のPICKit2はサポート外だ。ハラレルライターとかシリアルライターも一緒に発掘されたしarduino unoとかrasberry pi picoで焼くって手もあるんだけど単価20円のCPUで遊ぶのにホスト側に手間ヒマ(VPPが12V問題とUSBしかないぞ問題)かけるのは何だからhexでエクスポートしてライターは別建てでPICKit2 Programmer ver2.61で焼く方針にした。なお純正環境に拘らないならPICkitminusでもバッチリ焼けます。
コード
まず先人達のやり方をググる。MPLAB X IDEでPIC16F747を選んで新規プロジェクトを作成。ソースでmain.cを作ってConfiguration Bitsのテンプレをジェネレートして貼る。GEMINIでもChatGPTでもいいからLチカのサンプル書いてmain.cに張れば3分は大袈裟だけど30分はかからないで完成。こうゆう所が令和だよね。
/*
* File: main.c // ファイル名
* Author: 2ru // 作成者名
*
* Created on 2025/12/02, 18:06 // 作成日時
*/
// PIC16F747 Configuration Bit Settings (PICマイコンの設定ビット)
// 'C' source line config statements
// CONFIG1
#pragma config FOSC = INTOSCCLK // 発振器の選択 (内部発振器を使用。RA6/RA7ピンはI/Oとして使用)
#pragma config WDTE = OFF // ウォッチドッグタイマー無効
#pragma config PWRTE = OFF // パワーアップタイマー無効
#pragma config MCLRE = ON // MCLR/VPPピンをリセット入力として有効
#pragma config BOREN = ON // ブラウンアウトリセット有効
#pragma config BORV = 20 // ブラウンアウトリセット電圧 (2.0V設定)
#pragma config CCP2MX = RC1 // CCP2モジュールの多重化ピン (RC1に設定)
#pragma config CP = OFF // フラッシュプログラムメモリのコード保護無効
// CONFIG2
#pragma config FCMEN = ON // フェールセーフクロックモニター有効
#pragma config IESO = ON // 内部外部切り替えモード有効
#pragma config BORSEN = ON // ブラウンアウトリセットソフトウェア制御有効
// #pragma config statements should precede project file includes.
// Use project enums instead of #define for ON and OFF.
#include <xc.h> // PICマイコンのレジスタ定義を扱うためのヘッダファイル
// 遅延関数(__delay_ms)を使用するためにクロック周波数を定義 (8MHz)
#define _XTAL_FREQ 8000000 // 8,000,000 Hz (8MHz)
void main(void) {
// ---------------------------------------------
// 1. オシレーター(発振器)設定
// ---------------------------------------------
// 内部発振周波数を8MHzに設定 (OSCCONレジスタのIRCF<2:0>を111にする)
OSCCONbits.IRCF = 0b111;
// ---------------------------------------------
// 2. 入出力ピン設定
// ---------------------------------------------
// 全てのアナログピン機能を無効にし、デジタルI/Oとして使用する (ADCON1レジスタ PCFGビット)
// これを行わないと一部のピン(特にPORTA/E)が正しくデジタル出力できない場合がある
ADCON1 = 0x0F;
// RB0ピンを出力モードに設定 (TRISBレジスタの該当ビットを0=Outputに設定)
TRISBbits.TRISB0 = 0;
// 最初はLEDを消灯しておく (PORTBのRB0ビットをLow出力=0に設定)
PORTBbits.RB0 = 0;
// ---------------------------------------------
// 3. メインループ(Lチカ処理)
// ---------------------------------------------
while(1) {
PORTBbits.RB0 = 1; // LED ON (RB0ピンをHigh出力=1に設定)
__delay_ms(100); // 100ミリ秒待機
PORTBbits.RB0 = 0; // LED OFF (RB0ピンをLow出力=0に設定)
__delay_ms(100); // 100ミリ秒待機
}
}
回路
純正の公式開発環境なんで全く何の調整もなく単純に刺して繋ぐだけでサクっと焼けます。配線って程じゃないけど5V&GNDと RB0(3pin)--330Ω(お好みの抵抗で)--LED--GND をつなげばLチカの完成です。
まとめ
枯れた情報ばっかで目新しい話は何も無い。ただ昭和の人間にとって(ソケットより安い?)1個20円のCPUってのがネタね。2708から2716になった進歩の衝動感を知らないCH32の令和世代にはVPPに12Vが必要って段階で見向きもされないだろうな。5V単一で焼けるって自己変更コードができるって事だからね。組み込みだとヤバいと言えばヤバい訳ですよ。arduino UNOなんて要するにブートローダーさえも書き換えられるMZ-80みたいな感じがするもん。何を言ってんだか令和の人には分かんなくなってるだろうから話を戻すけど、、、。ま、料理なら賞味期限切れの特価品を買ってきて冷蔵庫の残り物と合わせて3分クッキングだしダンジョンならスライム程度の瞬殺もんって感じだね。流石は純正品だけあって20年経ってもキャリブレーション無しの一発で動くところが素晴らしいと褒めておこう。arduino as ISPでUART使ってると数回に1回は書き込みエラー起こすもんなぁ。