PICで電飾 割り込み処理 その4 タイマ2の設定方法
タイマ2とPWM
最後にタイマ2です。内容はタイマ0,1の時と同様で、割り込みを発生させる呪文とパラメータ設定です。
似たような内容が続きますが、以降このブログでのPWM調光はすべてタイマ2を使いますので、その意味では一番重要なのがトリに来たわけです。
今回もプログラムは最後に載せています。
赤字がタイマ2を使うための呪文、水色背景がタイマ2の周期を決めるパラメーターです。
周期を決めるパラメータは、タイマ2では
①クロック数
②プリスケール
③ポストスケール
④PR2初期値
の4つがあります。また「PICとは」に頼って、周期が20ミリ秒になるパラメータの各数値を探しましょう。
①内部クロック
内部クロックはこれまでどおり8MHzでいくことにします。
OSCCON = 0b01110010 ;//①内部クロック8MHz
②プリスケール
プリスケールは、T2CONというレジスタの下から7桁目~4桁目の数値で設定します。
T2CON=0b01111111;//②プリスケール16
フォームでわかったプリスケールの数値は10進数で16です。これを2進数に直して水色の背景色の桁に入れておきます。
今回のようにプリスケールが16ならば1111を入れるわけですね。
③ポストスケール
ポストスケールですが、②のプリスケールと同じT2CONの、今度は下2桁で設定します。
T2CON=0b01111111;//③ポストスケール16
ポストスケールは1,4,16の3つの数値しかありません。それぞれの対応は以下の表のようになります。
ポストスケールが16の場合、11を入れても10を入れても同じです。ここでは11を入れてあります。
プリスケールもポストスケールも、数値が大きくなるほど周期が大きくなりますね。
④PR2初期値
PR2初期値は、そのまま設定すればOKです。
PR2=156;//④PR2初期値156に
これで20ミリ秒に一回、PICはボタン入力を確認しに行くようになりました。
さて、タイマについて、「どうやったら使えるようになるか」だけで説明してきました。
正直かなり雑な説明なうえ、説明している本人もよくわかっていないという恐ろしい状況なわけなのですが、このプログラムと回路で動くことは動きます。
我々の目的はPICマイスターになることではなく、単にいい感じでLEDを光らせたいだけなので、動けばOKということで進めたいと思います。
そしてとうとうその、いい感じでLEDを光らせるための地ならしがこれで完了しました。次でPWM調光の説明をします。
と、その前に、今回のタイマ2を使ったプログラムは以下の通りです。またしても動作自体は前回、前々回と同じなんですが。
#include <xc.h>
#define _XTAL_FREQ 8000000
//コンフィグ設定
#pragma config FOSC = INTOSC
#pragma config WDTE = OFF
#pragma config PWRTE = ON
#pragma config MCLRE = ON
#pragma config CP = OFF
#pragma config CPD = OFF
#pragma config BOREN = ON
#pragma config CLKOUTEN = OFF
#pragma config IESO = OFF
#pragma config FCMEN = OFF
#pragma config WRT = OFF
#pragma config PLLEN = OFF
#pragma config STVREN = ON
#pragma config BORV = HI
#pragma config LVP = OFF
int Event=0;
void main(void)
{
//特殊レジスタの設定
OSCCON = 0b01110010 ;//①内部クロック8MHz
ANSELA = 0b00000000 ;//RAの足をすべてデジタルI/Oとして使う
ANSELB = 0b00000000 ;//RBの足をすべてデジタルI/Oとして使う
OPTION_REG = 0b00000000 ;//内部プルアップ抵抗を使う
TRISA = 0b00000000 ;//RAの足はすべて出力に使う
TRISB = 0b00001100 ;//RBの足のうちRB2,RB3を入力に使う
WPUB = 0b00001100 ;//RB2,3に内部プルアップ抵抗をつなぐ
PORTA = 0b00000000 ;//RAの初期値はすべてゼロ
PORTB = 0b00000000 ;//RBの初期値はすべてゼロ
// タイマー2設定
T2CON=0b01111111;//②プリスケール16、③ポストスケール16
PR2=156;//④PR2初期値156に
TMR2IF = 0; //タイマ2割り込みフラグゼロに
TMR2IE=1;//タイマ2割り込み許可
TMR2ON=1;//タイマ2スタート
PEIE=1;//周辺割り込み許可
GIE=1;//全体割り込み許可
while(1)
{
if (Event==0)//平常時
{
RB6=1; RB7=0; __delay_ms(1000);//RB6とRB7を
RB6=0; RB7=1; __delay_ms(1000);//1秒おきに交互に点灯
}
if (Event==1)//イベント時
{
RA1=1;//RA1を点灯
RB6=0; RB7=0;//翼端灯消灯
__delay_ms(5000);//5秒まつ
RA1=0;//RA1を消灯
Event=0;//イベント終了
}
}
}
void __interrupt() xxx(void)
{
if(TMR2IF)//タイマ2による割り込み
{
PR2=156;//PR2初期値156にもどす
if(RB3==0 && Event==0)//もしRB3が押されていて、イベントが起きていなかったら
{
Event=1;//イベントフラグ立てる
}
TMR2IF=0;//タイマ2による割り込みリセット
}
}