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

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


配線したLEDを、PICのタイマー機能(Timer2/4/6)を使って約1秒毎に点滅させます。
尚、Timer0/1については、12F1822と同じなのでこちらを参照して下さい。

LEDblink1

今回使用するピン番号は14番(VDD)と5番(VSS)と10番(RB4)です。

@まずは、下記図画面の様に配線しましょう。
  PICの14番ピンに電源+5V、5番ピンに電源GND(-)側、10番ピンにLEDの足が長い方を接続します。

LEDblink2 LEDblink3

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

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

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      // 外部リセット信号は使用せずにデジタル入力(RA5)ピンとする(OFF)
#pragma config CP = OFF         // プログラムメモリーを保護しない(OFF)
#pragma config CPD = OFF        // データメモリーを保護しない(OFF)
#pragma config BOREN = ON       // 電源電圧降下常時監視機能ON(ON)
#pragma config CLKOUTEN = OFF   // CLKOUTピンをRA6ピンで使用する(OFF)
#pragma config IESO = OFF       // 外部・内部クロックの切替えでの起動はなし(OFF)
#pragma config FCMEN = OFF      // 外部クロック監視しない(FCMEN_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 (TMR2IF == 1) {           // タイマー2の割込み発生か?
          Count++ ;               // 割込み発生の回数をカウントする
          TMR2IF = 0 ;            // タイマー2割込フラグをリセット
          if (Count >= 125) {      // 割込みを125回カウントすると約1秒
               Count = 0 ;
               // 1秒毎にLEDのフラグをON/OFFさせる処理
               if (LEDflg == 0) LEDflg = 1 ;
               else             LEDflg = 0 ;
          }
     }
}
// メインの処理関数
void main()
{
     OSCCON = 0b01110010 ;    // 内部クロックは8MHzとする
     ANSELA = 0b00000000 ;    // AN0-AN4は使用しない全てデジタルI/Oとする
     ANSELB = 0b00000000 ;    // AN5-AN11はAN9のみアナログで使用し他はデジタルI/Oとする
     TRISA  = 0b00000000 ;    // ピン(RA)は全て出力に割当てる(RA5は入力のみとなる)
     TRISB  = 0b00000000 ;    // ピン(RB)はRB3(AN9)のみ入力で他は出力に割当てる
     PORTA  = 0b00000000 ;    // RA出力ピンの初期化(全てLOWにする)
     PORTB  = 0b00000000 ;    // RB出力ピンの初期化(全てLOWにする)

     T2CON  = 0b00000111 ;    // TMR2プリスケーラ値を64倍、ポストスケーラ値は1:1の設定
     PR2    = 249 ;           // タイマーのカウント値を設定
     TMR2   = 0 ;             // タイマー2の初期化
     Count  = 0 ;             // 割込み発生の回数カウンターを0にする
     TMR2IF = 0 ;             // タイマー2割込フラグを0にする
     TMR2IE = 1 ;             // タイマー2割込みを許可する
     PEIE   = 1 ;             // 周辺装置割り込み有効
     GIE    = 1 ;             // 全割込み処理を許可する

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

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

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

《やさしく解説》

LEDについて

LEDblink4

LEDには極性が有ります、
足の長いアノード側を10番ピンの方に、足の短いカソード側を電流制限抵抗の方に接続します。
また、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()  これはTIMER2の割込みが発生した時に処理される関数です。
 今回の設定で1回の割込みは約8ms毎に発生します、
 で125回カウントすれば約1000ms(1秒)と言う事になります。
 この設定の条件はプリスケーラ値を16倍、ポストスケーラ値は1:1の設定です。
 ちなみにぃ、ポストスケーラ値を1:5に設定してばあいわぁ、25回カウントすればOKで〜す。

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

《その他》

今回は10番ピンを使用しましたが他のピンを使用する場合は下記の表を参照して下さい。
また、4番ピンRA5は入力しか出来ません、出力不可です。
ポートA
ピン番号 16 15 18 17
デジタル入出力ビット名 RA7 RA6 RA5 RA4 RA3 RA2 RA1 RA0

ポートB
ピン番号 13 12 11 10
デジタル入出力ビット名 RB7 RB6 RB5 RB4 RB3 RB2 RB1 RB0

他のタイマー4or6を使用する場合は、下記のレジスター名を2から4or6に変更します。
T2CON
PR2
TMR2
TMR2IF
TMR2IE



MPLAB X用に記事変更(*1) 2015/10/07


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