« 部分月食@岐阜市 | トップページ | PICのお勉強(22) C言語編 TMR0割り込みでLEDのPWM制御 »

2012年6月 5日 (火)

PICのお勉強(21) C言語編 TMR0割り込み

 PICを使うにあたって,TMR0割り込みは必ず身につけるべきテクニックみたいです。
 TMR0レジスタは,1命令サイクルごとに+1されていき,255から0に戻るときに割り込みが発生しますが,OPTIONレジスタの下位3ピット(PS2-PS0)を100として,32命令サイクル毎にTMR0レジスタが+1されるようにしてみました(プリスケーラレート32)。
 テストボードに取りつけてあるセラロックが20MHzなので,1クロックは0.05μs,1命令サイクルは0.2μsとなります。プリスケーラレートが32なので,0.2μs×32×256=1.6384msごとに割り込みが発生します。この割り込みを305回(約500ms)数えたらフラグを立てて,LEDの点滅を実行しました。
ソースはこれ→lesson21.c
 実際に割り込みをさせるには,T0IE = 1;(TMR0割り込み許可),GIE = 1;(すべての割り込み許可)の記述も必要です。また,割り込み処理の内容は,static void interrupt warikomi(void)などとして,記述しておきます。(「warikomi」は任意の関数名でOK)

/************************************
16F84A  HI-TECH C v.9.83
TIMER0割り込み
クロック20MHz→1クロック0.05μs→1命令サイクル0.2μs
プリスケーラレートを32とする
TMR0割り込み 0.2μs×32×256=1.6384ms
500ms÷1.6384ms=305.18回数えると500ms
************************************/

#define _LEGACY_HEADERS
#include "PIC.h"
#define _XTAL_FREQ 20000000 //20MHz
__CONFIG(HS & WDTDIS & PWRTDIS & UNPROTECT);

static bit TFlag; //1.6384msを305回(500ms)数えたら立てるフラグ
static unsigned int count; //カウンタ

static void interrupt warikomi(void) //割り込み処理
{
T0IF = 0; // TMR0割り込み禁止
count++;
if (count == 305) //countが305(500ms)になったら,
{
TFlag = 1; // フラグを立てて,
count = 0; //countを0に戻す。
}
}

main(void)
{
OPTION = 0x84; // プリスケーラは32
TMR0 = 0x00; //TMR0は0からスタート(フリーラン)
T0IE = 1; // TMR0割り込み許可
GIE = 1; // すべての割り込み許可
count = 0;
TFlag = 0;
TRISB = 0b00000000;
PORTB = 0b01010101;

while(1)
{
if (TFlag) { //フラグが立っていたら,
PORTB = ~PORTB; // RB0~7のLEDを点滅させて
TFlag = 0; //フラグを降ろす
}
}
}

周期1秒でLEDが点滅するだけですが,とりあえず動画↓

|

« 部分月食@岐阜市 | トップページ | PICのお勉強(22) C言語編 TMR0割り込みでLEDのPWM制御 »

PICマイコン」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)


コメントは記事投稿者が公開するまで表示されません。



トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/26930/54876225

この記事へのトラックバック一覧です: PICのお勉強(21) C言語編 TMR0割り込み:

« 部分月食@岐阜市 | トップページ | PICのお勉強(22) C言語編 TMR0割り込みでLEDのPWM制御 »