Você está na página 1de 16

INTERRUPÇÃO POR CHAVE

https://portal.vidadesilicio.com.br/usando-a-
interrupcao-externa-no-seu-arduino/
Usando a interrupção externa no seu Arduino

Imagine que você esteja fazendo um relatório e no


meio do texto seu telefone toque. Possivelmente
você irá parar o que está fazendo e irá atender o
telefone, assim que encerrar a chamada você irá
retornar ao ponto que parou em seu relatório.
Quando estamos executando um tarefa muitas vezes
temos que a interromper para resolver outra tarefa
importante para só depois retornar do ponto que se
parou. Isso se chama interrupção e é usada com
frequência na programação de microcontroladores.
Uma interrupção tem dois pontos
chaves, são eles:
• Condição de interrupção: É a condição que indica uma
interrupção. Ela avisa ao programa que é a hora de
executar uma tarefa extraordinária. No nosso exemplo,
essa condição é o toque do telefone.

• Função a ser executada: Quando algo indica a interrupção,


temos que executar uma lista de instruções referentes a
essa interrupção. No exemplo dado, temos que parar de
fazer o relatório e ir atender ao telefone. A função atender
telefone é uma função extraordinária que só é executada
pelo fato de ter ocorrido a condição de interrupção, o
toque do telefone.
Circuito
Software
// Daremos um nome ao pino que ficara o LED:
int led = 13;
void interrupcao(){
digitalWrite(led, HIGH); // Liga o LED (HIGH = nível lógico alto)
delay(5000);
}

// Esta função "setup" roda uma vez quando a placa e ligada ou resetada
void setup() {
pinMode(led, OUTPUT); // Configura o pino do led (digital) como saída
attachInterrupt(0,interrupcao,RISING); //Configurando a interrupção
}

// Função que se repete infinitamente quando a placa é ligada


void loop() {
digitalWrite(led, HIGH); // Liga o LED (HIGH = nível lógico alto)
delay(1000); // Espera um segundo
digitalWrite(led, LOW);// Desliga o LED (LOW = nível lógico baixo)
delay(1000); // Espera um segundo
}
Configurando a interrupção externa no Arduino
Para que o Arduino leia uma interrupção, devemos configurá-lo. Para
tal usaremos o comando attachInterrupt().

attachInterrupt(INT,FUNCAO,MODO); //Configurando a interrupção

INT: Número da porta usada para a interrupção. No Arduino UNO INT


0 corresponde à porta digital 2 e INT 1 corresponde à porta digital
3; Como explicado anteriormente, numa interrupção temos dois
pontos chaves: a condição da interrupção e a função que será
executada.
Dessa forma, o comando attachInterrupt é usado para informar ao
programa esses dados. São eles:
FUNÇÃO: Nome da função que será chamada e executada quando
ocorrer a interrupção;
MODO: Define em qual tipo de variação do sinal a interrupção será
disparada. As opções são:
LOW: Dispara a interrupção quando a tensão no pino está em 0V
CHANGE: Dispara sempre que o sinal no pino muda de estado, borda 0V
(0) para 5V(1) ou vice-versa;
RISING: Dispara somente borda de subida, 0v (0) para 5V (1);
FALLING: Dispara somente borda de descida, 5V (1) para 0V (0)
Em nosso programa, usaremos esse comando da seguinte forma:

attachInterrupt(0,interrupcao,RISING); //Configurando a interrupção

Portanto, temos como condição de interrupção a mudança de estado de 0V


(0) para 5V(1) no pino digital 2 (INT 0) e a função a ser executa se chama
interrupção.

Função interrupcao()
Função é um bloco de tarefas a serem executadas pelo programa quando
solicitada.

void interrupcao(){ //Função executada quando ocorre a interrupção


externa
digitalWrite(led, HIGH); // Liga o LED (HIGH = nível lógico alto)
delay(5000);
}

No nosso caso, a função será solicitada quando ocorrer a interrupção. As


tarefas a serem executadas serão: acender o LED e esperar 5 segundos.
INTERRUPÇÃO POR TEMPO

