nobcha23の日記

PICマイコンやArduinoを使う電子回路遊びを紹介します

PIC16F628A 周波数カウンタのソースコードを紹介

組み立て、デバッグ経緯です。

まず過去に作成した内蔵クロックで動作するコードを移植してきましたが、ここで思わぬところでトラぶるがでます。それはdelay.hで組み込むdelay関数です。Delay関数は内蔵クロックの値4、8MHzなどにしか対応していないので、12.8MHzなどという周波数では自前delay関数を用意するか、以前からある_delay関数を使わないといけません。以前にもそのことに遭遇し、トライアンドエラーで古い_delay(*)を使って切り抜けたのですが、忘れてました。

そこで_delay(*)に書き換えることにしました。出来上がったソフトは次の通りです。MAINではTMR0とTMR1による周波数カウントと表示計算を行います。LCDでは4ビットデータ接続でLCDモジュールを制御します。そしてLCD関数のヘッダ。

http://chitose6thplant.web.fc2.com/pic16f/683_cnt_pres/628_cnt_pres_main_c.pdf
http://chitose6thplant.web.fc2.com/pic16f/683_cnt_pres/lcd_c.pdf
http://chitose6thplant.web.fc2.com/pic16f/683_cnt_pres/lcd_h.pdf

(もう一度最終見直しのために、先輩ブログJA3DEW清水さんの開発された100MHz計測可能PICカウンタの方をちょっと見たら、当方のバグを発見。近日中に直すので上記コードはバグ付なのをご承知願います。:ゲートオフとTMR0キャリーが競合した時の処理が入ってませんでした。カウント値が256狂う確率が1000分の1ぐらい可能性あるように思います)

開発環境ですが、MPLABとPICKIT3を使用しております。チップへの書き込みは先に紹介したZIFソケット
http://d.hatena.ne.jp/nobcha23/20111211/1323580367
コンパイラはHI-TECH Cを使用しています。
MPLABはV8.73a、HI-TECH CはV9.82なので、以前開発したコードを使いまわしているため、レガシーデファインです。


参考書は次なんですが、どうもこれだけだと進歩が無いようです。でも初心者にはHI-TECH Cの基本が説明されていて好適なのでは無いかと思います。