Forum: Mikrocontroller und Digitale Elektronik 8051 speichern von Daten, im Betrieb, die nach ausschalten nicht verloren gehen


von Phylus (Gast)


Lesenswert?

Guten Abend,

ich wollte mal nachfragen ob es möglich ist beim 8051er während dem 
Betrieb, also wenn das Programm ausgeführt wird Daten im Flash 
abzuspeichern?

Ich benutze das uVision4 von Keil

Der Controller ist ein AT89S8253

Oder gibt es eine andere Möglichkeit, Daten die während dem Betrieb 
erzeugt werden zu hinterlegen, das sie nach einem Neustart des Programms 
noch vorhanden sind?


Ich bedanke mich schon mal für eure Antworten =)

von Phylus (Gast)


Lesenswert?

Ach und in der Sprache Assembler, sorry für doppelpost!!

von Rene S. (Firma: BfEHS) (rschube)


Lesenswert?

Schau dir mal das Datenblatt an, das Teil hat 2k EEPROM.

Gruss aus Berlin
Rene

von Phylus (Gast)


Lesenswert?

Hey, danke für die schnelle Antwort, ja, mir gehts eigentlich direkt um 
die Befehle.

Ich mache eine schulische Ausbildung zum Systemelektroniker und meine 
Lehrer haben den EEPROM noch nie verwendet und können mir dazu keine 
Hilfe geben, sie werden nicht mal aus dem Datenblatt schlau =/

von Rene S. (Firma: BfEHS) (rschube)


Lesenswert?

Im Kapitel "6. Data Memory – EEPROM and RAM" vom Datenblatt stehen alle 
notwendigen Infos. Unter "6.1 Memory Control Register" sind die Details 
und in der Befehlsreferenz findest du die Erklärungen für die Funktion 
von MOVX.

Einfach Werte an die entsprechende Stelle schreiben oder von da lesen.

Was für Werte musst du ablegen? Wie sehen diese aus?

von Alex (Gast)


Lesenswert?

Schon mal Google benutzt?

von Phylus (Gast)


Lesenswert?

Ja, ich habe gegoogelt, jedoch finde ich nicht das Richtige, ich kann 
zwar den RAM beschreiben, der jedoch flüchtig ist und wie es im 
Datenblatt beschrieben ist, habe ich es mit movx versucht, er speichert 
den Wert nicht…

Ich möchte einen 8stelligen Binärcode hinterlegen (eventuell auch 
mehrere).

Ich baue grade einen Lieferroboter, der per Infrarot über eine Station 
seine zu fahrenden Routen bekommt, das ist ein 8stelliger Binärcode, der 
Ziel 1 und Ziel 2 enthält.

Ich würde das dann auch gerne so machen, das ich dem Roboter bis zu 3 
Binärcodes sagen kann und dies eingespeichert werden, so das diese 
solange gespeichert sind, bis er sie abgefahren halt.

Warum er sie abspeichern soll?
Aus einfachem Grund, ich möchte, das wenn z.B. die Akkus leer sind, und 
sie ausgewechselt werden, das er noch weiß, was er machen soll.

von Matthias K. (matthiask)


Lesenswert?

So mache ich es in C. In Assembler musst Du es selber umsetzen.
1
#define XBYTE ((unsigned char volatile xdata *) 0)
2
// Schreiben in EEPROM
3
EECON |=  0x08; //EEMEM=1 Memory Select interner XDATA
4
EECON |=  0x10; //EEMWE=1 Write-Enable
5
EECON |=  0x20; //EELD=1  Page-Mode 32Byte
6
XBYTE[0x0000] = x; // Deinen Daten...
7
XBYTE[0x0001] = y;
8
XBYTE[0x0002] = z; // u.s.w.
9
EECON &=  0xDF; //EELD=0 Page-Mode beenden
10
XBYTE[0x0003] = 0x55; // Schreiben auslösen (Kennbyte, nur Bsp.)
11
while (!(EECON & 0x02)); // Warten bis Bytes im EEPROM geschrieben sind
12
EECON &=  0xEF; //EEMWE=0 Write-Disable
13
14
// Lesen aus EEPROM
15
16
EECON |=  0x08; //EEMEM=1, damit wird beim lesen auf internen EEPROM XDATA zugegriffen 
17
x = XBYTE[0x0000]; 
18
y = XBYTE[0x0001]; 
19
z = XBYTE[0x0002];

von Helmut L. (helmi1)


Lesenswert?

Phylus schrieb:
> Ich mache eine schulische Ausbildung zum Systemelektroniker und meine
> Lehrer haben den EEPROM noch nie verwendet und können mir dazu keine
> Hilfe geben, sie werden nicht mal aus dem Datenblatt schlau =/

Tolle Lehrer man sollte sie auswechseln.

