[PIC®/AVR®/dsPIC®产品] 【CuriosityNano测试报告】+ AVR128DA48之按键中断方式测试已成功

[复制链接]
2036|7
 楼主| hu9jj 发表于 2020-8-16 10:05 | 显示全部楼层 |阅读模式
本帖最后由 hu9jj 于 2020-8-19 17:48 编辑

    之前测试过按键的轮询方式,继而自然要测试按键的中断方式。从原理图上可以看出是键按下时引脚为低电平:

    配置MCC时在引脚管理中选择下降沿触发:



    生成代码之后,在pin_manager.c文件中可以指定中断处理的函数,我使用默认的,未作修改:


    在中断处理函数中写上代码:


    首先延时20ms,再读取PC7的电平。为了防止重复进入按键处理,我设置了一个keyok的标志,只有keyok=0时才接收按键,接收按键后标志置1,然后在主循环中处理按键,处理之后又将标志归0,以便可以接收下次按键,代码如下:
    while (1){
        ms++;
        if(ms > wait){
            LED_Y_Toggle();
            ms = 0;
        }

        if(1 == keyok){
            wait <<= 1;
            if(wait > 40000)
                wait = 2000;
            keyok = 0;
            keys = 0;
        }


    上述的步骤貌似没有问题,原来设想是每按一次按键就将wait变量翻倍,以达到改变LED闪烁时间的效果。可是编译下载之后,没有按键动作,LED灯却自动改变闪烁频率并周期性变化,如同按下按键一般。反复检查了多次,没有发现问题所在,本次测试又没有成功。
2020.08.19
    在大家的热心帮助下,参照了6楼的代码,按键中断方式的问题已经解决,测试通过了,详见8楼。




本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
lcczg 发表于 2020-8-17 15:08 | 显示全部楼层
按键管脚有没有设为高电平上拉?图上看着没有。
qjp1988113 发表于 2020-8-17 15:36 | 显示全部楼层
中断里面变量加上volitile修饰,再试试看。
CoolSilicon 发表于 2020-8-17 20:19 | 显示全部楼层
其实,你可以先控制一个IO口输出方波的看看.能行的话,修改一下方向,就是输入做key用了..也简单..
 楼主| hu9jj 发表于 2020-8-18 08:24 | 显示全部楼层
lcczg 发表于 2020-8-17 15:08
按键管脚有没有设为高电平上拉?图上看着没有。

引脚设置了高电平的,用轮询法测试通过,但用中断法却不正常。
lcczg 发表于 2020-8-18 11:07 | 显示全部楼层
本帖最后由 lcczg 于 2020-8-18 11:11 编辑

有可能逻辑上的问题。我也搞了个小的测试工程,测下来可以的。按键一下亮一下灯。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
 楼主| hu9jj 发表于 2020-8-19 09:54 | 显示全部楼层
lcczg 发表于 2020-8-18 11:07
有可能逻辑上的问题。我也搞了个小的测试工程,测下来可以的。按键一下亮一下灯。 ...

谢谢!我好好学习一下您的测试工程,对照一下看是什么原因。
 楼主| hu9jj 发表于 2020-8-19 17:23 | 显示全部楼层
本帖最后由 hu9jj 于 2020-8-19 17:48 编辑

    下载并打开了6楼提供的测试项目,在进入MCC时出现了升级提示:


    在升级的过程中程序似乎死循环了,等待了十几分钟后,无奈启用任务管理器结束MPLAB。再重新启动MPLAB,打开我的测试仪项目,进入MCC后,定时器配置中就出现了时间的上下限数值,也许就是升级了某个包起了作用:


    然后参考6楼的代码,在变量ms和keyok的定义中添加了volatile,最后编译烧录,定时器正常运行了。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:Microchip
简介:让我们来为您提供帮助。我们可提供各种资源来帮助您解决一切问题。是否需要与我们的客户支持团队联系?您可以通过电话、在线聊天功能或电子邮件与他们联系。

151

主题

1063

帖子

11

粉丝
快速回复 在线客服 返回列表 返回顶部