8798|11

75

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

32768晶振,利用BASIC TIMER,做精确时钟,下面的程序有什么问题? [复制链接]

我是用ACLK/256
然后中断频率选择位IP2,IP1置位,这样中断频率就是
ACLK/256=128
128/128=1
也就是1秒中断一次了?

为什么我测量时间,有15分钟4秒的误差这么大?
请高手指点?如何做高精度的时钟!

最新回复

引用: 看到上面的问题,我专门做了一次实验,发现晶振为32.773KHZ,当初就是每24小时快15秒,这次加电容调到32.769KHZ,运行24小时后,发现快了2秒,因此晶振必须调整.我使用BT定时器. 程序: RESET mov.w #300h,SP ; Initialize stackpointer StopWDT mov.w #WDTPW+WDTHOLD,&WDTCTL ; Stop WDT MOV.B #SCFQ_4M,&SCFQCTL SetupFLL bis.b #XCAP18PF,&FLL_CTL0 ; Configure load caps bis.b #FLL_DIV_1,&FLL_CTL1 mov.b #20h,&P1SEL ;FACLK OUTPUT MOV.B #0FFH,&P1OUT MOV.B #0FFH,&P1DIR call #lcd_on call #wait_1s BIS.B #BTIE,&IE2 EINT mlp: bis.w #LPM3,SR ; CPU off call #time_lcd jmp mlp lcd_on: ; MOV.B #SCFQ_4M,&SCFQCTL SetupLCD mov.b #LCDON+LCD4MUX+LCDP0+LCDLOWR,&LCDCTL ; STK LCD 4Mux, S0-S15 SetupBT mov.B #BTFRFQ1+BTSSEL+BTDIV+BTIP1+BTIP2,&BTCTL ; STK LCD freq. SetupIO mov.b #0FFh,&P5SEL ; Common and Rxx all selected ret BT_ISR: BIC #CPUOFF,0(SP) RETI 电容的调整是利用这个吗? bis.b #XCAP18PF,&FLL_CTL0 还是其他的方法调整电容?  详情 回复 发表于 2004-12-3 17:01
 
点赞 关注

回复
举报

75

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
引用:

我是用ACLK/256
然后中断频率选择位IP2,IP1置位,这样中断频率就是
ACLK/256=128
128/128=1
也就是1秒中断一次了?

为什么我测量时间,有15分钟4秒的误差这么大?
请高手指点?如何做高精度的时钟!

应该没错.不妨把程序贴出来.
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
mov.b #BTFRFQ1+BTDIV+BT_fCLK2_DIV128,&BTCTL
CLR R5
CLR R6
CLR R7
CLR R8
MOV.B #0EBH,LCDM12
MOV.B #0EBH,LCDM11
MOV.B #0EBH,LCDM10
MOV.B #0EBH,LCDM9
MOV.B #0EBH,LCDM8
MOV.B #0EBH,LCDM7
BIS.B #010H,LCDM10


bis.w #BTIE,&IE2
eint ; Ena××e interrupts

bis.w #CPUOFF,SR ; CPU off

BT_ISR
INC R5
CMP #60,R5
JZ KK
MOV R5,R15
CALL #bbs
MOV.B &213H,R4
MOV.B LCD_Tab(R4),LCDM12
MOV.B &212H,R4
MOV.B LCD_Tab(R4),LCDM11
JMP HH

KK CLR R5
INC R6
CMP #60,R6
JZ KK1
MOV R5,R15
CALL #bbs
MOV.B &213H,R4
MOV.B LCD_Tab(R4),LCDM12
MOV.B &212H,R4
MOV.B LCD_Tab(R4),LCDM11
MOV R6,R15
CALL #bbs

MOV.B &213H,R4
MOV.B LCD_Tab(R4),LCDM10
BIS.B #010H,LCDM10
MOV.B &212H,R4
MOV.B LCD_Tab(R4),LCDM9

JMP HH
KK1 CLR R6
INC R7
CMP #24,R7
JZ KK2
MOV R6,R15
CALL #bbs
MOV.B &213H,R4
MOV.B LCD_Tab(R4),LCDM10
BIS.B #010H,LCDM10
MOV.B &212H,R4
MOV.B LCD_Tab(R4),LCDM9
MOV R7,R15
CALL #bbs
MOV.B &213H,R4
MOV.B LCD_Tab(R4),LCDM8
MOV.B &212H,R4
MOV.B LCD_Tab(R4),LCDM7

