Menu
CoddyTech

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.

challenge icon

Desafio

Fácil

Este 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(), defina started como true
  • declare started como volatile

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);
  }
}
quiz iconTeste seus conhecimentos

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