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

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

18F14K50には、4本のタイマーがあります。タイマー0は、8ビットモードと16ビットモードをソフトウエアで選ぶことができます。 ここでは、内部クロックをカウントする16ビットタイマーとして使用し、タイマーがカウントアップする仕様について説明します。サンプルで作成したプログラムは、タイマー0がカウントアップするとLEDを点滅するものです。

*注意*
Timer0 の全16ビットを一括して読み出すために、下位バイトを読み出すタイミングで上位バイトの値を読み出しTMR0H(バッファ)に保存します。これによって、Timer0 の全16 ビットの値を同時に取得することができます。
書き込みは、まず、TMR0H のバッファレジスタに上位バイトに書き込む値を保存した後で、TMR0L への書き込みが実行されると、TMR0H の内容によって上位バイトも更新されます。これによって、Timer0 の全16 ビットを同時に更新できます。

高低2レベルの優先度を使用するタイマー0に関連するレジスターを一覧で説明します。

レジスタ bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
TMR0L Timer0 Register, Low Byte
TMR0H Timer0 Register, High Byte
RCON IPEN SBOREN RI TO PD POR BOR
INTCON GIE/GIEH PEIE/GIEL TMR0IE INTIE RABIE TMR0IF INT0IF RABIF
INTCON2 nRABPU INTEDG0 INTEDG1 INTEDG2 TMR0IP RABIP
T0CON TMR0ON T08BIT T0CS T0SE PSA T0PS2 T0PS1 T0PS0
レジスタ BIT 説明 1 0
RCON 7 IPEN 2レベルのインタラプト優先度 使用
INTCON2 2 TMR0IP タイマー0 インタラプト優先度
INTCON 7 GIEH 高優先度インタラプトを使用許可 許可
6 GIEL 低優先度インタラプトを使用許可 許可
5 TMR0IE タイマー0 インタラプトを使用許可 許可
2 TMR0IF タイマー0 オーバーフロー発生フラグ 発生  
T0CON 7 TMR0ON タイマー0 ON/OFF ON OFF
6 T08BIT タイマー0 8/16Bitモード 8 16
5 T0CS タイマー0 クロック選択 外部 内部
4 T0SE タイマー0 クロックエッジ選択 UP DN
3 PSA タイマー0 プリスケラー使用 使用
2 T0PS2 プリスケラー比率
111=1:256(既定) 110=1:128 101=1:64 100=1:32
011=1:16 010=1:8 001=1:4 000=1:2
1 T0PS1
0 T0PS0

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

Prescalerl 8bitモード 16bitモード
31k 4M 48M 31k 4M 48M
 なし 33mS 256μS 21μS 8.5Sec 66mS 5.5mS
 1:4 132mS 1024μS 85μS 34Sec 262mS 22mS
 1:32 1S 8.2mS 682μS 4.5min 2.1Sec 175mS
 1:256  8.5Sec  66mS 5.5mS 36min 16.7Sec 1.4Sec

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

PortC - RC2 に接続されたLEDが点灯するプログラムを作成しました。Timer0で内部クロック(4MHz)をカウントし、カウントオーバー(262mS間隔)でLEDが点滅する。

プログラム

//  File name: Timer0
//  Description: Timer0 example
//  Timer0で内部クロック(4MHz)をカウントし、
//  カウントオーバーでLEDを点滅させる。
//  Notes: 4MHz内部クロック
//        LED RC0
//    Language: MPLABX 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;               // 入出力設定

    T0CON = 0b10000001;                // Timer 0 設定(262mSecごと)
                                       // 内部クロックをカウント
                                       // 16BIT モード PS_1/4

    while(1){                          // 繰り返しループ
        while(! INTCONbits.TMR0IF);    // Timer 0 のタイムアップを待つ
        INTCONbits.TMR0IF = 0;         // Timer 0 からのキャリーフラッグをクリア
        LED = ! LED;                   // LEDへの出力を反転
    }
}