JMP HH
KK2 CLR R5
CLR R6
CLR R7
HH RETI





;************************************************************
DIVIDE
clr r14
mov #17,r10
DIV1 cmp r11,r13
jlo DIV2
sub r11,r13
DIV2 rlc r14
jc DIV4
dec r10
jz DIV4
rla r12
rlc r13
jnc DIV1
sub r11,r13
setc
jmp DIV2
DIV4 ret

;**************************************************************************************************
bbs

mov r15, r12
mov #0, r13
mov #10, r11
call #DIVIDE
mov.b r14,&212h
mov.b r13,&213h
ret
;*********************************************************************
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

4
 
 
 
 

回复

62

帖子

0

TA的资源

一粒金砂(初级)

5
 
引用:

mov.b #BTFRFQ1+BTDIV+BT_fCLK2_DIV128,&BTCTL
CLR R5
CLR R6
CLR R7
CLR R8
MOV.B #0EBH,LCDM12
MOV.B #0EBH,LCDM11
MOV.B #0EBH,LCDM10
MOV.B #0EBH,LCDM9
MOV.B #0EBH,LCDM8
MOV.B #0EBH,LCDM7
BIS.B #010H,LCDM10


bis.w #BTIE,&IE2
eint ; Ena××e interrupts

bis.w #CPUOFF,SR ; CPU off

BT_ISR
INC R5
CMP #60,R5
HH RETI
................................


;*********************************************************************
你的主程序就这么一句话???
bis.w #CPUOFF,SR ; CPU off

你应该让他无限循环阿。
main
bis.w #CPUOFF,SR
jmp main
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

6
 
引用:

你的主程序就这么一句话???
bis.w #CPUOFF,SR ; CPU off

你应该让他无限循环阿。
main
bis.w #CPUOFF,SR
jmp main

不是的,bis.w #CPUOFF,SR
以后,单片机的CPU关闭,进入低功耗了
中断处理完成以后,还会回到原来的状态中的(低功耗)。


所以不用写循环的。
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

7
 

检测以下32.768kHZ

编一段小程序,通过TACLK口把ACLK发送出来,用频率仪检测一下,调整震荡电容的值,对晶振频率微调。
 
 
 

回复

129

帖子

0

TA的资源

一粒金砂(初级)

8
 

bc007

引用:

我是用ACLK/256
然后中断频率选择位IP2,IP1置位,这样中断频率就是
ACLK/256=128
128/128=1
也就是1秒中断一次了?

为什么我测量时间,有15分钟4秒的误差这么大?
请高手指点?如何做高精度的时钟!

说举实话,我也这么做的,一天慢几十秒,俺也不知道咋会事。
 
 
 

回复

54

帖子

0

TA的资源

一粒金砂(初级)

9
 
我的问题解决了,看看对你是否有提醒。
我做的时钟一天慢几十秒,我曾经换过晶体,结果一样,就是说,好与差的晶体不会有这么大的误差。
后来仔细检查程序,发现一个问题:
我在初始设定完成以后,由于键盘调整的需要,暂时关闭了中断,调试时很随意在主循环里又加了一个中断使能,看起来运行没有问题,实际上可能在关闭中断时丢了一些时钟周期,所以整体运行就慢了,到底DINT后,CCR0数是继续走还是清零,我还不清楚,不过我看是停了。我重新调整一下程序,一天误差在1~2秒内,可以接受。

你的程序里没有用DINT,但可能在某个位置使能关闭(这是我猜测),丢失了一些晶体的周期,看起来就慢了。就是说,你要一直确保TIME-A能在中断使能状态。
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

10
 
引用:

我的问题解决了,看看对你是否有提醒。
我做的时钟一天慢几十秒,我曾经换过晶体,结果一样,就是说,好与差的晶体不会有这么大的误差。
后来仔细检查程序,发现一个问题:
我在初始设定完成以后,由于键盘调整的需要,暂时关闭了中断,调试时很随意在主循环里又加了一个中断使能,看起来运行没有问题,实际上可能在关闭中断时丢了一些时钟周期,所以整体运行就慢了,到底DINT后,CCR0数是继续走还是清零,我还不清楚,不过我看是停了。我重新调整一下程序,一天误差在1~2秒内,可以接受。

