PICのC言語開発環境でのLチカプログラミング

本サイトのページ「MPLAB X IDEでのPICプログラム開発手順(その1)」の続きとして、構築したPIC用開発環境を使って、実際にC言語(MPLAB XCコンパイラ)によるLチカプログラミングを試してみた。

ちなみに、”Lチカプログラミング”というと、初心者プログラムの第一歩として、あらゆるマイコンの入門書の最初にはほとんどといっていいほど採用されている。

C言語の学習で最初に入力するプログラム、(printf関数を使った)”Hello,world!”表示プログラムと同じような扱いであるが、実際のところ、それ以上に有意義なもので、これができれば、マイコンの初期設定、入出力ポート設定、出力ポートからのデータ出力(電子回路的にも、マイコンのヘルスチェック、マイコン周りの配線確認としても)とマイコン制御の最低限ができるというとになり、” printf関数 ”以上に実践レベルである。

なので、これは今後あらゆる型番のPICマイコン(PIC以外のマイコンでも)を使うようなことになっても、まず最初に行う基本的なプログラムであるので、記述内容を理解し、必ずできるようになっておこう。

前置きが長くなりましたので、ここから本題へ。

前述のとおり、本サイトのページ「MPLAB X IDEでのPICプログラム開発手順(その1)」の続き として、ターゲットPICを”PIC16F84A”、プログラマにPICkit3を使用するとして、このプロジェクトを新規に作成し、main.cソースファイルを用意したところから、話を進める。

ここで、今回のLチカ電子回路は、下図の通りです。

DSC_0588

ちなみに、この電子回路は、下図のようにPICkit3と接続することで、プログラムの書き込みができるようにしている。(なお、下図の回路は、説明上わかりやすくするため、Lチカ部分を取り除いた、書き込みに必要な結線状態となっている)

1.X-IDEで新規作成したプロジェクトにおいて、メニューバーの「Production」>「Set Configuration Bits」をクリックして、” Configuration Bits ”タブを表示する。

ここで、先のページでは省略していた、各項目と値について説明する。

CategorySetting(Option)説明
Oscillator Selection bitsHS oscillator(HS)
RC oscillator (EXTRC)
XT oscillator (XT)
LP oscillator (LP)
PICの動作クロックとなる発振子のタイプ
HS=高速発振子(セラロックなど、4MHz ~20MHz)
RC=外部RC発振回路(低精度で約1MHz以下)
XT=水晶発振子(水晶のため高精度。4MHz以下)
LP=低電力 発振子(低電力の水晶で200kHz以下)
Watchdog TimerWDT disabled(OFF)
WDT enabled(ON)
ウォッチドッグタイマ(PICが正常に動作しているかどうかを常に監視するためのタイマ)の有効・無効
Power-up Timer Enable bitPower-up Timer is disabled (OFF)
Power-up Timer is enabled (ON)
パワーアップ・タイマーとは、PICに電源が供給されてから64msの間、PICをリセット状態する。これは、電源が安定した状態になるまで待つようにして、不安定な動作を防ぐための機能。
Code Protection bitCode protection disabled (OFF)
Code protection enabled (ON)
PIC書き込んだプログラムを読み込み可能・不可にする。

2. ” Configuration Bits ”タブ にて、各項目を設定後、「Generate Source Code to Output」ボタンをクリックして、表示されたソースコードをmain.cソースコード内のmain関数の前のあたりにペースト(下記太字部分)する。

/*
 * File:   main.c
 * Author: User
 *
 * Created on July 9, 2022, 1:33 PM
 */

// PIC16F84A Configuration Bit Settings
// 'C' source line config statements
// CONFIG
#pragma config FOSC = HS        // Oscillator Selection bits (HS oscillator)
#pragma config WDTE = OFF       // Watchdog Timer (WDT disabled)
#pragma config PWRTE = OFF      // Power-up Timer Enable bit (Power-up Timer is disabled)
#pragma config CP = OFF         // Code Protection bit (Code protection disabled)

// #pragma config statements should precede project file includes.
// Use project enums instead of #define for ON and OFF.

