タイマー割込みを使ってLEDを点滅させます

〔PICの動かせ方入門に戻る〕


配線したLEDを、PICのタイマー機能(TIMER0/TIMER1)を使って約1秒毎に点滅させます。

LEDblink1

今回使用するピン番号は1番(VDD)と8番(VSS)と5番(RA2)です。

@まずは、下記図画面の様に配線しましょう。
 図は、12F675ですが12F1822も同じ配線になります。
 PICの1番ピンに電源+5V、8番ピンに電源GND(-)側、5番ピンにLEDの足が長い方を接続します。

LEDblink2 LEDblink3

AMPLAB X(v2.15)を起動させます。

B下記がTIMER0を使ったプログラムソースです、
MPLAB(R) XC8 C Compiler Version 1.32コンパイラを使用しています。
 プロジェクトを作成して新規ファイルにコピーペーストして貼り付けて下さい。
 プログラムソースをダウンロードしてプロジェクトに取込む事も出来ます。 *2)
---------------------------------------------------------------------
#include <xc.h>

#define T0COUT     61   // タイマー0用カウントの初期値(256 - 195 = 61)

int Count ;             // タイマーの割込み発生回数をカウントする変数
int LEDflg ;            // LEDのON/OFF状態フラグ

// コンフィギュレーション1の設定
#pragma config FOSC     = INTOSC   // 内部クロック使用する(INTOSC)
#pragma config WDTE     = OFF      // ウオッチドッグタイマー無し(OFF)
#pragma config PWRTE    = ON       // 電源ONから64ms後にプログラムを開始する(ON)
#pragma config MCLRE    = OFF      // 外部リセット信号は使用せずにデジタル入力(RA3)ピンとする(OFF)
#pragma config CP       = OFF      // プログラムメモリーを保護しない(OFF)
#pragma config CPD      = OFF      // データメモリーを保護しない(OFF)
#pragma config BOREN    = ON       // 電源電圧降下常時監視機能ON(ON)
#pragma config CLKOUTEN = OFF      // CLKOUTピンをRA4ピンで使用する(OFF)
#pragma config IESO     = OFF      // 外部・内部クロックの切替えでの起動はなし(OFF)
#pragma config FCMEN    = OFF      // 外部クロック監視しない(OFF)

// コンフィギュレーション2の設定
#pragma config WRT    = OFF        // Flashメモリーを保護しない(OFF)
#pragma config PLLEN  = OFF        // 動作クロックを32MHzでは動作させない(OFF)
#pragma config STVREN = ON         // スタックがオーバフローやアンダーフローしたらリセットをする(ON)
#pragma config BORV   = HI         // 電源電圧降下常時監視電圧(2.5V)設定(HI)
#pragma config LVP    = OFF        // 低電圧プログラミング機能使用しない(OFF)

// タイマー割込みの処理
void interrupt InterTimer( void )
{
     if (TMR0IF == 1) {           // タイマー0の割込み発生か?
          TMR0 = T0COUT ;         // タイマー0の初期化
          Count++ ;               // 割込み発生の回数をカウントする
          TMR0IF = 0 ;            // タイマー0割込フラグをリセット
          if (Count >= 40) {      // 割込みを40回カウントすると約1秒
               Count = 0 ;
               // 1秒毎にLEDのフラグをON/OFFさせる処理
               if (LEDflg == 0) LEDflg = 1 ;
               else             LEDflg = 0 ;
          }
     }
}
// メインの処理
void main()
{
     OSCCON = 0b01101010 ;     // 内部クロックは4MHzとする
     ANSELA = 0b00000000 ;     // アナログは使用しない(すべてデジタルI/Oに割当てる)
     TRISA  = 0b00001000 ;     // ピンは全て出力に割当てる(RA3は入力のみとなる)
     PORTA  = 0b00000000 ;     // 出力ピンの初期化(全てLOWにする)

     OPTION_REG = 0b00000110 ; // 内部クロックでTIMER0を使用、プリスケーラカウント値 1:128
     TMR0   = T0COUT ;         // タイマー0の初期化
     TMR0IF = 0 ;              // タイマー0割込フラグ(T0IF)を0にする
     Count  = 0 ;              // 割込み発生の回数カウンターを0にする
     TMR0IE = 1 ;              // タイマー0割込み(T0IE)を許可する
     GIE    = 1 ;              // 全割込み処理を許可する

     LEDflg = 0 ;              // LEDのフラグ状態をOFFとする

     while(1) {
          // LEDのフラグ状態ON/OFFによりLEDをON/OFFする処理
          if (LEDflg == 0) RA2 = 0 ;    // 5番ピンにLOWを出力する(LED OFF)
          else             RA2 = 1 ;    // 5番ピンにHIGHを出力する(LED ON)
     }
}
---------------------------------------------------------------------
CコンパイルPIC書き込みを実行して下さい。

