PICのプログラムの基本構成
前回は実際にPICへプログラムを書き込んでみました。今回は、前回書いたプログラムの全体像の解説をしていきます。
PICのプログラムは、普通のC言語とは異なる箇所があります。プログラムの上から順に
- config部分
- 関数部分(レジスタ等)
- main関数
となっているのが基本です。
config部分
configとは「PICの基本設定」です。
PICは元々様々な機能が付いています。例えば、watchdog timer。日本語でいえば「番犬タイマー」となりますかね。これは、ある周期でwatchdog timerが信号を送ってくれ、それを番犬的なプログラムが監視してくれる機能です。もしPICが動作を停止したら番犬が「いつも来る信号来ないしPIC死んだわ…」と判断し、ユーザーが決めた対処(例えば再起動するなど)をしてくれる機能です。便利~(?)
他にもクロック数(処理能力と思えばOk)を4倍にする機能などが付いています。しかし、これらが機能していると電力を消費します。なので、PICではユーザーがこれらの機能をオンオフできるようになっています。
この設定をconfigと呼びます。configurationの略ですね。スマホで例えるなら、指紋認証装置は待機しているだけで電気使うから引っこ抜けるようにしたよ!ぐらい大事と思って貰えれば。それぐらい、自分の用途に合った使い方ができるようになっています。
以下に、config部分を示します。「こんなの覚えられない」と思うでしょう。覚える必要は全くありません。MPLAB X IDEではクリックでポチポチして設定できるのです。やり方は次回説明します。
// CONFIG1
#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 = OFF // MCLR Pin Function Select (MCLR/VPP pin function is digital input)
#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 = OFF // Brown-out Reset Enable (Brown-out Reset disabled)
#pragma config CLKOUTEN = OFF // Clock Out Enable (CLKOUT function is disabled. I/O or oscillator function on the CLKOUT pin)
#pragma config IESO = OFF // Internal/External Switchover (Internal/External Switchover mode is disabled)
#pragma config FCMEN = OFF // Fail-Safe Clock Monitor Enable (Fail-Safe Clock Monitor is disabled)
// CONFIG2
#pragma config WRT = OFF // Flash Memory Self-Write Protection (Write protection off)
#pragma config VCAPEN = OFF // Voltage Regulator Capacitor Enable (All VCAP pin functionality is disabled)
#pragma config PLLEN = OFF // PLL Enable (4x PLL disabled)
#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 = ON // Low-Voltage Programming Enable (Low-voltage programming enabled)
関数部分(レジスタ)
次に、レジスタの説明です。また訳の分からん横文字が出てきました。これは字のごとくresistered(登録済み)の変数のことだと思ってください。
またスマホで例えると、レジスタはWiFiやGPSなどの元からある機能の設定を変える変数です。configに似ていますが、最大の違いはプログラムの途中で設定が変えられるという点にあります。
WiFiをオンにしたいとき、画面上から設定画面を引っ張ってきてWiFiのマークをタップしてオンにしますね。その時、WiFiのレジスタをWIFI_ONOFFとすると、
//タップしてWiFiをオンにした時
WIFI_ONOFF = 1;
//WiFiをオフにしたとき
WIFI_ONOFF = 0;
という処理が行われています。
このように、PICに備わっている機能を使いたいときはレジスタの設定をします。このレジスタの詳細はデータシートに載っています。次回、今回のプログラムで使ったレジスタを詳細に紹介します。
void PICinit(){
OSCCON = 0b01110000 ; // 内部クロックは8MHz
ANSELA = 0b00000000; // ANを全てオフ
TRISA = 0b00000000; // RAピンは全て出力
TRISB = 0b00000000; // RBピンは全て出力
TRISC = 0b00011000 ; // RC3/RC4は入力
PORTA = 0b00000000; //RA出力ピンを初期化(LOW)
PORTB = 0b00000000; //RB出力ピンを初期化(LOW)
PORTC = 0b00000000 ; // RC出力ピンを初期化(LOW)
OPTION_REG = 0b00000000 ; // デジタルI/Oに内部プルアップ抵抗を使用する
return;
}
上記のPICinit()関数内の大文字の変数(OSCCON等)は全てレジスタです。
main関数
設定が終わったあと、実際のプログラムを書く部分です。config以降は普通のC言語なので、いつものループ文などが書けます。
int main(void){
PICinit(); //PICを初期化
while(1){
RA1 = 1; //RA1のピンをHIGH
__delay_ms(200); //200ms遅延
RA1 = 0;
__delay_ms(200);
}
return 0;
}
実は、上記のRA1もレジスタです。RA1はデータシート上の3番ピンの機能欄に書いてあります。RA1に1を代入すると、3番ピンがオンになり、5Vの電圧がかかるようになるというわけです。まさに、WiFiをタップでオンにするのに似ています。非常に簡単です。
同様に、15番ピンをオンにしたければRC4 = 1;とすればいいわけです。
ここまでざっとプログラムを見てみました。次は、実際に1からこのプログラムを書いてみましょう。次→PICのLED点滅プログラム(Lチカ)を1から書いてみる
ピンバック: Wak-tech » PICのLED点滅プログラム(Lチカ)を1から書いてみる
ピンバック: Wak-tech » PICにプログラムを書き込んでみよう②~PICkit3での書き込み回路・書き込み方~
ピンバック: PICマイコンに素数を計算させてみた
このサイトを見つけてから電子回路にとても興味を持てるようになりました。ありがとうございます。今日は質問があります。大昔、マイコン 今のpicだと思いますが、はやっていた頃、プログラムはアセンブラで作っていたとおもいます。私もかじったのですが レジスタがどうの、move がどうの。で挫折しました。しかしwak techさんのpic サイトではc 言語でかかれていますね。これはアセンブラより遥かにわかりやすいですが 今ではpicプログラミングはc言語で作るのが主流なのでしょうか。そうだといいのですが。
本当にわかりやすいサイトを作っていただきありがとうございます。
いつもコメントありがとうございます…!励みになります。
そうですね、私が5年前に触れたときには、やはりアセンブラの解説本が多く、私もMOVFとかCLRFとか全然理解出来ませんでした。今はMPLABのXCコンパイラが非常に優秀かつCで書いても有り余るほどのフラッシュメモリの容量がありますので、確実にC言語優位だと思います。
素晴らしいサイトを作っていただきありがとうございます
初心者の私はwak tech様のページをたどりながらpicを勉強しておりますが
引っかかり、挫折しかけたことがありましたので報告します
PICマイコンにプログラムを書き込んでみよう①~MPLAB X IDEの使い方~【PIC16F1938
ですが 最後のところでエラーがでてビルド出来ず 表示されるメッセージも英語のため読めず
xplab xc8 コンパイラを 何度もアンインストール インストールしました。
いろいろ調べたところ c90 c99が原因とわかり 変更すると ビルド出来るようになりましたので 報告します。
参考ページを下記に書きます
*********************************************************
MPLAB X IDE v5.xxと8ビットPICマイコン用のCコンパイラーであるMPLAB XC8 v2.xxを組み合わせて使うとき「#include 」の行に、図2-7-1-1のようなヒントが表示され、ビルド時にコンパイルエラーとなる場合があります。
https://sanuki-tech.net/pic/development/cannot-find-include-file/
*************************************************
そんな問題が生じていたんですね、教えていただき大変感謝いたします。
お教えいただいたサイトのリンクを当該記事のビルド辺りに追加させていただきました!
今後もこのようなことがあれば遠慮なくコメントしてください。
ピンバック: 動けばいい人のためのPICマイコン入門 | Wak-tech