各位,请教一下在开源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();
} 这个我记得好像是做什么校验用的,个人觉得,一点用没有 IO输入主要靠硬件RC滤波+定时延时检测,这个IO输入只能简单用用。
照三菱的解释,本体上的输入点有软件滤波功能。我的实现方法是在1ms时钟对X输入点进行轮询进行判断,相同状态保持时间超过滤波时间就认为有输入。 谢谢楼上,如果对每个X输点都进行单独的轮询,这样占用的变量就是很多了吗??你能否贴你这部分的程序上来看看啊!! 顶一顶!! #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;
}
}
}
程序如上,只需要本体的输入点进行滤波 谢楼主,能否做一点注解,看得不是太明白,如 IO_P=(u32*)IN_IO这一句,IO_P是一位变量为什么要强制成u32呢??? IN_IO 这个是指针数组,指向实际的X0-X17 IO寄存器 u32是32位变量吗??为什么要用32位变量呢?? stm32的特性是这样的,bitband区都是32位范围,效率不低。 噢,我是用8位单片机没有用32位单片机啊,如果用8位机如何修改啊!!谢谢!! *(u8*);
*(u32*);
C学得不好,想问一下各位(u8*)和(u32*)中的星号代表什么意思??? mark 回复【10楼】fangmcu 方谭
-----------------------------------------------------------------------
(u8*),(u32*)指针的强制转换啊,在加个*就是指向的数了。对了,你这个代码哪里找的啊?我怎么没找到。 开源的PLC程序在哪里啊?
页:
[1]