以前に試したのは、同梱のソースを良く見たら2007~2009年のものだった。
最新のものは2015年の9月5日なので、やっぱり最新版で試してみたくなる。
結論から言えば、問題なく動く。
回路は全く同じ、サンプルでは外付けのクロックなので、これを内蔵のクロックに対応させるが、そのための変更点も全く同じだ。
くどいようだが以下に書いておく。
main.cのConfigurationの変更
//_CONFIG2(IESO_OFF & FNOSC_PRIPLL & FCKSM_CSDCMD & OSCIOFNC_OFF & IOL1WAY_OFF & I2C1SEL_PRI & POSCMOD_HS)
_CONFIG2(IESO_OFF & FNOSC_FRCPLL & FCKSM_CSDCMD & OSCIOFNC_OFF & IOL1WAY_OFF & I2C1SEL_PRI & POSCMOD_NONE)pic24f.hのFCYの値の変更
//#define FCY 14745600UL
#define FCY 16000000ULuart.cのBPSの値の変更
//#define BPS 115200UL
#define BPS 19200ULmain.cのIoInit()の中あたりに以下を追加
CLKDIVbits.RCDIV = 0b000;//FRC Postscaler 1:1 as 8MHz
CLKDIVbits.DOZEN = 0;//CPU peripheral clock ratio is set to 1:1
前提は、PLLを使って8MHz × 4 = 32MHzで駆動ということだ。
あっさり動いてしまってつまらないので、PIC24FJ64GA002のクロックの設定とUSARTのボーレートの設定のおさらい。
まず、内蔵オシレータを使う最速の設定はPLLを使用する場合なので、以下の赤枠内の設定にする。
これによる、Configuration Bitの設定は、
#pragma config FNOSC = FRCPLL // Oscillator Select (Fast RC Oscillator with PLL module (FRCPLL))
#pragma config POSCMOD = NONE // Primary Oscillator Select (Primary oscillator disabled)
とする。
さらに、このブロック図から、2つのポストスケーラを通るのがわかるので、これを両方とも1:1にする。
これが以下の設定だ。
CLKDIVbits.RCDIV = 0b000;//FRC Postscaler 1:1 as 8MHz
CLKDIVbits.DOZEN = 0;//CPU peripheral clock ratio is set to 1:1
以上でクロックが32MHzとなる。
ボーレートは下の式で求められる。
ここにもあるが、FCY = FOSC / 2 なので、FCY = 32000000 / 2 = 16000000 となる。
そこで、以下のように設定する。
pic24f.hのFCYの値の変更
#define FCY 16000000UL
また、使いたいボーレートは以下で設定する。
uart.cのBPSの値の変更
#define BPS 19200UL
あとはプログラムの中で計算された値がU1BRGに設定され、UARTが予定したとおりに働くというわけだ。
ボーレートをいくつにするかは環境と相談することになるだろう。
ブレッドボードに手製のカード・ソケットという私の環境の場合は57600が上限だった。
あ、それに加えて、安い中華製のFT232RLモジュール使用という条件もある。
追記(2015/11/04)
話が前後するが、サンプルそのままだとコンパイル時にエラーが出たので、その対処方法の覚書き。
一番の対処法はドキュメントにちゃんと目を通すこと。
※長いファイル名に対応しなくていい場合
ffconf.h 内で #define _USE_LFN 0 とする。
※長いファイル名に対応させたい場合
#define _USE_LFN 1 とする。
コード・ソースの中に含まれるoptionフォルダをプロジェクト・フォルダにコピーし、その中の unicode.c をプロジェクトに追加する。
初期設定では長いファイル名に対応した設定になっているので、unicode.cの登録無しではコンパイル時にエラーになる。
「PIC24FJ64GB002 + Generic FatFs コマンドのリストを表示させてみる。」へ
Tweet