设置中断以监视引脚变化

Posted

技术标签:

【中文标题】设置中断以监视引脚变化【英文标题】:Setting up interrupts to watch for pin change 【发布时间】:2013-08-05 17:53:54 【问题描述】:

我是使用这个微控制器的新手,在设置中断时遇到了麻烦。我将一个泵连接到一个引脚,当泵遇到错误时,泵将关闭并将连接到微控制器的开关接地。我猜我必须使用其中一个 PCINT 中断,因为我正在寻找引脚更改,但我不知道如何设置 EICRA 或 PCICR 以使其工作。如果有人有任何信息,那将有很大帮助。

【问题讨论】:

这个问题需要一些具体的信息。例如,您使用的 AVR 处理器的确切型号是什么?它是在专有板上还是“Arduino”板(如果有,是哪个板)?最后,为了让我的任务更轻松,如果可能,请发布指向 Atmel 手册(在他们的网站上)的链接,其中记录了您正在使用的特定处理器。 @JackCColeman 我在 olimex 开发板上使用 ATmega88PA。手册是atmel.com/Images/… 我还需要使用外部按钮作为中断。我大致了解中断的工作原理我只是不了解设置是否有意义。 也许您应该使用重要信息更新您的问题,而不是将其放入 cmets。 布莱恩,你看过我的回答了吗?是你要找的吗? 【参考方案1】:

*更新答案,硬件是 Atmega88。

#include <avr/io.h> 
#include <avr/interrupt.h> 

ISR (PCINT0_vect)
   /* This is where you get when an interrupt is happening */





int main(void)


    /*Assumes that you are using PCINT0.
     *It is also known as PB0
     */

    DDRB &= ~(1<<PB0); /* Set PB0 as input */
    PORTB |= (1<<PB0); /* Activate PULL UP resistor */ 

    PCMSK0 |= (1 << PCINT0); /* Enable PCINT0 */
    PCICR |= (1 << PCIE0); /* Activate interrupt on enabled PCINT7-0 */
    sei (); /* Enables interrupt */
    /* cli (); is used to disable interrupts. */ 
    for(;;)
    

    return 0;   

以上示例使用 PB0 作为输入并激活内部上拉电阻。 这将使 PINB 在接地之前为 1。接地时 PINB 为 0。

PCINT0 是激活的引脚,在 PCMSK 中设置。并且 PCICR 设置为捕获启用的 PCINT7 上的 Pin 更改为 0。

您可以在数据表中找到所有这些信息,这是很多信息,但如果您想知道如何使用 AVR,则必不可少。 Datasheet

您可以在以下位置找到有关 ISR()、sei()、cli() 的更多信息 nongnu.org 还有一个 ISR () 使用的向量的完整列表。

AVR Freaks 有一篇文章可以免费下载,它会帮助你理解它是如何工作的,这篇文章叫做“基本中断和 I/O”

我希望这能让你开始。

【讨论】:

嘿,我能够让一切正常工作,但我仍然有点困惑。我有中断工作,但我没有将 PB0 设置为输入,所以我不明白它是如何工作的。此外,我将不得不制作第二个 PCINT,但如果我想使用 pin16 的 PCINT2,我是否必须更改 PCICR 的定义方式才能使其工作?一旦我得到第二个中断工作,我最终将完成我的第一个项目。 @David Robertsson 感谢所有帮助 好吧,当您必须确定哪个引脚导致中断时,将它们设置为输入会派上用场。如果你想这样做,别忘了上拉电阻en.wikipedia.org/wiki/Pull-up_resistor 您的后续问题很棒。但是,为了避免评论污染,最好考虑一下你遇到的新问题,并编写一个新的好问题,这样其他人也可以回答。如果您遵循我在此处和答案中提供的建议,我相信您会找到您寻求的答案。

以上是关于设置中断以监视引脚变化的主要内容,如果未能解决你的问题,请参考以下文章

stm32中外部中断IO口设置后,会影响同一组的其他引脚吗?

如何启用多个中断 AVR

stm32 之引脚和各功能模块间关系

stm32中断配置出错

7.自己写中断方式按键驱动程序

2440按键中断编程