mplabでPICマイコンプログラミング 〜後編〜

前編ではプログラミングに必要なソフトのダウンロードからインストールまで行い、PIC初期設定まで終わりました。 前編はこちら   今回は、プログラミングからPICに書き込みまで行い、PICを実際に動かすまでについて簡単に説明していこうと思います。   今回はPICマイコンの練習でおこなったプログラムを少し解りやすいように変えてプログラム説明を行います。
目次
 

まずはプログラムの書き方

決まり事その1

決まり事その2

決まり事その3

決まり事その4

C言語の主な文法

delay関数について

コンパイルを行う

PICマイコンにプログラムを書き込む

実際にうごかしてみてデバックする

スポンサードリンク

まずはプログラムの書き方

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; と最初に0b0xや何もつけなくてもOKとかいう決まりがあります。 ちなみにですが、2進数表記では右端から下位のビットになります。 たとえばPICのポートBは0から7の8ビット(8ポート)あります。 かりにPORTB = 0b01000001; という値をポートBに出力したら、ポート0と6は1なので出力(電源電圧が出力される)の状態、それ以外は0なので0Vの状態と言えます。  

決まりごとその4

メインプログラムの先頭ではPICの入出力や色々な事がらを設定する。 今回はPIC16F84AでLEDを光らせるだけなのでポートの入出力設定だけを設定します。 他にも割り込み設定なんかがあります。   PIC16F84Aでのポート入出力設定はTRISATRISBでポートの入出力の設定を行えます。 出力設定は01で設定でき、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に直接書き込む為に機械語に翻訳しなければなりません。 その変換の事をコンパイルするといったりします。 さぁ早速コンパイルしてまみしょう。 といっても簡単で、プログラミングができたら、下図の赤枠の金槌(かなづち)マークを押すだけでコンパイルが実行されます。 スクリーンショット 2016-01-07 16.35.41   正しくコンパイルできたらこうなります。 スクリーンショット 2016-01-07 16.43.45 build successful (total time:XXs) とコンパイルがうまくできたら、ビルド完了と英語で教えてくれます。 もしビルドが成功しなかった場合はどこに原因があるのかを行番号とともに教えてくれるのでそれを参考にすると良いでしょう。 何気ないミスでもビルドできません、たとえば; が抜けていたり、カッコがなかったり全角でスペースを打っていたりとか・・   またビルドしてできたファイルは ユーザー下のどこかにMPLABXProjects→任意のプロジェクトファイル→dist→default→production→プロジェクト名.hexファイルが作成されているはずです。 この.hexファイルをPICに書き込んでいきます。      

プログラムをPICに書き込む

ビルドも成功してあとは書き込むだけです。 今回私の場合は、秋月電子のAKI-PICプログラマーを使用しました。 ですので書き込むソフトも秋月電子から調達しています。 ソフトはこちらからダウンロードできます。(無料です) スクリーンショット 2016-01-07 17.05.54 PICPGM6.exeをダウンロードして、PICプログラマーのフォームウェアのアップデートも完了させました。詳しくは秋月電子のホームページを熟読してください。   パソコンとプログラマーの接続は秋月電子の説明書どおりに行います。 うちのPCはRS-232Cがいまだについていたのでそこに接続しました。 USBでRS-232C変換できるものもあるので、RS232Cが最悪なくても大丈夫です。 スクリーンショット 2015-11-20 01.35.41 ソフトとプログラマーの通信が確率できるとメッセージ欄に接続OKとメッセージがでます。   次に任意にHEXファイルを選択します。 場所はユーザー下のどこかにMPLABXProjects→任意のプロジェクトファイル→dist→default→production→プロジェクト名.hex にあります。   次にデバイスを任意のPICデバイスを選択します。 今回はPIC16F84AでプログラムしているのでデバイスはPIC16F84Aを選択しています。   コンフィグ設定がプログラムで記述したとおりになっている事を確認してPICマイコン情報という小さい画面のとおりにマイコンをプログラマーにセットします。 セットが完了したら、プログラムというボタンをクリックします。   クリックしたら下図のような画面が現れる事があります。はいをクリックすると書き込みがはじまります。 スクリーンショット 2015-12-10 20.46.44     書き込み完了です。 メッセージに書き込み完了!!と出ています。 スクリーンショット 2015-12-11 07.09.54    

実際に動かしてみてデバック

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

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください