RTC Appnote AVR134 Verständnissfrage.

Gast #1276142
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...
#1276399
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
Gast #1276424
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...

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