Arduinos interne Timer meistern für präzises Timing
Komponenten und Zubehör
| Komponente | Menge |
|---|---|
| Arduino UNO | 1 |
| LED (beliebig) | 1 |
| Widerstand 220 Ω | 1 |
Über dieses Projekt
Überblick
Wenn man präzise Zeitmessung braucht, sind Hardware-Timer unverzichtbar. Die Arduino-Funktion delay() blockiert den Prozessor – mit Timern läuft der Hauptcode weiter, und ein Interrupt signalisiert das Ablaufen der Zeit.
Dieses Tutorial erklärt die Nutzung von Timer0 (8-Bit) im CTC-Modus („Clear Timer on Compare Match“) am Beispiel des ATmega328P (Arduino UNO).
Funktionsweise
Der Zählerblock (siehe Datenblatt ATmega328P) besteht aus:
- VorTeiler (Prescaler): Teilt den 16-MHz-Systemtakt (z. B. /64 → 250 kHz).
- Steuerlogik: Inkrementiert das Register
TCNT0bei jedem Takt. - Vergleichsregister
OCR0A: WennTCNT0 == OCR0A, wird ein Interrupt (Compare Match A) ausgelöst undTCNT0zurückgesetzt (CTC-Modus).
Wichtige Register:
TCCR0A: Wellenform-Erzeugungsmodus (WGM01=1 → CTC).TCCR0B: Vorteiler-Bits (CS02..CS00).TIMSK0: Interrupt-Enable (OCIE0A für Compare Match A).OCR0A: Vergleichswert für gewünschte Periode.
Berechnung von OCR0A für 1 ms bei 16 MHz und Prescaler 64:
Taktfrequenz nach Vorteiler: 16 MHz / 64 = 250 kHz → Periodendauer 4 µs.
Für 1 ms (1000 µs) benötigt man 1000 / 4 = 250 Zyklen. Da der Zähler bei 0 startet und bei Match zurückgesetzt wird: OCR0A = 250 - 1 = 249 = 0xF9.
Beispiel: LED jede Sekunde blinken lassen
/* Blinkt LED an Pin 13 jede Sekunde mittels Timer0-Interrupt */
volatile int timer = 0;
bool state = false;
void setup() {
pinMode(13, OUTPUT);
TCCR0A = (1 << WGM01); // CTC-Modus
OCR0A = 0xF9; // 249 → 1 ms bei Prescaler 64
TIMSK0 = (1 << OCIE0A); // Compare Match A Interrupt aktivieren
sei(); // Globale Interrupts freigeben
TCCR0B = (1 << CS01) | (1 << CS00); // Prescaler 64 (Bit CS01 + CS00)
}
void loop() {
if (timer >= 1000) { // 1000 × 1 ms = 1 s
state = !state;
timer = 0;
}
digitalWrite(13, state);
}
ISR(TIMER0_COMPA_vect) {
timer++; // Wird alle 1 ms aufgerufen
}
Wichtig: Den Prescaler (TCCR0B) erst am Ende setzen, da der Timer dann sofort läuft. Zum Stoppen alle Bits in TCCR0B löschen.
Schaltplan

Herstellungsprozess
- Bluetooth-gesteuerter Arduino-Spybot bauen – Überwachungsroboter mit IP-Kamera
- FlickMote: Gestensteuerung per Ultraschall & IR für Smart Home (Arduino 101)
- DIY Arduino TV-B-Gone: Universelle TV-Aus-Fernbedienung
- Einen eigenen LED-Master-Clock mit Alarm bauen – aus 12 Metern Entfernung ablesbar
- Find Me: Smarter Gegenstands-Finder mit Arduino und Bluetooth
- Optimierte Stromversorgungslösungen für Arduino-Projekte
- Arduino Tic Tac Toe mit MAX7219 LED-Matrix und Karton-Gehäuse
- Intelligenten Arduino-Vierbeiner-Roboter bauen: Schritt-für-Schritt-Anleitung
- DIY Arduino Lenkrad / Joystick für Rennspiele – USB-HID-Umbau
- Eine voll funktionsfähige CNC-Maschine mit Arduino Nano R3 bauen