Forum: Mikrocontroller und Digitale Elektronik Programmierung 8051 (c509)


von Timo Wirtz (Gast)


Lesenswert?

Hallo!

Ich habe grade ein Problem, das ich nicht selber lösen kann.
Ich habe eine Lüftersteuerung mit Menuesteuerung über Display
programmiert.
Nun möchte ich während des Betriebes gemachte Einstellungen, wie
Solltemperatur und Max-Drehzahl auch nach dem Aus- und Einschalten der
Betriebsspannung wieder zur Verfügung haben.
Mein Controllerboard besitzt einen Flash-Speicher für das Code-Memory
und ein sRam für die Daten.
Jetzt legt er aber die  gemessenen Werte im Datemmemory über "movx
@dptr,a" ab, und das ist flüchtig. Deshalb muss ich beim Neustart die
Speicherplätze initialisieren, wenn ich definierte Werte haben will,
will heissen ich kann die Werte nur im Quellcode vorfestlegen, dann
während des Betriebes ändern, beim Abschalten gehen sie verloren.

Gibt es da vielleicht einen Trick, wie ich die Speicherplätze im
Code-Memory unterbringen kann, damit sie erhalten bleiben?
Der Befehlssatz hilft mit nicht so recht weiter, da finde ich nur
Befehle um Programmspeicherzellen auszulesen, z.B.:
movc a,@a+dptr


Danke im Voraus,

Timo

von Peter D. (peda)


Lesenswert?

Um den Flash zu beschreiben, mußt Du Dir dessen Datenblatt ansehen, wie
das geht und den Schaltplan Deines Boards, um zu sehen, wie man ihn zum
Schreiben freigibt.

Oder in der Dokumentation des Monitorprogramms ist eine Funktion
beschrieben, die man dazu aufrufen kann.

Aber aufpassen, daß Du Dir nicht das ganze Programm zerschießt !!!


Alternativ kann man auch einen seriellen EEPROM (24C16) ranhängen und
dort alle Daten ablegen, die man sich merken muß. Kostet 2 Portpins des
C509.


Peter

von Timo Wirtz (Gast)


Lesenswert?

Hi!