http://labdegaragem.com/profiles/blogs/tutorial
-executando-fun-es-em-intervalos-de-tempo-
fixos-timers
Mas o que são os Timers?
Um timer nada mais é do que um contador que é
incrementado a cada intervalo de tempo (em alguns
microcontroladores intervalo pode ser configurado, o
Arduino é um deles). Os timers funcionam como um relógio
que pode ser usado para contar o tempo, medir a duração
de certos eventos, entre outras aplicações.
O Arduino vem equipado com um microcontrolador
ATmega168 ou ATmega328 (que diferem apenas na
quantidade de memória interna). Esses microcontroladores
possuem e timres: timer0, timer1 and timer2, Timer0 e
timer2 são contadores de 8bits, ou seja, contam de 0 a 255,
e o timer1 é um contador de 16bits, conta de 0 a 65535.
O Arduino Mega vem equipado com o ATmega1280 ou
ATmega2560 (que diferem apenas na quantidade de
memória). Eles possuem 6 timers: timer0, timer1, timer2,
timer3, timer4, timer5. Os timers 0, 1 e 2 são idênticos aos
do ATmega168/328, e os timers 3, 4 e 5 são ambos de
16bits.
Timer0:
O timer0 é utilizado pelo Arduino para funções
como delay(), millis() e micros(). Então não se deve utilizar esse timer para
evitar comprometer essa funções.
Timer1:
No Arduino UNO esse é o timer utilizado pela biblioteca de controle
de servos. Caso você não esteja utilizando essa biblioteca, esse timer está
livre para ser utilizado para outros propósitos. No Arduino Mega
esse timer só será utilizado para controlar os servos se você estiver usando
mais de 12 servos.
Timer2:
Esse timer é utilizado pela função tone(). Então se você não precisar da
função tone() esse timer está livre para outras aplicações.
Timer3 e Timer4:
Esses timers só estão presentes no Arduino Mega e eles só serão utilizados
pela biblioteca do Arduino caso vocês esteja utilizando mais de 24 servos.
De 25 a 36 servos o timer3 será utilizado e de 37 a 48 servos o timer4 será
utilizado.
Timer5:
No Arduino Mega esse é o timer padrão para o controle de servos, ou seja, se
você estiver utilizando de 1 a 12 servos, apenas esse timer será utilizado
pela biblioteca.
Configurando os timers
• A configuração "manual" dos timers é bem chata e trabalhosa pois
exige a manipulação de vários registradores do microcontrolador,
mas felizmente existem algumas bibliotecas que permitem fazer
isso de forma bem simples.

• O primeiro passo é baixar as bibliotecas e coloca-las na


pasta hardware/libraries/ que está dentro da pasta do Arduino ou
em sketchbook/libraries/. O local exato destes diretórios depende
do sistema operacional (Linux, Mac ou Windows) e também da
forma como a IDE do Arduino foi instalada.
Usando a biblioteca
As principais funções da biblioteca são:
initialize(periodo)
Esse método deve ser chamado antes de qualquer outro método, pois
ele é responsável pelas configurações iniciais. Você pode
opcionalmente informar o intervalo (em microsegundos) no qual a
interrupção deve ser gerada. O menor tempo aceito é 1 micro-
segundo e o tempo máximo é de 8.388.480 micro-segundos, ou
seja, aproximadamente 8,3 segundos. Caos não seja informado
nenhum valor, será atribuído o valor padrão de 1.000.000 micro-
segundos (1 segudo). Quando usado o timer1 o analogWrite() nos
pinos 9 e 10 do Arduino param de funcionar.
setPeriod(periodo)
Modifica o período da interrupção.
attachInterrupt(funcao, periodo)
Atribui uma função para ser chamada a cada interrupção gerada
pelo timer. Se não for especificado um período, será utilizado o
período definido na inicialização ou por setPeriod.
Exemplo
#include "TimerOne.h"
int vermelho = 13;
int rele = 7;

void setup()
{
pinMode(rele, OUTPUT);
pinMode(vermelho, OUTPUT);
Timer1.initialize(500000); // Inicializa o Timer1 e configura para um período de 0,5 segundos
Timer1.attachInterrupt(callback); // Configura a função callback() como a função para ser
chamada a cada interrupção do Timer1
}
void callback()
{
digitalWrite(vermelho, digitalRead(vermelho) ^ 1);
}
void loop()
{
digitalWrite(rele, HIGH); // turn the LED on (HIGH is the voltage level)
delay(3000); // wait for a second
digitalWrite(rele, LOW); // turn the LED off by making the voltage LOW
delay(3000); // wait for a second
}
Consideração Final
• Para usar os outros timers basta substituir o #include <TimerOne.h>
por #include <TimerTree.h>, #include <TimerFour.h> ou #include
<TimerFive.h> e no resto do código substitua Timer1 por Timer3,
Timer4, ou Timer5.

• Essas bibliotecas são úteis em várias situações, comoquando o loop


principal do seu programa está bloqueado por algum motivo
(esperando um botão ser pressionado, por exemplo) e você precisa
atualizar um display, ou ler um sensor independentemente do loop
principal, entre outras.

• É importante lembrar que o tempo necessário para executar as


funções que são chamadas na interrupção dos timers deve ser
MENOR do que o tempo entre as interrupções!

• Lembre-se que modificar o Timer1 afeta a função de pwm

Você também pode gostar