Arduino - interrupções
As interrupções param o trabalho atual do Arduino para que algum outro trabalho possa ser feito.
Suponha que você esteja sentado em casa, conversando com alguém. De repente, o telefone toca. Você para de bater papo e pega o telefone para falar com o chamador. Ao terminar a conversa telefônica, você volta a conversar com a pessoa antes que o telefone toque.
Da mesma forma, você pode pensar na rotina principal como conversar com alguém; o toque do telefone faz com que você pare de conversar. A rotina do serviço de interrupção é o processo de falar ao telefone. Quando a conversa telefônica termina, você volta à sua rotina principal de bate-papo. Este exemplo explica exatamente como uma interrupção faz com que um processador aja.
O programa principal está sendo executado e executando alguma função em um circuito. No entanto, quando ocorre uma interrupção, o programa principal é interrompido enquanto outra rotina é executada. Quando essa rotina termina, o processador volta à rotina principal novamente.
Caracteristicas importantes
Aqui estão alguns recursos importantes sobre interrupções -
As interrupções podem vir de várias fontes. Nesse caso, estamos usando uma interrupção de hardware que é acionada por uma mudança de estado em um dos pinos digitais.
A maioria dos projetos do Arduino tem duas interrupções de hardware (conhecidas como "interrupção 0" e "interrupção 1") conectadas aos pinos de E / S digital 2 e 3, respectivamente.
O Arduino Mega possui seis interrupções de hardware, incluindo as interrupções adicionais ("interrupt2" a "interrupt5") nos pinos 21, 20, 19 e 18.
Você pode definir uma rotina usando uma função especial chamada “Rotina de serviço de interrupção” (geralmente conhecida como ISR).
Você pode definir a rotina e especificar as condições na borda ascendente, na borda descendente ou em ambas. Nessas condições específicas, a interrupção seria atendida.
É possível que essa função seja executada automaticamente, cada vez que um evento acontecer em um pino de entrada.
Tipos de interrupções
Existem dois tipos de interrupções -
Hardware Interrupts - Eles ocorrem em resposta a um evento externo, como um pino de interrupção externa ficando alto ou baixo.
Software Interrupts- Eles ocorrem em resposta a uma instrução enviada no software. O único tipo de interrupção que a “linguagem Arduino” suporta é a função attachInterrupt ().
Usando interrupções no Arduino
As interrupções são muito úteis em programas Arduino, pois ajudam a resolver problemas de temporização. Uma boa aplicação de uma interrupção é ler um codificador rotativo ou observar uma entrada do usuário. Geralmente, um ISR deve ser o mais curto e rápido possível. Se o seu esboço usa vários ISRs, apenas um pode ser executado por vez. Outras interrupções serão executadas após o término da atual em uma ordem que depende da prioridade que elas têm.
Normalmente, as variáveis globais são usadas para passar dados entre um ISR e o programa principal. Para garantir que as variáveis compartilhadas entre um ISR e o programa principal sejam atualizadas corretamente, declare-as como voláteis.
sintaxe da instrução attachInterrupt
attachInterrupt(digitalPinToInterrupt(pin),ISR,mode);//recommended for arduino board
attachInterrupt(pin, ISR, mode) ; //recommended Arduino Due, Zero only
//argument pin: the pin number
//argument ISR: the ISR to call when the interrupt occurs;
//this function must take no parameters and return nothing.
//This function is sometimes referred to as an interrupt service routine.
//argument mode: defines when the interrupt should be triggered.
As três constantes a seguir são predefinidas como valores válidos -
LOW para acionar a interrupção sempre que o pino estiver baixo.
CHANGE para acionar a interrupção sempre que o valor do pino for alterado.
FALLING sempre que o pino vai de alto para baixo.
Example
int pin = 2; //define interrupt pin to 2
volatile int state = LOW; // To make sure variables shared between an ISR
//the main program are updated correctly,declare them as volatile.
void setup() {
pinMode(13, OUTPUT); //set pin 13 as output
attachInterrupt(digitalPinToInterrupt(pin), blink, CHANGE);
//interrupt at pin 2 blink ISR when pin to change the value
}
void loop() {
digitalWrite(13, state); //pin 13 equal the state value
}
void blink() {
//ISR function
state = !state; //toggle the state when the interrupt occurs
}