作業中
以前作った「周波数カウンタ(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]