Mit dem Timer Interrupt des Arduino die LED blinken lassen

Wenn im Programm keine Zeit ist eine Status LED blinken zu lassen, dann kann das ein Interrupt machen.

Er werden die Interrupt Register gesetzt, der Prescaler gesetzt und das Vergleichsregister eingestellt.

In meinem Beispiel ist der Prescaler auf 256 eingestellt. Damit wird das Vergleichsregister folgendermaßen berechnet.

Taktfrequenz / Prescaler ergibt einen Aufruf des Interrupt pro Sekunde.

Soll eine LED einmal die Sekunde blinken, dann ist sie 1/2 Sekunde aus und dann 1/2 Sekunde an. Das ergibt einen Wert von 16.000.000 / 256 / 2 = 31250

In der ISR ( Interrupt Service Routine ) wird dann die LED umgeschaltet während das restliche Programm weiter läuft. Naja, es wird kurz die ISR ausgeführt und dann läuft das Programm normal weiter.

// Mit dem Timer Interrupt die LED blinken lassen
//
// Matthias Busse 6.12.2015 Version 0.1

int led=13;

void setup() {
  pinMode(led, OUTPUT);
  noInterrupts(); // Interrupts ausschalten
  TCCR1A = 0; // Timer1 initialisieren
  TCCR1B = 0;
  TCNT1 = 0;
  OCR1A = 31250; // Vergleichsregister um die Zeit einzustellen 16MHz/256/2Hz
  TCCR1B |= (1 << WGM12); // CTC mode
  TCCR1B |= (1 << CS12); // 256 prescaler
  TIMSK1 |= (1 << OCIE1A); // enable timer compare interrupt
  interrupts(); // Interrups einschalten
}

void loop() {
  delay(1000); // Mache irgendwas
}

ISR(TIMER1_COMPA_vect) { // timer interrupt service routine
  digitalWrite(led, !digitalRead(led)); // LED umschalten
}

Teil 2 > Mit dem Arduino Timer Interrupt eine LED Blinkfolge ausgeben

von Matthias Busse

3 Gedanken zu „Mit dem Timer Interrupt des Arduino die LED blinken lassen

  1. Pingback: Mit dem Arduino Timer Interrupt eine LED Blinkfolge ausgeben | Shelvin – Elektronik ausprobiert und erläutert

  2. Uwe

    Hallo Matthias,
    das funkioniert leider nicht wenn man die Servo.h Library verwendet, da sich beide den Timer1 teilen.
    Wie kann man dieses Problem umgehen?
    Ich benötige die Blinkfunktion in der ISR UND die Servo-Lib.

    Antworten

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.