No Arduino, assim como em qualquer outro microcontrolador, pode-se utilizar interrupções para priorizar ou não tarefas e resolver problemas de tempo(timing).

No Arduino, existe a interrupção interna que permite interromper um código ou não, caso o Arduino precise "rodar" o código inteiro sem ser interrompido. E existe a interrupção externa, dada pela portas digitais 2 e 3.

Neste tutorial iremos demonstrar apenas a interrupção externa.

Aqui mostraremos um exemplo de como utilizar a interrupção de forma simples e funcional. O exemplo adotado é o blink com botão utilizando interrupção externa, a figura abaixo mostra a montagem:

O capacitor de 100nF serve como "delay" para o botão, já que a interrupção é muito rápida e precisa de um atraso para poder funcionar corretamente, e um resistor de 4K7 ohm como Pull-Up.

A programação utilizada está mostrada abaixo:

int pin = 13;
volatile int state = LOW;
volatile int state1 = LOW;

void setup()
{
pinMode(pin, OUTPUT);
attachInterrupt(0, blink, FALLING);    //    0 - Pin 2,  blink is the function that will be called  e FALLING it is when                             

}                                                               //     the pin goes the HIGH to LOW

void loop()
{
digitalWrite(pin, state);

}

void blink()
{
if(state==state1)
{
state = !state1;
}
else
{
state=state1;
}
}

Ao apertar o botão, a interrupção é ativada e liga o Led uma vez. Ao apertar o botão novamente, o Led apagará e assim sucessivamente. Portanto a interrupção serve para diversas aplicações em que é necessário interromper um processo para executar outro.

E é isso aí!! Esperamos que tenham gostado!! Fiquem de olho em nosso BlogTutoriais e Projetos!

Referências:

http://labdegarag1.lojatemporaria.com/arduino-original/starter-kit-...

http://arduino.cc/en/Reference/AttachInterrupt

http://arduino.cc/en/Reference/HomePage

Exibições: 40042

Comentar

Você precisa ser um membro de Laboratorio de Garagem (arduino, eletrônica, robotica, hacking) para adicionar comentários!

Entrar em Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)

Comentário de Marcio A. Pinheiro em 14 junho 2017 às 15:58

Olá pessoal!

Estou estudando sobre interrupções, li um livro, "Programação com arduino ||" e lá tem um capítulo especial sobre esse assunto. O Autor do livro fala que dentro de uma ISR - Sistema de Rotina de Interrupção; "Nada do código que está dentro da função loop() será executado até que a ISR estiver em execução. Quando uma ISR estiver sendo executada, as interrupções são automaticamente desligadas, isso para evitar uma confusão que poderia ser causada se as ISRs interrompessem umas as outras. Com tudo alguns efeitos colaterais podem ocorrer. A função delay() usa temporizadores e Interrupções, de modo que ela poderá não funcionar corretamente. O mesmo ocorre com a função millis(). Embora delay use millis e forneça os milissegundos que decorrem desde a inicialização(reset) até o momento em que a execução da ISR começou. Ela não funcionará enquanto a ISR estiver em execução. Contudo pode-se usar a função delayMicroseconds(), porque ela não usa interrupções.

A comunicação Serial também usa interrupções. Por essa razão não utilize Serial.print ou até Serial.Read. Bem você pode tentar e poderá funcionar, mas não espere que funcione sempre de forma confiável". 

Bom, o texto acima é o que o autor Simon Monk descreve sobre esse assunto no capítulo 3. Porém resolvi testar na pratica isso, usando um circuito parecido com o que está aqui no tópico, e o meu skatch está em anexo.

Eu forcei o uso da chave, clicando varias vezes consecutivamente, simulando o sinal de um possível sensor atuando, usando delay(), realmente fica instável, pois as vezes em determinados momentos não é detectado o pressionamento da chave, já usando a função delayMicroseconds(), Funciona perfeitamente. Mas um fato que me chamou atenção, é que se eu usar  a Serial.print alguma coisa, no lugar da função delayMicroseconds(), o sistema também funciona normal, o que não era para acontecer, segundo o autor do livro, e se não usar nada na linha 18, o LED fica doidinho... kkkk - é ignorado o a condição if

Resumo: Se usar delay não funciona, e se usar delayMicroseconds funciona. O mesmo ocorre se usar a Serial.print. Isso na linha 18 do skatch que anexei aqui.

O delay funciona em um primeiro clique na chave, mas se vc ficar clicando na chave, vai perceber que terá momentos em que o led não vai acender corretamente, logo se fosse um sensor, daria problemas.

Desculpem por colocar o código aqui, mas não consegui anexar ele:

#define chave 21 //Porta 21 do Arduino Mega2560, onde está a chave
#define Led 4 //Porta do 4 onde está o LED

int t = 0; //Variável para contar o tempo
void setup() {
Serial.begin(115200); //Inicializa a Serial
pinMode(chave, INPUT); //Inicializa a porta da chave como entrada
pinMode(Led, OUTPUT); //Inicializa a porta do LED como saída
attachInterrupt(2, aciona_led, FALLING); //chama a função ISR no modo FALLING, quando a chave passar de N. alto para N baixo.
}

void loop() {
t++; //encrementador da variável t
if(t>=2000){ //Verifica se t for 2000 equivalente a 2 segundos +ou-
digitalWrite(Led, 0); //Apaga o LED
t= 0; // Zera a variável t
}
delayMicroseconds(1000); //função para estabilizar o sistema, no lugar de delay(); 1000 = 1ms
}

void aciona_led(){ //Função ISR
digitalWrite(Led, 1); // Aciona o LED
t = 0; //Zera a variavel t
}

Comentário de José Gustavo Abreu Murta em 5 fevereiro 2014 às 19:51

Beleza! Fiz o teste e funcionou. 

Ficou um pouco instável devido aos ruidos do botão (mesmo com o capacitor de 100nF).

Essas são  uma correção e uma sugestão:

Realmente como o Flavio disse, o pino esquerdo do botão deve ser ligado ao terra.

E sugiro um delay de 50 micro-segundos entre a mudança dos estados. (debounce)

(fiz o teste com o delay e ficou totalmente estável)

Rotinas de debounce:

http://hackaday.com/2010/11/09/debounce-code-one-post-to-rule-them-...

Minha alterações:

int pin = 13;
volatile int state = LOW;
volatile int state1 = LOW;

void setup()
{
pinMode(pin, OUTPUT);
attachInterrupt(0, blink, FALLING);    //    0 - Pin 2,  blink is the function that will be called  e FALLING it is when                             

}                                                               //     the pin goes the HIGH to LOW

void loop()
{
digitalWrite(pin, state);

}

void blink()
{
if(state==state1)
{
state = !state1;

delay(50);
}
else
{
state=state1; 

delay(50);
}
}

Obrigado pela tutorial.

Gustavo Murta

Comentário de Flavio Tonello Tavares em 19 dezembro 2013 às 15:40

Olá...acredito que a ligação do fio verde até o pino 2 está errada... O fio deveria sair do outro lado do contato do push button certo? junto com o outro pino do capacitor

Comentário de Eloir Olszeweski em 11 junho 2013 às 17:39

Também quero saber mais sobre interupcoes inclusive internas. 

Obrigado.

Comentário de José Lucas Ferrarezi em 7 maio 2012 às 9:11

Bom dia.. Alguem sabe quais são os pinos de interrupção do arduino MEGA1280 ?? 

E se teria algum link ou material que falasse mais sobre interrupções ??

Obrigado..

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço