24FJ64GB002覚書

〔PICの動かせ方入門に戻る〕


忘れないうちにメモします。
ここでの記載はMPLAB X V4.10
MPLAB(R) XC16 C Compiler Version 1.30を使用しての内容です。

こちらがPIC24FJ64GB002のサイトです、 データシート等の資料はここからダウンロードしましょう。
又、PIC24Fファミリー・日本語リファレンスマニュアルのサイトはこちらを参照下さい。

主な特徴:
・ 16ビットCPU,最大16 MIPSのパフォーマンスで動作します。
・ 消費電力を低減する為のディープスリープ付き省電力機能
・ I2C/SPI/UARTは各2モジュールづつ有ります。(UARTはLINとIrDAをサポート)
・ ハードウェアRTCC、アラーム付きリアルタイムクロックカレンダー
・ 充電時間計測ユニット(CTMU)は、静電容量の相対的変化を正確に計測出来るのでタッチセンサ等に
  最適でしょう。
・ 最大5つの入力キャプチャと5つの出力コンペア/PWM、すべて専用タイマー付き
・ プログラマブル巡回冗長検査(CRC)機能は、ソフトウェアによる構成が可能なCRCチェックサム
  ジェネレータです。
・ パラレルデバイス(EEPROM/LCD等)と通信する様に設計された、パラレルの8ビットI/Oモジュール
・ USB v2.0 On-the-Go準拠

24FJ64GA002も参考になるでしょう。(USB/CTMU/RTCC機能が無いだけで後は同じと思います)

電源電圧
電源電圧(VDD)は3.0V-3.6Vです。
電源回りの配線図 左図が電源回りの基本配線図です。

CORE自体の電圧は2.0Vとなっています、
なのでVDDに2.2V-3.6Vを使用する場合は内蔵レギュレータを
使用
しないとダメで、VCAP(20番)端子に、
10uF/16V low-ESR capacitor を取付けVSSに落とします
DISVREG(19番)端子は、内蔵レギュレータ有効/無効の選択ピンで、
GNDで有効/VDDで無効です。

VDD(13番端子)/VSS(8番端子)が電源ピンで、
AVDD(28番端子)/AVSS(27番端子)はアナログ専用電圧入力ピン


1番(リセット)ピンの使い方
MCLR
 外部リセット信号を入力する場合のピンとして使用。
 リセット信号はLOW(0V:GND接続)でリセットが掛かります、だから
 外部リセットを使わない時は1K〜10KΩ抵抗を介してVddに接続しなければならない。
 又、MCLRピンにコンデンサーが接続されている場合に、PICKit3を接続するならコンデンサーを
 一旦取り外す(ジャンパーピン等で)方が良い様です。

発振回路(システムクロック)
PICの内部に付いているクロック周波数回路は1/2/4/8MHz、16/32MHzを利用できる。
また、内部クロックで16(32)MHZにする場合は、4(8)MHzにして内蔵PLL回路を通す必要がある。
外部クロックは32MHz(EC=48MHz)までOKの様です、PLLブロックは通常の4xPLLではなく
USB機能が有るので96MHzのPLLブロックが機能する様です。
詳しくはこちらの日本語"PIC24Fファミリ オシレータリファレンスマニュアル"を参照下さい。

内部クロックを利用する場合
先ず、コンフィギュレーションの "POSCMOD = NONE"で外部オシレータは使わないとして
コンフィギュレーションの "FNOSC" を FRC/FRCPLL/FRCDIV の何れかに設定し、
FRCDIV なら下記一覧の如く"_RCDIV"ビットで発生させる周波数をセットします。
FRC はポストスケーラ(RCDIV)は通さずに内蔵クロック8MHzをそのまま使用します。
CLKDIV.RCDIV
000 8MHz
001 4MHz
010 2MHz
011 1MHz
その他 500KHz/250KHz/125KHz/31KHz

外部クロック(プライマリ外部オシレータ)を利用する場合
先ずは、コンフィギュレーションの "POSCMOD" を XT/HS/EC の何れかに設定し、
XTは3.5MHz-10MHzの水晶振動子、HSは10MHz-32MHzの水晶振動子、
ECは4MHz-32MHzの外部クロック入力が可能です。
次に、コンフィギュレーションを "FNOSC = PRI"とするが、PLLを通すなら"PRIPLL"と設定。

また、プライマリとは別にセカンダリ外部オシレータとして、
外付けの32.768 kHz 水晶振動子を駆動出来ます、って事はRTC(リアルタイムクロック)が実現出来そう。

