PortB Change Interrupt löst sofort aus

OP #2407992
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
#2408005
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
OP #2408070
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren