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

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

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

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

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

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