我彻底晕了,搞了一天,还是没有解决!天啊,问题到底出在哪里?

seawave2000   2006-6-27 17:37 楼主
程序编好了,各种功能都很正常,用的是135,可是今天领导说让在程序初始化的地方先让P5.3=1,P5.0=0,然后经过一段延时在另P5.3=0;P5.0=1;看似很简单,可是当我这样改了之后问题却出来了,程序运行到P5.3=0;P5.0=1;指令后就复位,一直重复不断,我不知道问题出在什么地方,改之前的程序如下:
void main(void)
{
unsigned int i1,d;
///////////////////////////////////外部晶振
BCSCTL1 = 0;
BCSCTL1 &=~XT2OFF;
do
{
IFG1 &=~OFIFG;
for(i1 = 0xff;i1>0;i1--);
}
while((IFG1 & OFIFG) !=0);
BCSCTL2 |=SELM_2; //选择MCLK为XT2
BCSCTL2 |=SELS;
////////////////////////////////////开启看门狗
BCSCTL2 |=SELS+DIVS_3;
WDTCTL=0x5a10;//打开看们狗,复位时间为64.8ms
IE1 &=0XFE;
IFG1 &=WDTIFG;
////////////////////////////////////端口初始化
P1DIR =0xff;//状态管
P2DIR =0xff;//个位管
P3DIR =0xff;//十分位管
P4DIR =0xff;//百分位管
P5DIR =0x1f;
P5SEL =0x10;//选择P5.4第二功能
P5OUT =0X15;//
P6DIR =0x00;//P6.0为模拟信号输入口
P6SEL =0x01;//选择AD功能

///////////////////////////////////AD
ADC12CTL0 &=~(ENC);
ADC12CTL0 =ADC12ON+SHT0_15
ADC12CTL1 =SHP+CONSEQ_2;//
ADC12CTL1 |=ADC12DIV_7;
//ADC12CTL1 |=ADC12SSEL_2;
ADC12MCTL0 =0xa0;//选择0通道,在0通道结束,外部参考源
ADC12IE =0x0001;//开放一通道中断
ADC12IFG =0x0000;//清0通道中断标志位
ADC12CTL0 |=ENC;//开转换允许
ADC12CTL0 |=0x0001;//启动AD转换
for(i1=255;i1!=0;i1--);
_EINT();//开总中断
P1OUT =0Xff;
P2OUT =0X40;
P3OUT =0Xc0;
P4OUT =0Xc0;



改变之后的程序为:
void main(void)
{
unsigned int i1,d;
///////////////////////////////////外部晶振
BCSCTL1 = 0;
BCSCTL1 &=~XT2OFF;
do
{
IFG1 &=~OFIFG;
for(i1 = 0xff;i1>0;i1--);
}
while((IFG1 & OFIFG) !=0);
BCSCTL2 |=SELM_2; //选择MCLK为XT2
BCSCTL2 |=SELS;
WDTCTL=WDTPW+WDTHOLD;//关闭看门狗
////////////////////////////////////端口初始化
P1DIR =0xff;//状态管
P2DIR =0xff;//个位管
P3DIR =0xff;//十分位管
P4DIR =0xff;//百分位管
P1OUT =0Xff;
P2OUT =0X40;
P3OUT =0Xc0;
P4OUT =0Xc0;
P5DIR =0x1f
P5SEL =0X00;
P5OUT |=BIT3;/
P5OUT &=~BIT0;
P6DIR =0x00;//P6.0为模拟信号输入口
P6SEL =0x01;//选择AD功能
for(d=4;d!=0;d--)
{
for(i1=60000;i1!=0;i1--)
{
_NOP();
_NOP();
_NOP();
_NOP();
_NOP();
}
}
P5OUT &=~BIT3;
P5OUT |=BIT0;
////////////////////////////////////开启看门狗
BCSCTL2 |=SELS+DIVS_3;
WDTCTL=0x5a10;//打开看们狗,复位时间为64.8ms
IE1 &=0XFE;
IFG1 &=WDTIFG;
///////////////////////////////////AD
ADC12CTL0 &=~(ENC);
ADC12CTL0 =ADC12ON+SHT0_15;//
ADC12CTL1 =SHP+CONSEQ_2;//
ADC12CTL1 |=ADC12DIV_7;
//ADC12CTL1 |=ADC12SSEL_2;
ADC12MCTL0 =0xa0;//选择0通道,在0通道结束,外部参考源
ADC12IE =0x0001;//开放一通道中断
ADC12IFG =0x0000;//清0通道中断标志位
ADC12CTL0 |=ENC;//开转换允许
ADC12CTL0 |=0x0001;//启动AD转换
_EINT();//开总中断


请高手指点!

回复评论 (11)

我曾经这样调整,发现如果我把第一段延时去掉或者是把P5.3=0;P5.0=1;指令去掉,程序正常工作,但是若他们同时存在则程序不能正常工作!
点赞  2006-6-27 17:53
程序太长,没怎么仔细看,不过好象只是关于P5口的初始化部分有一些改变。
感觉在P5.3和P5.0的输出处理上与要求不太合理。因为P5.0~P5.4在系统初试化后,未进行操作前应该是无输出的,所以建议做如下修改:
......
P5DIR =0x1f
//P5SEL =0X00; //该语句可以不要
P5OUT =BIT3; /仅让P5.3=1
//P5OUT &=~BIT0;
for(d=4;d!=0;d--)
{
 for(i1=60000;i1!=0;i1--);
 //{
 //_NOP();
 //_NOP();
 //_NOP();
 //_NOP();
 //_NOP();
 //}
}
P5OUT = BIT0; //复位P5.3,置位P5.0
//P5OUT |=BIT0;

P6DIR =0x00;//P6.0为模拟信号输入口
P6SEL =0x01;//选择AD功能
......
点赞  2006-6-27 19:08
CDZIJ兄,我照你说的那样去做了,问题仍然存在,真的不知道这到底是哪个地方的问题了!
点赞  2006-6-27 21:02
程序开始的时候,就应该关闭WDT
点赞  2006-6-27 22:19
哦,那么看门狗在什么时候我才能打开?
点赞  2006-6-28 09:40
在延时程序中加清除看门狗指令,可能延时时看门狗溢出
点赞  2006-6-28 09:56
引用:

在延时程序中加清除看门狗指令,可能延时时看门狗溢出
可是在我第一段延时的时候,看门狗是关闭的,在第一段延时之后才打开的看门狗,而且我也试过,即使延时的时间我只用一句_NOP();指令代替也不行,除非中间没有任何延时语句才行.
点赞  2006-6-28 10:14
系统默认WDT是开的,还有你改变MCLK的时候,最好先关WDT。要不有可能会引起复位。在高频晶振稳定后,再开WDT。
点赞  2006-6-28 13:37
引用:

系统默认WDT是开的,还有你改变MCLK的时候,最好先关WDT。要不有可能会引起复位。在高频晶振稳定后,再开WDT。
照这样试了一下还是不行,不明白为什么对这两个口操作不能在中间加延时?加延时就复位?
点赞  2006-6-28 16:06
你的高频晶振是多少?算一下执行时间。
点赞  2006-6-28 18:14
改成这样应该没问题了:,先关闭WDT,再切换MCLK.
WDTCTL=WDTPW+WDTHOLD;//关闭看门狗
BCSCTL1 = 0;
BCSCTL1 &=~XT2OFF;
do
{
IFG1 &=~OFIFG;
for(i1 = 0xff;i1>0;i1--);
}
while((IFG1 & OFIFG) !=0);
BCSCTL2 |=SELM_2; //选择MCLK为XT2
BCSCTL2 |=SELS;
点赞  2006-6-30 13:56
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复