Arduino – Interrupções


Aqui no site já falamos sobre as interrupções. Até o momento temos dois artigos que falam sobre isso nos microcontroladores PIC e no MSP430. Nestes artigos você irá encontrar uma contextualização introdutória sobre o assunto.

Geralmente o que possuímos é uma condição de interrupção, que diz “quando” a rotina deve ser chamada e a própria função ou rotina a ser executada. Esse ponto fica esclarecido no próprio código de exemplo que veremos a frente.

 

Hardware

Assim como em todos os microcontroladores, temos específicos terminais que desempenham a função de interrupção. Veja na tabela abaixo algumas versões do Arduino e seus respectivos pinos que atuam como interrupção. Como estou utilizando o Arduino Uno, irei utilizar o pino 2, identificado na tabela abaixo como INT0.

TabelaInterrupções

Figura 1 – Tabela Interrupções Arduino

 

Circuito

Se você já viu nosso artigo sobre as chaves mecânicas e os problemas que podemos ter devido ao efeito bouncing, já deve conhecer o circuito que iremos utilizar a seguir. Caso tenha dúvidas, recomendo que acesse o artigo abaixo:

O Efeito Bouncing e as técnicas para Debouncing

 

CircuitoInterrupções

Figura 2 – Circuito Arduino Interrupções

 

Código

 

Considerações

Antes de comentar sobre a principal sintaxe da interrupção, veja que no começo do código, temos algumas definições de variáveis. Um comentário interessante aqui é relacionado a notação volatile utilizada.

Ao utilizar isto junto a variável indicada no código, estamos basicamente dizendo ao nosso compilador que ela pode mudar de maneira não previsível e ser modificada sem o conhecimento do programa principal, já que ela está atrelada a uma entrada do usuário. Isso não permite que o compilador efetue otimizações em trechos onde se encontra essa variável.

 

Seguindo adiante, veja que neste exemplo estamos utilizando a seguinte sintaxe:

attachInterrupt(interrupt, ISR, mode);

Sendo os parâmetros abaixo:

interrupt: Número da interrupção.

ISR: é basicamente a nossa função que será chamada quando ocorrer a interrupção.

mode: Diz respeito ao modo do sinal relacionado a interrupção. Veja abaixo algumas constantes predefinidas:

→ LOW: Aciona a interrupção quando o pino está em nível baixo.

→ CHANGE: Dispara sempre que ocorrer uma mudança de estado. De 0 V para 5 V, ou de 5 V para 0 V.

→ RISING: Dispara na transição de subida.

→ FALLING: Dispara na transição de descida.

 

Nesse caso, a interrupção sempre ocorrerá quando o botão for pressionado. Desta forma, o que o nosso código faz é simplesmente chamar a rotina “blink” sempre que ocorrer uma interrupção. Dentro desta rotina, você irá colocar o código que deseja que seja executado. Com isso, o que está exemplificado é a alteração da variável “estado”. Ou seja, se ela possui o valor de LOW, ela terá agora o valor de HIGH, e vice-versa.

 

Após a interrupção ser executada, teremos portanto um novo valor para a variável “estado”. Por sua vez ela está relacionada ao nosso comando digitalWrite, dentro do nosso loop infinito. Isso faz com que o nosso led acenda e apague cada vez que uma interrupção ocorre, ou seja, cada vez que pressionamos o botão.

 

Inscreva-se para ficar atualizado!

Inscreva-se agora e fique por dentro das novidades do site

Fique tranquilo, respeitamos sua privacidade!

Deixe um comentário

O seu endereço de e-mail não será publicado.