PIC24Fの紹介と実験
目 次
内蔵RTCテスト (以下にもRTCテストあります)
RPピンの機能選択(16本あるRPピンは機能を選択することができます。簡単関数を用意しました)
RTCテスト PICkit2のUARTによる時刻設定付き new 2007.9.29
C30ライブラリのInputCaptureの関数について new 2007.10.11
リファレンスマニュアルを見ていろいろな実験をしてみました。ご参考になれば幸いです。
ここに書いてあることも、独自調査のものなので間違っている場合もあります。おかしいと
思われた場合は、リファレンスマニュアルを見て調査願います。
ソフトウエアについては、著作権を放棄していませんがご自由に変更してご使用ください。
個人で使用される以外でのご使用では、オリジナルがここのサイトであるこを明記してください。
免責事項:記事を参考にされて損害がありましても対応できません。ご自身の責任のもと実験を
おこなってください
□■□■□■□■□■□■□■□■□■□■□■□■□■□■
趣味でさわるマイコンの基本はAVRなのですが、PIC24FJ64GA002という新しいPICが
FlashROMおよびSRAM容量が大きく、TV表示に適しているためこれをTVコントローラとして
将来開発すべく研究してみます。
データシートからPIC24FJファミリーの抜粋です→機能の概要(PIC24FJ64GA002専用の概要ではありません)
買えるお店:秋月でPIC24FJ64GA002-I/SPという商品名で450円で売っています。
マルツでも売っているようです。450円でこのメモリ容量、この機能です。
使わない手はありません。しかもDIPなので2,3個あれば使いまわせます。
PIC24FJ64GA002のデータシートから抜粋
2007.9.3追加
リファレンスマニュアル(機能の詳細)はマイクロチップ社サイトからPIC24Fのものをダウンロード
できます。日本語版があります。
下記のリストはリンクしていません。最新のものを上のリンクからダウンロードしてください。
PIC24F Family Reference Manual, Sect. 01 Introduction (日本語) |
PIC24F Family Reference Manual, Sect. 02 CPU (日本語) |
PIC24F Family Reference Manual, Sect. 03 Data Memory (日本語) |
PIC24F Family Reference Manual, Sect. 04 Program Memory (日本語) |
PIC24F Family Reference Manual, Sect. 06 Oscillator (日本語) |
PIC24F Family Reference Manual, Sect. 07 Reset (日本語) |
PIC24F Family Reference Manual, Sect. 08 Interrupts (日本語) |
PIC24F Family Reference Manual, Sect. 09 Watchdog Timer (WDT) (日本語) |
PIC24F Family Reference Manual, Sect. 10 Power-Saving Features (日本語) |
PIC24F Family
Reference Manual, Sect. 12 I/O Ports with Peripheral Pin Select (英語)
PIC24F Family Reference Manual, Sect. 12 I/O Ports (日本語) |
PIC24F Family Reference Manual, Sect. 13 Parallel Master Port (PMP) (日本語) |
PIC24F Family Reference Manual, Sect. 14 Timers (日本語) |
PIC24F Family Reference Manual, Sect. 15 Input Capture (日本語) |
PIC24F Family Reference Manual, Sect. 16 Output Compare (日本語) |
PIC24F Family Reference Manual, Sect. 17 10-Bit A/D Converter (日本語) |
PIC24F Family Reference Manual, Sect. 19 Comparator (日本語) |
PIC24F Family Reference Manual, Sect. 20 Comparator Voltage Reference (日本語) |
PIC24F Family Reference Manual, Sect. 21 UART (日本語) |
PIC24F Family Reference Manual, Sect. 23 Serial Peripheral Interface (日本語) |
PIC24F Family Reference Manual, Sect. 24 Inter-Integrated Circuit (I2C) |
PIC24F Family Reference Manual, Sect. 29 Real-Time Clock and Calendar (日本語) |
PIC24F Family Reference Manual, Sect. 30 CRC (日本語) |
PIC24F Family Reference Manual, Sect. 32 High-Level Device Integration (日本語) |
PIC24F Family Reference Manual, Sect. 33 Programming and Diagnostics (日本語) |
Upしていないだけかもしれませんが マイクロチップ社でもまだ、できていないSectionがあるようです。
□■□■□■□■□■□■□■□■□■□■□■□■□■□■
LEDピカピカテスト回路のCN1は普通の6Pのピンヘッダを使用しています。
PICKit2との間は10cmの手作りのケーブルで接続しましたがうまく書き込めました。
ケーブルはあまり長いものはエラーがでる可能性があります。
せいぜい5〜10cmくらいだと思われます。
□■□■□■□■□■□■□■□■□■□■□■□■□■□■
LEDピカピカテスト 回路 PIC24Fの電源電圧は2.0V〜3.6Vです。
ブレッドボードで組みましたが、接触不良がわかるまで多少時間がかりました。できれば
たいした回路でないのでユニバーサルボードに組んだ方が確実です。電源は3VのACアダプター
を用意すればレギュレーターは不要だと思います。C3は内部COREが2.5Vで動作するため、
PIC内部の電圧レギュレーター用平滑コンデンサです。電源が3.0V以下の場合は、
この回路でうごかないかもしれません。データシートのVCAPで検索すると関連のDISVREGとともに
使用法が載っています。なお、C3は10uFバイポーラコンデンサを使用しました。
リファレンスマニュアル32章4によると、「低い等価直列抵抗のタンタルかセラミック、
推奨ESR(等価直列抵抗)は最大3オームです。」とあります。最初、C3には無極性の電解Cをつけて
いましたが、電解CはESRが大きいようなので表面実装のセラミックコンデンサ10µFに変更しました。
LEDピカピカテスト プログラム
● delay.s main.c (IEでソースファイルの文字が化ける場合、表示−エンコード−日本語(自動選択)にしてください)
上図のように、ファイルをプロジェクトに入れてください。
● ダウンロード
● プログラムの説明
単純なLEDピカピカプログラムです。main関数ではポートBのbit6を出力に設定し、while内で
^演算子(XOR) にてbit6のビット反転しています。回路上は0(点灯)と1(消灯)となります。
その後500msecのdelayを入れています。つまり500msec消灯、500msec点灯の繰り返し
をおこないます。
内蔵クロックをPLLし、8MHz×4=32MHzで動作させています。PIC24Fは
最小2クロックで1サイクルです。たとえばnop1個で2クロックかかります。
delay_cycle()のアセンブラルーチンでは、W0レジスタ値(delay_cycleの引数)だけnopを
リピートすることができます。これにより1msecの時間を作っています。
これをdelay_ms()では指定msecだけループで繰り返します。ここの時間ルーチンは
あくまでだいたいの値であり、正確ではありません。500msecとしても、
オーバーヘッド分余計なサイクルが追加されます。あくまで簡易delayとしてお使いください。
アセンブラルーチンは最適化のオプションが働かないので、最適化レベルによって
コードが変化することはありません。実際のプログラムではデバッグが終わったら
最適化をできるだけ大きくしてみるのがよいかと思います。もし動かなければ元に戻すのを
忘れずに(笑)
メモ dsPIC30Fはnop1個で4クロックかかるみたいですが、PLLで120MHzまでクロックを
上げられるのでnop1個1クロックでいうところの実質30MHzとなります。
dsPIC30F=30MIPS (MIPSは1秒に100万回の命令を実行します)
PIC24F =16MIPS
PIC24Fではどうして20MIPSのものがないのか不思議です。PLLで40MHzに
できないのでしょうか。メーカーも徐々に上げるつもりなのかもしれませんが、
32MHzで打ち止めということはないでしょう。たぶん。いや。。。お願いします。
□■□■□■□■□■□■□■□■□■□■□■□■□■□■
● 回路 (すいません、後日掲載します)
配線は以下のようにしてください。
//PIC24F 秋月液晶SC1602
//PORTB 15 - DB7
//PORTB 14 - DB6
//PORTB 13 - DB5
//PORTB 12 - DB4
//PORTB 11 - E
//PORTB 10 - RS
R/WはGNDへ
PIC24Fの電源3.3VはPICkit2から供給しました。SC1602の5.0VはACアダプターで
SC1602だけに供給しました。
PIC24FのPORTBとSC1602は直接接続しています。
ただし、PIC24Fからは出力のみにしています。
秋月液晶SC1602テスト プログラム
● delay.s main.c lcd.c lcd.h(IEでソースファイルの文字が化ける場合、表示−エンコード−日本語(自動選択)にしてください)
上図のように、ファイルをプロジェクトに入れてください。
● ダウンロード
● プログラムの説明
秋月液晶SC1602の表示テストプログラムです。
delay_ms()を少し精度をよくしています。 1msecの外のループもアセンブラに組み込みました。
本来lcd_init()は1度おこなえばよいのですが、テストなのでwhile(1)ループの中に
いれて毎回おこなっています。LEDが1ループ毎にLCD制御中は光るのでわかりやすいと思います。
lcd_gotopos(x, line)は位置設定です。xは左端が0、右端が15となります。lineは上段が0、下段が1です。
lcd_putstr(str)が表示ルーチンです。(const uint8_t *)は文字列がPIC24FのROMに存在すると思ってこのように
なっています。実際はPIC24FのRAMにコピーされているのかもしれません。
lcd.c, lcd.hはオリジナルがあって、くすのきさんという方のものです。私がいろいろ改造して現在に
いたっています。SC1602のCGRAMへの書き込み関数もあるので自由なキャラクタを作成できます。
興味のある方はやってみてください。
余談ですが、picfunさんのサイトにある参考回路は1602互換だと思われますが秋月のSC1602とは
電源とGNDピンが逆です。ご注意ください。電源とGNDピンはご使用される1602に合わせてください。
□■□■□■□■□■□■□■□■□■□■□■□■□■□■
● 回路
今回からブレッドボードをやめて、ユニバーサル基板にしました。
理由は、ブレッドボードにRTC用のサブ水晶32.768KHzを取り付けたところ、
ノイズが多くてRTCが誤作動するためです。
水晶がある場合は、ユニバーサル基板でないと安定した動作は望めないかもしれません。
32.768KHz水晶は外側の筒をGNDに接続すると精度がよくなるようです。
1秒が安定しない場合は、お試しください。
電源は液晶が5Vなので、ACアダプターで安定化された5Vを入力しています。
それをレギュレータにて3.3Vに変換してPIC24Fにて使用します。
レギュレーターは500mA取り出せるものなので、今後回路を追加しても十分なものです。
回路図中のPIC24FのVCAPに接続しているコンデンサについて(回路図C5)
リファレンスマニュアル32章4によると、「低い等価直列抵抗のタンタルかセラミック、
推奨ESR(等価直列抵抗)は最大3オームです。」とあります。最初、無極性の電解Cを
つけていたのですが、電解CはESRが大きいようなので、表面実装の
セラミックコンデンサ10µFに変更しました。
RTCテストプログラム
● delay.s main.c lcd.c lcd.h CharSet.c (IEでソースファイルの文字が化ける場合、表示−エンコード−日本語(自動選択)にしてください)
2007.9.24 main.c修正 メイン水晶(OSCI,OSCOに接続)があるときの_CONFIG2を追加しました。
上図のように、ファイルをプロジェクトに入れてください。
Library Files に MPLAB C30\lib にある libpPIC24Fxxx-coff.a を追加してください。
● ダウンロード
● プログラムの説明
RTCはMPLAB C30付属の「RTCC Library」を使用しています。そのため、直接レジスタを
操作することなしに、RTCを使用できます。
MPLAB C30\docs\periph_libに「RTCC Library」のマニュアルがあるので興味のある方はみて
ください。ただし、マニュアルはそれほど詳しくありません。ソースもMPLAB C30に付属している
ので直接ソースを見た方がわかりやすいかもしれません。
main()の初期化ではRTCの年月日時分秒の初期値を決めうちで書き込んでいます。
入力方法を検討しているので、そのうち盛り込みたいと思います。
main()のwhile(1)ループでは毎回、年月日時分秒を読み出し、前の秒と比較して異なれば
表示処理をおこなっています。また表示処理の前でLEDの点灯、後でLEDの消灯をしているので
1秒ごとにLEDが点滅してみえます。
年月日時分秒はBCDコードで返ってくるため、sprintfの%02dで文字に変換することができます。
ただし、年は2桁で、マニュアルによると00〜99年用ということらしいです。
表示では”20”を前につけて、20xx年にしています。
RTCのその他の機能として、アラーム機能などがあるのですが、まだ試していないです。
将来圧電素子等をつけたときに、アラーム機能を試してみたいとおもいます。
今回、SC1602の液晶のCGRAMに日月火水木金土年の5×7ドットのキャラクタを書き込んでいます。
「金」がちょっと見苦しいので、あとで改善するかもしれません。(笑)
□■□■□■□■□■□■□■□■□■□■□■□■□■□■
RP9=TX(送信)
RP8=RX(受信)
RTS,CTSは使用しません。
TXとRXを線でつないでループバックテストをしました。
UARTテストプログラム (レジスタ操作版)
● delay.s main.c lcd.c lcd.h (IEでソースファイルの文字が化ける場合、表示−エンコード−日本語(自動選択)にしてください)
上図のように、ファイルをプロジェクトに入れてください。
● ダウンロード
● プログラムの説明
ループバック機能はあるのですが、あえてTXとRXのピンに線をつないで
ループバックテストをしました。レジスタを直接操作しているので何をやっている
のかわかりやすいと思います。
レジスタを操作しましたが、デフォルト0のままでよいものが多くそれほど
設定しませんでした。デフォルトでデータ8ビット、パリティー無し、ストップビット1の
標準の非同期通信ができます。
リングバッファを使用しています。送信は割り込み使用をしていませんが、受信は
割り込み駆動でリングバッファに格納していきます。main()にて送信が終わったら
バッファに受信されたデータが何バイトかを調べて、それを液晶に表示しています。
□■□■□■□■□■□■□■□■□■□■□■□■□■□■
RP9=TX(送信)
RP8=RX(受信)
RTS,CTSは使用しません。
TXとRXを線でつないでループバックテストをしました。
UARTテストプログラム (ライブラリ版)
● delay.s main.c lcd.c lcd.h (IEでソースファイルの文字が化ける場合、表示−エンコード−日本語(自動選択)にしてください)
上図のように、ファイルをプロジェクトに入れてください。
Library Files に MPLAB C30\lib にある libpPIC24Fxxx-coff.a を追加してください。
● ダウンロード
● プログラムの説明
レジスタ操作がライブラリに置き換わったようなプログラムです。やっていることは
レジスタ版と同じなので、参照してください。
実験を開始した初めのころは、ライブラリのドキュメントにあるサンプルを試しましたが
動きませんでした。結局レジスタ操作のプログラムを作り、そこからライブラリに置き換えて
動かしました。ライブラリでは通常パラメータはANDかOR形式のどちらかでプログラムを
書くのですがANDよりOR形式の方が少ないパラメータで書けることがわかりました。
OR形式をお勧めします。
□■□■□■□■□■□■□■□■□■□■□■□■□■□■
● main.c PinSel.c PinSel.h (IEでソースファイルの文字が化ける場合、表示−エンコード−日本語(自動選択)にしてください)
上図のように、ファイルをプロジェクトに入れてください。
● ダウンロード
● プログラムの説明
RPピンは機能を選択できるピンです。小ピンマイコンでは始めての機能だと思われます。
16本あるRPピンに機能を割りつけるにはレジスタを設定するのですが、表を常に見ないと
設定が困難です。そこで、OutPinSel () および InPinSel () という便利な関数を用意しました。
リファレンスマニュアルから抜粋 (画像) input の表 output の表
レジスタを覚えていなくても簡単に設定することができます。
OutPinSel ( OFNC_U1TX, PIN_RP9 ); // RP9ピンをUART1 TXに割り付けます
InPinSel ( IFNC_U1RX, PIN_RP8 ); // RP8ピンをUART1 RXに割り付けます
PIC24F起動直後は、A/Dコンバータ併用ピンはすべてA/Dコンバータ入力ピンになって
います。TRISレジスタで出力に設定すれば、このA/Dコンバータ入力ピンは解除される
ようですが、TRISレジスタで入力の場合で、A/D以外の機能の入力にしたい時は、
プログラムでA/Dコンバータ入力をOFFにする必要があります。OFFにすると
他の機能の入力ピンとして使用できるようになります。
例)
AD1PCFG = 0xffff;//全アナログピンをOFF、デジタルピンにしますTRISBbits.TRISB0 = 0;//RP0 Output TX
TRISBbits.TRISB1 = 1;//RP1 Input RX
OutPinSel ( OFNC_U1TX, PIN_RP0 );//RP0(Pin4) UART1 TXに割付 (ICSP PGD1と共通)
InPinSel ( IFNC_U1RX, PIN_RP1 );//RP1(Pin5) UART1 RXに割付 (ICSP PGC1と共通)
今回はRP1をUART1のRXとして設定する前に、プログラムでA/Dコンバータ
のすべての入力ピンをてOFFにしています。
なおA/Dコンバータ入力ピンにしておくと消費電力等が抑えられる?の記述が
リファレンスマニュアルにあるので、詳しくはそちらをご参照ください。
□■□■□■□■□■□■□■□■□■□■□■□■□■□■
Input Capture 32bitタイマー使用テスト回路
今回からメイン水晶8MHzを取り付けました。やはり内蔵RCでは周波数カウンター
にするには精度が足りないからです。InputCaptureの入力は、InputCapture1,2共通の
ピン(RP7)としました。これはRPピンのすばらしいところです。複数機能を1本のRPピンに
割り付けすることができます。ここに測定する信号を入力してください。入力電圧はトレランス
機能でTTLが入力できます。入力電圧は通常のデジタルIOピンと同じだとおもいますので、
詳細はデータシートを見てご確認ください
回路図中のPIC24FのVCAPに接続しているコンデンサについて(回路図C5)
リファレンスマニュアル32章4によると、「低い等価直列抵抗のタンタルかセラミック、
推奨ESR(等価直列抵抗)は最大3オームです。」とあります。
以前使用していた電解Cから表面実装の積層セラミックコンデンサ10µFに変更しました。
Input Capture 32bitタイマー使用テストプログラム
上図のように、ファイルをプロジェクトに入れてください。
Library Files に MPLAB C30\lib にある libpPIC24Fxxx-coff.a を追加してください。
● delay.s main.c lcd.c lcd.h PinSel.c PinSel.h
(IEでソースファイルの文字が化ける場合、表示−エンコード−日本語(自動選択)にしてください)
● ダウンロード
● プログラムの説明
パルスの周波数と周期を表示するカウンターを製作しました。
InputCaptureはパルスのエッジで16ビットタイマーの値を読み取るものですが
今回は低い周波数も計測したかったので、InputCaptureを2つ使ってタイマーを
32ビットモードで使用しました。これにより、低い方はタイマーがいっぱいになる
270sec, 0.0037Hzが計算値となりました。ただしそこまで低いパルス発生器を
持っていないので実測してません。
実際試してみると
周波数は実用レベルで0.01Hz?〜100KHzくらいだと思います(無保証)
なお一応1MHzくらいまでは表示しますが、元になるタイマー値が小さいので
その逆数である周波数は精度が極端に悪くなります。
周波数Hz = 16MHz / タイマー値
周期ms = タイマー値 / 16MHz * 1000
(外部水晶8MHzをPLLで4倍しているので、32MHzの半分がタイマーの
クロックとなります)
形式切り替え:
割り込みとポーリングの2形式をコンパイル時に切り替えられます。やり方は
#define INTERRUPT_ON //割り込みを使用しないときはコメントにしてください
上の行があると、割り込みのソースがコンパイルされ、コメントにすると
ポーリング部分のソースがコンパイルされます。
通常はポーリング形式で、コンパイルしてください。
ポーリング、割り込み形式ともソースの最適化はレベル3でコンパイルしてください。
割り込みでは特に最小の動作が求められます。
割り込みでは、割り込みルーチン内の処理サイクル数により100KHz程度で
測定不能になります。これは、割り込み処理が終わる前に、次の割り込みが
くるからです。その場合、割り込みは待たされてデータを取りこぼすことになります。
その他:
InputCaptureのライブラリとレジスタの両方を使用しました。最初 はまったのは、
ライブラリのReadCapture関数です。これは、FIFOにデータがある分だけ
配列にデータを格納しますが、そうとは知らず1データのポインタを渡していました。
それと、割り込み内でスタックを使う自動変数は使用しないほうがよいことが
わかりました。今回は使用していませんがstatic変数がいいみたいです。
ちょっとインテリジェントにした部分があります。周期を10回平均して、
ばらつきを抑えているのですがの低い周波数では、測定時間がかかってしまいます。
そこで10Hz以下になったら平均をしないようにしています。
最後に、まだFIFOがいっぱいになったときの処理が納得いっていないので
そのうち見直すかもしれませんが、一応使えるので、実験されてみてはいかがでしょうか。
□■□■□■□■□■□■□■□■□■□■□■□■□■□■
RTCテスト回路 PICkit2のUARTによる時刻設定付き
日時を設定するUART通信にPICkit2のUART Toolを使用しました。
PICkit2を使うと232Cレベルコンバータは不要。といっても232Cレベルコンバートしている
わけではなく、VDDレベルでPIC24FとUART通信します。今回、PIC24F側のTX、RXは
PICkit2のファーム書き込み信号ピンであるPGD1、PGC1と共通に使用しています。
つまり、ファーム書き込み時は、PGD1、PGC1して働き、ファーム起動時はプログラムで
RPピンをUART1のTX、RXにピンを割り付けて使用します。
UARTとして使用する場合、PICkit2用コネクタPin2のVDDへ基板から3.3Vを供給してください。
必ず基板のPICKit2コネクタPin2と基板のVDD3.3Vの間に10D1の保護ダイオードと
スイッチ又はジャンパーを入れておいてください。PICkit2からVDDは出力しないでください。
X1の8MHz水晶は内蔵RCを使用することもできますが、その場合main.cの_CONFIG2を
内蔵RCのものに選択してください。
2007.10.15追加
X1の8MHzの水晶はノイズの発生源になってしまい、X2の32.768KHzへかなりのノイズを与えます。時計の精度を求めるなら、X1の8MHzは搭載しないほうがよいと思います。
X2の32.768KHz水晶は外側の筒をGNDに接続すると精度がよくなるようです。
1秒が安定しない場合は、お試しください。
なおANピンをRPピンにするときの注意事項を参照ください。
RTCテストプログラム PICkit2のUARTによる時刻設定付き
● delay.s main.c lcd.c lcd.h CharSet.c PinSel.c PinSel.h EasyUart.c EasyUart.h
(IEでソースファイルの文字が化ける場合、表示−エンコード−日本語(自動選択)にしてください)
上図のように、ファイルをプロジェクトに入れてください。
Library Files に MPLAB C30\lib にある libpPIC24Fxxx-coff.a を追加してください。
● ダウンロード
● プログラムの説明
基本説明は 内蔵RTCテストを参照ください。
これに、PICkit2のUART Toolを使用して、日付と時刻を設定できるようにしました。
PICkit2にて、UART Toolを起動すると以下のような画面に切り替わります。
PIC24F基板を起動させると以下のLCD表示がされます。
Date Time Set
Send T or D
UART1
9600,8,pn,s1
これは、UARTを9600bps、データ8ビット、パリティー無し、ストップビット1
にてTかDを送信するとデータタイム設定ができることを意味しています。
1)基板のPICkit2コネクタのPin2へ基板からVDD3.3Vを供給します。
基板のスイッチ又はJAMPERをONに(JAMPERを挿す)してください。
2)基板を起動し、LCDが通常の時刻表示になるまで待ちます。
3)UART Toolにて9600に設定しConnectボタンをクリックしてください。
4)TかDを打ちます。(リターン不要) なおSendボタンのところは使用しません
5)UART Toolの画面に以下の受信がされます
DATE&TIME SET
Date=2007.09.29
Time=10:10.58
D or T=?
6)最初にDと打つと(リターン不要)、Dateの入力メッセージを受信します。
Input Date format : year 20xx.month.day xx.xx.xx=?
ここで、2007年9月29日なら 070929を入力します。
2桁数字の間に自動的に.(ピリオド)を表示します。最後にリターンを打ちます。
もし、間違ったら途中でリターンを打ってください。そうするともう一度入力できる
ようになります。入力の反応が遅いことがありますが、そのときは画面をみながら
もう一度数字を打ってください。正常に入力すると以下のようになります。
Input Date format : year 20xx.month.day xx.xx.xx=?07.09.29
07.09.29
Date Set End
7)次にTと打つと(リターン不要)、Timeの入力メッセージを受信します。
Input Time format : hour.min.sec xx.xx.xx=?
ここで、17時50分00秒なら 175000を入力します。リターンはできれば正確な
時計をみながら、その秒になったときにおこなうと時刻が合います。
正常に入力すると以下のようになります。
Input Time format : hour.min.sec xx.xx.xx=?17.50.00
17.50.00
Time Set End
8)基板のPICkit2コネクタのPin2へ出力している基板からのVDD3.3Vを供給停止します。
基板のスイッチ又はJAMPERをOFFに(JAMPERを抜く)してください。JUMPERをOFFに
しないとPICkit2のライターソフトを終了したり、PCの電源を切ったときに、PIC24Fがリセット
してしまうようです。
以上で設定は終わりです。
なお、PICkit2とPIC24F間はVDDの3.3VでTX,RXが通信されているので
232Cレベルコンバータは不要です。
いかがでしょうか、PICkit2に便利なUSB/UART変換機能が付いているので
ファームの書き込み以外にも使えます。一度試してみてください。
□■□■□■□■□■□■□■□■□■□■□■□■□■□■
2007年11月号のトラ技の付録にC30ライブラリ・リファレンスが付いています。
これは、C30の周辺機能をレジスタ操作無しで使うライブラリで、16ビットPICを使う上で
すばらしい?ものです。またdsPIC用とPIC24用はほとんど同じだと思われますが、
PIC24にない機能や違う点もあるので要注意です。
共通するものにおいてInputCpureのところの
ReadCaptue関数の説明で疑問があるところがあります。
MPLAB C30 (v3.01)付属のライブラソース(dsPICやPIC24)を見ると
/********************************************************************
* Function Name: ReadCapture1 *
* Description: This routine reads all pending InputCapture *
* Buffers and stores in the locations specified *
* Parameters: address of locations where buffer data to be *
* stored *
* Return Value: None *
********************************************************************/
void ReadCapture1(unsigned int * buffer)
{
while (IC1CONbits.ICBNE)
{
*buffer++ = IC1BUF; /* reads the input capture buffer */
}
}
このようになっています。
IC1CONbits.ICBNEは最初のキャプチャイベントでセットされ、
FIFOが全部読み出されるまでクリアされません。
サンプルの例題は次のようになっています。
unsinged int *buffer = 0x1900;
ReadCapture1(buffer);
PIC24FではFIFOが4段あるので、まずいことになります。
正解はFIFO4段だと以下のようになると思います。
unsinged int buffer[4];
ReadCapture1(buffer);
それでも、割り込みでループが中断されたりするとさらにループが
回る可能性があります。入力信号タイミングによってInputCaptureの
イベントがこのループ実行中におこったりしてもループが回ります。
buffer[4];はもっとあったほうがいいかもしれません。
確実にするには、自分でループを作って読み出すのが一番です。
unsigned int buffer[4];
int n = 0;//FIFOバッファに格納した個数にもなります
while (IC1CONbits.ICBNE && n<4)
{
buffer[n++] = IC1BUF; /* reads the input capture buffer */
}
以上、気づいたところを上げてみました。
□■□■□■□■□■□■□■□■□■□■□■□■□■□■