打印

一定是我太菜了,用STC老出诡异的问题(后面有图)

[复制链接]
5122|25
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ff8zgs|  楼主 | 2012-8-10 14:48 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 ff8zgs 于 2012-8-14 17:38 编辑

复件 六弦仪表V2.1.rar (469.38 KB) 最近用STC11片子 做一个仪表。但各种奇怪的问题。目前没解决的两个1:一个IIC器件驱动函数只要有调用了延时函数,就会花屏。这个文件是以往成熟产品中整体移植过来的。刚开始都没问题,后来一天中午睡个午觉回来就出现问题,一点点排查发现是这个延时函数导致的。但是这个问题不科学啊。我最开始以为是指针溢出。然后四处查找根本没有这方面的问题。最后花了一天时间锁定在这里。只要在这个函数中不调用延时就不会显示花屏。
2:定时中断问题,在一些函数能定时能中断,但是另一些函数却不能。中断初始化 严格按照STC的例程来写的,而且只开一个定时中断也不行。这些函数都没有对中断操作的动作。
今早我把不行的一个函数调整了下显示路径,内容没有任何改动,包括函数调用关系都没变,居然就行了。
3,第二个问题勉强解决后我又开启了TIME0的定时功能(没有开启中断,采用查询的方式做延时),中断是定TIMER1。然后发现死机。

之前还遇到过stc串口问题。能发送,不进接收中断,后来换了个mcu又莫名其妙的好了。换回原来不行mcu也行了。无语。。。。。

我的问题是这些问题大概是什么问题,是我自己,还是编译器由于没有stc数据库的问题(我现在选的是AT89C55WD)的数据库,也试过在网上下载的STC数据库。还是STC片子本身有什么问题我不知道的。
第二个问题:问问大侠们如果你们遇到这种问题从何下手。目前很茫然,一阵瞎找没效率还累人

相关帖子

沙发
misra| | 2012-8-10 15:02 | 只看该作者
你自己的问题

使用特权

评论回复
板凳
misra| | 2012-8-10 15:06 | 只看该作者
比如第一个问题;
你说的延时是指的软件延时么?就是不用中断延时么?

如果是软件延时,那么编译不同单片机的延时时间可能不一样,尽管程序一样。你说你是从成熟产品移植过来的,请问成熟产品石勇的STC单片机么?如果不是,那么延时时间可能不一样。如果用的是keil,那么延时时间肯定不一样。

也不是说你菜  大家都菜。不要着急一个个解决。要注意方法

使用特权

评论回复
地板
ff8zgs|  楼主 | 2012-8-10 15:23 | 只看该作者
第一个问题不是STC的单片机代码,但是移植过来的时候调整了延时时间的,而且是我先用过了一段时间的后来莫名出问题了。而且关键是那是一个IIC读温度的程序,最后影响的是显示花屏。

使用特权

评论回复
5
ayb_ice| | 2012-8-10 15:23 | 只看该作者
MCU在差不可能差到这个程序,
可以肯定是程序的问题,
极有可能是KEIL的编译配置不对,比如什么使用绝对寄存器访问,寄存器组设置之类的问题

使用特权

评论回复
6
ff8zgs|  楼主 | 2012-8-10 15:26 | 只看该作者
还有个问题 我的代码再keil 编译出来是17512字节,但是导入STC下载程序中却凭空加了4个字节。

使用特权

评论回复
7
ff8zgs|  楼主 | 2012-8-10 16:00 | 只看该作者
5# ayb_ice哥  你说 的我还真不知道 怎么设置

使用特权

评论回复
8
dqyubsh| | 2012-8-10 17:14 | 只看该作者
可以肯定是软件的结构出了问题。这类问题经常导致莫名其妙的现象,比如显示乱了,随机地出现一些不可重复的现象。

我建议你重写定时器或者中断,这部分可能引发了一个大的函数(比如浮点运算),导致定时器或者中断重入了。系统的资源是有限的,这些后台的任务一定不能影响到主程序某个特定的任务,反之也是一样的。比如,在显示数据过程中,你的中断启动了,中断级别高,如果执行时间影响显示功能,就会引起显示的不完整,表现出来就花屏。

可以这样考虑:原始数据不变不更新显示,数据变的时候只显示变的数据,等等。计算过程优化,比如程序一直保持ADC采样的整数值,直到需要显示的时候再转换成浮点数,而不是每次采到ADC值就转换。

延长定时器间隔,优化各部分函数,或者提高系统时钟,都会有改善。最重要的一条要记得:单片机不是台式机,干不了大事,不能由着性子写代码,要精简精炼,精益求精。最好的方式是,让它99%时间都闲着,而不是99%时间都忙着。XP系统如果CPU占有率到40%就要出状况,单片机也别指望能好多少。