PLLを利用する場合(USB機能を利用する時もね)
このPICに内蔵されているのは、通常のx4PLLではありません、96MHzのPLLブロックを使います。
(尚、24FJ64GA002はUSB機能が無いので、x4PLLを使います)
このブロックは、USB機能で48MHzのクロックを使用する場合に有効ですが、
システムクロックを16MHz/32MHzにする場合もこのブロックを通す必要が有ります。
又、96MHzのPLLには入力周波数を4MHz(下図の赤線部分)に分周して通す必要が有る為に、
ブロックに入力する周波数を"PLLDIV"コンフィギュレーションで調整します。
"PLLDIV"で調整出来るのは、内蔵クロックの4/8MHzと外部の12/16/20/24/32/48MHzが使用出来ます。

96MHzのPLL図

データシートの図に手を加えています、96MHzを生成するPLLブロック図です。

@ 内部クロックならコンフィギュレーションを "POSCMOD = NONE" と "FNOSC = FRCPLL" にして
  外部なら、"POSCMOD = HS/XT/EC" と "FNOSC = PRIPLL" とします。
A 内部クロックなら"CLKDIV.RCDIV"ビットで _RCDIV = 0b000(8MHz)/0b001(4MHz)にします。
  外部時は、XTは3.5MHz-10MHzの水晶振動子、HSは10MHz-32MHzの水晶振動子、
  ECは4MHz-32MHzの外部クロック入力を可能です。
B 96MHzのPLLブロックを有効にします、コンフィギュレーションを"PLL96MHZ = ON"とします。
C 次に、96MHzからシステムクロックを生成する為に、"CPDIV"ビットで4/8/16/32MHzに分周します。
  USB用の48MHzクロックはこの操作で生成され、後はUSB機能を有効にすれば良いでしょう。

DOZE(ダズ)モード
周辺モジュールの動作に影響を与えずにCPUの消費電力を低減する事が出来るモードで、
周辺モジュールのクロックとシステムクロックの比を変える事が可能です。

リファレンスクロックの出力
通常はOSC2(CLKO)ピンからFosc/2のシステムクロックを出力する事が出来ます。
これは、コンフィギュレーションを"OSCIOFNC = OFF"とするだけです。
その他に、REFO(RB13)ピンからシステムクロックを分周して出力する機能が有ります、
この機能をリファレンス クロック出力ジェネレータと言います。
@ REFOCON.ROENビットを"1"として有効にします。
A REFOCON.ROSELビットで出力するクロック源を選択します。
  1 = プライマリオシレータをベースクロックとして使用
  0 = システムクロックをベースクロックとして使用
B REFOCON.RODIV[3:0]ビットで分周します。
  0-32768分周の範囲(4ビット)で設定出来ます

尚、REFOCON.ROSSLPビットでスリープ時にリファレンスクロックの出力を停止させるか設定も可能
  1 = スリープ時にリファレンス オシレータの動作を継続する
  0 = スリープ時にリファレンス オシレータを無効にする

24FJ64GA002にはこの機能は有りません。

コンフィギュレーション
#pragma config キーワード1 = 設定値 , キーワード2 = 設定値   の様に記述する。
#pragma config BOREN = NOSLP , BORV = 30 , PWRTEN = ON  // 記述の例

CONFIG4
 DSWDTPS :ディープウォッチドッグタイマ有効時のポストスケーラを設定する
         DSWDTPS0 = 1:2(2.1 ms)
         DSWDTPS1 = 1:8(8.3 ms)
              :
         DSWDTPSF = 1:2,147,483,648(25.7 days)
 DSWDTOSC :ディープウォッチドッグタイマの基準クロックを選択する
         SOSC = セカンダリオシレータを使用する
         LPRC = 低電力内蔵RC発振器を使用する
 RTCOSC  :RTCC基準クロック選択ビット
         SOSC = セカンダリオシレータを使用する
         LPRC = 低電力内蔵RC発振器を使用する
 DSBOREN :ディープスリープ時に電源電圧が2.0Vを下回ったらリセットを行うか設定を行う
         ON = 有効
         OFF = ディープスリープで無効になります(スリープモードには影響しない)
 DSWDTEN :ディープウオッチドッグの有効/無効を選択する
         ON = ディープウォッチドッグタイマは有効
         OFF = ディープウオッチドッグタイマは無効

