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
Pingback: Mit dem Arduino Timer Interrupt eine LED Blinkfolge ausgeben | Shelvin – Elektronik ausprobiert und erläutert
Hallo!
Funktioniert leider nicht wenn der I2C-Bus benötigt wird.
Sonst OK.
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.