Forum: Mikrocontroller und Digitale Elektronik Aktuelle Zeit in Flash speichern


von Steff (Gast)


Lesenswert?

Guten Morgen,
kennt sich jemand damit aus wie man die aktuelle Zeit(Sek,min,Stunde,Tag 
usw.)in der bestimmt Daten in dem Flash gespeichert werden, mit in den 
Flash hineinschreibt?
Auf was müsste man da achten?
benutze den LPC2129 und den At45DB011 Flash.


Würd mich freuen wen mir jemand weiterhelfen könnte

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Was genau außer dem Formulieren einer verständlichen Frage ist jetzt 
Dein Problem?

von Oliver (Gast)


Lesenswert?

1
WriteTimeToFlash(now());

Den Rest muß du schon selber rausfinden.

Oliver

von Steff (Gast)


Lesenswert?

Ja sorry.
Weiß nicht genau wie man in einen Flash die aktuelle Zeit schreibt.

Hab ca 15 Werte (in einer Struktur) die bei bestimmten Aktionen in einen 
Flash geschreiben werden sollen. Zu den Messwerten soll dann auch die 
zeit mit hineingeschreiben werden.
Nur die Frage ist, wie ich dabei vorgehe.
In dem Datenblatt von dem uC steht bisschen was darüber drinn, werd 
daraus aber nicht schlau. Du etwa?
Das reinschreiben wird nicht so sehr das Problem sein, sondern das 
erfassen der aktuellen Zeit.
Kannst du mit damit evtl. weiterhelfen?

von Steff (Gast)


Lesenswert?

Oliver

Würdest du es also dann so machen, dass du zuerst die aktuelle zeit in 
den flash schreibst du direkt danach die Stuktur mit den Daten?
Die aktuelle Zeit passend zu den Messwerten sind ja das nicht mehr,oder?

von Route_66 (Gast)


Lesenswert?

Dem Flash ist es egal ob die eingeschriebenen Daten Messwerte, Zeit, 
Datum, Text, Grafik oder Programm ist. Die Zuordnung der Daten zu einem 
betimmten Sinn mußt du bzw. dein Programm machen.
Für die aktuelle Uhrzeit muss der Controller irgend eine Uhr lesen 
können. Das kann eine Hardware- oder Softwareuhr bzw. eine kombinierte 
(z.B. Funkuhr mit Softwaredekodierung) sein. Damit die Zeit exakt zu den 
Messwerten passt, (messen und Uhr lesen passieren ja nie gleichzeitig), 
kann man programmtechnische Lösungen finden.

von Steff (Gast)


Lesenswert?

Ja genau. Das hab ich gemeint. Weisst du ob irgendwo im Netz schon 
passende Beispiele dazu sind?
Mit den ganzen Timer Geschichten hab ich bis jetzt noch nie was gemacht.

von was-willst-du (Gast)


Lesenswert?

Es ist unmöglich, die aktuelle Zeit ins Flash zu schreiben.
Sie wird immer veraltet sein.

von Oliver (Gast)


Lesenswert?

>benutze den LPC2129

Ach du Sch...
Der ist für absolute Anfänger ja genau der richtige Einsteigerchip :-) 
Wer hat den denn ausgesucht?

>Weiß nicht genau wie man in einen Flash die aktuelle Zeit schreibt.

Genauso, wie alles andere auch. Ein Byte nach dem anderen.

>Würdest du es also dann so machen, dass du zuerst die aktuelle zeit in
>den flash schreibst du direkt danach die Stuktur mit den Daten?

Das ist eine Lösung, fragt sich nur, ob die zu der Aufgabenstellung 
passt.

>Die aktuelle Zeit passend zu den Messwerten sind ja das nicht mehr,oder?

Das ist dein Hauptproblem. Solange du nicht weißt, was du eigentlich 
genau machen sollst, wirst du keine Lösung finden. Schau in der 
Aufgabestellung nach, welche Zeit ins Flash soll: Der Zeitpunkt der 
Messwertaufnahme, oder der des Schreibens?

>Das reinschreiben wird nicht so sehr das Problem sein, sondern das
>erfassen der aktuellen Zeit.

Ich hab mir mal das "Datenblatt" gezogen. Anscheinend kannst du das 
aktuelle Datum und die Uhrzeit in zwei 32-Bit-Werten aus der RTC 
auslesen.
Das sind dann 8 Byte, die schreibst du einfach eins nach dem anderen ins 
Flash. Näheres kann ich dir dazu nicht sagen, den Prozessor kenne ich 
nicht.

