Forum: Mikrocontroller und Digitale Elektronik Speichern im ATmega8 EEPROM


von MB (Gast)


Lesenswert?

Hi,
ich wollt emich mal erkundigen, wie man mehrere Daten ins EEPROM des 
ATmega8 speichert.
Ein Bitmuster bringt ja keine Probleme mit sich, aber geht das auch mit 
mehreren?

Im AVR-Studio hab ich folgenden code dazu genommen:

EEPROM_write:
     ; Wait for completion of previous write
  sbic EECR,EEWE
  rjmp EEPROM_write
     ; Set up address (r18:r17) in address register
  out EEARH, r18
  out EEARL, r17
     ; Write data (r16) to data register
  out EEDR,r16
     ; Write logical one to EEMWE
  sbi EECR,EEMWE
     ; Start eeprom write by setting EEWE
  sbi EECR,EEWE
  ret

8Dieser Auszug ist im manual vom ATmega8 enthalten)

kann jemand helfen?
Danke schon mal

von Sauger (Gast)


Lesenswert?

Moin,

eventuell eine Schleife drum bauen?

MfG

von MB (Gast)


Lesenswert?

ja speichert der dann mehrere verschiedene rein?
die ich dann einzeln wieder auslesen kann?

von Karl H. (kbuchegg)


Lesenswert?

Jeder Wert hat doch seine eigene Adresse!

Ist wie im Freibad:
Jeder Gast bekommt sein Kästchen für seine Utensilien. Und wer mehr 
Platz braucht nimmt einfach 2. Jedes Kästchen hat eine Nummer, seine 
Adresse

Und jetzt vergleich mal
1
  ...
2
     ; Set up address (r18:r17) in address register
3
  out EEARH, r18
4
  out EEARL, r17
5
     ; Write data (r16) to data register
6
  out EEDR,r16
7
  ...
lies die Kommentare.

von MB (Gast)


Lesenswert?

ahh...
dass heisst ich kann kann die hight und low adressden verändern und so 
mehrere daten einspeichern (also hier r17 und r18 in r27 und r28 zB)?

von Karl H. (kbuchegg)


Lesenswert?

Kopfschlag.

Nein. Regíster enthalten Werte!
Der Wert der in r18:r17 gespeichert ist, ist die Adresse im EEPROM, an 
der das 1 Byte, welches in r16 steht abgelegt wird.

In r18:r17  steht  0000   -> das Byte in r16 wird an der EEPROM Adresse
                             0 abgelegt
in r18:r17 steht 0001     -> das Byte in r16 wird an der EEPROM Adresse
                             1 abgelegt
in r18:r17  steht 10A8    -> das Byte in r16 wird an der EEPROM Adresse
                             10A8 abgelegt

Bist du sicher, dass du das Tutorial von Anfang an durchgemacht hast? 
Dann sollte dir die Bedeutung des Befehls OUT eigenlich klar sein. Am 
Anfang wars
      OUT PORTB, r16

mit der Bedeutung: transferiere den Inhalt von r16 auf das Output 
Register mit dem Namen PORTB

hier ist es
      OUT EERH, r18

mit der Bedeutung: transferiere den Inhalt von r18 auf das Output 
Register mit dem Namen EERH

Im ersten Fall ist PORTB so verschaltet, dass es auf Pins des µC 
herausgelegt wird. Im letzten Fall ist EERH so verschaltet, dass es der 
EEPROM Mechanismus als (Teil des) Adressregister benutzt, von wo die 
nächste EEPROM Aktion lesen bzw. schreiben soll.

von MB (Gast)


Lesenswert?

*ein schlag auf den Hinterkopf fördert das Denkvermögen^^*

also ändere ich einfach die werte in den registern r 17 und r18 von 
00:00 auf zB 01:01 und ändere so die zieladresse..?

hoff dass das jetz richtig ist

von Ziegenpeter (Gast)


Lesenswert?

MB schrieb:
> also ändere ich einfach die werte in den registern r 17 und r18 von
> 00:00 auf zB 01:01 und ändere so die zieladresse..?

Theoretisch würde das funktionieren. Ist aber ein schlechtes Beispiel - 
man könnte denken du hast keine Ahnung davon, wozu man die beiden 
Register kombiniert. Wenn du nämlich die Werte von 00:00 auf 01:01 
änderst, änderst du die resultierende Adresse von 0 auf 257 (übersprings 
also 256 Bytes, wo du hättest was speichern können).

Guck dir am besten das AVR-Tutorial zum Speicher an:
http://www.mikrocontroller.net/articles/AVR-Tutorial:_Speicher

von MB (Gast)


Lesenswert?

serh gut, danke;
das Tutorial hab ich mir auch schon durchgelesen, aber ich hatte halt 
ein paar probleme danach...

noch ein andere Frage:
ist es möglich, im EEPROM eine Routine zu speichern (zb ein Lauflicht 
oder ein abwechselndes blinken jeder 2. LED am Ausgang von 01010101 auf 
10101010 und wieder zurück) und diese dann wieder abzurufen?
wenn ja wie?
danke

