---
---
12F1822には、3本のタイマーがあります。タイマー0は、8ビットのカウンターで、その入力は内部クロック(Fosc/4) か、静電容量式センシング(CPS)モジュールからの発振信号か、外部からの信号(RA2 pin5)かを選ぶことができます。 ここでは、内部クロックをカウントするタイマーとして使用し、タイマーがカウントアップする仕様について説明します。サンプルで作成したプログラムは、タイマー0がカウントアップするとLEDを点滅するものです。
*注意*
汎用ピンをデジタルで使用する場合は、デジタルの入出力をTRISで設定するだけでなく、アナログ併用ピンかを調べ、併用ピンであれば、ANSELAxでデジタル設定にする必要があります。ANSELxは、デフォルトの設定が、アナログのため、デジタル入力で使用するには、必ず該当ピンをデジタルに設定(ANSx = 0)する必要があります。
Prescaler | 8bitモード | ||
---|---|---|---|
31k | 4M | 32M | |
なし | 33mS | 256μS | 32μS |
1:4 | 132mS | 1024μS | 128μS |
1:32 | 1 S | 8.2mS | 1024μS |
1:256 | 8.5 |
66mS | 8.2mS |
レジスタ | bit7 | bit6 | bit5 | bit4 | bit3 | bit2 | bit1 | bit0 |
---|---|---|---|---|---|---|---|---|
CPSCON0 | CPSON | CPSRM | CPSRNG1 | CPSRNG0 | CPSOUT | T0XCS | ||
INTCON | GIE | PEIE | TMR0IE | INTE | IOCIE | TMR0IF | INTF | IOCIF |
OPTION_REG | nWPUEN | INTEDG | TMR0CS | TMR0SE | PSA | PS<2-0> | ||
TMR0 | Holding Register for the 8-bit Timer0 Count |
レジスタ | BIT | 名 | 説明 | 1 | 0 |
---|---|---|---|---|---|
CPSCON0 | 0 | T0XCS | 外部クロック源選択ビット | CPS | 外部 |
INTCON | 7 | GIE | 全インタラプトの使用許可 | 許可 | 否 |
5 | TMR0IE | タイマー0 インタラプトを使用許可 | 許可 | 否 | |
2 | TMR0IF | タイマー0 オーバーフロー発生フラグ | 発生 | 否 | |
OPTION_REG | 5 | TMR0CS | タイマー0 クロック選択 | 外部 | 内部 |
4 | TMR0SE | タイマー0 クロックエッジ選択 | UP | DN | |
3 | PSA | タイマー0 プリスケラー使用 | 否 | 使用 | |
2 | PS2 | プリスケラー比率 111=1:256(既定),110=1:128, 101=1:64,100=1:32,011=1:16, 010=1:8, 001=1:4, 000=1:2 |
1 | 0 | |
1 | PS1 | 1 | 0 | ||
0 | PS0 | 1 | 0 |
Timer0で内部クロック(4MHz)をカウントし、カウントオーバー(66mS間隔)でLEDが点滅する。
プログラム
// File name: Timer0 // Timer0で内部クロック(4MHz)をカウントし、 // カウントオーバー(66mS間隔)でLEDが点滅する。 // 、 // 1 VDD 8 VSS // 2 RA5 7 RA0 // 3 RA4 6 RA1 // 4 MCLR 5 RA2 LED // // Language: MPLABX XC8 // Target: PIC12F1822 #include <xc.h> #define LED LATA2 #pragma config FOSC = INTOSC, WDTE = OFF, PWRTE = OFF, MCLRE = OFF, CP = OFF #pragma config CPD = OFF, BOREN = ON, CLKOUTEN = OFF, IESO = OFF, FCMEN = OFF #pragma config WRT = OFF, PLLEN = OFF, STVREN = ON, BORV = LO, LVP = OFF void main(void){ OSCCON = 0b01101010; // 内部クロック4Mhz TRISA = 0b11111011; // 入出力設定 OPTION_REG = 0b00000111; // Timer 0 設定(66mSecごと) // 内部クロックをカウント // PS_1/256 while(1){ // 繰り返しループ while(! TMR0IF); // タイムアップを待つ (66mSec) TMR0IF = 0; // キャリーフラッグをクリア LED = ! LED; // LEDへの出力を反転 } }