Forum: Mikrocontroller und Digitale Elektronik EEPROM


von Izoard (Gast)


Lesenswert?

Hi

Ich möchte eine Kurve Digital in einem EEPROM ablegen. Die Kurve wird
dann im Hauptprogramm ausgelesen und D/A gewandelt!

Meine frage ist, wie ich das EEPROM beschreibe! Verstehe ich das
richtig, dass mein 8518 z.B. in der Initialisations-Routine die Daten
ins EEPROM schreiben kann?

Oder muss ich das EEPROM mit einem speziellen Programmiergerät
beschreiben?

Vielen Dank für die Antworten....

von Martin (Gast)


Lesenswert?

Hallo!
Das geht natürlich.

Martin

von crazy horse (Gast)


Lesenswert?

du kannnst es während des eigentlichen Programmlaufs in das EEPROM
schreiben, aber das ist eigentlich Quatsch, da du die Daten ja dann
schon im Flash hast und die direkt von dort lesen kannst, ausserdem
sind sie im Flash sicherer als im EEPROM aufgehoben.
Wenn doch im EEPROM, dann solltest du die Daten direkt beim
Programmieren des Chips mit Brennen, das können alle üblichen
Programmiergeräte/Adapter, auch im ISP-Mode.

von Izoard (Gast)


Lesenswert?

Hmmm! Das tönt gut! Ich möchte das EEPROM direkt beim Programmieren des
Chips mit Brennen!

Aber ich habe nicht viel Ahnung, wie ich das Anstellen soll!! Ich habe
das STK 500 Starter Kit!

In welcher Sprache muss man dann ein EEPROM programmieren! Ich möchte
eine Tabelle ins EEPROM laden... Kann man das mit AVRStudio und dem STK
500?

von Martin (Gast)


Lesenswert?

Hallo Izoard!

Programmierst du unter C oder unter Assembler?
Mir ist nämlich bei meinem CodeVision AVR etwas aufgefallen.
Wenn man dort etwas in das EEPROM legt, so beginnt die Variable bei
Adresse 1 und nicht bei Adresse 0.
Ich habe dem Support ein Email geschickt und die haben mir geantwortet:
The first byte of the EEPROM is not used as on some AVR chips it's
altered during power on.

Was nochmal deine Frage angeht hier meine Meinung (Ich gehe jetzt von C
aus):
Ich finde es nicht gut, wenn du das Programm schreibst und das EEPROM
separat bespielst, da ja dann später das Feld oder die Felder mit dem
Inhalt des EEPROM zusammenpassen müssen und das anzupassen finde ich
umständlich. Außderdem glaube ich, dass es auch umständlich ist das
EEPROM extra zu beschreiben.

Mein Tipp:
Zuerst die Variablen initialisieren:

#pragma warn-
unsigned char eeprom grossesfeld[200], kleinesfeld[20];
#pragma warn+

Danach füllst du die Felder an. z.B.

felderanfuellen();


Dann flasht du das Programm und lässt es laufen.
Hat das geklappt, so machst du die gesamte Funktion "felderanfuellen"
zum Kommentar.

Daruch hast du den großen Vorteil, dass du alles in einem File hast,
also die Informationen, die im EEPROM stehen und das Programm selbst.
Auch wenn die Funktion "felderanfuellen" unter Kommentar steht, weißt
du trotzdem, wenn du nach einiger Zeit im Programm wieder nachschaust,
welche Werte ins EEPROM gehören.
Du hast wie gesagt alles in einem File und musst dich nicht um
irgendein File kümmern, dass ins EEPROM hinein muss.

Tschüss
Martin

von crazy horse (Gast)


Lesenswert?

so'n Quark. Dafür gibts ne Projektverwaltung. Neues Projekt anlegen,
alle zu programmienden files dazuladen, Projekt speichern, fertig.
Jedesmal, wenn du das Projekt öffnest, hast du auch alle benötigten
files geladen.
Und mit deiner Mimik, einmal laufen lassen und dann auskommentieren,
funktioniert auch nicht, da es keinen flash-erase gibt, sondern nur den
chip-erase, beim nächsten flashen ist also auch der EEPROM leer.

Konstanten kann man sowohl in C als auch in Assembler im flash
lokalisieren, dafür brauch man keinen EEPROM.

von Izoard (Gast)


Lesenswert?

@ crazy horse: Wir sprechen von einem Externen EEPROM!!! (sorry)

@ Martin: Danke, jetzt hab ich noch ein kleines Problem:

Mein uC muss ja nicht viel können! Ich denke an ein Tiny! Jedoch sind
die Daten für's EEPROM relativ gross ~4K!
Wie würdest du das machen? Oder weiss sonst jemand, wie man mein
Problem löst?

von ERDI - Soft (Gast)


Lesenswert?

Nachträgliches programmieren der Daten über serielle Schnittstelle? Hat
auch den Vorteil, dass man nachträglich nochmal was ändern kann.
Mußt halt ne kleine Programmierroutine schreiben, die dir die Daten von
der seriellen Schnittstelle nimmt und dann ins Flash oder EEPROM oder
weiß der Geier was reinschreibt.

von Martin (Gast)


Lesenswert?

