Forum: Mikrocontroller und Digitale Elektronik Atmega128A: INT0 löst direkt bei Aktivierung aus


von Oliver (Gast)


Lesenswert?

Hallo Zusammen,

habe folgendes Problem mit den externen Interrupts des Atmega:

An INT0 ist eine Interruptquelle angeschlossen, die in regelmäßigen 
Abständen ein Signal zur Auslösung sendet. Ich möchte die Interrupts 
aber erst ab einem bestimmten Zeitpunkt im Programm zulassen. Dazu wird 
ein Taster abgefragt, bei dessen Betätigung werden die Interrupts mit 
sei() freigegeben. Hat bereits vor der Aktivierung durch sei() ein 
Interruptereignis stattgefunden, wird der Interrupt sofort bei 
Aktivierung ausgelöst. Fand vorher kein Ereignis statt, werden die 
Interrupts freigegeben und das Programm wartet brav auf den nächsten 
Auslöser.

Woran könnte das liegen? Werden Interrupts bereits vor der Aktivierung 
registriert und gespeichert und lösen dann sofort nach der Freigabe 
durch sei() aus?

Vielen Dank im voraus für Eure Ideen.

von Kirsch (Gast)


Lesenswert?

Dann lösche vor dem sei() das Flag, das besagt das ein INT0 ausgelöst 
wurde, oder Aktiviere den INT0-Interrubt erst wenn der Taster gedrückt 
wurde.

von Oliver (Gast)


Lesenswert?

Kannst du das Flag bitte benennen?

Hab die komplette Initialisierung der Interrupts auf den Taster gepackt, 
selbes Ergebnis.

Die Aktivierung der Interrupts sieht so aus:
1
if ( debounce (PINA, PA1)) // Interrupts mit Taste aktivieren
2
    {
3
      EICRA = (1<<ISC01) | (1<<ISC00); // steigende Flanke
4
      EIMSK = (1<<INT0);     // INT0 aktivieren
5
      sei();
6
      
7
    }

von Kirsch (Gast)


Lesenswert?

Sollte das "External Interrupt Flag Register – EIFR" sein.

Also:
1
EIFR |= IINTF0; //the flag can be cleared by writing a logical one to it
2
sei();

von Kirsch (Gast)


Lesenswert?

Ahh, Falsch, kein |=
1
EIFR = IINTF0; //the flag can be cleared by writing a logical one to it
2
sei();

von Kirsch (Gast)


Lesenswert?

Und nochmal
Zulange mit STM32 gearbeitet, beim AVR sind es ja Bitnummern und keine 
Masken:
1
EIFR = 1 << IINTF0; //the flag can be cleared by writing a logical one to it
2
sei();

von Oliver (Gast)


Lesenswert?

Problem gelöst. Vielen Dank für die schnelle Hilfe.

Grüße

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.