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...
@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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.