---
---
18F14K50には、4本のタイマーがあります。タイマー1は、独自のクロック発信器を持つ16ビットタイマーです。 タイマー1のクロック発信器に時計用水晶(クリスタル)を接続することで高精度のデジタルクロックが作成できます。まず、内部クロックをカウントする16ビットタイマーとして使用し、タイマーがカウントアップするとインタラプトが発生する仕様について説明します。
*注意*
Timer1 の全16ビットを一括して読み出すために、下位バイトを読み出すタイミングで上位バイトの値を読み出しTMR1H(バッファ)に保存します。これによって、Timer1 の全16 ビットの値を同時に取得することができます。書き込みは、まず、TMR1H のバッファレジスタに上位バイトに書き込む値を保存した後で、TMR1L への書き込みが実行されると、TMR1H の内容によって上位バイトも更新されます。これによって、Timer1 の全16 ビットを同時に更新できます。
| レジスタ | bit7 | bit6 | bit5 | bit4 | bit3 | bit2 | bit1 | bit0 |
|---|---|---|---|---|---|---|---|---|
| TMR1L | TMR1 Count の下位 8 bit | |||||||
| TMR1H | TMR1 Count の上位 8 bit | |||||||
| RCON | IPEN | SBOREN | — | RI | TO | PD | POR | BOR |
| INTCON | GIE/GIEH | PEIE/GIEL | TMR0IE | INTIE | RABIE | TMR0IF | INT0IF | RABIF |
| PIR1 | - | ADIF | RCIF | TXIF | SSP1IF | CCP1IF | TMR2IF | TMR1IF |
| PIE1 | - | ADIE | RCIE | TXIE | SSP1IE | CCP1IE | TMR2IE | TMR1IE |
| IPR1 | — | ADIP | RCIP | TXIP | SSPIP | CCP1IP | TMR2IP | TMR1IP |
| T1CON | RD16 | T1RUN | T1CKPS1 | T1CKPS0 | T1OSCEN | T1SYNC | TMR1CS | TMR1ON |
| レジスタ | BIT | 名 | 説明 | 1 | 0 |
|---|---|---|---|---|---|
| RCON | 7 | IPEN | 2レベルのインタラプト優先度 | 使用 | 不 |
| INTCON | 7 | GIEH | 高優先度インタラプトを使用許可 | 許可 | 不 |
| 6 | GIEL | 低優先度インタラプトを使用許可 | 許可 | 不 | |
| PIR1 | 0 | TMR1IF | タイマー1 オーバーフロー発生フラグ | 発生 | |
| PIE1 | 0 | TMR1IE | タイマー1 インタラプトを使用許可 | 許可 | 不 |
| IPR1 | 0 | TMR1IP | タイマー1 インタラプト優先度 | 高 | 低 |
| T1CON | 7 | RD16 | タイマー1 16Bit読書きモード | ON | OFF |
| 6 | T1RUN | タイマー1 クロック源 (Read Only) | OSC | 他 | |
| 5 | T1CKPS1 | プリスケラー分周比率 11=1:8, 10=1:4, 01=1:2, 00=1:1 |
|||
| 4 | T1CKPS0 | ||||
| 3 | T1OSCEN | タイマー1 発信器 | ON | OFF | |
| 2 | T1SYNC | タイマー1 外部信号の内部クロック同期 | 非同期 | 同期 | |
| 1 | TMR1CS | タイマー1 クロック選択 | 外部 | 内部 | |
| 0 | TMR1ON | タイマー1 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への出力を反転
}
}