当前位置: 代码迷 >> 单片机 >> 关于 MSP430 定时器 A/B的应用的有关问题
  详细解决方案

关于 MSP430 定时器 A/B的应用的有关问题

热度:482   发布时间:2016-04-28 16:14:03.0
关于 MSP430 定时器 A/B的应用的问题
问题1、我使用定时器A产生独立的时间间隔,我模仿例子建立程序,在没有其他程序的时候,可以正常产生独立的时间间隔,但是当程序增多的时候,发现有时候无法进入定时器,或者过了很久才能进入定时器。我猜想可能是其他的中断干扰了定时器,我的判断正确吗。

问题2:我虽然使用MSP430 定时器产生了几个独立的时间周期,但是我对这个定时器的工作原理还有理解不透的地方。

代码如下:
// Timer1 A0 interrupt service routine
#pragma vector=TIMER0_A0_VECTOR
__interrupt void Timer_A0 (void)
{
  TA0CCR0 += 64; // Add Offset to CCR0
}

// Timer_A3 Interrupt Vector (TAIV) handler
#pragma vector=TIMER0_A1_VECTOR
__interrupt void TIMER0_A1_ISR(void)
{
  switch(__even_in_range(TA0IV,14))
  {
  case 0:  
  break;
  case 2:
  TA0CCR1 += 8192; // Add Offset to CCR2
  SendGPSData();  
  break; // CCR4 not used
  case 4: 
  UCA0IE |= UCRXIE;
  TA0CCR2+= 256; // Add Offset to CCR2
  UART1_SendStr_char(ask); //TA0R1计数到CCR1触发
  P9OUT |= BIT0;
  break;
  case 6:  
  UCA0IE |= UCRXIE;  
  TA0CCR3 += 512; // Add Offset to CCR1
  WindV=TA1R*0.88; //记录1s内的风速计数值(每秒的风速),每个脉冲对应0.88米  
  TA1R = 0; //风速计计数清零
   
  break;
  case 8:
  break; // CCR3 not used
  case 10: 
  break; // CCR5 not used
  case 12: 
  break; // Reserved not used
  case 14: // overflow
  break;
  default: 
  break;
  }
}

上面的代码,下面的这一部分的作用是什么?里面没有任何处理程序。也就是定时器A为什么一定需要CCR0,然而CCR0却不做任何工作,为什么CCR0和CCR1-CCR5分开来?定时器A CCR0和其他的CCRx的关系是是什么,工作机制是怎样子,说的越详细越好。
// Timer1 A0 interrupt service routine
#pragma vector=TIMER0_A0_VECTOR
__interrupt void Timer_A0 (void)
{
  TA0CCR0 += 64; // Add Offset to CCR0
}

------解决方案--------------------
很久没有用 msp430, 它是不错的 mcu, 不会发生你说的情况,可能是你的 isr 有问题

可能是不同的中断时间处理不同的事物
------解决方案--------------------
对于问题1,我想你的判断是正确的。
对于问题2,我想你对TimerA定时器还缺乏了解。在你的TIMER0_A1_VECTOR中断向量的中断程序中,有TA0CCR1 += 8192;TA0CCR2+= 256;的语句,我看不到你在主程序中对TimerA的模式设置,但是我猜想写此程序的人写TA0CCR0 += 64;TA0CCR1 += 8192;TA0CCR2+= 256;是相呼应的,是想实现什么。这要看你如何设置TimerA的模式,和你的程序到底想干什么事情!