0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

用Bitwise逻辑运算符进行设计

微云疏影 来源:Digi-Key 作者:Digi-Key 2022-04-12 15:02 次阅读

下文将介绍 AND (&) Bitwise 逻辑并阐明博文《直接端口的操作案例》中介绍的概念。在该示例中,通过多个按钮和电位计控制器来操作由步进电机驱动的摄像头滑块。所选的微控制器在许多端口上都分布了有限的 I/O,这是通过将 I/O 汇编成单一数字值来实现的。

概览

在软件中评估开关输入时,常常从有用的 if/then 语句开始。这对于独立输入可能很有用,但对于多个交互式输入来说则不然。用 if/then 语句涵盖所有的按钮组合,可能会产生数百行代码和每周期中大量的执行任务。实施 Bitwise 逻辑可以最大限度地减少代码,提高周期速度。

项目参数

摄像头滑块项目涉及五个瞬时接触 SPST 开关,这些开关用于在滑块驱动电机的工作过程中选择方向和速度。将输入转换为 SPEED/ENABLE/DIRECTION 输出。开关按压操作与多开关按压识别功能同时在软件中锁定。

pYYBAGJVJA2AVhXbAACH6rtTBqU965.jpg

AND Bitwise 运算符

摄像头滑块的主要位运算符是 AND。该运算器使用 C 语言编程中的安培 (&) 符号,使用图 1 中的真值表。

poYBAGJVJA2ASw1mAAA0nZ7R75k254.jpg

图 1:AND Biwise 运算符的真值表及示例。(图片来源:Don Johanneck)

I/O 组合

为了确立一个能代表所有开关的单值,把位移至所需的位置,进行相加并使用 AND 运算符进行比较(见图 2)。另一个代表极限传感器当前状态的值与开关按压值进行比较,以便在达到极限时取消输出。

pYYBAGJVJA2AXA5zAAB06ZELRI0517.jpg

图 2:摄像头滑块开关的配置,位的编译以及 AND 运算符的使用。(图片来源:Don Johanneck)

在这种情况下,如果按下任何一个按钮或按钮组合,则 buttonValues 不等于零,并在软件中通过 limitValue 和查找表进行操作,以确定输出,这与前面提到的直接端口操作博文中描述的方法完全相同。

编程

该程序使用由经过处理的输入值索引而成的输出值表。程序员可以通过改变表数值来确定按任何组合的按钮所产生的动作,这样就不需要改变程序结构,否则结构更改可能是令人望而生畏的。在该示例中,图 3 中的表值代表了单个、多个和对立的按钮动作,不需要单独 IF 语句(图 4)。

poYBAGJVJA6ANN_iAABW9Z5ZB98917.jpg

图 3:由输入值索引而成的唯一输出值表。

pYYBAGJVJA6AT_IEAABSe6eZ2PI384.jpg

图 4:主代码;读取数值和确定输出。

电机控制是通过一个用来确定步进频率的定时器中断服务例程以及一种“跳跃”方法实现的,这种方法通过仅在 stepGo 变量等于或大于 stepFreq 变量时设置电机控制板上的 STEP 引脚来简化速度控制(图 5)。较低的电位器值使该例程跳过了更多的 STEP。

poYBAGJVJA6AafwPAAA2EFniX70951.jpg

图 5:电机控制的中断服务例程。

结论:

使用诸如 AND (&) 这样的位运算符可以简化代码,并大大减少解析数字输入所需的 IF 语句的数量。输出表的建立简单而灵活。使用更多的输出位可以快速扩展输出表,提供更多的输出选择。每一个增加的输出位都需要在主代码中增加一个(或几个)处理程序。一旦输出表建立,该表就会在每个周期内只使用一次,而由主代码完成繁重的工作。中断服务例程在后台稳定地运行,更新电机控制器的 STEP 引脚,但在主代码切换电机控制器的使能 (ENN) 引脚之前,不会发生运动。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 控制器
    +关注

    关注

    112

    文章

    15245

    浏览量

    171352
  • 定时器
    +关注

    关注

    23

    文章

    3148

    浏览量

    112151
  • 逻辑运算
    +关注

    关注

    0

    文章

    46

    浏览量

    9712
