※ここで説明するのは,Timer0のクロック源に内部クロックを使用する場合である.
文中の INTCON = 0bxxx00x00;
などのxは,これから設定するビットを表す(xのまま書き込むわけではない)
調整するレジスタ
- OPTION_REG
- INTCON
- TMR0
1.OPTION_REGレジスタの設定
OPTION_REG = 0b1000xxxx
PSA
:クリアでプリスケーラ割り当て(1ビット)
PS
:プリスケーラ比選択ビット(3ビット).大きいほど割り込みの周期が長くなる.
※TMR0CSビットの選択のFOSC/4という表記は,PIC内部の1命令がクロック4周期で進むことに由来するものであり,INTOSC = 8MHzのときにTimer0のクロック源が8 / 4 = 2MHzになる,という意味ではない.
2.INTCONレジスタの設定
INTCON = 0bxxx00x00;
GIE
:セットで全てのアクティブな割り込み有効(1ビット)
PEIE
:セットで全てのアクティブな周辺モジュール割り込み有効(1ビット)
TMR0IE
:セットでTimer0割り込み有効(1ビット)
TMR0IF
:1 = TMR0レジスタがオーバーフローした 0 = TMR0レジスタはオーバーフローしていない
割り込みを繰り返し行うには,割り込み発生後にTMR0IFレジスタをクリアする必要がある.
3.TMR0レジスタの設定
8ビットのカウンタで,1命令サイクル毎に+1される.(プリスケーラで変更可).
最初に設定した値からカウントアップされ,255から0へオーバーフローしたときに割り込みが発生する.そのため,割り込みを繰り返し行うには,割り込み発生後にTMR0レジスタを初期化する必要がある.
4.プリスケーラ比・TMR0レジスタの初期値の検討
例:INTOSC = 8MHz,10ms毎にTimer0割り込みを発生させたい場合
Timer0のクロック源をシステムクロック(FOSC/4)に設定(TMR0CS = 0)すると,INTOSC = 8MHzであるから1命令サイクルは (1 / 8000000) * 4 = 0.5 (μs).
プリスケーラ無しの場合,割り込みが発生する 間隔は最大でも0.128 ms (0.5μs * (255+1)命令サイクル = 0.128ms) であり10msには程遠いため,プリスケーラを使用する必要がある.
プリスケーラ比を最大の1:256に設定 (PS:111) すると,割り込みが発生する間隔は最大で
約30 ms ( 0.5μs * ( (255+1) * 256 )命令サイクル = 32.76...(ms) ) となる.
これを10ms間隔に調整するには,TMR0レジスタにあらかじめ値を与えてゲタをはかせておく.これによりオーバーフローまでのカウント回数を減らし,周期を短くすることができる.
10 (ms) = 0.5 (μs) * 256 (PRS) * (255 - TMR0 +1) から
TMR0 = 256 - ( 10 (ms) / ( 0.5 (μs) * 256(PRS) ) ) ≒ 178
TMR0の初期値の設定方法のまとめ
TMR0の初期値 = 256 - 任意の割り込み発生間隔 (s) /( 1命令サイクル周期 (s) × プリスケーラ比 )
※ 1命令サイクル周期:使用クロックが8MHzなら(1/8000000) * 4 = 0.5 (μs)
Timer0で100ms等の長い割り込み発生間隔を実現するには,割り込み関数内で変数をカウントして,一定数になったら割り込み処理を行うようにするといった方法がある.
参考ページ
MICROCHIP PIC16(L)F1764/5/8/9 日本語PDFデータシート
https://akizukidenshi.com/download/ds/microchip/PIC16F1764_PIC16LF1769_j.pdf
PICで遊ぶ電子工作 TMR0割込みを使ってみる(LEDを点滅させる)
http://mitt.la.coocan.jp/pic/pic5_05.html]
まくまくいろいろノート タイマ 0 を使用する ─ PIC めもめも
https://maku77.github.io/memo/pic/asm/timer0.html
【きむ茶工房ガレージハウス】タイマー割込みを使ってLEDを点滅させます
http://zattouka.net/GarageHouse/micon/MPLAB/12F1822/TIMERtoLED/TIMERtoLED.htm
PICマイコンと電子工作 インターバルタイマと割り込み
http://picmicom.web.fc2.com/practical/tmr0.html
PIC18内蔵モジュールの使い方 タイマー0,1,2,3の使い方
http://www.picfun.com/pic18/mod1803.html