PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Verständnisfrage EEPROM-Daten



TomEdl
22.01.2009, 18:37
Hallo!

Habe nun schon ein wenig im Netz herumgesucht, wurde aber leider nicht fündig (eventuell falsche Begriffe verwendet?).
Um es gleich zu sagen: Es ist mir ein wenig peinlich diese Frage zu stellen, denn ich programmiere nun schon fast ein Jahr in BASCOM und habe auch schon größere Projekte realisiert - eigentlich sollte ich die ganze Thematik ja schon wissen. Aber irgendwie hat sich mir das immer unterzogen, beziehungsweise war es mir immer möglich, ohne dieses Grundwissen meine Projekte zu realisieren.

Es geht um folgendes:
Angenommen, ich möchte Daten ins EEPROM schreiben, so mache ich dies so:


Dim A as Byte

Writeeeprom A , 10

End

Oder so:


Dim A as Byte
Dim B as Eram Byte

B=A

End


Das Ganze funktioniert auch soweit.
Nun aber zu meiner Frage:
Soweit ich das mitbekommen habe, werden die Daten im HEX-Format ins EEPROM geschrieben und kann sich auch mit BASCOM auslesen. Dann sehe ich zum Beispiel "1E" in einer Zelle stehen. Dies bedeutet den Wert 30 (habe ich im so eingegeben). Wie setzt sich nun dieses "1E" zusammen?
Im Buch von Claus Kühnel habe ich ein Programmbeispiel gesehen, dass die Funktion Writeeeprom A , &H60 beinhaltet. Welchen Zahlenwert hat "&H60"? An welche Zelle wird dann der Wert geschreiben?

Wieviel Platz besitzt eine einzelne Speicherzelle? Ein Byte? Ein Word?

Ich hoffe, ihr könnt mir die ganze Thematik etwas genauer erläutern! Besten Dank schon im Vorraus!

Gruß
Thomas

Dirk
22.01.2009, 19:42
Soweit ich das mitbekommen habe, werden die Daten im HEX-Format ins EEPROM geschrieben ...
Die Daten sind "elektrisch" als Nullen und Einsen gespeichert, also z.B. ein Byte als 8 Nullen/Einsen (=Bits). Die Dezimal-Zahl 7 kann man in der Binär-Form so darstellen:
&B00000111
... oder in der Hexadezimal-Form:
&H07

Die Darstellung einer Zahl hat nichts mit der Art der Speicherung im EEPROM zu tun.

Ein Word besteht aus 16 Nullen/Einsen (=Bits):
&B0000000000000000
... hexadezimal sieht das so aus:
&H0000

Gruß Dirk

TomEdl
22.01.2009, 21:07
Hallo Dirk!

Danke für deine Antwort, aber so ganz schafft sie meine Unklarheiten noch nicht aus der Welt.

Das die Daten elektrisch ausschließlich in 1 und 0 vorliegen war mir klar, nur die Umrechnung von Dezimal zu Binär und von Binär zu Hexadezimal ist mir nicht klar. Könntest du mir das genauer erläutern oder eventuell ein paar hilfreiche Links posten?

Was für einen hexadezimalen Wert hätte zum Beuspiel 123?

Gruß
Thomas

BurningBen
22.01.2009, 21:27
Vielleicht hilft dir das hier weiter:
http://www.arndt-bruenner.de/mathe/scripts/Zahlensysteme.htm

TomEdl
23.01.2009, 12:34
Vielleicht hilft dir das hier weiter:
http://www.arndt-bruenner.de/mathe/scripts/Zahlensysteme.htm
Danke, dass hat mir sehr geholfen!
;)

Gruß
Thomas
:)

Ent19
23.01.2009, 17:05
Soweit ich das mitbekommen habe, werden die Daten im HEX-Format ins EEPROM geschrieben und kann sich auch mit BASCOM auslesen.


Mit den Beispiel:


Dim A as Byte
Dim B as Eram Byte

B=A

End


Schreibst du genau ein Byte in den EEPROM an der adresse &H00. Der EEPROM fängt ab dieser Adresse an die Werte zu speichern.



Dim A_byte As Byte
Dim B_word As Word
Dim C_long As Long
Dim Printvar As Long
Dim Printb As Word
Dim Printa As Byte

Dim A_eeprom_byte As Eram Byte
Dim B_eeprom_word As Eram Word
Dim C_eeprom_long As Eram Long
Dim D_eeprom_long As Eram Long At &H07
Dim E_eeprom_word As Eram Word At &H09 Overlay
Dim F_eeprom_byte As Eram Byte At &H0A Overlay

'1.1-Normale wertzuweisungen:
A_byte = &H01
B_word = &H0001
C_long = &H00000001

A_eeprom_byte = A_Byte
Printa = A_eeprom_byte
Print Hex(printa)
Incr A_byte
Writeeeprom A_byte, &H00
Printa = A_eeprom_byte
Print Hex(printa)

B_eeprom_word = B_Word
Printb = B_eeprom_word
Print Hex(printb)
Incr B_word
Writeeeprom B_Word, &H01
Printb = B_eeprom_word
Print Hex(printb)

C_eeprom_long = C_long
Printvar = C_long
Print Hex(printvar)
Incr C_long
Writeeeprom C_long, &H03
Printvar = C_eeprom_long
Print Hex(printvar)
Print
Print

