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.
Tantangan
MudahSketch ini seharusnya menunggu hingga tombol ditekan, lalu membuat LED berkedip. Saat ini sketch menunggu selamanya. Perbaiki:
- di
onPress(), aturstartedketrue - deklarasikan
startedsebagaivolatile
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);
}
}
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pengaturan Waktu Tanpa Delay
1millis()
Jam millis()Waktu dalam unsigned longLED Berkedip Tanpa JedaDua LED, Dua KecepatanLED Berkedip Saat Tombol Mengubah StatusLampu dengan Pengatur Waktu4Pengaturan Waktu yang Presisi
Mengukur dengan micros()Saat millis() Berputar KembaliStopwatch Tombol3Interupsi
Tekanan Tombol yang Luput dari LoopFALLING, RISING, dan CHANGEBerbagi dengan volatileHitung Tekanan Tombol dengan InterupsiLatihan sendiri: Playground Arduino