目次
スポンサードリンク
まずはプログラムの書き方
C言語でプログラミングするという事はきまった文法があるという事です。 私たちが日本語を使うようにC言語でmplabxIDEを使ってPICプログラムするには一定の決まり事のなかでプログラムしなければにゃりません。決まりごとその1
メインプログラムはこのように書く void main(void){ } ここで説明を加えると{}このカッコでかこまれた中にメインのプログラムを書いていきます。 この{}の中のプログラムが実行される事ににゃるのです。 voidとかは今はおまじないと思ってください。型といいますが今は別に覚えなくてもOKです。 今回はPICを動かす事に集中しましょう。決まりごとその2
プログラムは;で区切られます。これで区切られるとプログラムはそこで終わりという意味です。 また//のあとに書いた文章は文字として扱われます。(プログラムとは関係ない) /* から */でかこまれた文章は文字(プログラムとは関係ない)として扱われます。決まりごとその3
PICでは数を扱うとき 2進数、16進数、10進数 の記述方法があります。 たとえばAという8bit(1bitは0と1を表せ、それが8つある)の変数に0を代入するとき 2進数なら A = 0b00000000; 16進数なら A = 0x00; 10進数なら A = 0; と最初に0bや0xや何もつけなくてもOKとかいう決まりがあります。 ちなみにですが、2進数表記では右端から下位のビットになります。 たとえばPICのポートBは0から7の8ビット(8ポート)あります。 かりにPORTB = 0b01000001; という値をポートBに出力したら、ポート0と6は1なので出力(電源電圧が出力される)の状態、それ以外は0なので0Vの状態と言えます。決まりごとその4
メインプログラムの先頭ではPICの入出力や色々な事がらを設定する。 今回はPIC16F84AでLEDを光らせるだけなのでポートの入出力設定だけを設定します。 他にも割り込み設定なんかがあります。 PIC16F84Aでのポート入出力設定はTRISA とTRISBでポートの入出力の設定を行えます。 出力設定は0と1で設定でき、0だと出力、1だと入力になります。 今回のプログラムではこのように書いてます。 void main(void) { TRISB = 0b00000000; /*RBポートをすべて出力としてつかいますよというかならず書かないといけないもの。*/ PORTB = 0b00000000; //とりあえずポートBに0をいれてキレイにする while(1){ //wile(x)はxが1なら永遠{ }でかこんだ処理をくりかえしますよ。 //wile(1)なんで有無を言わさず無限ループ PORTB = 0b11111111; /*RBはRB0-RB7まで8ポートあり、右はしからRB0-RB7とならんでます、まずポートBを全点灯します。ちなみにですが1を設定するとTRISBで全ビット出力に設定しているのでPORTBに1を入力すると電源電圧の5Vがポートに出力されます。 ですのでLEDをつないておくと光るというわけです。*/ __delay_ms(20); ///*20msec待ちます これは特殊な関数でmplabに依存する関数です。ソフト環境によっては使えない場合があります。他にも__delya_us(X)があります。 このディレイ関数がうまくコンパイルできないときはこちらを参照してください。 私も同様にコンパイルできませんでしたが、解決しました。*/ PORTB = 0b00000000; /*上記の点灯から20msec後にポートB全ビット0を入力します。したがってポートBはすべて0VになりLEDは消灯します。wileで繰り返しているので永遠20msec毎に点灯を繰り返すというプログラムになります。*/ } return; /*returnはお決まり文法で値を返すという意味でリターンです。今回はVoid(なにもなしで返り値ない)なのでリターンでも値はかえりません。意味がわからないと思いますが、一種のおまじないと思って結構です。お決まりの文法と今は考えておいて後で理解すればいいだけの話です。*/ } これでおおまかなプログラミンの記述方法は終わりです。 実際にプログラムを下記に書いておきます。これはPICマイコンの練習で記述した内容と同様です。// PIC16F84A
// #include <xc.h>
// // // CONFIG // // //
#pragma config FOSC = HS // 高周波発振 セラミック振動子をつかいますよー
#pragma config WDTE = OFF // ウォッチドックタイマはつかいませんよー
#pragma config PWRTE = OFF // パワーアップタイマーはつかいませんよー
#pragma config CP = OFF // こーどプロテクトもしませんよーというおまじない
#define _XTAL_FREQ 10000000 //マイコンが動くクロックを10mhzに設定しますよー
void main(void) {
TRISB = 0b00000000; //RBポートをすべて出力としてつかいますよー
PORTB = 0b00000000; //とりあえず0を入れてクリアしときますよー
while(1){
//wile(x)はxが1なら永遠{ }でかこんだ処理をくりかえしますよ。
//wile(1)なんで有無を言わさず無限ループ
PORTB = 0b10000000; //RBはRB0-RB7まで8ポートあり、右はしからRB0-RB7とならんでます
//んでまずRB7を出力して
__delay_ms(20); //20msec待ちます
PORTB = 0b01000000; //順番に点灯させていきます。20msec毎にLEDが順番に光る
__delay_ms(20);
PORTB = 0b00100000;
__delay_ms(20);
PORTB = 0b00010000;
__delay_ms(20);
PORTB = 0b00001000;
__delay_ms(20);
PORTB = 0b00000100;
__delay_ms(20);
PORTB = 0b00000010;
__delay_ms(20);
PORTB = 0b00000001;
__delay_ms(20);
PORTB = 0b00000010;
__delay_ms(20);
PORTB = 0b00000100;
__delay_ms(20);
PORTB = 0b00001000;
__delay_ms(20);
PORTB = 0b00010000;
__delay_ms(20);
PORTB = 0b00100000;
__delay_ms(20);
PORTB = 0b01000000;
__delay_ms(20);
PORTB = 0b10000000;
__delay_ms(20);
}
return; //returnはお決まり文法
}
|
C言語の主な文法
ソースのなかでwile文がでてきましたが、他にもfor分や if など便利な関数がたくさんあります。 ここでは詳しく書きませんが、こちらのサイトはすごくわかりやすくまとめられています。 制御構造のところだけで良いです。あとのところはPICマイコンでは特に必要ありません。delay関数
本文中でも記述しましたが、これはソフトウェアにくみこまれた関数で実はXC.hのなかに記述されています。 なぜかmplabxではコンパイルするとこの関数が見つからないとなって私の場合使えませんでした。しかしこの関数ものすごく使いやすいのでなんとか使えないものかと解決策をさがしていたら、解決策がありました。 ようは”何をすれば良いかと云うと、xc.hはpic.hを参照します。このMicrochip XC8の中の include フォルダ内の pic.h の146行から始める #ifdef __PICCPRO__ の行を #ifdef __PICC__と編集して、MPLAB X を再起動すれば、もはやこの警告は出なくなります。”を行うだけです。 xc.hを参照する方法はメインソースで記述されている(インクルードされている)xc.hの文字の上で右クリックをして上記解決策のとおり実行してやると解決します。コンパイルを行う
C言語でのプログラミングができたら、こんどはそれをPICに直接書き込む為に機械語に翻訳しなければなりません。 その変換の事をコンパイルするといったりします。 さぁ早速コンパイルしてまみしょう。 といっても簡単で、プログラミングができたら、下図の赤枠の金槌(かなづち)マークを押すだけでコンパイルが実行されます。

プログラムをPICに書き込む
ビルドも成功してあとは書き込むだけです。 今回私の場合は、秋月電子のAKI-PICプログラマーを使用しました。 ですので書き込むソフトも秋月電子から調達しています。 ソフトはこちらからダウンロードできます。(無料です)



実際に動かしてみてデバック
無事書き込みが完了したならプログラムが正しく動くかPICに電池やLEDなどをとりつけて実際にうごかしてみてください。 思い通りに動かず、ウンともスンとも言わない時だってあります。 どこかがおかしいのです、もう一度プログラムを見直してカット&トライで正しく動くまで根気よくデバック(原因を取り除く事)しましょう。
スポンサードリンク