Hmm, die Tips zum Timer1 hören sich in der Tat praktisch an, da habt ihr
schon Recht. Die Schaltung ist bateriegepuffert [die werden bei
Stromausfall über ein Relais zugeschaltet], und wenn am Pin RB2 (habe
ich willkürlich gewählt) auf einmal nur noch eine digitale null anliegt,
dann sage ich dem Controller SLEEP ();, um Strom zu sparen, weil er ja
nun an den Batterien hängt.
Also ich stelle mir die vorherige Konfigurationen dann so vor:
Ich setze im Config-Word den Oszillator-Modus auf INTOSC (RA6 und RA7
sind dann als IOs verwendbar). Der PIC läuft dann mit internem Takt (ich
werde hier 4MHz auswählen weil ich noch PWM brauche).
Globale Interrupts sind aktiviert (GIE = 1).
Dann schalte ich Timer1 an (TMR1ON = 1), setze den Prescaler auf 1:8
(T1CKPS = 0b11), und sage ihm, er soll als Timer arbeiten (TMR1CS = 0),
und den externen Takt, also die 32768Hz, dazu benutzen (T1OSCEN = 1).
Den Uhrenquarz schließe ich dann an RB6 und RB7 an, mit
15pF-Kondensatoren. Zudem setze ich den Power-Up-Timer (PWRT = 1) damit
das Uhrenquarz einschwingen kann.
Dann muss noch der Interrupt bei Überlauf des Timer1 aktiviert werden
(TMR1IE = 1), und in der ISR wird dann einfach geschaut, ob TMR1IF == 1.
Dort wird ein Zähler auf 4096 hochgezählt, und wenn der resettet, dann
ist eine Sekunde um, und die Uhrzeit wird geupdatet.
In der ISR kann er dann auch überprüfen, ob an RB2 immer noch eine Null
liegt. Wenn ja, dann gehe wieder schlafen ( SLEEP (); ), aber wenn dort
eine 1 liegt, dann bleibe wach (das macht er doch, wenn ich ihm nicht
explizit erneut schlafen lege, oder?).
Puhh, das war viel Text, aber mir würde es sehr gut helfen, wenn da
jemand, der das schonmal gemacht hat, drübersehen könnte. Ich hab
bestimmt etwas falsch verstanden und/oder vergessen.
Danke für eure Hilfe.
Jens