libai500 发表于 2023-10-29 16:13:55

ASRPRO_小白玩转PA0按键输入触发播报和点灯

本帖最后由 libai500 于 2023-11-27 20:07 编辑

PA0引脚按键输入触发播报和点灯

阅读本帖内容之前,清确认已经阅读了上述图片中的内容,即二十几个基础返利和编程手册各个章节。


测试程序(已编译好,可直接下载。运行天问Block文件夹下ASRPRP\makebin.exe。选择本bin文件即可)

原工程文件在天问Block_ASRPRO设备画面_范例库_更多范例_最新项目里,搜索小白系列或同名关键字即可找到

本范例电路示意图



本范例程序讲解:
一、程序全图概述


    上图是软件工程工体布局。大致分为三列,自定义功能列,基础配置列和应用功能列。
    当前自定义功能列中,我们已经封装好了异步播报服务系列功能和引脚检测功能。
    有朋友会问,一个PA0引脚输入检测,要这么大规模阵势么?
    当然不是,工程中还包含全新的播报服务概念,这正是我们着一系列范例的热点之一:注重实战,注重辅助功能搭配。不单单是验证某功能行不行,也要考虑整体应用构架。
    对于一个图形工程来说,合理的布局,后期在实战应用设计上回事半功倍。
    因本范例是介绍引脚输入信号检测的,我们主要介绍引脚单击功能,播报服务另行介绍。
二、按键单击程序图形设计

(关于上图自定义功能函数设计技巧,另有章节介绍)
   
    如上图,功能重点就是引脚单击检测,也就是上下降沿检测。
    该循环任务,以至少100mS循环间隔不但调用引脚单击检测功能函数,捕获引脚信号的上下降沿。如果发生上升沿(即返回信息为1),播报语音上升沿。反之,播报语音下降沿。
    那么有新入门的新朋友,可能不知道为什么要检测上下降沿,什么叫上升沿,下降沿?我看下面图片。

    如上图所示,我们只需要捕获电平变化的那一刻信息。而其他时间的状态,我们不理会。
    当按键单击发生时,有两个过程,一个是上升沿(按键按下),一个是下降沿(按键抬起)。捕获到了这两个信号,就能在按键有动作时,执行需要的程序。
    有不少入门朋友只判断信号为高,还是为低,是无法锁定单击的,会导致信号重复。捕获上下降沿,能确保只有信号变化时程序才执行一次,而不是一味地因高电而执行,或一味地因低电平而执行。
三、上升沿下降沿捕获的软件实现
1.为什么要用软件方式捕获变化沿?
    我们都知道,外部中断和PCA模块都可以快速捕获信号变化,但一般是用于微秒甚至纳秒级高速捕获,一般的按键信号、普通传感器开关甚至软信号都是100毫秒级低速信号,使用硬件捕获,大材小用。因此通常用软件方式实现捕获。
2.软件捕获上下降沿的原理
    原理很简单,我们只要以远高于信号变化的速度,不断读取信号,并与上一次读取的信号进行比较,判断该信号是否发生变化,如果变化了,是由低变高还是由高变低,前者就是发生了上升沿,后者就是发生了下降沿。如果新读取到的信号与上一次信号一致,没有变化,说明没有发生上升沿或下降沿。
    对于普通按键信号,大约是50mS变化率,没有按键变化速度能快于50mS,因此我们对该信号的采集速度保持10mS到5mS就足够了。
    另外我们再每次读取信号并比较后,讲本次信号记录为上次信号,以便下一次能与最新的信号进行比较。
3.具体编程方法(手把手)
第一步 放置一个新建线程


    如上图,放置一个新建线程,用于50mS低速信号检测。
第二步 配置线程

    如上图,命名线程为AppKeyScan,每轮扫描空闲10mS,确保扫描速度是50mS的五倍,同时释放更多时间给其他任务。
第四步 创建两个存储数据的私有变量

    如上图,创建变量。

    如上图,变量为私有变量,分别命名为p00上次和p11本次。
    p00和p11是为了方便代码模式中分清中文名。应为中文命名变量再代码区中无法分辨内容。
第五步 初始阿虎PA0引脚

    如上图,我们初始化PA0引脚为内置下拉,GPIO输入模式。准备用PAO引脚检测按键状态。
    这些初始化指令在GPIO指令组中可以找到。
第六步 读取引脚状态

    如上图,读取引脚PA0状态,并赋值为p01。
第七步 当前状态与上一次状态进行比较

    如上图,对当前状态与上次状态进行比较,如果当前状态与上次状态不一样,说明发生了变化。
第八步 继续判断当前状态是不是高电平

    如上图,我们即将完成按键上下降沿检测程序。
    当引脚状态发生变化后,如果当前引脚状态是高电平,说明发生了上升沿,反之则说明发生的事下降沿。
第九步 记录本次状态

    如上图,记录当前状态到p00,下一次循环比较会用到。就此上下降沿软件捕获程序编写完毕。
    注意,为了不影响AppKeyScan线程的循环速度,我们不能在检出判断里添加过多的执行程序,我们遵循嵌入式系统多任务原则,发消息给其他任务线程,把上下降沿的检测结果,发送到其他任务中,让其他任务根据检测结果来执行响应的任务。

下图实现了检测结果的消息传递,将检测结果直接发送到另一个线程任务AppPlay,由AppPlay负责播报检测结果。

上述范例工程在天问画面-范例代码-更多范例-最新项目里能搜到

YJEC 发表于 2023-10-30 10:58:53

感谢老师指导!顶
页: [1]
查看完整版本: ASRPRO_小白玩转PA0按键输入触发播报和点灯