entrada-POST

Bem-vindos a uma nova entrada do curso de programação para Makers com Arduino e Protocoder! Nesta entrada vamos aprender a utilizar interrupções ou interrupts… mas, o que são? Uma interrupção é um sinal que interrompe o que quer que o processador esteja a calcular naquele momento, para executar outra função distinta. A interrupção pode acontecer através de um sinal externo (por exemplo, o pressionar de um botão) ou de um sinal interno (por exemplo, um temporizador ou um sinal de software). Uma vez chamada, a interrupção pausa o que o processador estiver a fazer naquele momento, e faz com que se execute uma outra função conhecida como Rotina de Serviço de Interrupção (ou pela sigla em inglês, ISR). Uma vez que a ISR tenha finalizado, o programa volta à função, que estava a correr anteriormente. Se quiseres conhecer mais sobre interrupções, podes visitar a página de referência aqui.

Lista de materiais

  • ZUM BT-328, placa Arduino ou compatível.
  • 1 Interruptor ou Botão.

Conexões Eléctricas

O número de pinos que podem ser utilizados como interrupts depende da placa que estivermos a utilizar. Para a placa ZUM BT-328, Arduino Uno e derivados, são 2, e encontram-se nos pinos 2 e 3, correspondendo ao interrupt 0 e interrupt 1 respectivamente.

ZUM-push2

Usando as interrupções

Para utilizar as interrupções, em primeiro lugar temos que declarar que interrupção queremos utilizar. No nosso caso utilizaremos a interrupção 0, que está no pino número 2. Para isso declaramos:

Agora, no setup, temos que especificar que função irá ser chamada no caso de ocorrer a interrupção. Para isso, utilizamos a função attachInterrupt, que tem a seguinte sintaxe:

Os argumentos da função attachInterrupt são:

  1. Interrupt: número da interrupção, ou seja, em que pino devemos “escutar ” para esperar pela interrupção.
  2. ISR: função que irá ser chamada, no caso de ocorrer a interrupção.
  3. Mode: define como a ISR será lançada, ou seja, o que tem que acontecer para que se execute a interrupção. Os diferentes modos são:
    1. LOW: executa-se sempre que o valor no pino seja 0.
    2. CHANGE: executa-se sempre que se produza uma alteração.
    3. RISING: executa-se enquanto o valor vá de 0 até 1 (ou de 0 até 5 Volts).
    4. FALLING: executa-se enquanto o valor vá de 1 a 0 (ou de 5 até 0 Volts).

Há que ter em conta que é necessário escrever os modos, com letras maiúsculas, se não vai produzir-se um erro. No nosso caso, utilizamos…

…que detectará quando deixamos de pressionar o botão. Por outro lado, temos que definir a função que se irá chamar quando for detectada a interrupção. Neste caso, chamámos a função funcionInterrupcao, e vamos defini-la com o mesmo nome que colocámos em attachInterrupt. A função é:

Aqui imprimimos através do monitor série, o número de vezes que ocorreu a interrupção. Uma das particularidades das interrupções é que não podem ter nenhum argumento na sua definição nem devolver nenhum valor, e por isso, para assegurar que a ISR tenha um bom acesso às variáveis, temos que utilizar uma variável de tipo volatile, e neste caso, de tipo int. Se quiseres conhecer mais sobre variáveis do tipo volatile, podes visitar esta página de referência. Outra das restrições das interrupçõess é que, enquanto estivermos dentro de uma ISR, o resto das outras interrupções não serão detectadas, não funcionará o delay e não se actualizará o valor de millis, e por isso é importante que as ISR sejam o mais curtas possível.

O código

Aqui podes ver o código completo. Lembra-te que também podes descarregar o código com as imagens utilizadas, no final desta lição.

Em primeiro lugar, declaramos as variáveis que vamos utilizar: interrupcao, com a qual indicaremos ao microprocessador que interrupção queremos utilizar, e numInterrupt, que mostrará o número de vezes que ocorreu a interrupção. Na função setup, iniciamos a porta série e declaramos a interrupção que vamos utilizar com attachInterrupt(). Na função loop, simula-se uma tarefa que necessite de um certo tempo para ser executada. Neste caso, para não sobrecarregar a visualização de saída do programa através da porta série, imprime-se apenas um ponto “.” na porta série. Quando acedemos à interrupção, ao soltar o botão (neste exemplo), a execução do programa é interrompida e  é impresso através da porta série “Interrupção número “, seguido do número de vezes que ocorreram as interrupções. Como exercício, propomos-te que modifiques o modo de aceder à interrupção, para entenderes e aprenderes qual é o efeito que tem sobre o mesmo circuito.