CONFIG3
 WPFP  :書き込み保護フラッシュページセグメント境界の設定
       WPFP0 = ページ0(0x0)
       WPFP1 = ページ1(0x400)
           :
       WPFP42 = ページ42(0xA800)
       WPFP63 = 最高ページ(ページ42と同じ)
 SOSCSEL:セカンダリオシレータのピンモードを選択
       IO  = RA4/RB4のデジタルピンとする(SCLKIが利用出来る)
           SCLKI(外部32KHzクロック入力は、SOSCEN=1とする)
       LPSOSC= 低電力(Low-Power)発振器モード
       SOSC = 高電力(High-Power)発振器モード
 WUTSEL :電圧レギュレータのウェイクアップに必要な時間を設定
       FST = 高速レギュレータ起動時間(10us)を使用
       LEG = デフォルトのレギュレータ起動時間(190us)を使用
 WPDIS :セグメントコード書き込み保護禁止ビット
       WPEN  = セグメントコード保護が有効です。
            保護セグメントはWPEND、WPCFG、及びWPFPx構成ビット
       WPDIS = セグメントコード保護は無効
 WPCFG :書き込み保護設定ページの選択
       WPCFGEN = 最後のページ(プログラムメモリの最上部)
             及びフラッシュコンフィギュレーションワードは保護されています
       WPCFGDIS = 最後のページとFlash設定ワードはコードで保護されていません
 WPEND :セグメントライトプロテクト終了ページ選択ビットの設定
       WPSTARTMEM = 保護されたコードセグメントの下限はプログラムメモリの
               下部(000000h)です。
               上境界は、WPFPで指定されたコードページです。
       WPENDMEM  = 保護されたコードセグメントの上限はプログラムメモリの
               最後のページに有ります。
               下境界は、WPFPで指定されたコードページです。

CONFIG2
 POSCMOD :外部オシレータの動作モードの選択
        NONE = 外部オシレータは使わない
            外部オシレータ使う場合は、HS/XT/ECのモードに設定
 I2C1SEL :I2C1で使用するピンの選択を行う
        SEC = ASDA1(RA0)/ASCL1(RA1)を使用
        PRI = SDA1(RB9)/SCL1(RB8)を使用
        24FJ64GA002では、ASDA1(RB5)/ASCL1(RB6)となっています。
 IOL1WAY :IOLOCKビット単方向セット イネーブルビット
       ON = IOLOCK ビットは、ロック解除シーケンスを実行後に一度のみセット出来る
          一度IOLOCK がセットされると、その後PPS は変更出来ない
       OFF= ロック解除シーケンスを実行すれば何度でもIOLOCKをセット/クリア出来る
 OSCIOFNC:OSCOピン機能の選択
       ON = OSCOピンはデジタルI/O(RA3)とする
       OFF = クロック(CLKO)を出力(FOSC/2)する
 FCKSM  :クロック切替えを行うか選択
       CSDCMD = クロックの監視やクロック切替え操作はしない。
       CSECMD = クロックの監視はしないが、クロック切替えは行う。
       CSECME = クロックの監視とクロック切替えの両方行う。
 FNOSC  :オシレータの動作モード選択ビット
       FRC  = 内蔵オシレータ(8MHz)を選択する
       FRCPLL = 内蔵オシレータをPLLで動作させる
       PRI  = 外部オシレータを選択する(XT/HS/EC)
       PRIPLL = 外部オシレータをPLLで動作させる
       SOSC = セカンダリオシレータを選択する
       LPRC  = 低消費電力の内蔵RCオシレータ(31KHz)を選択する
       FRCDIV= ポストスケーラ付き内蔵オシレータを選択する
 PLL96MHZ:USB 96MHz PLL起動の有効無効を選択する(24FJ64GA002には無し)
       ON = 96MHz PLLは起動時に自動的に有効になります
       OFF = 96 MHz PLLはソフトウェアでユーザーが有効にします
          (CLKDIV[5]のPLLENビットで制御)
 PLLDIV  :USB 96MHz PLLプリスケーラを設定する(24FJ64GA002には無し)
       NODIV = 発振器入力を直接使用(4MHz入力)
       DIV2 = 発振器入力を2で割った値(8MHz入力)
       DIV3 = 発振器入力を3で割った値(12MHz入力)
            :
       DIV12 = 発振器入力を12で割った値(48MHz入力)
 IESO   :内部オシレータで起動しその後外部オシレータで起動する2段階起動モードの使用許可
       ON = 有効にする
       OFF = 無効にする