Oliver

von Steff (Gast)


Lesenswert?

Ja ich weiß das das nicht der richtige einsteigerchip ist. Aber das 
ändert nichts daran das ich das machen muss. Das soll ne Abschlussarbeit 
werden, bei der ich mich bei der Auswahl sehr überschätzt hab, da ich 
mich erst von ganz unten einarbeiten muss.

Wie soll denn das Aktuele in dem RTC stehen. Steht das schon automatisch 
drinnen? Der zeitpunkt des Messens ist dabei entscheidend.

von Steff (Gast)


Lesenswert?

A.K.
Mach das bei der Beschreibung des Flashs so, das ich pro Struktur 
einfach eine page nehm.Also schreib dann schon Byte für Byte ins Flash 
über die SPI Schnittstelle.

von Oliver (Gast)


Lesenswert?

>Flash wird nicht Byte für Byte geschrieben, sondern in ziemlich grossen
>Blöcken.

Das hatten wir im Parallel-Thread schon. Sein externes Flash hat eine 
Page SRAM als Puffer, in den Byte für Byte geschrieben werden kann.

>Wie soll denn das Aktuele in dem RTC stehen. Steht das schon automatisch
>drinnen? Der zeitpunkt des Messens ist dabei entscheidend.

RTC heisst "Real Time Clock". Das ist nichts anders als eine eingebaute 
Uhr im Prozessor, deren Stand du über Register auslesen kannst. Die 
liefert dir Jahr, Monat, Tag, Stunde, Minute und Sekunde. Solange der 
Prozessor Strom hat, läuft die. Das bedeutet aber auch, daß du nach 
jedem Einschalten der Versorgungsspannung erst einmal die aktuelle 
Uhrzeit und das Datum einstellen musst. Wie das geht, keine Ahnung. Lies 
dir das Kapitel zur RTC durch.

Oliver

von (prx) A. K. (prx)


Lesenswert?

Yep, dann ist das natürlich einfach. Und da du dann sowieso genug Platz 
hast, schreib gleich noch eine CRC mit dazu.

von Steff (Gast)


Lesenswert?

Achso,kann ich wenn alles ok  ist, also die Versorgungsspannung anliegt, 
einfach nach belieben die Zeit(Stunden,Minuten usw.) aus den Register 
holen?

von Steff (Gast)


Lesenswert?

Was ist denn bitte CRC?
Das Reinschreiben ists ja nicht mehr so sehr das Problem, das hat mir 
der oliver schon sehr ausführlich erklärt, nur wie ich aus irgendeinem 
Signal die richtige uhrzeit und Datum mach macht mir Sorgen

von Oliver (Gast)


Lesenswert?

>Achso,kann ich wenn alles ok  ist, also die Versorgungsspannung anliegt,
>einfach nach belieben die Zeit(Stunden,Minuten usw.) aus den Register
>holen?

So ist es.

Oliver

von Steff (Gast)


Lesenswert?

Aber Werte die ich aus den Registern hole muss man die nicht erst noch 
umrechnen? oder stehen im RTC also wirklich schon die komplett aktuellen 
Werte drinnen?

Würdest du die Zeiterfassung mit der Struktor mit übergeben oder eher 
extra?

von joerg (Gast)


Lesenswert?

wenn du oft genug daten im flash/eeprom schreibst ,ist er auch schnell 
kaput.

gruß jörg

von Steff (Gast)


Lesenswert?

so oft wird er ja auch nicht beschreiben, nur wenn bestimmte Grenzwerte 
überschtitten werden

von Steff (Gast)


Lesenswert?

weiß denn irgendjemand wo man zu diesem Problem ein code beispiel hätte?

von Oliver (Gast)


Lesenswert?

>Aber Werte die ich aus den Registern hole muss man die nicht erst noch
>umrechnen? oder stehen im RTC also wirklich schon die komplett aktuellen
>Werte drinnen?

Du wirst nicht drumrum kommen, das Datenblatt zu lesen. Kapitel 18, RTC. 
Da steht das Datenformat beschrieben. Wenn du die entsprechende 
Reference clock divider Register passend zu deinem CPU-Takt gesetzt 
hast, zählt die Uhr tatsächlich direkt die Zeit. Auch das steht im 
Datenblatt. Lesen und verstehen musst du es schon selber.

Oliver

von Steff (Gast)


Lesenswert?

