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
- ClamAVのアップデート
- Smartyも入れてみる
- etchでPHP4->PHP5
- etchでのSamba設定
- etchでのメール設定
- 玄箱HGのetch化
- Webdruidでログ解析
- PEARも入れてみる
- 玄箱WEBのUTF-8化
- phpMyAdminでMySQL
- postmasterの変更
- ウィルスメール対策
- SPAMメール対策
- メールサーバ(IMAP)
- メールサーバ(Postfix)
- 猫にXOOPS
- PHPも入れてみる
- MySQLを入れてみる
- Subversion導入
- WebDav導入
- Apacheのrewrite機能
- Apacheディレクトリ設定
- Apache1.3->2.0
- ddclientの設定
- 静かな玄箱
- ユーザ追加