PIC18F14K50の基本動作から応用プログラムまでを学びます。

ホーム
16F18313
16F18325
16F18346
16F1619
Curiosity
---
---
    
12F1822
16F1455
16F1459
18F14K50
18F26J50
dsPIC
その他
タイマー3

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

タイマー3のプログラム例

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個の出力を反転
    }
}