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

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

18F26J50は、18F14K50に比べて、融通性の高い回路構成になっています。このために、USBを駆動する48MHzを内部発振回路で作ることができます。
代表例として、12MHzのクリスタル(セラミック)発振子を使った48Mhzと内部発振回路を使った48Mhzと4Mhzについて設定を必要をするレジスタを一覧表に示します。

*注意*
PLLを動作させるには、 OSCTUNE のPLLEN ビットを「1」にセット、さらに安定するまで2mS以上待機する必要があります。

レジスタ bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
OSCCON IDLEN IRCF2 IRCF1 IRCF0 OSTS - SCS1 SCS0
OSCTUNE INTSRC PLLEN TUN5 TUN4 TUN3 TUN2 TUN1 TUN0
レジスタ 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
1 SCS1 システムクロック選択ビット  (初期値 00=CONFIG)
  1x=内部Osc  01=Timer1 Osc 00=CONFIG により決定
0 SCS0
OSCTUNE 7 INTSRC 31KHz時のINTOSC/INTRC切換 INTOSC INTRC
6 PLLEN PLLイネーブル ON OFF
<5:0> TUN INTOSC 周波数調整
設定レジスタ 内部 48Mhz 内部 4Mhz 電源ON直後
Config PLLDIV 2 - 保存値
CPUDIV OSC1 - 保存値
OSC INTOSCPLL INTOSC 保存値
OSCCON IRCF<2:0> - 101 011
SCS<1:0> 00 1x 00


代表例として、内部発振回路を使った48Mhzと4Mhzについてレジスタの設定値を一覧表に示します。

プログラム例

内部発振8Mhzを使用し、48MHzシステムクロックシステムで、LEDを点滅させるプログラムです。

<プログラム>

//  File name: INTOSCPLL
//  Description: 内部OSCでPLLを使用し48Mhz
//  Timer0を使い、4つのLEDが2ケずつ点滅する。
//  Notes: 48MHz内部クロック
//    LED: RB0 RB1 RB2 RB3
//    Language: MPLAB xc8
//    Target: PIC18F26J50

#include    <xc.h>

#pragma config WDTEN = OFF          //WDT disabled (enabled by SWDTEN bit)
#pragma config PLLDIV = 2           //Divide by 2 (8 MHz intl osc input)
#pragma config STVREN = ON          //stack overflow/underflow reset enabled
#pragma config XINST = OFF          //Extended instruction set disabled
#pragma config CPUDIV = OSC1        //No CPU system clock divide
#pragma config CP0 = OFF            //Program memory is not code-protected
#pragma config OSC = INTOSCPLL      //Internal oscillator, PLL enenabled
#pragma config T1DIG = OFF          //S-Osc may not be selected, unless T1OSCEN = 1
#pragma config LPT1OSC = OFF        //high power Timer1 mode
#pragma config FCMEN = OFF          //Fail-Safe Clock Monitor disabled
#pragma config IESO = OFF           //Two-Speed Start-up disabled
#pragma config WDTPS = 32768        //1:32768
#pragma config DSWDTOSC = INTOSCREF //DSWDT uses INTOSC/INTRC as clock
#pragma config RTCOSC = T1OSCREF    //RTCC uses T1OSC/T1CKI as clock
#pragma config DSBOREN = OFF        //Zero-Power BOR disabled in Deep Sleep
#pragma config DSWDTEN = OFF        //Disabled
#pragma config DSWDTPS = 8192       //1:8,192 (8.5 seconds)
#pragma config IOL1WAY = OFF        //IOLOCK bit can be set and cleared
#pragma config MSSP7B_EN = MSK7     //7 Bit address masking
#pragma config WPFP = PAGE_1        //Write Protect Program Flash Page 0
#pragma config WPEND = PAGE_0       //Start protection at page 0
#pragma config WPCFG = OFF          //Write/Erase last page protect Disabled
#pragma config WPDIS = OFF          //WPFP[5:0], WPEND, and WPCFG bits ignored

void main(void){
    int startup_counter = 600;
    OSCTUNEbits.PLLEN = 1;        // PLLを起動し
    while(startup_counter--);     // 安定するまで2ms以上待つ

    TRISB = 0b11110000;      // LEDの接続されているポートを出力に設定
    T0CON = 0b10000100;      // Timer 0 設定(175mSecごと)
                             // 16BIT_mode SOURCE_INT PS_1/32
    LATB = 0x03;                       // LED 2個を点灯
    while(1){                          // 繰り返しループ
        while(! INTCONbits.TMR0IF);    // Timer 0 のタイムアップを待つ
        INTCONbits.TMR0IF = 0;         // Timer 0 からのキャリーフラッグをクリア
        LATB ^= 0x0F;                  // LED 4個の出力を反転
    }
}