Interrupt 8051 (CC2430)

OP #1289330
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.
1
#pragma vector=P0INT_VECTOR
2
__interrupt void Port0_ISR(void) {
3
  if (PICTL & 0x01) // bei fallende Flanke (Port Interrupt Control)
4
    P1 ^= 0x01;     // LED invertieren
5
  PICTL ^= 0x01;    // Flankeneinstellung invertieren
6
  P0IFG = 0x00;     // Flags löschen (vorsichtshalber alle)
7
}
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
OP
Falls es jemanden interessiert... für die Ports gibt es noch je ein 
globales Interrupt-Flag, was natürlich auch gelöscht werden muss.
1
#pragma vector=P0INT_VECTOR
2
__interrupt void Port0_ISR(void) {
3
  if (PICTL & 0x01) // bei fallende Flanke (Port Interrupt Control)
4
    P1 ^= 0x01;     // LED invertieren
5
  PICTL ^= 0x01;    // Flankeneinstellung invertieren
6
  P0IFG = 0x00;     // Flags löschen (vorsichtshalber alle)
7
  IRCON &= ~0x20;   // P0IF löschen !!!
8
}
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.
OP
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
OP
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

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.