-
Hi,
ich habe mal so ein bisschen im DB:
http://www.kr.tuwien.ac.at/staff/egl...eet/24lc16.pdf
gestöbert und mir ist eingefallen, dass in der Schrieb Sub:
1*Controllbyte(1010, Blockbytes 111, 0 für Schreiben) 1* (Word Addres)
1* Data.
Beim Lesen aber nur:
1*Controllbyte(1010, Blockbytes 111, 1 für Lesen) , 1* Data.
Also fehlt beim Lesen die Word Addres. Wenn das Eeprom den ganzen
Block ausgibt sind das mehr als 1 Byte.
Zusätzlich was bedeutet dieses "NACK" am ende des :
I2crbyte Lesen , Nack
Hier noch mal was aus der Wiki:
https://www.roboternetz.de/wissen/in...und_I2C_EEprom
-
Vergleich mal den Teil zum Auslesen, es muss erst die (Speicher-)Adresse dem Slave per Write übergeben werden, danach ein Restart, und dann erst kann man das Byte lesen. Da war ich auch nicht ganz bei der Sache, hab das übersehen. :-k :-b
Übernimm mal das Beispiel vom lesen in die Function.
Das NACK bedeuted hier, das dies das letzte Byte ist, und danach ein Stop kommt, man könnte hier auch weiter lesen (mit ACK), und mehr Bytes holen als nur eins. Die EEproms zählen die Adresse normalweise selber weiter.
-
So,
in Sachen Read funktionierts so:
Code:
Declare Function Read_eeprom(byval Adress As Byte) As Byte
'...
Lesen = Read_eeprom(addres)
'...
Sub Write_eeprom(byval Addres As Byte , Byval Wert As Byte)
I2cstart 'start condition
I2cwbyte &HA0 ' Bausteinadresse
I2cwbyte Addres ' Adresse im IC
I2cwbyte Wert ' Byte schreiben
I2cstop ' Stopbedingung
End Sub
Function Read_eeprom(byval Adress As Byte )
I2cstart 'Start I2C
I2cwbyte &HA0 'sende Slave Adresse
I2cwbyte Adress 'sende Speicheradresse
I2cstart 'Start I2C
I2cwbyte &HA1 'sende Slave Adresse +1 für lesen
I2crbyte Read_eeprom , Nack 'lese Adresse vom EEprom
I2cstop 'Stop I2C
End Function Read_eeprom
Auch auf die I2C-Slaveadresse achten, ob die zu der Einstellung des 2416 passt.
Nach dem schreiben eines Wertes, ist das EEprom für ein paar ms nicht erreichbar weil es das Byte erst ins EEprom schreibt, hierfür erstmal ins DB schauen wie lange das ist, können ca. 5ms sein.
Das bedeuted, wenn man sofort nachdem man einen Wert ans EEprom übergeben hat gleich wieder etwas davon lesen will, muss man erst warten. Macht man sowieso was anderes, was länger dauert als diese Zeit, braucht man natürlich nicht extra zu warten.
-
Hi,
die Freude ist groß es funzelt !!!
Erst mal danke der Chip ließt den Wert wunderbar aus.
Hier mal der Code, wenn jemand sich noch einmal mit dem Teil auseinander
setzt:
Code:
$swstack = 10 ' default use 10 for the SW stack
$framesize = 40 ' default use 40 for the frame space
Waitms 1000
'$lib "i2c_usi.lbx"
Declare Function Read_eeprom(byval Adress As Byte) As Byte
Declare Sub Write_eeprom(byval Addres As Byte , Byval Wert As Byte)
'Declare Sub Read_eeprom(byval Lesen As Byte )
Config Sda = Portd.1
Config Scl = Portd.0
'Config Scl = Portb.7 ' Ports fuer I2C-Bus
'Config Sda = Portb.5
Config Lcdpin = Pin , Db4 = Portd.6 , Db5 = Portb.0 , Db6 = Portb.1 , Db7 = Portb.2 , E = Portb.3 , Rs = Portb.4
Dim I As Bit
Config Lcd = 16 * 2 'configure lcd screen
Dim Addres As Byte
Dim Wert As Byte 'clear the LCD display
Dim Lesen As Byte
Dim Read_eeprom As Byte 'clear the LCD display
I2cinit
Cls
Waitms 1000
Addres = 1
Wert = 122
Locate 1 , 2
Lcd Chr(121)
Waitms 1000
Call Write_eeprom(addres , Wert )
I = 1
Wert = 0
Do
Locate 1 , 1
Lcd Chr(122) 'display this at the top line
If I = 1 Then
Lesen = Read_eeprom(addres)
Locate 1 , 5
Lcd Chr(122)
Locate 2 , 1
Lcd "I = " ; Lesen
Locate 2 , 6
Lcd Chr(113)
Waitms 1000
Cls
End If
Loop
End
Sub Write_eeprom(byval Addres As Byte , Byval Wert As Byte)
Locate 1 , 3
Lcd Chr(122)
I2cstart 'start condition
I2cwbyte &HA0 ' Bausteinadresse
I2cwbyte Addres ' Adresse im IC
I2cwbyte Wert ' Byte schreiben
I2cstop ' Stopbedingung
Waitms 10
Locate 1 , 4
Lcd Chr(122) ' int. Schreibzeit abwarten
End Sub
Function Read_eeprom(byval Adress As Byte )
I2cstart 'Start I2C
I2cwbyte &HA0 'sende Slave Adresse
I2cwbyte Adress 'sende Speicheradresse
I2cstart 'Start I2C
I2cwbyte &HA1 'sende Slave Adresse +1 für lesen
I2crbyte Read_eeprom , Nack 'lese Adresse vom EEprom
I2cstop
Waitms 10
Locate 2 , 1
Lcd "I = " ; Read_eeprom
Waitms 1000
'Stop I2C
End Function Read_eeprom
Eine Frage wäre noch, wie man 2 gleiche Eeproms ansteuert, an einem
Dart geht ja nicht, weil jedes Eeprom denkt es sei gemeint und in beiden
steht das gleiche.
Geht es villeicht mit:
Config Sda = Portd.1 #1
Config Scl = Portd.0 #1
Config Sda = Portd.3 #2
Config Scl = Portd.2 #2
I2cstart #1
Wie bei dem Soft-Uart oder gibt es da was anders?
-
Wenn Du mehr gleiche ansprechen willst, musst Du nur die Adresse am EEprom einstellen (Jumper, oder fest verkabeln), wenn nix eingestellt ist, haben die die Adresse $A0.
Man kann 8 von diesen am Bus betreiben. Edit: (Stimmt nicht beim 24C16 !! siehe übernächsten Beitrag !)
Das ist der Vorteil von I2C, man braucht nur einen Anschluss am µC, da es ein Bus ist, alle Slaves kommen an diese beiden Leitungen, les mal die Artikel dazu im Wiki durch, und das Datenblatt der 2416 usw.
-
Hi,
hat das was mit den A0,A1 und A2 Eingängen zu tun?
PS: Das ist mein 250 Beitrag^^
-
Es hat mit den A wie Adresseingänge zu tun, aber Du musst ins DB schauen, ob das bei deinem EEprom auch geht (das richtige DB des Herstellers, nicht irgendeins [-X ).
Die 24C16 die ich hier habe, da geht es nicht, die haben keine Adressleitungen nach aussen !
Das heisst dann, man kannnur eins dieser Bausteine am I2C anschliessen !
Da das 24C16 2KByte hat, werden die unteren 3 Bit der I2C-Slaveadresse als die oberen 3 Bits der Speicheradresse im EEprom angesehen !
So ist es möglich mit der Slaveadresse die 8 Blöcke des EEproms anzusprechen.
PS:
mein 1965. Beitrag, obwohl wir fast gleichlang im RN eingetragen sind ;-)
-
Hi,
also wenn man die nach ausengeführten Addres eingänge A0-A2 nicht
nehmen kann, und die anderen ( 1010 (Blockadresse) 0) für die Block-
addresse sind, was soll man dann nehmen um die irgenwie voneinander
zu unterschieden?
PS:
Nun ist das mein 252ter Eintrag^^
-
Hi,
aber was ist, wenn man einmal den Soft und ein mal den Hard I2c nimmt,
dann könte man das doch irgendwie hinbiegen oder?
-
Du willst also unbedingt mehrere solcher am AVR haben :-)
Dann könnte es mit Hard- und SoftI2C im Prinzip gehen, ich weiss aber nicht ob das Bascom so kann, eher nicht :-k
Denn die Ports werden beim compilieren von Bascom Fest ins Programm eingesetzt und können nicht so einfach geändert werden. Man müsste sich eigene Libs schreiben, die das unterstützen.
Oder Du nimmst grössere EEproms, die das können, zB. 24C32, aber dann hat man schon von vornherein mehr Platz in einem davon. Hiervon kann man dann 8 am I2C-Bus betreiben.