avr 120:周波数カウンタの桁を増やす


 作業中

 以前作った「周波数カウンタ(20年以上前)、LED式 6桁表示を8桁に増設したい」のでチャレンジしました。

 当初オーバフローのランプが付いているので「これをカウントすれば桁上げ出来る」と簡単に考えていたところ回路図を見て動かない事が解り、困りました。

 結果悪戦苦闘の上、ようやく動くようになったので途中ですがここに載せる事にした。まだ少し改善すべきことがありますが、これまで所をまとめてみます。
 古くて特殊なので作る方はないと思いますが以前秋月電子で購入したものです。TC5032を使ったもので説明書には86/6とあったのでこの後直ぐか「数年後に買って作った」と思っています。(制作の日付が無い・・・)

 元のカウンタにはゲートコントロールがあるので、2桁増設がなくても使えるのですが「少しは見やすくなるかなー」程度です。


信号の引き出しは!

パルス

 信号の引き出しは5Vの電源用と次の@Aの合計4本が必要。いずれも「パルスの立ち上がり」で次の動作するようにしました。

@ラッチパルス IC25ピン(INT0)
○信号をラッチするパルスを引き出し、今までカウントしたものを読み出す。
○読み出した数字をLEDに表示する。
○古いカウントDATAをリセットする。

Aカウント用の桁上げ信号(Carry) IC20ピン(Timer/Count0)
 信号が来たらカウントアップする。2桁なので8Bit処理で十分、オーバーフロは無いのでこちらは割込みのプログラムは無い。

 いずれも通常の「割り込み処理プログラム」を利用する。

 LEDは手持ちのCommon Anodeを使いました。これを万能基板に組み立てケースの上から見る(本当は前面が良いが場所が無い、その内新しいケースに入れたい・・・)。


作ってみて

 「単に数字が余計に出るだけ」とあまりメリットは無い!精度は発振周波数に依存するので8桁を合わせ込むにはアマチュアには無理かもしれない。水晶も温度コントロールしてやらないと精度は保てないだろう。


プログラムプログラム(続き)
;--------------------------------------------------------
;Title	:FC +2LED /Common cathode
;MCU	:AT90S1200A 10 MHz
;last	:2006/4/27 	BY M.Kikuchi
;--------------------------------------------------------
.include "C:\AVRTOOLS\APPNOTES\1200def.inc"
.cseg				;code segment begin
.org	0

.equ	led_d1	= 0		;D0=LED digit1
.equ	led_d2	= 1		;D1=LED digit2
;input	D2=Lach	D4=count
;	D3,D5,D6
.def	back	= r1
.def	ov_data	= r2
.def	temp	= r16		;temp
.def	itemp	= r17		;temp
.def	led1	= r18		;LED data 01
.def	led10	= r19		;LED data 10
.def	flag	= r20		;0bit=find latch pulse
.def	w_c1	= r21		;Wait
.def	w_c2	= r22		;Wait
;Interrupt Vector Address -------------------------------
	rjmp	begin		;Reset
	rjmp	latch		;int0
	reti			;T/C0
	reti			;Analog Comparator
begin:	ldi	temp,$ff	;1=out 0=in
	out	DDRB,temp	;for LED
	ldi	temp,0b01101011 ;PD2=int0 PD4=ex counter
	out	DDRD,temp
	ldi	temp,0b00010100	;Pull up
	out	PortD,temp
	clr	temp
	out	TCNT0,temp	;reset
	ldi	temp,7		;count start
	out	TCCR0,temp	;lising edge
	ldi	temp,3		;lising edge
	out	MCUCR,temp	;int0
	ldi	temp,0b01000000	;int0 interrupt on
	out	GIMSK,temp	;/$40
	ldi	led1,0b00111111	;start 0=light on
	ldi	led10,0b00111111;g=on
;MAIN ---------------------------------------------------
main:	sbrs	Flag,0		;flag set ?
	rjmp	m2
;	binary (99 under) to BCD(10):led1=led10+led1
	mov	led1,ov_data
	clr	led10
btobcd:	cpi	led1,10		;10over_ck
	brlo	m1		;lower
	subi	led1,10		;
	inc	led10		;add 10
	rjmp	btobcd		;loop ck repeat
m1:	mov	temp,led1
	rcall	D_led		;LED data
	com	temp
	mov	led1,temp
	mov	temp,led10
	rcall	D_led		;LED data
	com	temp
	mov	led10,temp
	clr	flag		;
m2:	sei			;
	out	PortB,led1	;common anode LED
	sbi	PortD,led_d1	;ON
	rcall	wait1m		;1mS
	cbi	PortD,led_d1	;off
	out	PortB,led10	;
	sbi	PortD,led_d2	;ON
	rcall	wait1m		;1mS
	cbi	PortD,led_d2	;off
	cli			;
	rjmp	main
;-----------------------------------------------

;---------------------------------------------------
;Programm of latch pulse :int0 PD2
latch:	in	back,SREG
	clr	itemp
	out	TCCR0,itemp	;counter stop
	in	ov_data,TCNT0	;read
	ori	flag,1		;set flag
	clr	itemp		;repeat counter
	out	TCNT0,itemp	;data cler
	ldi	itemp,7		;rising edge 6=falling edge
	out	TCCR0,itemp
	out	SREG,back
	reti

;WAIT=1mS 10MHz ------------------------------------
wait1m:	ldi	w_c2,10		;about 1mS
t1:	ldi	w_c1,100	;10*100*0.1=0.1mS
t2:	nop
	nop
	nop
	nop
	nop
	nop
	nop
	dec	w_c1		;1
	brne	t2		;2
	dec	w_c2
	brne	t1
t3:	ret
;----------------------------------------------------
;DATA to LED data /temp to back		active=H
;.db	$3F,$06,$5b,$4f,$66,$6d,$7c,$07,$7f,$67
D_led:	cpi	temp,1		;1 ?
	breq	dl2
	brcc	dl3
	ldi	temp,$3f	;=0
	ret
dl2:	ldi	temp,$06	;=1
	ret
dl3:	cpi	temp,3		;3 ?
	breq	dl4
	brcc	dl5
	ldi	temp,$5b	;=2
	ret
dl4:	ldi	temp,$4f	;=3
	ret
dl5:	cpi	temp,5		;5 ?
	breq	dl6
	brcc	dl7
	ldi	temp,$66	;=4
	ret
dl6:	ldi	temp,$6d	;=5
	ret
dl7:	cpi	temp,7		;7 ?
	breq	dl8
	brcc	dl9
	ldi	temp,$7c	;=6
	ret
dl8:	ldi	temp,$07	;=7
	ret
dl9:	cpi	temp,9		;9 ?
	breq	dl10
	ldi	temp,$7f	;=8
	ret
dl10:	ldi	temp,$67	;=9
	ret	
;-----------------------------------------------

2006/5/6


[もどる]もどる [MENU

inserted by FC2 system