Menu
CoddyTech

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.

challenge icon

Görev

Kolay

Bu 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çinde started değerini true olarak ayarla
  • started değişkenini volatile olarak 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);
  }
}
quiz iconKendini test et

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