打印

51 io异常输出

[复制链接]
3106|22
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
phonelong|  楼主 | 2012-4-26 20:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
STC89C52RC 用C写的程序 P1口的3、4、5都是作为输出的。用来驱动发光二级管。先将P1^3置高,等到需要的时候将P1^3置低,这个时候问题出现了,电平倒是被拉下来了,但是过了几十US后又出现了一个1v左右的电平而且是3、4、5都出现了其他口没有测,这个电平大概持续了几个US。请问这是什么问题呀?(内部ram用了110个,总共256个,内部扩展RAM全用。怀疑是堆栈溢出,或者是相关寄存器受干扰。用其他程序跑没问题,排出了硬件问题)。

相关帖子

沙发
NE5532| | 2012-4-26 20:36 | 只看该作者
打程序断点,关闭总中断,还这样的话,检查硬件,否则检查软件。另外注意看数据手册,这个端口的驱动能力够不够。

使用特权

评论回复
板凳
phonelong|  楼主 | 2012-4-26 20:49 | 只看该作者
2# NE5532
硬件没有问题,已经用其他程序验证了,中断只是有T0 T1 只是计数 没有中断子函数
没法仿真 所以只能猜测问题了!

使用特权

评论回复
地板
NE5532| | 2012-4-26 20:54 | 只看该作者
不需要仿真也可以找啊,确认是程序问题就把所有操作了端口的语句全部找出来,屏蔽掉再测就是了,我搞了8年单片机从不仿真也一样找BUG哈。

使用特权

评论回复
5
phonelong|  楼主 | 2012-4-26 20:59 | 只看该作者
4# NE5532 哥 早就想到了 while循环了只有对P1^3的置高、置低和延时,但是呢 还是会出现 注意哟!是P1^3 4 5同时出现的 而我只对P1^3操作了。不过工程里保留了所有的变量定义和其他函数定义 但是在main中都没有调用 只用了DELAY

使用特权

评论回复
6
NE5532| | 2012-4-26 21:01 | 只看该作者
那你认为什么都对完了,请问为啥出问题了呢?

使用特权

评论回复
7
phonelong|  楼主 | 2012-4-26 21:10 | 只看该作者
6# NE5532 我怀疑是ram和堆栈的问题,可是我不懂汇编,用单片机也就一个月,不怎么熟悉这些。生成的跟map差不多的文件还那么多乱码,都不知道怎么读,所以看看高手们,有没有碰到这个问题!内部ram只有256字节,扩展ram也只有256字节,并且地址空间是一样的,中间还有一些功能寄存器,哎,乱死了,反正就是这个现象,改测的我都测了。开始怀疑硬件,可是用其他程序没问题。如果怀疑是程序有误操作,那我把可能调用的都屏蔽了,只剩下口操作和延时,可是还是有问题。那我就不知道了。之前因为没有设置了错误的堆栈导致过内部ram出错!

使用特权

评论回复
8
NE5532| | 2012-4-26 21:26 | 只看该作者
送楼主一句话,找问题要先承认自己犯了错误,认为自己什么都对的人就不用找了。楼主既然才接触单片机一个月,还不愿意安下心来进行软硬件测试,那就只有祈求身边有高人存在了。

使用特权

评论回复
9
phonelong|  楼主 | 2012-4-26 21:39 | 只看该作者
8# NE5532 你这话是从何说起。我只是说我已经做了哪儿些测试,出现了哪儿些现象。能测的我都测了,因为我水平有限才提这个问题,描述那么多只是想让你能更了解我遇到的问题。我虽然没有你那么有经验,但是还是懂一些基本的测试的。示波器上出现了一个1v的电平,程序里没有其他对这个口操作的代码,并且用其他程序测试的时候没有这种情况。请问我这测试还不够安心吗?有问题肯定是我程序中的问题,但是因为水平有限所以不知道问题出在哪儿了,所以才开问,这有错吗?

使用特权

评论回复
10
NE5532| | 2012-4-26 21:47 | 只看该作者
从一个找了8年BUG的地方说起,楼主思维的骨子里认为自己全部操作都正确,找这个问题不需要很多经验,就是写个端口拉低的语句,后面跟个while(1);然后再把总中断关掉,楼主照我说的测了,再来抱怨也不晚吧。

使用特权

评论回复
11
phonelong|  楼主 | 2012-4-26 21:57 | 只看该作者
10# NE5532 没看懂
您的意思是
main()
{
  p1^3=0;
while(1);
EA=0;//总中断寄存器
}
吗?
还是
main()
{
EA=0;//总中断寄存器
  p1^3=0;
while(1);
}
可是我遇到的问题是p1^3=1;delay10s();pi^3=0;时从示波器上看到电平从高(5V)到了低,持续了一段低后出现了1V左右的电平,这个电平持续了10个us左右,又变为了低。不过还是感谢大侠给提供的方法。明个试试。洗洗睡觉啦!

}

使用特权

评论回复
12
NE5532| | 2012-4-26 22:05 | 只看该作者
main()
{
EA=0;//总中断寄存器
  p1^3=0;
while(1);
}

我说的是这个,你先把静态的测好了,再开循环研究动态的,研究的时候还是不要开总中断,另外还要量下电源上有没有异常波形。

使用特权

评论回复
13
zhaofy521| | 2012-4-27 09:19 | 只看该作者
把STARTUP加上,我觉的还是硬件问题,可能有短路,或者毛刺

使用特权

评论回复
14
cubasa| | 2012-4-27 09:34 | 只看该作者
本帖最后由 cubasa 于 2012-4-27 09:38 编辑

从上面的内容得到的信息不是很多,所以,只能初步判断可能性:
1. 首先要定位问题是软还是硬,相关IO上的外设全部焊下或者断开,让其悬空,相关P口软件中设置成强上拉,再做测试,量波形。
2. 测试过程中,随时关注单片机的命(VCC)和脉(晶振)的波形。比如VCC一个幅度不大的、短暂的下降就可能会造成单片机死机的。
3. STC带狗的哦。会不会你没有喂狗,复位过程造成IO恢复成高电平~
4. 你自己说的,堆栈溢出,程序跑飞了。

使用特权

评论回复
15
ayb_ice| | 2012-4-27 09:37 | 只看该作者
直接写个最简短的测试程序不就知道了
99.99%程序问题

使用特权

评论回复
16
lwslws201| | 2012-4-27 11:23 | 只看该作者
4# NE5532 牛B

使用特权

评论回复
17
ningling_21| | 2012-4-27 11:57 | 只看该作者
先缩小范围,再找原因容易些...

使用特权

评论回复
18
phonelong|  楼主 | 2012-4-27 12:47 | 只看该作者
6# NE5532 今天又测了一下,发现不是硬件问题。而是延迟加多了,而且没有喂狗,片子复位后全都变高了,但程序开始后又马上执行了拉低的代码,所以出现了那种现象。不过还是有些不解,为啥复位后输出的不是5v高电平而是1v左右的??哎,学无止境呀!

使用特权

评论回复
19
autopccopy| | 2012-4-27 12:57 | 只看该作者
STC89C52RC 我好像有,上你的程序(或PM), 我用示波器帮你测。

使用特权

评论回复
20
phonelong|  楼主 | 2012-4-27 13:29 | 只看该作者
19# autopccopy 谢谢!不过问题已经找到了!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

29

帖子

1

粉丝