HOME

  PIC24Fの紹介と実験  

      目      次

 PIC24Fの紹介 

 ICSPケーブル

 LEDピカピカテスト 

 秋月液晶SC1602テスト 

  内蔵RTCテスト (以下にもRTCテストあります)

  UARTテスト レジスタ版

 UARTテスト ライブラリ版

  RPピンの機能選択(16本あるRPピンは機能を選択することができます。簡単関数を用意しました)

  Input Capture 32bitタイマー使用 テスト

 RTCテスト PICkit2のUARTによる時刻設定付き new 2007.9.29

 C30ライブラリのInputCaptureの関数について new 2007.10.11

 

 リファレンスマニュアルを見ていろいろな実験をしてみました。ご参考になれば幸いです。

 ここに書いてあることも、独自調査のものなので間違っている場合もあります。おかしいと

 思われた場合は、リファレンスマニュアルを見て調査願います。

 

 ソフトウエアについては、著作権を放棄していませんがご自由に変更してご使用ください。

 個人で使用される以外でのご使用では、オリジナルがここのサイトであるこを明記してください。

 

 免責事項:記事を参考にされて損害がありましても対応できません。ご自身の責任のもと実験を

 おこなってください

□■□■□■□■□■□■□■□■□■□■□■□■□■□■

 PIC24Fの紹介 

趣味でさわるマイコンの基本は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があるようです。

□■□■□■□■□■□■□■□■□■□■□■□■□■□■

ICSPケーブル

LEDピカピカテスト回路のCN1は普通の6Pのピンヘッダを使用しています。

PICKit2との間は10cmの手作りのケーブルで接続しましたがうまく書き込めました。

ケーブルはあまり長いものはエラーがでる可能性があります。

せいぜい5〜10cmくらいだと思われます。

□■□■□■□■□■□■□■□■□■□■□■□■□■□■

 LEDピカピカテスト 回路    PIC24Fの電源電圧は2.0V〜3.6Vです。

img1.gif

 ブレッドボードで組みましたが、接触不良がわかるまで多少時間がかりました。できれば

たいした回路でないのでユニバーサルボードに組んだ方が確実です。電源は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でソースファイルの文字が化ける場合、表示−エンコード−日本語(自動選択)にしてください)

 

img3.gif

上図のように、ファイルをプロジェクトに入れてください。

 

● ダウンロード

 

● プログラムの説明

 

  単純な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で打ち止めということはないでしょう。たぶん。いや。。。お願いします。

□■□■□■□■□■□■□■□■□■□■□■□■□■□■

 秋月液晶SC1602テスト 回路 

● 回路 (すいません、後日掲載します)

    配線は以下のようにしてください。

    //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でソースファイルの文字が化ける場合、表示−エンコード−日本語(自動選択)にしてください)

 

img2.gif

上図のように、ファイルをプロジェクトに入れてください。

 

● ダウンロード 

 

● プログラムの説明

 

   秋月液晶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テスト回路 

 

● 回路

 

 クリックすると大きくなります

 

 

今回からブレッドボードをやめて、ユニバーサル基板にしました。

理由は、ブレッドボードに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を追加しました。

 

img1.gif

上図のように、ファイルをプロジェクトに入れてください。

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ドットのキャラクタを書き込んでいます。

「金」がちょっと見苦しいので、あとで改善するかもしれません。(笑)

 

クリックすると大きくなります

 

□■□■□■□■□■□■□■□■□■□■□■□■□■□■

 UARTテスト回路 (レジスタ操作版) 

 

  RP9=TX(送信)

  RP8=RX(受信)

            RTS,CTSは使用しません。

  TXとRXを線でつないでループバックテストをしました。

 

クリックすると大きくなります

 

 

  UARTテストプログラム (レジスタ操作版) 

 

● delay.s  main.c  lcd.c  lcd.h (IEでソースファイルの文字が化ける場合、表示−エンコード−日本語(自動選択)にしてください)

 

img1.gif

上図のように、ファイルをプロジェクトに入れてください。

 

● ダウンロード 

 

