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

ホーム
12F1822
16F1455
16F1459
18F14K50
18F26J50
dsPIC
その他
    
16F18313
16F18325
16F18346
16F1619
Curiosity
---
---
システムクロック
2020-04-02

PIC16F1619は、自由度の大きなシステムクロックを発生させることのできるオシレータ回路を持っています。内部発振回路では、消費電力が最小となる31KHzから、PLLを使用する、32MHzの高速処理まで対応します。代表例として、内部発振回路を使った1MHz~32Mhzの5例をサンプルプログラムに示します。

32 MHzの内部発振器周波数の選択

内部オシレータブロックは、PLLと8MHzまたは16 MHzの内部発振器出力を使用し、32 MHz内部システムクロックを成生します。32 MHzの内部クロックを使用するには、次の設定が必要です。

*注意*
Config PLLEN を ON にすると、PLL をソフトウェアで無効にすることがでなくなるため、HFINTOSCの 8MHz 及び 16MHz はシステムクロックとしては出力できまくなります。

名称 設定値 内容
FOSC ECL 外部クロックAMP gain 低 (0-0.5MHz)
ECM 外部クロックAMP gain 中 (0.5-4MHz)
ECH 外部クロックAMP gain 高 (4-20MHz)
HS X-tal 発振 4MHz - 10MHz
INTOSC 内部発振
PLLEN ON PLL稼働
OFF PLL停止


発振回路関連のコンフィグレーション設定値

レジスタ bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
OSCCON SPLLEN IRCF<3:0> - SCS<1:0>
OSCSTAT - PLLR OSTS HFIOFR HFIOFL MFIOFR LFIOFR HFIOFS
OSCTUNE - TUN<6:0>
レジスタ BIT 説明 1 0
OSCCON 7 SPLLEN PLL 許可 (コンフィグの PLLEN=1 では無視) 許可 禁止
6 IRCF3 内部オシレータ周波数
1111=16MHz 1110=8MHz 1101= 4MHz 1100= 2MHz 1011=1MHz
1010=500kHz 1001=250kHz 1000=125kHz 0111=500kHz (初期値)
0110=250kHz 0101=125kHz 0100=62.5kHz 001x=31.25kHz
000x=31kHzLF
5 IRCF2
4 IRCF1
3 IRCF0
1 SCS1 システムクロック選択ビット
1x=内部OSC   00=CONFIG により決定(初期値)
0 SCS0
OSCSTAT 6 PLLR (Read Only) PLL状況 使用可 不可
5 OSTS (Read Only)Oscillator Start-up Timer 状況 指定源 内部OSC
4 HFIOFR (Read Only)HFINTOSC 状況 使用可 不可
3 HFIOFL (Read Only)HFINTOSC ロック安定状態 (±2%)/td> 使用可 不可
2 MFIOFR (Read Only)MFINTOSC 状況 使用可 不可
1 LFIOFR (Read Only)LFINTOSC 状況 使用可 不可
0 HFIOFS (Read Only)HFINTOSC 安定状況(±0.5%) 安定 範囲外
OSCTUNE <6:0> TUN 0111111(最大) - - 0000000(中心) - - 1000000(最小)
設定レジスタ 内部OSC 外部OSC
32MHz 32MHz 16MHz 4MHz 32MHz 8MHz
Config FOSC INTOSC INTOSC INTOSC INTOSC HS ECH
PLLEN ON ON OFF OFF ON OFF
OSCCON IRCF<3:0> 1111 1110 1111 1101 -- --
SCS<1:0> 00 00 00 00 00 00
外部入力 なし なし なし なし 8MHz Xtal 8MHz Osc

各種クロックのプログラム例

以下の5例のサンプルプログラムを作成しました。

<プログラム>

1 MHz 内部発振使用

/*********************************************************************
*  File name: Digital I/O
*  Notes: 1 MHz内部クロック PLLはOFF
*        LED    RC5
* PIC16F1619  MPLAB X IDE with XC8
* 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

    while (1)
    {
        __delay_ms(500);   // 500mS遅延
        LED = ! LED;
    }
}

4 MHz 内部発振使用

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

	#define _XTAL_FREQ 4000000
	#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 = 0b01101000;	// PLL disabled; 4MHz_HF; FOSC;
	    TRISC5 = 0;         // Outputs RC5

	    while (1)
	    {
	        __delay_ms(500);   // 500mS遅延
	        LED = ! LED;
	    }
	}

16 MHz 内部発振使用

/*********************************************************************
*  File name: Digital I/O
*  Notes: 16MHz内部クロック PLLはOFF
*        LED    RC5
* PIC16F1619  MPLAB X IDE with XC8
* Copyright (c) 2020 iwamoto All Rights Reserved
* *******************************************************************/
#include <xc.h>

#define _XTAL_FREQ 16000000
#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 = 0b01111000;	// PLL disabled; 16MHz_HF; FOSC;
    TRISC5 = 0;         // Outputs RC5

    while (1)
    {
        __delay_ms(500);   // 500mS遅延
        LED = ! LED;
    }
}

32 MHz 内部発振8MHzをPLLで4倍

/*********************************************************************
*  File name: Digital I/O
*  Notes: 32MHz内部クロック PLLはON
*        LED    RC5
* PIC16F1619  MPLAB X IDE with XC8
* Copyright (c) 2017 iwamoto All Rights Reserved
* *******************************************************************/
#include <xc.h>

#define _XTAL_FREQ 32000000

#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 = ON
#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 = 0b11110000;	// PLL ON; 8Hz_HF; FOSC;
    while(PLLR == 0);   // PLL安定まで待つ
    TRISC5 = 0;         // Outputs RC5

    while (1)
    {
        __delay_ms(500);   // 500mS遅延
        LED = ! LED;
    }
}