PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : 24C512 - Adressierung wie??



dl1akp
21.09.2007, 09:56
Hallo Leute,

möchte o.g. EEPROM zur Speicherung von Daten verwenden.
Habe es mit dem unteren Code auch schon für den 24C16 hinbekommen.
Nun bin ich etwas ratlos, wie das mit dem 24C512 gehen soll. Speziell die ADressierung und dann die Adresse auswählen bei diesem Teil.

Hat da jemand eine Idee, oder vielleicht schon mal gemacht - und kann mir mit Codeschnipseln helfen??

Hier mein Code für den 24C16, habe ich glaube auch dem Robonetz...


im Adresse As Word 'Die Adresse als Word-Variable (0...65535); hier nur 0...2048 nötig
Dim Slave As Byte 'siehe Text

'****************************Unterprogramm Schreiben
'---- schreibe in EEprom ----
Schreiben:
For X = 1 To 6
Select Case Adresse 'Erklärung siehe Datei "Adressierung des 24C16"
Case 0 To 255 : Slave = &HA0
Case 256 To 512 : Slave = &HA2
Case 513 To 768 : Slave = &HA4
Case 769 To 1024 : Slave = &HA6
Case 1025 To 1280 : Slave = &HA8
Case 1281 To 1536 : Slave = &HAA
Case 1537 To 1792 : Slave = &HAC
Case 1793 To 2048 : Slave = &HAE
End Select
I2cstart 'Start I2C
I2cwbyte Slave 'Sende Slave Adresse
I2cwbyte Adresse 'Sende Speicheradresse High
I2cwbyte Buffer(x) 'Sende Wert
I2cstop 'Stop I2C
Waitms 10 'warte 10ms
Incr Adresse 'nächste Speicheradresse
Next
Return
'****************************Ende Unterprogramm




'***************************Unterprogramm Lesen
'--- lesen vom EEprom ----
Lesen:
'Adresse = Adresse - 6 'von aktueller Adresse wieder 6 Adressen rückwärts
For X = 1 To 6
Select Case Adresse
Case 256 To 512 : Slave = &HA2
Case 513 To 768 : Slave = &HA4
Case 769 To 1024 : Slave = &HA6
Case 1025 To 1280 : Slave = &HA8
Case 1281 To 1536 : Slave = &HAA
Case 1537 To 1792 : Slave = &HAC
Case 1793 To 2048 : Slave = &HAE
End Select
I2cstart 'Start I2C
I2cwbyte Slave 'sende Slave Adresse
I2cwbyte Adresse 'Sende Speicheradresse High
I2cstart 'Start I2C
I2cwbyte &HA1 'sende Slave Adresse +1 für lesen
I2crbyte Buffer_ee(x) , Nack 'lese Adresse vom EEprom
I2cstop 'Stop I2C
Waitms 10
Incr Adresse
Next
Adresse = Adresse + 6 'Adresse wieder auf ursprünglichen Wert setzen
Return
'*************************** Ende Unterprogramm

Vielen Dank im Voraus.
Andreas

kurzschluss
21.09.2007, 11:47
Hallo Andreas,

so läufts bei mir....
der AT24c512 hat ein festes Byte für Hardware Adresse
(nur das R/W-Bit ist variabel),
dann folgen 2Byte mit der eigentlichen Speicheradresse

die Speicheradresse musst du als word-Variable hochzählen (hier +16)
abhänig wieviele Bytes hintereinander geschrieben bzw. gelesen werden





'## Datenspeicher AT24c512 A1 und A0 auf +5V !! Hardware Adresse
Const Chip_w = &B10100110 'schreiben
Const Chip_r = &B10100111 'lesen
Dim Ebuffer(16) As Byte
Dim I As Word 'Pointer counter
Dim X As Word
Dim Adr As Word
Dim Eepromadr As Word

'.........
Declare Sub Schreibe_block(byval St_adr As Word)
Declare Sub Lese_block(byval St_adr As Word)


'........



'************************************************* *********************
'** Define Subroutines **
'************************************************* *********************
'Schreib 16 Byte aus dem ebuffer in EEPROM
Sub Schreibe_block(st_adr As Word ) '

Local Adr_low As Byte
Local Adr_high As Byte
Adr_low = Low(st_adr) ' Extract low byte of address to be written.
Adr_high = High(st_adr) ' Extract high byte of addesss to be written.
I2cstart ' Send I2C Start.
I2cwbyte Chip_w ' EEPROM device type, address and write bit.
I2cwbyte Adr_high ' Send high address to write to.
I2cwbyte Adr_low ' Send low address to write to.
I2cwbyte Ebuffer(1) ': Print Ebuffer(1) --> nur zum debuggen
I2cwbyte Ebuffer(2) ': Print Ebuffer(2)
I2cwbyte Ebuffer(3) ': Print Ebuffer(3)
I2cwbyte Ebuffer(4) ': Print Ebuffer(4)
I2cwbyte Ebuffer(5) ': Print Ebuffer(5)
I2cwbyte Ebuffer(6) ': Print Ebuffer(6)
I2cwbyte Ebuffer(7) ': Print Ebuffer(7)
I2cwbyte Ebuffer(8) ': Print Ebuffer(8)
I2cwbyte Ebuffer(9) ': Print Ebuffer(9)
I2cwbyte Ebuffer(10) ': Print Ebuffer(10)
I2cwbyte Ebuffer(11) ': Print Ebuffer(11)
I2cwbyte Ebuffer(12) ': Print Ebuffer(12)
I2cwbyte Ebuffer(13) ': Print Ebuffer(13)
I2cwbyte Ebuffer(14) ': Print Ebuffer(14)
I2cwbyte Ebuffer(15) ': Print Ebuffer(15)
I2cwbyte Ebuffer(16) ': Print Ebuffer(16)
I2cstop
'Waitms 10
End Sub

'lese 16 Byte in den ebuffer
Sub Lese_block(st_adr As Word)

Local Adr_low As Byte
Local Adr_high As Byte
Adr_low = Low(st_adr) ' Extract low byte of address to be written.
Adr_high = High(st_adr) ' Extract high byte of addesss to be written.
I2cstart ' Send I2C Start.
I2cwbyte Chip_w ' EEPROM device type, address and write bit.
I2cwbyte Adr_high ' Send high address to write to.
I2cwbyte Adr_low
I2cstart ' Issue another start sequence.
I2cwbyte Chip_r ' Select MicroChip EEPROM device type, address and read bit
I2crbyte Ebuffer(1) , Ack ' Read data from desired location in chip.
I2crbyte Ebuffer(2) , Ack
I2crbyte Ebuffer(3) , Ack
I2crbyte Ebuffer(4) , Ack
I2crbyte Ebuffer(5) , Ack
I2crbyte Ebuffer(6) , Ack
I2crbyte Ebuffer(7) , Ack
I2crbyte Ebuffer(8) , Ack
I2crbyte Ebuffer(9) , Ack
I2crbyte Ebuffer(10) , Ack
I2crbyte Ebuffer(11) , Ack
I2crbyte Ebuffer(12) , Ack
I2crbyte Ebuffer(13) , Ack
I2crbyte Ebuffer(14) , Ack
I2crbyte Ebuffer(15) , Ack
I2crbyte Ebuffer(16) , Nack
I2cstop
End Sub




Grüße
Kurzschluss

Rofo88
21.09.2007, 12:11
Kannst auch mal ins Wiki schauen https://www.roboternetz.de/wissen/index.php/Bascom_und_I2C_EEprom