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