Forum: Compiler & IDEs Powersave Modus und Timer2 mit 32kHz Quarz


von Sebastian M. (izaseba)


Lesenswert?

Hallo,
Ich stehe hier vor einem Problem und hoffe, daß mir jemand helfen kann.
Und zwar experimentiere ich zur Zeit mit meinem Butterfly und versuche 
eine Uhr zu Programmieren.
Zusätzlich möchte ich, daß der Schmetterling nach einer Zeit in den 
Powersave Modus wechselt.

An sich keine große Sache, ich habe mir das eine oder andere aus dem 
Originalprogramm abgeschaut und die Uhr läuft sehr genau.
Erst nachdem ich versuche in den Powersave Modus zu wechseln, gibt es 
ein Problem und zwar wechselt der Butterfly in Powersave läßt sich auch 
wieder Wecken, nur die Zeit stimmt danach absolut nicht mehr.
Ich würde sagen in 5 Minuten Powersave ist die Uhr etwa 20 Minuten 
weitergelaufen...
Ich hänge einfach die wichtigsten Sachen rein

Für die Uhr habe ich eine struct genommen:
1
typedef struct {
2
    uint8_t sek;
3
    uint8_t min;
4
    uint8_t std;
5
    uint8_t tag;
6
    uint8_t monat;
7
    uint8_t jahr;
8
} Zeit;
9
10
volatile Zeit uhr;

Timer2 Init:
1
void RTC_Init(void) {
2
    cli();
3
    TIMSK2 &=~(1<<TOIE2);
4
    ASSR = (1<<AS2);
5
    TCNT2 = 0;
6
    TCCR2A |= (1<<CS22) | (1<<CS20);// select precaler: 32.768 kHz / 128 = 1 sec between each overflow
7
    while((ASSR & 0x01) | (ASSR & 0x04));// wait for TCN2UB and TCR2UB to be cleared
8
    TIFR2 = 0xFF;           // clear interrupt-flags
9
    TIMSK2 |=(1<<TOIE2);     // enable Timer2 overflow interrupt
10
    sei();
11
    uhr.sek = 0;
12
    uhr.min = 20;
13
    uhr.std = 19;
14
    uhr.tag = 1;
15
    uhr.monat = 12;
16
    uhr.jahr = 7;
17
18
}

Der Timer 2 Überlauf Interrupt:
1
ISR(TIMER2_OVF_vect) {
2
    if (++uhr.sek >= 60) {
3
        PowerSaveTimer++;
4
        uhr.sek = 0;
5
        if (++uhr.min >= 60) {
6
            uhr.min = 0;
7
            if (++uhr.std >=24){
8
                uhr.std = 0;
9
            }
10
        }
11
    }
12
}

und die Endlosschleife:
1
while(1){
2
      if (!PowerSave) {
3
         Sek_Local = uhr.sek;
4
         while(Sek_Local == uhr.sek);
5
         ShowClock();
6
         }
7
      if (PowerSaveTimer >= PowerSaveTimeout) {
8
          PowerSaveTimer = 0;
9
          PowerSave = TRUE;
10
      }
11
      if (PowerSave) {
12
          LCDCRA &=~(1<<7); 
13
          set_sleep_mode(SLEEP_MODE_PWR_SAVE);
14
                sleep_mode();
15
          if (!(PINB&(0x40))) {
16
              PowerSave = FALSE;
17
                    LCDCRA |=(1<<7);
18
          }
19
      }
20
21
  }

Wie gesagt, lasse ich die Sache mit Powersave weg läuf die Uhr mehrere 
Tage ohne Problemme.
Weiß da jemand einen Rat ?

Gruß Sebastian

von Konny (Gast)


Lesenswert?

Hey,

kann dir zwar echt nicht weiterhelfen bei deinem Problem, wär aber sehr 
interressiert an dem Programm deiner Uhr, da ich grad einsteige in die 
Thematik von Timern und auch ein Entwicklungsboard mit einem 32kHz Quarz 
besitzte.

