---
---
PIC18F14K50は、自由度の大きなシステムクロックを発生させることのできるオシレータ回路を持っています。内部発振回路では、消費電力が最小となる31KHzから、PLLを使用する、32MHzの高速処理まで対応します。また、USB機能を発揮するには、システムクロックを48Mhzにします。
| レジスタ | bit7 | bit6 | bit5 | bit4 | bit3 | bit2 | bit1 | bit0 |
|---|---|---|---|---|---|---|---|---|
| OSCCON | IDLEN | IRCF2 | IRCF1 | IRCF0 | OSTS | HFIOFS | SCS1 | SCS0 |
| OSCCON2 | PRI_SD | HFIOFL | LFIOFS |
| レジスタ | BIT | 名 | 説明 | 1 | 0 | |||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| OSCCON | 7 | IDLEN | SLEEP 命令による移行モード | アイドル | スリープ | |||||||
| 6 | IRCF2 | 内部オシレータ周波数 (初期値 011=1MHz)
|
||||||||||
| 5 | IRCF1 | |||||||||||
| 4 | IRCF0 | |||||||||||
| 3 | OSTS | オシレータ ステータス (ReadOnly) | CONFIG | 内部 | ||||||||
| 2 | HFIOFS | HFINTOSC周波数安定(ReadOnly) | 安定 | 非安定 | ||||||||
| 1 | SCS1 | システムクロック選択ビット (初期値 00=CONFIG) 1x=内部Osc 01=Timer1 Osc 00=CONFIG により決定 |
||||||||||
| 0 | SCS0 | |||||||||||
| OSCCON2 | 2 | PRI_SD | プライマリ オシレータ駆動 | ON | OFF | |||||||
| 1 | HFIOFL | HFINTOSC 周波数ロック | Yes | No | ||||||||
| 0 | LFIOFS | LFINTOSC 周波数安定(ReadOnly) | 安定 | 非安定 | ||||||||
| 設定レジスタ | 48Mhz | 内部 32Mhz | 内部 4Mhz | |
|---|---|---|---|---|
| Config | FOSC | HS | IRC | IRC |
| PLLEN | ON | ON | -- | |
| CPUDIV | NOCLKDIV | NOCLKDIV | -- | |
| OSCCON | IRCF<2:0> | -- | 110 | 101 |
| SCS<1:0> | 00 | 00 | 1x | |
代表例として、クリスタル発振子を使った48Mhzと内部発振回路を使った32Mhzと4Mhzについてレジスタの設定値を一覧表に示します。
以下の3例のサンプルプログラムを作成しました。
<プログラム>
// File name: LED
// Description: DigitalIO example
// 2つのLEDが点滅する。
// Notes: 4MHz内部クロック
// LED0 RC0
// LE1D RC1
// Language: MPLABX xc8(v1.12)
// Target: PIC18F14K50
#include <xc.h> // PIC のハードウエア定義
#pragma config FOSC = IRC, PLLEN = ON, FCMEN = OFF
#pragma config IESO = OFF, USBDIV = OFF, CPUDIV = NOCLKDIV
#pragma config PWRTEN = OFF, BOREN = OFF, WDTEN = OFF
#pragma config HFOFST = OFF, MCLRE = OFF
#pragma config STVREN = ON, BBSIZ = OFF, LVP = OFF
#pragma config XINST = OFF
#pragma config CP0 = OFF, CP1 = OFF, CPB = OFF
#pragma config WRT0 = OFF, WRT1 = OFF, WRTB = OFF, WRTC = OFF
#pragma config EBTR0 = OFF, EBTR1 = OFF, EBTRB = OFF
void main(void){
OSCCON = 0b01010010; // 内部クロック4Mhz
LATC = 0; // PortCのすべてのビットを「0」
TRISC = 0b11110000; // LEDの接続されているポートを出力に設定
while(1){ // 繰り返しループ
if(PORTBbits.RB7){ // SW(RB7)が1なら
LATC = 0b00000011; // LED 2ヶ点灯 2ヶ消灯
}else{ // SW(RB7)が0なら
LATC = 0b00001100; // LEDの点灯消灯を交替
}
} // ここまで繰り返し
}
// File name: LED
// Description: DigitalIO example
// 2つのLEDが点滅する。
// Notes: 8MHz 内部クロックをPLLで4倍し32MHzクロック
// LED0 RC0
// LE1D RC1
// Language: MPLABX XC8
// Target: PIC18F14K50
#include <xc.h>
#define _XTAL_FREQ 32000000 // delay_ms(x) のための定義
#pragma config MCLRE = OFF
#pragma config PWRTEN = OFF
#pragma config BOREN = OFF
#pragma config BORV = 30
#pragma config WDTEN = OFF
#pragma config WDTPS = 32768
#pragma config STVREN = ON
#pragma config FOSC = IRC // 内部クロック
#pragma config PLLEN = ON
#pragma config CPUDIV = NOCLKDIV
#pragma config USBDIV = OFF
#pragma config FCMEN = OFF
#pragma config IESO = OFF
#pragma config HFOFST = OFF
#pragma config LVP = OFF
#pragma config XINST = OFF
#pragma config BBSIZ = OFF
#pragma config CP0 = OFF
#pragma config CP1 = OFF
#pragma config CPB = OFF
#pragma config WRT0 = OFF
#pragma config WRT1 = OFF
#pragma config WRTB = OFF
#pragma config WRTC = OFF
#pragma config EBTR0 = OFF
#pragma config EBTR1 = OFF
#pragma config EBTRB = OFF
void DelayMs(int dlyms);
void main(void){
OSCCON = 0b01100000; // 内部クロック8Mhz x PLL4
TRISC=0b11111100; // 入出力設定
while(1){ // 繰り返しループ
PORTC = 0b00000001; // LED0点灯
DelayMs(500); // 500mSecの遅延
PORTC = 0b00000010; // LED1点灯
DelayMs(500); // 500mSecの遅延
} // ここまで繰り返し
}
void DelayMs(int dlyms){
while(dlyms--) __delay_ms(1); // dlyms x 1mS遅延
}
// File name: LED
// Description: DigitalIO example
// 2つのLEDが点滅する。
// Notes: 12MHz Xtal 48MHzクロック
// LED0 RC0
// LE1D RC1
// Language: MPLABX XC8
// Target: PIC18F14K50
#include <xc.h>
#define _XTAL_FREQ 48000000 // delay_ms(x) のための定義
#pragma config MCLRE = OFF
#pragma config PWRTEN = OFF
#pragma config BOREN = OFF
#pragma config BORV = 30
#pragma config WDTEN = OFF
#pragma config WDTPS = 32768
#pragma config STVREN = ON
#pragma config FOSC = HS // 12MHz Xtal
#pragma config PLLEN = ON
#pragma config CPUDIV = NOCLKDIV
#pragma config USBDIV = OFF
#pragma config FCMEN = OFF
#pragma config IESO = OFF
#pragma config HFOFST = OFF
#pragma config LVP = OFF
#pragma config XINST = OFF
#pragma config BBSIZ = OFF
#pragma config CP0 = OFF
#pragma config CP1 = OFF
#pragma config CPB = OFF
#pragma config WRT0 = OFF
#pragma config WRT1 = OFF
#pragma config WRTB = OFF
#pragma config WRTC = OFF
#pragma config EBTR0 = OFF
#pragma config EBTR1 = OFF
#pragma config EBTRB = OFF
void DelayMs(int dlyms);
void main(void){
TRISC=0b11111100; //入出力設定
while(1){ //繰り返しループ
PORTC = 0b00000001; // LED0点灯
DelayMs(500); // 500mSecの遅延
PORTC = 0b00000010; // LED1点灯
DelayMs(500); // 500mSecの遅延
} // ここまで繰り返し
}
void DelayMs(int dlyms){
while(dlyms--) __delay_ms(1); // dlyms x 1mS遅延
}