6231|19

66

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

定时100ms [复制链接]

麻烦斑竹给个用32768的TIMER_A准确延时100ms的例子。
我怎么试也不出来,今天调什么都不顺。郁闷。

谢谢!

最新回复

不动了,说明没有进中断 GIE开了么 时钟也不对 建议判断标志而不是使用中断,反正你的程序也在等  详情 回复 发表于 2006-3-13 09:49
 
点赞 关注

回复
举报

69

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
用TA的比较功能。
1、选32768Hz的ACLK做TA的时钟
2、将TA-CCR0设为65536/20-1(或设置TA时钟分频系数为2,将TA-CCR0设为65535/40-1,如此类推)
3、设置TA为增计数运行方式
4、这样TA的TAIFG中断周期近似为100ms(10Hz)
5、只要32768Hz的ACLK本身比较准确,再适当调整TA-CCR0的值,用以补偿中断服务程序的进入时间(5个MCLK周期)及相应程序语句的处理时间(比如:mov.w #0,R5 ;1 MCLK),这样就可以在该中断服务程序中获得精确的100ms延时
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
void delay_100_ms(void)
{

unsigned int InterruptTimes = 0;
TACTL = TASSEL0 + TACLR;
CCTL0 = CCIE;
CCR0 = 819;
TACTL = MC0;
while(InterruptTimes != 4);
CCTL0 &= ~CCIE;
}
#pragma vector = TIMERA0_VECTOR
__interrupt void Timer_A(void)
{
++InterruptTimes;
}

我程序是这么写的,麻烦大侠们给指点一下。(已开总中断)
还有点不清楚,定时器的开关是怎么控制的啊?是不是是一直在工作,你可以通过中断允许来选择是否用它啊。
谢谢!
 
 
 

回复

85

帖子

0

TA的资源

一粒金砂(初级)

4
 
CCR0 = 819;   ms不对
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

5
 
麻烦给点具体的指点。
我调试是发现到while(InterruptTimes != 4);就死在这了。

在线等,着急~~
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

6
 
void delay_100_ms(void)
{
TACTL = TASSEL0 + TACLR;
CCTL0 = CCIE;
CCR0 = 1638;
TACTL = MC0;
_BIS_SR(LPM3_bits);

}

#pragma vector = TIMERA0_VECTOR
__interrupt void Timer_A(void)
{
if(TAFIG)
{_BIC_SR_IRQ(LPM3_bits);}
}


不知道对不对,不过原理可以借鉴一下。
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

7
 
我改成如下还是实现不了,郁闷
void delay_100_ms(void)
{
TACTL = TASSEL0 + TACLR;
CCTL0 = CCIE;
CCR0 = 1638;
TACTL = MC0;
CCTL0 &= ~CCIE;
}
#pragma vector = TIMERA0_VECTOR
__interrupt void Timer_A(void)
{
_NOP();
}
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

8
 
哪位好心人再帮帮小弟啊,真的很着急啊~~~哭了!
 
 
 

回复

87

帖子

0

TA的资源

一粒金砂(初级)

9
 
在147上实现的例子:

#include "msp430x14x.h"
ORG 08000h ; Program Start
;=====================================================
Reset mov.w #00600h,SP ; Initialize '147 stackpointer
mov.w #WDTPW+WDTHOLD,&WDTCTL ; Stop WDT
call #Init
eint ; Ena××e interrupts
Mainloop bis.w #CPUOFF,SR ; CPU off
nop
;------------------------------------------------------------------------------
Init mov.w #TASSEL0+TACLR,&TACTL ; SMCLK, clear TAR
mov.w #CCIE,&CCTL0 ; CCR0 interrupt ena××ed
mov.w #16383,&CCR0
bis.w #MC0,&TACTL ; Start Timer_a in up mode
ret
;------------------------------------------------------------------------------
TA0_ISR nop
reti
;-----------------------------------------------------------------------------
;Interrupt Vectors Used MSP430F14x
;-----------------------------------------------------------------------------
ORG 0FFFEh ; MSP430 RESET Vector
DW Reset

ORG 0FFECh ; Timer_A0 Vector
DW TA0_ISR

END
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

10
 
谢谢 mmtcyq,不过汇编写的我看不太懂。不好意思!
void delay_100_ms(void)
{
TACTL = TASSEL0 + TACLR;
CCTL0 = CCIE;
CCR0 = 1638;
TACTL = MC0;
CCTL0 &= ~CCIE;
}
#pragma vector = TIMERA0_VECTOR
__interrupt void Timer_A(void)
{
_NOP();
}
可不可以直接帮我看一下这么写程序有什么错误。
谢谢大家!
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

11
 
我也不是很懂,只是你用CCTL0& =~CCIE,把中断使能关了,是不是就不产生中断了?应该是清除标志位CCIFG吧!把这句去掉试试.
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

12
 
呵呵,谢谢!不过还是不好用啊~~
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

13
 
如楼上所说,“CCTL0 &= ~CCIE”有错。
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

14
 
程序的其它部分呢?
注意:如果有进入LPM3模式,此时MCLK及SMCLK都被禁止,只有ACLK是“活动的”,要是TA时钟选为非ACLK那是不行的!
 
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

15
 
TACTL = TASSEL0 + TACLR;
。。。
TACTL = MC0;

现在TACTL = ??? 呵呵。
 
 
 

回复

58

帖子

0

TA的资源

一粒金砂(初级)

16
 
呵呵,惭愧惭愧!完了,没法活了~
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

17
 
去掉CCTL0 &= ~CCIE;
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

18
 
程序调通了,还是采取我开始的那种在中断中累加变量的方法。如下:
void delay_100_ms(void)
{
InterruptTimes = 0;
TACTL = TASSEL0 + TACLR+MC0;
CCTL0 = CCIE;
CCR0 = 3276;
while(InterruptTimes != 1);
}
#pragma vector = TIMERA0_VECTOR
__interrupt void Timer_A(void)
{
++InterruptTimes;
}
但我把程序改成下面的形式就不好用了。
void delay_100_ms(void)
{
TACTL = TASSEL0 + TACLR+MC0;
CCTL0 = CCIE;
CCR0 = 3276;
}
#pragma vector = TIMERA0_VECTOR
__interrupt void Timer_A(void)
{
_NOP();
}
主要是我不明白设为增计时以后,从什么时候开始从0累加,然后到什么时候产生中断。(就是不明白程序执行到哪一步了开始进入中断程序)。
大家再帮帮忙!
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

19
 
我个人认为,当执行TACTL |=MC0的时候,数据就开始累加了,当累加到等于CCR的时候产生开始中断,所以我觉得你的程序TACTL = TASSEL0 + TACLR+MC0应该分开写,先初始化,TACTL = TASSEL0 + TACLR,再设定CCR0的值,需要开始计数就用TACTL |=MC0.
 
 
 

回复

58

帖子

0

TA的资源

一粒金砂(初级)

20
 

是个问题

不动了,说明没有进中断
GIE开了么
时钟也不对
建议判断标志而不是使用中断,反正你的程序也在等
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
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
快速回复 返回顶部 返回列表