Wär super wenn du mir das zukommen lassen könntest!
(ghosty1@web.de)

von Klaus M. (meinzinet)


Lesenswert?

Hallo Sebastian

Man verwendet Powersave, oder andere Sleep Modi dazu um Strom zu sparen.
Warum wechselst du nicht sofort nachdem du die Schleife abgearbeitet 
hast sofort in den Powersave Modus? Nach dem Erwachen zeigst du die Zeit 
an und gehst sofort wieder schlafen?

Außerdem muss man laut Datenblatt aufpassend dass man nicht gleich 
wieder in den SleepModus wechselt nachdem man aus diesem kommt. In 
deimen Fall sollten mindestens 30,5µs vergangen sein(Bei 8 MHz Quarz 
sind das 244 Cyklen). Laut datenblatt AtMega32 kann man aber folgendes 
machen :
If the user is in doubt whether the time before re-entering Powersave
or Extended Standby mode is sufficient, the following algorithm can be 
used to ensure that one TOSC1 cycle has elapsed:
1. Write a value to TCCR2, TCNT2, or OCR2.
2. Wait until the corresponding Update Busy Flag in ASSR returns to 
zero.
3. Enter Power-save or Extended Standby mode.

G Klaus

von Andreas K. (a-k)


Lesenswert?

Wenn er das nach 4 Monaten immer noch nicht raus hat...

von Klaus M. (meinzinet)


Lesenswert?

@a-k
Danke für den Hinweis hab gar  nicht auf das Datum geachtet.
Hab nicht gewusst dass nach Datum des letzten Beitrags sortiert wird.

von Sebastian M. (izaseba)


Lesenswert?

Hallo,
danke für Eure Antworten und ja Andreas, ich habe das Programm seit etwa 
4 Monaten am laufen ;-)

@Konny,
Die Ausschnitte ist eigentlich schon fast das ganze Uhrprogramm, wenn Du 
dir die Sources von Butterfly runterlädst kannst Du mehr sehen...

@Klaus
>Man verwendet Powersave, oder andere Sleep Modi dazu um Strom zu sparen.
??? Sorry, das verstehe ich jetzt nicht...

>Warum wechselst du nicht sofort nachdem du die Schleife abgearbeitet
>hast sofort in den Powersave Modus?
Tue ich doch, der Butterfly wacht jede Sekunde in der Timer 2 ISR auf, 
zählt die Variablen hoch und geht wieder schlafen, es sei denn eine 
Taste wurde gedrückt, dann wird PowerSave False, das Display wird 
eingeschaltet und für die dauer von PowerSaveTimeout in Minuten wird die 
Zeit angezeigt.

Danach wird wieder in Stromsparmodus gewechselt.

Gruß Sebastian

von Klaus (Gast)


Lesenswert?

Hallo Dann kann es also sein, dass du viel zu schnell wieder in den 
Sleep Modus gehst?

Klaus

von Falk B. (falk)


Lesenswert?


von Sebastian M. (izaseba)


Lesenswert?

@Klaus
>Hallo Dann kann es also sein, dass du viel zu schnell wieder in den
>Sleep Modus gehst?

Glaub ich nicht,

Ich habe nochmal verglichen was ich geändert habe,
zu einem habe ich dem 32 kHz Quarz 1 Sekunde Zeit zum einschwingen 
gegeben, bevor ich in den Asynchronen Timermodus gehe,
zum zweiten schalte ich noch den Displayinterrupt ab, wenn 
Powersavemodus True wird und zum dritten habe ich noch die unsinnigen 
Zeilen
1
 
2
 Sek_Local = uhr.sek;
3
 while(Sek_Local == uhr.sek);
entfernt.

Seitdem funktioniert der Butterfly einwandfrei :-)

Warum die Uhr so schnell lief, weiß ich immer noch nicht aber wie gesagt 
jetzt geht es !

Gruß Sebastian.

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.