| ホーム |     私の電子工作作品集

179. 周波数カウンター II

[ 初公開日:2017年3月5日 ]

 最近、"中日電工さんのホームページ" へ よくお邪魔をしているのですが、そのホームページの中に "周波数カウンタ組立キット" という記事がありました。 中日電工さんはいろんな組立キットを販売しているのですが、 記事中に回路図が公開されており簡単そうなので、その回路図を参考にさせていただいて私も "周波数カウンタ" を製作してみました。

 ただし、回路図は公開されておりますが、プログラムについては公開されておりませんので、私独自の考えのもとで作成をした私のオリジナルです。
 中日電工さんのオリジナル回路図では、カウンタ心臓部のPICに PIC16F883 が使用されていますが、その改良前の PIC16F873A が私の手持ちにたくさんありますので、 それを使用することにしました。

 カウンタ前段の 74HC590 を使用したプリスケーラ部は、オリジナル回路図からそっくりいただくことにしました。 また、周波数表示部については、オリジナル回路図では7セグLEDを8個 並べて使用していますが、私は手持ちにLCDモジュールがたくさんありますので、それを使用することにしました。

■ 回路図 ■

| 回路図 (FreqCounterII.CE3) | ページトップ |

■ ハードバグと回路検討 ■

 久々にハマってしまいました。 といっても、夢中になった、のめり込んだ、熱中した、というような良い意味ではありません。 最悪な状況に入り込んでしまった という意味でです。 そのために2日間ほど無駄な時間を費やしてしまいました。

 実は、上の回路図はもちろん修正後のものですが、当初、74HC590 とPICのポートAとの接続は、次図のように行っていました。 これは、上述したように、プリスケーラ部を オリジナル回路図からそっくりいただいたためで、ポートAの使用したポート番号も同じものを使用したのです。 (今思えば、この回路図を描いた時点で気が付くべきでした。)

 PICの RA3、RA4、RA5 はすべてアウトポートに指定して、それぞれで 74HC590 の RCK、/CCLR、/CCKEN の各入力端子をコントロールしています。 実際のPICの制御プログラムは 下記の通りで、下リストの中央に位置するゲート(1秒間開いている)の前後( (1) 〜 (6) の部分)で、それらの信号をコントロールしています。
				:
		 		:

	main01		movlw	1
			btfss	PORTA,ZS_SW	;ゼロサプレススイッチ = OFF か?
			xorwf	zsflg,F		;No. フラグをビット反転

			clrf	bin3		;周波数入力カウンタの初期設定
			clrf	bin2
			clrf	bin1
			clrf	bin0

			movlw	high tm1_cycle	;
			movwf	TMR1H		;TMR1H に設定
			movlw	low tm1_cycle	;
			movwf	TMR1L		;TMR1L に設定
			movlw	100
			movwf	sec1cnt		;1秒カウンタの初期設定

			bsf	PORTA,CCLR	;RA4(/CCLR)=1: カウンタ値維持			..... (1)
			bsf	INTCON,GIE	;bit7(GIE)=1: 全割り込み許可
			bcf	PORTA,CCKEN	;RA5(/CCKEN)=0: カウント許可: (カウント開始)	..... (2)

			movf	sec1cnt,W	;10 mS * 100 = 1 S
			btfss	STATUS,Z	;1秒経過したか?
			;;
			;;この間で HC590からオーバーフローした /RCO数を 割り込みでカウントする
			;;
			goto	$ - 2		;No

			bsf	PORTA,CCKEN	;RA5(/CCKEN)=1: カウント禁止: (カウント終了)	..... (3)
			bcf	INTCON,GIE	;bit7(GIE)=0: 全割り込み禁止

			bsf	PORTA,RCK	;RA3(RCK)=1: カウンタのデータをレジスタにストア	..... (4)
			nop
			bcf	PORTA,RCK	;RA3(RCK)=0: レジスタ状態は変化しない		..... (5)
			movf	PORTC,W		;PORTC(HC590のレジスタ)の内容を
			movwf	bin0		;bin0に読み込む
			bcf	PORTA,CCLR	;RA4(/CCLR)=0: カウンタクリア			..... (6)

			call	bindec32	;32ビット数値を10進数10桁の文字列に変換
			call	freq_display	;LCD への "  xx,xxx,xxx Hz " 表示
			goto	main01

				:
			 	:
 PICのプログラムはこの後(一連のポートAの操作後)、カウントした4バイト(32ビット)のバイナリ(2進)データ(パルス数 = 周波数)を 10進数の文字列に変換した後、ポートBからLCDに送出して表示をさせています。

 そもそも測定をするパルス列(周波数)は、上図の 74HC590 の CCK(カウンタクロック)端子に接続をして入力しますが、本機を起動させた直後の入力に何も接続していない状態では 当然ながら 0 Hz を表示しています。 ところが、実際に CCK 端子にパルス列を入力しても表示は 0 Hz のままで何の変化も起こらないのです。 ・・・・・・ ンッ ??

 初め、一瞬目を疑いました。 このようなときって、実にいろいろなことを考えます。 どこか半田上げ不良で断線状態になっているのではないのか? とか、74HC590 の使用方法が 間違っているのでは? とか、それよりも 74HC590 自体が不良なのでは? とか、ハードウエアばかりでなくプログラム自体にもどこか問題があるのでは? とか、 ・・・・・・ 等々

 CCK 端子周りの配線を入念にチェックをしました。 74HC590 も別の個体と取り換えてみました。 プログラムについても次に示す 74HC590 のデータシートの真理値表や、タイミング図などを 何度も見直して、オペレーションに間違いがないかを十分に確認をしました。 (以下の真理値表、ブロック図、タイミング図は、東芝 TC74HC590AP データシートより抜粋)


 しかし、特に悪いと思われるようなところは見当たらず結果も変わりません。 やはり 0 Hz を表示したままです。 ・・・・・・ わからない。 ・・・・・・ 一体、何が悪いのか? ・・・・・・

 CCK 端子に入力しているパルス列は 256 Hz 以上にもかかわらず、オーバーフローの /RCO 信号が1つも出力されて来ない(らしい)のが一番の謎でした。 そして、 カウントしたパルス数の下位8ビットがPICのポートCに読み込めていない(らしい)のも謎でした。

 そこで、まず次のことを試みてみました。 本機では 74HC590 にも ICソケットを使用しているため 74HC590 をソケットから外して、/RCO 信号の代わりにパルス列を直接 PICの RB0/INT 端子に接続してみたところ、256 倍された(たぶん)周波数がLCDに表示されました。 これで、PICの外部(RB0/INT)割り込みは正常に機能していることが 確認できました。 したがって、74HC590 からは /RCO 信号が出力されて来ないことが決定されたのです。

 次に、なぜ /RCO 信号が出力されないのか ―― ですが、複数の 74HC590 と交換しても結果が変わらなかったことから、74HC590 の不良ということはまず考えられず、 やはり、オペレーションに問題があるのでしょう。 しかし、上記したプログラムリストを見た限りでは問題はなさそうです。 ・・・・・・ わからない。

 また、上記したプログラムリストには挙げてはいませんが、この段階以前で 74HC590 の初期化を行っており、そのときのポートAからは h'20' を送っています。すなわち、 RA5(/CCKEN) = 1(カウント禁止)、RA4(/CCLR) = 0(カウンタクリア)、RA3(RCK) = 0(レジスタ状態は変化しない)の状態です。

 そこで、ポートAからの各信号が実際にプログラム通りに出力されているかどうかを確認をするために、ポートAを操作した都度プログラムを止めて(直後に goto $ 命令を挿入)、 順にテスターで当たって確認をして行くことにしました。 まず、初期化直後では RA5(/CCKEN), RA4(/CCLR), RA3(RCK) = 1, 0, 0 となっておりOKでした。

 次のポートA操作は、上記のプログラムリスト中の (1) で表した RA4(/CCLR) = 1(カウンタ値維持)ですが、テスターで当たってみるといきなりNGで RA4(/CCLR) = 0 のままです。 あっ、そうか ―― と思いましたがとりあえずここはパスをして先を進め、(2) から (6) までの信号がOKであることを確認しておきました。

 結局、(1) の RA4(/CCLR) = 1 の動作のみNGであることが分かりました。 ―― そうなんです。 左下表(クリックすると拡大します)に示すように RA4 は他のポートと違って オープンドレイン出力になっているのです。 10KΩ程度の抵抗でプルアップをしてやらないと、(1) の命令( bsf PORTA,CCLR ;RA4(/CCLR) = 1: カウンタ値維持)を実行しても、 RA4(/CCLR) = 1 が出力されることがないのです。 (左右下の表は、マイクロチップ PIC16F873A および PIC16F883 データシートより抜粋)


 したがって、プログラムでいくら RA4(/CCLR) に "1" をセットしてやっても、実際には "0" のままで "1" が出力されることはなく、すなわち初めから クリア状態のままで永遠にクリア状態が解除されることがなく、入力パルスをカウントすることができないでいたのです。

 ちなみに、オリジナル回路で使用している PIC16F883 は、右上表に示すように RA4 はオープンドレイン出力にはなっておらず、他の一般のポートと同様に扱えますから プルアップ抵抗は不要です。 この違いに気が付かずにオリジナル回路をそのままコピーし、PICだけを PIC16F883 から PIC16F873A に変更をした私の不覚でありました。 修正後の 回路図 では、プルアップ抵抗が不要な他の空きポート番号に、3本の制御ポートとも変更をしました。