von Jonathan S. (joni-st) Benutzerseite


Lesenswert?

Phylus schrieb:
> Aus einfachem Grund, ich möchte, das wenn z.B. die Akkus leer sind, und
> sie ausgewechselt werden, das er noch weiß, was er machen soll.

Da empfiehlt es sich aber, das ganze im SRAM zu halten und den µC bei 
Stromausfall mit einem Pufferkondensator (Goldcap, vllt. 1F) am Leben zu 
halten. Der µC kann ja solange in den Energiesparmodus gehen. Das hält 
durchaus einen Tag lang.


Gruß
Jonathan

von Phylus (Gast)


Lesenswert?

Danke an Matthias K.
Ist seh interresant, jedoch kann ich kein Stück C =/

Aber habe anhand deiner Kommentare versucht es in Assembler zu 
übersetzen, jedoch ohne erfolg, ich werde es bis heute Abend weiter 
versuchen und wenn es nicht klappt, werde ich mich geschlagen geben, 
trotzdem danke =)

von Phylus (Gast)


Lesenswert?

Also ich hab da eine Frage:
1
XBYTE[0x0000] = x; // Deinen Daten...
2
XBYTE[0x0001] = y;
3
XBYTE[0x0002] = z; // u.s.w.

Die werden auf einen "Stack" gestapelt oder sehe ich das falsch?

von hp-freund (Gast)


Lesenswert?

Eine Alternative wäre auch:

z.B. ebay 160647793317

Der RAM der nichts vergisst ;-)

von Phylus (Gast)


Lesenswert?

naja, für son schulische projekt will ich nicht unbedingt so geld 
ausgeben...

ich habe das programm ja fast fertig, ich weiß nur nicht wie ich das

XBYTE[0x0000] = x; // Deinen Daten...
XBYTE[0x0001] = y;
XBYTE[0x0002] = z; // u.s.w.


umsetzen kann, ich weiß das diese daten irgend wie und irgendwo 
hinterlegt werden, aber die frage ist wo?!

Wenn man mir das sagen könnte, dann komme ich eventuell weiter und 
bekomme es zu laufen...


Das andere Problem bei dem von dir genannten baustein in eBay ist, das 
ich an Roboter und Stations Controller alle Ports belegt habe, bis auf 
den letzten Pin ^^

von Uwer (Gast)


Lesenswert?

Das Byte an die entsprechde Adresse im XRAM schreiben mit MOVX

von Phylus (Gast)


Lesenswert?

Also dann so?
1
mov  a,#00000101b // binärcode zum speichern
2
mov  r0,#000h     // auswahl des xram speichers
3
movx @r0,a        // mit movx in xram schreiben

von Uwer (Gast)


Lesenswert?

Mußt halt ins Datenblatt gucken an welcher Adresse das EEPROM im 
Adressbereich eingeblendet wird. Im Beispiel in C an 0x0000, 0x0001 und 
0x0002.

von Peter D. (peda)


Lesenswert?

http://www.atmel.com/dyn/resources/prod_documents/doc3655.pdf

3.3 Listing 1: EEPROM Read/Write Examples


Peter

von Uwer (Gast)


Lesenswert?

Schon lange her (8051) aber sieht auf den ersten Blick gut aus.

von Uwer (Gast)


Lesenswert?

Achso bei movx immer @dptr nicht r0

von Phylus (Gast)


Lesenswert?

Hey Peter, der Link enthält ja einen komplizierteren script als der von 
Matthias K., muss der so kompliziert, bzw. so groß sein?!

von Phylus (Gast)


Lesenswert?

ach ne halt hab mich verschaut sry ^^

von Phylus (Gast)


Lesenswert?

ok, ich habe die Lösung zwar von Peter bekommen, jedoch versuche ich 
noch immer den C Code von.... in Assembler-Sprache umzusetzen, das habe 
ich jetzt, wer findet den Fehler?!

1
ledschreiben equ p3.0
2
ledfertig equ p3.1
3
4
eecon data 096h
5
eeconreadin data 00111000b
6
eeconreadout data 00001000b
7
eeconwrite data 00011000b
8
9
cseg at 0
10
11
;---------------------------- Auf Internen EEPROM schalten,  Write-Enable setzen und Page-Mode 32Byte aktivieren
12
13
mov a,#eeconreadin
14
mov r0,#eecon
15
mov @r0,a
16
17
;---------------------------- 32Byte Daten in den "data buffer" laden/stapeln
18
19
mov a,#00000101b
20
mov dptr,#000h
21
movx @dptr,a
22
23
;---------------------------- Auslösen des Schreibevorgangs und abwarten bis er beendet ist
24
          
