Compartilhamento com volatile
Parte da seção Temporização sem delay do Journey de Arduino da Coddy. Lição 14 de 18.
Uma ISR deve fazer uma coisa rápida, então geralmente define uma variável para o restante do sketch ler. Uma variável usada por ambos deve ser declarada volatile:
volatile bool started = false;
void onPress() {
started = true;
}Para economizar tempo, o compilador (o programa que transforma seu C++ nas instruções do chip) pode manter uma cópia de uma variável dentro do processador em vez de ler a memória. Ele não sabe que uma interrupção pode alterar a variável, então o sketch pode usar a cópia antiga para sempre. volatile faz com que ele leia a variável novamente a cada vez.
Este sketch espera em setup() com um loop while: while (condition) { } repete o conteúdo entre chaves enquanto a condição for verdadeira; aqui, !started. Como na seção Entradas, ! significa não: o loop se repete enquanto started for falso. Sem volatile, ele pode esperar para sempre, mesmo depois do pressionamento.
Desafio
FácilEste sketch deve esperar até que o botão seja pressionado e, em seguida, piscar o LED. No momento, ele espera para sempre. Corrija-o:
- em
onPress(), definastartedcomotrue - declare
startedcomovolatile
Pressione Run, pressione o botão e, em seguida, Check. Experimente uma vez sem volatile para ver a placa ficar travada.
Experimente você mesmo
const int ledPin = 13;
const int buttonPin = 2;
bool started = false; // definido pela interrupção, lido pelo sketch
unsigned long previousMillis = 0;
int ledState = LOW;
void onPress() {
// defina started como true aqui
}
void setup() {
pinMode(ledPin, OUTPUT);
pinMode(buttonPin, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(buttonPin), onPress, FALLING);
// aguarde aqui até que o botão seja pressionado
while (!started) {
}
}
void loop() {
// pisque a cada 250 ms
unsigned long now = millis();
if (now - previousMillis >= 250) {
previousMillis = now;
if (ledState == LOW) {
ledState = HIGH;
} else {
ledState = LOW;
}
digitalWrite(ledPin, ledState);
}
}
Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Temporização sem delay
Pratique por conta própria: Playground de Arduino