你的程序里没有用DINT,但可能在某个位置使能关闭(这是我猜测),丢失了一些晶体的周期,看起来就慢了。就是说,你要一直确保TIME-A能在中断使能状态。

非常感谢
我的程序里面并没有用的其他的东西,我只让它做时钟。过程大致就是这个样子的:
定时1S,中断处理,处理好以后,进入CPUOFF状态,再次中断以后,在处理,然后就是这样一个循环过程。

我没有换别的晶振,不知道是不是我的晶振有问题,我可以先看看晶阵有没有问题,用示波器看看是不是32768。
你给我看看你的程序,只要看看时钟程序就可以了。
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

11
 

晶振问题!

看到上面的问题,我专门做了一次实验,发现晶振为32.773KHZ,当初就是每24小时快15秒,这次加电容调到32.769KHZ,运行24小时后,发现快了2秒,因此晶振必须调整.我使用BT定时器.
程序:
RESET mov.w #300h,SP ; Initialize stackpointer
StopWDT mov.w #WDTPW+WDTHOLD,&WDTCTL ; Stop WDT

MOV.B #SCFQ_4M,&SCFQCTL
SetupFLL bis.b #XCAP18PF,&FLL_CTL0 ; Configure load caps
bis.b #FLL_DIV_1,&FLL_CTL1
mov.b #20h,&P1SEL ;FACLK OUTPUT
MOV.B #0FFH,&P1OUT
MOV.B #0FFH,&P1DIR
call #lcd_on
call #wait_1s
BIS.B #BTIE,&IE2
EINT
mlp: bis.w #LPM3,SR ; CPU off
call #time_lcd
jmp mlp
lcd_on: ; MOV.B #SCFQ_4M,&SCFQCTL

SetupLCD mov.b #LCDON+LCD4MUX+LCDP0+LCDLOWR,&LCDCTL ; STK LCD 4Mux, S0-S15
SetupBT mov.B #BTFRFQ1+BTSSEL+BTDIV+BTIP1+BTIP2,&BTCTL ; STK LCD freq.
SetupIO mov.b #0FFh,&P5SEL ; Common and Rxx all selected
ret

BT_ISR:
BIC #CPUOFF,0(SP)
RETI
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

12
 
引用:

看到上面的问题,我专门做了一次实验,发现晶振为32.773KHZ,当初就是每24小时快15秒,这次加电容调到32.769KHZ,运行24小时后,发现快了2秒,因此晶振必须调整.我使用BT定时器.
程序:
RESET mov.w #300h,SP ; Initialize stackpointer
StopWDT mov.w #WDTPW+WDTHOLD,&WDTCTL ; Stop WDT

MOV.B #SCFQ_4M,&SCFQCTL
SetupFLL bis.b #XCAP18PF,&FLL_CTL0 ; Configure load caps
bis.b #FLL_DIV_1,&FLL_CTL1
mov.b #20h,&P1SEL ;FACLK OUTPUT
MOV.B #0FFH,&P1OUT
MOV.B #0FFH,&P1DIR
call #lcd_on
call #wait_1s
BIS.B #BTIE,&IE2
EINT
mlp: bis.w #LPM3,SR ; CPU off
call #time_lcd
jmp mlp
lcd_on: ; MOV.B #SCFQ_4M,&SCFQCTL

SetupLCD mov.b #LCDON+LCD4MUX+LCDP0+LCDLOWR,&LCDCTL ; STK LCD 4Mux, S0-S15
SetupBT mov.B #BTFRFQ1+BTSSEL+BTDIV+BTIP1+BTIP2,&BTCTL ; STK LCD freq.
SetupIO mov.b #0FFh,&P5SEL ; Common and Rxx all selected
ret

BT_ISR:
BIC #CPUOFF,0(SP)
RETI

电容的调整是利用这个吗?
bis.b #XCAP18PF,&FLL_CTL0
还是其他的方法调整电容?
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表