【PIC24EP64GP202】70Mipsで使ってみたけど・・・

2021年2月19日


◆PIC24EP64GP202を70Mipsで使ってみます。
dsPIC33FJ/PIC24HJファミリに非常に近いのでコードや回路はそのまんま流用できそうです。

準備

チップワンストップさんで購入しました。
・型番:PIC24EP64GP202-I/SP
実験のしやすいDIPタイプにしました。
・金額:¥533円
価格的には非常にやすいです。

参考資料

マイクロチップのサイトからリファレンスマニュアルをダウンロードしました。
①dsPIC33E/PIC24Eファミリリファレンスマニュアル セクション7.オシレータ:DS70580B_JP
page25:「7.37 MHz内部FRCにPLLを併用する場合のサンプルコード」を参照しました。
サンプルコードは60mipsですが、70MIPSに変更しました。
②dsPIC33FJ128MC802を40mipsで動かした時の記事がそのまま流用できます。
詳細はこちらから。
レジスタの扱いや式をまとめてあります。

開発環境

MPLAB-IDEではダメそう・・・
プロジェクトのターゲットデバイスには「PIC24EP64GP202」がちゃんとありますが
「p24EP64GP202.h」(ヘッダーファイル)がサポートフォルダには入っていません。
厄介なことにMPLAB-IDEではPIC24EP64GP202は開発できないようです。
どうしてもMPLAB-Xは使いたくなかったんですが・・・
(年をとると新しいことがやりづらくなるんだよね)
とはいってもしょうがないのでMPLAB-Xをインストールしてプロジェクト立ち上げ!

ソース

サンプルコードは60mipsですが、70MIPSに変更しました。
具体的には
・60mips「PLLFBDbits.PLLDIV=63」
 ↓
・70mips「PLLFBDbits.PLLDIV=73」
動作確認としてPORTBのbit6をパタパタ4回やってみました。

//=========================================================
//  TEST
//=========================================================
//== include ============================================
#include <p24Exxxx.h>
#include <stdio.h>
//== define =============================================================
//== configuration ======================================================
//== FGS ==================================================
#pragma config  GWRP=OFF                //User program memory is not write-protected
#pragma config  GCP=OFF                 //General Segment Code protect is Disabled
//== FOSCSEL ==============================================
#pragma config  FNOSC=FRCPLL        //Internal Fast RC (FRC) w/ PLL
#pragma config  IESO=OFF                 //Start-up device with user-selected oscillator source
//== FOSC =================================================
#pragma config  FCKSM=CSECMD            //Both Clock Switching and Fail-Safe Clock Monitor are disabled
#pragma config  IOL1WAY=ON              // Allow Only One Re-configuration
#pragma config  OSCIOFNC=ON             //OSC2 pin has digital I/O function
#pragma config  POSCMD=NONE             //Primary Oscillator Disabled
//== FWDT ===============================================
#pragma config  FWDTEN=OFF              //Watchdog timer enabled/disabled by user software
//== FPOR ================================================
#pragma config  WDTWIN=WIN25             //WDT Window is 50% of WDT period
#pragma config  ALTI2C1=OFF              //I2C1 mapped to SDA1/SCL1 pins
#pragma config  ALTI2C2=OFF              //I2C2 mapped to SDA2/SCL2 pins
//== FICD ===========================================
#pragma config  ICS=PGD3                //PGD3_use
#pragma config  JTAGEN=OFF              //jtag=off
//== interrupt_function_prototype ================================================
//== StringBox ===================================================================
//== main ==================================================================
int main(void)
{
//== Fcy=Fosc/2=7.37M*((PLLFBD+2)/(N2*N1))/2=69.09MHz ================
PLLFBDbits.PLLDIV = 73;     //<8:0>M=PLLFBD+2
CLKDIVbits.DOZE = 0b000;    //<14:12>Fcy*1
CLKDIVbits.FRCDIV = 0b000;  //<10:8>FRC*1
CLKDIVbits.PLLPOST = 0;     //<7:6>N2=2
CLKDIVbits.PLLPRE  = 0;     //<4:0>N1=2
OSCTUNbits.TUN = 0b00000;   //<5:0>FRC+0MHz
__builtin_write_OSCCONH(0x01);
__builtin_write_OSCCONL(0x01);
while(OSCCONbits.COSC != 0b001);
while(OSCCONbits.LOCK != 1);    //wait for PLL Lock
//== AD_PORT ==========================================================
ANSELA  = 0x0000;
ANSELB  = 0x0000;
//=== TRISA ===========================================================
TRISA = 0x0000;            //initial_
//== TRISB =============================================================
TRISB = 0x0000;            //input:
//== while(1) ==============================================================
while(1)
{
//== FRONT_DEBUG =======================================================
asm("BSET LATB, #6");
asm("BCLR LATB, #6");
asm("BSET LATB, #6");
asm("BCLR LATB, #6");
asm("BSET LATB, #6");
asm("BCLR LATB, #6");
asm("BSET LATB, #6");
asm("BCLR LATB, #6");
//== BACK_DEBUG =======================================================
}//while(1)
}//int main(void)
//========================================================================
//=================================================================================

ポート制御の様子をオシロスコープで確認

あれ!?1サイクル33.33MHz(70/2≒35MHz)だと!?
次回は「PIC24EPは実質35mipsじゃないか!?」となります。
bd4339b4.png

回路図

c1edb830.png

よろしければバナーをクリックお願いします!