Arduino: Temporizadores e Interrupcoes: mudanças entre as edições
Sem resumo de edição |
|||
Linha 56: | Linha 56: | ||
*FALLING: Quando o valor do pino desce de alto para baixo; | *FALLING: Quando o valor do pino desce de alto para baixo; | ||
A cada fechamento de contados ocasionado pelos sensores uma '''rotina de tratamento de interrupção''' será acionada. | A cada fechamento de contados ocasionado pelos sensores uma '''rotina de tratamento de interrupção''' será acionada. | ||
===Laboratório 2: Blink por interrupção=== | |||
*Programa '''Blink''' acionado por interrupção <ref>https://www.arduino.cc/reference/en/language/functions/external-interrupts/attachinterrupt/</ref>: | |||
<syntaxhighlight lang="c"> | |||
const byte ledPin = 13; | |||
const byte interruptPin = 2; | |||
volatile byte state = LOW; | |||
void setup() { | |||
pinMode(ledPin, OUTPUT); | |||
pinMode(interruptPin, INPUT_PULLUP); | |||
attachInterrupt(digitalPinToInterrupt(interruptPin), blink, FALLING); | |||
} | |||
void loop() { | |||
digitalWrite(ledPin, state); | |||
} | |||
void blink() { | |||
state = !state; | |||
} | |||
</syntaxhighlight> | |||
*Carregar e testar o programa. | |||
;Detalhe do acionamento da interrupção: | |||
*A função <code>pinMode(interruptPin, INPUT_PULLUP)</code> define o pino como <code>INPUT_PULLUP</code>, isto é, uma entrada com resistor interno '''''pull-up''''', de forma que se estiver desconectado tem valor <code>HIGH</code>. Assim, quando levamos a <code>LOW</code> a entrada a interrupção é acionada na transição negativa do pino <code>FALLING</code>. | |||
==Referências== | ==Referências== |
Edição das 17h12min de 9 de novembro de 2021
Arduíno: Temporizadores e Interrupções
Temporizadores
O Arduíno possui várias funções que permitem implementar temporizadores e realizar medidas de tempo.
- Funções de pausa temporizada no programa
delay(ms)
- Pausa o programa por uma quantidade de tempo especificada como parâmetro em milissegundos. (onde 1000 milissegundos é 1 segundo).
delayMicroseconds(us)
- Equivalente ao
delay()
com tempo especificado microssegundos.
- Funções para medidas de tempo
millis()
- Retorna o número de milissegundos decorridos desde que a placa Arduíno foi iniciada com o programa atual.
micros()
- Equivalente ao
millis()
retornando o número de microssegundos.
Laboratório 1: Blink sem pausar o programa em execução
Uma aplicação interessante da função millis()
é poder realizar temporizações sem pausar o programa em execução.
- Programa Blink sem pausar programa [1]:
/*
* Blink sem delay();
*/
const int ledPin = 13; // pino do led
int ledState = LOW; // estado do led
unsigned long previousMillis = 0; // tempo anterior no qual o led foi chaveado
const long interval = 1000; // intervalo para piscar led (milliseconds)
void setup() {
pinMode(ledPin, OUTPUT);
}
void loop() {
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis; // salva o tempo atual
ledState = !ledState; // chaveia o led
digitalWrite(ledPin, ledState); // atualiza estado do led
}
}
- Carregar e testar o programa.
Interrupções
As interrupções permitem detectar mudanças em uma entrada sem a necessidade de checar constantemente seu estado. Quando uma interrupção é detectada uma rotina de tratamento de interrupção é chamada.
No Arduíno UNO as interrupções externas são acionadas pelo comando AttachInterrupt()
e são acionadas pelo pino 2 (interrupção 0) e/ou pino 3 (interrupção 1).
No Arduíno as interrupções externas podem ser acionadas de quatro diferentes modos:
- LOW: Quando o pino está baixo;
- CHANGE: Quando o valor do pino muda;
- RISING: Quando o valor do pino sobe de baixo para alto;
- FALLING: Quando o valor do pino desce de alto para baixo;
A cada fechamento de contados ocasionado pelos sensores uma rotina de tratamento de interrupção será acionada.
Laboratório 2: Blink por interrupção
- Programa Blink acionado por interrupção [2]:
const byte ledPin = 13;
const byte interruptPin = 2;
volatile byte state = LOW;
void setup() {
pinMode(ledPin, OUTPUT);
pinMode(interruptPin, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(interruptPin), blink, FALLING);
}
void loop() {
digitalWrite(ledPin, state);
}
void blink() {
state = !state;
}
- Carregar e testar o programa.
- Detalhe do acionamento da interrupção
- A função
pinMode(interruptPin, INPUT_PULLUP)
define o pino comoINPUT_PULLUP
, isto é, uma entrada com resistor interno pull-up, de forma que se estiver desconectado tem valorHIGH
. Assim, quando levamos aLOW
a entrada a interrupção é acionada na transição negativa do pinoFALLING
.
Referências
Evandro.cantu (discussão) 09h51min de 9 de novembro de 2021 (-03)