ESP32'de Interrupt ve Timer: Zamanlama Yazılımı Rehberi
Interrupt, mikrodenetleyiciye "Şu anda ne yapıyorsan bırak, acil bir şey var" demektir. Timer ise belirli zaman aralıklarında otomatik olarak bir işlemi tetikler.
ESP32'de bu iki kavram birleşerek güçlü zamanlama sistemleri oluşturur. Örneğin her 1 saniyede bir LED yakıp söndürmek, sensör okumak veya veri göndermek gibi görevleri interrupt ve timer ile yapabilirsiniz.
Interrupt: Dış bir olay (düğme basılması, sinyal değişimi) programı kesintiye uğratır.
Timer: Dahili saat, belirli zaman geçtiğinde işlemi tetikler.
Bu örnekte hardware timer kullanarak LED'i otomatik kontrol edeceğiz.
1#include <Arduino.h>23const int LED_PIN = 2;4volatile int timerCounter = 0;5volatile bool ledState = false;67// Timer interrupt fonksiyonu8void IRAM_ATTR onTimer() {9timerCounter++;10if (timerCounter >= 2) { // 2 saniye geçti11ledState =!ledState; // LED durumunu değiştir12digitalWrite(LED_PIN, ledState);13timerCounter = 0;14}15}1617void setup() {18Serial.begin(115200);19pinMode(LED_PIN, OUTPUT);2021// 1 MHz timer oluştur (her 1 mikrosaniyede artır)22hw_timer_t *timer = timerBegin(0, 80, true);23timerAttachInterrupt(timer, &onTimer, true);24// 1 saniye = 1.000.000 mikrosaniye25timerAlarmWrite(timer, 1000000, true);26timerAlarmEnable(timer);2728Serial.println("Timer başladı");29}3031void loop() {32Serial.println(ledState? "LED AÇIK": "LED KAPALI");33delay(500);34}Çıktı:
1Timer başladı2LED AÇIK3LED KAPALI4LED AÇIK...volatile: Interrupt içinde kullanılan değişkenler `volatile` olmalı, çünkü derleyici bu değişkenleri optimize etmemelidir.
IRAM_ATTR: Interrupt fonksiyonu hızlı olmalı, bu yüzden RAM'de tutulur.
timerBegin(0, 80, true): İlk parametre timer numarası, ikinci parametre prescaler (80 MHz'i 1 MHz'e düşürür), üçüncü parametre sayma yönüdür.
timerAlarmWrite(): Kaç mikrosaniyede tetikleneceğini belirtir.
Düğme basılınca LED'i yakıp söndürmek:
1const int BUTTON_PIN = 4;2const int LED_PIN = 2;3volatile bool ledState = false;45void IRAM_ATTR buttonPressed() {6ledState =!ledState;7digitalWrite(LED_PIN, ledState);8}910void setup() {11pinMode(LED_PIN, OUTPUT);12pinMode(BUTTON_PIN, INPUT_PULLUP);1314attachInterrupt(digitalPinToInterrupt(BUTTON_PIN), buttonPressed, FALLING);15}1617void loop() {18// Ana program burada çalışır19}Interrupt ve timer, ESP32'de zaman hassas işlemler için kullanılır. Timer periyodik görevler, interrupt ise ani olaylar için idealdir. Her ikisini birlikte kullanarak karmaşık zamanlama sistemleri oluşturabilirsiniz.
0 yorum