|
![](static/image/common/ico_lz.png)
楼主 |
发表于 2010-10-25 08:55:47
|
显示全部楼层
为避免“空谈”,下面先详细介绍频率计程序
本制作的频率计未加预处理电路,而且还借用测电感输入电路,所以不能测高频率
但是测量处理程序自己认为是合理的,有特色的
//F_METER相关程序***********************
string_F_METER:
.db " Fx= " ;频率计显示画面数据
.db " . Hz "
F_METER: ;测量主程序
ldiw z,(2*string_F_METER) ;切换到频率计显示
rcall string_to_code_buff ;读显示数据
rcall LCD_write_new ;更新显示
;init_t1: ;设置定时器T1
clr temp
sts TCCR1A,temp
sts TCCR1B,temp
lds temp,TIMSK1
ori temp,1<<TOIE1;|1<<ICIE1
sts TIMSK1,temp
test_t_0:
wdr
sbic PIND,5 ;定位低电平
rjmp test_t_0
clr temp ;T1准备
sts TCNT1H,temp
sts TCNT1L,temp
clr byte_3
cli
test_t_1: ;先用周期法测
sbis PIND,5 ;捕获高跳变
rjmp test_t_1
ldi temp,1<<CS10 ;启动T1
sts TCCR1B,temp
test_t_2:
sbic PIND,5 ;捕获低跳变
rjmp test_t_2
lds xl,TCNT1L ;保存半周期值 (3byte)
lds xh,TCNT1H
sts T_hh,byte_3
sts T_h,xh
sts T_l,xl
clr byte_3 ;T1复位
clr temp
sts TCCR1B,temp
sts TCNT1H,temp
sts TCNT1L,temp
ldi temp,1<<CS12|1<<CS11 ;设定T1计数,external falling edge
sts TCCR1B,temp ;测频率
ldi temp3,5
del_1s: ;1 second delay
ldi temp,200
rcall DELAY_NmS ;200ms*5=1000ms
dec temp3
brne del_1s
cli ;读取数据
lds r3,TCNT1L ;频率值整数在r1r2r3
lds r2,TCNT1H
mov r1,byte_3
clr r0 ;继续用周期法测部分周期
sts TCNT1H,r0
sts TCNT1L,r0
clr byte_3
ldi temp,1<<CS10
sts TCCR1B,temp
;sei
sbis PIND,5 ;区别当前电平高低
rjmp test_t_4
test_t_3:
sbic PIND,5
rjmp test_t_3
lds xl,TCNT1L ;读取高电平延续时间
lds xh,TCNT1H
lsr byte_3 ;数据除以2
ror xh
ror xl
lds yl,T_l
lds yh,T_h
lds temp,T_hh
sub yl,xl
sbc yh,xh
sbc temp,byte_3
rjmp save_Td
test_t_4:
sbis PIND,5
rjmp test_t_4
lds xl,TCNT1L ;读取低电平延续时间
lds xh,TCNT1H
lds yl,T_l
lds yh,T_h
lds temp,T_hh
sub yl,xl
sbc yh,xh
sbc temp,byte_3
lsr temp
ror yh
ror yl
save_Td:
sts Td_hh,temp ;获得非整半周期数 Td_hh/Td_hh/Td_l
sts Td_h,yh
sts Td_l,yl
cli
rcall CONV1 ;频率值整数在r1r2r3 转化为十进制
rcall DISP_F_METER_HZ ;显示频率值整数
lds r0,Td_hh ;计算频率的小数部分
lds r1,Td_h
lds r2,Td_l
clr r3
lds r4,T_hh
lds r5,T_h
lds r6,T_l
rcall DIV_X_Y_FACTOR ;计算程序(x/y=0.***)
mov r2,r3
clr r3
rcall CONV3 ;转换为十进制
rcall DISP_F_METER_HZ_D ;显示频率的小数部分
rcall LCD_write_new ;数据送LCD显示
sei
ret
//********************************
有必要介绍精确延时程序,这是测频率是否准确的关键
//**********NmS精确长延时************
//N由temp传递
DELAY_NmS: ;N=temp=1~255
in _sreg,sreg
cli
ldi temp2,1<<PSRASY ;复位予分频
sts GTCCR,temp2
clr temp2
sts TCNT2,temp2 ;T2是1ms定时中断
ldi temp2,255
sub temp2,temp
inc temp2
mov clock1,temp2
cbr FLAG,1<<ms_call
sei
del_loop:
wdr
sbrs FLAG,ms_call
rjmp del_loop
out sreg,_sreg
ret
//****************************
T2定时中断里有:
clock: ;内部时钟
inc clock1
brne out_tovf2
ldi clock1,6
sbr FLAG,1<<ms_call ;250ms标记
*
*
* |
|