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