如何在C中为Arduino创建中断?

时间:2011-04-10 22:14:37

标签: c arduino

所以我在C中为Arduino做了这个代码。它用于控制步进电机。但每次我必须等到微控制器开始一个新的循环以便它可以获取新变量的值时,如何创建一个中断,以便它在程序的任何时候都可以这样做?

#include <avr/io.h>
#define F_CPU 4000000UL
#include <util/delay.h>

#include "IO/ioconfig.h"
#include "leebotones/leebotonesA.h"
#include "leebotones/leebotonesB.h"
#include "rutina/avanza.h"
#include "rutina/retrocede.h"

char variableA = 0;
char variableB = 0;

int main(void){
    ioconfig();
    while(1) {
        if (leebotonesA()==1) {
            variableA++;
        } //Fin de if leebotonesA.

        if (leebotonesB()==1) {
            if (variableA==0) {
                variableB=1;
            }
            else {
                variableB=0;
            }
        }

        if (variableA==2) {
            variableA=0;
            PORTD=0x00;
            _delay_ms(10000);
        } //Fin de if variableA.

        if (variableA==1 && variableB==0) {
            avanza();
        } //Fin de if leebotonesA.

        if (variableA==1 && variableB==1) {
            retrocede();
        }
        _delay_ms(25);
    }//End of while
}// End of main

2 个答案:

答案 0 :(得分:3)

当其中一个中断引脚接收到状态变化时,会发生Arduino上的硬件中断。如果您有权访问Arduino库,则使用的函数是attachInterrupt

侦听中断的示例代码(源自我链接到的文档,我添加了注释以帮助解释):

// The Arduino has an LED configured at pin 13
int pin = 13;
// Holds the current state of the LED to handle toggling
volatile int state = LOW;

void setup()
{
  pinMode(pin, OUTPUT);
  // First Parameter:
  // 0 references the interrupt number. On the Duemilanove, interrupt 0
  // corresponds to digital pin 2 and interrupt 1 corresponds to digital pin
  // 3. There are only two interrupt pins for the Duemilanove and I believe
  // the Uno too.
  // Second Parameter:
  // blink is the name of the function to call when an interrupt is detected
  // Third Parameter:
  // CHANGE is the event that occurs on that pin. CHANGE implies the pin
  // changed values. There is also LOW, RISING, and FALLING.
  attachInterrupt(0, blink, CHANGE);
}

void loop()
{
  // Turns the LED on or off depending on the state
  digitalWrite(pin, state);
}

void blink()
{
  // Toggles the state
  state = !state;
}

每个引脚都支持引脚更改中断的概念。有关详细信息,请参阅introduction to interrupts的底部。

但是,有时通过重构代码可以避免硬件中断。例如,保持loop()快速运行 - 主要是读取输入,限制使用delay()---并在循环中,在检测到目标输入值时调用函数。

答案 1 :(得分:0)

MSTimer2是一个Arduino库函数,可以让你设置定时器中断。

延迟而不是中断的另一种替代方法是设置定时器并在每次循环时检查它。 http://arduino.cc/en/Tutorial/BlinkWithoutDelay解释了这些概念。 Metro库http://arduino.cc/playground/Code/Metro实现了这一点并且易于使用。我用它而不是延迟(),以便在我的机器人移动时检查按钮按下。