Hallo zusammen, habe folgendes Problem: Möchte auf meinem Display eine einfache Uhr laufen lassen(Echtzeit) Funktioniert sowiet auch ganz gut, das Problem ist, dass die Uhr Pro Tag um ca. 3-5s falsch geht. Takte den MSP mit 8MHz, teile den Takt durch 64. Lasse meinen Timer bis 500ms hochzählen, dann wird nen Interrupt ausgelöst. In diesem Interrupt setzt ich dann eine "Timerflag" hoch, welches ich in meinem Hauptprogramm zyklisch auswerte. Habe dann eine kleine Ujmrechnung für die LCD-Darstellung. Wie gesagt, klappt auch soweit ganz gut. Läuft aber halt nicht exakt. Habe schon am Timer gespielt. Wenn ich aber sowohl ein Takt mehr oder weniger laufen lass, wirds immer ungenauer. Wo ist also mein Fehler. BCSCTL1 |= XTS; do { IFG1 &= ~OFIFG; for (i = 0xFF; i > 0; i--); } while ((IFG1 & OFIFG) != 0); BCSCTL2 |= SELM1+SELM0+DIVS_3+DIVM_0+SELS;// MCLK = LFXT1 (safe) TACTL = TASSEL1 + TACLR + ID_3; // Initialisierung Timer A CCTL0 = CCIE; CCR0 = 62500; // 500ms-Periode TACTL |= MC0; //TACTL |= MC0; _EINT(); .. .. .. for(;;) { while (Timerflag == 1) { Timerflag = 0; if (ms>=2){ms=0;s++;}; if (s>=10 ){s=0;ss++;}; if (ss>=6 ){ss=0;m++;}; if (m>=10 ){m=0;mm++;}; if (mm>=6 ){mm=0;h++;}; if (h>=10 ){h=0;hh++;}; if (hh>=3 ){hh=0;}; if (hh==2 && h == 4){h=0;hh=0;}; } #pragma vector=TIMERA0_VECTOR __interrupt void Timer_A (void) { Timerflag = 1; P3OUT &= ~BIT4; for (y=1;y>=0;y--); ms++; } Diese Rechnung kam halt durch die einfachere Ausgabe auf das Display zustande. Uhr sieht dabei folgenderweise aus: ..hh_h:mm_m:ss_s.. Wo liegt mein Denkfehler? Ist bestimmt nicht die galanteste Methode um das umzusetzen. Wollte es halt selber hinbekommen, statt nur immer fertigen Code zu benutzen. mfg Wolf
wie genau läuft dein LFXTCLK? wählst Du mit SELM1 nicht den DCO für MCLK aus? Wenn Du die IAR bzw TI Header verwendest müsste es SELM_0 + SELM_1 heißen. BCSCTL2 |= SELM1+SELM0+DIVS_3+DIVM_0+SELS;// MCLK = LFXT1 (safe) Mit was arbeitest Du?
Hallo! selbst wenn du einen speziellen Uhrenbaustein (327686 Hz-Quarz) verwendest, wirst du eine Abweichung von ca 80 ppm (ca 6 sekunden/Tag) feststellen. Die U(h)rsache liegt DORT in der Anschaltung des Uhrenbausteines an den Quarz, dessen Frequenz um eben diesen Betrag gezogen wird. Deshalb haben Uhrenbausteine normalerweise Adjustment register, mit dem man bis zu +-200 ppm ausgleichen kann. Diese Baustein machen das so, dass z.b. alle 20 sekunden einige wenige Quarz-Clocks mehr bzw weniger zum sekundenzählen nötig sind. Gruß Martin
Ich habe mit so einem "Uhrenbaustein" meine Uhr laufen lassen. Ich lag etwas unter dem von Martin genannten 6 sec/Tag.
Dann hast Du einen Quarz mit weniger "pf" verwendet, die laufen etwas genauer. Ausserdem haben die Quarze eh ca. 30 ppm Fehler Gruß Martin
Das Problem ist nur, einen so genauen Frequenzmesser zu bekommen, um den Trimmer abzugleichen. Deshalb lasse ich die Uhr einige Tage laufen und ermittle die Abweichung, z.B. mit der Videotext-Uhr oder einer Funkuhr. Dann berechne ich daraus die exakte Quarzfreqenz und setze die Teiler entsprechend: http://www.mikrocontroller.net/forum/read-4-57760.html Das Prinzip sollte auf den MSP übertragbar sein. Peter
Wie hoch ist eigentlich der Stromverbrauch, wenn ich die Uhr laufen lasse? Müsste doch auch im LPM4 gehen, oder?
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.