PIC18F46K22でtimer0による割り込みを使用したLEDの0.5秒間隔の点滅サンプル(C言語)

icon 項目のみ表示/展開表示の切り替え

概要

PIC18F46K22 のTimer0を割り込みを発生させLEDを0.5秒置きに点滅する。
回路はPIC18F46K22でLEDを点滅(アセンブラ)のとおりである。
Timer0の設定方法は、PIC18 TIMER0計算を参照されたい。

プログラムの説明

メインプログラムでタイマー設定(OpenTimer0,WriteTimer0)を行い、無限ループとする。 0.5秒後に割り込みによりisr関数が起動される。 周期的に割り込ませるためにisr関数の中で再度タイマー値の初期値の設定(WriteTimer0)を行う。

タイマー設定値

FOSC/4=16MHz
プリスケラ 1:256
16bitタイマー使用
初期時及びオーバーフロー割り込み(タイマー値が65535から0になった時発生)時に下記の値を設定すると
TMR0=65536-(16000000/256)*0.5=34286
34286から65535までカウントされオーバーフローごとに割り込みが発生する。すなわち65536-34286=31250周期となる。
TMR0を設定しない場合は、0~65535までカウントされるので、1/(16000000/256)*65536=1.048576秒ごとの割り込みとなる。

ソースファイル

以下のファイルで構成されている
timer0c1c.c ・・・ メインプログラムと割り込み処理プログラム

ソースファイルのダウンロード timer0c1c.zip


/*
 * timer0による割り込みを使用したLEDの0.5秒間隔の点滅サンプル Version 1.00
 * File:        timer0c1.c
 * Target:      PIC18F46K22 64MHz
 * コンパイラ:   Microchip MPLAB XC8 C Compiler V1.20
 * 書き込み:     PICKit 3
 * リリース:     2014/02/08 07:20
 *
 * 接続
 *   RB5 lowを出力すると点灯
 */

#include <p18f46k22.h>
#include <plib\timers.h>

#pragma config  FOSC = HSHP,PRICLKEN=ON,PLLCFG=ON,WDTEN=OFF,LVP=OFF

#define LED0 PORTBbits.RB5

#define TMR0SET 133*256+238

void  interrupt isr(void);  //  0.5秒置きの割り込み処理ルーチン

void main(void) {
    ANSELBbits.ANSB5=0;
    TRISBbits.RB5=0;

    OpenTimer0(TIMER_INT_ON & T0_16BIT & T0_SOURCE_INT & T0_PS_1_256);
    WriteTimer0(TMR0SET);

    INTCONbits.TMR0IE=1;
    INTCONbits.GIE=1;

    for(;;);
}

//  0.5秒置きの割り込み処理ルーチン

void  interrupt isr(void){
    INTCONbits.TMR0IF=0;
    WriteTimer0(TMR0SET);
    LED0 = ~LED0;
}