Hallo ihr Spezialisten,
ich hänge an einem Problem. ich programmiere einen Atmel ATTiny 25 mit
WINAVR in C.
Ich habe eine Variable in einer Interruptroutine, die hochgezählt wird
wenn eine steigende Flanke kommt. Dies scheint mir nicht korrekt zu
funktionieren. Nicht korrekt heißt: nicht so, wie ich das will.
Mein Plan:
Ich Frage einen Pin am µC auf steigende Flanke ab und nutze dazu INT0.
In der ISR zähle ich eine Variable hoch, damit ich weiß, wie viele
positive Flanken gekommen sind (brauche ich zur Auswertung).
Praktisch sieht es so aus:
Die Flanke kommt einmal, aber der Zähler steht auf 5.
Meine Einstellungen:
Die Variable, die gezählt wird habe ich als globale Variable als
volatile deklariert:
1 | volatile uint8_t Flankenzaehler;
|
Vormals habe ich es auch schon mit static volatile probiert.
Die Einstellungen in den Registern sind:
1 | GIMSK |= (1<<INT0); // Ext. Pin-Interrupt ist eingeschalten
|
2 | MCUCR |= 0x03; // Ext. Interrupt wird ausgelöst bei steigender Flanke
|
Die Variable wird in der Initialisierung auf 0 gesetzt.
Die Interrupts habe ich eingeschaltet
Im Programm wird nur per if abgefagt ob die Variable >= 3 ist.
Teilprogramm:
Das Programm beinhaltet eine Art Blinker. Eingang ist ein Rechteck (1:1
jeweils 1 sek). Im Ausgang ist u.a. eine Kontrollampe.
Bei einem detektierten Fehler geht die Lampe aus.
Problem: Die Lampe geht kurz an und sofort wieder aus(Zeit ca. 100 - 200
ms.), obwohl der positive Impuls noch gar nicht abgeschlossen ist. Durch
Einfügen von Code und Speichern der Werte im EEPROM lese ich aus, dass
die positive Flanke 5 mal angelegen haben soll.
Hinweis:
Der positive Impuls am Eingang kommt nicht von einem Taster, sondern von
einem 555.
Habt Ihr eine Idee?