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
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; //
}
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