Forum: Compiler & IDEs RTC Appnote AVR134 Verständnissfrage.


von AVRli (Gast)


Lesenswert?

Hallo, ;-)

ich arbeite mit einem ATmega 644 und habe versucht die Appnote AVR134 
auf diese CPU zu portieren. Orig. ist ATmega 103 doch der ist wohl 
Geschichte...

Ich habe den Uhrenquarz direkt an PC6/PC7 angeschlossen. Externe C's hab 
ich nicht angeschlossen, vlt. auch der Grund warum die Uhr etwas zu 
ungenau läuft. Doch dazu später... ;-)

Der Timer läuft ja asyncron und die CPU geht in den Sleep Mode. Wenn ich 
es nun richtig verstanden habe wird unabhängig von der Main Clock, bei 
mir 3,8 MHz, alle Sekunde die CPU aufgeweckt durch den asycronen 
Uhrenquarz.

Läuft nach dem aufwecken das Programm im Int dann mit dem 3,8 MHz Takt?

Mein "Problem" ist eben das die RTC auf einen Tag gesehen gut eine 
Minute zu schnell läuft. Wodurch ist mir nun etwas unklar. Liegt es an 
den fehlenden C's am Uhrenquarz oder ist am Ablauf noch was falsch?

Es wird in der Appnote auch von syncronisierung mit der Main clock 
gesprochen, doch wie kann man sicher sein das es so ist?

Vielen Dank für Eure Hilfe.

Gruß AVRli...

von Falk B. (falk)


Lesenswert?

@AVRli (Gast)

>Läuft nach dem aufwecken das Programm im Int dann mit dem 3,8 MHz Takt?

Muss ja, siehe Sleep Mode.

>Mein "Problem" ist eben das die RTC auf einen Tag gesehen gut eine
>Minute zu schnell läuft. Wodurch ist mir nun etwas unklar.

Das sind 694ppm, So weit kann man keinen Quarz normal ziehen.

> Liegt es an
>den fehlenden C's am Uhrenquarz oder ist am Ablauf noch was falsch?

Zu 99% ein Softwarefehler.

>Es wird in der Appnote auch von syncronisierung mit der Main clock
>gesprochen, doch wie kann man sicher sein das es so ist?

Sourcecode?

MFg
Falk

von AVRli (Gast)


Lesenswert?

Hi Falk,

ok hier mal die Auszüge aus dem Code...

Initialisierung:
1
//--- Timer 2 -----------------------------------------------------------------
2
//  Timer für Wakeup
3
  fINT.bShortAct = 1;          // STA LED blinken aktivieren
4
5
  long_delay(1000);          // Einschwingzeit des 32kHz Quarzes
6
7
  TIMSK2 &=~((1<<TOIE2)|(1<<OCIE2A)|(1<<OCIE2B));  // disable TC2 interrupt
8
    ASSR |= (1<<AS2);    //set Timer/Counter2 to be asynchronous from the CPU clock 
9
              //with a second external clock(32,768kHz)driving it.  
10
  TCNT2 = 0x00;
11
  TCCR2B |= (5 << CS20);  //exactly 1 second for every overflow to occur
12
  while ((ASSR & (1<< TCN2UB)));  //Wait until TC2 is updated
13
  TIFR2 = (1<<TOV2);                 // Interrupt löschen
14
  TIMSK2 |= (1 << TOIE2);         // Interrupt für Timer2 einschalten
15
  sei();                // Interrupt global freigeben
16
17
  set_sleep_mode(SLEEP_MODE_PWR_SAVE);



Der Interrupt:
1
ISR(TIMER2_OVF_vect) {
2
  clk_sec++;
3
  if (clk_sec == 60) {
4
    fINT.bSigNewMin = 1;
5
    clk_sec=0;
6
    clk_min++;
7
    if (clk_min == 60) {
8
      clk_min=0;
9
      clk_std++;
10
      if (clk_std==24) clk_std=0;
11
    }
12
  }
13
}



und der Sleep Aufruf:
1
  TCCR2B |= (5 << CS20);  //exactly 1 second for every overflow to occur
2
  while ((ASSR & (1<< TCN2UB)));  //Wait until TC2 is updated
3
  fINT.bSleepOn = 1;
4
  sleep_mode();            // in den Schlafmodus wechseln


Hoffe man kann was erkennen... ;-)
Gruß AVRli...

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.