24EP256MC202覚書
〔PICの動かせ方入門に戻る〕
忘れないうちにメモします。
ここでの記載はMPLAB X V2.15と
MPLAB(R) XC16 C Compiler Version 1.24を使用しての内容です。
こちらがPIC24EP256MC202のサイトです、
データシート等の資料はここからダウンロードしましょう。
また、上記は英語ですが、日本語資料関連はこちらです。
尚、dsPIC33EP256MC202からDSC(デジタルシグナル コントローラ)機能を取り外したのがPIC24EP256
MC202です。
それとここの記事は、PIC24EPXXXGP/MC202とdsPIC33EPXXXGP/MC202/502系は役に立つでしょう
(因みに、502系はCAN通信機能が有ります)
特徴:
・ 16ビットCPU,内蔵クロックで60MIPS、外付けクロックなら70MIPSで動作します。
(60MIPS=60MHzですが、1命令辺り1サイクルで実行です)
・ I2C/SPI/USARTは各2モジュールづつ有ります。
・ DMA機能が有るので、CPUに負担を掛けずに、CPU(メモリー)と周辺機器間でデータの転送が可能です
(但し、PIC24EPxxxMC202の場合は、DPSRAMを持っていません)
・ 入力キャプチャ機能、入力ピンのイベント発生によるパルスの計測を行います。
周波数の周期や時間を計測するアプリケーションに良いでしょう。
・ 出力コンペア機能、コンペア一致イベントに基づいて出力にパルスを生成するらしい
・ 直交エンコーダインターフェイス(QEI)機能は、機械的な位置を計測するインクリメンタルエンコーダ用
のインターフェイスを提供するモジュールです。
・ 充電時間計測ユニット(CTMU)は、静電容量の相対的変化を正確に計測出来るのでタッチセンサ等に
最適でしょう。
・ ペリフェラルトリガジェネレータ(PTG)機能は、周辺機器どうしの動作を連携させる為の、複雑な
トリガ信号シーケンスを生成するシーケンサーらしい
・ オペアンプ(2モジュール)とコンパレータ(3モジュール)機能、コンパレータにはブランキング機能や
デジタル出力フィルタ回路を使う事が出来ます。
・ プログラマブル巡回冗長検査(CRC)機能は、ソフトウェアによる構成が可能なCRCチェックサム
ジェネレータです。
電源電圧(VDD)は3.0V-3.6Vです。
CORE自体の電圧は1.8Vとなっています、ですのでVDDに3.0V-3.6Vを
使用する場合は内蔵レギュレータを使用しないとダメです。
VCAP(20番)端子に、10uF/16V low-ESR capacitor を取付けVSSに落とします。
・VDD(13番端子)・VSS(8/19番端子)と、アナログ専用電圧入力AVDD(28番端子)・AVSS(27番端子)
※ I2C1/2、SPI1等の通信用ピンは5.5Vトレラント入力になっています。
※ SPI2/UART1/UART2は"PPS"ですので5.5Vトレラント端子に割り当てれば良いでしょう。
MCLR
外部リセット信号を入力する場合のピンとして使用。
リセット信号はLOW(0V:GND接続)でリセットが掛かります、だから
外部リセットを使わない時は1K〜10KΩ抵抗を介してVddに接続しなければならない。
又、MCLRピンにコンデンサーが接続されている場合に、PICKit3を接続するならコンデンサーを
一旦取り外す(ジャンパーピン等で)方が良い様です。
詳しい事は、日本語リファレンスマニュアル"オシレータ編"を見ましょう。
内蔵クロックは7.37MHz(なんと半端な!)です、これを分周して使うか、PLLを通して使うかです。
外部クロックは、3.5〜25MHzを使い、ECモードなら80MHzまでみたいです。
クロック切り替えのコンフィギュレーション
FNOSC |
POSCMD |
オシレータモード |
010(PRI) |
10(HS) |
外部オシレータ (HS) |
011(PRIPLL) |
10(HS) |
PLL併用外部オシレータ(HS) |
001(FRCPLL) |
xx(NONE) |
PLL併用内蔵オシレータ |
その他 |
|
リファレンスマニュアル参照(5頁)
|
例) "PLL併用内蔵オシレータ"なら
#pragma config POSCMD = NONE // 外部オシレータの動作モードの選択 (外部オシレータは使わない)
#pragma config FNOSC = FRCPLL // 内部オシレータでPLL動作させる
内部クロックをPLL(60MIPS)で利用する場合のサンプル
#include <xc.h>
#pragma config PLLKEN = ON // PLLがロックするまで待機し、PLLクロック源へ切り換えます
#pragma config POSCMD = NONE // 外部オシレータの動作モードの選択 (外部オシレータは使わない)
#pragma config FNOSC = FRCPLL // 内部オシレータでPLL動作させる
#pragma config OSCIOFNC = ON // OSC2ピン機能の選択 (OSC2ピンはデジタルI/Oとする)
#pragma config FCKSM = CSDCMD // クロックの監視やクロック切替え操作はしない
#pragma config IESO = OFF // Foscの2段階切り替えでの起動はしない
int main(void)
{
_SWDTEN = 0 ; // ウオッチドッグは無効
// システムクロックの設定(Fosc=120MHz FCY=60MHz/60MIPS)
// Fosc=FRC*(M/(N1*N2)) M=PLLDIV+2 N1=PLLPRE+2 N2=2*(PLLPOST+1)
// Fosc=7.37*(65/(2*2))=119.7625(120MHz) FCY=120/2=60MIPS
_FRCDIV = 0b000 ; // 内部 FRCポストスケーラ(分周しない:7.37MHz)
_PLLPRE = 0b00000 ; // PLLの入力プリスケーラ[N1=2](2分周する:7.37/2=3.685MHz)
_PLLDIV = 63 ; // PLLのフィードバック分周値[M=65]
_PLLPOST = 0b00 ; // PLLの出力ポストスケーラ[N2=2](分周しない)
// Wait for PLL to lock
while (OSCCONbits.LOCK!= 1) ;
}
※ PLLの設定がちょっとぉ複雑ですがぁ...7.37MHzなので実際は59.88125MIPSです。
外付けの10MHz辺りを付ければきちっと60MIPS/70MIPS出せるでしょう。
また、プライマリとは別にセカンダリ外部オシレータとして、外付けの32.768 kHz 水晶振動子を
駆動出来ます、って事はRTC(リアルタイムクロック)が実現出来そうですね。
(PIC24EPXXXGP/MC202には、セカンダリ外部オシレータ用入力ピン"SOSCI/SOSCO"が
見当たらないので未実装と思います)
#pragma config キーワード1 = 設定値 , キーワード2 = 設定値 の様に記述する。
#pragma config BOREN = NOSLP , BORV = 30 , PWRTEN = ON // 記述の例
FICD
ICS :In-Circuit Debuggers(PICKit3等)の通信チャネル
PGD1=PGEC1とPGED1を使う PGD2=PGEC2とPGED2 PGD3=PGEC3とPGED3
JTAGEN :JTAGを利用するのかを設定
ON = 利用する OFF = 利用しない
FPOR
ALTI2C1:I2C1で使用するピンの選択を行う
ON = ASDA1/ASCL1を使用 OFF = SDA1/SCL1を使用(24EP256MC202は選択不可)
ALTI2C2:I2C2で使用するピンの選択を行う
ON = ASDA2/ASCL2を使用 OFF = SDA2/SCL2を使用(24EP256MC202は選択不可)
WDTWIN:ウオッチドッグ周期の何%をウインドウ領域とするのかを指定する
WIN25 = 25% WIN37 = 37.5% WIN50 = 50% WIN75 = 75%
FWDT
WDTPOST :ウォッチドッグタイマ有効時のポストスケーラを設定する
PS1 = 1:1 ・・・・・ PS32768 = 1:32768
WDTPRE :ウォッチドッグタイマ有効時のプレスケーラを設定する
PR32 = 1:32 PR128 = 1:128
PLLKEN :PLLロックの有効/無効を選択する
ON = PLLがロックするまで待機し、PLLクロック源へ切り換えます。(クロック源が
安定するまで待つ)
OFF = PLLがロックするまで待たないで切り換えます。(安定するのを待たない)
WINDIS :ウオッチドッグにウインドウ式を利用するのかを選択する
ON = 利用する OFF = 利用しない
FWDTEN :ウオッチドッグの有効/無効を選択する
ON = ウォッチドッグタイマは常に有効。
OFF = ウオッチドッグの有効/無効は"SWDTEN"ビットで行う。
FOSC
POSCMD :外部オシレータの動作モードの選択
NONE = 外部オシレータは使わない
外部オシレータ使う場合は、HS/XT/ECのモードに設定
OSCIOFNC:OSC2ピン機能の選択
ON = OSC2ピンはデジタルI/Oとする OFF = クロックを出力する
IOL1WAY :IOLOCKビット単方向セット イネーブルビット
ON = IOLOCK ビットは、ロック解除シーケンスを実行後に一度のみセット出来る
一度IOLOCK がセットされると、その後PPS は変更出来ない
OFF= ロック解除シーケンスを実行すれば何度でもIOLOCKをセット/クリア出来る
FCKSM :クロック切替えを行うか選択
CSDCMD = クロックの監視やクロック切替え操作はしない。
CSECMD = クロックの監視はしないが、クロック切替えは行う。
CSECME = クロックの監視とクロック切替えの両方行う。
FOSCSEL
FNOSC :オシレータの動作モード選択ビット
FRC = 内蔵オシレータ(7.37MHz)を選択する。
FRCPLL = 内部オシレータをPLLで動作させる。
PRI = 外部オシレータを選択する。(XT/HS/EC)
PRIPLL = 外部オシレータをPLLで動作させる。
LPRC = 低消費電力のオシレータ(32KHz)を選択する。
FRCDIVN= 内部オシレータを分周して動作させる。
PWMLOCK:PWMロックビット
ON =ロック解除シーケンスを行わないと"IOCONx/FCLCONx"レジスタに書込めない
OFF =ロック解除シーケンス無で書き込み可能。
IESO :内部オシレータで起動しその後外部オシレータで起動する2段階起動モードの使用許可
ON = 有効にする OFF = 無効にする
FGS
GWRP:プログラムメモリ空間の書き込み禁止ビット
ON = 書き込み禁止 OFF = 書き込み許可
GCP :プログラムメモリ空間のコード・プロテクトビット
ON = プロテクト有効 OFF = プロテクト無効
その他の詳しい内容は
[C:\Program Files\Microchip\xc16\v1.24\docs\config_docs\24EP256MC204.html] のファイルを参照。
__delay_us/__delay_ms関数を使用する場合は、
#define FCY 60000000UL // Fosc/2(60MIPS)
#include <libpic30.h>
を追記します。
※ ”#define FCY”の行は、#include行の上に記述します。
※ __delay_ms(xxx)の"xxx"の部分は、XC8では固定値でしたがXC16は変数が使えます。\(^-^)/
オープンドレイン制御
通常ポート出力ピンは電流のソースとシンクが可能な標準のプッシュプルドライバですが、
ODCA/Bレジスタの各ピンに該当するビットをONにすると、その対応するポート出力は電流のシンク
のみ可能なオープンドレインドライバとなります。(トレラントピンのみ対象)
その他
- 初期値のピン割り当てがアナログ入力となっています
デジタル入力として使うときは ANSELA/B レジスタで指定します。
- プルアップ・プルダウン抵抗について
RA0-RA4ポートのプルアップは CNPUA レジスタで指定します。
RA0-RA4ポートのプルダウンは CNPDA レジスタで指定します。
RB0-RB15ポートプルアップは CNPUB レジスタで指定します。
RB0-RB15ポートプルダウンは CNPDB レジスタで指定します。
- I/Oポートに入出力を行う際の注意点
I/Oポートへ高速クロックで連続的に入出力を繰り返した場合に上手く入出力が出来ない場合が
有ります、そんな時はPORT?レジスタで入力し、LAT?レジスタで出力します。
PPS機能(PERIPHERAL PIN SELECT MODULE) |
周辺モジュールの入出力を好きなピン(RP20/RP32〜RP47)に割り当てる事が出来る機能です、
割り当てを変更できるのはデジタル信号のみで、アナログ入出力の割り当ては変更できません。
また、不用意に割り当てが変更出来ない様にロックする事が可能な様だが....試していません。
尚、このPICは電源が3.3Vですが、5Vトレラント端子に割当てれば5Vデバイスとの通信が可能です。
RPIxxとRPxxのタイプが有りますが、"I"付きは入力専用ピン、"I"無は入出力可能ピンです。
周辺モジュールの入力
INT1/2 T2CKI IC1/2/3/4 OCFA FLT1/2 QEA(B)1 INDX1 HOME1 U1(2)RX SDI2/SCK2/SS2 C1RX
SYNCI1 DTCMP1/2/3の周辺機器を使う場合は、RPINRxレジスタにRP20/RP32〜RP47ピンの
どれかを割り振らないとダメです。
周辺モジュールの出力
U1(2)TX SDO2/SCK2/SS2 C1TX OC1/2/3/4 C1(2)(3)OUT SYNCO1 QEI1CCMP REFCLKO C4OUT
の周辺機器を使う場合は、RPORxレジスタに周辺機器番号を設定します。
例えば、UART1のU1RX=RB12/U1TX=RB11に割付ける場合は、
#include <xc.h>
#include <PPS.h> // Pin Re-Mapping peripheral library
#pragma config IOL1WAY = OFF // 周辺機器のピン割り付けは何度でも変更出来る様に許可
PPSUnLock ;
iPPSInput(IN_FN_PPS_U1RX,IN_PIN_PPS_RPI44) ; // RB12(RX1)
iPPSOutput(OUT_PIN_PPS_RP43,OUT_FN_PPS_U1TX) ; // RB11(TX1)
PPSLock ;
となります、<PPS.h>のライブラリを使った方が便利でしょう。
詳しくはデータシートを参照して下さい。
※ 上記の周辺モジュールを使用する場合は必ず割り付けないと動作しません。
PPSのライブラリインストール操作 *1)
MPLAB(R) XC16 C Compiler Version 1.24のコンパイラでは”PPSのライブラリ”が
付属していましたが、V 1.25 以降は別途でダウンロードとインストールを行わないとダメな様です。
ダウンロード先は、マイクロチップのこちらのHPから、[Compiler Downloads]タブを開き、
下の方に有る"PIC24/dsPIC Peripheral Libraries v2.00 - Windows"をクリックします。
(マイクロチップに登録してサインインしないとダウンロードできないかもしれません)
ダウンロードしたファイルをクリックすればインストールが始まりますが、
インストール時の注意は、インストール先を指定する事です。
XC16の"v1.30"でPPSライブラリを動作させたいので、図の様に順にクリックします。
割り込み処理の記述方法は、PIC24Fでの記述例ですがこちらのサイト(picfun)を参照しましょう。
"MPLAB C30"での記述ですが、XC16でも動作します。
タイプAと呼ばれる16ビットタイマーモジュールです。
セカンダリクロック端子に外部オシレータ32KHzを取り付けて動作させる事も可能ですので、
リアルタイムクロック (RTC) アプリケーション向けに使えます。
外部クロックはプリスケラーで分周後に、内部デバイスクロックに同期/非同期が選択できます。
Timer1〜Timer5共に操作方法は同じで、"PRx"のタイマ周期レジスタに設定した値までカウントしたら
割り込み発生です。
タイマーの記事は"タイマー割込みを使ってLEDを点滅させます"を参照下さい。
タイプBと呼ばれる16ビットタイマーモジュールです。
Timer2とTimer3、Timer4とTimer5、を組み合わせれば32ビットタイマーとして動作します。
"TxCK"端子から外部クロックを入力出来、プリスケラーで分周後、内部デバイスクロックに同期します。
タイプCと呼ばれる16ビットタイマーモジュールです。
アナログ(A/D)モジュールの変換タイミングをトリガー出来ます。
"TxCK"端子から外部クロックを入力出来ますが、タイプBと異なり、内部デバイスクロックに同期後の
クロックをプリスケーラで分周します。
I2C/SPI/USARTは各2回路づつ有ります。
詳しい記事は"PIC24Eシリアル通信(I2C/SPI/UART)について"を参照下さい。
PWMのジェネレータは3個(PWM1/2/3)有り、1個当たり2つのPWMが出力(PWMxL/PWMxH)出来る
ので、24EPxxxMC202のアナログ出力(PWMxL/PWMxH)は6本有る事になります。
専用のタイマーを持っているので、Timer2/4は使わないで済みます。
詳しい記事は"PIC24EPの高速PWMについて"を参照下さい。
24EPxxxMC202の"MC"は”motor control”の略です、なのでPWM機能有りとなります。
24EPxxxGP202の"GP"は”general purpose”の略です、なのでPWM機能は無です。
全ての割り込みには、IPR1-IPR3レジスターにて高低レベルの割り込み順位優先度が付けられます。
初期デフォルトでは全ての割り込みが「高」に設定されています。
記事一部追記(*1) 2017/06/08
【きむ茶工房ガレージハウス】
Copyright (C) 2006-2020 Shigehiro Kimura All Rights Reserved.