TOTAL:1002, TODAY:149

MPLAB ICD2でPICマイコン(PIC24F)のデバッグ

先日、Microchip Directで、PICマイコンのインサーキットデバッガー(MPLAB ICD2:下の写真)と評価デモボード(16-Bit 28-Pin Starter Board)を購入しました。秋月のキットも考えたのですが、11月までキャンペーン価格で安かったこと、dsPICのデバッグができるということでMPLAB ICD2にしました。統合開発環境MPLAB IDEもv8.0がリリースされており、早速、MPLAB ICD2とデモボードを試してみました。

PICデモボード(16-Bit 28-Pin Starter Board)

評価ボードは自作できそうであり、Microchip製デモボードを買おうかどうか迷ったのですが、これまでMPLAB ICD2を使用したことがなかったため、MPLAB ICD2が確実に繋がり、dsPICが動く評価ボードの方が安心と思い、16-Bit 28-Pin Starter Board を購入しました。本当はMicrochip Directのキャンペーンで半額になっていたのが一番の理由かもしれませんが。。。

デモボードには、上の基板以外にUSBケーブルとdsPIC33F(品番:dsPIC33FJ12GP202-I/SP)、サンプルやドキュメントが入ったCDが付いてきました。基板にもともと載っているPICマイコンは、PIC24F(品番:PIC24FJ64GA002-I/SP)でした。付属していたマイコンは、PIC24FとdsPIC33Fだけですが、デモボードには、28ピンのdsPIC30FやPIC28Hを付ける事もできます。電源はUSB、もしくは9V電源(DCジャック)から供給します。基板にはUSB機能があるPIC18Fが実装されているので、USBを通してRS-232Cシリアル通信ができます。水晶は7.3728MHzが付いていました。これまで、トラ技の付録基板では、ライターがないと内蔵RC発信器しか試せなかったので、水晶が付いているだけでも私には勉強になります。これ以外の主な周辺機器は次の通りです。

  • チップLED 4個
  • 可変抵抗 1個
  • スイッチ 2個
  • MPLAB ICD2接続用モジュラージャック
  • PICKit2接続用ヘッダーピン
  • 電源、及びシリアル通信用USBポート(Bタイプ)

付属のCDには、PIC24F用、dsPIC30F用、dsPIC33F用のサンプルプログラムが付いているため、MPLAB IDE v7.52以上とC30コンパイラ(どちらも無償)があれば、コンパイルするだけで動かすことができます。サンプル自体は、LEDを点滅させ、簡単なUART送受信を行うプログラムです。付属のサンプルはSFRレジスタだけで書かれていたので、これをC30ライブラリに置き換えることにしました。

MPLAB IDEv8.0とC30コンパイラv3.02のインストール

2007年12月時点で最新であるMPLAB IDEv8.0とC30コンパイラv3.02を使うことにしました。各々下記のサイトからダウンロードできます。

私の場合、これまでMPLAB IDEv7.52とC30コンパイラv3.01を使用していたため、両方ともアンインストールしてから、最新版をインストールしました。上書きインストールでうまくいくかどうかは分かりません。インストール自体は、ウィザード形式でデフォルトのまま設定すれば、問題ないと思います。MPLAB IDEを先にインストールすると、C30コンパイラがそのまま適切なフォルダにインストールされるようなので、そちらの方が簡単です。MPLABのインストール方法は、

に分かりやすく書かれています。v8.0での日本語ですが、例えば、コメント編集中で/* */で囲まれていない状態では乱れますが、最終的に正しく囲めば特に問題ありません。
デモボードに付いていたPIC24Fを動かす場合、デバイスとしてPIC24FJ64GA002を選択し、リンカースクリプトとしてp24FJ64GA002.gldを選択します。また、C30ライブラリを使用するには、libPIC24Fxxx-coff.aをリンクします。問題なくインストールと設定ができれば、次の画面のようなデバッグが可能となります。

C30コンパイラv3.02をインストールする前、v3.0を使用していました。v3.0ではPIC24FのC30ライブラリで使用するフラグをOR演算子( | )で繋げるのがデフォルトになっていましたが、

    OpenTimer1(T1_ON | T1_IDLE_CON | T1_GATE_OFF | T1_PS_1_256 | 
               T1_SYNC_EXT_OFF | T1_SOURCE_INT, 14400-1);

v3.02では、次のようにAND演算子( & )で繋げるように修正されています。

    OpenTimer1(T1_ON & T1_IDLE_CON & T1_GATE_OFF & T1_PS_1_256 & 
               T1_SYNC_EXT_OFF & T1_SOURCE_INT, 14400-1);

