Forum: Mikrocontroller und Digitale Elektronik PortB Change Interrupt löst sofort aus


von Vincent H. (vinci)


Lesenswert?

Hallo

Ich hab ein kleines Problem mit einem PortB Change Interrupt. Der 
Interrupt löst sofort nach der Initialisierung aus, obwohl ich PortB 
direkt davor lese, was meines wissens eigentlich jeden bisherigen 
"mismatch" zw. aktuellem und alten latch Wert beseitigen sollte?


 TRISB = 0b11110000;
 PORTB = 0b11110000;
 nRBPU = 0;    //pullups

 // Interrupts
 INTEDG = 0;          //falling edge
 INTF = 0;
 INTE = 1;

 IOCB = 0b11110000;  //PORTB7:4 Interrupt on change
 portb_last_value = PORTB;
 RBIF = 0;
 RBIE = 1;


Die ISR funktioniert prinzipiell. Großartig stören tut mich der 
1.Interrupt direkt am Start auch nicht, da ich jedoch den PortB Change 
für Taster verwende, die ein Menü steuern, bin ich stets nach Start 
schon bei "Menüpunkt 2"... nervt ein wenig.

Danke

Vinci

von Krapao (Gast)


Lesenswert?

Das Interruptflag löschen bringt nix? Achtung: Bei manchen µC bedeutet 
Löschen des Interruptflags eine 1 reinschreiben.

von Peter D. (peda)


Lesenswert?

Vincent Hamp schrieb:
> Der
> Interrupt löst sofort nach der Initialisierung aus, obwohl ich PortB
> direkt davor lese, was meines wissens eigentlich jeden bisherigen
> "mismatch" zw. aktuellem und alten latch Wert beseitigen sollte?

1.
Woher hast Du dieses "Wissen", aus dem Datenblatt?

Da Du keinen MC-Typ nennst, kann ich nur allgemein bleiben.
In der Regel setzt ein Interruptereignis ein Flag, das Lesen eines Ports 
ist daher schnuppe.
Was aber hilft, ist das Flag rücksetzen unmittelbar vor der 
Interrutpfreigabe.

2.
Ein externer Interrupt ist ohne zusätzlichen Aufwand völlig ungeeignet, 
Tasten einzulesen, da Tasten prellen.
Die beste Methode ist ein Timerinterrupt zum Einlesen und Entprellen.


Peter

von Vincent H. (vinci)


Lesenswert?

Achso ja natürlich, der Typ!
Es handelt sich um einen PIC16F887. Das Flag wird natürlich auch 
gesetzt, das ist mir schon klar... Wie gesagt, die ISR funktioniert 
bereits ohne Probleme! Lediglich nach der Initialisierung erfolgt sofort 
ein Interrupt, den ich mir nicht erklären kann.

Bezügl. 2.
Leider habe ich keine Timer mehr frei, die ich für diese Aufgabe nutzen 
könnte (obwohl einer Mehrzwecknutzung wohl nichts im wegsteht wenn ich 
so dran denk...), deswegen wollte ich hierfür den PortB Interrupt nützn.

von Vincent H. (vinci)


Lesenswert?

Problem gelöst:

"MCLR and WDT Reset do not affect the previous value data latch. The 
RBIF bit will be cleared upon Reset but will set again if the
mismatch exists."

Das wars.

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.