Forum: Mikrocontroller und Digitale Elektronik Interrupt 8051 (CC2430)


von Mario G. (suicided)


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.
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

von Mario G. (suicided)


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.
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
}

von Stephan H. (stephan-)


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.

von Mario G. (suicided)


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

von Stephan H. (stephan-)


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

von Mario G. (suicided)


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.

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.