mikrocontroller.net

Forum: Compiler & IDEs Problem mit Ex. Interrupt


Autor: Guido Eichert (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich habe Probleme mit einem Externen Interrupt.
Das Interrupt wird über einen Taster ausgelöst (das funktioniert auch).
Dann mache ich in dem Interrupt eine nochmalige Abfrage des selben
Tasters (funktioniert auch). Dann geht das Programm aus dem Interrupt
raus und startet sofort wieder, ohne das ich den Taster gedrückt habe.
Kann mir vielleicht einer sagen warum und was ich dagegen tun kann?
(AT90S8535)

Vielen dank Gruß Guido

Autor: Frank (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Tasten entprellen, dann wird das nicht mehr passieren.

Autor: Joerg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das versucht er ja, Frank, funktioniert nur so nicht.

Guido, erstens werden do-nothing Schleifen vom avr-gcc zu übereifrig
optimiert, die taugen also nicht als Verzögerungsschleifen.  Greif
zu den Makros in <avr/delay.h>, wenn Du etwas Zuverlässiges haben
möchtest.

Zweitens ist es generell keine gute Idee, so eine riesige Aufgabe
in eine Interruptroutine zu legen.  Mach Dir eine kleine Variable
(kann auch ein bitfield sein), »volatile« nicht vergessen!, und
laß die Interruptroutine nur das Notwendigste machen und dann diese
Variable setzen.  Die Hauptschleife in main() kann das dann auswerten,
die Variable rücksetzen und entsprechend reagieren.

Eine Variante, die sich bei mir bewährt hat für eine ähnliche Aufgabe
sieht etwa so aus:

SIGNAL(SIG_INTERRUPT_0)
{

   diesen Interrupt hardwaremäßig abschalten
   timer für Entprellung starten
   Merkvariable setzen
}

int
main(void)
{
   ...
   for (;;) {
     if (merkvariable) {
       merkvariable abklemmen
       bearbeiten
     }

     if (timeout erreicht) {
       externes Interruptflag löschen
       externen Interrupt wieder zuschalten
     }
   }

   /* NOTREACHED */
   return 0;
}

In Wirklichkeit ist das noch etwas komplizierter, da ich noch Taste
kurz gedrückt vs. Taste lange gedrückt unterscheiden möchte, so daß
ich den Interrupt abwechselnd auf beiden Flanken aktiviere, aber
das geht jetzt hier zu weit.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.