www.mikrocontroller.net

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


Autor: Sebastian Mazur (izaseba)
Datum:

Bewertung
0 lesenswert
nicht 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:
typedef struct {
    uint8_t sek;
    uint8_t min;
    uint8_t std;
    uint8_t tag;
    uint8_t monat;
    uint8_t jahr;
} Zeit;

volatile Zeit uhr;

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

}

Der Timer 2 Überlauf Interrupt:
ISR(TIMER2_OVF_vect) {
    if (++uhr.sek >= 60) {
        PowerSaveTimer++;
        uhr.sek = 0;
        if (++uhr.min >= 60) {
            uhr.min = 0;
            if (++uhr.std >=24){
                uhr.std = 0;
            }
        }
    }
}

und die Endlosschleife:
while(1){
      if (!PowerSave) {
         Sek_Local = uhr.sek;
         while(Sek_Local == uhr.sek);
         ShowClock();
         }
      if (PowerSaveTimer >= PowerSaveTimeout) {
          PowerSaveTimer = 0;
          PowerSave = TRUE;
      }
      if (PowerSave) {
          LCDCRA &=~(1<<7); 
          set_sleep_mode(SLEEP_MODE_PWR_SAVE);
                sleep_mode();
          if (!(PINB&(0x40))) {
              PowerSave = FALSE;
                    LCDCRA |=(1<<7);
          }
      }

  }

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

Gruß Sebastian

Autor: Konny (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: Klaus Me (meinzinet)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Andreas K. (a-k)
Datum:

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

Autor: Klaus Me (meinzinet)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Sebastian Mazur (izaseba)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Klaus (Gast)
Datum:

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

Klaus

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Sebastian Mazur (izaseba)
Datum:

Bewertung
0 lesenswert
nicht 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
 
 Sek_Local = uhr.sek;
 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.