Wenn Du die Adresse mit ner Overlay-Variable versiehst gehts einfacher...schaue mal ins Wiki
https://www.roboternetz.de/wissen/in...und_I2C_EEprom
ein schönen Fest noch
zu erst ein schönes Weihnachtsfest euch allen!
Ich habe folgendes Problem:
nach langem suchen habe ich einen Code gefunden (unten) mit dem ich mein eeprom beschreiben und auch wieder auslesen kann.
Mir ist nur noch schleierhaft, wie ich die Speicherzellen/Speicherbereiche, also in hex, für jedes Byte der 64kbit ermitteln kann.
Und was sagt Ihr zu dem Code, gibt es eine bessere Methode, um über I2C auf ein eeprom zu zugreifen?
=>code bitte<=
Vielen Dank und gute und erholsame Feiertage!Code:$regfile = "m32def.dat" $crystal = 16000000 $baud = 9600 $hwstack = 228 $swstack = 228 $framesize = 128 $lib "i2c_twi.lbx" Config Twi = 400000 ' Init TWBR und TWSR ' TWI gleich einschalten, das macht Bascom ansonsten erst beim I2CStart ! TWCR = &B00000100 ' nur TWEN setzen '----------------- LCD Display an Port c =>Conector SV9------------------------------------------------------------------------------------------------- Config Lcdpin = Pin , Db4 = Portc.5 , Db5 = Portc.4 , Db6 = Portc.3 , Db7 = Portc.2 , E = Portc.6 , Rs = Portc.7 ' Pinbelegung "LCD-Port)" ' SV8 6 5 4 3 7 8 ' Pinbelegung SV9 Board '------------------ DS1820 on pinA 0 (pull up)-------------------------------------------------------------------------------------------------------------------------------------- ' '--------- Eeprom Anschlüße ------ Config Sda = Portc.1 'SDA und SCL definieren Config Scl = Portc.0 Const E_ctlw = &HA0 Const E_ctlr = &HA1 Dim E_ah As Byte Dim E_al As Byte Dim E_addr As Word Dim E_dat As Byte Dim Dat As Byte Declare Sub E_write(byval E_addr As Word , Dat As Byte) Declare Sub E_read(byval E_addr As Word , E_dat As Byte) Declare Sub 24lc256_test call 24lc256_test end ' Routine to test the 24LC256 ' Sub 24lc256_test 'Test read and writes Print "Testing I2C Eeprom" Dat = 10 For E_addr = &H1000 To &H1010 Call E_write(e_addr , Dat) Call E_read(e_addr , E_dat) Print E_dat ; " "; Incr Dat Incr Dat Incr Dat ' +1 +1 +1 Next E_addr Print Print "Here a counter should appear from 0, 3, 6, 9, 12, 15, 18,21, 24, 27 etc." Print "End of Test" End Sub ' Routine to write the 24LC256 ' Sub E_write(byval E_addr As Word , Dat As Byte) E_ah = High(e_addr) E_al = Low(e_addr) I2cstart I2cwbyte E_ctlw I2cwbyte E_ah I2cwbyte E_al I2cwbyte Dat I2cstop Waitms 10 End Sub ' Routine to read the 24LC256 ' Sub E_read(byval E_addr As Word , E_dat As Byte) E_ah = High(e_addr) E_al = Low(e_addr) I2cstart I2cwbyte E_ctlw I2cwbyte E_ah I2cwbyte E_al I2cstart I2cwbyte E_ctlr I2crbyte E_dat , Nack I2cstop ' End Sub
MAT
Wenn Du die Adresse mit ner Overlay-Variable versiehst gehts einfacher...schaue mal ins Wiki
https://www.roboternetz.de/wissen/in...und_I2C_EEprom
ein schönen Fest noch
Schau hier mal, das Problem hatte ich auch schon mal.
https://www.roboternetz.de/phpBB2/ze...g.php?p=286178
Klappt super, je nach EEP-ROM-Größe muss man noch die Adresse anpassen (s. Datenblatt). Im Pollinboard v2 ist es in der Tat so, dass der Schreibschutz-Pin fest auf VCC gelegt ist, daher muss man den zum Beschreiben hochbiegen/isolieren...
Soooo.....
der Weihnachtsmann war nicht da , drum bastle ich weiter
Gestern hab ich es nun endlich geschafft das eeprom zu beschreiben.
Ich denke mir, dass bei einer 64kbit, also 8192 byte, großem Speicher das zu erst speichernde byte bei &H0 beginnt und bei &H1 weiter geht?!
Ist das so richtig? oder wie spricht man die einzelnen byte Speicherzellen, ihre Adresse, an?
Dann ist die nächste Frage, wie kann ich die Informationen in den einzelnen Speicherzellen wieder löschen oder reicht es wenn ich diese wieder überschreibe?
Gruß MAT
Ja da hast Du recht die erste Speicherzelle ist bei &H0 weiter gehts mit &H1; &H2 usw.
Zum löschen kann man die Speicherzelle einfach überschreiben.
@rofo88
dann hat sich ja das ausschlafen heute geloht
Dann hab ich aber noch eine Frage, wie kann ich single Werte in dem EEprom speichern?
Ich glaube das Single-Werte und IIC-EEPROM von Bascom nicht direkt unterstütz werden.
Also mußt Du den Single-Wert in die einzelnen Bytes zerlegen und die Bytes dann ins EEPROM schieben.
Damit hast Du die Single-Variable X in 4 Bytes zerlegt und kannst die ins EEPROM schieben.Code:Dim X As Single At $100 Dim A As Byte At $100 Overlay Dim B As Byte At $101 Overlay Dim C As Byte At $102 Overlay Dim D As Byte At $103 Overlay
hmmmm.
Nur leider habe ich das noch nicht richtig mit dem overlay verstanden.
Ich bekomme eine Variable temp (single) von meinem ds1820 und Deiner Meinung nach, muss ich dann diese in 4 einzelne byte oder in 2 word auftrennen. Und in den eeprom schieben.
Beim Auslesen muss ich diese doch auch wieder in einen single umwandeln.
Gibt es unter Bascom ne Funktion zum wandeln von/zu und zurück?
Ja, ne, das mit dem OVERLAY geht anders (habs eben auch dank dem Sample kapiert):
- X ist die single und belegt am Speicherplatz $100 vier Bytes (eben Nr. 100-103)
- A bis D werden auf dem selben Speicherplatz reserviert - A auf $100 usw.
- Wenn du X veränderst, dann werden automatisch auch die anderen 4 Variablen geändert - und umgekehrt genauso.
Natürlich darfst du bei sowas die Variablen nicht einfach für ne FOR NEXT Schleife nutzen (außer du verstehst, was da passiert), denn sonst verlierst du ja die Inhalte.
Nun das mit dem Overlay ist wohl die richtige Richtung....
ich kann es nur nicht in einen Code umwandeln:
1. ich empfange ein single der aus 4 byte besteht
2. ich muss diesen in 2 word oder in 4 bytes teilen
3. dann will ich diese, abhängig der Aufteilung, in eine bestimmte Adresse im eeprom speichern
und 4. lese ich dann die Adressen wieder aus und setze die einzelnen bytes/words wieder zusammen
ABER WIE??? das ist mein Problem!
Hat jemand einen Lösungsansatz?
Lesezeichen