今回は、MCCと比較のための手書きプログラム(?)を作成します。
目次
手書きの場合のプロジェクト構成
次回以降の記事で、MCCを使用したプログラムを作成しますが、比較のために同じ内容のプログラムを自分で書いた場合どうなるか、確認しておきます。
前回の記事で作成した「MCCTest」プロジェクトとは別に、新規プロジェクトを作成します(「Test」プロジェクトなど適当な名前で構いません)。次に、プロジェクトフォルダの中の「Source Files」フォルダ内に「main.c」ファイルを作成します。
簡単な内容のプログラムであれば、このmain.cファイル内に全てのコードを書きますので、プロジェクトとしてはこのmain.cファイルのみという構成になります。
MCCでプログラムを自動生成した場合、main.cファイル以外にいろいろなファイルが作成されますので、この基本構造と比較する形で説明を読み進めていただければと思います。
手書きの場合のプログラム
例題としては、RA2ピンに接続されている2個のスイッチの片方を押すとLED点灯、もう片方を押すとLED消灯、という動作にします。
具体的な動作としては、RA2ピンの電圧値をADコンバータで読み取り、その値に応じてLEDを点灯、消灯どちらかの動作をする、というものです。
手書きでプログラムを作成する場合、例えば以下のようになります。
/*
* File: main.c
* 内容:
* MPLAB Code Configuratorのプログラムと比較するための手書きプログラム
* RA2ピンに接続しているスイッチ状態をADコンバータで読み取り
* 片方のスイッチはLEDオン、もう片方のスイッチはLEDオフの動作
*/
#include <xc.h>
#include <stdbool.h>
// PIC12F1822 Configuration Bit Settings
// 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 = 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 = 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 PLLEN = OFF // PLL Enable (4x PLL disabled)
#pragma config STVREN = OFF // Stack Overflow/Underflow Reset Enable (Stack Overflow or Underflow will not 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)
// クロック周波数指定
// __delay関数が使用する
#define _XTAL_FREQ 1000000
void main(void) {
// PICマイコン設定
OSCCON = 0b01011010; // 内部クロックを使用、周波数を1MHzに設定
ANSELA = 0b00000100; // RA2ピンをアナログ、それ以外のピンはデジタルに設定
TRISA = 0b00001100; // RA2とRA3を入力、それ以外は出力に設定
// ADコンバータ設定
ADCON0 = 0b00001001; // RA2(AN2)をADコンバータピンに設定し、ADコンバータ機能をEbableにする
ADCON1 = 0b10000000; // 結果数値は右寄せ、ADコンバータクロックはFOSC/2、基準電圧はVDD
// LEDを点灯する
LATA5 = 1;
// ブザーをOFFにする
LATA4 = 0;
// スイッチ状態に応じたLED点滅制御を行う
while(true){
// ADコンバータ読み取り開始
GO = 1;
// 読み取り完了待ち
while(GO);
// 読み取りが終わると結果の数値はADRESレジスタに入っている
// ADRESの数値に応じてLEDのON/OFF制御を行う
//
// LEDオンの処理
// (ADコンバート値が250未満の場合)
if( ADRES < 250 ) {
LATA5 = 0;
} else {
// LEDオフの処理
// (ADコンバート値が250以上750未満)
if( 250 <= ADRES && ADRES < 750 ) {
LATA5 = 1;
}
}
}
return;
}
手書きプログラムのポイント
この手書きプログラムのポイントを以下に説明します。
- ヘッダファイルのインクルード
ヘッダファイルは、デフォルトで「xc.h」、その他必要なヘッダファイルをインクルードします。 - コンフィグレーション設定
PICマイコンの場合、マイコンの基本的な動作仕様を指定するために必ずコンフィグレーション設定が必要になります。この例では、main.cに書いていますが、別途ヘッダファイルに書いてそれをインクルードすることもあります。 - 動作設定
マイコンの周波数設定やピンの属性設定などは、それぞれの設定を行うレジスタに数値を代入することにより行なっています。このような設定を行う場合、データシートでどのレジスタにどのような値を設定すればよいか、調べながらプログラムを作成していきますが、結構面倒なんですよね。 - 機能の実装
今回の例題はADコンバータを使用しますが、ADコンバータを使用する場合、先ほどと同様に該当するレジスタに数値を代入することにより行います。複雑な機能の場合、設定レジスタが多く、また難解な場合もあり、心が折れそうになることがしばしばです。
というわけで手書きの場合、簡単なプログラムはそれほど負担ではありませんが、複雑な機能を使用する場合、レジスタの設定やら各種機能の使い方やら、いろいろとデータシートを調べることが多く、心が折れそうになる、という結論です。
次回以降の記事でMCCを使ってプログラムを作成していきます。
更新履歴
日付 | 内容 |
---|---|
2017.12.7 | 新規投稿 |
2017.12.2 | プログラムテンプレートをMPLABX IDE v5.10のものに変更 |