10 タイマ2の周期割り込み
タイマ2で周期的に割り込みをしてみます.10Hzで割り込みを発生させます.
タイマ2は8bitカウンタです.しかも初期値から減算するカウンタです.
8bitカウンタなので、10Hzで割り込みをかけるには、clockが16MHzだと不可能です.
無茶苦茶ですが、次のsource codeで10Hz割り込みをかけることができます.
無茶苦茶というのは、タイマ2で10Hz割り込みをかけるためにclock=1MHzに遅くしたことです.
普通はこんなCPUスピードが遅くなるようなことはしないと思います.
-------------------ここからソース-------------------
#include "18F65K80.h"
#use delay(clock=1M) compilerにclock=1MHzだと教えます
#use rs232(UART1,BAUD=9600,PARITY=N,BITS=8,STOP=1) 9600bpsにしました
int i=0;
#int_timer2 この下がタイマ2割り込みルーチンであるという意味
void timer2interrupt(){ タイマ2割り込みルーチン
output_toggle(PIN_G4); ポートG4を反転
printf("hello %d\n\r",i++); hello 33などとUARTに出力
}
void main(void){ メインルーチン
setup_oscillator( OSC_1MHZ ); ①clock=1MHz
setup_timer_2(T2_DIV_BY_16, 155, 10); ②プリスケ16分周、③カウンタ初期値155、④10回に一回割り込み発生
enable_interrupts(INT_TIMER2); タイマ2割り込み許可
enable_interrupts(GLOBAL); 割り込み全体を許可
while(1){}
}
--------------ここまでソース--------------------
上のコードが10Hzで割り込める理由は、
① clock=1MHzだが、内部で必ず4分周されるので、250kHz
② プリスケ16分周 1MHz÷16=15624kHz
③ カウンタ155~0までカウント→つまり156カウント→15625÷156=100.1Hz
④割り込みを10回に1回に間引く 100.1÷10=10.01Hz
タイマ0とタイマ1との違いは、タイマ2は減算カウンタだということです.注意しましょう.
なので、setup_timer_2(T2_DIV_BY_16, 255, 10); とすると、1MHz÷4÷16÷256÷10=6.1Hz となります.
引数の選択肢を記します.
知っておくべきなのはこの関数に尽きます.
setup_timer_2 (mode, period, postscale)
modeは、次のどれかです.分周比は1か4か16しか選択できません.
T2_DISABLED, T2_DIV_BY_1, T2_DIV_BY_4, T2_DIV_BY_16
periodは、0~255のどれかです.減算する初期値です.
postscaleは、1~16のどれかです.1なら毎回割り込み、10なら10回に1回割り込みとします.