JavaScript が無効です。有効にしてください。
ななよんのホームページ
トップ > 電子工作 > PIC マイコン > デュアルコア PIC「dsPIC33CH64MP202」の使い方

デュアルコア PIC「dsPIC33CH64MP202」の使い方

最終更新日さいしゅうこうしんび:2023-12-14

 秋月電子通商で、dsPIC33CH64MP202T という PIC マイコンが販売されています。この PIC は ESP32 のようにデュアルコアなので、並列処理が可能です。また、クロックが高速で、スレーブコアは 100 MIPS* なので LED 表示器の制御にも使えそうです。そこで dsPIC33CH64MP202 のプログラミング方法を試してみました。最終的には東京メトロ 7000 系の LED 表示器を光らせるのを目標としてみます。情報が少なく、わからない点も多かったので、試行錯誤した結果を残しておきます。誰かの役に立てれば幸いです。

*MIPS(ミプス・ミップス):1 秒間に処理できる命令数。1 MIPS で 100 万命令なので、100 MIPS では 1 億命令を 1 秒間に実行することができる。

dsPIC33CH64MP202 が 4 つ。1 つは変換基板に実装した。
  • (このページ)L チカ

※随時追加予定

dsPIC33CH の仕様

概略図

 dsPIC33CH64MP202 は、マスタコアとスレーブコアのデュアルコア仕様で、マスタコアが 180 MHz 動作で RAM 16 kB・プログラムメモリ 64 kB、スレーブコアが 200 MHz 動作で RAM 4 kB・プログラムメモリ(PRAM)24 kB と、スレーブコアのほうが高速ですがメモリが少ないです。また、ペリフェラルもマスタコアとスレーブコアそれぞれについており(数が異なっているものもあります)、ESP32 ではペリフェラルは共通だったのに対し、dsPIC では PIC が 2 個入っているような感じです。マスタコアでインタフェースや通信処理を行い、スレーブコアでリアルタイム処理を行うことを想定しているようです。

 なお、スレーブコアのプログラムメモリはフラッシュメモリではなく RAM となっており、起動時にマスタコアからスレーブコアの PRAM にプログラムを転送され動作します。

主な機能 マスタコア スレーブコア
スピード 180 MHz(90 MIPS) 200 MHz(100 MIPS)
プログラムメモリ 64 kB(21.8 kW) 24 kB(8 kW)
RAM 16 kB 4 kB
16ビットタイマ 1 1
DMA 6 2
SCCP 8 4
UART 2 1
SPI/I2S 2 1
I2C 2 1
CAN 1 -
SENT 2 -
CRC 1 -
QEI 1 1
PTG 1 -
CLC 4 4
16 ビット PWM 4 8
12 ビット ADC 1 3
ウォッチドッグタイマ 1 1
デッドマンタイマ 1 -

 タイマはマスタとスレーブでそれぞれ 1 つしか入っていませんが(タイマの種類はどちらもタイマ 1 です)SCCP がタイマモードとして使えるようです。


広告

プログラミング方法

 dsPIC33CH64MP202 のプログラムは、マスタとスレーブを別のプロジェクトとして作成します。ESP32 のように、1 つのプロジェクト(スケッチ)でそれぞれのタスクの記述をすることはできません。

 プロジェクト作成時にデバイスの型番を入力する画面がありますが、「dsPIC33CH64MP202」がマスタコア、「dsPIC33CH64MP202S1」がスレーブコア用です。それぞれを MCC で設定し、マスタの設定を保存して、生成されたファイルをスレーブで読み込むことでデュアルコアプログラミングを行います。

 マスタ-スレーブ間は、MSI(Master Slave Interface)で接続されますが、CLC や I2C 等のペリフェラルは独立しています。GPIO は、ポートにはどちらのコアからもアクセス可能ですが、スレーブから出力したいピンは、マスタ側で予約(正確には、スレーブに所有権を持たせる)しておく必要があります。ESP32 のように、一度入出力方向を設定すればどちらのコアからでも操作ができるわけではありませんので注意が必要です。

まずは L チカをしてみます

 例題として、デュアルコア L チカをしてみましょう。マスタとスレーブで、それぞれ異なった周期で LED を点滅させてみます。

