Hallo, ich arbeite mit dem PIC24f128ga006, der auf einen Sensorknoten Board verbaut ist, der ist dort mit einer Batterie versorgt. ich will über das Programm, was ich drauf schreibe, die Möglichkeit haben den PIC zum Schlafen zu bringen, wenn die Akku der Batterie um einen bestimmten Wert abfällt. Zum wecken des PICs gibt es eine Möglichkeit die Change notification pins zu benutzten. Auf dem sensor board gibt es ein Reed Kontakt; sein port ist ein I/O port und ich habe mir überlegt dies zum Wecken des PIC zu benutzen. Kann jemand mir dabei helfen?Ich meine den pic zum schlafen zu legen und wieder aufzuwecken. Gebe es eine andere Möglichkeit den PIC ohne diese I/O port zu benutzen, wenn man weiss, dass im Sleep Mode das System clock nicht mehr funktioniert? Danke für die Rückmeldung Marguerite
Hallo, Marguerite schrieb: > Gebe es eine andere Möglichkeit den PIC ohne diese I/O port zu benutzen, > wenn man weiss, dass im Sleep Mode das System clock nicht mehr > funktioniert? Die Frage verstehe ich nicht. Was genau meinst du damit? Gruß, Edson
Hi Edson, Ich will den PIC irgendwie vom Schlaf wecken. Über I/O port(Input/output port) kann ich mit CN(change notification) den PIC aufwecken.Auf meinem Board gibt es ein Magnet sensor die mit dem I/O port verbunden ist, dieser pin hat die funktionalität CN(Change notification), diese Funktionalität benutze ich im Moment zum aufwecken des PICs. Im Sleep modus, funktioniert den Clock nicht mehr so dass ein aufwecken über den Timer interrupt unmöglich ist. Meine Frage ist kann es unter diese Situation eine Möglichkeit geben den PIC zu wecken? VG marguerite
Marguerite schrieb: > Meine Frage ist kann es unter > diese Situation eine Möglichkeit geben den PIC zu wecken? Ja, wenn du den Watchdog (WDT) erlaubst. Der hat eine eigene RC-Clock, die nichts mit dem CPU-Takt zu tun hat. Gruß, Edson
Hi Edson, die Idee mit der WDT ist sehr gut, danke erstmal. Ich habe den Application note durchschaut. Die Beispiele mit dem WDT sind auf assembler geschrieben. Wäre es möglich., dass du mir ein Beispiel code in C gibst. Nur als bezugspunkt, um zu sehen wie das ganze programmiert wird. VG Marguerite
Eigentlich machst du in C das gleiche wie in dem Assembler-Code. Zunächst muss ja das FWDTEN-Bit im Config-Word1 zurückgesetzt sein, was nicht der Default-Einstellung entspricht. Du kannst das im Quelltext machen oder in der MPLAB IDE unter Device->Configuration per GUI einstellen. Bis hierher musst du kein Programm schreiben. Um den Watchdog von der Firmware aus zu aktivieren, musst du im RCON-Register das Bit SWDTEN setzen:
1 | RCONbits.SWDTEN = 1; |
Diese Syntax gilt eigentlich für alle Bits in den SFR oder GPR-Regionen des Arbeitsspeichers. Ich weis jetzt aus dem Gedächtnis nicht genau, wie der Sleep-Mode im C30 mit PIC24-Lib ausgelöst wird. Ich glaube, in der PIC24Lib war es auch einfach:
1 | Sleep(); |
Mehr gibt es eigentlich nicht zu beachten. Das Einstellen des Prescalers für den WDT wirst du selber hinbekommen, der Rest wird weitgehend von der PIC24-Hardware erledigt: Der hinter dem Sleep()-Aufruf verborgene Assembler-Ausdruck PWRSAV löst einen WDT-Reset aus. d.h. die per Prescaler eingestellte Zeit bis zum Auslösen das Watchdog fängt in dem Moment an abzulaufen, in dem der Sleep-Mode eingetreten ist. Sollte das nicht reichen, poste mal das Assembler-Beispiel. Dann sehen wir weiter. Gruß, Edson
bei den PICs kann man verschiedene Sleep-Modi einstellen. Der Timer1 kann auch im Sleep weiterlaufen (mit eigenem Quarz oder Takt)
Hi tt4u, ... aufwachen aus Sleep geht natürlich auch ohne Takt oder Timer. wie kannst du dies ermöglichen?
Hallo, Marguerite schrieb: > wie kannst du dies ermöglichen? ich dachte eigentlich, das wäre dir bekannt. Du hast ja konkret auf die Situation mit angehaltenem CPU-Takt hingewiesen und gefragt: Marguerite schrieb: > Meine Frage ist kann es unter > diese Situation eine Möglichkeit geben den PIC zu wecken? Die Frage wurde auch beantwortet. Marguerite schrieb: > wie kannst du dies ermöglichen? Hast du eigentlich mal ins Datenblatt geschaut? Gruß, Edson
Wer lesen kann, ist eindeutig im Vorteil: Datenblatt Kapitel 8.0 The device will wake-up from Sleep mode on any of the these events: • On any interrupt source that is individually enabled • On any form of device Reset • On a WDT time-out On wake-up from Sleep, the processor will restart with the same clock source that was active when Sleep mode was entered. The device will wake from Idle mode on any of these events: • Any interrupt that is individually enabled. • Any device Reset. • A WDT time-out. On wake-up from Idle, the clock is re-applied to the CPU and instruction execution begins immediately, starting with the instruction following the PWRSAV instruction, or the first instruction in the ISR.
tt4u schrieb: > • On any interrupt source that is individually > enabled Uuuuuuh aufpassen! Im Sleep mode können nicht alle hardware-module auch einen interrupt erzeugen. Es geht zb bei: spi im Slave Mode, INT0, etc. also im Grunde alle Module wo kein Takt für die Funktion benötigt wird, da dieser im Sleep nicht weiterläuft. Das heißt leider auch, dass z.B. ein UART-Receive keinen Interrupt erzeugen wird. Auch ist zu beachten, dass im Sleep-Mode, meines Wissens nach, alle Pins hochohmig sind! Für viele Fälle geeignet und auch stromsparend ist der Idle-Mode.
HI Edson, ich habe bis jetzt versucht die Funktionalität für den WDT zu programmieren.Ich habe ein Problem, um die Bits, die in register FLASH CONFIGURATION WORD 1 sind, anzusprechen. Die sind FWDTEN (muss auf 0 um die controlle der WDT per SW zu ermöglichen),FWPSA(Prescaler),WDTPS (für postscaler). Danke wenn sie mir weiterhelfen können. Ich benutze den PIC24fj128ga006 Gruß Marguerite
Hi Edson, endlich habe ich die Bits konfigurieren können. hier ist ein stück von was ich programiert habe ich will die Batteriespannung ADCValue lesen und prüfen ob es einen Schwellwert überschreitet wenn nicht muss den pic wieder zum schlafen gelegt werden. Ansonsten wird den Watchdog ausgeschaltet und den pic kann weiterlaufen. #pragma config FWDTEN=OFF //Watchdog Timer #pragma config WDTPS=256 //Watchdog Timer Postscaler #pragma config FWPSA=1 //7-bit Prescaler if(ADCValue5<0x0299) { RCONbits.SWDTEN=1;//WDT enabled in software ClrWdt(); //zurücksetzen des WDT Flag Sleep(); RCONbits.SLEEP=0; //Disable from sleep } else { greenLED=1; RCONbits.SWDTEN=0; // }
Marguerite schrieb: > hier ist ein stück von was ich programiert habe Das schaut doch schon ganz gut aus. Oder hakt es noch irgendwo? Gruß, Edson
Hi Edson, danke für die Anmerkung. Ich wollte nur, dass du siehst, ob der ist, wie es sein sollte. Ich werde jetzt alles im betrieb nehmen. Danke noch einmal für die Hilfe. Gruß Claire
Hi Alle, ich arbeite mit dem PIC24fj128ga006. ich habe im Datenblatt gelesen, dass dies ein 16-bit Flash Microcontroller ist. Heisst das, dass der PIC ein Flash-Speicher von 16 bit hat? Was bedeutet: Linear Programm Memory Addressing up to 12 MBytes? Linear Data Memory Addressing up to 64 KBytes? Danke für die Rückmeldung Marguerite
Hitt4u Danke für die Rückmeldung aber wie kommst du auf diese Werte? Viele Grüße Marguerite
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.