Forum: Mikrocontroller und Digitale Elektronik PIC16LF876 wacht selbständig aus sleep auf - warum?


von netfriend (Gast)


Lesenswert?

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

von Severino R. (severino)


Lesenswert?

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?

von netfriend (Gast)


Lesenswert?

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.

von Severino R. (severino)


Lesenswert?

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.

von Stefan (netfriend)


Lesenswert?

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.

von Severino R. (severino)


Lesenswert?

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?

von Stefan (netfriend)


Lesenswert?

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)

von stepp64 (Gast)


Lesenswert?

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.

von Stefan (netfriend)


Lesenswert?

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.

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
Noch kein Account? Hier anmelden.