このところM5Stack ATOM Liteでよく遊んでいますが、作りたいものって、ホントちょっとした物だったりするので、またPICをしたくなりました。
この衝動、一定期間毎に訪れます。
で、PIC12F1840でLチカを行いました。
その作業ログです。
■ 前置き(余談)
最初の衝動で、PICライターを買ったのは2012年。Lチカにすら届かずあっけなく挫折、2019年頃にまたしたくなってまたまた挫折、今回、10年越しのLチカをしました。無能か。
持っているPICライターはPICkit2、最新であるPICkit4を買おうかなっと思いましたが、けっこうお高いし、挫折するかもだし、PICkit2で粘りました。
PICkit2が対応しているPICは2011年くらいまでのモデルですが、まだ売られてはいます。新しいもののほうが安くて高性能なので、PIC自体は高くつきますが^^;
今回の衝動の元はI2C通信がしたいこと。ATOM Lite(ESP32)をマスターに、PICをスレーブ化できれば、アナログセンサーや制御器がいっぱい繋げられるなぁと。
PICでi2c通信するには、MSSP機能なるものが備わっているものでなければならず、PICKit2が対応してて、その機能があるやつに「PIC12(L)F1822/1840/PIC16(L)F182X/1847 ファミリタイプ」がありました。
一番安いPIC12F1822を買おうと思ったら、在庫切れだったので、PIC12F1840を買ってきました。書き込み容量の違いがあるだけで、機能は一緒の姉妹品です。
MPLAB X IDEで作成したhexファイルをPICKit2 ProgrammerでPICに書き込みます。
【使ったもの】
・PC:Windows10 64bit
・PICKit2
・PIC12F1840、おまけにPIC12F629
・電子工作パーツ(抵抗、LED、他)
■ 開発環境の構築
改めて開発環境を整えました。
詳しいことは記載の参考サイトに任せて作業メモ要点だけ。
【参考サイト】
「PICKit2 Programmer」 の使い方(PICKit2)
https://web.nucky.jp/denshi/pickit2/pickit2.html
MPLAB XとPICkit2でLEDを点滅させる
http://denshikousaku.net/mplab-x-and-pickit2
【作業項目】
・MPLAB X IDEおよびXC8 Compilerのインストール
・MPLABにCompilerを認識させる
・PICKit2 Programmerのインストール
・PICKit2 Programmerデバイス定義ファイルのダウンロード&置き換え
【インストールしたバージョン】
・MPLAB X IDE v6.05
・MPLAB XC Compiler v2.40
・PICKit2 Programmer v2.61
PICKit2 Programmerは定義ファイルを差し替えないとPIC12F1840のファミリタイプは認識しません。
最新のMPLAB X IDEはプロジェクト作成時のToolにPICkit2が選択できませんが、No Toolで使っても問題ありませんでした。
対応しているPIC一覧は下記より。
New PICkit2 device file 1.62.14
https://www.microchip.com/forums/m610775.aspx
IDEとコンパラーのバージョンが合わないと、ヘッダー読み込めない問題が生じることがあるとのこと。パス関連の不具合らしい。最初、プロジェクト作成時ToolにPICKit2がないといけないと思い、旧バージョンを入れた時に生じました。最新を入れておけば問題は起きないかと思います。
MPLAB X IDE で xc.h が見つからない問題
https://tomio2480.hatenablog.com/entry/notfound_xch
■ 回路
下記がPIC書き込み+テスト用の基盤。2回目の衝動の時に作りました。今回、一番悩んだのが、PICへの書込みが出来ない原因がこれのハンダ不良であることを発見する事でした。がってむ。
PIC12F629でLチカ
Lチカの方は、まず手持ちのPIC12F629で一連の作業ができることを確認してから、その後買ってきたPIC12F1840で行いました。
【参考サイト】
PIC12F629でLチカをやってみる
https://ameblo.jp/denshi-1996/entry-12728648424.html
【ソースコード(PIC12F629)】
main.c
#pragma config FOSC = INTRCIO // 発振器選択 (INTOSC 発振器: GP4/OSC2/CLKOUT ピンの I/O 機能、GP5/OSC1/CLKIN の I/O 機能) #pragma config WDTE = OFF // ウォッチドッグタイマー有効 (WDT 無効) #pragma config PWRTE = ON // パワーアップタイマー有効 (PWRT 有効) #pragma config MCLRE = ON // GP3/MCLR 端子機能選択 (GP3/MCLR 端子機能は MCLR) #pragma config BOREN = ON // ブラウンアウト検出有効 (BOD 有効) #pragma config CP = OFF // コード保護ビット (プログラム メモリ コード保護は無効) #pragma config CPD = OFF // データ コード保護ビット (データ メモリ コード保護は無効) #include <xc.h> #define _XTAL_FREQ 31250 int main(int argc, char** argv) { OSCCAL = 0x80; //オシレータ センター PCON &= 0x00; //POR BOD 有効 CMCON = 0x07; //コンパレータOFF TRISIO = 0x08; //GP3以外OUTPUT while(1) { GPIO = 0b00000001; __delay_ms(300); GPIO = 0b00000010; __delay_ms(300); GPIO = 0b00000100; __delay_ms(300); GPIO = 0b00000000; __delay_ms(300); } return (EXIT_SUCCESS); }
PIC12F1840でLチカ
【参考サイト】
小さくて安いPICマイコンを使ってみる【LEDの点灯】
https://kimudiary.com/pic/小さくて安いPICマイコンを使ってみる【LEDの点灯】/
参考サイト先はPIC12F1822ですが、PIC12F1840とは書き込み容量に違いがあるだけで同機能の姉妹品です。
【ソースコード(PIC12F1840)】
main.c
#pragma config FOSC = INTOSC #pragma config WDTE = OFF #pragma config PWRTE = ON #pragma config MCLRE = OFF #pragma config CP = OFF #pragma config CPD = OFF #pragma config BOREN = OFF #pragma config CLKOUTEN = OFF #pragma config IESO = OFF #pragma config FCMEN = OFF #pragma config WRT = OFF #pragma config PLLEN = OFF #pragma config STVREN = ON #pragma config BORV = LO #pragma config LVP = OFF #include <xc.h> #define _XTAL_FREQ 31250 void main(void) { OSCCON = 0b00010000;//オシレータ31.25kHzに設定 ANSELA = 0x00;//全ピン デジタルI/Oピンとして設定 TRISA = 0x00;//全てのピンを出力 PORTA = 0x00;//全てのピンを初期化(LOW(0)に設定) while(1){ RA0 = 1; __delay_ms(500); RA0 = 0; RA1 = 1; __delay_ms(500); RA1 = 0; RA2 = 1; __delay_ms(500); RA2 = 0; } return; }
ここまで割かしすんなり。なぜ10年前はできなかったのかと思いますが、わかりやすいサイトが増えてくれた恩恵、ですかね。
ソースは相変わらず自分で書ける気がしないので、したい事がコピペでできるほど、情報が増えたことに期待しつつ、ATOM LiteとのI2C通信にチャレンジします。
追記:一応できました。