fangmcu 发表于 2010-3-31 16:33:48

各位,请教一下在开源PLC程序中,input_IO这段程序怎样理解,谢谢!!

void input_IO(void)         // X输入,Y输出刷新
{ unsigned char i;
i = P2;
i = ((i << 1) & 0xaa) | ((i >> 1) & 0x55); 特别是两行不知怎样理解
i = ((i << 2) & 0xcc) | ((i >> 2) & 0x33);
rX.BYTE = ~((P1 & 0x0f) | (i & 0xf0));
rX.BYTE = ~(i & 0x0f) & 0x0f;
rX.BYTE = ~Get_EX_BIT();
P0 = rY.BYTE;
Out_EY_BIT();
}

heky 发表于 2010-3-31 17:24:24

这个我记得好像是做什么校验用的,个人觉得,一点用没有

heky 发表于 2010-3-31 17:25:17

IO输入主要靠硬件RC滤波+定时延时检测,这个IO输入只能简单用用。

照三菱的解释,本体上的输入点有软件滤波功能。我的实现方法是在1ms时钟对X输入点进行轮询进行判断,相同状态保持时间超过滤波时间就认为有输入。

fangmcu 发表于 2010-3-31 23:01:12

谢谢楼上,如果对每个X输点都进行单独的轮询,这样占用的变量就是很多了吗??你能否贴你这部分的程序上来看看啊!!

fangmcu 发表于 2010-4-1 10:23:15

顶一顶!!

heky 发表于 2010-4-1 11:14:57

#define X_Filter_Timer_Base (SYSTEM_BASE+0xBA0) //X0-X17 16Bytes 滤波寄存器

   //X0-X17 14点滤波
    for(loop=0;loop<14;loop++)
    {
      IO_P=(u32*)IN_IO;
      if(*IO_P)
      {
      *(u8*)(X_Filter_Timer_Base+loop)=0;
      *(u32*)(X_IN+4*loop)=0;
      }
      else
      {
      if(*(u8*)(X_Filter_Timer_Base+loop)>=D8020)
      {
          *(u32*)(X_IN+4*loop)=1;
      }
      else
      {
          *(u8*)(X_Filter_Timer_Base+loop)+=1;         
      }
      }
    }
程序如上,只需要本体的输入点进行滤波

fangmcu 发表于 2010-4-1 16:31:14

谢楼主,能否做一点注解,看得不是太明白,如 IO_P=(u32*)IN_IO这一句,IO_P是一位变量为什么要强制成u32呢???

heky 发表于 2010-4-1 16:51:23

IN_IO 这个是指针数组,指向实际的X0-X17 IO寄存器

fangmcu 发表于 2010-4-2 15:35:25

u32是32位变量吗??为什么要用32位变量呢??

heky 发表于 2010-4-2 16:21:09

stm32的特性是这样的,bitband区都是32位范围,效率不低。

fangmcu 发表于 2010-4-2 16:55:55

噢,我是用8位单片机没有用32位单片机啊,如果用8位机如何修改啊!!谢谢!!

fangmcu 发表于 2010-4-15 11:17:33

*(u8*);
*(u32*);
C学得不好,想问一下各位(u8*)和(u32*)中的星号代表什么意思???

TS0806143 发表于 2010-9-17 09:08:40

mark

shuangbang 发表于 2010-9-26 10:19:44

回复【10楼】fangmcu 方谭
-----------------------------------------------------------------------

(u8*),(u32*)指针的强制转换啊,在加个*就是指向的数了。对了,你这个代码哪里找的啊?我怎么没找到。

jkl0918 发表于 2011-11-23 20:55:36

开源的PLC程序在哪里啊?
页: [1]
查看完整版本: 各位,请教一下在开源PLC程序中,input_IO这段程序怎样理解,谢谢!!