打印

冒着被各位大侠打PP危险,还是要问一个老问题

[复制链接]
2491|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
无格|  楼主 | 2007-2-2 11:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
 多按键(输入信号)处理问题。

 我的问题是:
   我的系统输入/输出口是用245扩展的,输入8*9=72;
  要经常查询的有40个点;输入信号大多是按键信号,有部分是开关量信号(高低电平事先未知,有时输出点不过还得将8个点作输出用)。
  输出用374口展的有10*8=80;其中有3*8=24是作为数码管显示的。

  这40个输入点,有时需长按键。我原先的做法是在主程序完成读键,消抖等
 (定时器有时舍不得用掉,有时有通信/几个步进电机/计时)。输入点少的时侯,问题不大。输入点数多时就感觉比较花费RAM;
   拜读了很多大侠的**,感觉还是没找到比较好的方案,
   有没办法在中断里以最少的花费,最快的处理这些输入信号,因为一旦输入
采用中断,我的输出也得在中断里完成。
  C语言里又没比较简洁的方法对位操作,比如测试位状态,对位置1 等操作,
 (注:是51系列单片机系统)

相关帖子

沙发
zhaoyu2005| | 2007-2-2 17:38 | 只看该作者

C语言里有对位的操作,很简单的

测试位状态,置1,清零,移动什么的都有,只要汇编里有的指令都可以用C语言编出来,是你没学会,if  while = 

使用特权

评论回复
板凳
yzhj| | 2007-2-2 20:28 | 只看该作者

试试 这种方法

unsigned char bdata    pbin[2];

sbit    pbin00=pbin[0]^0;
sbit    pbin01=pbin[0]^1;
sbit    pbin02=pbin[0]^2;
sbit    pbin03=pbin[0]^3;
sbit    pbin04=pbin[0]^4;
sbit    pbin05=pbin[0]^5;
sbit    pbin06=pbin[0]^6;
sbit    pbin07=pbin[0]^7;
........

直接判断  pbin00 等即可. 虽然浪费点空间,但可以提高速度,降低编程难度.

使用特权

评论回复
地板
gyt| | 2007-2-2 22:56 | 只看该作者

不必要

不必要追求最少的花费和最快的处理。反正处理的都是按键之类的开关量,处理得再慢也是足够快的。

使用特权

评论回复
5
fsaok| | 2007-2-3 07:46 | 只看该作者

你还没入门

输入在中断中完成,把状态读进来就行了,和上一次的状态怎么样判断,消抖等就留着主程序去做

输出你喜欢怎么做就怎么做,没有规定,

C语言里有大量的简洁的方法对位操作,比如测试位状态,对位置1 ,移位等操作

通信/几个步进电机/计时,都是不花时间的活。

按键也太简单了,不管是多少,慢慢就可以。

51的RAM不够用的话,有大容量RAM的51,比如512RAM,大概也就够了吧。

我这次有个项目是200个开关量的,




使用特权

评论回复
6
无格|  楼主 | 2007-2-3 09:07 | 只看该作者

各位说的都有些道理,先谢过啦

这里说明下:
     硬件电路设计的不是太完善,没有象PLC样留出专门的IO口作为高速脉冲输出口;步进电机输出口与其他I/O共用,不用中断不可能弄出这么高的频率。
   我用的是STC52系列,用到了其片内eeprom,我的通讯数据有十多位;通讯只好采用中断发送,通讯/步进电机输出/EEPROM的擦除都是对中断/LED显示(我这里是32位数码管显示)都有影响的。所以中断要尽量简洁。
  我想fsaok的项目做到后面应该也会碰到类似问题吧。

  当然常用的相与/相或/异或/等位处理肯定是会的吧,只是觉得比如像汇编里面,对位测试/带位移等比较好用的命令没发现较合适的。 
   
  
  我比较欣赏PLC的一些做法,每个输入点都可以单独的检测上升沿,下将沿,可以读每个输入寄存器的状态,只是PLC现在都是采用32,有足够的RAM及足够快的速度。
    yzhj 的方法我现在输出也是采用这种方法,是比较方便。只是只用16个字节,sbit 变量要是能像数组样定义那就太妙了。

