搜索
bottom↓
回复: 12

关于PIC 单片机 Timer0的问题

[复制链接]

出0入0汤圆

发表于 2010-6-8 09:50:10 | 显示全部楼层 |阅读模式
最近在调试LCD,然后用到定时器,遇到这样的问题,还请各位高手指导,小弟先行谢过了。
问题如下:
    定时器定时200ms,主函数程序执行200ms时然后进入中断,执行中断程序,执行完就又返回到主函数里接着执行,
此时,问题就出现了,在LCD上显示的东西就乱了。
  一直不知道什么问题。。。。

出0入0汤圆

发表于 2010-6-8 10:35:32 | 显示全部楼层
主程序和中断服务程序里分别都干了些什么?LCD是如何接的?

出0入0汤圆

 楼主| 发表于 2010-6-8 13:17:49 | 显示全部楼层
回复【1楼】eduhf_123 经历
-----------------------------------------------------------------------

LCD是并行的,用的PORTC口。
然后就是在主函数里 实现按键检测,而且还调用了几个子函数,有时钟(ds1307实现的)等。
这么样给你说吧:
void main()
{
    .....
    所有的初始化;
..............
    while(1)
    {
       1、调用显示时钟子程序;
       2、调用显示A/D转换子程序;
       3、......
       ...
       4、然后就是进行按键检测;
     }
}
中断服务程序里就是让一个显示光栅编码器的值的程序,定时一段时间刷新。

大概就这个样子。

出0入0汤圆

发表于 2010-6-8 23:21:09 | 显示全部楼层
主程序也要操作LCD(显示时钟)、中断服务程序也要操作LCD(显示光栅编码器的值),两者如何不冲突?
试想:
主程序中,要显示时钟的时候,把LCD的控制线的电平发送出去了、就要给LCD写数据了,这时候定时器中断来了,中断服务程序开始操作LCD(即控制线跟PORTC口),你自己想想,这个时候,LCD在它的接口上看见的是什么?——完全是乱七八糟的时序和数据——它的显示为啥不乱?
建议LZ去看看“临界区”的相关概念。

既然已经把刷新编码器值的程序段放进定时中断服务程序了,为什么不把对时钟显示的刷新也放进去?

出0入0汤圆

 楼主| 发表于 2010-6-10 09:11:09 | 显示全部楼层
回复【3楼】eduhf_123 经历
-----------------------------------------------------------------------
       哦,先谢谢你了。我想了一下也是这个问题。那我再试一下。
“临界区”,我们在操作系统课程上学过,可我不知道在这怎么应用?
    我先查一下资料吧。
    谢谢你耐心、细心的指导。

出0入0汤圆

 楼主| 发表于 2010-6-17 14:14:40 | 显示全部楼层
回复【3楼】eduhf_123 经历
-----------------------------------------------------------------------

eduhf_123 经历:
   你好,我那你说的这个思路,然后改了一下程序。如下:
void main()
{
    .....
1、中断初始化;
..........
    其它的初始化;
..............
2、 中断初始化;
    while(1)
    {
       就是进行按键检测;
     }
}
把显示时钟,还有编码器的值都放在中断服务程序里处理。
主函数里就只剩下按键检测,但是按键检测也是需要控制LCD的(主要实现菜单的功能)。
但是,我在每次按键按下后,要给LCD 发数据的时候关掉中断。

可是还是有乱的情况。

还发现一个问题,就是中断的初始化程序在主程序的 1 处,和 2 处时,所出现的乱的状况大不一样。
以至于是菜单都没有办法完全显示。

出0入0汤圆

发表于 2010-6-17 14:29:48 | 显示全部楼层
建议你更改程序结构:
----------------------------
1、按键接在有电平变化中断的IO口上,利用中断实现按键,但不做按键处理,只把扫描到的按键键码放到一个全局变量里;
2、定时器开200ms中断,但中断服务程序中不做处理,只做一个标记,同按键一样,留待主程序检查标记来处理;
3、主程序检查按键有效标志及定时时间到标志,并分别做处理。
4、在主程序中,一定要在紧临while(1)大循环的地方,先清各中断标志、然后再开中断。
----------------------------

