为什么此功能不能正确打开和关闭LED?

篮筐15

我正在使用Atmel SAM3x8E微控制器,并在按下按钮时尝试进行简单的LED切换。我正在使用上拉配置按钮来触发中断例程。

这是中断的初始化:

// Set button pins as pull-up inputs 
pio_set_input(PIOC, BUTTON_1, PIO_PULLUP);
pio_set_input(PIOC, BUTTON_2, PIO_PULLUP); 

// Configure button input pin interrupt mode and handler (Rising Edge)
pio_handler_set(PIOC, ID_PIOC, BUTTON_1,  PIO_IT_RISE_EDGE, button_press_handler);
pio_handler_set(PIOC, ID_PIOC, BUTTON_2,  PIO_IT_RISE_EDGE, button_press_handler);

// Enable the interrupts
pio_enable_interrupt(PIOC, BUTTON_1); 
pio_enable_interrupt(PIOC, BUTTON_2); 
NVIC_EnableIRQ(PIOC_IRQn); 
NVIC_EnableIRQ(PIOC_IRQn); 

然后这是中断例程:

// Interrupt handler for button press
void button_press_handler(uint32_t a, uint32_t b)
{
   pio_toggle_pin_group(PIOC, BLUE_LED4); // NOT TOGGLING LED (ONLY TURNS IT ON)
}

但是,当我运行它时,我无法使LED切换。它只是打开并保持打开状态。pio_toggle_pin_group调用的函数如下:

 * \param p_pio Pointer to a PIO instance.
 * \param ul_mask Bitmask of one or more pin(s) to configure.
 */
void pio_toggle_pin_group(Pio *p_pio, uint32_t ul_mask)
{
    if (p_pio->PIO_ODSR & ul_mask) {
        /* Value to be driven on the I/O line: 0. */
        p_pio->PIO_CODR = ul_mask;
    } else {
        /* Value to be driven on the I/O line: 1. */
        p_pio->PIO_SODR = ul_mask;
    }
}

关于为什么我的LED不切换我想要的方式的任何想法?我已经参考过Atmel ASF文档,但仍然无法弄清楚。

对这个网站太老实了

我无法帮助您进行实际的函数调用,但是假设您使用边缘中断。据我所知,您为每个上升沿调用一个中断处理程序。但是,在第一个上升沿之后,您需要在按钮释放时触发,这将是下降沿,因此您需要在中断处理程序中更改该沿。

但是您必须考虑到,机械按钮在按下或释放时不会产生干净的单个边缘。相反,它会反弹。对于带有上拉(或下拉)电阻器的常规瞬时接触按钮,每次事件都会导致多个脉冲,因此LED可能会多次打开/关闭并停留在任意状态,这很可能会“打开”很远大多数时候。如果可用,请用示波器检查。

可以通过电容器在硬件中进行规避,或者使用计时器在软件中进行规避,该定时器在相关沿之后的空载时间之后才对任何其他按钮事件做出反应。空载时间取决于按钮的类型,但是典型值是5到20ms,应在按钮的数据表中提及。如有疑问,请使用最高可接受值。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么此功能不能正确打开和关闭LED?

来自分类Dev

为什么此功能不能在即7,8(延迟和淡入)上起作用?

来自分类Dev

为什么此功能不能在即7,8(延迟和淡入)上起作用?

来自分类Dev

为什么此Perl随机播放功能不能随机播放?

来自分类Dev

为什么此功能不能打印所有值?

来自分类Dev

为什么Linux中的“系统”功能不能运行此shellscript?

来自分类Dev

为什么RHR功能不能超载?

来自分类Dev

为什么该记忆功能不能线性运行?

来自分类Dev

为什么列表删除功能不能删除空格?

来自分类Dev

为什么这个功能不能正常工作?

来自分类Dev

为什么我的 Javascript 功能不能正常工作?

来自分类Dev

为什么此功能不能在Selenium正常工作的情况下刮擦表?

来自分类Dev

为什么此功能不能在Selenium正常工作的情况下刮擦表?

来自分类Dev

为什么某些Emacs功能不能通过`Mx`使用?

来自分类Dev

为什么这个jQuery remove功能不能正常工作?

来自分类Dev

为什么我的“获取”功能不能真正获取字符串?

来自分类Dev

为什么Knockout的点击编辑功能不能在表格中使用多个值?

来自分类Dev

为什么仅声明朋友功能不能具有默认参数?

来自分类Dev

为什么循环功能不能与空列表一起使用?

来自分类Dev

为什么同步睡眠功能不能通过内部承诺使异步?

来自分类Dev

为什么我的堆排序功能不能按预期工作?

来自分类Dev

为什么多层异步功能不能捕获节点最低级别抛出的错误?

来自分类Dev

为什么我的功能不能正常工作两次?

来自分类Dev

为什么我的删除功能不能将节点从BST中删除?

来自分类Dev

为什么仅声明朋友功能不能具有默认参数?

来自分类Dev

为什么循环功能不能与空列表一起使用?

来自分类Dev

为什么该功能不能在油脂猴子上使用

来自分类Dev

为什么计数功能不能在Spark中使用mapvalues?

来自分类Dev

为什么信号功能不能使用信号工作?

Related 相关文章

  1. 1

    为什么此功能不能正确打开和关闭LED?

  2. 2

    为什么此功能不能在即7,8(延迟和淡入)上起作用?

  3. 3

    为什么此功能不能在即7,8(延迟和淡入)上起作用?

  4. 4

    为什么此Perl随机播放功能不能随机播放?

  5. 5

    为什么此功能不能打印所有值?

  6. 6

    为什么Linux中的“系统”功能不能运行此shellscript?

  7. 7

    为什么RHR功能不能超载?

  8. 8

    为什么该记忆功能不能线性运行?

  9. 9

    为什么列表删除功能不能删除空格?

  10. 10

    为什么这个功能不能正常工作?

  11. 11

    为什么我的 Javascript 功能不能正常工作?

  12. 12

    为什么此功能不能在Selenium正常工作的情况下刮擦表?

  13. 13

    为什么此功能不能在Selenium正常工作的情况下刮擦表?

  14. 14

    为什么某些Emacs功能不能通过`Mx`使用?

  15. 15

    为什么这个jQuery remove功能不能正常工作?

  16. 16

    为什么我的“获取”功能不能真正获取字符串?

  17. 17

    为什么Knockout的点击编辑功能不能在表格中使用多个值?

  18. 18

    为什么仅声明朋友功能不能具有默认参数?

  19. 19

    为什么循环功能不能与空列表一起使用?

  20. 20

    为什么同步睡眠功能不能通过内部承诺使异步?

  21. 21

    为什么我的堆排序功能不能按预期工作?

  22. 22

    为什么多层异步功能不能捕获节点最低级别抛出的错误?

  23. 23

    为什么我的功能不能正常工作两次?

  24. 24

    为什么我的删除功能不能将节点从BST中删除?

  25. 25

    为什么仅声明朋友功能不能具有默认参数?

  26. 26

    为什么循环功能不能与空列表一起使用?

  27. 27

    为什么该功能不能在油脂猴子上使用

  28. 28

    为什么计数功能不能在Spark中使用mapvalues?

  29. 29

    为什么信号功能不能使用信号工作?

热门标签

归档