タイマを使ってLEDをチカチカさせてみます.
データシートによるとこのような5ヶのタイマが内蔵されているそうです.
- Timer0: 8/16-bit timer/counter with 8-bit programmable prescaler
- Timer1, Timer3: 16-bit timer/counter
- Timer2, Timer4: 8-bit timer/counter
ここではTimer0を使って割り込みを発生させて、LEDをチカチカさせてみます.
---------------ソースコードここから-------------------
#include "18F65K80.h" 必須です
#use delay(clock=16M) compilerにclockが16MHzだと教えます
#use rs232(UART1,BAUD=9600,PARITY=N,BITS=8,STOP=1) UARTパラメータの指示です
int i=0; 静的変数を一つつかう.初期値ゼロ.
#int_timer0 以下のルーチンがタイマ0割り込みルーチンだという宣言です
void timer0interrupt(){ タイマ0割り込みルーチン
set_timer0(0); 次回のタイマの開始値を0にセットします.あとで解説します.この場合は16M/4/16/65536=3.81Hz で割り込みが発生します
output_toggle(PIN_G4); 出力ポートG4を反転させます
printf("hello %d\n\r",i++); UARTに文字列出力 hello 110 などと
}
void main(void){ メインルーチン
setup_oscillator( OSC_16MHZ ); clock=16MHzに設定します
setup_timer_0(T0_INTERNAL | T0_DIV_16 ); タイマ0の設定をします.ここでは内部clockで、16分周プリスケを挿入します.あとで解説します.
enable_interrupts(INT_TIMER0); タイマ0のオーバーフロー割り込みを許可
enable_interrupts(GLOBAL); 割り込み全体を許可 これをサボるとタイマ0割り込みが発生しないようです
while(1){} あとは割り込みにおまかせなのでムダに永久ループさせときます
}
--------------ソースコードここまで---------------------
上記のcodeですと、3.81Hzで割り込みがかかり、LEDは1.9Hzでチカチカします.
なんでそうなるのか?
1)まずタイマ0は16bitのカウンタですから最大カウント65535です. (8bitにして使うことも可能)
2)clockは16MHzです
3)タイマの入り口で内部clockは必ず4分周され、4MHzになります T0_INTERNALで内部clock
4)4MHzが16分周され、250kHzになります T0_DIV_16で16分周
5)初期値0から最大値65535までカウントしますので、250kHz÷65536=3.8Hz
この理屈を知っていればあとはいろいろと小細工して任意の周期で割り込みできます.
たとえば、10Hzで割り込みをかけたい場合はどうするかというと、
1)まずタイマ0は16bitのカウンタですから最大カウント65535です.
2)clockは16MHzです
3)タイマの入り口で内部clockは必ず4分周され、4MHzになります T0_INTERNALで内部clock
4)4MHzが16分周され、250kHzになります T0_DIV_16で16分周
5)初期値40535から最大値65535までカウンさせると25000カウントしますので、250kHz÷25000=10Hz set_timer0(65535-25000);
プリスケーラの選択肢は、C:\Program Files (x86)\PICC\Devices\18F65K80.h に書かれています.
#define T0_DIV_1 8
#define T0_DIV_2 0
#define T0_DIV_4 1
#define T0_DIV_8 2
#define T0_DIV_16 3
#define T0_DIV_32 4
#define T0_DIV_64 5
#define T0_DIV_128 6
#define T0_DIV_256 7
内部clockの他に外部clockも使えます.外部clockの場合は4分周は挿入されません.
T0_EXT_L_TO_Hは、外部clockの立ち上がりエッジでカウントするという意味だと思います.T0_EXT_H_TO_Lは立ち下がりエッジ.
#define T0_INTERNAL 0
#define T0_EXT_L_TO_H 32
#define T0_EXT_H_TO_L 48
外部clockはどの端子なのか?
下記のピンアサインによると、T0CKIは、18ピンまたは21ピンのどちらかを選択できるようです.
どうやって選択するのかは知りません.知る必要が生じたら調べようっと.
タイマ0のブロック図はこうなっています.
タイマ0の8bitモードは解説を割愛します.使いたくなる場面無いと思うんで.