PIC16F18346は、自由度の大きなシステムクロックを発生させることのできるオシレータ回路を持っています。内部発振回路では、消費電力が最小となる31KHzから、PLLを使用する、32MHzの高速処理まで対応します。 代表例として、内部発振回路を使った1MHz~32Mhzの3例をサンプルプログラムに示します。
*注意*
RA5,RA4 をI/Oピンとして使用する場合には、Configuration Word を FEXTOSC = OFF、CLKOUTEN = OFF とします。
*重要*
OSCCON1 を変更して、システムクロックを選択し直すには、Configuration Word を CSWEN = ON として、NOSC NDIV によるクロック変更を許可します。
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で、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); }