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

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

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

*注意*
RA5,RA4 をI/Oピンとして使用する場合には、Configuration Word を FEXTOSC = OFF、CLKOUTEN = OFF とします。

*重要*
OSCCON1 を変更して、システムクロックを選択し直すには、Configuration Word を CSWEN = ON として、NOSC NDIV によるクロック変更を許可します。

HFINTOSC

1MHz - 32MHzを供給できる内部発振器です。利用の多い1MHzと32MHzをシステムクロックとして使用するには、特に簡素化されており、Configuration Word の RSTOSC<2:0> を HFINT1 または HFINT32 に設定すれば OK です。システムが電源ONとリセット時に OSCCON1 と OSCFRQ を自動設定するため、クロック関連のこれらレジスターをプログラム内でユーザーが設定する必要はありません。
1MHz〜16MHzをシステムクロックとして使用するには、OSCFRQ に希望する周波数をセットします。

レジスタ bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
OSCCON1 - NOSC<2:0> NDIV<3:0>
OSCCON2 - COSC<2:0> CDIV<3:0>
OSCCON3 CWSHOLD SOSCPWR SOSCBE ORDY NOSCR - - -
OSCSTAT1 EXTOR HFOR LFOR SOR ADOR - PLLR
OSCEN EXTOEN HFOEN - LFOEN SOSCEN ADOEN - -
OSCFRQ - - - - - HFFRQ<2:0>
OSCTUNE - - HFTUN<5:0>
レジスタ BIT 説明 1 0
OSCCON1 6:4 NOSC<2:0> 変更後のOSC源 - 値は下表参照
3:0 NDIV<3:0> 変更後の分周比 - 値は下表参照
OSCCON2 6:4 COSC<2:0> (Read Only)現在のOSC源 - 値は下表参照
3:0 CDIV<3:0> (Read Only)現在の分周比 - 値は下表参照
OSCCON3 7 CWSHOLD Clock Switch 作動一時停止 停止 続行
6 SOSCPWR Secondary Oscillator 強さ High Low
5 SOSCBE Secondary Oscillator Bypass 外部入力 内部OSC
4 ORDY (Read Only)OSC 状況 安定 変化中
3 NOSCR (Read Only)New Oscillator状況 使用可 不可
OSCSTAT1 7 EXTOR (Read Only) EXTOSC OSC状況 使用可 不可
6 HFOR (Read Only) HFINTOSC状況 使用可 不可
4 LFOR (Read Only)LFINTOSC 状況 使用可 不可
3 SOR (Read Only)Secondary OSC状況 使用可 不可
2 ADOR (Read Only)ADCRC Oscillator 状況 使用可 不可
0 PLLR (Read Only)PLL 状況 使用可 不可
OSCEN 7 EXTOEN EXTOSC Manual Request Enable ON -
6 HFOEN HFINTOSC Manual Request Enable ON -
4 LFOR LFINTOSC Manual Request Enable ON -
3 SOR Secondary OSC Manual Request Enable ON -
2 ADOR ADCRC Oscillator Manual Request Enable ON -
OSCTUNE <5:0> TUN 011111(最大) - - 000000(中心) - - 100000(最小)
OSCFRQ <2:0> HFFRQ 値は下表参照
NOSC/COSC Clock Source
111 EXTOSC
110 HFINTOSC (1 MHz)
100 LFINTOSC
011 SOSC
001 EXTOSC with 4xPLL
000 HFINTOSC with 2x PLL
(32 MHz)
NDIV/CDIV Clock Divider NDIV/CDIV Clock Divider
1001 512 0100 16
1000 256 0011 8
0111 128 0010 4
0110 64 0001 2
0101 32 0000 1
HFFRQ Nominal Freq. (MHz)
(NOSC = 110)
2xPLL Freq. (MHz)
(NOSC = 000)
000 1 N/A
001 2
010 Reserved
011 4
100 8 16
101 12 24
110 16 32
111 Reserved Reserved
Config と クロック関連レジスター初期値
Configで、RSTOSC = HFINT1 を選ぶと
• NOSC = 110 HFINTOSC
• NDIV = 0100 1/16
• HFFRQ = 110 16MHz

Configで、RSTOSC = HFINT32 を選ぶと
• NOSC = 000 HFINTOSC with x2 PLL
• NDIV = 0000 1/1
• HFFRQ = 110 16MHz

と電源ON,リセットの初期値に設定される。

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

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

*注意*
これらのプログラムは、Curiosityボードでの使用を想定しているため、低電圧書き込みを可能にする設定になっています。Configuration Word を MCLRE = ON、LVP = ON とします。

