Hallo,
ich habe eine batteriebetriebene Schaltung mit einem PIC16LF876 (und 4
MHz Resonator) in der im wesentlichen an RB0, RB4-7 Taster hängen (die
auf Masse liegen und der interne Pull-up ist eingeschaltet).
Wenn meine Schaltung nichts macht,schaltet sie die Pins entsprechend und
geht in den Sleep-Mode und bei einem Tastendruck soll sie wieder
aufwachen.
Ich habe PEIE, INTE, RB0:4 = enable und GIE = disable eingestellt. Das
funktioniert auch zuverlässig. Nach dem Aufwachen durchläuft er nicht
den Interrupt, sondern setzt das Programm nach dem Sleep() fort. Soweit
so gut.
Nun stelle ich fest, dass nach einer gewissen Zeit (liegt im
Stundenbereich) der Stromverbrauch steigt und der PIC offensichtlich
aufwacht.
Mit dem Oszi nachgemessen sehe ich, dass der Resonator mit 4 MHz
schwingt und sich im main() bewegt.
Hat jemand eine Idee, aus welchem Grund er wieder aufwacht?
Danke für Eure Hilfe...
netfriend
Es gibt einige Bits, die den Grund für einen Reset anzeigen (Watchdog,
Brown out, INT, RESET, ...?). Vielleicht geben die einen Hinweis.
Vielleicht hilft es auch, wenn Du den Code postest. Eventuell auf das
Minimun abgespeckt.
Schläft der PIC nach dem ungewollten Aufwachen denn auch wieder ein?
Danke für die Antwort.
Also, Watchdog und BrownOut habe ich als Interrupt deaktiviert.
Wie könnte ich mir die Bits ansehen (im laufenden Betrieb, ohne Display,
ohne Debugger usw.)?
Im Prinzip läuft es grob so ab:
- Taste wird gedrückt
- Es wird der Zustand von RB0, 4-7 (dort wo die Tasten hängen)
eingelesen und entprellt (im main())
- Aufgrund der gedrückten Taste werden Daten per UART verschickt
- Nachdem die Daten verschickt wurden, setzte ich mir einen Merker, dass
das Senden beendet ist
- in der main() frage ich diesen Merker ab, setzte die IOs so, dass sie
im Ruhezustand sind, setze den Merker zurück und schicke den PIC in den
sleep(). Soweit passt alles.
Nachdem der PIC ungewollt aufgeweckt wurde, geht er auch nicht mehr in
den Sleep. Grund hierfür ist wohl, dass niemand den Merker setzt.
Wenn ich nun wieder eine Taste drücke, werden die Daten der zugehörigen
Taste gesendet, der Merker gesetzt und der PIC in den sleep() versetzt.
Dann schläft er wieder...bis einer wieder eine Taste drückt oder er
zufällig aufwacht.
netfriend wrote:
> Danke für die Antwort.>> Also, Watchdog und BrownOut habe ich als Interrupt deaktiviert.
Will nicht kleinlich sein, aber ist Dir klar, dass Watchdog und Brownout
keinen Interrupt, sondern einen Reset erzeugen?
> Wie könnte ich mir die Bits ansehen (im laufenden Betrieb, ohne Display,> ohne Debugger usw.)?
ev. mit einem Elektronenrastermikroskop ;-)
Im Ernst, ohne Debugger wird es schwierig. Aber Du kannst ja ein paar
Leds anschliessen und sie abhängig von den Flags setzen. Oder Du nutzt
den UART, um eine Meldung zu senden.
> - in der main() frage ich diesen Merker ab, setzte die IOs so, dass sie> im Ruhezustand sind,
Wie setzt Du die IOs?
> Nachdem der PIC ungewollt aufgeweckt wurde, geht er auch nicht mehr in> den Sleep. Grund hierfür ist wohl, dass niemand den Merker setzt.> Wenn ich nun wieder eine Taste drücke, werden die Daten der zugehörigen> Taste gesendet, der Merker gesetzt und der PIC in den sleep() versetzt.> Dann schläft er wieder...bis einer wieder eine Taste drückt oder er> zufällig aufwacht.
Als Workaround könntest Du ja den Merker nach dem Reset (also in main())
sofort setzen und den PIC schlafen legen. Wenn eine Taste gedrückt wird,
funktioniert es ja korrekt, und anschliessend schläft der PIC wieder.
Falls er aus unerfindlichen Gründen wieder aufgrund eines Reset (dies
ist ja nur eine Vermutung) aufwacht, geht er halt wieder für ein paar
Stunden schlafen oder bis jemand eine Taste drückt.
Severino R. wrote:
> Will nicht kleinlich sein, aber ist Dir klar, dass Watchdog und Brownout> keinen Interrupt, sondern einen Reset erzeugen?
Ja, war etwas schnell geschrieben. Hab aber trotzdem im CONFIGURATION
WORD den Watchdog und Brownout deaktiviert. Sollte jedenfalls von dieser
Seite kein Problem geben,oder?
> ev. mit einem Elektronenrastermikroskop ;-)> Im Ernst, ohne Debugger wird es schwierig. Aber Du kannst ja ein paar> Leds anschliessen und sie abhängig von den Flags setzen. Oder Du nutzt> den UART, um eine Meldung zu senden.
Klar, über Umwege würde es gehen. Aber ohne an der Software etwas zu
ändern aus dem jetzigen Stand heraus wohl eher nicht.
> Wie setzt Du die IOs?
So dass kein Strom fließt. Habe aber auch die IOs nachgemessen wenn er
ungewollt wieder wach wurde - diese stehen alle noch so wie sie sein
sollen.
> Als Workaround könntest Du ja den Merker nach dem Reset (also in main())> sofort setzen und den PIC schlafen legen. Wenn eine Taste gedrückt wird,> funktioniert es ja korrekt, und anschliessend schläft der PIC wieder.> Falls er aus unerfindlichen Gründen wieder aufgrund eines Reset (dies> ist ja nur eine Vermutung) aufwacht, geht er halt wieder für ein paar> Stunden schlafen oder bis jemand eine Taste drückt.
Hmm, wär ne Möglichkeit. Wüßte aber trotzdem gerne warum er aufwacht um
am besten die Ursache zu beheben.
S. B. wrote:
>> Wie setzt Du die IOs?> So dass kein Strom fließt. Habe aber auch die IOs nachgemessen wenn er> ungewollt wieder wach wurde - diese stehen alle noch so wie sie sein> sollen.
Schaltest Du etwa die Pull-Ups an den Tastereingängen aus, um Strom zu
sparen?
Wenn ich mir das so überlege, muss es ein Reset an MCLR sein, denn würde
der PIC korrekt aus dem Sleep aufwachen (via Interrupt oder Watchdog),
dann würde das Programm ja weiter laufen und die Daten via UART senden,
was es ja wohl nicht tut.
Wie sieht denn Deine Beschaltung aus, hast Du ein Schema?
Severino R. wrote:
> Schaltest Du etwa die Pull-Ups an den Tastereingängen aus, um Strom zu> sparen?
Nein, die bleiben eingeschaltet. Ich schalte die IOs so, dass kein Strom
fließt, z.B. LED's aus und ein MOSFET schaltet die restliche Peripherie
stromlos.
> Wenn ich mir das so überlege, muss es ein Reset an MCLR sein, denn würde> der PIC korrekt aus dem Sleep aufwachen (via Interrupt oder Watchdog),> dann würde das Programm ja weiter laufen und die Daten via UART senden,> was es ja wohl nicht tut.
Kann ich nicht nachvollziehen, denn bei einem Reset wird die main() doch
von Anfang an durchlaufen, oder? Hier setzte ich nämlich den Merker dass
er in den sleep() gehen soll. Demnächt dürfte er gar nicht aufwachen.
Außerdem sind die Möglichkeiten, die einen RESET verursachen können
deaktiviert (Brownout, Watchdog).
Die Daten werden nur via UART gesendet, wenn eine entsprechende Taste
gedrückt wird. Auch wenn der PIC aufwacht (ohne Tastendruck), wird
deshalb nichts gesendet. Er arbeitet nur mit 4 MHz und braucht mehr
strom - ansonsten macht der nix.
Deshalb meine Frage, was den PIC noch dazu bewegen könnte aufzuwachen.
Im Datenblatt steht noch folgendes:
The device can wake-up from SLEEP through one of the following events:
1. External RESET input on MCLR pin.
-> Ist aber nicht möglich
2. Watchdog Timer Wake-up (if WDT was enabled).
-> Ist disabled
3. Interrupt from INT pin, RB port change or
peripheral interrupt.
-> Port B1 und B4-7 verwende ich für die Taster. Also erzeugen diese bei
Betätigen entweder den INTF (Port B1) oder den RBIF (Port B4-7) -
Interrupt
und diese frage ich ab.
Was ist mit peripheral interrupt gemeint? (Dies müßte ja das PEIE-Bit
sein)
Ich vermute mal, dass über deine Tastenpins irgendein Störimpuls rein
kommt und der PIC desshalb aufwacht. Ich würde einfach die
Abfrageroutine ein wenig ändern, so nach dem Motto: Bin aufgewacht ->
hat jemand eine Taste gedrückt? -> Nö, dann leg ich mich wieder hin.
stepp64 wrote:
> Ich vermute mal, dass über deine Tastenpins irgendein Störimpuls rein> kommt und der PIC desshalb aufwacht.
Könnte durchaus sein, werde ich aber wahrscheinlich nie erfahren...
Selbst wenn ich die Tasteranschlüsse bzw. die Pins am PIC berühre, kann
ich dies nicht erzwingen. Daher denke ich, sollte alles ok sein.
> Ich würde einfach die Abfrageroutine ein wenig ändern, so nach dem> Motto: Bin aufgewacht -> hat jemand eine Taste gedrückt? -> Nö, dann leg ich> mich wieder hin.
Ja, so hab ich es inzwischen schon gemacht. Trotzdem danke für den Tipp.