@ Carzy Horse: Aber natürlich du hast recht. Tschuldigung mein
Denkfehler.

@ Izoard: Achso wird reden von einem externen EEPROM.
Bei einem externen EEPROM kann man das anwenden, was ich dir schrieb.
Nur kann man natürlich keine Felder anlegen, so wie es beim internen
EEPROM machbar ist. Man benötigt eine Funktion die ein Byte auf eine
bestimmte Adresse schreibt und eine Funktion, die ein Byte von einer
bestimmten Adresse holt.
z.B:
void write_byte(unsigned int adresse, unsigned char byte);

unsigned char read_byte(unsigned char adresse);

Es kommt jetzt natürlich noch darauf an, ob es ein serielles oder ein
paralleles EEPROM ist. Im Datenblatt des EEPROMs sind immer
dementsprechende Hinweise für eine Programmierung des Speichers.

Tschüss!

Martin

von Izoard (Gast)


Lesenswert?

@ Erdi Soft

Also, so wie ich das jetzt verstehe, muss ich (um das ext. EEPROM
einmalig zu beschreiben) eine WriteEEPROM - routine schreiben, die mir
die Daten vom Flash ins externe EEPROM schreibt!

oder wie meinst du das mit:

"Mußt halt ne kleine Programmierroutine schreiben, die dir die Daten
von
der seriellen Schnittstelle nimmt und dann ins Flash oder EEPROM oder
weiß der Geier was reinschreibt."

Dann bruch ich also doch ein grosser uC, um das EEPROM zu beschreiben!
:-(

von ERDI - Soft (Gast)


Lesenswert?

Vielleicht solltest du mal ganz genau beschreiben, was du eigentlich
machen willst.
Willst du sowas wie nen Signalgenerator bauen?

Wenn ich alles richtig verstanden habe, willst du irgendwas bauen, was
dir aus nem Speicher Daten ausliest und dann an nen D/A-Wandler gibt,
oder?`Wenn du sowieso nen 8515 benutzt, kannst du den Speicher auch
direkt anschließen. (Was meinst du mit nem grossen µController???)
Was meinen Vorschlag angeht, das war so gemeint: Du schreibst dir ein
Programm für den Controller, welches Daten von der seriellen
Schnittstelle entgegennimmt und dann in den externen Speicher, der ja
am µController angeschlossen ist, schreibst. Danach kannst du die
serielle Verbindung wegmachen und hast deine Daten im Speicher
(extern).

Vielleicht solltest du dir ein Programmiergerät bauen, mit dem man
EPROMs, EEPROMs, Flash, ... beschreiben kann. Ein paar Threads weiter
unten geht es um so ein Teil.

von crazy horse (Gast)


Lesenswert?

kopieren vom flash ins EEPROM ist und bleibt sinnlos.

Download über eine serielle Schnittstelle ist zwar möglich, aber mit
nem Tiny wird das auch arg knapp.

Bau dir für ein paar Cent Material den I2C-Programmer von Lancos
(ponyprog), funktioniert problemlos.

Alternativ kannst du mal über Datenreduktion oder Berechnung der
Kennlinie nachdenken und dann vielleicht doch alles intern
unterbringen.

von Izoard (Gast)


Lesenswert?

Ich hab mich entschieden, dass ich die Daten über die Serielle
Schnittstelle (RS-232) über den uC (AT2313) in das EEPROM schreiben
möchte!

Wie muss da mein Programmablauf aussehen? Kann ich das über einen
kleinen Buffer realisieren: also z.B. die letzten 20 Daten von der
RS-232 speichern und während dem empfangen der RS-232 Schnittstelle das
EEPROM brennen? Geht das?

von crazy horse (Gast)


Lesenswert?

du solltest dir einen Buffer in der Größe anlegen, welches dein EEPROM
im page-write-Schreiben unterstützt. Die kleineren 24C02-16 haben min.
8 byte. Hast du die 8 Byte empfangen, ab damit ins EEPROM,
Schreibzyklus dauert 10ms. Bei 9600 Baud dauert die Übertragung der 8
Bytes 1/9600 x 10 x 8= 8,3ms, reicht also. Daten reinschieben, "on the
fly" schreiben, warten oder handshake nicht erforderlich. Kleinere
Baudrate schadet nicht, größere geht ohne weitere Massnahmen nicht.

von Izoard (Gast)


Lesenswert?

hmmm, vielen Dank!

Also so:


16 Bytes (24C16) von der RS-232 in den Buffer schreiben!
(1/9600*10*16=16.6 ms)

wenn Buffer voll ist, Daten an EEPROM übergeben! (wenige us) =>?

Daten werden von RS-232 wieder in Buffer geschrieben, während das
EEPROM gesperrt ist und den Schreibvorgang zu Ende führt!??


stimmt das so?
Die RS-232 Übertragung wird also mit Polling gelesen?

von crazy horse (Gast)


Lesenswert?

kannst du sowohl im Polling als auch im Interrupt-Betrieb machen.
Oben ist natürlich ein Fehler drin, bei 9600 und 8 byte-page-write
reicht die Zeit nicht, bei 16 byte-page-write aber schon.

von Izoard (Gast)


Lesenswert?

Ok, dann versteh ich's :-)

Danke

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.