收藏 人收藏

    评论

    相关推荐

    逻辑运算符两侧运算对象的数据类型是

    逻辑运算符是编程中常用的运算符之一,用于判断两个表达式之间的关系,并返回布尔值结果。在逻辑运算中,两侧运算对象的数据类型可以是任意类型。 首先,我们需要了解
    的头像 发表于 11-30 14:15 779次阅读

    python中运算符的优先级大小

    解。 Python中的运算符可以分为以下几类:算术运算符、比较运算符逻辑运算符、位运算符、赋值运算符
    的头像 发表于 11-29 16:21 538次阅读

    python运算符优先级顺序口诀

    Python是一种非常流行的编程语言,具有广泛的应用领域。在Python中,运算符进行各种数学和逻辑运算的关键部分。了解运算符的优先级顺序对于正确理解和书写Python代码至关重要。
    的头像 发表于 11-22 14:34 781次阅读

    使用“~”运算符对单bit信号进行取反

    使用“~”运算符对单bit信号进行取反(也称为位翻转或反向)。
    的头像 发表于 11-08 09:28 614次阅读

    C语言运算符的使用方法

    详细介绍了C语言表达式、算术运算符、赋值运算符、关系运算符、条件结构、逻辑运算符、位运算符的语法和使用方法,并讨论了
    发表于 11-02 11:30 518次阅读
    C语言<b class='flag-5'>运算符</b>的使用方法

    请问IAR中的sizeof是一种运算符吗?

    IAR中的sizeof是一种运算符吗?是怎么实现的?
    发表于 10-08 06:44

    verilog的逻辑运算符

    写在前面 之前曾经整理过verilog的各类运算符的表达方式,但是在学习的过程中并未深入研究关于逻辑运算符的相关知识,导致在实际使用过程中错误频出,下面是我从网络上整理的相关verilog的逻辑运算符
    的头像 发表于 09-21 10:07 949次阅读
    verilog的<b class='flag-5'>逻辑运算符</b>

    C语言中逻辑运算符的使用方法及优先级关系

    逻辑运算符是用来比较和操作布尔值的运算符
    发表于 08-21 14:46 823次阅读
    C语言中<b class='flag-5'>逻辑运算符</b>的使用方法及优先级关系

    【触觉智能 Purple Pi OH 开发板体验】+ Linux下位逻辑运算的实现

    在Linux下只有条件的逻辑运算,却并没有位逻辑运算,然而在实际应用中逻辑运算又是使用非常广泛的,为此可自行设计出这样的函数以供需要。 1)与逻辑
    发表于 08-18 08:52

    【verilog每日一练】基本逻辑运算符的使用

    组合逻辑实现以下运算
    发表于 08-11 10:32

    C语言基础知识(一)

    ,并使用赋值后的值进行计算和操作。 3. 运算符C语言提供了多种运算符,用于执行各种数学和逻辑运算。以下是一些常见的C语言运算符:算术
    发表于 08-10 15:16

    C语言基础知识(一)

    ,并使用赋值后的值进行计算和操作。 3. 运算符C语言提供了多种运算符,用于执行各种数学和逻辑运算。以下是一些常见的C语言运算符:算术
    发表于 08-07 16:51

    KUKA机器人的逻辑运算符

    逻辑运算符用于布尔变量、常数和简单的、借助比较运算符构成的逻辑表达式的逻辑运算
    发表于 07-21 10:06 1496次阅读
    KUKA机器人的<b class='flag-5'>逻辑运算符</b>

    C语言基础知识(4)--运算符

    C语言中,运算符包括有算术运算符、关系运算符逻辑运算符和位运算
    的头像 发表于 06-15 09:38 2248次阅读

    Go语言运算符主要包括哪些呢?

    Go语言运算符主要包括:算数运算符、关系运算符逻辑运算符、位运算符、赋值运算符和其他
    的头像 发表于 05-26 15:54 610次阅读
    Go语言<b class='flag-5'>运算符</b>主要包括哪些呢?