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が点滅するだけですが,とりあえず動画↓
| 固定リンク | 0
「PICマイコン」カテゴリの記事
- ZK-80で足し算(2020.07.23)
- TK-80互換機 ZK-80のキット(2020.07.21)
- PICのお勉強(37) C言語編 12F683でA/D変換(2015.06.02)
- UVレジンでLEDイルミネーション (2)(2015.05.15)
- PICのお勉強(35) C言語編 PWMでサーボモータを動かす(2014.10.05)
コメント