This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

请教一个关于msp430f149自动停止的问题。

Other Parts Discussed in Thread: MSP430F149, ADS1115

我用的是模拟I2C连接msp430f149和ADS1115,然后采集电压显示在12864上,但是我这里出现一个奇怪的现象,就是程序再运行一段时间之后,单片机会自动停止,12864上面显示的电压值不再变化了,然后需要人工复位或者重新上电才能恢复运行。我开始怀疑是程序的问题,调试了好半天。然后我自己试着写了一个闪烁灯在while里面作为mcu运行的标志,发现LED会卡住,所以判断是单片机停止了,不知道该怎么解决,下面贴出主函数,希望能得到高人指点。

#include  <msp430x14x.h>

 #include "ADS1115.h"

#include "HB12864.h"

#include <stdio.h>

 #define uchar unsigned char

#define uint  unsigned int

void Delays(void);

void PutString(uchar *ptr);

uchar dianya[7];

 /********************主函数**********************/

 void main(void)

{      

 uchar i;    

float temp;    

int num;    

WDTCTL = WDTPW + WDTHOLD;                 // 关狗    

BCSCTL1 &= ~XT2OFF;                 //打开XT2高频晶体振荡器    

do    

{      

IFG1 &= ~OFIFG;                 //清除晶振失败标志      

for (i = 0xFF; i > 0; i--);     //等待8MHz晶体起振    

}    

 while ((IFG1 & OFIFG));             //晶振失效标志仍然存在?    

BCSCTL2 |= SELM_2 + SELS;           //MCLK和SMCLK选择高频晶振*/    

P2DIR=BIT2+BIT3;    

 P2OUT|=BIT2|BIT3;      

Pin_Init();   //LCD引脚初始化 

Lighton();    //打开LCD背光灯

clearscreen();     //LCD清屏

while(1)    

{            

 temp=ADS1115();   //取得1115采样值     

sprintf(dianya,"%g",temp);        

display(dianya,1,0);    //显示    

 Delays();Delays();        

 P2OUT^=(BIT2+BIT3);    

 }

 }

 /******************************************* 函数名称:Delays 功    能:延时一会 参    数:无 返回值  :无 ********************************************/

 void Delays(void)

 {    

 uchar i=20;    

uint j;    

while(i--)    

 {            

 j=2000;            

 while(j--);    

}

}

  • 如果这个问题出现频率很高,再现这个问题,不要忙着复位或断电, 用示波器的管脚点下接晶体的那两个管脚,测试下是否晶体有停振。

    有时候只要示波器的管脚一碰晶体的管脚就能恢复,那多半是晶体的负载电容不对造成的。

  • 你好!

    1.也可以先将MCLK,SMCLK切换到内部DCO,看这个问题还有没有,如果没有了,就是XT2的问题,按照TRITON的建议可以解决。

    2.如果还是有,看一下编译后的RAM的使用情况,有可能是堆栈溢出,程序跑飞。

  • 发现一个奇怪的现象,在程序正常运行的时间里,如果用示波器去触碰一下晶体引脚会导致单片机马上停止,难道单片机本身不会自动恢复运行么?以前用51单片机的时候,触碰晶体虽然也会导致运行不正常,但是当拿开之后,单片机又会恢复正常运行状态。

    而且按照你的方法,我在它停止的时候用示波器打了一下晶体的频率,发现它根本没起振,当然拿开之后也不能使它恢复振荡。更让我捉摸不透的还是,当我用内部DCO振荡器也会出现一样的情况,也就是程序运行一会儿单片机卡死。

    使用内部振荡器也会出现这样的问题。

    我整个人都快崩溃了。。。。

  • 我换用了内部DCO,问题还是存在。难道真的是程序问题,但是不应该啊,一个液晶12864显示和1115采集才占用多大点ram啊。。。

  • 问题已经解决,确实是堆栈溢出的问题,非常感谢。