下文将介绍 AND (&) Bitwise 逻辑并阐明博文《直接端口的操作案例》中介绍的概念。在该示例中,通过多个按钮和电位计控制器来操作由步进电机驱动的摄像头滑块。所选的微控制器在许多端口上都分布了有限的 I/O,这是通过将 I/O 汇编成单一数字值来实现的。
概览
在软件中评估开关输入时,常常从有用的 if/then 语句开始。这对于独立输入可能很有用,但对于多个交互式输入来说则不然。用 if/then 语句涵盖所有的按钮组合,可能会产生数百行代码和每周期中大量的执行任务。实施 Bitwise 逻辑可以最大限度地减少代码,提高周期速度。
项目参数
摄像头滑块项目涉及五个瞬时接触 SPST 开关,这些开关用于在滑块驱动电机的工作过程中选择方向和速度。将输入转换为 SPEED/ENABLE/DIRECTION 输出。开关按压操作与多开关按压识别功能同时在软件中锁定。
AND Bitwise 运算符
摄像头滑块的主要位运算符是 AND。该运算器使用 C 语言编程中的安培 (&) 符号,使用图 1 中的真值表。
图 1:AND Biwise 运算符的真值表及示例。(图片来源:Don Johanneck)
I/O 组合
为了确立一个能代表所有开关的单值,把位移至所需的位置,进行相加并使用 AND 运算符进行比较(见图 2)。另一个代表极限传感器当前状态的值与开关按压值进行比较,以便在达到极限时取消输出。
图 2:摄像头滑块开关的配置,位的编译以及 AND 运算符的使用。(图片来源:Don Johanneck)
在这种情况下,如果按下任何一个按钮或按钮组合,则 buttonValues 不等于零,并在软件中通过 limitValue 和查找表进行操作,以确定输出,这与前面提到的直接端口操作博文中描述的方法完全相同。
编程
该程序使用由经过处理的输入值索引而成的输出值表。程序员可以通过改变表数值来确定按任何组合的按钮所产生的动作,这样就不需要改变程序结构,否则结构更改可能是令人望而生畏的。在该示例中,图 3 中的表值代表了单个、多个和对立的按钮动作,不需要单独 IF 语句(图 4)。
图 3:由输入值索引而成的唯一输出值表。
图 4:主代码;读取数值和确定输出。
电机控制是通过一个用来确定步进频率的定时器中断服务例程以及一种“跳跃”方法实现的,这种方法通过仅在 stepGo 变量等于或大于 stepFreq 变量时设置电机控制板上的 STEP 引脚来简化速度控制(图 5)。较低的电位器值使该例程跳过了更多的 STEP。
图 5:电机控制的中断服务例程。
结论:
使用诸如 AND (&) 这样的位运算符可以简化代码,并大大减少解析数字输入所需的 IF 语句的数量。输出表的建立简单而灵活。使用更多的输出位可以快速扩展输出表,提供更多的输出选择。每一个增加的输出位都需要在主代码中增加一个(或几个)处理程序。一旦输出表建立,该表就会在每个周期内只使用一次,而由主代码完成繁重的工作。中断服务例程在后台稳定地运行,更新电机控制器的 STEP 引脚,但在主代码切换电机控制器的使能 (ENN) 引脚之前,不会发生运动。
全部0条评论
快来发表一下你的评论吧 !