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