<プログラム>


/*************************************
 * File: 1MHz Clock sample
 * System ClockはConfigで内部1MHzに設定
 * RC5 は PPSでTMR0を出力
 * PIC16F18346
 * Created on May 22, 2020, 2:37 PM
 **************************************/

#include <xc.h>

#pragma config FEXTOSC = OFF,RSTOSC = HFINT1  // HFINTOSC (1MHz)
#pragma config CLKOUTEN = OFF,CSWEN = OFF,FCMEN = OFF
#pragma config MCLRE = ON,PWRTE = OFF,WDTE = OFF,LPBOREN = OFF
#pragma config BOREN = OFF,BORV = LOW,PPS1WAY = OFF,STVREN = ON
#pragma config DEBUG = OFF
#pragma config WRT = OFF,LVP = ON,CP = OFF,CPD = OFF

void main(void) {

    TRISC5 = 0;             // RC5を出力に設定

    // --------------------------------------------
    // Timer0 は、Fosc/4を16bitモードでカウント
    // PPS機能を使いTMR0出力をRC5に出力する
    // --------------------------------------------
    T0CON1 = 0b01000000;    // Fosc/4 Sync PreS 1/1
    T0CON0 = 0b10010000;    // T0 ON 16bit Post 1/1
    RC5PPS = 0b11100;       // TMR0をRC5に出力

    while(1);
}

Configで CSWEN = ON として、NOSC NDIV によるクロック変更を許可して、Power on reset で、クロックが内部 1MHzに設定された後に、プログラムで4Mhzに変更する。

/*************************************
 * File: 4MHz Clock sample
 * System ClockはConfigで内部 1MHzに設定
 * その後、HFOSC 16MHz / 4 で 4MHZ に変更
 *   RSTOSC = HFINT1
 *   CSWEN = ON
 * RC5 は PPSでTMR0を出力
 * PIC16F18346
 * Created on May 22, 2020, 2:37 PM
 **************************************/

 #include <xc.h>

#pragma config FEXTOSC = OFF,RSTOSC = HFINT1  // HFINTOSC (1MHz)
#pragma config CLKOUTEN = OFF,CSWEN = ON,FCMEN = OFF
#pragma config MCLRE = ON,PWRTE = OFF,WDTE = OFF,LPBOREN = OFF
#pragma config BOREN = OFF,BORV = LOW,PPS1WAY = OFF,STVREN = ON
#pragma config DEBUG = OFF
#pragma config WRT = OFF,LVP = ON,CP = OFF,CPD = OFF

void main(void) {

    OSCFRQ  = 0b00000110;   // HFOSC  16MHz
    OSCCON1 = 0b01100010;   // HFINT1 DIV 4

    TRISC5 = 0;             // RC5を出力に設定

    // --------------------------------------------
    // Timer0 は、Fosc/4を16bitモードでカウント
    // PPS機能を使いTMR0出力をRC5に出力する
    // --------------------------------------------
    T0CON1 = 0b01000000;    // Fosc/4 Sync PreS 1/1
    T0CON0 = 0b10010000;    // T0 ON 16bit Post 1/1
    RC5PPS = 0b11100;       // TMR0をRC5に出力

    while(1);
}

/*************************************
 * File: 32MHz Clock sample
 * System ClockはConfigで内部 32MHzに設定
 * RC5 は PPSでTMR0を出力
 * PIC16F18346
 * Created on May 22, 2020, 2:37 PM
 **************************************/

 #include <xc.h>

#pragma config FEXTOSC = OFF,RSTOSC = HFINT32  // HFINTOSC (32MHz)
#pragma config CLKOUTEN = OFF,CSWEN = OFF,FCMEN = OFF
#pragma config MCLRE = ON,PWRTE = OFF,WDTE = OFF,LPBOREN = OFF
#pragma config BOREN = OFF,BORV = LOW,PPS1WAY = OFF,STVREN = ON
#pragma config DEBUG = OFF
#pragma config WRT = OFF,LVP = ON,CP = OFF,CPD = OFF

void main(void) {

    TRISC5 = 0;             // RC5を出力に設定

    // --------------------------------------------
    // Timer0 は、Fosc/4を16bitモードでカウント
    // PPS機能を使いTMR0出力をRC5に出力する
    // --------------------------------------------
    T0CON1 = 0b01000101;    // Fosc/4 Sync PreS 1/32
    T0CON0 = 0b10010000;    // T0 ON 16bit Post 1/1
    RC5PPS = 0b11100;       // TMR0をRC5に出力

    while(1);
}