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

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

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

クロック周波数とタイムアップ間隔

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

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