Kann mir vielleicht jemand bei folgendem Problem weiterhelfen? Ich habe eine Interrupt-Service-Routine (ISR) programmiert welche ich unter bestimmten Bedingungen mit den Befehlen sei(); und cli(); starten /anhalten möchte. Anschließend soll sie wie zuvor weiterarbeiten (jede Sekunde Werte ändern). Anhalten mit cli(); funktioniert. Der Befehl sei(); startet die ISR aber nicht wieder!?
Ausschnitte aus meinem Programm mit Teilen aus dem Internet:
int Counter = 0; //Variable für Interrupt-Counter-Overflow
//------------------------------------------------------------
// Interrupt-Service-Routine
// Aruino runs at 16 Mhz, so we have 1000 Overflows per second...
// 1/ ((16000000 / 64) / 256) = 1 / 1000
ISR(TIMER2_OVF_vect) {
TCNT2 = 6; //Timer Reset
Counter += 1;
if (Counter == 1000) {
Counter = 0;
Sekunde +=1;
}
};
void setup() {
//Timer2 Settings: Timer Prescaler /64,
TCCR2B |= (1<<CS22);
TCCR2B &= ~((1<<CS21) | (1<<CS20));
// Use normal mode
TCCR2A &= ~((1<<WGM21) | (1<<WGM20)); // turn off WGM21 and WGM20 bits
TCCR2B &= ~(1<<WGM22); // turn off WGM22
// Use internal clock - external clock not used in Arduino
ASSR |= (0<<AS2);
//Timer2 Overflow Interrupt Enable
TIMSK2 |= (1<<TOIE2) | (0<<OCIE2A);
TCNT2 = 6; //Timer Reset
sei();
}
Damit läuft die ISR erst einmal. Das klappt auch alles ganz gut. Aber wenn ich mit folgender Abfrage in eine Unterroutine springe und die ISR anhalte bekomme ich sie nicht wieder zum Laufen. Das Programm friert einfach ein:
mit cli() hälst Du alle Interrupts an.
Somit läuft auch die delay() Funktion nicht mehr, da diese einen Hardwaretimer benutzt...
Ausserdem wird auch die serielle Kommunikation nicht mehr klappen, da der UART nicht mehr senden wird, oder klappt das bei Dir noch?
Das Programm ist eine Digitaluhr realisiert mit LEDs an Schieberegistern!
Sie lief auch schon klasse und zieht viele neugierige Blicke auf sich. Es hatte mich nur genervt das die ISR das Einsstellen der Uhrzeit immer unterbrochen hat
Nun habe ich einen Taster "Zeit" hinzugefügt. Solange er gedrückt ist ruht die ISR und ich kann die Register füllen wie ich mag