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

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

16F1619には、3種のタイマーがあります。タイマー0は、8ビットのカウンターで、その入力は内部クロックか外部からの信号を選ぶことができます。 ここでは、内部クロックをカウントするタイマーとして使用し、タイマーがカウントアップする仕様について説明します。サンプルで作成したプログラムは、タイマー0がカウントアップするとLEDを点滅するものです。

Prescaler 8bitモード
31k 1M 32M
なし 33mS 1024μS 32μS
1:4 132mS 4096μS 128μS
1:32 1 S 32.8mS 1024μS
1:256 8.5 S 262mS 8.2mS

*注意*
T0CKIプリスケラー出力周波数は FOSC/8 を超えてはなりません。

汎用ピンをデジタルで使用する場合は、デジタルの入出力をTRISで設定するだけでなく、アナログ併用ピンかを調べ、併用ピンであれば、ANSELAxでデジタル設定にする必要があります。ANSELxは、デフォルトの設定が、アナログのため、デジタル入力で使用するには、必ず該当ピンをデジタルに設定(ANSx = 0)する必要があります。

レジスタ bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
INTCON GIE PEIE TMR0IE INTE IOCIE TMR0IF INTF IOCIF
OPTION_REG nWPUEN INTEDG TMR0CS TMR0SE PSA  PS<2-0>
TMR0 Holding Register for the 8-bit Timer0 Count
レジスタ BIT 説明 1 0
INTCON 7 GIE 全インタラプトの使用許可 許可
5 TMR0IE タイマー0 インタラプトを使用許可 許可
2 TMR0IF タイマー0 オーバーフロー発生フラグ 発生
OPTION_REG 5 TMR0CS タイマー0 クロック選択 外部 内部
4 TMR0SE タイマー0 クロックエッジ選択 UP DN
3 PSA タイマー0 プリスケラー使用 使用
2 PS2 プリスケラー比率
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 0
1 PS1 1 0
0 PS0 1 0

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

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

プログラム

/*********************************************************************
*  File name: Timer 0
*  Notes: 1MHz内部クロック PLLはOFF
*        LED    RC5
* PIC16F1619  MPLAB X IDE with XC8
* 2020-4-4
* Copyright (c) 2017 iwamoto All Rights Reserved
* *******************************************************************/
#include <xc.h>

#define _XTAL_FREQ 1000000
#define LED LATC5

// CONFIG
#pragma config FOSC = INTOSC, PWRTE = OFF, MCLRE = ON, CP = OFF
#pragma config BOREN = ON, CLKOUTEN = OFF, IESO = ON, FCMEN = ON
#pragma config WRT = OFF, PPS1WAY = ON, ZCD = OFF, PLLEN = OFF
#pragma config STVREN = ON, BORV = LO, LPBOR = OFF, LVP = ON
#pragma config WDTCPS = WDTCPS1F, WDTE = OFF, WDTCWS = WDTCWSSW, WDTCCS = SWC

/*********************************************************
                         Main application
 *********************************************************/
void main(void)
{
    OSCCON = 0b01011000;      // PLL disabled; 1MHz_HF; FOSC;
    TRISC5 = 0;               // Outputs RC5
    OPTION_REG = 0b00000101;  // Timer 0 設定(66mSecごと)
                              // 内部クロックをカウント
                              // PS_1/64
    while(1){                 // 繰り返しループ (132mSecごと)
        while(! TMR0IF);      // タイムアップを待つ (66mSec)
        TMR0IF = 0;           // キャリーフラッグをクリア
        while(! TMR0IF);      // タイムアップを待つ (66mSec)
        TMR0IF = 0;           // キャリーフラッグをクリア
        LED = ! LED;          // LEDへの出力を反転
    }
}