こことかここではTimer0の割り込みを繰り返して1秒を作っていたが、8bitのカウンターのTimer0より16bitのカウンターを持つTimer1の方が汎用性があるのではないかと思えた。
11.776MHzの外部クロックの使用を前提とする(そもそも、秋月で何だか安かったので衝動買いした、というだけで手元にある水晶発振器なのだが)と、
Timer0では、
11776000 ÷ 4 ÷ 256 ÷ 250 ÷ 46 = 1
というのが計算上は一番ぴったりになる設定だ。
左から順に、1秒間のクロック数、1サイクルのクロック数、プリスケーラの設定、カウンタのカウント数、繰り返しループの数だ。
これをTimer1でやると、
11776000 ÷ 4 ÷ 8 ÷ 46000 ÷ 8 = 1
というのが一番ぴったりする。
つまり、カウンターが16bitになったために、ループの数を減らせるわけだ。
だからどうしたという気もしないでもないが。
そこで、データ・シートと首っ引きで設定を行って、プログラムしてみたが、動かない。
怪しいのは、というか良くわからない要素を含んでいるのがT1CONの設定だ。
最終的に、TMR1CS = 0; で動いたのだが、Internal clockでなくてT1CKIにつないだ水晶発振器のクロックで動作させるんだからと思って納得がいかない。
ま、いずれにしても、以下の設定で動いたのは動かし難い事実。
#pragma config FOSC = HS
T1CON = 0b00110001;
だが、よくよく考えると、
#pragma config FOSC = HS
とやった時点で、水晶発振器のクロックは内部でマイコンを動かすクロックとして使われることになり、それをTimer1のカウントに使うんだから、PICの中の人が「タイマーのクロックのソースはInternal clockだ。」と解釈するのに何も矛盾は無いということになる。
んじゃあ、
#pragma config FOSC = INTRCIO
T1CON = 0b00110111;
ということにすれば、これも動くのか?
動く。
ただし、さっきより速く点滅する。
水晶発振器からのクロックが ÷ 4 しないでそのままカウントに使われるからだろうか、Timer1用のクロックは4倍に扱われるが、マイコン用のクロックは遅くなって4MHzになるので、トータルでは4倍より若干遅い結果になる。
そもそもの目的だった1秒を作るということで言えば、この場合はループを4倍して32回にしなければならないので、Timer0を使ったのと変わらなくなってしまう。
そもそもは、時計用の水晶発振器を、
#pragma config FOSC = INTRCIO
T1CON = 0b00110111;
の設定で時間用に使うというのが本来のねらいなのかもしれない。
それに適した周波数の水晶発振器を使えば、ループが多くなるからとかを気にする必要もまったくないはずだ。