25
mov r0,#eecon
26
mov a,#eeconwrite
27
mov @r0,a
28
29
schreiben:
30
mov r0,#eecon
31
mov a,@r0
32
33
anl a,#00000010b
34
35
setb ledschreiben
36
37
cjne a,#002h,schreiben
38
39
clr ledschreiben
40
setb ledfertig

von Phylus (Gast)


Lesenswert?

.... = Matthias K.

von Matthias K. (matthiask)


Lesenswert?

Wenn Du kein C kannst, dann lade Dir einen C Compiler für die 8051, zB 
SDCC und schau Dir an, was für ein ASM draus entsteht.

Hier der ASM von SDCC. Der ist aber berüchtigt, dass er es nicht optimal 
macht. Aber ein Anhaltspunkt sollte es sein!
1
   00E3 75 08 44            578   mov  _x,#0x44 // nur ein paar Testdaten für x,y,z
2
   00E6 75 09 41            580   mov  _y,#0x41
3
   00E9 75 0A 54            582   mov  _z,#0x54
4
5
   00EC 43 96 08            584   orl  _EECON,#0x08
6
   00EF 43 96 10            586   orl  _EECON,#0x10
7
   00F2 43 96 20            588   orl  _EECON,#0x20
8
 
9
  00F5 E4                  590   clr  a
10
   00F6 F5 82               591   mov  dpl,a
11
   00F8 F5 83               592   mov  dph,a
12
   00FA 74 44               593   mov  a,#0x44
13
   00FC F0                  594   movx  @dptr,a
14
15
   00FD 7A 00               596   mov  r2,#0x00
16
   00FF 7B 00               597   mov  r3,#0x00
17
   0101 8A 82               598   mov  dpl,r2
18
   0103 8B 83               599   mov  dph,r3
19
   0105 A3                  600   inc  dptr
20
   0106 74 41               601   mov  a,#0x41
21
   0108 F0                  602   movx  @dptr,a
22
23
   0109 7A 00               604   mov  r2,#0x00
24
   010B 7B 00               605   mov  r3,#0x00
25
   010D 8A 82               606   mov  dpl,r2
26
   010F 8B 83               607   mov  dph,r3
27
   0111 A3                  608   inc  dptr
28
   0112 A3                  609   inc  dptr
29
   0113 74 54               610   mov  a,#0x54
30
   0115 F0                  611   movx  @dptr,a
31
32
   0116 53 96 DF            613   anl  _EECON,#0xDF
33
34
   0119 7A 00               615   mov  r2,#0x00
35
   011B 7B 00               616   mov  r3,#0x00
36
   011D 8A 82               617   mov  dpl,r2
37
   011F 8B 83               618   mov  dph,r3
38
   0121 A3                  619   inc  dptr
39
   0122 A3                  620   inc  dptr
40
   0123 A3                  621   inc  dptr
41
   0124 74 55               622   mov  a,#0x55
42
   0126 F0                  623   movx  @dptr,a
43
44
   0127                     625 00101$:
45
   0127 E5 96               626   mov  a,_EECON
46
   0129 30 E1 FB            627   jnb  acc.1,00101$
47
48
   012C 53 96 EF            629   anl  _EECON,#0xEF
49
50
   012F 43 96 08            631   orl  _EECON,#0x08
51
52
53
   0132 E4                  633   clr  a
54
   0133 F5 82               634   mov  dpl,a
55
   0135 F5 83               635   mov  dph,a
56
   0137 E0                  636   movx  a,@dptr
57
   0138 F5 08               637   mov  _x,a
58
59
   013A 7A 00               639   mov  r2,#0x00
60
   013C 7B 00               640   mov  r3,#0x00
61
   013E 8A 82               641   mov  dpl,r2
62
   0140 8B 83               642   mov  dph,r3
63
   0142 A3                  643   inc  dptr
64
   0143 E0                  644   movx  a,@dptr
65
   0144 F5 09               645   mov  _y,a
66
67
   0146 7A 00               647   mov  r2,#0x00
68
   0148 7B 00               648   mov  r3,#0x00
69
   014A 8A 82               649   mov  dpl,r2
70
   014C 8B 83               650   mov  dph,r3
71
   014E A3                  651   inc  dptr
72
   014F A3                  652   inc  dptr
73
   0150 E0                  653   movx  a,@dptr
74
   0151 F5 0A               654   mov  _z,a

von Phylus (Gast)


Lesenswert?

ok, ich versuche es mal, danke =)

von Phylus (Gast)


Lesenswert?

Ok, ich verzweifle dran =/

von Phylus (Gast)


Lesenswert?

Um den Wert imEECON Register (096h) abzufragen muss ich das doch so 
machen oder?!

mov r0,#096h
mov a,@r0

Es wird in den Akku aber nichts geladen?!

von Phylus (Gast)


Lesenswert?

Wuhu, ich glaub ich habe es geschafft =D

danke an euch alle für eure hilfe ;-)

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.