#include "xc.h"

int main(void) {

    return 0;
}

3.main関数内に、Lチカ動作させるためのコードを記述する。

int main(void) {

     TRISA = 0x00;
    TRISB = 0x00;
    PORTA = 0x00;
    PORTB = 0x00;
    
    while(1){
        PORTAbits.RA0 = 0;
         PORTAbits.RA0 = 1;

    }
    return 0;
}

TRISAおよびTRISBは、PORTAおよびPORTBの各ポート(RA0~4およびRB0~7)を入力ポートにするか出力ポートにするかの動作設定を行う。

PORTAおよびPORTBは、RA0~4(ICピンだと、順に17・18・1・2・3)および RB0~7(ICピンだと、順に6~13) の各ピンに、すべて”0”を出力する。

延々、点滅させるために、”while(1){・・・}”の無限ループを使用して、
その中にRA0(PORTAbits.RA0)の出力値を”0”=点灯ののち、 RA0(PORTAbits.RA0)の出力値を”1”=消灯 を出力させる。

5.前手順で追加したコードのうち、無限ループ内のRA0への前の値の反転値の出力は、このままだと、瞬間的に実行されてしまうため、点滅しているかが確認できない。
そこで、このあとにある程度の時間稼ぎが必要であるため、XC8コンパイラに用意されているマクロ”__delay_ms(数値)”を使用して、ループ内のRA0への反転出力処理に遅延を加えます。

#define _XTAL_FREQ 10000000

int main(void) {

    TRISA = 0x00;
    TRISB = 0x00;
    PORTA = 0x00;
    PORTB = 0x00;
        
    while(1){
        PORTAbits.RA0 = 0;
        __delay_ms(10);
        PORTAbits.RA0 = 1;
        __delay_ms(10);
    }
    return 0;
}

上記ソースコード中、太字のコードを追加する。
__delay_ms(10)で、”10ms”(厳密に正確ではない)の遅延処理を加えることにした。
ただし、このマクロを使うに当たっては、”_XTAL_FREQ”という定数を設定する必要があり、これはPICの動作クロックの周波数値である。今回のPIC回路では10MHzのセラロックを使用しているので、”10,000,000”の値を定義した。

6.以上の記述したmain.cソースファイルを、コンパイル(正確にはHEXバイナリまで生成するので”ビルド”)する。

#pragma config FOSC = HS        // Oscillator Selection bits (HS oscillator)
#pragma config WDTE = OFF       // Watchdog Timer (WDT disabled)
#pragma config PWRTE = OFF      // Power-up Timer Enable bit (Power-up Timer is disabled)
#pragma config CP = OFF         // Code Protection bit (Code protection disabled)



#include "xc.h"

#define _XTAL_FREQ 10000000

int main(void) {

    TRISA = 0x00;
    TRISB = 0x00;
    PORTA = 0x00;
    PORTB = 0x00;
    
    while(1){
        PORTAbits.RA0 = 0;
        __delay_ms(10);
        PORTAbits.RA0 = 1;
        __delay_ms(10);
    }
    return 0;
}

コンパイル(ビルド)に成功すると、”Output”タブに、下図のような出力が表示され、緑色で”BUILD SUCCESSFUL”の文字が表示されていれば、HEXバイナリの生成に成功したことを表す。

7.あとは、生成されたHEXバイナリファイルをPICに書き込む。
PIC回路をプログラマ(PICkit3)に接続し、下図のアイコンボタンをそのままクリック(もしくは、下図のリストから”Make and Program Device Main Project”)して実行する。

注意)書き込み中など、処理に時間がかかっている場合は、処理中であることを表すプログレスバーが、X-IDEのウィンドウ下端に表示されるので、こちらも注視しておくこと。

8.PICへの書き込みに成功すると、下図のようなメッセージが表示される。

9.書き込みに成功したら、プログラマからPIC回路を取り外し、電源をつなげてちゃんとLチカするかを確認してみる。

つぎは、デバッグについてやっていこうと思う。

以上