Forum: Mikrocontroller und Digitale Elektronik sleep() mode in C!


von Micro (Gast)


Lesenswert?

Hallo,
Ich würder gerne nach einem Programmdurchlauf eine Pause von 30 Minuten 
einfügen. Dafür eignet sich soweit ich weis der sleep mode am besten, 
jedoch weis ich leider nicht wie ich das in C schreiben soll, speziel 
für die 30 Minuten.

Falls mir jemand weiterhelfen könnte wäre ich sehr erfreut.

Verwende "PCW C Compiler IDE"

mfg

von Uwe (Gast)


Lesenswert?

Und wie soll er aufgeweckt werden nach 30 Minuten ? Durch einen Timer ? 
Was für ein µC ?

von Micro (Gast)


Lesenswert?

Verwende den PIC18F2550.
Das mit dem aufwecken sollte auch Teil der Frage sein.

von Εrnst B. (ernst)


Lesenswert?

Du kannst z.B. einen Uhrenquarz an den Timer1-Osc anlöten.
Damit kriegst du hin, dass der µC jede Sekunde einmal aus dem Sleep 
aufwacht.
Die Sekunden kannst du einfach mitzählen, wenn's 1800 waren, ist die 
halbe Stunde um.

Geht natürlich auch ohne Uhrenquarz. Dann geht aber nicht mehr der 
RTC-Beispielcode unverändert ;)

von Micro (Gast)


Lesenswert?

Ein externes Signal zum einschalten wäre in meinem Aufbau etwa 
unpassend. Etwas Programmtechnisches wäre angenehm.

von Peter D. (peda)


Lesenswert?

Micro schrieb:
> Ich würder gerne nach einem Programmdurchlauf eine Pause von 30 Minuten
> einfügen.

Dann nimm einen Timerinterrupt, die sind dafür gedacht.

Micro schrieb:
> Dafür eignet sich soweit ich weis der sleep mode am besten,

Nö.
Der Sleepmode ist zum Strom sparen bei Batteriebetrieb.
Braucht man keinen Batteriebetrieb, dann besteht auch kein Grund, das 
Programm unnötig kompliziert zu machen.


Peter

von Christian K. (Firma: Atelier Klippel) (mamalala)


Lesenswert?

Man könnte z.B. TMR0 nehmen, mit einem 1:256 Prescaler im 16-Bit Modus. 
Dann eine IRQ Routine für den Timer die nichts weiter macht als das IRQ 
Flag des Timers zu löschen. In der Main-Schleife dann an der Stelle, wo 
die Pause sein soll z.B.:
1
pause_ticks = <Anzahl der Timer-Überläufe um auf ca. 30 Sek. zu kommen>
2
T0CONbits.TMR0ON = 1;
3
4
while(pause_ticks)
5
{
6
    pause_ticks--;
7
    _asm SLEEP _endasm
8
}
9
10
T0CONbits.TMR0ON = 0;

Der Zähler "pause_ticks" muss natürlich ein passender Typ sein um die 
benötigte Anzahl der Überläufe darstellen zu können. Zwar wacht der PIC 
dann bei jedem Überlauf auf, schläft dann aber schnell wieder ein da ja 
nur das IRQ Flag gelöscht wird und der pause_ticks Zähler um einen 
heruntergezählt wird (plus der Vergleich ob er dann 0 ist). Natürlich 
muss man vorher den Timer passend konfigurieren. Je nachdem wie genau 
man die 30 Sekunden treffen will muss dann halt der Prescaler und der 
Zählerwert angepasst werden.

Grüße,

Chris

von Sven H. (dsb_sven)


Lesenswert?

Es sollen wohl 30 Minuten werden. Da kommt es vermutlich nicht auf eine 
Sekunde mehr oder weniger an...

von Micro (Gast)


Lesenswert?

Peter Dannegger schrieb:
> Der Sleepmode ist zum Strom sparen bei Batteriebetrieb.

Es läuft über Akku.

von raute (Gast)


