您好,作为初学者,我向你们的msp430单片机发出由衷的赞美。但我在编程使用时出现了问题,我用的是msp4301611的片子,但你们能帮我看下简单的timerA定时采样的程序吗?
我的那条 "TACTL&=~TAIE;//禁止TimerA中断"语句并没有起到禁止中断的作用啊(这条语句在void ADC12(void)函数里面),能帮我修改并给我正确的程序吗?谢谢。如果能够禁止中断,那是什么原因造成我在使用中遇见的问题呢?谢谢
程序如下:
#include "msp430x16x.h"
/*初始时钟设置方式1*/
/*void init_SMCLK(void)
{
BCSCTL1&=~XT2OFF;//XT2有效
DCOCTL = DCO0 + DCO1 + DCO2; // DCO设置为最大频率
BCSCTL1 = RSEL0 + RSEL1 + RSEL2; // XT2振荡器开启, 选择最高标称频率
BCSCTL2 |= SELS; //选择SMCLK时钟源为XT2CLK,18M
}
void int_timer(void)
{
TACTL|=TASSEL1+TACLR+ID0+ID1;//选择SMCLK作为定时器的时钟,8分频
CCTL0=CCIE;
TACCR0=999;//中断频率为1K
TACTL|=MC_1+TAIE;//增加模式,并使能中断
}
int main( void )
{
// Stop watchdog timer to prevent time out reset
WDTCTL = WDTPW + WDTHOLD;
P4DIR|=BIT0;
init_SMCLK();
int_timer();
_EINT();
while(1);
}
#pragma vector=TIMERA1_VECTOR
__interrupt void Timer_A(void)
{
//restore[i]=DAC12();
// ADC12();
P4OUT^=BIT0;
// if(TAIV);
// CCR0 += 99;
}*/
//20000:37.56hz;999:376hz
/*#include <msp430x16x.h>
int restore[100];
int j;
void int_clk()
{
char i;
BCSCTL1&=~XT2OFF;// 打开XT2振荡器
BCSCTL2|=SELM_2+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_4+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;
}
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; // Stop WDT
int_clk();
P4DIR |= 0x01; // P1.0 output
CCTL0 = CCIE; // CCR0 interrupt enabled
CCR0 = 49;
TACTL = TASSEL_0 + 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();
}*/
#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();
}
kaixiang chen:
对不起,我的程序发错了,我想取消这个提问,以免麻烦各位