CONFIG1
 WDTPS  :ウォッチドッグタイマ有効時のポストスケーラを設定する
       PS1   = 1:1
       PS2   = 1:2
         :
       PS256  = 1:256
         :
       PS32768 = 1:32768
 FWPSA  :ウォッチドッグタイマ有効時のプリスケーラを設定する
       PR32 = 1:32
       PR128 = 1:128
 WINDIS :ウオッチドッグにウインドウ式を利用するのかを選択する
       ON = ウィンドウ付きウォッチドッグタイマーが有効(FWDTEN=1)
       OFF = 標準ウォッチドッグタイマーが有効
 FWDTEN:ウォッチドッグタイマの有効無効を選択する
       ON = ウォッチドッグタイマーは有効
       OFF = ウォッチドッグタイマーは無効
 ICS    :In-Circuit Debuggers(PICKit3等)の通信チャネル
       PGx1=PGEC1とPGED1を使う PGx2=PGEC2とPGED2 PGx3=PGEC3とPGED3
 GWRP  :プログラムメモリ空間の書き込み禁止ビット
       ON = 書き込み禁止
       OFF = 書き込み許可
 GCP   :プログラムメモリ空間のコード・プロテクトビット
       ON = プロテクト有効
       OFF = プロテクト無効
 JTAGEN :JTAGを利用するのかを設定
       ON = 利用する  OFF = 利用しない

その他の詳しい内容は
[C:\Program Files\Microchip\xc16\v1.30\docs\config_docs\24FJ64GB002.html] の
ファイルを参照。

delay
__delay_us/__delay_ms関数を使用する場合は、
#define FCY 16000000UL // Fosc(32MHz)/2(16MIPS)
#include <libpic30.h>
を追記します。

※ ”#define FCY”の行は、#include行の上に記述します。
※ __delay_ms(xxx)の"xxx"の部分は、XC8では固定値でしたがXC16は変数が使えます。\(^-^)/

I/Oポート
オープンドレイン制御
 通常ポート出力ピンは電流のソースとシンクが可能な標準のプッシュプルドライバですが、
 ODCA/Bレジスタの各ピンに該当するビットをONにすると、その対応するポート出力は電流のシンク
 のみ可能なオープンドレインドライバとなります。(トレラントピンのみ対象)

その他

PPS機能(PERIPHERAL PIN SELECT MODULE)

※ I2C1の通信用ピンは5.5Vトレラント入力になっています。
※ 5.5Vトレラント端子でPPSピンは、16番(RB7)/17番(RB8)/18番(RB9)/21番(RB10)/22番(RB11)です

周辺モジュールの入出力を好きなピン(RP0〜RP11/RP13〜RP15)に割り当てる事が出来る機能です、
割り当てを変更できるのはデジタル信号のみで、アナログ入出力の割り当ては変更できません。
また、不用意に割り当てが変更出来ない様にロックする事が可能な様だが....試していません。
尚、このPICは電源が3.3Vですが、5Vトレラント端子に割当てれば5Vデバイスとの通信が可能です。

24FJ64GB002ピン概要(PPS)

周辺モジュールの入力
INT1/2 IC1/2/3/4/5 OCFA/B SCK1(2)/SDI1(2) SS1(2) T2CK/3/4/5 U1CTS(2)/U1RX(2)
の周辺機器を使う場合は、RPINRxレジスタにRP0〜RP11/RP13〜RP15ピン
どれかを割り振らないとダメです。

周辺モジュールの出力
C1OUT(2) U1TX(2)/U1RTS(2) SDO1(2)/SCK1(2) SS1(2) OC1/2/3/4/5 CTPLS C3OUT
の周辺機器を使う場合は、RPORxレジスタに周辺機器番号を設定します。

例えば、UART1の U1RX=RB8 / U1TX=RB9 に割付ける場合は、
#include <xc.h>
#include <PPS.h>                  // Pin Re-Mapping peripheral library

#pragma config IOL1WAY = OFF      // 周辺機器のピン割り付けは何度でも変更出来る様に許可

     PPSUnLock ;
     iPPSInput(IN_FN_PPS_U1RX,IN_PIN_PPS_RP8) ;    // RB8(RX1)
     iPPSOutput(OUT_PIN_PPS_RP9,OUT_FN_PPS_U1TX) ; // RB9(TX1)
     PPSLock ;
となります、<PPS.h>のライブラリを使った方が便利でしょう。

詳しくはデータシートを参照して下さい。

上記の周辺モジュールを使用する場合は必ず割り付けないと動作しません

PPSのライブラリインストール操作

MPLAB(R) XC16 C Compiler Version 1.24のコンパイラでは”PPSのライブラリ”が
付属していましたが、V 1.25 以降は別途でダウンロードとインストールを行わないとダメな様です。

