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
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
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
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
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