ちなみに、v3.0でも、C:\Program Files\Microchip\MPLAB C30\support\h\peripheral_24F\ Generic.hの39行目にある#defineを次のようにコメントアウトすれば、&演算子タイプになります。

    :   : 途中略 :   :

/*  UnComment the following macro to use AND_OR mask based setting,... */
//#define USE_AND_OR

    :   : 途中略 :   :

個人的には、' | 'の方が慣れているのですが、dsPIC30F/33F, PIC24Hは & しか使用できないようなので、私も & を使うことにしました。しかし、v3.02でもPIC24Fの&フラグが一部間違っています。具体的には、C:\Program Files\Microchip\MPLAB C30\support\h\peripheral_24F\uart.hの193行目が間違っており、次のように修正すると正しくなります。

    :   : 途中略 :   :

#define UART_NO_PAR_9BIT        0xFFFF  /*No parity 9 bit*/
#if 0 /* バグ回避 */
#define UART_ODD_PAR_8BIT       0xFFFE  /*odd parity 8 bit*/
#define UART_EVEN_PAR_8BIT      0xFFFD  /*even parity 8 bit*/
#define UART_NO_PAR_8BIT        0xFFFC  /*no parity 8 bit*/
#else
#define UART_ODD_PAR_8BIT       0xFFFD  /* *10* odd parity 8 bit*/
#define UART_EVEN_PAR_8BIT      0xFFFB  /* *01* even parity 8 bit*/
#define UART_NO_PAR_8BIT        0xFFF9  /* *00* no parity 8 bit*/
#endif

    :   : 途中略 :   :

MPLAB C30ライブラリを使用したサンプル

もともと、このデモボードにはSFR(レジスタ名を定義した変数)で書かれたサンプルが付いていましたが、せっかくなので、C30ライブラリを使ったものに置き換えてみました。250msec間隔で4個のLEDが点滅します。勉強のつもりで多くのコメントを付けました。説明するよりも見た方が早いと思います。

/*
 * PIC24FJ64GA002 デモボードのテストプログラム
 * C30ライブラリを使用
 */
#include "p24fj64ga002.h"
#include "timer.h"
#include "uart.h"

/*
 * IESO_OFF     : 2段速度スタートアップ無効
 * FNOSC_PRIPLL : 主発振 & PLL
 * FCKSM_CSDCMD : クロック切り替え無効、クロックモニタ無効
 * OSCIOFNC_OFF : ピン構成ビットCLKO
 * IOL1WAY_ON   : OSCCONビットはいつでも書き込み可能
 * I2C1SEL_SEC  : 2nd SCL1/SDA1ピンを使用
 * POSCMOD_XT   : XT発振モード
 */
_CONFIG2(IESO_OFF & FNOSC_PRIPLL & FCKSM_CSDCMD & OSCIOFNC_OFF &
                IOL1WAY_ON & I2C1SEL_SEC & POSCMOD_XT);

/*
 * JTAGEN_OFF     : JTAGオフ
 * GCP_OFF        : コードプロテクトオフ
 * GWRP_OFF       : コードフラッシュ書き込み保護オフ
 * BKBUG_OFF      : バックグラウンドデバッグオフ
 * ICS_PGx1       : EMUC/EMUDピンをPGC1/PGD1と共用
 * FWDTEN_OFF     : ウォッチドッグタイマ無効
 * WINDIS_OFF     : 窓付きウォッチドッグタイマ無効
 * FWPSA_PR128    : WDTプリスケーラー 128
 * WDTPS_PS32768  : WDTポストスケーラー 32768
 */
_CONFIG1(JTAGEN_OFF & GCP_OFF & GWRP_OFF & BKBUG_ON & ICS_PGx1 &
           FWDTEN_OFF & WINDIS_OFF & FWPSA_PR128 & WDTPS_PS32768);


#define XTFREQ    (7372800)    /* 水晶発信子 7.3728 MHz */
#define PLLMODE   (4)          /* PLL設定 */
#define FCY       (XTFREQ * PLLMODE / 2)  /* 命令サイクル 14.7456 MHz */

#define BAUDRATE  (9600)       
#define BRGVAL    (((FCY / BAUDRATE) / 16) - 1) 

