---
---
18F14K50には、4本のタイマーがあります。タイマー0は、8ビットモードと16ビットモードをソフトウエアで選ぶことができます。 ここでは、内部クロックをカウントする16ビットタイマーとして使用し、タイマーがカウントアップする仕様について説明します。サンプルで作成したプログラムは、タイマー0がカウントアップするとLEDを点滅するものです。
*注意*
Timer0 の全16ビットを一括して読み出すために、下位バイトを読み出すタイミングで上位バイトの値を読み出しTMR0H(バッファ)に保存します。これによって、Timer0 の全16 ビットの値を同時に取得することができます。
書き込みは、まず、TMR0H のバッファレジスタに上位バイトに書き込む値を保存した後で、TMR0L への書き込みが実行されると、TMR0H の内容によって上位バイトも更新されます。これによって、Timer0 の全16 ビットを同時に更新できます。
高低2レベルの優先度を使用するタイマー0に関連するレジスターを一覧で説明します。
レジスタ | bit7 | bit6 | bit5 | bit4 | bit3 | bit2 | bit1 | bit0 |
---|---|---|---|---|---|---|---|---|
TMR0L | Timer0 Register, Low Byte | |||||||
TMR0H | Timer0 Register, High Byte | |||||||
RCON | IPEN | SBOREN | — | RI | TO | PD | POR | BOR |
INTCON | GIE/GIEH | PEIE/GIEL | TMR0IE | INTIE | RABIE | TMR0IF | INT0IF | RABIF |
INTCON2 | nRABPU | INTEDG0 | INTEDG1 | INTEDG2 | — | TMR0IP | — | RABIP |
T0CON | TMR0ON | T08BIT | T0CS | T0SE | PSA | T0PS2 | T0PS1 | T0PS0 |
レジスタ | BIT | 名 | 説明 | 1 | 0 | |||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
RCON | 7 | IPEN | 2レベルのインタラプト優先度 | 使用 | 不 | |||||||
INTCON2 | 2 | TMR0IP | タイマー0 インタラプト優先度 | 高 | 低 | |||||||
INTCON | 7 | GIEH | 高優先度インタラプトを使用許可 | 許可 | 不 | |||||||
6 | GIEL | 低優先度インタラプトを使用許可 | 許可 | 不 | ||||||||
5 | TMR0IE | タイマー0 インタラプトを使用許可 | 許可 | 不 | ||||||||
2 | TMR0IF | タイマー0 オーバーフロー発生フラグ | 発生 | |||||||||
T0CON | 7 | TMR0ON | タイマー0 ON/OFF | ON | OFF | |||||||
6 | T08BIT | タイマー0 8/16Bitモード | 8 | 16 | ||||||||
5 | T0CS | タイマー0 クロック選択 | 外部 | 内部 | ||||||||
4 | T0SE | タイマー0 クロックエッジ選択 | UP | DN | ||||||||
3 | PSA | タイマー0 プリスケラー使用 | 不 | 使用 | ||||||||
2 | T0PS2 | プリスケラー比率
|
||||||||||
1 | T0PS1 | |||||||||||
0 | T0PS0 |
クロック周波数とタイムアップ間隔
Prescalerl | 8bitモード | 16bitモード | ||||
---|---|---|---|---|---|---|
31k | 4M | 48M | 31k | 4M | 48M | |
なし | 33mS | 256μS | 21μS | 8.5Sec | 66mS | 5.5mS |
1:4 | 132mS | 1024μS | 85μS | 34Sec | 262mS | 22mS |
1:32 | 1S | 8.2mS | 682μS | 4.5min | 2.1Sec | 175mS |
1:256 | 8.5Sec | 66mS | 5.5mS | 36min | 16.7Sec | 1.4Sec |
PortC - RC2 に接続されたLEDが点灯するプログラムを作成しました。Timer0で内部クロック(4MHz)をカウントし、カウントオーバー(262mS間隔)でLEDが点滅する。
プログラム
// File name: Timer0 // Description: Timer0 example // Timer0で内部クロック(4MHz)をカウントし、 // カウントオーバーでLEDを点滅させる。 // Notes: 4MHz内部クロック // LED RC0 // Language: MPLABX XC8 // Target: PIC18F14K50 #include <xc.h> #define LED LATCbits.LATC0 #pragma config FOSC = IRC // 内部クロック #pragma config USBDIV = OFF, CPUDIV = NOCLKDIV #pragma config IESO = OFF, FCMEN = OFF, PLLEN = ON #pragma config BORV = 30, BOREN = OFF, PWRTEN = OFF #pragma config WDTPS = 32768, WDTEN = OFF #pragma config MCLRE = OFF, HFOFST = OFF, XINST = OFF #pragma config BBSIZ = OFF, LVP = OFF, STVREN = ON #pragma config CP1 = OFF, CP0 = OFF, CPD = OFF, CPB = OFF #pragma config WRT1 = OFF, WRT0 = OFF, WRTB = OFF, WRTC = OFF #pragma config EBTR1 = OFF, EBTR0 = OFF, EBTRB = OFF void main(void){ OSCCON = 0b01010010; // 内部クロック4Mhz TRISC = 0b11111110; // 入出力設定 T0CON = 0b10000001; // Timer 0 設定(262mSecごと) // 内部クロックをカウント // 16BIT モード PS_1/4 while(1){ // 繰り返しループ while(! INTCONbits.TMR0IF); // Timer 0 のタイムアップを待つ INTCONbits.TMR0IF = 0; // Timer 0 からのキャリーフラッグをクリア LED = ! LED; // LEDへの出力を反転 } }