Forum: Mikrocontroller und Digitale Elektronik Wert in Flash speichern 8051F020


von Matthias L. (Firma: Leica-Geosystems) (radelektroniker)


Lesenswert?

Hallo
Ich muss 4Byte abspeichern können, die auch wenn der uP kein Strom hat, 
gespeicher bleiben.
Die Lösung darf nur den 8051F020 ohne zusätzliche Hardware benutzen.

Vielen Dank für eure Hilfe

von Entwickler (Gast)


Lesenswert?

Und, bist Du schon fertig? Sollte ja nicht schwer sein.

von Matthias L. (Firma: Leica-Geosystems) (radelektroniker)


Lesenswert?

Nein!!
ICh weiss nicht wie ich das machen muss, sonst häte ich doch nicht 
gefragt.
BItte sag mir wie das geht.

Gruss Matthias

von Entwickler (Gast)


Lesenswert?

Eine Frage habe ich nicht gefunden.
Aber ein Blick ins Datenblatt zeigt, wie es geht. Lesen mußt Du schon 
selber.

von Matthias L. (Firma: Leica-Geosystems) (radelektroniker)


Lesenswert?

Datenblatt habe ich studiert, wenn das Forum nicht dazu da ist um Hilfe 
zu bekommen, dann weis ich auch nicht.
Könnte mir jemand fals es im Datenblat steht die Seite angeben.

von René K. (king)


Lesenswert?

Matthias Leu schrieb:
> Könnte mir jemand fals es im Datenblat steht die Seite angeben.

Seite 139, "15.1.Programming The FLASH Memory", Quelle:
https://www.silabs.com/pages/DownloadDoc.aspx?FILEURL=Support%20Documents/TechnicalDocs/C8051F02x.pdf&src=DocumentationWebPart

von Matthias L. (Firma: Leica-Geosystems) (radelektroniker)


Lesenswert?

Ich habe mich nicht ganz klar ausgedrückz.
Ich möchte, dass der uP während des Programmablaufs zwei Bytes 
abspeichert, die auch nicht verlohren gehen, wenn der uP kein Strom mehr 
hat.
Ich habe es mit movc versucht, geht aber nicht.

von Peter D. (peda)


Lesenswert?

Matthias Leu schrieb:
> Ich habe es mit movc versucht, geht aber nicht.

Im Datenblatt steht aber MOVX.
MOVC ist ein Lesebefehl, kann also schonmal garnicht schreiben.

Vorher muß das Flash-Schreiben enabled werden und die Page gelöscht 
(siehe Sequenz im Datenblatt).


Peter

von Mathias_H (Gast)


Lesenswert?

Seite 139 steht doch alles sehr auführlich! ... ein bisschen arbeit 
musst du dir schon machen!

von René K. (king)


Lesenswert?

> Ich habe es mit movc versucht, geht aber nicht.

Nein, so geht das auch nicht. Ich zitiere mal das Datenblatt: "The FLASH 
memory can be programmed by software using a MOVX write instruction, 
..."

Seite 139, "15.1.Programming The FLASH Memory", Quelle:
https://www.silabs.com/pages/DownloadDoc.aspx?FILEURL=Support%20Documents/TechnicalDocs/C8051F02x.pdf&src=DocumentationWebPart

Das, was da noch im Datenblatt steht, musst Du übrigens auch lesen. Nur 
mit movx funktioniert das nämlich auch nicht. Schau Dir vielleicht auch 
mal AN201 an.

von Matthias L. (Firma: Leica-Geosystems) (radelektroniker)


Lesenswert?

Ich habe mich nun ca 3h mit dem Thema befasst, und komme einfach nicht 
weiter.
Ich möchte in C einen Wert, der ich bei einer Kalibrierung erhalte 
abspeichern, und ihn dann später auslesen (uP zwischendurch ohne Strom).
Im Datenblatt stehen nur Assembler Befehle. Ich weiss auch nicht, wo im 
Flash ich es abspeichern muss, damit ich nichts überschreibe.

Könnte mir bitte jemand ernsthaft helfen.

von Bernd N (Gast)


Lesenswert?

Wo ist denn nun genau dein Problem ? Wie sehen denn deine Versuche zu 
dem Thema aus. Du nölst herum ohne auch nur ein bischen Gedankengut zu 
liefern.

In welchem Speicherbereich liegt denn dein Programm ?

Für den F420 siehts so aus und dann ist es nun deine Aufgabe zu prüfen 
ob der Code so auch in Ordnung ist... habe keine Lust das Datenblatt zu 
lesen.
1
// Byte in den PGM Speicher schreiben
2
3
void FLASH_write_byte (uint16_t FLADDR, uint8_t FL_byte)  {
4
  uint8_t xdata * data FL_write;       // PGM Memory 0x0000 - 0x3DFF (16k)
5
 
6
  EA = FALSE;                          // disable Interrupts
7
  FL_write = (char xdata *) FLADDR;    // Flash pointer
8
  FLKEY = 0xA5;                        // Key Sequence 1
9
  FLKEY = 0xF1;                        // Key Sequence 2
10
  PSCTL |= 0x01;                       // PSWE = 1 => enable "write"
11
12
  *FL_write = FL_byte;                 // save byte @ Flash Memory
13
14
  PSCTL &= ~0x01;                      // disable "write"
15
  EA = TRUE;                           // Interrupts freigeben
16
}

Byte aus dem Speicher lesen machst du dann mal schön selbst.

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.