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

ホーム
16F18313
16F18325
16F18346
16F1619
Curiosity
---
---
    
12F1822
16F1455
16F1459
18F14K50
18F26J50
dsPIC
その他
dsPIC33F を12MHzクリスタルで40MIPS動作させる

dsPICのプライマリ発振器で12MHzのクリスタル発振を行い、その周波数ををPLLで80MHzにして、PICを40MIPSの最高速で動作させます。 起動直後の設定では、入力周波数が4-8MHzの範囲でないとPLLがロックしないため、次の手順でPLLを設定し直しクロックを切り替えます。

dsPIC33F を4MHzクリスタルで40MIPS動作させる

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遅延
    }
}