Forum: Mikrocontroller und Digitale Elektronik ARM RTC-Fehler beim LPC23*


von Markus (Gast)


Lesenswert?

Hallo allerseits!

Sollte eigentlich gleich ins ARM Forum (-;

Hat von Euch jemandeinen Fehler beim LPC
(speziell beim LPC2365) gehabt wie ich?

Folgender Fehler:
Die interne RTC des LPC wird ständig abgefragt, und am LCD angezeigt.
Anzeige mit Tag, Monat, Jahr, Stunde, Minute und Sekunde
Irgendwann am Tag springt der Monatswert auf "0" !?
Ist ist kein Absturz geschehen; es kann auch Tage gut gehen, aber
irgendwann ist der Monatswert weg.

Der Monatswert würde eigentlich ja niemals den Wert 0 annehmen (laut
Datenblatt). Im Programm wird dieser ebenfalls nie auf 0 gesetzt!

Was läuft hier schief ?

Hat jemand was ähnliches bereits gehabt?

Grüße
Markus

von Robert T. (robertteufel)


Lesenswert?

Hallo Markus

Hab da mal ne Frage. Ist der Monatswert nur vorruebergehend auf "0" oder 
bleibt er dann auf diesem (unsinnigen) Wert? Klingt fuer mich wie eine 
Race Condition, also so etwas wie lesen durch Software gleichzeitig mit 
Schreiben durch Hardware und dabei passiert etwas unerwartetes.

Folgender Versuch waere mal interessant.
Ganz oft lesen, kommt der Zustand dann eher oder nur einmal pro Minute 
lesen, dauerts dann ewig bis der Zustand auftritt? Falls diese Ansaetze 
sich bewahrheiten sollten, dann ist es durchaus wahrscheinlich, dass ein 
mix Effekt HW und SW da ist. Ansonsten koennte auch noch ein 
wildgewordener Pointer hier und da zuschlagen oder die Hardware 
tatsaechlich durch einen Glitch ab und zu den Monat auf "0" setzen. 
Letzteres waere vermutlich schon einigen Entwicklern aufgefallen aber 
man weiss nie.

Nur so ein paar Gedanken zum Debuggen.

Robert Teufel
Partner in Silicon Valley gesucht?
Ich stehe gerne zur Verfuegung.
-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
Meine ARM/Cortex Webseite: http://www.lpc2000.com

von Markus (Gast)


Lesenswert?

Vielen Dank für deine Antwort Robert!

Auf die Uhrenregister wird im Normalfall ca. alle 7ms zugegriffen; 
sprich gelesen. Wenn besondere Ereignissen eintreten auch öfter.

Mit folgender Routine wird ca. alle 7ms auf die Uhr zugegriffen und
auf LCD ausgegeben.

sprintf(LCD_Puffer,"  %02d.%02d.%02d ",RTC_DOM,RTC_MONTH,RTC_YEAR);
   switch (RTC_DOW){
     case 0: LCD_Puffer[0] = 'S'; LCD_Puffer[1] = 'o'; break;
     case 1: LCD_Puffer[0] = 'M'; LCD_Puffer[1] = 'o'; break;
     case 2: LCD_Puffer[0] = 'D'; LCD_Puffer[1] = 'i'; break;
     case 3: LCD_Puffer[0] = 'M'; LCD_Puffer[1] = 'i'; break;
     case 4: LCD_Puffer[0] = 'D'; LCD_Puffer[1] = 'o'; break;
     case 5: LCD_Puffer[0] = 'F'; LCD_Puffer[1] = 'r'; break;
     case 6: LCD_Puffer[0] = 'S'; LCD_Puffer[1] = 'a'; break;
     default:{LCD_Puffer[0] = 'E'; LCD_Puffer[1] = 'R';}break;
     }
sprintf(&LCD_Puffer[13],"%02d:%02d:%02d",RTC_HOUR,RTC_MIN,RTC_SEC);

Was meinst du mit HW-SW konflikt? Etwa wenn die HW den Registerwert 
ändert,
und ich in diesem Moment die Register auslese? Wenn das so wäre, wie 
soll ich der Uhr jeweils trauen, ob sie gerade richtig ist?

Ob der Wert nur vorübergehend auf 0 ist, weiß ich nicht, da ich nicht 
einen
ganzen Monat abgewartet habe bis sich der Wert ändert. Für einige 
Minuten, Stunden blieb sie jedenfalls auf 0 (solange ich sie nicht 
wieder manuell
richtig gesetzt habe).

Hab im Datenblatt gelesen, dass es noch weitere Register gibt in denen 
die
Uhr dargestellt ist. Es sind (32bit)Register die z.B. Sekunden, Minuten, 
Stunden auf einmal beinhalten. Sollten diese Register zum Aulesen 
verwendet werden?
Oder sollte man die Uhreregister nur 1-2mal die Sekunde auslesen; sie in 
Variablen legen, und mit diesen Variablen (bis zur nächsten 
Uhrenregister Auslesung) arbeiten?

Viele Grüße
Markus

von Mike (Gast)


Lesenswert?

Ich vermute, dass die RTC von einem externen 32kHz Quarz angetrieben 
wird. Da dieser asynchron zum Takt des Mikrocontrollers ist, kann es 
vorkommen, dass beim Lesen der Zeitinfo diese gerade weitergezählt wird, 
wodurch unsinnige Ergebnisse erhalten werden. Im User Manual steht u.a:

> If the RTC is driven by the external 32.786 kHz oscillator, subsequent
> read operations of the CTCR may yield an incorrect result. The CTCR is
> implemented as a 15-bit ripple counter so that not all 15 bits change
> simultaneously. The LSB changes first, then the next, and so forth.
> Since the 32.786 kHz oscillator is asynchronous to the CPU clock, it is
> possible for a CTC read to occur during the time when the CTCR bits are
> changing resulting in an incorrect large difference between back-to-back > 
reads.

Ich vermute mal, dass Ähnliches auch auf die anderen Register der Uhr 
zutrifft. Dagegen hilft nur, jede Zeit zweimal zu lesen. Wird beidemale 
das Gleiche gelesen, ist die Zeit korrekt, sonst noch einmal lesen.

Gruss
Mike

von Markus (Gast)


Lesenswert?

Hallo Mike!

Danke für deine Antwort.

Ist der Fehler einmal aufgetreten, bleibt der Fehler bestehen, und
zählt ab diesem Wert weiter.
Also hilft nochmaliges lesen nicht. Das RTC-Register läuft dann eben
bei 0 los und arbeitet dann weier mit 1, 2, 3...

Hab das Auslesen der Uhr nun auf einmal pro Sekunde reduziert 
(Timer-ISR).
Seitdem kein Fehler mehr ;-)

Grüße
Markus

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.