すっかり秋めいて来てずいぶんと涼しくなりました。今日は待望?のLED点灯。
MPLAB X IDEを使って
開発環境は「その4」で整ってると思うので、「MPLAB XC8 入門ガイド」を横に置いて。こんな時にiPadとかタブレットが有ると便利だな〜と思ったりして。
2ページにプログラム作成の概略があるのでそれに沿って進めます。
ステップ1 プロジェクトのタイプを設定する
そのまま、「NEXT>」。
ステップ2 ターゲットデバイスを選択する
PIC12F683が8bitってのは知っていたけど、どのファミリーに属するのか知りませんでした。最初は「Baseline 8-bit…」から探して無くて、次の「Mid-Range 8-bit…」で見つけてと。そして「NEXT>」。
ステップ3 ヘッダを選択する
これもそのまま、「NEXT>」。
ステップ4 ツールを選択する
ステップ5 プラグインボードを選択する
は出てこないから気にせず。
ステップ6 ソースコードをコンパイルするためのツールを選択する
「XC8…..」を選んで、「NEXT>」。
ステップ7 プロジェクトの名前とパスを選択する
「Project Name」と「Project Location」のところはお好きに。「Encodeing」はエディターの文字コードなんで日本語でコメント場合は必要な文字コードを設定してください、MACとLinuxでGitで行き来するのでUTF-8を選びました。で「Finish」。
ステップ8 プロジェクトの作成を完了する
6ページ目の基本的なコード、MPLAB X IDEのバージョンによって入門書と違う画面になるのでちょっと注意。
まずはCプログラムを書込むファイルの作成、左上の「Source File」の所で右クリックし「New」−>「main.c」をクリックする。出てきたダイアログでファイル名を決めて「Finish」、そうすると右上にスケルトンとなるソースファイルが表示されこれにプログラムを追加することになります。
こっから15ページまでは読んでもらうとして…
PICの基本構造を決める「Configuration Bits」の設定
データシートを読んでPICにどんな初期状態にしたいか決めるところなんですけど、最初は簡単に。
・FOSC – 動作クロックの指定、内部クロックでGP4(3番ピン)は入出力に使用
・WDTE – ウォッチドックタイマーの指定、使わない
・PWRTE – 電源On時の動作指定、使う
・MCLRE – 4番ピンの動作指定、リセットは使わない
・CP/CPD – PICからの内容読出し保護、保護しない
・BOREN – ブラウンアウト時の動作指定、使わない
・IESO – 外部クロック使用時の動作指定、内部クロック使用するから使わない
・FCMEN – クロックダウン時の動作指定、内部クロック使用するから使わない
ってわけで、指定は、
・FOSC – INTOSCIO
・WDTE – OFF
・PWRTE – ON
・MCLRE – OFF
・CP/CPD – OFF
・BOREN – OFF
・IESO – OFF
・FCMEN – OFF
「入門ガイド」に従って、「Generate Souce Code to Output」を押下し作成されたコードをmain.cにコピペする、全選択でコピペすると「#include <xc.h>」もコピーされるから「// CONFIG」以降を利用するのが吉。
つぎは仕様の決定
・内部クロックを4MHzに指定
・入出力PIN(2から7ピン)の動作指定で、2番ピンはLEDの緑・3番ピンは青・5番ピンは赤に繋がっている
・電源投入時に全部消灯でXXXms、次に各色を1秒ずつ光らせて最後に全部光らせるを繰返す
使うレジスタは
・OSCCON – 動作クロックの指定、4MHzで
・ANSEL – アナログ入力ピンの指定、全てデジタルそして出力
・TRISIO – 各ピンの入出力ピンの指定、全部出力
値は
・OSCCON – 0b0110 0000
・ANSEL – 0b0000 0000
・TRISIO – 0b0000 1000(GP3は入力専用なので備忘的に’1’にした)
ソースファイルは以下になる。(うゎー、ソースコード表示するプラグイン入れてなかった。)
/*
* File: main.c
*
* PIC12F683_LED_test.c
*/
#include <xc.h>
// CONFIG
#pragma config FOSC = INTOSCIO
#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 IESO = OFF
#pragma config FCMEN = OFF
#define _XTAL_FREQ 4000000 // __delay_ms()が__delay()関数に置換えるのに必要)
void main(void)
{
OSCCON = 0b01100000; // 内部クロックの指定 4MHz
ANSEL = 0b00000000; // アナログ入力の指定 すべてデジタル出力
TRISIO = 0b00001000; // 入出力方向の指定 すべて出力
while (1) { // 無限に繰り返す
GP2 = GP4 = GP5 = 0; // すべて消灯
__delay_ms(100); // 100ms間消灯
GP2 = 1; // 赤を点灯
__delay_ms(1000); // 1秒間点灯
GP2 = 0; // 赤を消灯
GP5 = 1; // 緑を点灯
__delay_ms(1000); // 1秒間点灯
GP5 = 0; // 緑を消灯
GP4 = 1; // 青を点灯
__delay_ms(1000); // 1秒間点灯
GP2 = GP5 = 1; // 全部点灯
__delay_ms(1000); // 1秒間点灯
}
return;
}
やっとコンパイル
メニューバーの所にある「トンカチ」アイコンをクリックしてエラーが無ければOK。最初は「_XTRAL_FREQ」定義の意味がわからなくてエラーを出していた、_delay関数のラップ定義でコンパイル時に_delya関数に置換える時に必要となり、OSCCONで設定した値を定義します。左上の「Files」タブからbuild->default->production->main.preでプレコンパイルしたCのソースで展開したCソースが見れます。
さ〜LEDを光らせるぞ!!!
PCとPICkit3を専用ケーブルで接続しブレッドボードに用意したピンヘッダーにPICkit3を差込む、前回のブレッドボード写真で一番右側のピンヘッダーがPICKit3の1番になりますよ。
おっと、PICKit3から電源を供給しなければ。
プロジェクト名(PIC12F683_LED_test)を右クリックしポップアップメニュー一番したの「Properties」をクリック、ダイアログでPICkit3から「Option categories」で「Power」えらんで、「Power target circuit from PICkit3」をチェック、「Voltage Level」を5Vに、で「OK」
書込みアイコンをクリックすればPICにプログラムが書込まれ、しばし待つと意図した通りにLEDが点滅するハズ。
次回からは「瓶に入れるLEDライト」の制作を始めよう。