Hallo Leute, ich habe meine ISR (16F88) massiv abgespeckt, jetzt sieht sie so aus: org 4h ; Eintrittspunkt ISR MOVWF W_TEMP SWAPF STATUS,W MOVWF STATUS_TEMP movlw .255 btfss INTCON,INT0IF btfss INTCON,RBIF goto Int0 movwf RBIEFlag goto isr_end Int0 movwf INT0Flag isr_end BCF INTCON,INT0IF BCF INTCON,RBIF BCF INTCON,TMR0IF SWAPF STATUS_TEMP,W MOVWF STATUS SWAPF W_TEMP,F SWAPF W_TEMP,W retfie Bei externen Interrupt0 und bei Interrupt on change wird die ISR aufgerufen, die enstsprechenden Speicherstellen gesetzt und gut. Dummerweise wird bcf INTCON,RBIF ignoriert, das Bit bleibt gesetzt und die ISR wird in Endlosschleife versetzt, zumindest im MPLAB-Debugger. Wer sagt mir, wo der Hund begraben ist? Tom
Ich muss sagen, dass ich viele schlechte Erfahrungen mit den Interrupts bei PICs habe. Die sind sehr launisch. Sind die Pegel am PortB sauber? Evtl. die Pullups aktivieren. Außerdem würde ich jeweils ein "nop" zwischen die Clears schreiben, das kann helfen... Berichte bitte Fort- und Rückschritte. LG
RC Funker schrieb: > Ich muss sagen, dass ich viele schlechte Erfahrungen mit den Interrupts > bei PICs habe. Die sind sehr launisch. > Sind die Pegel am PortB sauber? Evtl. die Pullups aktivieren. > > Außerdem würde ich jeweils ein "nop" zwischen die Clears schreiben, das > kann helfen... > > Berichte bitte Fort- und Rückschritte. > > LG Hi also, NOPs zwischen den bcf brachte nichts. Ich habe auch die Reihenfolge verändert - keine Änderung. Mit den Pullups meinst du wohl Bit 7 im OPTION_REG: war zuerst 1 (keine Pullups), dann auf 0. Geändert hat sich aber nichts. Ich verstehs einfach nicht. Ich hatte vorher die ISR richtig vollgepackt, da war das Löschen von RBIF nie ein Problem. Tom, der wirklich ratlos ist... :-(
Welche Pegel ändern sich denn an PortB? Evtl. ändern sie sich zu schnell/zu häufig... Hast Du einen Debugger zur Verfügung? Auch noch eine Möglichkeit: Die Flag zwei- oder dreimal hintereinader clearen...
Hm. Ist n Fall für n Debugger. Als ich noch keinen hatte hab ich meine Breakpoints immer mit ner Endlosschleife und einer LED getestet.
Thomas M. schrieb: > INTCON,RBIF Das hier kennst du ? http://www.mikroe.com/forum/viewtopic.php?t=5905
Also, den bcf dreimal hintereinander bringt auch nichts. Ich benutze einen Debugger, MPLAB SIM, den in MPLAB eingebauten. Der Interrupt-on-change findet bei RB4 Anwendung. Die Zeit zwischen den Änderungen beträgt 1300 microsenkunden, also dicke Zeitspanne bei 8 MHz. Daran sollte es nicht liegen. Und wie gesagt, das Ganze lief schonmal problemlos, da war die ISR nur zu voll Tom
Lehrmann Michael schrieb: > Thomas M. schrieb: >> INTCON,RBIF > > Das hier kennst du ? > http://www.mikroe.com/forum/viewtopic.php?t=5905 Jetzt ja. Ich hab das Ganze in aller Eile Überflogen und mitgekriegt, daß man PORTB vorher auslesen muß, bevor man RBIF löschen kann. Keine Ahnung, was das soll, aber jetzt steht ein movwf PORTB vor den BCFs und es läuft :-) Danke an alle für eure Mühe Tom
Interrupt on change vergleicht den aktuellen Zustand am Port mit dem letzten eingelesenen Wert. Wenn Du nur das Flag löschst, ohne vorher den Port einzulesen, wird durch die nicht Übereinstimmung [aktueller Wert an Port <-> letzter gelesener Wert] das Flag gleich wieder gesetzt. Gruß John
Hallo, aus dem Errata 80301b.pdf Module: I/O Ports (PORTB) When the PORTB interrupt-on-change feature and a PORTB peripheral are enabled simultaneously, the PORTB peripheral input signalís rising and fall- ing edges will trigger an interrupt-on-change event. This is due to the interrupt-on-change feature not being disabled on the respective pin for that peripheral when interrupt-on-change is enabled. The affected pins and peripheral signals on PORTB are: RB4: SCK and SCL RB5: SS RB6: T1CKI This issue does not affect the functionality of the following: T1OSI (RB7) T1OSO (RB6) TX/CK (RB5) Work around Use revision C2 silicon
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.