我用的是模拟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–);
}
}
Triton Zhang:
如果这个问题出现频率很高,再现这个问题,不要忙着复位或断电, 用示波器的管脚点下接晶体的那两个管脚,测试下是否晶体有停振。
有时候只要示波器的管脚一碰晶体的管脚就能恢复,那多半是晶体的负载电容不对造成的。
bo zhou1:
回复 Triton Zhang:
发现一个奇怪的现象,在程序正常运行的时间里,如果用示波器去触碰一下晶体引脚会导致单片机马上停止,难道单片机本身不会自动恢复运行么?以前用51单片机的时候,触碰晶体虽然也会导致运行不正常,但是当拿开之后,单片机又会恢复正常运行状态。
而且按照你的方法,我在它停止的时候用示波器打了一下晶体的频率,发现它根本没起振,当然拿开之后也不能使它恢复振荡。更让我捉摸不透的还是,当我用内部DCO振荡器也会出现一样的情况,也就是程序运行一会儿单片机卡死。
使用内部振荡器也会出现这样的问题。
我整个人都快崩溃了。。。。
bo zhou1:
回复 Hardy Hu:
我换用了内部DCO,问题还是存在。难道真的是程序问题,但是不应该啊,一个液晶12864显示和1115采集才占用多大点ram啊。。。
bo zhou1:
回复 Hardy Hu:
问题已经解决,确实是堆栈溢出的问题,非常感谢。