---
---
18F14K50には、4本のタイマーがあります。タイマー3は、タイマー1とほぼ同様な構成を持つ16ビットタイマーで、 タイマー3のクロック発信器からの出力、外部入力、システムクロックをカウントする16ビットタイマー・カウンタとして使用することができます。サンプルで作成したプログラムは、タイマー3でシステムクロックをカウントしLEDを点滅するこぐ単純なプログラムです。
*注意*
Timer3 の全16ビットを一括して読み出すために、下位バイトを読み出すタイミングで上位バイトの値を読み出しTMR3H(バッファ)に保存します。これによって、Timer3 の全16 ビットの値を同時に取得することができます。書き込みは、まず、TMR3H のバッファレジスタに上位バイトに書き込む値を保存した後で、TMR3L への書き込みが実行されると、TMR3H の内容によって上位バイトも更新されます。これによって、Timer3 の全16 ビットを同時に更新できます。
| レジスタ | bit7 | bit6 | bit5 | bit4 | bit3 | bit2 | bit1 | bit0 |
|---|---|---|---|---|---|---|---|---|
| TMR3L | TMR3 Count の下位 8 bit | |||||||
| TMR3H | TMR3 Count の上位 8 bit | |||||||
| RCON | IPEN | SBOREN | — | RI | TO | PD | POR | BOR |
| INTCON | GIE/GIEH | PEIE/GIEL | TMR0IE | INTIE | RABIE | TMR0IF | INT0IF | RABIF |
| PIR2 | OSCFIF | C1IF | C2IF | EEIF | BCLIF | USBIF | TMR3IF | CCP2IF |
| PIE2 | OSCFIE | C1IE | C2IE | EEIE | BCLIE | USBIE | TMR3IE | CCP2IE |
| IPR2 | OSCFIP | C1IP | C2IP | EEIP | BCLIP | USBIP | TMR3IP | CCP2IP |
| T3CON | RD16 | — | T3CKPS1 | T3CKPS0 | T3CCP1 | nT3SYNC | TMR3CS | TMR3ON |
| レジスタ | BIT | 名 | 説明 | 1 | 0 |
|---|---|---|---|---|---|
| RCON | 7 | IPEN | 2レベルのインタラプト優先度 | 使用 | 不 |
| INTCON | 7 | GIEH | 高優先度インタラプトを使用許可 | 許可 | 不 |
| 6 | GIEL | 低優先度インタラプトを使用許可 | 許可 | 不 | |
| PIR2 | 1 | TMR3IF | タイマー3 オーバーフロー発生フラグ | 発生 | |
| PIE2 | 1 | TMR3IE | タイマー3 インタラプトを使用許可 | 許可 | 不 |
| IPR2 | 1 | TMR3IP | タイマー3 インタラプト優先度 | 高 | 低 |
| T3CON | 7 | RD16 | タイマー3 16Bit読書きモード | ON | OFF |
| 6 | - | ||||
| 5 | T3CKPS1 | プリスケラー分周比率 11=1:8, 10=1:4, 01=1:2, 00=1:1 |
|||
| 4 | T3CKPS0 | ||||
| 3 | T3CCP1 | CCP1の信号減選択 | Timer3 | Timer1 | |
| 2 | nT3SYNC | タイマー3 外部信号の内部クロック同期 | 非同期 | 同期 | |
| 1 | TMR3CS | タイマー3 クロック選択 | 外部 | 内部 | |
| 0 | TMR3ON | タイマー3 ON/OFF | ON | OFF | |
| Prescalerl | T1OSC | Fosc/4 | ||
|---|---|---|---|---|
| 32.768k | 31k | 4M | 48M | |
| 1:1 | 2 Sec | 8.4 S | 66mS | 5.5mS |
| 1:2 | 4 Sec | 16.8 S | 131mS | 10.9mS |
| 1:4 | 8 Sec | 33.6 S | 262mS | 21.8mS |
| 1:8 | 16 Sec | 67.1 S | 524mS | 43.7mS |
クロック周波数とタイムアップ間隔
PPortC - RC0 に接続されたLEDが点滅するプログラムを作成しました。 Timer1で内部クロック(4MHz)をカウントし、262mSecでカウントアップする毎にLEDを点滅します。
<回路図>
<プログラム>
// File name: Timer1
// Description: Timer1 example
// Timer1で内部クロック(4MHz)をカウントし、
// カウントオーバーでLEDを点滅させる。
// Notes: 4MHz内部クロック
// LED RC0
// Language: MPLAB 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; // 入出力設定
T1CON = 0b10100001; // Timer 1 設定(262mSecごと)
// 16BITRW モード PS_1/4
// 内部クロックをカウント
while(1){ // 繰り返しループ
while(! PIR1bits.TMR1IF); // Timer 1 のタイムアップを待つ
PIR1bits.TMR1IF = 0; // Timer 1 からのキャリーフラッグをクリア
LED = ! LED; // LEDへの出力を反転
}
}