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

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


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

LEDblink1

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

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

LEDblink2 LEDblink3

AMPLAB IDEを起動させます。

B下記がTIMER0を使ったプログラムソースです、
 プロジェクトを作成して新規ファイルにコピーペーストして貼り付けて下さい。
 プログラムソースをダウンロードしてプロジェクトに取込む事も出来ます。
 TIMER1を使ったプログラムソースのダウンロードも出来ます。
---------------------------------------------------------------------
#include <pic.h>

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

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

// メモリを保護しない(UNPROTECT):外部リセット信号は使用せずにデジタル入力(GP3)ピンとする(MCLRDIS)
// 電源電圧降下常時監視機能ON(BOREN):電源ONから72ms後にプログラムを開始する(PWRTEN)
// ウオッチドックタイマ無し(WDTDIS):内部クロック4MHz使用する(INTIO)
__CONFIG(UNPROTECT & MCLRDIS & BOREN & PWRTEN & WDTDIS & INTIO) ;


// タイマー割込みの処理
void interrupt InterTimer( void )
{
     if (T0IF == 1) {             // タイマー0の割込み発生か?
          TMR0 = T0COUT ;         // タイマー0の初期化
          Count++ ;               // 割込み発生の回数をカウントする
          T0IF = 0 ;              // タイマー0割込フラグをリセット
          if (Count >= 40) {      // 割込みを40回カウントすると約1秒
               Count = 0 ;
               // 1秒毎にLEDのフラグをON/OFFさせる処理
               if (LEDflg == 0) LEDflg = 1 ;
               else             LEDflg = 0 ;
          }
     }
}
// メインの処理
void main()
{
     CMCON  = 0x07 ;           // コンパレータは使用しない
     ANSEL  = 0b00000000 ;     // アナログは使用しない(すべてデジタルI/Oに割当てる)
     TRISIO = 0b00000000 ;     // ピンは全て出力に割当てる(GP3は入力のみとなる)

     GPIO   = 0b00000000 ;     // 出力ピンの初期化(全てLOWにする)

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

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

     while(1) {
          // LEDのフラグ状態ON/OFFによりLEDをON/OFFする処理
          if (LEDflg == 0) GPIO2 = 0 ;    // 5番ピンにLOWを出力する(LED OFF)
          else             GPIO2 = 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の使い方はこちらを参照して下さい。

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

《その他》

今回は5番ピンを使用しましたが他のピンを使用する場合は下記の表を参照して下さい。
また、4番ピンGP3は入力しか出来ません、出力不可です。
ちなみにGPIOはジィピィアイオーです、ゼロではないです。
ピン番号
ピンの名前 GP0 GP1 GP2 GP3 GP4 GP5
出力ビット名 GPIO0 GPIO1 GPIO2 GPIO3 GPIO4 GPIO5




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