您好,作为初学者,我向你们的msp430单片机发出由衷的赞美。但我在编程使用时出现了问题,我用的是msp4301611的片子,但你们能帮我看下简单的timerA定时采样的程序吗?
我的那条 "TACTL&=~TAIE;//禁止TimerA中断"语句并没有起到禁止中断的作用啊(这条语句在void ADC12(void)函数里面),能帮我修改并给我正确的程序吗?谢谢。如果能够禁止中断,那是什么原因造成我在使用中遇见的问题呢?谢谢
程序如下:
#include <msp430x16x.h>
int restore[100];
int j;
void int_clk()
{
char i;
BCSCTL1&=~XT2OFF;// 打开XT2振荡器
BCSCTL2|=SELM1+SELS;//MCLK 8M 和SMCLK 1M
do
{
IFG1 &=~OFIFG; //清楚震荡错误标志
for(i=0;i<100;i++)
_NOP();
}
while((IFG1&OFIFG)!=0);
IFG1&=~OFIFG;
}
/*定义ADC初始状态*/
void init_ADC12(void)
{ int k;
P6SEL|=0X01; //打开P6的第二功能
ADC12CTL0=SHT0_1+REFON+REF2_5V+ADC12ON;//采样保持选择K,使能在一次采样和转换时间为1/Ks,打开参考电压发生器,打开内部参考电压选择位中的2.5V,打开ADC12的内核
//ADC12CTL1|=ADC12SSEL1+ADC12SSEL1;
ADC12CTL1 = SHP; // 采样信号源自采样定时器有采样输入信号的上升沿触发采样定时器
ADC12MCTL0 =INCH_0+SREF_1; // 参考电压选择为Vr+=Vref+ Vr-=AVss
for ( k=0; k<0x3600; k++) // 为参考源的启动延时
{
}
ADC12CTL0 |= ENC; // 使能ADC12转换
}
//采样
void ADC12(void)
{
ADC12CTL0|=ADC12SC; //开始转换,在ENC=1,ISSH=0;SHP=1的情况下A/D转换完后自动复位
while((ADC12IFG&BIT0)==0);
restore[j++]= ADC12MEM0;
if(j>99)
{
j=0;
TACTL&=~TAIE;//禁止TimerA中断
}
}
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; // Stop WDT
int_clk();
P4DIR |= 0x01; // P1.0 output
CCTL0 = CCIE; // CCR0 interrupt enabled
CCR0 = 99;
TACTL = TASSEL_2 + MC_1; // SMCLK, upmode
init_ADC12();
_EINT();
while(1);
}
// Timer A0 interrupt service routine
#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_A (void)
{
P4OUT ^= 0x01; // Toggle P1.0
ADC12();
}
user113574:
把CCIE也清掉试试看。
因为定时器A和捕获/比较的中断入口是一个地方,TAIE只是关闭了定时器功能的中断。
Richard Ma:
(1)
如果是用Capture/Compare模式,禁用中断应该用TACCTL0 &= ~CCIE;
普通模式才是用TACTL &= ~TAIE; 来禁用中断
=======================
(2)
CCTL0 = CCIE; 应该是 -> TACCTL0 |= CCIE;
这是使能timerA的Capture/Compare中断
=======================
(3)
如果不是使用Capture/Compare需要用
TACTL = TASSEL_2 + MC_1 + TAIE;
来使能timerA中断