msp430 中断后返回不到主函数 搞了2天了..

C__Allen 2010-07-25 10:14:58
RT
msp430F149 IAR版本4.20
我用了ADC中断采样和看门狗定时器中断数码管输出
在主程序while(1)循环语句前打开全局中断使能_EINT()
然后主程序循环就一直没进去过
但是确实有实时的采样和数码管输出

我同学用51的也遇到过类似情况,在加函数声明时关键字reentrant就好了
可是我主程序里面不调用其他函数也进不去啊

大虾们点拨一下吧,还需要些什么信息尽管问
...全文
1900 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhangweichina111 2012-07-17
  • 打赏
  • 举报
回复
#pragma vector=TIMERA0_VECTOR
__interrupt void timea0(void)
{
i++;
cnt++;
TACCR0 +=0X1000;
}
我的中断可是短啊,,也是出现这个问题

Tue Jul 17 12:12:46 2012: Target execution stopped
lucky_xiao 2011-02-01
  • 打赏
  • 举报
回复
当中断采样的时钟过快时,会造成程序停止不前,我也遇到过。你把采样时间调大一些。譬如,用SHT0_15;如果还不行那就不知道了!!我也是初学!!
schlafenhamster 2010-07-26
  • 打赏
  • 举报
回复
msp430F149我不熟,请仔细看手册
C__Allen 2010-07-25
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 schlafenhamster 的回复:]
中断执行的总时间应该<主循环的60%,也就是不能一个中断接着一个中断,否则主循环怎么有时间执行,所以中断要尽可能短,主要工作放后台(主循环中)。
[/Quote]


我重新改了下中断 整个程序就这一个中断
#pragma vector=ADC_VECTOR
__interrupt void ADC12ISR (void)
{

static unsigned int index = 0;


A3results[index] = ADC12MEM3; // Move results
A4results[index] = ADC12MEM4;
index++;
if(index==Num_of_Results){index=0;}

}

然后其他函数使用A3results A4results这两个全局变量
中断还是跳不出来

再问一下有多个中断的情况怎样用软件的方式给标志位清零 ADC12IFG=0 吗? ADC12IFG&=~BIT3吗?
schlafenhamster 2010-07-25
  • 打赏
  • 举报
回复
中断执行的总时间应该<主循环的60%,也就是不能一个中断接着一个中断,否则主循环怎么有时间执行,所以中断要尽可能短,主要工作放后台(主循环中)。
C__Allen 2010-07-25
  • 打赏
  • 举报
回复
我怀疑是AD中断有问题 中断里面调用的其他的函数
C__Allen 2010-07-25
  • 打赏
  • 举报
回复
ADC采样速度为ADC内部时钟的1/32 看门狗定时器中断为1.9MS (32KHZ下)
C__Allen 2010-07-25
  • 打赏
  • 举报
回复
补充:编译器会提示target execution stopped
看门狗定时器:
void WDTInit()
{

WDTCTL = WDT_ADLY_1_9; // 设置内部看门狗工作在定时器模式,1.9ms中断一次
IE1 |= WDTIE+UTXIE0;

}

#pragma vector=WDT_VECTOR
__interrupt void watchdog_timer(void)
{

P4OUT = 0xff;
P5OUT = scandata[DispBuf[cnt]]; //输出段选信号

P4OUT &= ~(1 << cnt); //输出位选信号
cnt++; //位计数变量在0~7之间循环
if(cnt == 8) cnt = 0;

}
AD采样:
void ADCInit()
{
P6SEL |= BIT3+BIT4; // 使能ADC通道A3和A4 6.3红外 6.4灰度传感器
ADC12CTL0 = ADC12ON+SHT0_8+MSC; // 打开ADC,设置采样时间
ADC12CTL1 = CSTARTADD_3+SHP+CONSEQ_3; //SHP: 使用采样定时器,CONSEQ_3:单通道多次转换 ,序列转换首地址CSTARTADD选MEM3
ADC12MCTL3 |= INCH_3; //选择模拟通道A1 (SREF_6,选择外部参考电压,SREF_2,选择外部参考电压和AVSS)
ADC12MCTL4 |= INCH_4+EOS; //A4,EOS最后通道
ADC12IE = BIT3+BIT4; // 使能ADC中断
ADC12CTL0 |= ENC; // 使能转换
ADC12CTL0 |= ADC12SC; // 开始转换

}

#pragma vector=ADC_VECTOR
__interrupt void ADC12ISR (void)
{

static unsigned int index = 0;

A3results[index] = ADC12MEM3; // Move results
A4results[index] = ADC12MEM4;
index++;
if(index == Num_of_Results)
{
unsigned char i;
unsigned long sum_A3 = 0;
unsigned long sum_A4 = 0;

index = 0;
for(i = 0; i < Num_of_Results; i++)
{
sum_A3 += A3results[i];
sum_A4 += A4results[i];
}
sum_A3 >>= 5; //除以32
sum_A4 >>= 5;

Trans_val(sum_A3,kind1); //两个不同的采样通道
Trans_val(sum_A4,kind2);

}

bluesea87 2010-07-25
  • 打赏
  • 举报
回复
定时器多少时间中断一次,还有想看下你的定时器数码管输出那段程序,
C__Allen 2010-07-25
  • 打赏
  • 举报
回复
谢了 应该是中断里面程序太多了 开始是IAR出错了

还是想问一下怎样用软件给标志位清零
schlafenhamster 2010-07-25
  • 打赏
  • 举报
回复
中断是电平还是沿方式,中断标记有没有复位?

27,515

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