PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : eeprom 24lc64 als speicher für temperaturen von ds1621



bastian07
31.12.2007, 13:26
Guten morgen.
Bin gerade dabei einen Temperaturlogger zu bauen mit oben gennanten bausteinen (plus atmega8 und max232). Das ding soll temperaturen speichern und dann vom computer aus mittels einem Programm in VBA direkt in Excel eingetragen werden.
Mein Problem ist nur, so leid es mir tut, die addressierung des eeproms. Schreiben und lesen ist alles kein problem nur wenn ich mit dem unten gennanten Code arbeite, sollten ja alle werte von 1 bis 300 ins eeprom geschrieben werden und danach wieder die gleichen werte ausgelesen werden.
Nur krieg ich werte bis 255 also wenn ein byte zuende ist und dann wieder von null angefangend(siehe 24CL64.LOG)
Muss man das mit diesem overlay machen, weil ich da noch nciht so recht durchsteige oder geht das auch einfacher. Hab nämlich im Forum viele Beiträge gesehen wo es ähnlich gemacht wurde wie bei mir.
Vielleicht kann mir jemand helfen.
Dank im Vorraus und nen guten Rutsch
Bastian 07



$regfile = "m8def.dat"
$crystal = 3686400
$baud = 9600


Config Sda = Portc.4
Config Scl = Portc.5

I2cinit

Dim Lesen As Byte
Dim Wert As Integer
Dim Address As Word
Dim Speicher_addresse_high As Byte
Dim Speicher_addresse_low As Byte

Declare Sub Eeprom_write(address As Word , Wert As Integer)
Declare Sub Eeprom_read(address As Word)



For Address = 1 To 300
Incr Wert
Call Eeprom_write(address , Wert)
Waitms 10
Next Address



For Address = 1 To 300
Call Eeprom_read(address)
Print "Lese EEprom= " ; Lesen ; " Bei Adresse: " ; Address
Waitms 10
Next Address


End

Sub Eeprom_write(byval Address As Word , Wert As Integer)

Speicher_addresse_high = High(address)
Speicher_addresse_low = Low(address)

I2cstart 'Start I2C
I2cwbyte &HA0 'Sende Slave Adresse
I2cwbyte Speicher_addresse_high 'Sende Speicheradresse High
I2cwbyte Speicher_addresse_low 'Sende Speicheradresse LOw
I2cwbyte Wert 'Sende Wert
If Err = 0 Then
Print "ins EEprom = " ; Wert ; " Bei Adresse: " ; Address
Else
Print "Fehler beim schreiben"
End If
I2cstop
End Sub

Sub Eeprom_read(byval Address As Word)
Speicher_addresse_high = High(address)
Speicher_addresse_low = Low(address)
I2cstart 'Start I2C
I2cwbyte &B10100000 'sende Slave Adresse
I2cwbyte Speicher_addresse_high 'Sende Speicheradresse High
I2cwbyte Speicher_addresse_low 'sende Speicheradresse

I2cstart 'Start I2C
I2cwbyte &B10100001 'sende Slave Adresse +1 für Lesen
I2crbyte Lesen , Nack 'lese Adresse vom EEprom
I2cstop 'Stop I2C
End Sub

pctoaster
31.12.2007, 14:50
Hi,
Byte und Integer sind Datentypen mit einem Wertebereich von 0 bis 255. Mehr passt in eine Eeprom Speicherzellle auch nicht hinein.

Gruß
pctoaster

bastian07
31.12.2007, 14:59
Also bin ein schritt weiter ich denke das mit der addressierung stimmt alles nur ich kann halt nichts größeres als ein byte schreiben(is ja auch logisch) aber der temperatur fühler gibt halt werte zwischen -550 und +1250 aus also -55° bis +125° und das müsste ich irgendwie speichern.
im internen eeprom konnte ich einfach nur jedes zweite Byte addressieren und schon konnte ich integer schreiben. Bei dem externen geht das aber eider nicht. Müsste also die Zahl aufteilen. Müsste doch auch mit high() und low() funktionieren aber wie kann ich diese, nachdem ich die werte einzeln geschrieben hab, nach dem auslesen muss ich die nur irgendwie wieder zusammenführen aber wie ?
gruß
Gruß


@pctoaster: Ja genau =) warst schneller als ich

albundy
31.12.2007, 15:46
nach dem auslesen muss ich die nur irgendwie wieder zusammenführen aber wie ?


Wert = Speicherstelle_H * 256
Wert = Wert + Speicherstelle_L

MrNiemand
31.12.2007, 15:53
brauchst du Auflösung auf 0.1 °C ?. ansonsten würde ich es als Byte speichern, also einfach Messwert +55 abspeichern, und am PC später wieder abziehen, dann passt es in ein Byte gut rein. Vorteil ist einfach du brauchst 50% weniger Speicher als mit Integer oder Word.

bastian07
31.12.2007, 16:19
@ albundy: Ja tip top genau das hab ich gesucht!funktioniert einwandfrei. Danke
@ MrNiemand: Ja darüber hatte ich auch schon nach gedacht aber bei dem eeprom kann ich so 4000 messungen machen das heist bei stündlich einem messwert sind das 166 tage und bei einem größerem eeprom(512) bis zu 1333 tage reicht also völlig =)

Trotzdem an alle vielen danke