Bei mir fehlt es halt daran die zusammenhänge zu verstehen, was ich 
brauch und nicht brauch und es dann umsetze.
Also wenn ich Reference clock divider Register auf 1 setze, dann hab ich 
den gleichen Takt oder was meinst du?

von Steff (Gast)


Lesenswert?

Wäre nett wenn du dir das mal anschaun könntest:

hab um aus den CTIME0 und CTIME1 Registern die Sekunden, Minuten usw 
herauszubekommen Bitmasken angelegt. Könntest du mir nur sagen ob man 
das so machen kann?

#define CTIMO    0xE002 4014

#define SEK_MASK 0x0000 003F
#define MIN_MASK 0x0000 3F00

unsigned int second = (CTIME0 & SEK_MASK);
unsigned int minute = ((CTIME0 & MIN_MASK) >>8);

Oder hättest du irgendeine leichtere Idee?

von Karl H. (kbuchegg)


Lesenswert?

Steff wrote:
> Wäre nett wenn du dir das mal anschaun könntest:
>
> hab um aus den CTIME0 und CTIME1 Registern die Sekunden, Minuten usw
> herauszubekommen Bitmasken angelegt. Könntest du mir nur sagen ob man
> das so machen kann?
>
> #define CTIMO    0xE002 4014
>
> #define SEK_MASK 0x0000 003F
> #define MIN_MASK 0x0000 3F00
>
> unsigned int second = (CTIME0 & SEK_MASK);
> unsigned int minute = ((CTIME0 & MIN_MASK) >>8);

Probiers doch einfach aus, ob das so funktioniert oder nicht.

(und nein. das wird nicht funktionieren. CTIME0 ist ein letztendlich 
auch nur ein konstanter Zahlenwert. Du willst aber nicht mit dem 
Zahlenwert arbeiten, sondern diese Zahl wird ja wahrscheinlich die 
Adresse im Speicher sein unter der der eigentlich interessierende 
Zahlenwert (nämlich die Uhrzeit) zu finden ist)

Lass dir die Werte irgendwo ausgeben und sieh nach ob sie stimmen
bzw. ob sie sich im Laufe der Zeit verändern. Programm in einer
Endlosschleife halten, Zeit auslesen, Zeit auf irgendeinem Ausgabemedium 
das du zur Verfügung hast ausgeben, weiter in der Endlosschleife.

Ist das so schwer, einfach mal alles auf eine Karte zu setzen und
ein Testprogramm zuschreiben, mit dem man das einfach ausprobiert?

> da ich
> mich erst von ganz unten einarbeiten muss.

Eben. Und das erste was du lernen musst: Du wirst noch eine Menge 
Testprogramme schreiben, mit denen du einzelne Details abklären kannst. 
Aber: Nichts ist so lehrreich, wie das Wissen, das man sich selbst 
anhand eines Testprogrammes angeeignet hat. Und sei es nur das Wissen, 
dass es genau so, wie man es im Testprogramm probiert hat, nicht 
funktioniert. Dann schnappt man sich das Datenblatt, wendet das Wissen 
an und erkennt hoffentlich, wo man das Datenblatt falsch verstanden hat 
und korrigiert das Testprogramm und probierts noch mal.

von Oliver (Gast)


Lesenswert?

>Also wenn ich Reference clock divider Register auf 1 setze, dann hab ich
>den gleichen Takt oder was meinst du?

Nein. Das sind zwei Register, die in Abhängigkeit des CPU-Taktes gesetzt 
werden müssen. Wie, steht im Datenblatt, Seite 217 ff.

Oliver

von Steff (Gast)


Lesenswert?

hab so en test board dazu schon bestellt wo ich das testen kann, aber 
bis das kommt dauert es noch lang.
aber so grob dürfte es schon passen oder ist vom code schon was falsch?

von Steff (Gast)


Lesenswert?

Beim RTC gehe ich dann auch so vor wie beim SPI, also erst die 
Initialisierung und danach z.B. die sekunden ausmaskieren und dann evtl 
ins flash schreiben?

von Steff (Gast)


Lesenswert?

An Karl heinz Buchegger

Das will ich ja machen. In CTIMEO stehen komplett die 
sekunden,minuten,stunden und der wochenentag. In CTIME1 der 
monatstag,monat und das jahr.

Wenn ich aus dem CTIME0 nur die Sekunden will(Bits 0 bis 5), muss ich 
dann nicht einfach das CTIME0 Reg mit der SEK_MASK verunden? Wenn nicht, 
wie soll das dann funktionieren?

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.