Hallo,
Ich hab mach das zwar mit C, aber wenn im Sleep-Mode an GP2 eine
positive Flanke kommt wacht er automatisch auf! Bin mir nicht sicher ob
man ihn auch von den anderen Ports aus dem Sleep holen kann!
Heißt das ich muss einfach an GP2 ein positive Flanke anlegen
und der PIC arbeitet weiter.
Ich denke nur da muss man doch im Programm was schreiben damit das auch
wirklich funktioniert.
Oder einfach nur ne pos. flanke anlegen und funzt
einfach ne pos. flanke anlegen funzt net
ich denke man muss im programm definieren das ein interrupt ausgelöst
wird
ich kann eure hilfe echt gebrauchen
Hallo, im STATUS register, oder war es im OPTION, eher da, gibt es ein
bit,
mit dem du WAKE_UP_ON_CHANGE einschalten kannst. Das brauchst du,
aber ich weiss im Moment nicht, welcher Pin das ist, jedenfalls glaube
ich
bei dem MCU nur 1 pin, bei anderen MCU´s können es mehr sein.
Noch was, vergiss das mit dem Sleep, sondern mach sowas, das ist besser.
dosleep:
sleep
main:
.....
goto dosleep
Mal sehen ob ich es noch zusammen bekomme. Eines meiner ersten Proggs
war ein Minilauflicht mit 5 LED (Batteriebetrieben). Ich hatte damals
auch den GPIO3 als Eingang benutzt um das Lauflicht aus dem Sleep
aufzuwecken.
Du brauchst tatsächlich den Interrupt. Als erstes musst du im
IOC-Register den entsprechenden Pin maskieren, damit der zugehörige
Eingang überhaupt auf Interrupts regiert.
1
MOVLW B'00001000' ;GP3 (Taster) für Int einschalten
2
MOVWF IOC
Dann musst du im INTCON-Register den GPIE und den GIE einschalten
1
MOVLW B'10001000' ;GIE und GPIE ein
2
MOVWF INTCON ;Interupt für Taster freigeben
Vorher musst du natürlich ab Adresse 0x04 eine Interruptroutine
schreiben. Also Register sichern, das GPIF-Bit im INTCON-Register
abfragen um zu sehen ob der Interrupt durch einen Taster ausgelöst
wurde. Wenn ja, dann deine Befehle ausführen. Am Ende GPIF wieder
zurücksetzen, Register zurücksichern und aus der Routine springen.
Das Programm macht dann bei dem Befehl nach dem SLEEP weiter.
Probiers mal aus.
Gruß
Sven
Sehe gerade, dass es natürlich noch das INT-Pin (GP2) gibt. Hier musst
du im INTCON-Register das INTE-Bit einschalten (und natürlich das
GIE-Bit). Mit dem INTF-Bit fragst du dann in der Interruptroutine ab, ob
es der INT-Interupt war, der auslöste. Der INT-Interrupt arbeitet nur
auf einer Flanke. Ob der Interrupt bei steigender oder bei fallender
Flanke ausgelöst werden soll stellst du mit dem INTEDG-Bit im OPTION_REG
Register ein (1=steigend, 0=fallend).
Den INT Interrupt gibt es nur am GP2-Pin. Da ich aber den GP3-Pin damals
benutzen wollte (er kann nicht als Ausgang geschaltet werden) hatte ich
mich für den Interrupt on Change (IOC) entschieden. Der löst bei jeder
Flanke aus und kann für jeden Pin (GP0-GP5) eingeschaltet werden.
Ciao
Hab gerade bei sprut dazu noch etwas gefunden:
---------------------
Der Sleep-Befehl versetzt den Prozessor in den stromsparenden
stand-by-Mode.
Durch die einige bestimmte Interrupts wird der PIC wieder geweckt. Falls
das zum Interrupt zugehörige Interrupte-Enable-Bit gesetzt ist, läuft
der PIC einfach im Programm weiter. Ist auch noch das GIE-Bit gesetzt,
wird zusätzlich noch die Interruptbehandlungsroutine aufgerufen.
---------------------
Heist also, dass das Programm einfach nach dem SLEEP weitermachen
müsste, wenn man das GIE-Bit nicht setzt. Dann müsste man sich auch die
ISR sparen können. Hab ich selbst aber noch nicht so ausprobiert.
Sven