terça-feira, 24 de julho de 2012

Interrupções Externas no Arduino.

O Atmega328 do Arduino possui 2 interrupçoes externas que se encontrão nos pinos digitais 2 (INT0), e 3(INT1). Para ativa-las você precisa do comando attachInterrupt.

Sintaxe:

attachInterrupt (interrupção, função, modo)


interrupção : o número da interrupção ( int )

função : a função para chamar quando a interrupção ocorre.

modo: define quando a interrupção deve ser disparada. Quatro contantes são pré-definidos como valores válidos:
LOW para desencadear a interrupção quando o pino é baixa,
CHANGE para acionar a interrupção sempre que há alterações no valor do pino,
RISING para disparar quando o pino vai de baixo a alto,
FALLING para quando o pino vai de alto para baixo

Exemplo:

int pin = 13;
volatile int state = LOW;
void setup()
{
  pinMode(pin, OUTPUT);
  attachInterrupt(0, blink, CHANGE);
}
void loop()
{
  digitalWrite(pin, state);
}
void blink()
{
  state = !state;
}

Observe que a interrupção usada foi a do pino 2 (INT0); a função usada foi "blink" e que ele foi ativado, na mudança de valor do pino.


3 comentários:

  1. Teria como utilizar 3 interrupçoes no atmega 328p. Qualquer uma das tres que mudar o estado, executa a função e volta a dormir. Obrigado

    ResponderExcluir
  2. Teria como utilizar 3 interrupçoes no atmega 328p. Qualquer uma das tres que mudar o estado, executa a função e volta a dormir. Obrigado

    ResponderExcluir
    Respostas
    1. Tem sim.... você pode usar esse código abaixo como exemplo.

      void setup(){
      pinMode(2,INPUT);
      pinMode(11,OUTPUT);
      }

      void loop(){
      if(digitalRead(2) == HIGH){
      delay(250);
      digitalWrite(11,!digitalRead(11));
      }
      }


      nele você pode acender e apagar um led no pino 11 usando um botão que esta no pino 2.
      Qualquer pino que for configurado dessa forma pode funcionar simultaneamente como interrupção.
      Sobre executar uma função, você pode substituir o void loop por esse abaixo e adicionar a rotina 'void botao2', onde você pode criar o código que você precisa. Ao termino da rotina criada em 'void botao2' ele ira retornar para o loop...

      void loop(){
      if(digitalRead(2) == HIGH){
      botao2();
      }

      void botao2(){
      //execute seu codigo aqui....
      }

      Excluir