Forum: Mikrocontroller und Digitale Elektronik Sleep Mode, Idle Mode PIC18


von Mia sain mia (Gast)


Lesenswert?

Hallo,

ich nutze einen PIC18LF25K50 und als IDE MPLAB v2.25.
http://www.microchip.com/wwwproducts/Devices.aspx?product=PIC18F25K50

Ich betriebe den MCU und ein BT Modul mit einem Akku und bin deswegen 
auf einen geringen Stromverbrauch aus.

Mit dem BT Modul würde ich gerne alle 900ms broadcasten. Das BT Modul 
kann über die UART Schnittstelle vom PIC konfiguriert werden.

Wenn ich das Modul einmal konfiguriert habe sendet es automatisch alle 
900ms seine ID.

In der Zwischenzeit will ich jetzt den PIC in den IDLE bzw. Sleep Modzus 
versetzen, um Strom zu sparen.

Wie Trigger ich dieses Modul dann später wieder hinaus?
Am liebsten wäre mir in etwa das Folgende:

while(1)
{
SendeID();
// Setze Controller 900ms in Idle oder SleepMode
// warte 900ms
// PIC aus Idle oder Sleep Modus holen
SendeID();

}

Ich weiss nicht genau wie man sowas macht. Von der Syntax des obigen 
PICs bzgl. des IDLE Modus habe ich wenig Ahnung.

Das Datenblatt sagt in etwa folgendes:
1
OSCCONbits.IDLEN = 1;   // IDLEN: Idle enable bit
2
                            // 1 = Device enters idle mode on sleep instruction
3
                            // 0 = Device enters sleep mode on sleep instruction

Vielleicht hat ja Jemand schon Erfahrung mit dem genannten Modus und dem 
obigen Controller gesammelt und kann mir etwas auf die Sprünge helfen.

Danke

von Max H. (hartl192)


Lesenswert?

Du kannst den PIC z.B. durch ein Timer Interrupt aufwecken. Schlafen 
schickst du ihn mit dem "sleep" (ASM-)Befehl oder einem entsprechendem 
Makro.

Die Hausptschleife könnte dann in etwas so aussehen:
1
while(1)
2
{ 
3
  SendeID();
4
5
  SLEEP();  // Macro beim XC8 Compiler
6
}
In Hintergrund läuft ein Timer, der alle 900ms ein Interrupt generiert.

Alles Wissenswerte zum Thema Sleep/Idle findest du im Datenblatt im 
Kapitel "4.0 POWER-MANAGED MODES".

: Bearbeitet durch User
von Jochen-paul S. (picfan)


Lesenswert?

hallo,
der Watchdog kann so eingestellt werden, dass der PIC selbständig nach 
einer (einstellbaren) Zeit wieder erwacht, dabei konsumiert er Strom im 
Nanoampère-Bereich!
freundlicher Gruss Jochen-Paul

von Mia sain mia (Gast)


Lesenswert?

Jochen-paul S. schrieb:
> hallo,
> der Watchdog kann so eingestellt werden, dass der PIC selbständig nach
> einer (einstellbaren) Zeit wieder erwacht, dabei konsumiert er Strom im
> Nanoampère-Bereich!
> freundlicher Gruss Jochen-Paul

Hallo und schon einmal vielen Dank für die Antworten.
Es wäre also in etwa folgendes möglich:

void main(void) {

init();   // alle Initialisierungen inkl. Watchdog Timer
configure_BT_send_ID();   // BT Modul so konfigurieren, dass ID alle X 
ms senden soll

while(1)
{
// Pic erwacht alle 5min und macht irgendwas
}

}

Wie kann ich jetzt abfragen ob der PIC gerade erwacht ist oder nicht?
Hat jemand ein Beispiel wie man den Watchdog Timer oder den Sleep Modus 
für den PIC18 richtig einstellt?

Vielen Dank schon einmal

von Max H. (hartl192)


Lesenswert?

Mia sain mia schrieb:
> Wie kann ich jetzt abfragen ob der PIC gerade erwacht ist oder nicht?
Wenn er durch ein Timer Interrupt geweckt wird macht er einfach dort 
weiter, wo der SLEEP Befehl steht. Der WDT löst einen Reset aus, im RCON 
Register kannst du danach den Grund für den Reset abfragen.


BTW:
Für C-Code bitte die Formatierung verwenden:
1
[c]C-Code[/c]

: Bearbeitet durch User
von Jochen-paul S. (picfan)


Lesenswert?

Hallo,
also der Watchdog beim PIC18LF25K50 liefert eine maximale Wartezeit von 
c.a. 2Min. u. 18Sek.
Mit der "Sleep" Instruktion wird bei diesem Pic der ganze Oszillator 
stillgelegt, nur noch der sehr sparsame Low-INTOSC betreibt den Watchdog 
bis sein Zähler voll ist, dann gibt's keinen Reset(!), sondern der 
Programmcounter fährt dort weiter, wo der Sleep-Befehl gegeben wurde, 
d.h. eine Instruktion weiter.
Wichtig ist, dass bei den Configuration Words der Watchdog nicht aktiv 
ist, dafür wird er via Software aktiviert (natürlich bevor die 
Sleep-Instruktion benützt wird):

CONFIG2H = 0x3E;

WDTCON   = 0x01;

freundlichen Gruss J.P.

von Mia sain mia (Gast)


Lesenswert?

Recht herzlichen Dank

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.