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

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

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)
111=16MHz110=8MHz101= 4MHz100= 2MHz
011=1MHz010=500kHz001=250kHz000=31kHz
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遅延
}