www.mikrocontroller.net

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


Autor: Phylus (Gast)
Datum:

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 =)
Autor: Phylus (Gast)
Datum:

Ach und in der Sprache Assembler, sorry für doppelpost!!
Autor: Rene Schube (Firma: BfEHS) (rschube)
Datum:

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

Gruss aus Berlin
Rene
Autor: Phylus (Gast)
Datum:

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 =/
Autor: Rene Schube (Firma: BfEHS) (rschube)
Datum:

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?
Autor: Alex (Gast)
Datum:

Schon mal Google benutzt?
Autor: Phylus (Gast)
Datum:

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.
Autor: Matthias K. (matthiask)
Datum:

So mache ich es in C. In Assembler musst Du es selber umsetzen.
#define XBYTE ((unsigned char volatile xdata *) 0)
// Schreiben in EEPROM
EECON |=  0x08; //EEMEM=1 Memory Select interner XDATA
EECON |=  0x10; //EEMWE=1 Write-Enable
EECON |=  0x20; //EELD=1  Page-Mode 32Byte
XBYTE[0x0000] = x; // Deinen Daten...
XBYTE[0x0001] = y;
XBYTE[0x0002] = z; // u.s.w.
EECON &=  0xDF; //EELD=0 Page-Mode beenden
XBYTE[0x0003] = 0x55; // Schreiben auslösen (Kennbyte, nur Bsp.)
while (!(EECON & 0x02)); // Warten bis Bytes im EEPROM geschrieben sind
EECON &=  0xEF; //EEMWE=0 Write-Disable

// Lesen aus EEPROM

EECON |=  0x08; //EEMEM=1, damit wird beim lesen auf internen EEPROM XDATA zugegriffen 
x = XBYTE[0x0000]; 
y = XBYTE[0x0001]; 
z = XBYTE[0x0002]; 
Autor: Helmut Lenzen (helmi1)
Datum:

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.
Autor: Jonathan Strobl (joni-st) Benutzerseite
Datum:

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
Autor: Phylus (Gast)
Datum:

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 =)
Autor: Phylus (Gast)
Datum:

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

Die werden auf einen "Stack" gestapelt oder sehe ich das falsch?
Autor: hp-freund (Gast)
Datum:

Eine Alternative wäre auch:

z.B. ebay 160647793317

Der RAM der nichts vergisst ;-)
Autor: Phylus (Gast)
Datum:

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 ^^
Autor: Uwer (Gast)
Datum:

Das Byte an die entsprechde Adresse im XRAM schreiben mit MOVX
Autor: Phylus (Gast)
Datum:

Also dann so?
mov  a,#00000101b // binärcode zum speichern
mov  r0,#000h     // auswahl des xram speichers
movx @r0,a        // mit movx in xram schreiben
Autor: Uwer (Gast)
Datum:

Mußt halt ins Datenblatt gucken an welcher Adresse das EEPROM im
Adressbereich eingeblendet wird. Im Beispiel in C an 0x0000, 0x0001 und
0x0002.
Autor: Peter Dannegger (peda)
Datum:

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

3.3 Listing 1: EEPROM Read/Write Examples


Peter
Autor: Uwer (Gast)
Datum:

Schon lange her (8051) aber sieht auf den ersten Blick gut aus.
Autor: Uwer (Gast)
Datum:

Achso bei movx immer @dptr nicht r0
Autor: Phylus (Gast)
Datum:

Hey Peter, der Link enthält ja einen komplizierteren script als der von
Matthias K., muss der so kompliziert, bzw. so groß sein?!
Autor: Phylus (Gast)
Datum:

ach ne halt hab mich verschaut sry ^^
Autor: Phylus (Gast)
Datum:

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

ledschreiben equ p3.0
ledfertig equ p3.1

eecon data 096h
eeconreadin data 00111000b
eeconreadout data 00001000b
eeconwrite data 00011000b

cseg at 0

;---------------------------- Auf Internen EEPROM schalten,  Write-Enable setzen und Page-Mode 32Byte aktivieren

mov a,#eeconreadin
mov r0,#eecon
mov @r0,a

;---------------------------- 32Byte Daten in den "data buffer" laden/stapeln

mov a,#00000101b
mov dptr,#000h
movx @dptr,a