von Karl H. (kbuchegg)


Lesenswert?

MB schrieb:
> serh gut, danke;
> das Tutorial hab ich mir auch schon durchgelesen, aber ich hatte halt
> ein paar probleme danach...

Wenn ich mir das so ansehe, dann sind deine Probleme eher allgmeiner 
Natur und treten beim Anwenden auf die spezielle Situation EEPROM 
lesen/schreiben nur ganz besonders zu Tage.

Das Tutorial setzt schon vorraus, das ein gewisser Grundstock an 
C-Wissen vorhanden ist. Das Tutorial ist kein C Tutorial in dem Sinne, 
das dort C gelehrt wird, sondern ein Tutorial über die Besonderheiten, 
die einem auf einem AVR in der C Programmierung begegnen.

> noch ein andere Frage:
> ist es möglich, im EEPROM eine Routine zu speichern (zb ein Lauflicht
> oder ein abwechselndes blinken jeder 2. LED am Ausgang von 01010101 auf
> 10101010 und wieder zurück) und diese dann wieder abzurufen?
> wenn ja wie?

Nein.
Code der ausgeführt wird, steht im Flash. Immer.

Aber es hindert dich natürlich nichts und niemand daran, dir ein 
Programm auszudenken, welches durch Daten gesteuert bestimmte 
Blinksequenzen ausführt. Und diese Daten stehen können wiederrum im 
EEPROM stehen.

von MB (Gast)


Lesenswert?

ja gut aber wenn ich mir zig verschiedene bitmuster im eeprom speicher 
um dann immer irgendwelche wieder auszulesen dann kann ich das mit dem 
EEPROM auch lassen, weil das ja ziemlich überflüssig wäre oder?

von STK500-Besitzer (Gast)


Lesenswert?

>ja gut aber wenn ich mir zig verschiedene bitmuster im eeprom speicher
>um dann immer irgendwelche wieder auszulesen dann kann ich das mit dem
>EEPROM auch lassen, weil das ja ziemlich überflüssig wäre oder?

Naja, man würde ein Ausleseroutine schreiben (die gibt es sogar schon), 
und eine Ausgaberoutine, die man immer nur mit den gewünschten Werte 
füttert.
Eine Art Programmsteuerung kann man darüber dann auch machen.

von Bastler (Gast)


Lesenswert?

Sowas macht schon Sinn.
Ich hab sowas für eine LED-Matrix mit externen I²C EEPROMs gemacht.

Dabei werden die "Bilder" die angezeigt werden sollen aus dem EEPROM 
gelesen und danach angezeigt.
Anderes EEPROM "einlegen", schon läuft was anderes ab.

von STK500-Besitzer (Gast)


Lesenswert?

>Anderes EEPROM "einlegen"

Damit meinst du jetzt das Umprogrammieren, oder?
Jedes Mal einen Chip wechseln ist etwas unspaßig.

von Karl H. (kbuchegg)


Lesenswert?

STK500-Besitzer schrieb:
>>Anderes EEPROM "einlegen"
>
> Damit meinst du jetzt das Umprogrammieren, oder?
> Jedes Mal einen Chip wechseln ist etwas unspaßig.

Sagt wer?
Er kann sich ja kleine Stecker gebaut haben, mit jeweils einem EEPROM 
drinnen. So wie die Kartuschen, in denen Gameboyspiele ausgeliefert 
wurden.

Möglichkeiten gibt es viele.
Man kann ja zb auch eine UART einbauen und das Muster über die serielle 
Schnittstelle vom PC aus einspielen.
Oder über Infrarot oder ....

Egal wie es ins EEPROM kommt. Das EEPROM ist der Speicher, wenn es darum 
geht Daten variabel zu halten aber doch dauerhaft, so dass sie Strom 
abschalten überleben

von STK500-Besitzer (Gast)


Lesenswert?

>Er kann sich ja kleine Stecker gebaut haben, mit jeweils einem EEPROM
>drinnen.
Stimmt.
Dafür hat man früher aber eher EPROMs genommen.

>So wie die Kartuschen, in denen Gameboyspiele ausgeliefert wurden.
Hatte ich nie...

von Sauger (Gast)


Lesenswert?

STK500-Besitzer schrieb:
> Eine Art Programmsteuerung kann man darüber dann auch machen.
>

Ja kann man,
in grauer Vorzeit hat man so ganze Produktionsanlagen gesteuert. 
Automatiesierungssysteme wie PROMODUL-K, PROMODUL-M, PDPS der Fa. 
Schleicher oder die 150U der Fa. Siemens waren so aufgebaut.

MfG

von Bastler (Gast)


Lesenswert?

genau!

Ich habe einen 4pol. Stecker (+/-/SDA/SCL) und darin ist ein kleines 
8pol. SO SMD Teilchen.

Prinzipiell wie beim GameBoy.
Mehrere "Filmchen" für den "Player".

Mit UART muss ich mal noch erweitern.

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.