sleep() mode in C!

Gast #2687391
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
#2687412
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 ;)
#2687441
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
(Firma: Atelier Klippel) #2687445
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
Gast #2687492
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.
#2687563
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".
(Firma: Atelier Klippel) #2687647
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
#2687921
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren