msp430 f149中断问题
最近写了一个程序,用了两个中断:#pragmavector=TIMERA0_VECTOR__interruptvoidTimerA(void)和#pragmavector...
最近写了一个程序,用了两个中断:
#pragma vector=TIMERA0_VECTOR
__interrupt void TimerA(void)
和
#pragma vector=TIMERA0_VECTOR
__interrupt void TimerA(void)
定时器A进入中断修改产生的PWM德占空比,频率大约30K,
ADC进行电压采样,这是代码
#pragma vector=ADC_VECTOR
__interrupt void ADC12ISR (void)
{
_EINT();
_BIS_SR(LPM0_bits + GIE);
if(index0< Num_of_Results)
results0[index0++] = ADC12MEM0; // Move results
if(index0< Num_of_Results)
results1[index1++] = ADC12MEM1; // Move results
}
我在主程序里执行操作,当index0==Num_of_Results(32)时,把采样数据显示出来。
现在如果屏蔽掉其中任一个中断,则另一个中断能正常工作。但是,两个都打开的话,两个就都不行了。主程序里不再显示,定时器A也不会改占空比了。
ADC的初始化如下
void ADC12Init( void )
{
ADC12CTL0 = ADC12ON+SHT0_8+MSC; // 打开ADC,设置采样时间
ADC12CTL1 = SHP+CONSEQ_3; // 选择存储器地址,使用采样定时器
ADC12MCTL0 = INCH_0; // ref+=AVcc, channel = A0
ADC12MCTL1 = INCH_1 +EOS; // 表示序列的最后一个端口 // ref+=AVcc, channel = A1
P6SEL |= BIT0; //使能ADC通道
P6SEL |= BIT1; //使能ADC通道
P6DIR |= BIT0;
P6DIR |= BIT1;
P6OUT |= BIT0;
P6OUT |= BIT1;
ADC12IE = 0x03; // 使能ADC中断,p6.1,.2端口转换完成后进入中断
ADC12CTL0 |= ENC; // 使能转换
}
希望我描述的够清楚了,更希望又高人帮忙解决。鞠躬!!!
补充一下:即使在主程序里不作任何判断,就是让它显示各数也不行了!!! 展开
#pragma vector=TIMERA0_VECTOR
__interrupt void TimerA(void)
和
#pragma vector=TIMERA0_VECTOR
__interrupt void TimerA(void)
定时器A进入中断修改产生的PWM德占空比,频率大约30K,
ADC进行电压采样,这是代码
#pragma vector=ADC_VECTOR
__interrupt void ADC12ISR (void)
{
_EINT();
_BIS_SR(LPM0_bits + GIE);
if(index0< Num_of_Results)
results0[index0++] = ADC12MEM0; // Move results
if(index0< Num_of_Results)
results1[index1++] = ADC12MEM1; // Move results
}
我在主程序里执行操作,当index0==Num_of_Results(32)时,把采样数据显示出来。
现在如果屏蔽掉其中任一个中断,则另一个中断能正常工作。但是,两个都打开的话,两个就都不行了。主程序里不再显示,定时器A也不会改占空比了。
ADC的初始化如下
void ADC12Init( void )
{
ADC12CTL0 = ADC12ON+SHT0_8+MSC; // 打开ADC,设置采样时间
ADC12CTL1 = SHP+CONSEQ_3; // 选择存储器地址,使用采样定时器
ADC12MCTL0 = INCH_0; // ref+=AVcc, channel = A0
ADC12MCTL1 = INCH_1 +EOS; // 表示序列的最后一个端口 // ref+=AVcc, channel = A1
P6SEL |= BIT0; //使能ADC通道
P6SEL |= BIT1; //使能ADC通道
P6DIR |= BIT0;
P6DIR |= BIT1;
P6OUT |= BIT0;
P6OUT |= BIT1;
ADC12IE = 0x03; // 使能ADC中断,p6.1,.2端口转换完成后进入中断
ADC12CTL0 |= ENC; // 使能转换
}
希望我描述的够清楚了,更希望又高人帮忙解决。鞠躬!!!
补充一下:即使在主程序里不作任何判断,就是让它显示各数也不行了!!! 展开
1个回答
展开全部
#pragma vector=ADC_VECTOR
__interrupt void ADC12ISR (void)
{
_EINT();
_BIS_SR(LPM0_bits + GIE);
上面这两句最好在main里面 估计程序停这里不走了
SHT0_8小了会不精确SHT0_12也可以
ad没必要中断吧?中断多了就卡了;
__interrupt void ADC12ISR (void)
{
_EINT();
_BIS_SR(LPM0_bits + GIE);
上面这两句最好在main里面 估计程序停这里不走了
SHT0_8小了会不精确SHT0_12也可以
ad没必要中断吧?中断多了就卡了;
更多追问追答
追问
不用ADC中断,显示部分怎么搞?中断主要是弄一个32次取样求平均值的功能。
如果我开了ADC中断,它什么时候会自己退出来?
追答
for循环采集32次即可
ADC12CTL0 |=ENC;
ADC12CTL0 |= ADC12SC;
for(Cnt_ADC12=0;Cnt_ADC12<MAX_SAMPLE_TIMES;Cnt_ADC12++)
{ // Start conversion
while ((ADC12IFG &BIT0)==0);
results = ADC12MEM0 ; //存结果,清除IFG
Sum_results += results;
}
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询