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 =)
Ach und in der Sprache Assembler, sorry für doppelpost!!
Schau dir mal das Datenblatt an, das Teil hat 2k EEPROM. Gruss aus Berlin Rene
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 =/
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?
Schon mal Google benutzt?
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.
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]; |
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.
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
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 =)
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?
Eine Alternative wäre auch: z.B. ebay 160647793317 Der RAM der nichts vergisst ;-)
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 ^^
Das Byte an die entsprechde Adresse im XRAM schreiben mit MOVX
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 |
Mußt halt ins Datenblatt gucken an welcher Adresse das EEPROM im Adressbereich eingeblendet wird. Im Beispiel in C an 0x0000, 0x0001 und 0x0002.
http://www.atmel.com/dyn/resources/prod_documents/doc3655.pdf 3.3 Listing 1: EEPROM Read/Write Examples Peter
Schon lange her (8051) aber sieht auf den ersten Blick gut aus.
Achso bei movx immer @dptr nicht r0
Hey Peter, der Link enthält ja einen komplizierteren script als der von Matthias K., muss der so kompliziert, bzw. so groß sein?!
ach ne halt hab mich verschaut sry ^^
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 |
.... = Matthias K.
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 |
ok, ich versuche es mal, danke =)
Ok, ich verzweifle dran =/
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?!
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.