MSP430讨论区
返回
登录/注册
对定时器连续计数模式的不理解,请老师们指教!
楼主
zhuyi2576 于 2010-12-05 21:36:54
对定时器连续计数模式的不理解,请老师们指教!
刚入手430,对定时器诸多不解
增计数模式好理解 计数到TCCR0,CCIFG置位,之后+1 回到0 TAIFG置位,进入
#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_A0 (void)
但是在边续模式下,不理解,,,计数从0----FFFF,然后+1 回到0 TAIFG置位,,,也这就是这只要时钟固定了,这个定时时间是不变的,也就是每次进入中断的时间是不变的,
看示例程序为什么还要设置TCCR0,又有什么意义呢..0 计数到 TCCRO,只是产生一个比较中断,又不能进入定时中断,,,,不明白这个TCCR0是什么意思在这
//***********************************************************************
设MCLK=SMCLK=TACLK=DCO=800K,将P1.0每隔50000个DCO周期取反,产生16HZ方波
#include <msp430x20x3.h>
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; // Stop WDT
P1DIR |= 0x01; // P1.0 output
CCTL0 = CCIE; // CCR0 interrupt enabled
CCR0 = 50000;
TACTL = TASSEL_2 + MC_2; // 连续计数模式
_BIS_SR(LPM0_bits + GIE); // Enter LPM0 w/ interrupt
}
#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_A (void)
{
P1OUT ^= 0x01; // Toggle P1.0
CCR0 += 50000; // Add Offset to CCR0 ////////////
}
问题1:怎么产生16HZ方波呢,,,,,这是定时器中断呀,并不是比较中断呀,只有计数到了65536才进入中断,才取反的呀??
问题2:CCR0 += 50000; 溢出了??? 是否是进入中断后CCR0=0了,。然后再付值
问题3:计数器是否是从 当前值50000,然后继续计数--FFFF,回到0,,那它怎么产生的相同的时间间隔呢。明明多了个65536-50000的时间呀!!
最近被它搞的很郁闷,难道它是从0---50000,进入中断,然后因为 CCR0 += 50000,再计数50000个,那这样的话就和增计数模式一样了吗?,,那计到FFFF清0,有什么意思呢???越搞越糊涂
回复
1楼
DC 于 2010-12-06 20:12:59
哎,来个直观比意吧~
比如计数器最大为10,比如初值为6,上面的程序中断处+6;也就是在中断间隔为6。那么将会在
6,2,8,4,10,6,2,8,....就会这些数值中断;每次中断中+6;这个6是偏移量。
回复
2楼
zhuyi2576 于 2010-12-07 11:53:47
DC老师呀,,,,你的这个意思我理解,我上面也说了,难不成它还有记忆功能,
但它进入中断的条件是由0到FFFF,要计数满了才进中断的呀,,,按你比方,,,,初值6 加到10 进入中断,然后再+6的呀..第一个即使加到6,它也进不了中断呀.
那我要是实现 偏移量为4的的呢,不是不行吗,,4 8 都小于10,都进不了中断的呀
头大!!
回复
3楼
nuk 于 2011-02-26 22:17:22
那个终端向量可能不是溢出中断的向量,是比较中断,你查下手册,溢出中断应该和CCR1,CCR2共一个终端向量,但终端标志不一样。比较中断就跟DC说的原理一样,比较参数是连续加的。
回复
4楼
WQY900618 于 2011-03-17 18:52:39
头文件中注释 TIMERA0只能产生CCR0的中断
#define TIMERA1_VECTOR (5 * 2u) /* 0xFFEA Timer A CC1-2, TA */
#define TIMERA0_VECTOR (6 * 2u) /* 0xFFEC Timer A CC0 */
连续模式不占用捕获比较寄存器 CCR0 但是可以通过CCR0进入中段 此时不使用 TAIFG 若使用TAIFG 需在中段函数中 使用中断向量表判断 并且 必须是TIMERA1_VECTOR中断
回复
1
电脑版
Page created in 0.1562 seconds width 3 queries.