D_eeprom_long = 0
Printvar = D_eeprom_long
Print Hex(printvar)
Print
'2.1-Gleiche Variable, selbe Werte (Variable,Variable)
Writeeeprom C_long , D_eeprom_long
Printvar = D_eeprom_long
Print Hex(printvar)
Writeeeprom B_word , E_eeprom_word
Printvar = D_eeprom_long
Print Hex(printvar)
Writeeeprom A_byte , F_eeprom_byte
Printvar = D_eeprom_long
Print Hex(printvar)
Print

'2.2-Gleiche Variable, selbe Werte (Variable,Adr)
Writeeeprom C_long , &H07
Printvar = D_eeprom_long
Print Hex(printvar)
Writeeeprom B_word , &H09
Printvar = D_eeprom_long
Print Hex(printvar)
Writeeeprom A_byte , &H0A
Printvar = D_eeprom_long
Print Hex(printvar)
Print

'2.3-Gleiche Variable, selbe Werte (Variable = Hexwert)
D_eeprom_long = &H00000002
Printvar = D_eeprom_long
Print Hex(printvar)
E_eeprom_word = &H0002
Printvar = D_eeprom_long
Print Hex(printvar)
F_eeprom_byte = &H02
Printvar = D_eeprom_long
Print Hex(printvar)
Print
Print

A_byte = &HA3
B_word = &HA200
C_long = &HA1000000

'3.1-Gleiche Variable, andere Werte (Variable,Variable)
Writeeeprom C_long , D_eeprom_long
Printvar = D_eeprom_long
Print Hex(printvar)
Writeeeprom B_word , E_eeprom_word
Printvar = D_eeprom_long
Print Hex(printvar)
Writeeeprom A_byte , F_eeprom_byte
Printvar = D_eeprom_long
Print Hex(printvar)
Print

A_byte = &HA6
B_word = &HA500
C_long = &HA4000000

'3.2-Gleiche Variable, andere Werte (Variable,Adr)
Writeeeprom C_long , &H07
Printvar = D_eeprom_long
Print Hex(printvar)
Writeeeprom B_word , &H09
Printvar = D_eeprom_long
Print Hex(printvar)
Writeeeprom A_byte , &H0A
Printvar = D_eeprom_long
Print Hex(printvar)
Print

'3.3-Gleiche Variable, andere Werte (Variable = Hexwert)
D_eeprom_long = &HA7000000
Printvar = D_eeprom_long
Print Hex(printvar)
E_eeprom_word = &HA800
Printvar = D_eeprom_long
Print Hex(printvar)
F_eeprom_byte = &HA9
Printvar = D_eeprom_long
Print Hex(printvar)
End


Ergibt:



01
02
0001
0002
00000001
00000002


00000000

00000002
00020002
02020002

00000002
00020002
02020002

00000002
00020002
02020002


A1000000
A2000000
A3000000

A4000000
A5000000
A6000000

A7000000
A8000000
A9000000


Wie du erkennen kannst, schreibt der Befehl Writeeeprom Var_a, &H03 im EEPROM ab der Adresse 3 (Bedenke dieses ist das 4. Byte im EEPROM da man bei &H00 anfängt) und belegt so viele BYTES wie die Var_a benötigt.
Byte => 1 Byte
Word => 2 Bytes
Long => 4 Bytes

Also gilt auch:
ERAM BYTE => 1 Byte im EEPROM
ERAM WORD => 2 Bytes im EEPROM
ERAM LONG => 4 Bytes im EEPROM

Im Beispiel wird immer die Variable D_eeprom_long gedruckt. So erklärt sich wieso wenn man der Variable E_eeprom setzt wird so auch D_eeprom überschrieben da diese sich im gleiche EEPROM Speicherbereich befinden. Das gleiche gilt auch wenn man die Variable F_eeprom ändert, so ändert man sowohl D_eeprom als auch E_eeprom.
Und das aus diesen Grund:
Speicheradresse__.00.01.02.03.04.05.06.07.08.09.0A .0B
A_eeprom_bereich.XX.__.__.__.__.__.__.__.__.__.__. __
B_eeprom_bereich.__.XX.XX.__.__.__.__.__.__.__.__. __
C_eeprom_bereich.__.__.__.XX.XX.XX.XX.__.__.__.__. __
D_eeprom_bereich.__.__.__.__.__.__.__.XX.XX.XX.XX. __
E_eeprom_bereich.__.__.__.__.__.__.__.__.__.XX.XX. __
F_eeprom_bereich.__.__.__.__.__.__.__.__.__.__.XX. __

Die ersten 3 EEPROM Variablen überlagern sich nicht. Jeder ERAM Typ hat sein X Bytes wie er Lang ist.
Die letzten 3 EEPROM Variablen überlagern sich, sodas beim ändern einer dieser Variablen, sich auch die anderen 2 Variablen ändern können.
Möchte man z.B. ein Byte in ein Word ändern so würde man (MC Abhängig wenn FLAG WORD tauschen gesetzt ist gilt diese nicht) eher alle Variabeln auf den ersten gemeinsamen Byte legen:
G_eeprom_bereich.__.XX.XX.XX.XX.__
H_eeprom_bereich.__.XX.XX.__.__.__
I_eeprom_bereich.__.XX.__.__.__.__

Nun wenn man I_eeprom auf 1 Setzt, so ist auch H_eeprom auf 1 und G_eeprom eben so. Anderes rum geht dieses nur bedingt, das man im Wertebereich der niedrigere Variable bleibt.
Wenn man also G_eeprom auf 256 setzt, so ist auch H_eeprom auch 256. I_eeprom hingegen ist aber 0, da ein Byte nur von 0 - 255 geht und so aus dem Werte bereich geht.

Ich hoffe du hast jetzt ein besseren einblick in der adressierung vom EEPROM bekommen.