マスタ設定

 まずマスタ用のプロジェクトを作成します。プロジェクト作成時にデバイスを選ぶ欄がありますが、マスタは「dsPIC33CH64MP202」を選びます。末尾に S1 とつくものはスレーブ用です。今回は「dsPIC33CH64MP202_master」という名前で作成しました。

デバイス型番を選択する画面

 プロジェクトを作成したら、MCC を起動します。最新版の MPLAB では MCC が同梱されているので、別で導入する必要はありません。

 まずはクロックの設定をします。マスタコアは 180 MHz なので、Fosc が 180 MHz になるように調整します。また、PGC/PGD(Pickit4 との接続端子)は 3 カ所から選べますが、今回は RB9、RB8 に設定しました。

マスタのクロック設定

 マスタコアでは RA1 に接続した LED を点滅させることにしましょう。出力設定で、他の PIC と同じように、画面下部の Pin Manager で出力したいピンを選び、Pin Module で名前をつけたりピンの設定を行ったりできます。

マスタのピン設定画面

 Device Resources(左下)のペリフェラルから、「Slave Core」を探して追加します。この画面でスレーブコアの設定を行います。まず、一番上の欄にスレーブのプロジェクト名を入力します。今回は「dsPIC33CH64MP202_slave」としました(プロジェクト自体は後ほど作成します)。Slave Core を追加すると、Pin Manager に Ownership という行ができるので、スレーブコアから操作(出力)したいピンを予約(所有権を渡す)します。今回は、RA0 をスレーブコアで制御してみます。

 その他に、Slave Core のタブで、下の画像のように設定を行ってください。Disable Slave on Slave Reset のチェックを外します。200 MHz で動かしたいので、PLL Enable と Enable Clock Switching にチェックを入れます。そうしないと、スレーブコアが動作しませんでした。スレーブコアが動作しない原因がわからず半日費やしたのですが、マスタ側でこの設定をすることを忘れないでください。

スレーブコアの設定画面

 設定が完了したら、Slave Core タブの左上にある「Save Master Settings」を押してください。プロジェクトフォルダ(dsPIC33CH64MP202_master.x)内に master_config.mc3 というファイルが生成されますので、生成されていることを確認してください。

スレーブ設定

 マスタの MCC で左上領域の Generate ボタンを押下したら、スレーブコア用のプロジェクトを作成します。デバイスとして「dsPIC33CH64MP202S1」を選択し、メインプロジェクトに設定(Set as Main Project)し MCC を開きます。

 スレーブコア用の MCC 画面では、左上の System に「Master Core」という項目がありますので、あることを確認してください。ない場合、末尾に S1 がついていない マスタコア用のプロジェクトを作成している可能性があります。

 Master Core タブの上に、「Load Slave Settings from Master Configuration」ボタンがあります。これを押すと、ファイルエクスプローラが開くので、先ほど生成した、マスタプロジェクト内にある master_config.mc3 を選んでください。なお、保存先を指定しない状態では、プロジェクトは C:\Users\(ユーザ名) \MPLABXProjects に保存されています。これでマスタの設定がスレーブプロジェクトに取り込まれます。

 スレーブのクロック設定をします。スレーブコアは 200 MHz まで動作するので、200 MHz になるように設定しました。

スレーブのクロック設定

 次に、ピン設定です。マスタコアの設定時に RA0を スレーブコアに所有権を移したので、RA0 を output に設定します。予約を行っていないピンを出力しようとすると WARNING が出て教えてくれます。ピン設定の方法はマスタコアと同様です。

スレーブのピン設定

 これで MCC での設定が完了しました。generate ボタンを押してください。

スレーブをマスタに追加する

 プログラミングを行う前に、スレーブプロジェクトをマスタプロジェクトに追加する必要があります。マスタプロジェクトとスレーブプロジェクトが両方開いた状態で、左上画面 Projects タブの「Secondaries」を右クリックし、Add Secondary Project をクリックして、スレーブプロジェクトのフォルダを選択します。先ほども書きましたが、デフォルトでは、プロジェクトは C:\Users\(ユーザ名) \MPLABXProjects に保存されています。

 Secondaries にスレーブプロジェクトを追加できたら、マスタプロジェクトのプロパティを開き、Secondaries カテゴリの上部 Secondary Projects の右端にある Build にチェックを入れます。

 なお、公式のドキュメントでは「Secondaries」ではなく「Slave」という名前だったので少し戸惑いましたが、Secondaries にスレーブプロジェクトを追加すれば同様に設定が行えました。バージョンアップで名称が変わったのかもしれませんね。

 あとはマスタプロジェクトとスレーブプロジェクトのプログラムをそれぞれのプロジェクトで記述します。プログラムファイルは、左上 Projects タブで、(プロジェクト名)の中の Source Files の中にある main.c です。

