---
---
dsPICのプライマリ発振器で12MHzのクリスタル発振を行い、その周波数ををPLLで80MHzにして、PICを40MIPSの最高速で動作させます。 起動直後の設定では、入力周波数が4-8MHzの範囲でないとPLLがロックしないため、次の手順でPLLを設定し直しクロックを切り替えます。
dsPICのプライマリ発振器で4MHzのクリスタル発振を行いPLLで80MHzにして、40MIPSの最高速で動作させます。 起動直後のPLL倍率は8.3倍に設定されるため(PLLPRE:1/2、PLL倍率:x50、PLLPOST:1/3)、そのままでは、33.3MHz動作になっています。 次の手順でPLLを設定し直しクロックを80MHzに切り替えます。
<12MHzのクリスタル プログラム>
/* ***************************************************
* File: main.c
* LED を遅延サブルーチンを使用して点滅させる
* クロックは12MHzXtalをPLLで、80MHz(40MIPS)動作
* LEDは、Port B RB10 - RB13 に接続
* SW は、Port B RB3(AN5) に接続
*
* Target PIC dsPic33FJ128GP802
* MPLAB X , Microchip XC16
* Created on 2014/03/18,
* ******************************************************/
// 動作スピードの定義(遅延で使用する)---------------------
#define FCY 40000000UL // 80MHz / 2
#include <xc.h> //
#include <libpic30.h> // 遅延ライブラリ
// コンフィギュレーション ----- HS(10-20MHz)発振 -----
_FGS(GWRP_OFF & GCP_OFF);
_FOSCSEL(FNOSC_PRI);
_FOSC(FCKSM_CSECMD & OSCIOFNC_OFF & POSCMD_HS);
_FWDT(FWDTEN_OFF);
int main (void){
// PLLに関連する設定 ------------------------------------------
PLLFBD = 38; // M = 40 12MHz x40/3/2
CLKDIVbits.PLLPOST=0; // N2 = 2 = 80MHz
CLKDIVbits.PLLPRE=1; // N1 = 3
// 変更のアンロックシーケンス
__builtin_write_OSCCONH(0x03); // PRI PLL にクロック源を指定
__builtin_write_OSCCONL(0x01); // クロック変更を開始
while (OSCCONbits.COSC != 0b011); // クロック変更の開始を確認
while (OSCCONbits.LOCK!=1); // PLLの安定(LOCK)を待つ
// --------------------------------------------------------------
TRISB = 0xC3FF; // LED1-4のPortを出力設定
_PCFG5 = 1; // SW Portをデジタル設定
while(1){
if(_RB3) LATB = 0x0C00; // S1 Open ならLED1,2をON
else LATB = 0x3000; // S1 Push ならLED3,4をON
__delay_ms(200); // 200mS遅延
LATB = 0x0000; // すべてのLEDをOFF
__delay_ms(200); // 200mS遅延
}
}
<4MHzのクリスタル プログラム>
/* ***************************************************
* File: main.c
* LED を遅延サブルーチンを使用して点滅させる
* クロックは4MHzXtalをPLLで、80MHz(40MIPS)動作
* LEDは、Port B RB10 - RB13 に接続
* SW は、Port B RB3(AN5) に接続
*
* Target PIC dsPic33FJ128GP802
* MPLAB X , Microchip XC16
* Created on 2014/03/18,
* ******************************************************/
// 動作スピードの定義(遅延で使用する)---------------------
#define FCY 40000000UL // 80MHz / 2
#include <xc.h> //
#include <libpic30.h> // 遅延ライブラリ
// コンフィギュレーション ----- XT(3-10MHz)発振 + PLL -----
_FGS(GWRP_OFF & GCP_OFF);
_FOSCSEL(FNOSC_PRIPLL);
_FOSC(FCKSM_CSECMD & OSCIOFNC_OFF & POSCMD_XT);
_FWDT(FWDTEN_OFF);
int main (void){
// PLLに関連する設定 ------------------------------------------
PLLFBD = 78; // M = 80 4MHz x80/2/2
CLKDIVbits.PLLPOST=0; // N2 = 2 = 80MHz
CLKDIVbits.PLLPRE=0; // N1 = 2
while (OSCCONbits.LOCK!=1); // PLLの安定(LOCK)を待つ
// --------------------------------------------------------------
TRISB = 0xC3FF; // LED1-4のPortを出力設定
_PCFG5 = 1; // SW Portをデジタル設定
while(1){
if(_RB3) LATB = 0x0C00; // S1 Open ならLED1,2をON
else LATB = 0x3000; // S1 Push ならLED3,4をON
__delay_ms(200); // 200mS遅延
LATB = 0x0000; // すべてのLEDをOFF
__delay_ms(200); // 200mS遅延
}
}