前回プロジェクトを作成して設定まで終わったのでいよいよプログラミングに入ります。PIC の第一の関門であるコンフィギュレーションも順を追ってやっていけば簡単にできます。
前回の記事はこちら
コンフィギュレーション
プログラムを書く前にコンフィギュレーションの設定を記述しなければなりません。
コンフィギュレーションとは、簡単に言うとクロック源の設定や WDT(Watch Dog Timer)といったハードウェアの設定のことです。
MPLAB X IDE ではコンフィギュレーションビットが一覧となって設定できる機能があるのでそちらを利用します。
ツールバーの Production > Set Configuration Bits を開きます。
画面下部に設定ウィンドウが表示されるのでそこで設定をします。
PIC の種類によって設定できる項目は違うのですが、基本的には以下の3点を設定すれば大丈夫です。
- FOSC : INTOSC (内蔵発振器使用)
- WDT : OFF (ウォッチドッグタイマー不使用)
- LVP : OFF (低電圧プログラミング不使用)
まずは PIC の動作に必要なクロック源の設定です。時計に使ったりなど高精度のクロックが必要な場合を除けば、内蔵発振器で動作させるのが簡単です。
ウォッチドッグタイマーとは、一定時間プログラムからタイマーにアクセスがない場合(意図せず無限ループにはまっている場合など)にハードウェア的に強制的にリセットをかける機能です。
製品に組み込む場合には動作が停止しては困るので使うことがあるかもしれませんが、実験段階ではこれのせいでプログラムが走らなかったりするので OFF にしておいた方が安全です。
低電圧プログラミングはプログラムを書き込むときに、通常は高電圧をかけて PIC を書き込みモードにするのに対して、高電圧をかけずに特殊なプロセスによって書き込みモードにする機能です。
通常の書き込みで特に問題はなく、余計な設定もいらないので 低電圧プログラミング も OFF にしておきます。
以上を設定したら下にある Generate Source Code to Output と書かれたボタンを押します。
すると、Output のタブにテキストが出力されるので、これを丸ごとコピーして mainファイルの先頭に貼り付けます。
余計なコメントは削除して構いません。また、
#include <xc.h> は最初から書かれているので2回書かないようにしてください。
以上でコンフィギュレーションの設定は完了です。
初期設定
コンフィギュレーションの設定に続いて、初期設定をする必要があります。
これはどういうものかというと、IO ピンの入力/出力の設定や、デジタル/アナログの設定などです。
その前にまずはデータシートで IOピンの場所を確認しましょう。ちょっとスクロールしたところにお目当ての図がありました。
なにやらいっぱい書いてありますが、RAx や RBx と書かれているのがピンの名称です。ピンはポートA、ポートB というように8個セット(場合による)で管理されます。
入出力設定
まずはピンの入出力を設定しましょう。これは TRISA/TRISB レジスタで管理されます。それぞれが ポートA、ポートB に対応し、各レジスタの上位ビットから Rx7, Rx6, … Rx0 に対応します。
このビットが0だと出力に、1だと入力になります。
例えば、下図のようになります。
今回は入力は使わないので全部出力に設定しておきます。(MCLR の RA5 は入力専用ピンです)
TRISB = 0b00000000;
デジタル/アナログ設定
デジタル/アナログは ANSELA/ANSELB レジスタで設定します。各ピンとビットの関係は先程と同様です。
対応するビットが0だとデジタルに、1だとアナログになります。
今回はすべてデジタルのままにしておきます。
ANSELB = 0b00000000;
その他設定
PIC の種類にもよりますが、内蔵発振器の周波数を設定できたり、WPU(Weak Pull Up)の設定ができたりします。
これらの機能を使う場合には設定が必要ですが、何もしなくてもデフォルトの値が設定されるので、PIC が動かないということにはなりません。(上記二つも同じですが、使わない場合にも明示的に書いておいた方がよいと思います。)
今回はクロック周波数を 1MHz に設定したいと思います。この設定は OSCCON レジスタで行います。(データシートP67 参照)
レジスタの中で一部だけ値を変更したいときは、bits.xx を付けることによってそこだけアクセスできます。(ビットフィールドという構造体の一種です)
_XTAL_FREQ
こちらは初期設定とは異なりますが、一緒に紹介します。
Crystal Frequency すなわちクロックの周波数を #define で定義しておきます。これを定義しておかないと、delay関数などが使えなくなるので必ず定義しておきましょう。
実際と異なる値に定義してしまうと、delay関数の待ち時間がずれてしまうのでちゃんと設定しましょう。
今回は 1MHz に設定したのでそれに合わせて記述します。
0の数を間違えないように気を付けましょう(笑)
ここまでで以下のようなコードとなります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
#pragma config FOSC = INTOSC // Oscillator Selection (INTOSC oscillator: I/O function on CLKIN pin) #pragma config WDTE = OFF // Watchdog Timer Enable (WDT disabled) #pragma config PWRTE = OFF // Power-up Timer Enable (PWRT disabled) #pragma config MCLRE = ON // MCLR Pin Function Select (MCLR/VPP pin function is MCLR) #pragma config CP = OFF // Flash Program Memory Code Protection (Program memory code protection is disabled) #pragma config CPD = OFF // Data Memory Code Protection (Data memory code protection is disabled) #pragma config BOREN = ON // Brown-out Reset Enable (Brown-out Reset enabled) #pragma config CLKOUTEN = OFF // Clock Out Enable (CLKOUT function is disabled. I/O or oscillator function on the CLKOUT pin) #pragma config IESO = ON // Internal/External Switchover (Internal/External Switchover mode is enabled) #pragma config FCMEN = ON // Fail-Safe Clock Monitor Enable (Fail-Safe Clock Monitor is enabled) #pragma config WRT = OFF // Flash Memory Self-Write Protection (Write protection off) #pragma config PLLEN = ON // PLL Enable (4x PLL enabled) #pragma config STVREN = ON // Stack Overflow/Underflow Reset Enable (Stack Overflow or Underflow will cause a Reset) #pragma config BORV = LO // Brown-out Reset Voltage Selection (Brown-out Reset Voltage (Vbor), low trip point selected.) #pragma config LVP = OFF // Low-Voltage Programming Enable (High-voltage on MCLR/VPP must be used for programming) #include <xc.h> #define _XTAL_FREQ 1000000 void main(void) { TRISA = 0b00100000; TRISB = 0b00000000; ANSELA = 0b00000000; ANSELB = 0b00000000; OSCCONbits.IRCF = 0b1011; // 1MHz return; } |
プログラミング
さていよいよプログラミングです。といっても今回はLチカさせるだけなのでほんの数行しかありませんが。
今回は RA0 ピンを使ってLチカします。
いきなり完成形を紹介しましょう。
1 2 3 4 5 6 |
while(1){ RA0 = 1; //RA0をONに __delay_ms(500); //500ms = 0.5s待つ RA0 = 0; __delay_ms(500); } |
これだけです。出力ピンの ON/OFF を切り替えるには、0か1を代入するだけで大丈夫です。
__delay_ms() は指定した時間何もせずに待機します。ミリ秒単位で整数値で指定できます。最初の_は2個なので注意してください。
これを while(1) で無限ループさせます。無限ループから出ることはないので、元から書いてあった return; はなくて大丈夫です。
というわけで今回のソース全体はこのようになりました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
#pragma config FOSC = INTOSC // Oscillator Selection (INTOSC oscillator: I/O function on CLKIN pin) #pragma config WDTE = OFF // Watchdog Timer Enable (WDT disabled) #pragma config PWRTE = OFF // Power-up Timer Enable (PWRT disabled) #pragma config MCLRE = ON // MCLR Pin Function Select (MCLR/VPP pin function is MCLR) #pragma config CP = OFF // Flash Program Memory Code Protection (Program memory code protection is disabled) #pragma config CPD = OFF // Data Memory Code Protection (Data memory code protection is disabled) #pragma config BOREN = ON // Brown-out Reset Enable (Brown-out Reset enabled) #pragma config CLKOUTEN = OFF // Clock Out Enable (CLKOUT function is disabled. I/O or oscillator function on the CLKOUT pin) #pragma config IESO = ON // Internal/External Switchover (Internal/External Switchover mode is enabled) #pragma config FCMEN = ON // Fail-Safe Clock Monitor Enable (Fail-Safe Clock Monitor is enabled) #pragma config WRT = OFF // Flash Memory Self-Write Protection (Write protection off) #pragma config PLLEN = ON // PLL Enable (4x PLL enabled) #pragma config STVREN = ON // Stack Overflow/Underflow Reset Enable (Stack Overflow or Underflow will cause a Reset) #pragma config BORV = LO // Brown-out Reset Voltage Selection (Brown-out Reset Voltage (Vbor), low trip point selected.) #pragma config LVP = OFF // Low-Voltage Programming Enable (High-voltage on MCLR/VPP must be used for programming) #include <xc.h> #define _XTAL_FREQ 1000000 void main(void) { TRISA = 0b00100000; TRISB = 0b00000000; ANSELA = 0b00000000; ANSELB = 0b00000000; OSCCONbits.IRCF = 0b1011; // 1MHz while(1){ RA0 = 1; //RA0をONに __delay_ms(500); //500ms = 0.5s待つ RA0 = 0; __delay_ms(500); } } |
プログラムが出来たら書き込みの前にビルドをする必要があります。
ツールバーにあるビルドボタンを押します。
プログラムが正常であれば Output ウィンドウに BUILD SUCCESSFUL と表示されます。
何らかのエラーがあれば、その位置とともに教えてくれます。
今回はプログラムをビルドして完成させるところまでやりました。次回はこのプログラムを PIC に書き込んで、ついに目標のLチカです。
こんばんは
PIC超入門!ゼロからLチカまでの道【その3:コンフィギュレーション~プログラミング】
にあります、「LVP : OFF (定電圧プログラミング不使用)」
ですが、低いほうの電圧で低電圧プログラミング のことでしょうか?
それと、先程コメントしました件ですが、
書いてあるのをよく読んで進めますと、無事にノーエラーと成りました。
ただ、MCLRの設定をせず、すべてのポートは出力にしました。
後は、書き込みデータはどの様に出て来ますのでしょうか?
書き込みツールはPICerFTと云うHEXを投入する方式です。
https://tinyurl.com/nlq7a3x
ありがとうございました
ご指摘ありがとうございます。記事を修正しました。
問題も自力で解決できたようでよかったです。
プロジェクトを右クリックしてHEXファイルを無事出力できました。
ありがとうございます