---
---
18F26J50には、5本のタイマーがあります。タイマー3は、タイマー1と同じ構成をもつ16ビットタイマーです。タイマー1の発信器からのパルスもカウントに使用することができます。タイマーをON/OFFするGate機能が大幅に強化されているのもタイマー1と同じです。 まず、内部クロックをカウントする16ビットタイマーとして使用し、タイマーがカウントアップするとインタラプトが発生する仕様について説明します。また、下表空色のレジスタ項目の設定は、C18のライブラリtimers関数である(OpenTimer3)を利用するためCプログラムで個別に設定する必要はありません。下表レジスタ項目の緑色はリセット直後の設定を表しています。
*注意*
T3CKIピンは、Peripheral Pin Select (PPS)機能でプログラムで、物理的に接続するピンを指定します。
| レジスタ | 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 | TMR3CS1 | TMR3CS0 | T3CKPS1 | T3CKPS0 | T3OSCEN | T3SYNC | RD16 | TMR3ON |
| T3GCON | TMR3GE | T3GPOL | T3GTM | T3GSPM | T3GGO/ T3DONE |
T3GVAL | T3GSS1 | T3GSS0 |
| TCLKCON | T1RUN | T3CCP2 | T3CCP1 | |||||
| レジスタ | 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 | TMR3CS | タイマー1 クロック選択 10 = T1OSCまたは T3CKI pin 01 = FOSC 00 = FOSC/4 |
||
| 6 | TMR3CS | ||||
| 5 | T3CKPS1 | プリスケラー分周比率 11=1:8, 10=1:4, 01=1:2, 00=1:1 |
|||
| 4 | T3CKPS0 | ||||
| 3 | T3OSCEN | タイマー3 入力およびT1OSC制御 (注1) | ON | OFF | |
| 2 | T3SYNC | タイマー3 外部信号の内部クロック同期 | 非同期 | 同期 | |
| 1 | RD16 | タイマー3 16 Bit読書きモード | 16bit | 8bit | |
| 0 | TMR3ON | タイマー3 ON/OFF | ON | OFF | |
| T3GCON | 7 | TMR3GE | ゲート機能 ON/OFF(TMR3ON=0 のときは無効) | 有効 | 無効 |
| 6 | T3GPOL | ゲート極性 | 正論理 | 負論理 | |
| 5 | T3GTM | ゲート・トグルモード(立ち上がりパルスでトグルされる) | ON | OFF | |
| 4 | T3GSPM | シングル・パルスモード | ON | OFF | |
| 3 | T3GGO/ T3DONE |
シングル・パルスモードの状態 | 待機 | 終了 | |
| 2 | T3GVAL | ゲートの状態を反映(Read Only) | 開 | 閉 | |
| 1 | T3GSS1 | ゲートの信号源 00 = 外部信号ピン 01 = Timer0 10 = Timer2 |
|||
| 0 | T3GSS0 | ||||
| TCLKCON | 4 | T1RUN | タイマー1 クロック源 (Read Only) | OSC | 他 |
| 1 | T3CCP2 | ECCP信号源 10 = ECCP1 、ECCP2 ともにTimer3/Timer4 01 = ECCP1は Timer1/Timer2、 ECCP2はTimer3/ Timer4 00 = ECCP1、 ECCP2ともに Timer1 / Timer2 |
|||
| 0 | T3CCP1 | ||||
クロック周波数とタイムアップ間隔
| Prescaler | 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 |
T3OSCEN と T3OSCEN 関係
| T3OSCEN | TMR3CS<1:0> | |
|---|---|---|
| 10 | 0x | |
| 1 | T1OSCに電源を供給し、 T1OSCからの信号をカウント |
T1OSCに電源を供給 |
| 0 | T1OSCをOFFにし、 T3CKIからの信号をカウント |
T1OSCをOFF |
PortCに接続されたLEDが点滅するプログラムを作成しました。 Timer3で内部クロック(4MHz)をカウントし、262mSecでカウントアップする毎にLEDを点滅します。
<回路図>
<プログラム>
// File name: Timer3
// Description: Timer3 example
// Timer3で内部クロック(4MHz)をカウントし、
// カウントオーバーでLEDを点滅させる。
// Notes: 4MHz内部クロック
// LED RB0
// LED RB1
// LED RB2
// LED RB3
// Language: MPLAB xc8
// Target: PIC18F26J50
#include <xc.h>
//
#pragma config WDTEN = OFF, PLLDIV = 2, STVREN = ON, XINST = OFF
#pragma config CPUDIV = OSC1, CP0 = OFF
#pragma config OSC = INTOSC, T1DIG = OFF
#pragma config LPT1OSC = OFF, FCMEN = OFF, IESO = OFF
#pragma config WDTPS = 32768
#pragma config DSWDTOSC = INTOSCREF, RTCOSC = T1OSCREF
#pragma config DSBOREN = OFF, DSWDTEN = OFF, DSWDTPS = 8192
#pragma config IOL1WAY = OFF, MSSP7B_EN = MSK7
#pragma config WPFP = PAGE_1, WPEND = PAGE_0, WPCFG = OFF
#pragma config WPDIS = OFF
void main(void){
OSCCON = 0b01100010; // 内部クロック4Mhz
LATB = 0; // PortCのすべてのビットを「0」
TRISB = 0b11110000; // LEDの接続されているポートを出力に設定
T3CON = 0b00100011; // Timer3
// FOSC/4 PS_1/4 OSC1_OFF SYNC_ON 16BIT_RW
T3GCON = 0; // ゲート機能を無効
LATB = 0x03; // LED 2個を点灯
while(1){ // 繰り返しループ
while(!PIR2bits.TMR3IF); // Timer 3 のタイムアップを待つ
PIR2bits.TMR3IF = 0; // キャリーフラッグをクリア
LATB ^= 0x0F; // LED 4個の出力を反転
}
}