volatile ile Paylaşım
Coddy'nin Arduino Journey'sinin delay() Kullanmadan Zamanlama bölümünün bir parçası. Ders 14 / 18.
Bir ISR hızlıca tek bir iş yapmalıdır; bu nedenle genellikle çizimin geri kalanının okuyacağı bir değişken ayarlar. Her ikisinin de kullandığı bir değişken volatile olarak tanımlanmalıdır:
volatile bool started = false;
void onPress() {
started = true;
}Zaman kazanmak için derleyici (C++ kodunuzu çipin talimatlarına dönüştüren program), belleği okumak yerine bir değişkenin kopyasını işlemcide tutabilir. Bir kesmenin değişkeni değiştirebileceğini bilmediğinden, çizim eski kopyayı sonsuza kadar kullanabilir. volatile, değişkenin her seferinde güncel olarak okunmasını sağlar.
Bu çizim, while döngüsüyle setup() içinde bekler: while (condition) { }, koşul doğru olduğu sürece süslü parantez içindeki kodu tekrarlar; burada koşul !started olur. Girdiler bölümünde olduğu gibi, ! değil anlamına gelir: döngü, started yanlış olduğu sürece tekrar eder. volatile olmadan, düğmeye basıldıktan sonra bile sonsuza kadar bekleyebilir.
Görev
KolayBu taslak, düğmeye basılana kadar beklemeli, ardından LED'i yakıp söndürmeli. Şu anda sonsuza kadar bekliyor. Düzelt:
onPress()içindestarteddeğerinitrueolarak ayarlastarteddeğişkeninivolatileolarak tanımla
Run'a bas, düğmeye bas, ardından Check'e bas. Kartın takılı kaldığını görmek için volatile olmadan da bir kez dene.
Kendin dene
const int ledPin = 13;
const int buttonPin = 2;
bool started = false; // kesme tarafından ayarlanır, sketch tarafından okunur
unsigned long previousMillis = 0;
int ledState = LOW;
void onPress() {
// burada started değerini true olarak ayarla
}
void setup() {
pinMode(ledPin, OUTPUT);
pinMode(buttonPin, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(buttonPin), onPress, FALLING);
// düğmeye basılana kadar burada bekle
while (!started) {
}
}
void loop() {
// her 250 ms'de bir yanıp sön
unsigned long now = millis();
if (now - previousMillis >= 250) {
previousMillis = now;
if (ledState == LOW) {
ledState = HIGH;
} else {
ledState = LOW;
}
digitalWrite(ledPin, ledState);
}
}
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
delay() Kullanmadan Zamanlama bölümündeki tüm dersler
Kendi başına pratik yap: Arduino playground