Code:
Main
btfsc UPDLCD
goto WriteLcd
call Init
call InitLCD
call InitTimer
sleep <-----
Hier ist ein Fehler, den ich gefunden habe. Bzw. nach diesem Befehl
. Das Sleep-Commando versetzt den µC in den "Stand-By". Bei einem PIC bedeutet das nichts anderes, als das das Crystal abgeschalten wird und der µC bis zu einem externen-Interrupt in diesem Modus verweilt. Im Datenblatt kann man nachsehen, welches der Interrupts den PIC aus dem sleep-Mode holen können. Das wären bei einem 16F:
-) PortB-Interrupts
-) Watchdog-Overflow (wobei das eigentlich kein Interrupt auslöst)
-) Timer1, wenn es durch einen externen Clock gespeist wird
-) Flanke an dem INT-Pin (meist RB0)
Also ist es nicht verwunderlich, dass der PIC nichts macht, du schickst ihn schlafen und er wird nicht aufwachen
.
Ansonsten, beim rückkehr aus dem Sleep wird ein Befehl übersprungen (bzw. die ISR-Routine gestartet) und anschließend nimmt der PIC die Verarbeitung der Befehle nach dem Sleep wieder auf, was bei dir dazu führt, dass er in die "WriteLcd"-Funktion springt.
Code:
main-loop:
sleep
nop ;PIC aufgewacht
btfsc UPDLCD ;Timer 1 overflow?
call WriteLcd ;Ausgabe
goto main-loop
WriteLcd
...
return
Du müsstest solch eine Schleife einbauen. Aber wie gesagt, wenn du keinen externen Quarz an dem Timer1 dran hast (oder es nicht dran geben kannst), dann wird das mittels sleep nicht funtionieren können. Was dir dann zum Stromsparen bleiben kann ist, den PIC langsamer zu takten und die unbenutzten I/O-Pins auf Input zu setzten.
MfG
Mobius
Lesezeichen