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.
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.
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 | }
|
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(); |
Ahh, Falsch, kein |=
1 | EIFR = IINTF0; //the flag can be cleared by writing a logical one to it |
2 | sei(); |
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(); |
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.