Timer sind so etwas wie die Stopuhren in einem Mikrocontroller.
Sie ticken im Hintergrund, zählen hoch oder runter – und können auf Wunsch automatisch eine Aktion auslösen. Das Beste daran: Dein Hauptprogramm läuft währenddessen ganz normal weiter.
Ob zum Erzeugen von präzisen Zeitsignalen, zum Messen von Zeitabständen oder zur PWM-Erzeugung – Timer sind extrem nützlich und vielseitig einsetzbar.
Ein Timer ist ein integriertes Hardware-Modul im Mikrocontroller, das mit jedem Taktzyklus zählt – entweder nach oben oder nach unten. Wenn ein bestimmter Wert erreicht ist (z. B. ein Überlauf), kann der Mikrocontroller darauf reagieren, zum Beispiel:
Eine LED ein-/ausschalten
Einen Interrupt auslösen (→ eine Funktion aufrufen)
Ein PWM-Signal erzeugen
Einen Zähler zurücksetzen
Timer sind unabhängig vom Code in loop() – sie laufen also im Hintergrund weiter, egal was dein Code sonst gerade tut.
Funktionen wie delay() oder millis() basieren intern selbst auf Timern – aber sie sind Teil der Arduino-Bibliothek und eher für grobes Timing gedacht.
Wenn du mehrere zeitkritische Aufgaben gleichzeitig erledigen willst oder genaue Frequenzen brauchst, dann sind direkte Timerzugriffe die bessere Wahl.
Blinken ohne blockieren (wie mit millis())
Präzises PWM-Signal erzeugen (z. B. für Servo oder LED-Dimmung)
Zeiterfassung (z. B. Stoppuhr, Impulsmessung)
Sound- oder Tonausgabe
Interrupts zeitgesteuert auslösen
Timer-Arten (am Beispiel Arduino Uno)
Der ATmega328P (z. B. auf Arduino Uno) hat 3 Timer:
Die Auflösung sagt, wie viele Schritte ein Timer zählen kann, bevor er überläuft.
Hier ein einfaches Beispiel, wie man einen Timer 1 auf dem Arduino nutzt, um alle 1 Sekunde eine LED umzuschalten – ohne delay() oder millis().
volatile bool ledState = false;
void setup() {
pinMode(13, OUTPUT);
// Timer1 Konfiguration
noInterrupts(); // Interrupts deaktivieren
TCCR1A = 0; // Normaler Zählmodus
TCCR1B = 0;
TCNT1 = 0; // Zähler zurücksetzen
// 1 Hz bei 16 MHz Takt, Vorteiler 1024
OCR1A = 15624; // Vergleichswert
TCCR1B |= (1 << WGM12); // CTC-Modus
TCCR1B |= (1 << CS12) | (1 << CS10); // Vorteiler 1024
TIMSK1 |= (1 << OCIE1A); // Interrupt aktivieren
interrupts(); // Interrupts wieder aktivieren
}
ISR(TIMER1_COMPA_vect) {
ledState = !ledState;
digitalWrite(13, ledState);
}
void loop() {
// Hier kannst du beliebigen anderen Code laufen lassen
}
CTC-Modus (Clear Timer on Compare Match): Timer wird zurückgesetzt, wenn ein bestimmter Wert erreicht ist
OCR1A: Vergleichswert, bei dem der Interrupt ausgelöst wird
ISR (Interrupt Service Routine): Eine Funktion, die automatisch ausgeführt wird, wenn der Timer auslöst
Anwendungsfall | Methode |
---|---|
Einfache LED blinken | delay() / millis() |
Zwei LEDs unabhängig blinken | millis() oder Timer |
Präzises PWM für Servo | Timer |
Zeitmessung mit hoher Genauigkeit | Timer + Interrupt |
Frequenz-/Impulsmessung | Timer (Input Capture) |