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
Das Interruptflag löschen bringt nix? Achtung: Bei manchen µC bedeutet Löschen des Interruptflags eine 1 reinschreiben.
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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.