Gast
#76910
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