PIC16F690 で LED を点滅

ここでは PIC16F690 の最初のプロジェクトとして、LED をひとつだけ取り付けて点滅させてみましょう。

早速コードは次のようになります。

#pragma config FOSC  = INTRCIO
#pragma config WDTE  = OFF
#pragma config PWRTE = ON
#pragma config MCLRE = OFF
#pragma config CP    = OFF
#pragma config CPD   = OFF
#pragma config BOREN = ON
#pragma config IESO  = OFF
#pragma config FCMEN = OFF

#include <xc.h>
#define _XTAL_FREQ (4000000)

void main(void) {
    
    ANSEL   = 0; 
    ANSELH  = 0;
    CM1CON0 = 0;
    CM2CON0 = 0;
    
    PORTC   = 0x00;
    TRISC   = 0x00;

    while(1){
        PORTC = 0x01;
        __delay_ms(1000);
        PORTC = 0x00;
        __delay_ms(1000);
    }
    
    return;
}

それでは、構成ビット (#pragma の部分) はここでは呪文としておき main 関数からみていきましょう。

ANSEL   = 0; 
ANSELH  = 0;

ANSEL はアナログ選択レジスタ、 ANSELH はアナログ選択ハイレジスタです。ANSEL と ANSELH を 0 に初期化することでデジタル IO に設定されます。

CM1CON0 = 0;
CM2CON0 = 0;

CM1CON0 と CM2CON0 はコンパレータの設定に使いますが、今回は使わないので 0 にクリアしてコンパレータを無効にします。 消費電流が少なくなります。

PORTC   = 0x00;
TRISC   = 0x00;

今回は RC0 に LED (と電流制限抵抗) を接続します。

基本的にこういう構成にします。

そこで PORTC をまずは 0 クリアしています。PORTC は 8 ビットありますが全部まとめて 0 にしてます。次に TRISC を 0 にすることで、 対応するPORTC のピンを出力に設定します。

以上で初期化は終わりです。次の while を繰り返します。

...
#include <xc.h>
#define _XTAL_FREQ (4000000)
...
    while(1){
        PORTC = 0x01;
        __delay_ms(1000);
        PORTC = 0x00;
        __delay_ms(1000);
    }
...

PORTC を 0x01 に設定することで、PORTC の Bit 0 を 1 に設定しています。__delay_ms で 1,000 ミリ秒遅延し、 PORTC を 0x00 に設定して PORTC の Bit 0 を 0 に設定しています。(実際にはひとつのビットだけを操作しているのではなく、 他のビットも全て 0 にしてますが)

_XTAL_FREQ は PIC16F690 の内部クロックの既定値が 4 MHz なので 4000000 としています。これによって、__delay_ms 関数で正しい時間遅延されます。

以上で LED の点滅について説明しました。

ここまでお読みいただき、誠にありがとうございます。SNS 等でこの記事をシェアしていただけますと、大変励みになります。どうぞよろしくお願いします。

© 2024 基礎からの IoT 入門