Menu
CoddyTech

Berbagi dengan volatile

Termasuk bagian Pengaturan Waktu Tanpa Delay dalam perjalanan Arduino di Coddy. Pelajaran 14 dari 18.

ISR sebaiknya melakukan satu hal dengan cepat, jadi biasanya ISR menetapkan sebuah variabel agar bagian sketch lainnya dapat membacanya. Variabel yang digunakan oleh keduanya harus dideklarasikan sebagai volatile:

volatile bool started = false;

void onPress() {
  started = true;
}

Untuk menghemat waktu, compiler (program yang mengubah C++ menjadi instruksi untuk chip) mungkin menyimpan salinan variabel di dalam prosesor alih-alih membaca memori. Compiler tidak tahu bahwa interrupt dapat mengubah variabel tersebut, jadi sketch mungkin menggunakan salinan lama selamanya. volatile membuat compiler membaca variabel itu kembali setiap kali.

Sketch ini menunggu di setup() menggunakan perulangan while: while (condition) { } mengulangi isi kurung kurawal selama kondisinya bernilai true, dalam hal ini !started. Seperti di bagian Inputs, ! berarti tidak: perulangan terus berjalan selama started bernilai false. Tanpa volatile, sketch dapat menunggu selamanya, bahkan setelah tombol ditekan.

challenge icon

Tantangan

Mudah

Sketch ini seharusnya menunggu hingga tombol ditekan, lalu membuat LED berkedip. Saat ini sketch menunggu selamanya. Perbaiki:

  • di onPress(), atur started ke true
  • deklarasikan started sebagai volatile

Tekan Jalankan, tekan tombol, lalu Periksa. Coba sekali tanpa volatile untuk melihat board tetap macet.

Coba sendiri

const int ledPin = 13;
const int buttonPin = 2;

bool started = false;   // diatur oleh interupsi, dibaca oleh sketch

unsigned long previousMillis = 0;
int ledState = LOW;

void onPress() {
  // atur started menjadi true di sini
}

void setup() {
  pinMode(ledPin, OUTPUT);
  pinMode(buttonPin, INPUT_PULLUP);
  attachInterrupt(digitalPinToInterrupt(buttonPin), onPress, FALLING);

  // tunggu di sini sampai tombol ditekan
  while (!started) {
  }
}

void loop() {
  // kedipkan LED setiap 250 ms
  unsigned long now = millis();
  if (now - previousMillis >= 250) {
    previousMillis = now;
    if (ledState == LOW) {
      ledState = HIGH;
    } else {
      ledState = LOW;
    }
    digitalWrite(ledPin, ledState);
  }
}
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Pengaturan Waktu Tanpa Delay

Latihan sendiri: Playground Arduino