● プログラムの説明

 

  ループバック機能はあるのですが、あえてTXとRXのピンに線をつないで

  ループバックテストをしました。レジスタを直接操作しているので何をやっている

  のかわかりやすいと思います。

 

  レジスタを操作しましたが、デフォルト0のままでよいものが多くそれほど

  設定しませんでした。デフォルトでデータ8ビット、パリティー無し、ストップビット1の

  標準の非同期通信ができます。

 

  リングバッファを使用しています。送信は割り込み使用をしていませんが、受信は

  割り込み駆動でリングバッファに格納していきます。main()にて送信が終わったら

  バッファに受信されたデータが何バイトかを調べて、それを液晶に表示しています。

□■□■□■□■□■□■□■□■□■□■□■□■□■□■

 UARTテスト回路 (ライブラリ版) 

 

  RP9=TX(送信)

  RP8=RX(受信)

            RTS,CTSは使用しません。

  TXとRXを線でつないでループバックテストをしました。

 

  UARTテストプログラム (ライブラリ版) 

 

● delay.s  main.c  lcd.c  lcd.h (IEでソースファイルの文字が化ける場合、表示−エンコード−日本語(自動選択)にしてください)

 

img2.gif

上図のように、ファイルをプロジェクトに入れてください。

Library Files に MPLAB C30\lib にある libpPIC24Fxxx-coff.a を追加してください。

 

● ダウンロード 

 

● プログラムの説明

 

  レジスタ操作がライブラリに置き換わったようなプログラムです。やっていることは

  レジスタ版と同じなので、参照してください。

 

  実験を開始した初めのころは、ライブラリのドキュメントにあるサンプルを試しましたが

  動きませんでした。結局レジスタ操作のプログラムを作り、そこからライブラリに置き換えて

  動かしました。ライブラリでは通常パラメータはANDかOR形式のどちらかでプログラムを

  書くのですがANDよりOR形式の方が少ないパラメータで書けることがわかりました。

  OR形式をお勧めします。

 

□■□■□■□■□■□■□■□■□■□■□■□■□■□■

  RPピンの機能選択 

 

● main.c  PinSel.c PinSel.h (IEでソースファイルの文字が化ける場合、表示−エンコード−日本語(自動選択)にしてください)

 

img1.gif

上図のように、ファイルをプロジェクトに入れてください。

 

● ダウンロード 

 

● プログラムの説明

 

  RPピンは機能を選択できるピンです。小ピンマイコンでは始めての機能だと思われます。

  16本あるRPピンに機能を割りつけるにはレジスタを設定するのですが、表を常に見ないと

  設定が困難です。そこで、OutPinSel () および InPinSel () という便利な関数を用意しました。

 

          リファレンスマニュアルから抜粋 (画像)  input の表 output の表

 

  レジスタを覚えていなくても簡単に設定することができます。

 

        OutPinSel ( OFNC_U1TX, PIN_RP9 );  // RP9ピンをUART1 TXに割り付けます

        InPinSel ( IFNC_U1RX, PIN_RP8 );      // RP8ピンをUART1 RXに割り付けます

 

    ANピンをRPピンにするときの注意事項

 

    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タイマー使用テストプログラム 

 

img2.gif

上図のように、ファイルをプロジェクトに入れてください。

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でソースファイルの文字が化ける場合、表示−エンコード−日本語(自動選択)にしてください)

 

 img1.gif

上図のように、ファイルをプロジェクトに入れてください。

Library Files に MPLAB C30\lib にある libpPIC24Fxxx-coff.a を追加してください。

 

● ダウンロード 

 

● プログラムの説明

 

 基本説明は 内蔵RTCテストを参照ください。

 

 これに、PICkit2のUART Toolを使用して、日付と時刻を設定できるようにしました。

PICkit2にて、UART Toolを起動すると以下のような画面に切り替わります。

img2.gif

 

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変換機能が付いているので

ファームの書き込み以外にも使えます。一度試してみてください。

□■□■□■□■□■□■□■□■□■□■□■□■□■□■

C30ライブラリのInputCaptureの関数について

 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 */

}

 

 

以上、気づいたところを上げてみました。

□■□■□■□■□■□■□■□■□■□■□■□■□■□■

 

inserted by FC2 system