tomsu
驱动牛犊
驱动牛犊
  • 注册日期2005-07-27
  • 最后登录2006-02-17
  • 粉丝0
  • 关注0
  • 积分12分
  • 威望4点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:3174回复:6

我的程序仿真运行正常,烧到片子里运行不正常,不知何故!

楼主#
更多 发布于:2005-07-27 15:28
  mcu:at89c51
仿真器:周立功TKS-58B
烧录器:LABTOOL-48
目标板:自己焊的
功能描述:断电检测RF板上相邻焊点是否焊接短路,共有11个焊点待测,我用P0.0~P0.7和P2.5~P2.7直接连这11个焊点,检测思路是分别将每个脚置0,其他置1,若能将其他脚拉低,有些特殊情况(由于对地阻值小的原因会将某些脚拉低)可忽略掉(通过检测),程序如下:

#define uchar unsigned char
#define uint unsigned int

#include <reg51.h>
#include <intrins.h>

sbit non_green = P1^1;       /*检测通过亮绿灯*/
sbit non_red     = P1^3;       //*检测不通过亮红灯*/


void Delay(uint delay_times)
{
       uint j;
       for(;delay_times>0;delay_times--)
              for(j=0;j<=114;j++)
                     {
                     ;      
                     }
}

void ShowError(void)
{
       non_red = 0;                    
       while(1);
}

void ShowFine(void)
{
       non_green = 0;
       while(1);
}

main()
{
       uchar BYTE0 = 0x7F;
       uchar BYTE2 = 0xFF;
       register uchar i;      
       for(i=8;i>0;i--)
              {
              P0 = 0xFF;
              P0 = BYTE0;
              Delay(5);
              switch(i)                 /*特殊情况*/
                     {
                     case 7 :
                            if(P0 != 0xAE||P2 != BYTE2)
                            ShowError();
                            break;
                     case 6 :
                            if(P0 != 0x8E||P2 != BYTE2)
                            ShowError();
                            break;
                     case 5 :
                            if(P0 != 0xAE||P2 != BYTE2)
                            ShowError();
                            break;
                     case 4 :
                            if(P0 != 0xA6||P2 != BYTE2)
                            ShowError();
                            break;      
                     case 3 :
                            if(P0 != 0xAA||P2 != BYTE2)
                            ShowError();
                            break;      
                     case 1 :
                            if(P0 != 0xAE||P2 != BYTE2)
                            ShowError();
                            break;      
                     default :         /*一般情况*/
                            if(P0 != BYTE0||P2 != BYTE2)
                            ShowError();
                            break;
                     }      
              BYTE0 = _cror_(BYTE0,1);/*循环右移一位*/
              }      
       BYTE2 = 0x7F;
       BYTE0 = 0xFF;
       for(i=3;i>0;i--)
              {
              P2 = 0xFF;
              P0 = BYTE0;
              P2 = BYTE2;
              Delay(5);
              if(P0 != BYTE0||P2 != BYTE2)
                     ShowError();                            
              BYTE2 = _cror_(BYTE2,1);              
              }
       ShowFine();
}


程序很简单,调试时能够达到检测目的,程序运行10ms就有正确的反应,但是烧到片子里执行时,等大概2s钟后就亮了红灯,重烧了很多次,都是这个结果,不知到是哪里的问题,请教老虾们帮忙,给出解决思路也很感谢,在线等。。。
Gong_XG
驱动太牛
驱动太牛
  • 注册日期2002-10-01
  • 最后登录2010-11-25
  • 粉丝0
  • 关注0
  • 积分313分
  • 威望46点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2005-07-28 01:12
电路问题!
wwwduyuxin
驱动牛犊
驱动牛犊
  • 注册日期2005-07-28
  • 最后登录2009-11-18
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2005-07-28 10:07
P0口是否接了上拉电阻?如P0口未接上拉电阻,此程序将无法正常运行。(注:仿真器P0口有了上拉电阻)
fu_tiansweet
驱动老牛
驱动老牛
  • 注册日期2004-01-08
  • 最后登录2009-07-10
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望526点
  • 贡献值0点
  • 好评度281点
  • 原创分0分
  • 专家分0分
地板#
发布于:2005-07-30 12:37
同意2楼的说法!
SUN315
驱动牛犊
驱动牛犊
  • 注册日期2005-07-17
  • 最后登录2005-08-01
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2005-08-01 22:20
强顶2楼
  最好在程序执行前加一个长延时
