いよいよ、PIC24Fを駆使して行くわけですが、その前にいろいろと基礎実験をしています。
前回は、ノキア5110グラフィックLCDを駆動できるのかを実感しました。
また、内蔵発信器(FRC 8MHz)でPLLを使ってフルスピードの32MHz動作では19mA近くも消費電流が流れてしまうので、8MHzダイレクトにクロックを下げ、消費電流を4.5mAに下げられる事も分かりました。今までと同様に電池駆動が出来そうです。
次に実験したのは、PIC24Fの内蔵UARTを MPLAB C30 C言語から使う方法です。今回の様にピン数の少ないPIC24Fの内蔵機能は、他のPICの様に固定的にピンに割り付けられてはいないのです。自分のPORTBに重複した16ピンをRPn(n:0〜15)として呼び、そこに、設定によって自由に好みの機能を割り付けて使う事が可能です。
例えば、uartの送信機能をRB4の位置に割り付けたければ、宣言の名称にちょっとクセがありますが、
RPOR2bits.RP4R = 3;
で従来のPB4(RP4)にUART1のTX機能が割つきます。
ここで「3」がUART1のTXを意味し、その前の呪文の様なRPOR2bits.RP4Rが「RP4」を意味します。この呪文や番号は、一定の規則で決まっていますので、一覧表から簡単(?)探す事が出来ます。
その他の高速ボーレート選択(BRGH)や、ボーレート値、ビット数、ストップビット、パリティー、フロー制御の有無等は、設定用の名称があるのですが、これまた呪文の様にたくさんあって、分かり難いので、私はビットで設定して問題なく動きました。
unsigned int U1MODEvalue = 0b1000100000001000; // UART1初期設定 高速mode
unsigned int U1STAvalue = 0b0000010000000000; // UART1初期設定
unsigned int Baud = 51; // 19200bps@4MHz 高速mode
OpenUART1( U1MODEvalue, U1STAvalue, Baud);
なお、MPLAB C30 では、PIC24F用のUART用ライブラリーを用意していて、uart.h をインクルードして使う事に成るのですが、MPLAB C30 のバージョンに合ったライブラリーをリンクさせる為に、その都度MicroChipのディレクトリー内のファイルをリンクさせるので、配布用のサンプルプロジェクト内にはその実体が存在しません。(当たり前のことですが)
また、単純にインクルード宣言をするだけでは正しくライブラリーを参照する事が出来ないのです。
まず、PIC24FJ64GA002用の uart.h をリンクさせるには、
C:¥Program Files¥Microhip¥MPLAB C30¥lib¥PIC24F¥libpPIC24Fxxx-coff.a
を、プロジェクトファイルのLibrary Files に登録しなくては成りません。
また、プロジェクトファイルのLinker Scriptに、
C:¥Program Files¥Microhip¥MPLAB C30¥support¥PIC24F¥gld¥p24FJ64GA002.gld
を登録しなくてはなりません。
この2つが正しく登録されていて始めて、
#include <uart.h>
が正しくコンパルが通る様になります。
つまり、MPLAB C30 でライブラリーを使用する様な場合は、PICの型式に合わせて、この2つが正しくコンパイラー側に設定されていないと使えないのです。
また、ライブラリーによっては、その他の追加の条件を追加される場合もあります。
今回は使用しませんが、 stdio.h の printf()を使う場合には、さらに、必ずヒープ領域を128byte程設定する様にリンカに指示するようにしないと、ヒープ領域が定義されていないと云うエラーになって、コンパイルが完了しません。これはPIC24FのUARTが16ビット幅の4段のFIFOを送信、受信共に持っている(16*4*2=128)事に由来する様なのですが、詳しい事はわかりません。
今回は、uart.h 内の
getcUARTn
ReadUARTn
WriteUARTn
putcUARTn
OpenUARTn
を使用しますので、ヒープ領域等の確保は全く必要ありません。
後閑氏のホームページ
http://www.picfun.com/c30frame.html
の「実行時のメモリ環境」
に、
**************** 引用 ********************
ヒープ領域は、Cライブラリのメモリ管理関数である calloc、malloc、realloc関数を
使ってダイナミックにバッファ管理を行う場合にだけ使用されます。
これらの関数を使わないときはヒープ領域を割り当てる必要はありません。
デフォルトでは割り当てしないようになっています。
stdioライブラリの標準出力関数stdoutを使うときには、同時に開くファイル1個当たり
40バイトのヒープ領域を必要としますので注意が必要です。
コンパイルしたときヒープ領域が必要で定義されていない場合には、エラーメッセージ
が出力されますので、このときプロジェクトの環境設定で適当なサイズのヒープ領域を
指定します。
*************** 引用終わり ******************
と書いてあります。
また、後閑氏のホームページの
http://www.picfun.com/c30frame.html
の「標準入出力関数」
に、
C30 の printf()ライブラリーの事が書いてあります。
また、
http://www.picfun.com/c30libframe.html
の「UART」
に.gif写真でサンプルが載っています。
|