使用特权

评论回复
7
无格|  楼主 | 2007-2-3 09:20 | 只看该作者

象这样多个数码管动态扫描

的显示,好些地方处理不合适都会有些影响(闪动/亮度不够)。
  看到很多大侠研究实时多任务系统(本人没研究过),敢问下各位,象51资源这麽紧张的系统运用实时多任务系统意义大不大?

使用特权

评论回复
8
li_mu| | 2007-2-3 09:28 | 只看该作者

不要看国内的51书

有本英国佬的51书,专门讲51实时控制系统设计,感觉十分好,名字好像叫时间触发xxx

使用特权

评论回复
9
无格|  楼主 | 2007-2-3 10:17 | 只看该作者

感谢楼上的

我原本的习惯是,中断能不用尽量不用,留着要精确定时/通信/高速脉冲输出用。
  一是定时器实在是太宝贵了,
  二是有些函数还只能中断专用,要重复写些类似的函数看着不舒服。 
所以程序弄倒7/8k时还有得定时器可用。
 这回想换个办法精简下程序。
  这里我再细化下我的问题:
  1)想在定时器里采样输入信号,5个RAM作245输入存储,开机用掉5个RAM作 245初始状态输入存储。40个每个输入点需要40个RAM作按键输入次数计数。
  这样就活生生去掉50个RAM。
 2)不可能一次将40个输入点采集完,分5次采集,每次8个,要很快的知道是
   第几个点有输入变化。我原本在主程序中是逐个相与的办法来判断具体那一个点,输入点多时,ROM开销很大,也只好加大ROM/提高频率来解决。
   谢谢各位之点迷津

使用特权

评论回复
10
fsaok| | 2007-2-3 11:32 | 只看该作者

40 个按键只要 5 + 5 个字节储存就可以了

按键一般要求反应很慢,对于一个MCU来说,0.1秒已经可以完成很多东西了,

但要求人按一个键停留0.1秒,这个时间就太短了。何况还搞一些长按键?

所以,用定时器来说,一点问题都没有。

定时器是最好用的,即使没有定时任务,我写程序都会开定时器

使用特权

评论回复
11
s99060| | 2007-2-3 12:02 | 只看该作者

一个定时器也不是就只能定一个时哦

能给很多事件定时的嘛

使用特权

评论回复
12
无格|  楼主 | 2007-2-3 13:10 | 只看该作者

还是有点不明

fsaok大侠: 
 40个按键(输入信号) 5+5个就够?
   我的想法是因为要去抖,以及长按键的原因,所以对应每个输入点有变化时分别计时,以确定是否是长按键,压下多长时间?因为有多个长按键的情况发生(比如40个点都发生长按键事件)。
   这点还真不明白如何用最少的RAM到。

使用特权

评论回复
13
gyt| | 2007-2-3 13:30 | 只看该作者

和PLC的思路不同的

使用单片机和使用PLC的思路应该是不同的,8位单片机执行程序完成任务比32位的PLC快多了。而且,单片机的定时器是可以供所有动作共用的。明白了这一些,您的想法就会不同了。

使用特权

评论回复
14
无格|  楼主 | 2007-2-3 13:48 | 只看该作者

多谢各位指点

定时器的用法我还是知道的,简单不精确定时,不用定时器,在主程序里也可弄出好多个。
   但步进电机速度高时(尤其有两个以上)。定时器之间会相互打架了。电机的声音/数码管显示也不那么舒服了(不怕各位见笑,低速时,两三个步进电机控制我都不用定时器。)。再者,STC EEPROM擦除时很花时间,所以中断里面程序必须精简。

使用特权

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

本版积分规则

3

主题

84

帖子

1

粉丝