www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Interrupt 8051 (CC2430)


Autor: Mario G. (suicided)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Forum,

zum Testen und zum Erlernen der Interrupt-Behandlung, habe ich ein 
kleines Programm geschrieben, was mittels Interrupt von einem Taster 
(also GPIO) eine LED an- bzw. ausschaltet.
#pragma vector=P0INT_VECTOR
__interrupt void Port0_ISR(void) {
  if (PICTL & 0x01) // bei fallende Flanke (Port Interrupt Control)
    P1 ^= 0x01;     // LED invertieren
  PICTL ^= 0x01;    // Flankeneinstellung invertieren
  P0IFG = 0x00;     // Flags löschen (vorsichtshalber alle)
}
Beim ersten mal klappt das ganze auch ganz gut, die LED beginnt zu 
leuchten. Danach wird die ISR aber ständig wieder aufgerufen, obwohl 
nicht gedrückt oder losgelassen wurde.
Der Taster ist nicht entprellt, aber wenn ich einen Breakpoint in die 
ISR setze (als schlechte Methode zur Entprellung) passiert genau das 
gleiche.

Hab ich was übersehen? Gibt es noch irgendwo ein Flag, was gelöscht 
werden muss?

Danke schon mal
mario

Autor: Mario G. (suicided)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Falls es jemanden interessiert... für die Ports gibt es noch je ein 
globales Interrupt-Flag, was natürlich auch gelöscht werden muss.
#pragma vector=P0INT_VECTOR
__interrupt void Port0_ISR(void) {
  if (PICTL & 0x01) // bei fallende Flanke (Port Interrupt Control)
    P1 ^= 0x01;     // LED invertieren
  PICTL ^= 0x01;    // Flankeneinstellung invertieren
  P0IFG = 0x00;     // Flags löschen (vorsichtshalber alle)
  IRCON &= ~0x20;   // P0IF löschen !!!
}

Autor: Stephan Henning (stephan-)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So ist es. Kommt auf den Int an. Bei einigen werden die Flags 
automatisch behandelt, bei anderen nicht.
ABER
Taster nicht an die Int legen. Das macht man nicht.
Taster prellen und jede Prellung macht einen Int.
Das kann böse enden (Endlosschleife im Int)
Taster werden zyklisch abgefragt.

Autor: Mario G. (suicided)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Stephan,

das Programm hatte ich ja nur geschrieben, um die grundsätzliche 
Behandlung von Interrupts am CC2430 mit dem IAR Compiler zu hmm... 
lernen. In Endlosschleifen kann man nicht geraten, da die LED nur mit 
der positiven Flanke eingeschaltet wird und dann auf die nächste 
negative gewartet wird. Im Prinzip funktioniert das jetzt so, wie ein 
Stromstoßrelais - wenn man das Prellen außer acht lässt.
Problem war halt nur, dass es zwei Flags für den entsprechenden 
Interrupt gibt. Einen für den Port an sich und einen für den Pin. Aber 
das ist ja zum Glück nichts, was man nicht durch lesen rausfinden 
kann...

VG
mario

Autor: Stephan Henning (stephan-)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
das prellen würde aber ständig neue Ints auslösen.
Das ergibt dann eine "Endlosschleife" ( bis mal jemand den Taster los 
läßt)
Oder anders gesagt, 30 Mal prellen = 30 Mal Int

Autor: Mario G. (suicided)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Prellen Taster nicht nur, wenn man gerade drückt? Wenn man gedückt hält, 
ist es doch eigentlich stabil. Interrupts werden nur an Flanken 
ausgelöst.

Wie dem auch sei... das war ja nur zum probieren. Eine Anwendung mit 
Tatsern hab ich nicht vorgesehen.

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.