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

ホーム
16F18313
16F18325
16F18346
16F1619
Curiosity
---
---
    
12F1822
16F1455
16F1459
18F14K50
18F26J50
dsPIC
その他
dsPIC33F を 内部クロック (FRC) で40MIPS動作させる

dsPICの内部クロックをPLLで80MHzにし、PICを40MIPSの最高速で動作させます 作成したプログラムは、

という基本的なものです。これで、MPLAB Xとの接続やdsPICプログラミングの基本を確認できます。 起動直後のPLL設定は、PLL回路への入力クロックを25倍する設定です。このPLL出力周波数が発振能力である、100MHz-200MHz の範囲内にあれば正常に起動します。 つまり、PLLへの入力が4MHz-8MHzの範囲内であれば、特別な操作をせずとも通常起動ができます。もし、この範囲外であれば、一度PLLを使用せずに内部クロックFRCなどでPICを起動し、その後プログラムで、PLLがカバーできる発振周波数範囲になるようPLL設定をしなおしてから、クロック源をPLLの使用に切り替えます。 クロック源の切り替えは、プログラムミスなどによる不必要な操作を排除するためにLOCKがかかっており、特殊なアンロックシーケンスに従い、ロックを外してから行います。 内部クロックは7.37MHzと特別な操作をしなくても通常起動可能な周波数です。

クロックを80MHzまで高くすると、ブレッドボードを使用してPICを正常動作させることができませんでした。原因はブレッドボードの各端子が、隣の端子との間で不必要な容量結合をしているためと推測しています。このため、マイクロチップが販売している「DM164120-3 - PICkit 28-Pin Demo Board」$25.99の一部プリントパターンを変更して、実験しました。

プログラム

/* ***************************************************
 * File:   main.c
 * LED を遅延サブルーチンを使用して点滅させる
 *     LEDは、Port B RB10 - RB13 に接続
 *     SW は、Port B RB3(AN5)    に接続
 *
 * Target PIC dsPic33FJ128GP802
 * MPLAB X , Microchip XC16
 * Created on 2014/03/09, 17:45
 * ******************************************************/

// 動作スピードの定義(遅延で使用する)---------------------
#define FCY 39617500UL                 // 79.2275MHz / 2

#include <xc.h>                        //
#include <libpic30.h>                  // 遅延ライブラリ

// コンフィギュレーション ----- 内部クロック + PLL動作 -----
_FGS(GWRP_OFF & GCP_OFF);
_FOSCSEL(FNOSC_FRCPLL);
_FOSC(FCKSM_CSECMD & OSCIOFNC_ON & POSCMD_NONE);
_FWDT(FWDTEN_OFF);


int main (void){
    //  PLLに関連する設定 ------------------------------------------
    PLLFBD = 41;                 // M = 43  7.37MHz x43/2/2
    CLKDIVbits.PLLPOST=0;        // N2 = 2          = 79.2275MHz
    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遅延
    }
}