或者这样:
----------------------------
1、定时器开5ms中断,利用状态机实现按键扫描(此时按键可接在任意IO口线上),并对中断次数进行计数(40次表示200ms时间到);
2、同上,在主程序中检查按键有效标志与定时时间到标志,并分别处理;
3、中断标志、中断允许的处理也同上。
----------------------------

出0入0汤圆

 楼主| 发表于 2010-6-17 15:31:49 | 显示全部楼层
回复【6楼】eduhf_123 经历
-----------------------------------------------------------------------
先谢谢你!
下来我就按你给的建议先试一下。

哦,我做的这个以后还要加入 USB 的通讯。我现在都害怕程序到时候又是问题百出,您能给我建议一下写大的
程序的方法,或者思路吗?  谢谢!

出0入0汤圆

发表于 2010-6-17 15:53:59 | 显示全部楼层
关于状态机,请参考本坛中马潮老师的帖子跟书、还有傻孩子的帖子。
另外,请阅读《时间触发嵌入式系统设计》这本书。

出0入0汤圆

 楼主| 发表于 2010-6-18 09:34:20 | 显示全部楼层
回复【8楼】eduhf_123 经历
-----------------------------------------------------------------------

  你好!谢谢你的耐心的指导,程序现在可以正常运行了。真的十分感谢!

  我是按照你说的第二种方法写的,因为我在处理按键的时候就是以这种方法来的,但是好像不是用的状态机扫描,
因为,在单片机中我对状态机好像没有概念。

程序大概这个样子:
while(1)
{
   1、按键扫描;
   2、if(按键标志)
      按键处理;
   4、if(中断标志)
      中断处理。
}

还有我想问一下:
1、用状态机是不是比较稳定?我笨想,就是好像不用去抖动。它只能从上一个状态跳到下一个状态。
2、就您给我建议的这两种按键扫描的方法,有没有什么意义?
   比如说,什么情况下用第一种,什么情况下用第二种?或者说由自己决定,就是设计的时候是用的中断,然后就用中断
扫描。再或者是对时间要求比较严格的时候用中断扫描(以为,我认为中断扫描比状态机的快)。
3、您在这两种方法中都说要在while(1)之前清中断标志,然后再开中断,我对着不是很清楚,还请您给解释一下。

直到你给我回帖,我才知道,我来这个论坛这么长时间了,都没有去过 马潮老师和傻孩子的帖子的那个地方。很是遗憾,
以后得经常光顾一下了。
你说的《时间触发嵌入式系统设计》这本书就是《时间触发嵌入式系统设计模式:使用8051微控制器开发可靠应用》这本书吧?

这的谢谢你,能这么及时、细心,耐心的指导。再次感谢!

出0入0汤圆

发表于 2010-6-18 10:07:50 | 显示全部楼层
1、用状态机是不是比较稳定?我笨想,就是好像不用去抖动。它只能从上一个状态跳到下一个状态。
-----------------
关于状态机,《时间触发嵌入式系统设计》这本书以及马老师跟傻孩子的帖子中有很多很详细的讨论,你看过就能有自己的看法了。


2、就您给我建议的这两种按键扫描的方法,有没有什么意义?
   比如说,什么情况下用第一种,什么情况下用第二种?或者说由自己决定,就是设计的时候是用的中断,然后就用中断
扫描。再或者是对时间要求比较严格的时候用中断扫描(以为,我认为中断扫描比状态机的快)。
-----------------
通常来说,只有在系统对按键响应的实时性要求非常高的时候,才需要用中断来实现;其他场合都可以用时间片+状态机的方式来实现。
毕竟,中断向量的跳转与返回、中断入口的现场保护、出口的现场恢复等等这些都是要占用代码空间和运行时间的。


3、您在这两种方法中都说要在while(1)之前清中断标志,然后再开中断,我对着不是很清楚,还请您给解释一下。
-----------------
因为在初始化过程中,可能已经发生了一些中断、对应的中断标志已经置位了,在开总中断允许之前,应该先清除这些中断标志,然后再开中断允许。

出0入0汤圆

 楼主| 发表于 2010-6-18 11:09:54 | 显示全部楼层
回复【10楼】eduhf_123 经历
-----------------------------------------------------------------------

哦,那好的,我知道了,谢谢你!
我再看看资料,然后继续写我的程序了。

出0入0汤圆

发表于 2010-8-27 10:42:22 | 显示全部楼层
参考了
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-9 10:01

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表