tomsu
驱动牛犊
驱动牛犊
  • 注册日期2005-07-27
  • 最后登录2006-02-17
  • 粉丝0
  • 关注0
  • 积分12分
  • 威望4点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2005-08-02 20:17
谢谢热心的朋友们,我已经改用P3和P2口了,vpp接的高电平,复位电路用示波器看了正常,程序开头已经加了5秒延时,程序没有用看门狗,仿真调试用的目标板晶振,只是问题依旧,我怀疑我的整个方案的可行性,不过这段时间我搜集了这方面的贴子,把我看到的好东西也放上来供大家借鉴。

【转贴】
关于“仿真时工作正常,程序固化后却不能运行?”的几种情况。    
出现这种情况有以下几种可能性:  
(1).用户板的程序块电路有问题:如PSEN不通或接错。地址线高位浮空等(我没遇到过这样的情况,但有文章有过这样的分析)。使用89C51内部程序,但EA未接高电平等。  

(2).用户板晶振电路有问题。用户板复位电路不正确。还要注意的是那2个电容,有次我拿错电容(473),结果拿万用表量电压晶振2边是2.5V,但拿示波器一看什么都没有。所以,测晶振2脚电压有时也未必完全准确。

(4)堆栈溢出。8051系列的单片机,有的型号内部有256个RAM,有的只有128个RAM, 现在高级语言编译系统都默认是256个RAM。如果您使用的是128个RAM的型号的芯片, 就应注意堆栈是否会溢出,如果溢出程序就不能运行。如果这种情况,把CPU换成带 256个RAM的型号试试。 (这点是比较重要,和对于初学者容易忽略掉的)

(3)用户系统内有需要复位的接口电路,如8155,8255,8279等,在它们还未完成 复位时,如果CPU就给它们写控制字,就会造成它们工作不正常。这种情况下,CPU 应确保在外设复位后再输出控制字。  

(5)程序片烧写不正确,这有以下几种情况: A。格式不对,或者是烧的内容不对 B。光写程序,未写芯片的设置字,如PIC系列,LPC764,80C196的保留字等。这 些设置字中凡是需要用户写的应正确填写,不需要写的应写入“FF”。 最好在烧写时看看烧写器读进来的BUFF,前面是不是02 00  开头。

(6)检验程序片是否烧写正确的方法是,从一片烧好的芯片中读出机器码,并生成机器 码文件,然后让仿真器运行这个机器码文件。如果不能正确运行,应重新烧写程序片。  

(7)系统接线有错,造成固化后的程序,不在系统所要求的地址空间内,当然不能运行。 控制脚接,特别是80196系列芯片面,如果READY脚,NMI脚浮空,则也会出现固化后程 序不能运行的现象。  


(8)、喂狗错误,仿真时不受影响(我用的是伟福的),烧完就老复位了;
(9)、时序错误,仿真时由于延时歪打正着,动真格的是就不灵了,从而导致看门狗总是复位,或者是使程序停顿在了一个标志判断处。


(10)上拉电阻  

我遇到过这种情况,有的上拉电阻不加时在仿真器上可以正常运行,而固化后就不行或时行时不行。

(11)复位时间短  

仿真器上大多是手动复位,与RC充电时间无关,而固化后运行,如果RC充电时间太短,就会复位不可靠甚至不能复位,因此计算复位脉冲宽度时要留有余量,这也是我的教训。

(12)有时是因为外围硬件的设计不合理,  

一般仿真器的I/O驱动能力都大于真正的CPU,在仿真器运行正常,正式烧写后,CPU未能可靠的驱动硬件。

(13)芯片坏了  

我最近就出现过,仿真器仿真时一切OK,固化后不行了,原来芯片坏了,一部分程序正常(显示,蜂鸣器),一部分怎么调都不行(串行通讯),换新片子就都OK,我使用的芯片是PHILIPS的P89C51RC+,劝大家先考虑考虑这种情况省得折腾半天白费力!
computer00
驱动小牛
驱动小牛
  • 注册日期2004-09-27
  • 最后登录2009-08-22
  • 粉丝0
  • 关注0
  • 积分1002分
  • 威望120点
  • 贡献值0点
  • 好评度110点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2007-03-28 18:52
看看已经使用了多少RAM,有可能是堆栈溢出.
博客Http://computer00.21ic.org
游客

返回顶部