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回割り込みとします.