;---------------------------- Auslösen des Schreibevorgangs und abwarten bis er beendet ist
          
mov r0,#eecon
mov a,#eeconwrite
mov @r0,a

schreiben:
mov r0,#eecon
mov a,@r0

anl a,#00000010b

setb ledschreiben

cjne a,#002h,schreiben

clr ledschreiben
setb ledfertig
Autor: Phylus (Gast)
Datum:

.... = Matthias K.
Autor: Matthias K. (matthiask)
Datum:

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!
   00E3 75 08 44            578   mov  _x,#0x44 // nur ein paar Testdaten für x,y,z
   00E6 75 09 41            580   mov  _y,#0x41
   00E9 75 0A 54            582   mov  _z,#0x54

   00EC 43 96 08            584   orl  _EECON,#0x08
   00EF 43 96 10            586   orl  _EECON,#0x10
   00F2 43 96 20            588   orl  _EECON,#0x20
 
  00F5 E4                  590   clr  a
   00F6 F5 82               591   mov  dpl,a
   00F8 F5 83               592   mov  dph,a
   00FA 74 44               593   mov  a,#0x44
   00FC F0                  594   movx  @dptr,a

   00FD 7A 00               596   mov  r2,#0x00
   00FF 7B 00               597   mov  r3,#0x00
   0101 8A 82               598   mov  dpl,r2
   0103 8B 83               599   mov  dph,r3
   0105 A3                  600   inc  dptr
   0106 74 41               601   mov  a,#0x41
   0108 F0                  602   movx  @dptr,a

   0109 7A 00               604   mov  r2,#0x00
   010B 7B 00               605   mov  r3,#0x00
   010D 8A 82               606   mov  dpl,r2
   010F 8B 83               607   mov  dph,r3
   0111 A3                  608   inc  dptr
   0112 A3                  609   inc  dptr
   0113 74 54               610   mov  a,#0x54
   0115 F0                  611   movx  @dptr,a

   0116 53 96 DF            613   anl  _EECON,#0xDF

   0119 7A 00               615   mov  r2,#0x00
   011B 7B 00               616   mov  r3,#0x00
   011D 8A 82               617   mov  dpl,r2
   011F 8B 83               618   mov  dph,r3
   0121 A3                  619   inc  dptr
   0122 A3                  620   inc  dptr
   0123 A3                  621   inc  dptr
   0124 74 55               622   mov  a,#0x55
   0126 F0                  623   movx  @dptr,a

   0127                     625 00101$:
   0127 E5 96               626   mov  a,_EECON
   0129 30 E1 FB            627   jnb  acc.1,00101$

   012C 53 96 EF            629   anl  _EECON,#0xEF

   012F 43 96 08            631   orl  _EECON,#0x08


   0132 E4                  633   clr  a
   0133 F5 82               634   mov  dpl,a
   0135 F5 83               635   mov  dph,a
   0137 E0                  636   movx  a,@dptr
   0138 F5 08               637   mov  _x,a

   013A 7A 00               639   mov  r2,#0x00
   013C 7B 00               640   mov  r3,#0x00
   013E 8A 82               641   mov  dpl,r2
   0140 8B 83               642   mov  dph,r3
   0142 A3                  643   inc  dptr
   0143 E0                  644   movx  a,@dptr
   0144 F5 09               645   mov  _y,a

   0146 7A 00               647   mov  r2,#0x00
   0148 7B 00               648   mov  r3,#0x00
   014A 8A 82               649   mov  dpl,r2
   014C 8B 83               650   mov  dph,r3
   014E A3                  651   inc  dptr
   014F A3                  652   inc  dptr
   0150 E0                  653   movx  a,@dptr
   0151 F5 0A               654   mov  _z,a
Autor: Phylus (Gast)
Datum:

ok, ich versuche es mal, danke =)
Autor: Phylus (Gast)
Datum:

Ok, ich verzweifle dran =/
Autor: Phylus (Gast)
Datum:

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?!
Autor: Phylus (Gast)
Datum:

Wuhu, ich glaub ich habe es geschafft =D

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel




Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder GIF-Format hochladen.
Siehe Bildformate
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken erkennst du die Nutzungsbedingungen an.

webmaster@mikrocontroller.netImpressumNutzungsbedingungenWerbung auf Mikrocontroller.net