TMR0を使った割り込みを試してみた。
環境
PIC : PIC12F675
Compiler : mikroBASIC Pro version 5.40
Writer : PICKit3 + Handmade Adapter + PICKit3 Programmer
OS : Windows7 Pro 64BIT
新たに登場したのが
OPTION_REG = %00000111
OPTION_REGについて書き並べると以下の通り。
関係あるものも無いものも、影響無いものも含まれてるが、一応まとめておく。
OPTION_REG = /GPPU,INTEDG,T0CS,T0SE,PSA,PS2,PS1,PS0
/GPPU GPIOプルアップイネーブル
1=GPIOプルアップを使用しない
0=GPIOプルアップを使用するINTEDG 割込みエッジ選択ビット
1=GP2/INTピンの立ち上がりエッジによる割込み
0=GP2/INTピンの立ち下がりエッジによる割込みT0CS TMR0クロックソース選択ビット
1=GP2/T0CKIピンの入力
0=内部命令サイクルクロックT0SE TMR0ソースエッジ選択ビット
1=GP2/T0CKIピンの入力がHighからLowでインクリメント
0=GP2/T0CKIピンの入力がLowからHighでインクリメント
TMR0用外部カウント入力ピンをT0CKIピンと呼び、PIC12F629, 675では、Pin5がそれに相当するPSA プリスケーラ割り当てビット
1=プリスケーラはWDTへ割り当て
0=プリスケーラはTMR0へ割り当てPS2-PS0 プリスケーラレート選択ビット
PS2-PS0 TMR0 WDT
000 1:2 1:1
001 1:4 1:2
010 1:8 1:4
011 1:16 1:8
100 1:32 1:16
101 1:64 1:32
110 1:128 1:64
111 1:256 1:128T0IFはTMR0のカウント値が255から0に変化した瞬間に1になる。
T0IFを0に戻すのはプログラムで行う。
予めT0IFに0をセットして、T0IFが1に変化するのを監視していれば、TMR0の値が255から0に変化したのがわかる。TMR0レジスタ
クロックが入力される毎に自動的に+1される。
値が11111111のときにクロックが入力されると00000000に戻る。
このときINTCONレジスタのbit22(T0IF)が自動的に1に変化する。
プログラムから読み書きが可能。
電源を入れると、1.5秒間隔でLEDが交互に点滅を始めるが、一定時間ごとに点滅間隔が50mSずつ減っていき、100mSになったら、あとはそのままの間隔で点滅を続ける。
というつもりだったが、実際には、内部のロックが速すぎて、というかプログラムでのウエイトが長すぎて、mLoopへ戻ってきたときにはすでにT0IFは1になっていてwhileのループを回る暇がまったくないという、おバカなプログラムになっている。
割り込みがかかって点滅速度がゆっくりになっていってるには違いないんだけど。