Board logo

标题: 程序跑飞 [打印本页]

作者: mkokji    时间: 2005-12-28 11:50     标题: 程序跑飞

我用for(;;) 循环写了一个带延时程序,可是当手动开关关闭时总是死机。请高手指教。

for(;;)
  { 
    Inputs = 0;
    Inputs = Inputs_GetVal();
                                           //在这里手动开关打:Inputs=F4
    if(((Iinputs&0xF4)==0xF4)&&ikey==0)         

    {
       OnGreen_SetBit(0);    
       delay(500000);      //5秒延迟
       OnGreen_ClrBit(0);    
       ikey=1; 
     }
      else if((TUinputs!=0xF4)&&ikey==1)   //在这里手动开关关闭:Inputs!=F4
     { 
          
       OnGreen_SetBit(0);   
       delay(500000);        //5秒延迟 
       OnGreen_ClrBit(0);    
      }

   。。。。。。

   }


作者: mkokji    时间: 2005-12-28 11:54     标题: 对了,但不执行正确。

对了,但不执行正确。
作者: mkokji    时间: 2005-12-28 12:49     标题: 上边的写错了

对不起,上边的写错了。我是想说当设一个breakpoint,一步一步执行时是对的。但是直接执行全部程序时死机。
作者: strongchen    时间: 2005-12-29 10:43

COP看门狗有没有开启?
作者: mkokji    时间: 2005-12-29 17:00     标题: 请教如何开启watchDOG!

Hi StrongChen,谢谢你的提醒,由于是新手,曾经是过增加了一个watchDOG bean,可是导致程序每个一小会儿复位一次,只好取消了。相比设置错误,请教如何正确开启watchDOG!。谢谢。
作者: mkokji    时间: 2005-12-29 17:18     标题: 如果要增加一个watchDog, bean, time period如何定啊?

如果要增加一个watchDog, bean,  time period如何定啊?谢谢!
作者: mkokji    时间: 2005-12-29 17:34     标题: 最大只能设定period为1秒

codewarrior 只能允许设定最大1苗,结果程序好像每1秒reset一次,不明白。
作者: strongchen    时间: 2005-12-30 09:59

Watchdog可能在上电后就自动开启了。先把COP关掉试试。
作者: mkokji    时间: 2005-12-30 15:27     标题: watchDog似乎不能解决问题。工业开关抖动干扰?

用watchDog试了,似乎不能解决问题。似乎当所用工业开关(打回去时很费劲)打回去时,会不会是我所用的工业开关的抖动对输入口的读数有影响?不知道有什么好招消除这种工业开关的抖动干扰?谢谢。
作者: strongchen    时间: 2005-12-31 11:01

不太清楚你的问题到底是什么。
作者: 流浪远方百合    时间: 2005-12-31 11:23

我也遇到过楼主的问题,单步运行正确,全速跑飞,不知道你是什么芯片,试试直接在配置寄存器关掉cop,设置一下寄存器就可以了
作者: mkokji    时间: 2005-12-31 11:53     标题: 9S12E128

我用的是9S12E128,请问能讲讲你的具体处理方法吗?谢谢。我的信箱是:mkokji@yahoo.com
作者: mkokji    时间: 2005-12-31 12:06     标题: 如何判断cop关的还是开的?

由于是codewarrior新手,请教如何如何判断cop关的还是开的?如何关掉?谢谢!
作者: strongchen    时间: 2005-12-31 14:11

看COPCTL寄存器。9S12E128的上电缺省状态COP应该是关闭的。
作者: mkokji    时间: 2005-12-31 14:21     标题: COPCTL

很愚昧的问题,如何codewarrior上看它?谢谢
作者: 8808beter    时间: 2005-12-31 14:27

在右下角的地址窗口查看寄存器对应的地址,或者在DATA窗口查看寄存器的数值
作者: mkokji    时间: 2005-12-31 14:37     标题: 您是说在程序run(运行)后的的window吗?

您是说在程序run(运行)后的的window吗?
作者: mkokji    时间: 2005-12-31 14:43     标题: Register

运行后的window显示register窗口:
D 0  A  0 B 0
IX 0 IY 0
IP C00 PC C00 PPAGE0
SP 0 CCR SXHIN2VC

左下角的DATA1窗口没有显示COPCLK information
作者: strongchen    时间: 2005-12-31 16:28