Na wenn das so ist :-(
Könnt ich kotzen....
Das lässt sich also nur über eine Hardwarelösung machen.
Das mit dem EEprom wär ja noch recht leicht zu lösen.
Ansonsten könnte ich den Flash vielleicht über einen freien Chipselect
ansteuern, dem ist bei mir nämlich auch ein ausreichender Adressbereich
zugeordnet.
Ich hatte gehofft, dass es eine Softwarelösung dafür gibt.

Timo

von Peter D. (peda)


Lesenswert?

Ich hatte auch mal ein lustiges Erlebnis mit einem C505
Entwicklungsboard.

Ich habe in den freien SRAM-Sockel einen 2. Flash reingesteckt und an
diesen ein Full-Erase Kommando geschickt.

Ich hatte mir aber vorher nicht den Schaltplan des Boards angeschaut.
Der war nämlich so blöd, daß der /WE des 1. Flash garnicht disabled
werden konnte.
D.h. der hat immer mitgelauscht auch wenn ich in nem völlig anderen
Adreßbereich geschrieben habe und so auch an sich selbst das Full-Erase
geschickt und dann auch selber ausgeführt.

Danach mußte ich den SMD-Chip runterlöten und neu programmieren.


Peter

von Markus_8051 (Gast)


Lesenswert?

Was hältst Du davon, das SRAM mit einer Batterie zu puffern?

Die meisten SRAMs haben einen Standby-Modus, in dem sie nicht viel
Strom verbrauchen. (Um diesen sicher zu erreichen, mußt die vielleicht
noch einen FET in die -CS-Leitung hängen. Schau unbedingt ins
Datenblatt, welche Bedingungen für den Standby-Modus erfüllt sein
müssen. Diese variieren durchaus von Hersteller zu Hersteller, ebenso
die dann erzielte Stromaufnahme).
Mit "Batterie" meinte ich oben den Oberbegriff für irgendeine
Dauerstromquelle. Ich nehme für so etwas gerne einen Gold-CAP.

Gruß,
Markus_8051

von crazy horse (Gast)


Lesenswert?

na ja, die sinnvollste Lösung ist schon ein I2C oder SPI EEPROM, der
kleinste für wenige Cent reicht ja.
Ich habs mir mittlerweile angewöhnt, prinzipiell einen ext. EEPROM mit
vorzusehen, kostet mich 1 min bei Schaltung und Layout. Wird dann nicht
bestückt und auch in der Software nicht berücksichtigt. Irgendwelche
Änderungswünsche kommen oft, und schon mehrere Male hat das ein
Redesign der Platine erspart. Fehlerspeicher, irgendwelche Grenzwerte,
Kalibrierungsdaten..., irgendwas fällt den Kunden oft ein, was sie
ursprünglich vergessen/nicht bedacht haben.

von Timo Wirtz (Gast)


Lesenswert?

Hallo und vielen Dank schonmal für die Tips!

Ich halte beide Ideen für sinvoll.
Die Idee mit dem Batteriepuffer, weils ne einfache Lösung ist und weil
ich weiter ganz normal übers SRAM arbeiten kann.
Die Idee mit dem EEPROM, weil es die sicherste Lösung ist, aber dafür
umständlicher, weil ich das Tranferprotokol erstmal schreiben müsste
und das schon bestehende Programm an JEDER Stelle umschreiben müsste,
wo die entspr. Speicherplätze benutzt werden.

Die Speicher"organisation" vom 8051 is ja eh schon ein Chaos und dann
auch noch das:-(
Da hätten früher mal die Jungs von Intel oder wenigstens die Nachmacher
von Siemens um die Ecke denken können....
Ist das bei den AVRs genauso behämmert?

Gruß, Timo

von Markus_8051 (Gast)


Lesenswert?

Jammer nicht rum, sondern freu´ Dich, daß Du einen 8051 programmieren
darfst. Auf dem PIC ist das schlimmer.

Falls Du Dich für die EEPROM-Variante entscheidest, denk daran, daß
EEPROMs nicht beliebig viele WRITE-Zyklen aushalten. Also die Werte nur
schreiben, wenn es unbedingt nötig ist, also wenn sie sich geändert
haben. Ich habe mir da mal einen EEPROM gekillt, weil ich in einer
Schleife ständig neue Werte da reingeschrieben habe.

Beim RAM hast Du natürlich den Nachteil, daß Batterie (und speziell
GoldCAP) nicht ewig halten. Die Batterie muß irgendwann gewechselt, der
GoldCAP wieder geladen werden. Mit einem GoldCAP sind nach meinen
Versuchen Überbrückungszeiten von einigen Wochen bis zu wenigen Monaten
(unter einem halben Jahr) zu erreichen.

Viel Erfolg,
Markus_8051

von Thomas_v2.1 (Gast)


Lesenswert?

Ich benutze einen 89C51 von Philips, dessen Flash Speicher in 4 16Kb
Blöcke aufgeteilt ist. Auf der Philips Seite gibt es einen
Beispielprogramm, um Daten im Flash Speicher abzulegen. Dabei muss dann
ein Block "geopfert" werden, um darin Daten zu speichern. Die Daten
werden dann quasi wie eine Tabelle darin abgelegt und der Block nach
und nach vollgeschrieben. Wenn der Block dann voll ist, wird der
komplette Block gelöscht und wieder neu beschrieben. Anscheinend hängt
die Lebensdauer des Flash nicht von den Schreib- sondern Löschzyklen
ab.
Insgesamt ein recht komplexer Programmteil, da auch noch überwacht
wird, wenn bei der Reorganisation des Blockes der Strom ausfällt usw.

Für mein Motorradtacho bin ich jetzt aberzu der Lösung übergegangen,
den Controller einfach schlafen zu legen, da eine halbwegs
leistungsstarke Batterie ja im Hintergrund ist und die Daten auch nicht
soo wichtig sind.

MfG
Thomas

von Peter D. (peda)


Lesenswert?

Eine Batterie hat gerade bei Experimentieren den Nachteil, daß jegliches
Metallteil, was einem in die Schaltung fällt großes Unheil anrichten
kann und nach Murphies Gesetz dies auch tun wird.

Seit mir mal eine ausgelaufene Batterie ein PC-Motherboard zerstört
hat, hasse ich jegliche Stützbatterien.

Die Goldcaps haben deshalb einen internen Schutzwiderstand von etwa 50
Ohm.


Daß Dir der Speicher zu klein vorkommt, liegt warscheinlich daran, daß
Du unglücklicher Weise das Large-Modell benutzt.
Benutze lieber das Small-Modell und definiere nur große Variablenfelder
als XDATA.

Dann benutze noch lokale Variablen wenn immer es möglich ist und Du
wirst Dich wundern, wie viel in die internen 256 Byte reinpaßt und wie
sauschnell Dein Programm und wie klein der Code dadurch wird.

Es sollte zur Pflicht für alle 8051-Programmierer gehören, erstmal den
C51-Primer zu lesen.


In Assembler muß man das zwar selber machen, aber auch da gilt, erst
die Register benutzen, dann RAM, dann IRAM und erst wenn das alles voll
ist, PRAM bzw. XRAM.
Im IRAM muß man natürlich immer etwas Platz übrig lassen für den Stack,
nach meinen Erfahrungen reichen da 16 Byte dicke.


Peter

von Rufus T. Firefly (Gast)


Lesenswert?

> Die Goldcaps haben deshalb einen internen Schutzwiderstand
> von etwa 50 Ohm.

Naja, so ist das ja nun nicht. Nein, die Dinger haben "einfach nur
so" einen verflucht hohen Innenwiderstand, und der ist nicht gezielt
so hoch gewählt worden, sondern aufgrund des Aufbaus bislang nicht
weiter zu reduzieren gewesen.

Davon abgesehen hast Du, was Stützbatterien betrifft, natürlich recht;
andererseits hindert Dich niemand, in Reihe mit der Batterie eben jenen
erwähnten Schutzwiderstand zu schalten ...

EEPROMs und FLASH-ROMs haben SRAM gegenüber das Problem der endlichen
Haltbarkeit; einige hunderttausend Schreibzugriffe und die Dinger sind
breit - da ist batteriegepuffertes SRAM doch deutlich besser.

von Timo Wirtz (Gast)


Lesenswert?

N Abend!

Die eingeschränkte Haltbarkeit eines EEPROMS ist natürlich auch ein
Argument.
Da würde ich spontan mal die Lösung mit dem GoldCap bevorzugen.
Die Möglichkeit, das Board so umzubauen, dass ich auf den Flash  per
movx-Anweisung zugreifen kann, behagt mir nicht so, weil ich mir das
Board nicht verbasteln will. Das wäre dann ne Lösung, wenn ich in
Zukunft ein neues Layout mache.

@Peter:
Ich habe keine Probleme mit der Größe des Speichers, im Gegenteil.
Ich möchte nur die erfassten Daten auch nach Abschalten der
Versorgungsspannung weiter zur Verfügung haben. Und ich programmiere
ausschl. in Assembler aber trotzdem Danke für die Tips. Werde mich in
Zukunft mal mehr mit C beschäftigen....

THX,

Timo

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.