今回は Windows で懐かしの PIC をやってみました。今ひとつ謎があるのですが、とりあえず今の所できた内容のみをつらつらと述べたいと思います。
Mac 版はこっち。
開発環境・ライタの準備
PIC の開発環境は MPLAB X で行います。Cコンパイラは純正の XC 8 コンパイラです。ちなみに書き込みツールとして PICkit は高いのでなしとします。MPLAB X は Mac にも用意されているのですが、今回は PICerFT という FT232RL ベースの自作ライタを作ることも目的にしつつやっていきたいと思います。Linux で使える USB PIC ライターというものがあるらしいのですが、DC-DC コンバータ等の部品がちょっと無いので、今回はパスです。いつか作って Mac での動作確認をしたいと思います。
その PICerFT ですが、以下のページにて説明されています。FT232RL をすでにお持ちの方は、残りの部品を買うだけなので制作費が500円を切るかもしれませんね。非常にお得です。しかもこのライタ、作者様によってちっちゃくて使い勝手のいいソフトウェアも提供されているのでとても嬉しいのです。
実は僕はこれを2つ作っていて、うち1つはユニバーサル基板上への手配線、2つ目はプリント基板を発注してそこに部品を置いてみた!と言うものです。プリント基板は回路図に誤りがない限りは配線ミスは起こり得ないのですが、手配線は基板をオモテウラにくるくる裏返していくのでどうしてもミスが出てしまいます。が、動作したときの嬉しさは格別です。「とりあえず作ってみる」といった感じでしたら手配線になると思いますが、その際に1つ注意を。コイル周りの配線には十分気をつけてください。。最悪ショートしてコイルやトランジスタが焼けてしまいます。さらにダイオードの向きも細心の注意を払うこと。
というのも経験済みだからなんです。この PICerFT は PIC の 高電圧にしないと書き込めないという特徴を単一電源5Vで乗り切るために昇圧チョッパ回路を組んでいます。そこで上がった電圧をツェナーダイオードで降圧し、所望の高電圧を得ているという感じです。
というわけでこの昇圧回路中にショート等が起こると回路が焼けます。ご注意を。あと、ツェナーダイオードは逆バイアスによる降伏特性を利用していますが、もしこれを順バイアスにしてしまうと止めどなく電流が流れるようになるので、本当にダイオードごと全部きれいに焼けます。こちらには特に注意です。
ということで作ってみたものがこちら。まず下のやつは手配線で頑張ったものです。製作時間6時間。主に配線ミスによる部品交換、見直しに時間が溶けました。
発注して作ったプリント基板が写真上になります。製作時間(はんだ付け時間)はサクッとできました。
使用した PIC の種類
正直どれ使おうか全くわからなかったのですが、秋月電子通商 八潮店でだいぶ前になんとなく買った PIC18F14K22 を使うことにします。
書き込み回路ですが、PICerFT の MCLR は使わず VPP を使用します。あとは PDG、PGC を配線さえすればOK。
とりあえずLチカ
タイマとかよくわからないので、マクロを使いつつ設定していきます。
コンフィグビット
システムに関わる設定として、コンパイラの #pragma
宣言でやっていきます。といっても今回は手動でやらずに、MPLAB の機能を使って楽していきます。まず画像のように設定用のパネルを出します。Ma cの画像ですが、許してください。操作は Windows も Mac も一緒ですから。
そんで、画面下側のパネルでFOSC を IRC に、WDTEN を OFF にしてください。そしたら下の「Generate Source Code to Output」を押すとコードが出てくるので config.h
とか作ってコピペします。これは main 関数が含まれる .c
ファイルにインクルードしてください。
システムのクロックを 16MHz に
初期状態だとクロックが結構遅い感じだったので、16MHz にあげて使います。さっきのコンフィグビットによって MCU は内部オシレーターで動く感じになっています。データシート見ながらこんな感じのコードを書きました。
void systemInit(void) {
OSCCONbits.IRCF = 0b111; // set oscillator as 16MHz
OSCCONbits.OSTS = 1; // source from config bits (FOSC)
OSCCONbits.SCS = 0b00; // internal clock
}
こちらを見て気づかれると思うんですが、レジスタ構造体の書き方がなんとなくお分かりになると思います。レジスタ全体の値を変えたい時はレジスタ名を直接叩きます。例えば上の OSCCON
レジスタを 1 にしたい時は OSCCON = 1;
とすればいいのです。一方このレジスタ内の特定ビットを変えたい時は HOGEbits.HAGE
と書くんです。上の例では IRCF
ビット(3ビット分)を 0b111
にしたいということなので OSCCONbits.IRCF = 0b111;
と書きました。
GPIO の叩き方
基本的に3種類見ていきます。それ以外にもあるのですが、それは AVR のように、各機能をオンにすればその機能となります。
まずはピンのディジタル出力設定です。今回は RA0 を使用するので、TRISA
レジスタの該当ビットを 0 にすればいいです。
TRISAbits.RA0 = 0; // RA0 == output
続いて main 関数の外側に以下のマクロを定義します。これにより、簡単にウェイトを使用できるようになります。
#define _XTAL_FREQ 16e6
ピンの出力設定ですが、出力の場合は LATA レジスタを、入力の場合は PORTA レジスタを用いるべきとのことです。これは PIC の仕様らしくて、僕はこれでハマりました。ちなみに出力で PORTA
を用いようとすると、微妙にうまく行きません。
ソースコード全景
ここまで話が長くなりましたが、main.c
のソースコード全体をこちらに載せようと思います。
後はメニューバーの金槌のボタンを押せばビルドされて hex ファイルができます。お疲れ様でした。
電源の話
ところで、PICerFT は仕様として一度ソフトに接続したら、書き込み時以外は電源をオフにする、という風になっているようです。ですので書き込み終了後にマイコンが動いているっぽくなっていると思いますが、正常に動作しているわけではありません。ここで一旦電源を別系統から持ってきて差し替える...のは正直面倒くさいので 電源コントロール用のソフトを作りました。その名も PowerControlPICerFT (そのまんま)。
GUI で色々と少々いじるところがあるんですが、基本的にポートに接続したら即 VDD をオンに、VPP をオフにする設定としました。なので下のチェックボックスは特に弄る必要がありません。また、これを使ったあと再度 PICerFT で書き込む場合は一旦このソフトを終了するか接続を切るようにしてくださいね。