[求助]在AD中断里开了总中断后,堆栈溢出!!!

冬小麦   2009-8-25 21:26 楼主
程序里中断共两个,ADC12和UART1。只开其中之一都工作正常。
两个都开:ADC正常,但UART1的中断响应很慢,偶尔能及时响应。
我猜测是AD中断太频繁,所以在ADC里加了EINT(),希望能嵌套中断,但加了ENIT()后总是堆栈溢出(堆栈大小已改为512)。
这是为什么呢?或者有无其他解决问题的办法?

#include <msp430x24x.h>
#include "uscia1_uart.c"

#ifndef TYPE_DEFINE
#define TYPE_DEFINE
typedef unsigned char uchar;
typedef unsigned int uint;
typedef unsigned long ulong;
#endif

#define NUM_OF_SAMPLE 128 //ADC取平均的采样次数

//------------------------------ 定义全局变量 --------------------------------//

volatile unsigned int g_A0Results[NUM_OF_SAMPLE];
uint g_A0××erage;



/*******************************************************************************
* 函数名称:Timer_A0( 定时器A中断 )
* 介 绍:实际上ADC开启后一直连续采样,但将中断使能关闭,保证主程序的运行。
* 在需要时,在主程序中开启ADC中断使能,采样次数为NUM_OF_SAMPLE,然后关
* 中断并算出平均值。
*******************************************************************************/
#pragma vector = ADC12_VECTOR
__interrupt void ADC12ISR ( void )
{

static unsigned char index = 0;
static unsigned long A0Sum = 0;
// _EINT(); //~~~~~此句开了后就会溢出~~~~~~
g_A0Results[ index ] = ADC12MEM0; // Move A0 results, IFG is cleared
A0Sum += g_A0Results[ index++ ]; // 数组g_A0Results之于程序没有意义,
// 仅为了调试时方便查看多次采样值。

if ( index == NUM_OF_SAMPLE )
{
ADC12IE = 0; // 关ADC中断
index = 0;
g_A0××erage = A0Sum / NUM_OF_SAMPLE;
A0Sum = 0;
}
}


#pragma vector = USCIAB1RX_VECTOR
__interrupt void USCI1RX_ISR(void)
{

switch ( UCA1RXBUF )
{
case 'f':
{
TACCR1 = 2600;
TACCR2 = 3400;
break;
}
case 'b':
{
TACCR1 = 3400;
TACCR2 = 2600;
break;
}
case 'r':
{
TACCR1 = 3000;
TACCR2 = 3400;
break;
}
case 'l':
{
TACCR1 = 2600;
TACCR2 = 3000;
break;
}
case 's':
{
TACCR1 = 3000;
TACCR2 = 3000;
break;
}
}
}

//---------------------------------- 主函数 ----------------------------------//
void main( void )
{
WDTCTL = WDTPW + WDTHOLD; //关闭看门狗

BCSCTL2=SELM_2 + SELS;


//初始化端口
P2DIR |= BIT3 + BIT4;
P2SEL |= BIT3 + BIT4; // P2.3 P2.4 作为副功能TA1、TA2输出

P6SEL |= 0x01; // P6.0 作为ADC12通道 A0
//初始化定时器
TACCR0 = 40000; // 定时周期 20ms
TACCR1 = 3000;
TACCR2 = 3000;
TACCTL1 = OUTMOD_7; // PWM output mode: 7 - PWM reset/set
TACCTL2 = OUTMOD_7;
TACTL = TASSEL_2 + MC_1 + ID_3; // SMCLK时钟源,8分频,加计数模式,禁止溢出中断

//初始化ADC12
ADC12CTL0 = ADC12ON + SHT0_15 + MSC; // 开AD,采样保持时间256*ADC12CLK,连续采样
ADC12CTL1 = SHP + CONSEQ_2; // 使用采样定时器,单通道连续采样
ADC12IE = 0x01; // ADC12IFG.0 开中断
ADC12CTL0 |= ENC; // 转换使能
ADC12CTL0 |= ADC12SC; // 转换开启

UartInit();
_BIS_SR( GIE ); // 开启中断

while( 1 )
{

ADC12IE = BIT0; // 开ADC中断
while ( ADC12IE & BIT0 ); // ADC采样结束
PutInt ( g_A0××erage );
PutString ( "\n" );

} //while(1) End

} //main End

回复评论 (6)

自己顶,继续等
点赞  2009-8-26 13:46
嵌套太多了?
点赞  2009-8-26 14:11
你中断嵌套了 哪就要好好考虑他们的时间了  要是一直嵌套 堆栈溢出 PC自然飞了
点赞  2009-8-26 15:09
串口通讯是电脑控制的,我在PC上开个串口调试精灵,即使什么都不发,430也会溢出!!!
点赞  2009-8-27 13:39
我也遇到相同的问题,哪位高手指点一下。而且堆栈一旦溢出,单片机就重新复位了。谢谢!
点赞  2009-9-30 13:15

中断嵌套的问题

我也遇到相同的问题,哪位高手指点一下。而且堆栈一旦溢出,单片机就重新复位了。谢谢!
点赞  2009-9-30 13:16
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复