PICで周波数カウンタ

PIC16F88編

PIC16F84編

なんでもない周波数カウンタが必要になった。
10年くらい前に回路作りセミナーをやったときに作った PIC16F84A+LCDモジュール(SC1602BS)が出てきたのでこれに手を入れることにする。 当時定番の組み合わせで今さらいじりたくないが0から作るよりは簡単だろう。 元の回路は
こんな感じ
それを
こんな感じ
に作り替える。
プログラムは恐らく秋月のキットのと思われるソースコードを探し出したが、 秋月のはクロックが10MHzであり(手元のは4.19MHz)、ゲート回路が 付いているので、少し書き替える。
PASMソース
HEXファイル
ちなみにステップ数を数え直すにあたって(x*13+5)*yが105619に 近くなる自然数の組x,yを求める芸のないプログラムも書いてみた。
Cソース
(93*13+5)*87=105618らしい。
picture of the frequency counter
オシロが出している基準信号の1kHzを入れたところ。
MPLAB IDE v8.20
MPASM v5.30
PICプログラマV4 V6.71.3

asmファイルに十進のつもりで87と書いたら087Hと解釈された(たぶん)。

2009.09

PIC16F88編

訳あってPIC16F88用に書き直してみた。変更は次の5点。
[1] MPUの種類を宣言するところ:
  LIST            P=PIC16F88
  INCLUDE         "P16F88.INC"
[2] コンフィギュレーションビットを指定するところ:
  __CONFIG _CONFIG1,_CP_OFF &_PWRTE_OFF &_WDT_OFF &_HS_OSC &_BODEN_ON &_LVP_OFF &_CPD_OFF &_DEBUG_OFF
[3] 一般用レジスタ(SRAM領域)の開始番地が0CHではなくて20Hなので変数の宣言をずらすこと:
  BYTE0           EQU             20H             ;Counter 0
  BYTE1           EQU             21H             ;Counter 1
  BYTE2           EQU             22H             ;Counter 2
  ...
[4] パワーONのときにA/D使用になっているので使用しないようにする:
  BSF             STATUS,RP0
  CLRF            ANSEL           ;do not use A/D
  BCF             STATUS,RP0
[5] 若干のレジスタ(フラグ)名が異なるので(このプログラムの場合 INTCONのT0IF⇒TMR0IF)それを修正する。

PASMソース
HEXファイル

2009.09
2012/03/21 18:25:32 更新