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