周波数を単純に8桁で表示 先頭に連なる "0" をゼロサプレス表示

 また、修正後の回路で追加をした RA3 の入力ポートに接続した ZERO SUP.(ゼロサプレス)スイッチは、LCDに表示する形態を変更するためのもので、 上写真に示すように、周波数を単純に8桁で表示する/先頭に連なる "0" をゼロサプレスする、の表示形態をスイッチを押すごとに切り替えるトグルスイッチとして機能します。

| ページトップ |

■ ケース外観と内部の様子 ■

ケース正面の斜め上から見たところ ケース背面の斜め上から見たところ
ケース左側面の斜め上から見たところ ケース右側面の斜め上から見たところ
ケース上面を真上から見たところ ケース裏面を真上から見たところ
蓋をあけて内部の様子を見たところ ( 拡大 左写真のケース内だけを拡大したところ

| ページトップ |

■ プログラム ■

 本機(周波数カウンター)のような測定器を作製した場合に、私のような一般的なアマチュアがその精度をいかにして確保すれば良いのか、校正方法を含め 非常に難しい問題だと思います。

 本機では、上記 回路図 のように 20MHz のクリスタルを使用しているため、PICの基準クロックは ( 1 / 20MHz ) * 4 = 0.2μS となります。 この 0.2μS を 50000 回カウントして、すなわち 0.2μS * 50000 = 0.01 S = 10 mS 周期でタイマー1オーバフロー割り込みを起こさせ、それをまた 100 回カウントすることによって 1秒(10 mS * 100 = 1000 mS = 1 S)という基準時間を作り出しています。 そして、その1秒間をゲート時間として測定をするパルス列(周波数)を通過させ、74HC590 と PICでその数をカウントしてLCDに表示をさせています。

 このゲート時間がきっちりと正確な1秒間であることが理想的なんですが、現実的には、PICのオシレータ入力に繋がっている 20MHz のクリスタルが 正確な値で発振をしてくれないため、よって、その基準クロックも正確な 0.2μS とはならないために、ゲート時間(1秒)も理想からずれてしまうのです。

 このクリスタルによる発振周波数を正確な 20MHz に合わせ込むためには、クリスタルの両端につながっている2つのコンデンサ(22pF)の容量を調整するために、 一般的にはトリマコンデンサや複数の容量のコンデンサを用意して、カットアンドトライで取っ替え引っ替えしながら調整する方法しかありません。 そのためには基準となる 正確な測定器も必要となるでしょう。 また、本機のようにユニバーサル基板を使用している場合には、数回のはんだの取り外しですぐにランドが剥がれてダメになってしまいます。

 そこで、このようなハード的な方法ではなく、邪道かもしれませんが私がよく行っている方法をご紹介します。 まず、発振周波数を正確な 20MHz に合わせ込むことは、 上記の理由からきっぱりあきらめます。 そして、今回は正確な1秒のゲート時間を作り出すことが最終的な目的でもあることから、これをソフト的に補正をかけて 理想の1秒に近づけることにします。

 それには、やはり基準となるもの(正確な発振器)が必要で、私の場合には、"京セラ" の "KTXO-18S" という超高精度クリスタルモジュールを使用しています。 10年ほど以前に "秋月電子通商" で複数個を購入したものの1つですが、現在ではもう既に販売はされていないようです。 ただし、私は購入したことはありませんが、現在では類似のものとして "VM39S5G" という超高精度クリスタルモジュールが販売さているようです。 (下左図は、 "秋月電子通商" で "KTXO-18S" を購入時に添付されていた資料より抜粋)


 本機のプログラムリストの冒頭部分に定数の定義をしているところがありますが、そこで、タイマー1のカウントレジスタ(TMR1L, TMR1H)への設定値、 すなわち、タイマー1の割り込み周期を決める定数を次のように定義をしています。
	xx		equ	24	 		;補正値
	tm1_cycle	equ	65536 - 50000 + xx	;割り込み周期: 4/20MHz * 50000 = 0.2μS * 50000 = 0.01 S = 10 mS     ...... (1)
 そして、本機の入力端子に上右図に示す "KTXO-18S" による基準周波数を接続して、上記の補正値 xx の値を順に変更して行くと、次表のような結果を得ました。 表中で、LCD表示周波数の値には安定性がなく、実際には下1桁ないし2桁は数秒おきに値が変更されています。 したがって、表に記入した数値は変更を繰り返している 一瞬をとらえた代表的な1つの数値にほかなりませんので、これが絶対的な値ではないことを断っておきます。

 また、この表では入力された基準周波数が完全なもの(0 ppm)と仮定していますので、表中の誤差(ppm)値は、実際には基準周波数の誤差も加味して考える必要があります。 とはいうものの、左上図に示すように "KTXO-18S" は ±1ppm ということですから、周波数に変換すると±12.8 Hz の範囲に誤差が収まっているという精度になります。

補正値 LCD表示周波数 誤差
0 12,808,060 Hz + 8,060 Hz + 629.7 ppm
10 12,804,742 Hz + 4,742 Hz + 370.5 ppm
20 12,801,374 Hz + 1,374 Hz + 107.3 ppm
21 12,800,983 Hz + 983 Hz + 76.8 ppm
22 12,800,629 Hz + 629 Hz + 49.1 ppm
23 12,800,204 Hz + 204 Hz + 15.9 ppm
24〜50 12,799,907 Hz - 93 Hz - 7.3 ppm
60 12,793,714 Hz - 6,286 Hz - 491.1 ppm

 上表で補正値 xx が 0 のとき、すなわち何も補正をしなかったときには、約 + 8,000 Hz ほどの誤差がありますが、これはプラスの値であることから、 ゲート時間が実際の1秒よりも大きくてそのゲートを通過したパルス数が多くなってしまった、ということですので次式
      ゲート時間(1秒) = 割り込み周期(10 mS) x 割り込み回数(100 回)
から、実際の割り込み周期を少々短くしてやる必要があります。 上記の定数の定義をしている (1) 式の equ の右辺を書き直すと、65536 - 50000 + xx = 65536 - (50000 - xx) となって分かりやすくなったと思いますが、要はPICの基準クロック 0.2μS のカウント回数 50000 を、補正値 xx の分だけ減らしてやれば良いことが 分かります。 上の表中で下から2行目の補正値 xx が 24(24〜50 までは殆んど同じで変わらず、51〜59 は調べていない)のときが最も誤差が小さくなることが分かりましたので、 本機ではそれを補正値として採用しました。
      本機プログラムの開発中(デバッグ中)の様子

1秒ゲートの作成方法と、ゼロサプレススイッチのON検出方法の見直し ( 2017/2/26 更新 )

 1秒ゲートの作成方法の見直しでは、前バージョンでは 10 mS のタイマー1の割り込み周期に値 xx の補正をかけ、その常に補正がかかった割り込み周期を 100 回カウントする方法であったのを改め、変更後は、1 〜 99 回目までは無補正の割り込み周期をカウントし、100 回目だけに値 yy の補正をかけるようにしました。 結果、 後者の方がきめ細かな時間単位で調節が可能となりました。 すなわち、前者では補正値を1だけ変更しても全体では 100 変更したことになってしまいますが、後者では 補正値は全体でも1ずつの変更が可能です。

 具体的には、タイマー1の割り込み周期を決める定数を次のように定義を変更しました。
	;xx		equ	24 			;補正値							;削除
	;tm1_cycle	equ	65536 - 50000 + xx	;4/20MHz * 50000 = 0.2μS * 50000 = 0.01 S = 10 mS	;

	tm1_cycle1	equ	65536 - 50000		;4/20MHz * 50000 = 0.2μS * 50000 = 0.01 S = 10 mS		...... (2)
	yy		equ	3135 			;補正値
	tm1_cycle2	equ	65536 - 50000 + yy	;100回目の割り込み時のみ使用					...... (3)
 そして、上述のように 1 〜 99 回目までは (2) を使用し、100 回目だけに (3) の補正をかけたものを使用しています。 その切り替えを実際に行っているところは、 次に示すリストのように割り込みルーチン内の一部で実現をさせています。
				:
	 			:

			; タイマー1オーバフロー割り込み

	t1int01		bcf	PIR1,TMR1IF	;タイマー1オーバフロー解除

		;	movlw	high tm1_cycle	;				;
			movlw	high tm1_cycle1	;				; (Ver. 1.01 にて変更)
			movwf	TMR1H		;TMR1H に設定
		;	movlw	low tm1_cycle	;				;
			movlw	low tm1_cycle1	;				; (Ver. 1.01 にて変更)
			movwf	TMR1L		;TMR1L に設定

			decf	sec1cnt,F	;1秒カウンタを -1 更新
			decfsz	sec1cnt,W	;1秒カウンタ = 0 か?		;
			goto	int_end		;No				;
										;
			movlw	high tm1_cycle2	;				; (Ver. 1.01 にて追加)
			movwf	TMR1H		;TMR1H に設定			;
			movlw	low tm1_cycle2	;				;
			movwf	TMR1L		;TMR1L に設定			;

	int_end
				:
	 			:
 前バージョンと同じように、補正値 yy の値を順に変更したときのLCD表示周波数との関係を、調べて次表のようにまとめてみました。 やはりLCD表示周波数の 値には安定性がなく、実際には下1桁ないし3桁が1秒おきに表示が変更しています。 とりあえず、補正値 yy に 3135 を採用しました。

補正値 LCD表示周波数 誤差
0 12,808,056 〜 12,808,103 Hz + 8,056 〜 + 8,103 Hz MAX + 633.0 ppm
3000 12,800,389 〜 12,800,438 Hz + 389 〜 + 438 Hz MAX + 34.2 ppm
3100 12,800,118 〜 12,800,169 Hz + 118 〜 + 169 Hz MAX + 13.2 ppm
3110 12,800,092 〜 12,800,144 Hz + 92 〜 + 144 Hz MAX + 11.3 ppm
3120 12,800,073 〜 12,800,124 Hz + 73 〜 + 124 Hz MAX + 9.7 ppm
3125 12,800,097 〜 12,799,990 Hz + 97 〜 - 10 Hz + 7.6 〜 - 0.8 ppm
3130 12,800,075 〜 12,799,980 Hz + 75 〜 - 20 Hz + 5.9 〜 - 1.6 ppm
3135 12,800,073 〜 12,799,979 Hz + 73 〜 - 21 Hz + 5.7 〜 - 1.6 ppm
3140 12,800,073 〜 12,799,954 Hz + 73 〜 - 46 Hz + 5.7 〜 - 3.6 ppm
3145 12,799,933 〜 12,799,985 Hz - 67 〜 - 15 Hz MAX - 5.2 ppm
3150 12,799,920 〜 12,799,985 Hz - 80 〜 - 15 Hz MAX - 6.3 ppm
3200 12,799,918 〜 12,799,862 Hz - 82 〜 - 138 Hz MAX - 10.8 ppm

 今回は、LCD表示周波数を範囲で表示してはありますが、前バージョンと同様にこれらが絶対的な値ではないことを断っておきます。 しかしながら、 前バージョンでもそうでしたが、変動の範囲が大き過ぎるような気もしますが ・・・  電源電圧の変動とか周囲温度の影響とかはある程度はあるとは思いますが、 それにしても大き過ぎるような ・・・

 何度も書いているように、本機ではPICの基準クロックをクリスタルを使用して(セラロックなどではなく)作り出しており、また、その基準クロックを使用して タイマー1の割り込み周期 10 mS、しいては1秒のゲート時間を作り出しているわけですから、そのゲートを通過するパルス数(周波数)の変動が大きい、 ということはどうも納得が行きません。 たとえ発振周波数が 20MHz からずれていたとしても、クリスタルを使用している以上ある程度の安定度は確保できるのでは ・・・ と思うのですが。

 実は、私は過去に周波数カウンターをもう1台製作をしています。 その1作目はPICの基準クロックに単体のクリスタルではなく、本機の校正用に使用したものと同じ クリスタルモジュール "KTXO-18S" を使用しているのです。 その1作目の周波数カウンターで、今回 "KTXO-18S" を使用した(ややこしい?)基準周波数を測定すると、 かなり安定した表示をします。 プリスケーラの関係で下2桁が "08" または "16" のどちらかを必ず表示しています。

 それに比べて本機では、上記した表の範囲内でたえずいろいろな値に変更を繰り返しながら表示をしています。 これはやはり、使用しているクリスタルの問題では なさそうな気がしますが、しかしどこかに問題があるはず ・・・ と思います。 最近、私のホームページの更新が滞りがちなのでこのページはとりあえず公開はしますが、 この問題については今後も検討を続けていきたいと思っています。

 一方、ゼロサプレススイッチのON検出方法では、前バージョンでは1秒のゲート外で検出していた( ハードバグと回路検討 の項のリストを参照、次のリストでは上部でコメント行に変更した3行部分)のを、次のリストに示すようにゲート内で検出(ラベル main02 から main03 の部分) するように改めました。
				:
	 			:

	main01	;	movlw	1						;
		;	btfss	PORTA,ZS_SW	;ゼロサプレススイッチ = OFF か?; (Ver. 1.01 にて削除)
		;	xorwf	zsflg,F		;No. フラグをビット反転		;

			clrf	bin3		;周波数入力カウンタの初期設定
			clrf	bin2
			clrf	bin1
			clrf	bin0

		;	movlw	high tm1_cycle	;				;
			movlw	high tm1_cycle1	;				; (Ver. 1.01 にて変更)
			movwf	TMR1H		;TMR1H に設定
		;	movlw	low tm1_cycle	;				;
			movlw	low tm1_cycle1	;				; (Ver. 1.01 にて変更)
			movwf	TMR1L		;TMR1L に設定
			movlw	100
			movwf	sec1cnt		;1秒カウンタの初期設定
			bcf	zsflg,7		;スイッチON入力受付済み解除	; (Ver. 1.01 にて追加)

			bsf	PORTA,CCLR	;RA1(/CCLR)=1: カウンタ値維持
			bsf	INTCON,GIE	;bit7(GIE)=1: 全割り込み許可
			bcf	PORTA,CCKEN	;RA2(/CCKEN)=0: カウント許可: (カウント開始)

	main02		btfsc	zsflg,7		;スイッチON入力受付済みか?	;;(Ver. 1.01 にて変更)
			goto	main03		;Yes				;;
										;;
			btfsc	PORTA,ZS_SW	;ゼロサプレススイッチ = ON か?	;;
			goto	main03		;No				;;
										;;
			movlw	1						;;この間で HC590からオーバーフローした
			xorwf	zsflg,F		;No. フラグをビット反転		;;/RCO数を 割り込みでカウントする
			bsf	zsflg,7		;スイッチON入力受付済み設定	;;
										;;
	main03		movf	sec1cnt,W	;10 mS * 100 = 1 S		;;
			btfss	STATUS,Z	;1秒経過したか?		;;
			goto	main02		;No				;;

			bsf	PORTA,CCKEN	;RA2(/CCKEN)=1: カウント禁止: (カウント終了)
			bcf	INTCON,GIE	;bit7(GIE)=0: 全割り込み禁止

			bsf	PORTA,RCK	;RA0(RCK)=1: カウンタのデータをレジスタにストア
			nop
			bcf	PORTA,RCK	;RA0(RCK)=0: レジスタ状態は変化しない
			movf	PORTC,W		;PORTC(HC590のレジスタ)の内容を
			movwf	bin0		;bin0に読み込む
			bcf	PORTA,CCLR	;RA1(/CCLR)=0: カウンタクリア

			call	bindec32	;32ビット数値を10進数10桁の文字列に変換
			call	freq_display	;LCD への "  xx,xxx,xxx Hz " 表示
			goto	main01

				:
	 			:
 1秒のゲート内では文字通り1秒間の時間があるわけですが、それに対して、ゲート外ではほんの一瞬の時間しかありません。 その時間比でカウンター動作を 繰り返しているのですが、当然ながらスイッチのON検出をするためには、ゲート外ではスイッチのONを見逃すおそれが大きいため、ゲート内で検出する方が圧倒的に有利となります。

現在の最新バージョン: Ver. 1.01

ソースファイル (FreqCounterII.asm)
 LCD 制御サブルーチン (LCD.sub)
HEX ファイル (FreqCounterII.hex)

■ プリント基板(1)パターン図 (部品面) ■

| プリント基板(1)パターン図 (部品面) (FreqCounterII_PC.CE3) | ページトップ |

■ プリント基板(1)パターン図 (ハンダ面) ■

| プリント基板(1)パターン図 (ハンダ面) (FreqCounterII_PC1.CE3) | ページトップ |

■ プリント基板(2)パターン図 (部品面) ■

コネクタ, ケーブルを 取り付け前の様子 , 取り付け後の様子

| プリント基板(2)パターン図 (部品面) (FreqCounterII2_PC.CE3) | ページトップ |

■ プリント基板(2)パターン図 (ハンダ面) ■

コネクタ, ケーブルを 取り付け前の様子 , 取り付け後の様子

| プリント基板(2)パターン図 (ハンダ面) (FreqCounterII2_PC1.CE3) | ページトップ |

■ コネクタケーブル ■

 LCDモジュールとプリント基板を繋ぐための、フラットケーブル、コネクタ(ピンソケット)の取り付け例を次に示します。

| ページトップ |

■ ケースへの液晶モジュールとプリント基板(2)の取り付け ■

 使用した液晶モジュール(S-10551D)を固定させるための、取り付け用穴の横幅間隔は 75 mm となっており、ケースに取り付けるときに下の ケース加工図 に示すように、液晶モジュールの下には 72 mm 幅のプリント基板(1)が位置するため、このままではプリント基板(1)が邪魔となって 液晶モジュールを取り付けることができません。

 そこで、液晶モジュールの取り付け用穴の横幅間隔を広げるために、次の写真に示すように、プリント基板の端材を使用した継ぎ手を左右に足し込んでやることによって、 左右それぞれ 5 mm ずつの横幅間隔の拡張を確保し、プリント基板(1)を十分に跨ぐことが可能なようにアダプタを取り付けました。

 液晶モジュールにアダプタを取り付けるときの注意点としては、下写真中の上段右側の写真に示すように、アダプタとしてのプリント基板片は、必ず液晶モジュール基板の 下側に位置するように取り付けます。 といっても、液晶モジュールの構造上(黒枠部分の左右両端が邪魔をして)上側には取り付けはできない、はずです。

プリント基板の端材使用のアダプタと M 2.6 のビス、ナット 液晶モジュールにアダプタを取り付けた様子
液晶モジュールを上面から見た様子 液晶モジュールを裏面から見た様子

 そして、アダプタを取り付けた液晶モジュールをケースに取り付けるためには、左下の写真に示すように M 2.6 のビスとスペーサーが必要ですが、 M 2.6 用のスペーサーは一般的ではなく入手が困難なため、自作をして使用しました。 その自作方法については "万年カレンダー" の "ケースへの液晶モジュールの取り付け" で既に紹介していますので、そちらの項を参照してください。

 右下の写真は、自作をしたスペーサーを実際に使用してケースに取り付けた様子を、ケースの後側面から見たところです。 青色↓印の位置にそのスペーサーをはさんで、 ケースの底面側と液晶モジュール用アダプタの上面側から各 M 2.6 のビスで取り付けています。

M 2.6 のビスと自作をした M 2.6 用 長さ 24 mm のスペーサー 液晶モジュールをケースに取り付け後側面から見た様子

 また、プリント基板(2)のようなものの取り付けでは、通常私は、ケースの内側面に沿って取り付けを行っているのですが、今回の製作に限り次の写真のように、 ケースの外側面側に取り付けを行いました。 それは周波数の入力端子に使用しているターミナルブロック(青色のもの)の構造上、ケースの内側面側では、ケースの厚さが 2 mm ほどありますので接続する部分(根本付近にある)が断面に少しばかり隠れてしまって、使用時に支障をきたすからです。

 したがって、写真のようにプリント基板を外側面側に取り付けたことによって、ターミナルブロックの左側にあるタクトスイッチも外側に飛び出した格好となり、 面体も非常に悪くなりましたが致し方がありません。

プリント基板(2)の取り付けの様子

| ページトップ |

■ ケース加工図 ■

 使用したケースは、100均(セリア)で購入した "クリアケース ミニ (L-8033) サナダ精工" という、ポリスチレンケースです。

| ケース加工図 (FreqCounterIICS.CE3) |

ケース左側面から見たところ 蓋をあけて下箱の内部を真上から見たところ ケース右側面から見たところ

| ページトップ |

■ 使用部品表 ■

(主要部品: IC, トランジスタ等)

(データシート)
PICマイコン .................... PIC16F873A
HC-MOS .................... HD74HC590P
LCDモジュール .................... S-10551D

| 部品表 | Excel ファイル (FreqCounterII_parts.xls) | ページトップ |

■ 参考サイト ■

周波数カウンタ組立キット(連載トップページ) .......... http://userweb.alles.or.jp/chunichidenko/fcounter1.html
32ビット数値を10進数10桁の文字列に変換する .......... http://orange.zero.jp/electronics/pic/hxdec32c_mp.txt (現在リンク切れ)

| ページトップ | ホーム |


Copyright (C) 2017-2023 やまもとみのる
初版:2017年2月24日、初公開:2017年3月5日、最終更新:2023年11月3日