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

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

18F26J50には、5本のタイマーがあります。タイマー0は、8ビットモードと16ビットモードをソフトウエアで選ぶことができます。 ここでは、内部クロックをカウントする16ビットタイマーとして使用し、タイマーがカウントアップする仕様について説明します。サンプルで作成したプログラムは、タイマー0がカウントアップするとLEDを点滅するものです。なお、下表空色のレジスタ項目の設定は、C18のライブラリtimers関数である(OpenTimer0)を利用するためCプログラムで個別に設定する必要はありません。下表レジスタ項目の緑色はリセット直後の設定を表しています。

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

*注意*
T0CKIピンは、Peripheral Pin Select (PPS)機能でプログラムで、物理的に接続するピンを指定します。

高低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 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の接続されているポートを出力に設定
    T0CON = 0b10000001;      // Timer 0 設定(262mSecごと)
                             // 16BIT_mode SOURCE_INT PS_1/4
    LATB = 0x03;                       // LED 2個を点灯
    while(1){                          // 繰り返しループ
        while(! INTCONbits.TMR0IF);    // Timer 0 のタイムアップを待つ
        INTCONbits.TMR0IF = 0;         // Timer 0 からのキャリーフラッグをクリア
        LATB ^= 0x0F;                  // LED 4個の出力を反転
    }
}