Forum: Compiler & IDEs MSP430 Echtzeit-Uhr


von wolf30 (Gast)


Lesenswert?

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

von m@is (Gast)


Lesenswert?

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?

von Martin Raffelsieper (Gast)


Lesenswert?

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

von m@is (Gast)


Lesenswert?

Ich habe mit so einem "Uhrenbaustein" meine Uhr laufen lassen. Ich lag
etwas unter dem von Martin genannten 6 sec/Tag.

von Martin Raffelsieper (Gast)


Lesenswert?

Dann hast Du einen Quarz mit weniger "pf" verwendet, die laufen etwas
genauer.


Ausserdem haben die Quarze eh ca. 30 ppm Fehler

Gruß Martin

von Peter D. (peda)


Lesenswert?

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

von Hefti (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.