如果启动一次定时器执行完函数,用了5%的时间,其它时间闲置,系统问题不大;如果一次定时器用了95%时间,其它用来做显示,那基本就废了。你这种情况,可能是后一种。

有人做51开发板,就用一线串行接口的温度传感器,这就无法避免后一种情况的出现。类似地,能用SPI接口别用IIC接口,因为IIC要用中断来处理通讯状态,费时费力,比SPI麻烦太多,硬件省了一条线,软件就麻烦的要死,所以也不推荐。

使用特权

评论回复
9
ff8zgs|  楼主 | 2012-8-10 17:21 | 只看该作者
8# dqyubsh 我 其实只有两中断 一个定时1一个串口  中断服务函数 也是三两句话就出来了的 。

比如刚才又发现一个奇怪的问题 我无论怎么改变计数器初始值 其定时效果都一样
我在后面附上 这部分代码 截图 望指点

使用特权

评论回复
10
gx_huang| | 2012-8-10 17:28 | 只看该作者
LZ果然很菜。
这些问题和STC没有任何关系。

使用特权

评论回复
11
ff8zgs|  楼主 | 2012-8-10 17:44 | 只看该作者
本帖最后由 ff8zgs 于 2012-8-10 17:47 编辑

以下 是我想实现2S延时的代码

中断初始化,现在只开了串口和Timer1;

中断服务  Time_10ms_flag是一个u8 的全局变量。当前是定时50ms

这个是用以实现长时间的延时的函数,函数参数用以控制延时时间。

这个就是我最后使用方式了

调用函数的在main函数下 调用路径是

main()->dsplay()->strain()

其中 display()函数 通过查阅状态表 来显示不同的页面。
strain 这个函数 就是其中一个显示页面  就是最后一张图的内容

现在 我的问题 是我无论怎么改变计数器 初始值都无法改变延时 效果 ,只能通过改变 delay_10ms()的参数 才能改变

使用特权

评论回复
12
ff8zgs|  楼主 | 2012-8-10 17:49 | 只看该作者
本帖最后由 ff8zgs 于 2012-8-10 17:51 编辑

10# gx_huang

我承认 我比较菜 但是遇到的都是 很奇怪的问题,超出了我理解范围。并且我也 检查了 程序 没有什么地方有明显的错误。

我以前 用stm32 虽然当时刚上手 却还没遇到这些科学解释不通的问题

使用特权

评论回复
13
dqyubsh| | 2012-8-10 19:48 | 只看该作者
主程序里判断进了多少次中断?你能保证每次循环都进这个判断吗?主程序和定时器分别在跑,两个异步的过程是很难保证正确的。

2秒定时,在定时器里直接累加次数,次数够了就置标记。干嘛搞的这么复杂。

使用特权

评论回复
14
autopccopy| | 2012-8-10 19:58 | 只看该作者
学习了。:)

使用特权

评论回复
15
ningling_21| | 2012-8-10 22:35 | 只看该作者
如果同样的程序,用其它的单片机没有问题,才有可能是STC的问题...

使用特权

评论回复
16
dlyt_test001| | 2012-8-11 08:17 | 只看该作者
不是STC的问题,虽然人家是国产的,但也不要动不动就归罪于它。
代码移植要注意很多问题。你可以试一下移植到ATMEL上,看看还出不出类似问题。这样就可以为STC开脱了。

使用特权

评论回复
17
ff8zgs|  楼主 | 2012-8-11 09:11 | 只看该作者
本帖最后由 ff8zgs 于 2012-8-11 09:20 编辑

13# dqyubsh
我按照你的建议 已经改过来了 但是问题依旧。
无论我怎么更改计数初始值,延时效果都不变。目测是10ms进一次中断。
目前 我只能按照他大概是10ms一次中断来处理了


使用特权

评论回复
18
ff8zgs|  楼主 | 2012-8-11 09:16 | 只看该作者
16# dlyt_test001

其实我没有归罪STC的,我在这里发帖,一个是希望能解决问题。其实最希望的一个能快速DEbug这类奇怪问题的方法。

使用特权

评论回复
19
gx_huang| | 2012-8-11 11:26 | 只看该作者
程序错了吧。
delay_10ms(50)里面
如果延时到,返回1。
没有到,返回0。
最后的使用方式有问题吗?

使用特权

评论回复
20
liumulan| | 2012-8-11 11:29 | 只看该作者
其实我没有归罪STC的,我在这里发帖,一个是希望能解决问题。其实最希望的一个能快速DEbug这类奇怪问题的方法。

使用特权

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

本版积分规则

18

主题

199

帖子

1

粉丝