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