DPICをブレッドボードに取付けて動かせば、約1秒毎にLEDが点滅を繰り返すと思います。

《やさしく解説》

LEDについて

LEDblink4

LEDには極性が有ります、
足の長いアノード側を5番ピンの方に、足の短いカソード側を電流制限抵抗の方に接続します。
また、LEDには流せる電圧と電流が決まっています、必ず電流制限抵抗を付けましょう。

電流制限抵抗
 LEDの順方向電流(IF)と順方向電圧(VF)がデータシート等に書いてあると思います、
 例えばIFが10mAで、VFが2.5Vで、picのデジタルが5Vとすると、
 (pic出力−順方向電圧)÷ 順方向電流 = 電流制限抵抗値
 よって、(5V - 2.5V) ÷ 0.010A = 250Ω(250Ωは無いので240Ωか270Ωを使います)
 10mAは0.010AというふうにAに変換して計算します。

 だいたい120Ω〜680Ωのあたりだと思います。
 LEDは5mAくらいで使った方が目に優しいでしょう、で470Ω?
 また、抵抗はLEDのアノード側とカソード側のどちら側に接続してもOKです。

 注意) PICの出力は20mA程しか流せません、これ以上のLED電流を流す場合は
     PICの出力をトランジスタで一旦受けてからLEDをつながないといけません。
     マイコン出力をトランジスタで一旦受ける場合はこちらを参考にして下さい。

プログラムについて

プログラムソースのコメントを読んでもらえば大体何をしているのか分かると思います。

while(1)
 main()の中の処理は1回実行すると終了します、
 だからwhile(1)の、{ }の中に処理を書き込めば無限に繰り返します。
 もしwhile(1)を記述しないとLEDは点灯せずに終了してしまう事になります。

InterTimer()  これはTIMER0の割込みが発生した時に処理される関数です。
 今回の設定で1回の割込みは約24.96ms毎に発生します、
 で40回カウントすれば約1000ms(1秒)と言う事になります。

 TIMER0の使い方はこちらを参照して下さい。
 また、TMR0IFとT0IF(TMR0IEとT0IE)は同じに使えますが、12F1822から名前がTMR0IF/TMR0IEに
 変わりました、よって、TMR0IF/TMR0IEを使用した方が良いでしょう。

《TIMER1》   (*1)

TIMER1を使ったサンプルプログラムソースのダウンロードはこちらです。
TIMER1の使い方はこちらを参照して下さい。(12F675と基本同じです)
ただ、T1CONの設定とワンカウントの時間計算が少し異なります。

T1CONの設定
 T1CON = 0b00000001 ;
 青数字部分でTimer1のクロックソースを選択します。
  00 = Fosc/4  01 = Fosc  10 = 外部入力  11 = 内蔵の容量検知オシレータ (CAPOSC)
 緑数字部分でプリスケーラの設定を行います。
  00 = 1:1  01 = 1:2  10 = 1:4  11 = 1:8
 赤数字部分 1=TIMER1を動作させる 0=TIMER1を動作させない

ワンカウントの時間計算
システムクロックが4MHzとする場合での計算
・クロックソースが 00 = Fosc/4 でプリスケーラの設定が 11 = 1:8 なら
  ((1/4MHz)x 4)x8 = 8us
・クロックソースが 01 = Fosc でプリスケーラの設定が 11 = 1:8 なら
  (1/4MHz)x 8 = 2us

《その他》

TIMER2の使い方はこちらを参考にして下さい。

今回は5番ピンを使用しましたが他のピンを使用する場合は下記の表を参照して下さい。
また、4番ピンRA3は入力しか出来ません、出力不可です。
ピン番号
ピンの名前 RA0 RA1 RA2 RA3 RA4 RA5



MPLAB X用に記事変更(*2) 2015/10/02
変更(*1) 2012/05/13


【きむ茶工房ガレージハウス】
Copyright (C) 2006-2015 Shigehiro Kimura All Rights Reserved.