要到右下角的数据窗口中去看。
作者: mkokji    时间: 2006-1-1 02:55

在Date1窗口找到COPCTL了,当程序‘飞‘了之后COPCTL显示<1>volatile COPCTLSTR,不知道是什么意思?
作者: mkokji    时间: 2006-1-1 03:11     标题: Trigger module

最下面的小窗口可以选择Trigger module,现在选择状态是:Automatic(triggers,breakpoints,watchpoints,and trace possible).是不是应该手动设定这里?
作者: mkokji    时间: 2006-1-6 08:53

下边是Freescale Support的回复。
Basically a Watchdog or COP (Computer Operating Properly) is a way to ensure that the code is running in a portion of known code; your code must be
restarting the Time Out by the specified method in each device, in the case of
HCS12 you have to write 0x55 followed by writing 0xAA to the ARMCOP
register. In case this sequence is not written to the ARMCOP register, the
microcontroller will reset.

我加上了也不管用啊,高手请教。
作者: strongchen    时间: 2006-1-6 15:04

建议你先编一个最小的程序跑跑看,是否还会跑飞。
作者: mkokji    时间: 2006-1-8 08:19     标题: 没有看门狗? 硬件的问题?中断设置的问题?

Strongchen:
我按您的建议试运行了一个简单的for(;;)循环的一个开关控制的LED程序。输入控制口的动作现象如下:
(1)当我把开关打开(ON - 即把输入控制口的电位拉到"零"),LED变亮。只要不从ON打回到OFF。这一步从来都没问题。无论等多长时间程序也不飞掉。

(2)当我把开关恢复到关(OFF - 即把输入控制口的电位恢复到"高"-我是用一个电阻把+5V电源接到此控制口,没有加其他外接器件到地),程序要么中止,要么飞到循环外面,总是有问题。

根据(1), 好像我的程序里根本就没有看门狗? 再就是问题总是出现在输入控制口的电平有零到高的时候,难道说应为硬件的问题?或者中断设置的问题?

请指教。谢谢。


作者: strongchen    时间: 2006-1-10 11:18

你用哪个口作输入,哪个口作输出?程序怎样动作?
作者: mkokji    时间: 2006-1-10 13:38

由于系统是由数个开关和按键组成混合逻辑,我用PT0-3和PU1-4端口作为输入状态判断口。PA0-5;PB0-5K0-5Q0-5为输出
用了一个‘合成’的字节寄存器来判断输入口的状态:
Tinputs = TInputs_GetVal(); //读PT3-PT0的状态
Uinputs = UInputs_GetVal(); //读PT3-PT0的状态
Iinputs = (Tinputs&0x0F)|((Uinputs&0x0F)<<4);//组成一个判断寄存器(由高到底字节位的顺序组成-PU4,PU3,PU2,PU1,PT3,PT2,PT1,PTO)。

举例如下:
for(;;)
{
if(((Iinputs&0xF4)==0xF4)&&ikey==0); 判断开关#1是否ON
// (PU4-PU1)=0000/(PT3-PT0)= 0100
{
OnGreen_SetBit(0); // PA0输出‘低‘,绿LED亮
delay(500000); // 5秒延迟
OnGreen_ClrBit(0); // PA0输出‘高‘,绿LED灭
ikey=1;
}
---------------以上从来没出现问题----下面总是出错------------------
else if((TUinputs==0xCE)&&(TUinputs!=0xF4)&&ikey==1) //判断开关是否扳回初始状态(TUinputs==0xCE)。
{
OnGreen_SetBit(1); // PA1输出‘低‘,绿LED亮
delay(500000); // 5秒延迟
OnGreen_ClrBit(1); // PA1输出‘高‘,绿LED灭
}
}
作者: strongchen    时间: 2006-1-10 15:33

把程序再简化。只判断不动作,或只动作不判断,看看结果怎样。
作者: mkokji    时间: 2006-1-15 11:21

只动作不判断没问题。
只动作不判断就出现问题。
作者: strongchen    时间: 2006-1-16 10:25

???
作者: mkokji    时间: 2006-1-17 06:52

只动作不判断没问题。
只判断不动作就出现问题。
作者: strongchen    时间: 2006-1-17 10:29

看一下你的判断语句编译出来的汇编指令是什么,将汇编指令单步运行一下,看看到底发生了什么。




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0