/*
 * UART_IDLE_CON        : IDLEモード時動作続行
 * UART_DIS_WAKE        : WAKEUP無効
 * UART_DIS_LOOPBACK    : LOOPBACK無効
 * UART_DIS_ABAUD       : 自動ボーレート無効
 * UART_BRGH_SIXTEEN    : UxBRG = (Fcy / (16 * BAUDRATE)) - 1
 * UART_NO_PAR_8BIT     : 8ビット、パリティなし
 * UART_1STOPBIT        : ストップビット長 1
 */
unsigned int g_U1MODE = 
    UART_EN & UART_IDLE_CON & UART_IrDA_DISABLE & UART_MODE_FLOW &
    UART_UEN_00 & UART_DIS_WAKE & UART_DIS_LOOPBACK & UART_DIS_ABAUD &
    UART_UXRX_IDLE_ONE & UART_BRGH_SIXTEEN &
    UART_NO_PAR_8BIT & UART_1STOPBIT;
/*
 * UART_INT_TX          : 一文字空きができれば割り込み
 * UART_TX_ENABLE       : 送信有効
 * UART_INT_RX_CHAR     : 一文字受信ごとに割り込み
 * UART_ADR_RECTECT_DIS : アドレス一致機能オフ
 * UART_RX_OVERRUN_CLEAR        : オーバーランビットのクリア
 */
unsigned int g_U1STA = 
    UART_INT_TX & UART_IrDA_POL_INV_ZERO & UART_SYNC_BREAK_DISABLED &
    UART_TX_ENABLE & UART_INT_RX_CHAR & 
    UART_ADR_DETECT_DIS & UART_RX_OVERRUN_CLEAR;

int main(void)
{
    /* CPUクロック分周比 */
    CLKDIV = 0;             /* CPUクロック:周辺クロック=1:1, FRC分周=1:1 */

    /* PIC24FのI/Oピン割付(Remappable Peripheral) */
    RPINR18bits.U1RXR = 9;  /* RP9をU1RXに設定 */
    RPOR4bits.RP8R = 3;     /* RP8をU1TXに設定 */

    AD1PCFG = 0x1FF;        /* アナログピンをすべてデジタルに変更 */

    LATB = 0x0;         /* RB0-15をLOWレベルに設定 */
    TRISB = 0x0FFF;     /* RB12-15をLED出力ピンに設定 */

    /*
     * タイマー1の設定
     * T1_ON            : タイマーモジュールオン
     * T1_IDLE_CON      : IDLEモード時動作続行
     * T1_GATE_OFF      : ゲート制御オフ
     * T1_PS_1_256      : プリスケーラー 1/256
     * T1_SYNC_EXT_OFF  : 外部クロック同期オフ
     * T1_SOURCE_INT    : 内部クロック(Fcy)使用
     *
     * PIC24F内部クロック : Fcy = Fosc/2 = (7372800*4)/2 = 14.7456 MHz
     * プリスケーラー     : 1/256
     * タイマークロック   : 14.7456MHz / 256 = 57.6KHz
     * 250msecで割り込み  : PR1 = 57600 * (250 / 1000) = 14400 
     */
    OpenTimer1(T1_ON & T1_IDLE_CON & T1_GATE_OFF & T1_PS_1_256 & 
         T1_SYNC_EXT_OFF & T1_SOURCE_INT, 14400-1);

    /*
     * プライオリティ      : レベル5
     * 割り込み許可
     */
    ConfigIntTimer1(T1_INT_PRIOR_5 & T1_INT_ON);

    /* UART1の設定 */
    OpenUART1(g_U1MODE, g_U1STA, BRGVAL);

    while(1)
    {
        int a;
    
        while(DataRdyUART1() == 0);
        a = ReadUART1();

        WriteUART1('"');
        while(BusyUART1());

        WriteUART1(a);
        while(BusyUART1());

        WriteUART1('"');
        while(BusyUART1());
    }

    return 0;
}


void __attribute__((interrupt, no_auto_psv)) _T1Interrupt(void)
{
    IFS0bits.T1IF = 0;  /* 割り込みフラグをクリア */
    
    LATB ^= 0xF000;     /* LEDの点滅 */
}

電子工作のソフトウェアを使用する人は少ないと思いますが、一応、ダウンロードプログラムを置きました。よかったら参考にしてください。MPLAB ICD2と16-Bit 24-Pin Starter Boardがあれば、下の写真のようなLEDの点滅を実験できます。

最新の7件

OpenGL

電子工作

玄箱HG

ホームページ

日記

Copyright (C) 2007 Arakin , All rights reserved.