XC16 プログラミングの注意点

 dsPIC33CH64MP202 は 16 ビットで、コンパイラは XC16 です。PIC16F 等の XC8 とは書き方が異なっているので注意が必要です。

 まず、XC8ではメイン関数を下記のように書きました。

void main(void) {
	// your program
	while(1) {
		// loop
	}
}

 しかし、XC16 では main を int 型にし、戻り値を設定する必要があります。すなわち、下記のようにします。

int main(void) {
	// your program
	while(1) {
		// loop
	}

	return 1;
}

 MCC で設定を行った場合、ひな形を作ってくれるので覚えなくても大丈夫ですが、void で書くとエラーが出てコンパイルできませんので注意してください。

 次に、XC8 では __XTAL_FREQ でクロック周波数をマクロ定義すれば __delay_ms 等のウェイトが使えるようになりましたが(MCC を使用した場合は MCC で生成されるファイル内でこの記述をしてくれたので、明示的に定義する必要はありませんでした)XC16 では、書き方が違っています。MCC を使用した場合でも、下記のように書かないと delay が使えません。

 まず、マクロ FCY を定義します。FCY は、クロック周波数/2 の数字に、末尾 UL をつけます。例えば、今回マスタコアは 180 MHz で動かすので、2 で割り UL を追加して「90000000UL」と書きます。

 次に、libpic30.h を include します。

#define FCY 90000000UL
#include <libpic30.h>

 また、最初から書かれている mcc_generated_files/system.h を include するプログラムではどういうわけかコンパイルできません。代わりに mcc_generated_files/mcc.h を include すればコンパイルが通りました。「This file will be removed in future MCC releases. Use system.h instead.」(このファイルは将来の MCC リリースで削除されます。代わりに system.h を使ってください)という警告が出ますが、現状そうしないとコンパイルできないので、無視してしまいます。

マスタのプログラム

 最終的にマスタは以下のようなプログラムになりました。500 ms 間隔で LED を点滅させます。

#define FCY 90000000UL

#include <libpic30.h>
#include "mcc_generated_files/mcc.h"

int main(void) {
    SYSTEM_Initialize();

    SLAVE1_Program();	// スレーブの PRAM にプログラムを転送
    SLAVE1_Start();		// スレーブコア起動
    
    while(1) {
        LED1_Toggle();		// LED の状態を反転
        __delay_ms(500);	// 500 ms 待つ
    }
    
    return 1; 
}

スレーブのプログラム

 スレーブでは LED を 700 ms 間隔で点滅させます。

#define FCY 100000000UL

#include <libpic30.h>
#include "mcc_generated_files/mcc.h"

int main(void) {
    SYSTEM_Initialize();
    
    while(1) {
        LED2_Toggle();		// LED の状態を反転
        __delay_ms(700);	// 700 ms 待つ
    }
    
    return 1;
}

 PICへはマスタプロジェクトを書き込みます。書き込み方法は通常の PIC と同じなので省略します。MCLR ピンは入力専用ピンと共用ではなく、独立したピンになっているので、動作させたいときは H レベルにする(プルアップ抵抗をつける)のを忘れないでください。また、電源 5 V は定格外です。3.3 V で使用します。

 動作している様子が下の写真です。静止画なので点滅の様子はわかりませんが、2 つの LED が異なった周期で点滅しました。

動作の様子
戻る
広告

右メニュー

【表示がおかしい・崩れる場合】PC では Shift と F5 を同時押し。スマホではキャッシュを削除してみてください。



とうサイトでは Cookieくっきー使用しようします。くわしくは上記じょうきの「プライバシーポリシー・免責事項等めんせきじこうとう」もご確認かくにんください。



上へ戻る