www.mikrocontroller.net

Forum: Compiler & IDEs MSP430 Echtzeit-Uhr


Autor: wolf30 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: m@is (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Martin Raffelsieper (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: m@is (Gast)
Datum:

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

Autor: Martin Raffelsieper (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Hefti (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie hoch ist eigentlich der Stromverbrauch, wenn ich die Uhr laufen 
lasse? Müsste doch auch im LPM4 gehen, oder?

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.