Lesenswert?

Peter Dannegger schrieb:
> Der Sleepmode ist zum Strom sparen bei Batteriebetrieb.
Nimm es mir nicht übel, aber wenn dass Ding 30 Minuten lang nichts 
tut, sollte es so wenig Strom verblasen wie es nur irgend geht. Egal ob 
Akku oder nicht.

von raute (Gast)


Lesenswert?

Micro schrieb:
> Es läuft über Akku.
Das häätest du im übrigen gleich mit in dein erstes Posting schreiben 
können, besser sollen und eher sogar müssen. ;-)

von Christian K. (Firma: Atelier Klippel) (mamalala)


Lesenswert?

Sven H. schrieb:
> Es sollen wohl 30 Minuten werden. Da kommt es vermutlich nicht auf eine
> Sekunde mehr oder weniger an...

Ahh, stimmt, mein Fehler.

Aber die Grundidee ist die gleiche.

Grüße,

Chris

von Εrnst B. (ernst)


Lesenswert?

Christian Klippel schrieb:
> Aber die Grundidee ist die gleiche.

Und was spricht gegen die Lösung mit dem Uhrenquarz am Timer1?

Das ist kein externes Wecksignal und auch keine Uhr, nur der Quarz für 
<10cent.

Damit kriegst du (laut Datenblatt) deine Warterei mit ~ 25 µA hin.

Du must halt umdenken: Statt dem PIC zu sagen: "Warte 30 Minuten" musst 
du ihm 1800-mal sagen: "Warte eine Sekunde".

von Christian K. (Firma: Atelier Klippel) (mamalala)


Lesenswert?

Εrnst B✶ schrieb:
> Christian Klippel schrieb:
>> Aber die Grundidee ist die gleiche.
>
> Und was spricht gegen die Lösung mit dem Uhrenquarz am Timer1?
>
> Das ist kein externes Wecksignal und auch keine Uhr, nur der Quarz für
> <10cent.
>
> Damit kriegst du (laut Datenblatt) deine Warterei mit ~ 25 µA hin.
>
> Du must halt umdenken: Statt dem PIC zu sagen: "Warte 30 Minuten" musst
> du ihm 1800-mal sagen: "Warte eine Sekunde".

Meiner Ansicht nach? Nichts, dafür ist eine solche Funktionalität ja da.

So wie man den TO aber verstehen koönnte möchte er da keine Extra-Teile 
verwenden:

"Ein externes Signal zum einschalten wäre in meinem Aufbau etwa
unpassend. Etwas Programmtechnisches wäre angenehm."

Grüße,

Chris

von Klaus (Gast)


Lesenswert?

Micro schrieb:
> Das mit dem aufwecken sollte auch Teil der Frage sein.

Watchdog?

MfG Klaus

von Peter D. (peda)


Lesenswert?

raute schrieb:
> Nimm es mir nicht übel, aber wenn dass Ding 30 Minuten lang nichts
> tut, sollte es so wenig Strom verblasen wie es nur irgend geht. Egal ob
> Akku oder nicht.

Der Sleep-Mode ist nicht dazu da, um irgendeine Aufgabe zu erfüllen. Er 
soll nur Strom sparen. D.h. zuerst macht man allein die Funktion des 
Programms.
Und erst wenn alles richtig läuft, kann man auf Stromverbrauch 
optimieren, also den Sleep-Mode hinzufügen.
Ich hab das hier mal an einem Beispiel demonstriert:

Beitrag "AVR Sleep Mode / Knight Rider"


Bei Netzbetieb lohnt sich der zusätzliche Programmieraufwand in der 
Regel nicht. Ob der MC nun 1mA oder 10µA zieht, macht sich nirgends 
bemerkbar. Der 7805 Spannungsregler verbraucht sogar mehr, als der MC.

Bei ner 2kW Herdplatte kommt ja auch niemand auf die Idee, die 
Kontrollglimmlampe rauszudrehen, um Strom zu "sparen".


Peter

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.