---
			---
		
		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)
							
  | 
					||||||||||
| 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個の出力を反転
    }
}