ダウンロード先は、マイクロチップのこちらのHPから、[Compiler Downloads]タブを開き、
下の方に有る"PIC24/dsPIC Peripheral Libraries v2.00 - Windows"をクリックします。
(マイクロチップに登録してサインインしないとダウンロードできないかもしれません)

ダウンロードしたファイルをクリックすればインストールが始まりますが、
インストール時の注意は、インストール先を指定する事です。
PPSライブラリのインストール画面

XC16の"v1.30"でPPSライブラリを動作させたいので、図の様に順にクリックします。


割り込み
割り込み処理の記述方法は、こちらのサイト(picfun)を参照しましょう。
"MPLAB C30"での記述ですが、XC16でも動作します。

A/D
24FJ64GB002は、10ビットでAN0-AN5/AN9-AN11チャンネルのアナログコンバータを持っています。
16個の変換用バッファが有り、全チャンネル自動スキャンモードや1チャンネルを16個のバッファに
逐次変換するモード等のバッファ格納機能を持っています。
又、自動サンプルモードと自動変換トリガーを一緒に動作させると、ソフトの介入なしにエンドレスで
自動変換が可能らしぃ。 尚、差動入力も出来、スリープ中でも動作させる事が可能です。

・単CH(AN0)入力、手動サンプリング開始、サンプリング時間は指定したTADによる、
 TAD時間終了後に自動変換開始のサンプルプログラムはこちらからダウンロードして下さい。

・単CH(AN0)入力、手動サンプリング開始、サンプリング時間は指定したTADによる、
 TAD時間終了後に自動変換開始で16バッファ分サンプリングと変換を行います。
 なので、平均値で読み込みます、このサンプルプログラムはこちらからダウンロードして下さい。

TIMER1
タイプAと呼ばれる16ビットタイマーモジュールです。
セカンダリクロック端子に外部オシレータ32KHzを取り付けて動作させる事も可能ですので、
リアルタイムクロック (RTC) アプリケーション向けに使えます。
外部クロックはプリスケラーで分周後に、内部デバイスクロックに同期/非同期が選択できます。

Timer1〜Timer5共に操作方法は同じで、"PRx"のタイマ周期レジスタに設定した値までカウントしたら
割り込み発生です。

タイマーの記事は、24EP256MC202の記事ですが"タイマー割込みを使ってLEDを点滅させます"を
参照下さい。
詳しくはこちらの日本語"PIC24Fファミリ タイマリファレンスマニュアル"を参照下さい。

TIMER1のサンプルプログラムはこちらからダウンロードして下さい。

TIMER2/4
タイプBと呼ばれる16ビットタイマーモジュールです。
Timer2とTimer3Timer4とTimer5、を組み合わせれば32ビットタイマーとして動作します。
"TxCK"端子から外部クロックを入力出来、プリスケラーで分周後、内部デバイスクロックに同期します。

TIMER2のサンプルプログラムはこちらからダウンロードして下さい。
TIMER2とTIMER3を使った32ビットタイマーのサンプルプログラムはこちらからダウンロードして下さい

TIMER3/5
タイプCと呼ばれる16ビットタイマーモジュールです。
アナログ(A/D)モジュールの変換タイミングをトリガー出来ます。
"TxCK"端子から外部クロックを入力出来ますが、タイプBと異なり、内部デバイスクロックに同期後の
クロックをプリスケーラで分周します。

SPI/I2C/UART
I2C/SPI/USARTは各2回路づつ有ります。

詳しい記事は"PIC24Fシリアル通信(I2C/SPI/UART)について"を参照下さい。

PWM
PWMを生成させるには出力コンペア(OC)モジュールの、
"エッジ整列PWMモード"と"センター整列PWMモード"を利用する事になります。
出力コンペアモジュールは5個(OC1/2/3/4/5)有るので5個のPWM出力が出来ます。
出力コンペアモジュール出力端子の"OC1/2/3/4/5"は、PPS機能でピンを割り付けないと使えません。

詳しい記事は"PIC24FのPWM生成方法"を参照下さい。

USB
このPICは、USBのホスト機能とUSB OTGの機能とUSBのデバイス機能が出来ます。
でぇ、USBのホスト機能に関してはこちらを参照下さい。

その他
全ての割り込みには、IPR1-IPR3レジスターにて高低レベルの割り込み順位優先度が付けられます。
初期デフォルトでは全ての割り込みが「高」に設定されています。




【きむ茶工房ガレージハウス】
Copyright (C) 2006-2020 Shigehiro Kimura All Rights Reserved.