以X向移动为例(仅看前半字节),正向移动时对应的值为0b1000、0b1110、0b0111、0b0001,负向移动时对应的值为0b0010、0b1011、0b1101、0b0100。假设状态不变的情况已经排除,且查询周期足够短,不会出现相对周期的组合值。所以只要能将以上两组值区分开来就可以了,这也正是程序中两条条件判断语句的目的。读者可以对照程序自行验证。接口程序如下:
while(1){ state=PINA&0xcc; state_change=state^pre_state; combo_state=sate | (pre_state>>2); if(state_change & 0x0c) { if((combo_state & 0x06) == 0x06) {asm("INC R20");goto next;} if((combo_state | 0x09) == 0x09) {asm("INC R20");goto next;} asm("DEC R20"); } next: if(state_change & 0xc0) { if((temp & 0x60) == 0x60) {asm("INC R21");goto end;} if((temp | 0x90) == 0x90) {asm("INC R21");goto end;} asm("DEC R21"); } end:pre_state=state;}
程序已经事先定义了寄存器R20与R21分别为X、Y向的计数器,用来表示X、Y向移动的距离。以上程序段利用内嵌汇编语句优化了程序结构。实际上,还可以对编译器生成的汇编代码进行优化,这里就不再详述了。
结 语
以上软硬件接口设计虽然是以功能强大的AVR单片机作为例子,但通过仔细分析不难发现,在简单的应用场合,用普通的51单片机,甚至如AT89C2051在12 MHz晶振频率下也可以实现其功能。所以整个系统会是相当廉价的。
安捷伦公司最近在继hdns2000之后,又推出了升级芯片HDNS2051和适于无线应用的芯片HDNS2030,除了更强的处理能力外,主要改进还在于采用了单电源供电,提供了省电模式,去掉了不实用的PS/2接口,引入了同步串行口,允许用户对分辨率进行设置等。这些改进极大地方便了用户的使用,一方面扩大了其光学感测芯片市场占有率,另一方面无疑也为机电产品设计者提供了一种更强大、更方便、更廉价的运动检测方案。 |