K (→Beispiel für EEprom 24C256) |
|||
Zeile 191: | Zeile 191: | ||
End | End | ||
</pre> | </pre> | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | === Low/High Adressbereich mit Overlay leicht ansprechen === | ||
+ | |||
+ | <pre> | ||
+ | '============I2C EEprom versuch V1.05================================== | ||
+ | |||
+ | ' ===========Für 24C256 EEprom===================== | ||
+ | |||
+ | ' 8MHz Quarz | ||
+ | ' LCD auf Port B , | ||
+ | ' | ||
+ | |||
+ | |||
+ | $regfile = "m8def.dat" | ||
+ | $crystal = 8000000 | ||
+ | |||
+ | '---Config für LCD ----------------- | ||
+ | Config Lcd = 40 * 2 | ||
+ | Config Lcdpin = Pin , Db4 = Portb.0 , Db5 = Portb.1 , Db6 = Portb.2 , Db7 = Portb.3 , Rs = Portb.4 , E = Portb.5 | ||
+ | Config Lcdbus = 4 | ||
+ | Config Lcdmode = Port | ||
+ | Cursor On | ||
+ | |||
+ | |||
+ | |||
+ | Config Sda = Portd.5 ' I2C-Port festlegen | ||
+ | Config Scl = Portd.7 ' I2C-Port festlegen | ||
+ | |||
+ | |||
+ | Dim X As Byte | ||
+ | Dim A As Word | ||
+ | Dim B As Word | ||
+ | Dim Schreiben As Byte | ||
+ | Dim Lesen As Byte | ||
+ | |||
+ | Dim Adresse As Word At $160 | ||
+ | Dim Low_adresse As Byte At $160 Overlay | ||
+ | Dim High_adresse As Byte At $161 Overlay | ||
+ | |||
+ | |||
+ | |||
+ | '===================Hauptprogramm=============================================== | ||
+ | Cls | ||
+ | Lcd "I2C EEprom Test" | ||
+ | Waitms 500 | ||
+ | Cls | ||
+ | '------------------------------------------------------------------------------- | ||
+ | |||
+ | Schreiben = 0 | ||
+ | |||
+ | Do | ||
+ | |||
+ | '----schreiben---- | ||
+ | For Adresse = 250 To 260 | ||
+ | Incr X '1 bis Überlauf | ||
+ | |||
+ | |||
+ | I2cstart 'Start | ||
+ | I2cwbyte &HA0 'Sende Slavadresse | ||
+ | I2cwbyte Low_adresse 'Sende Speicheradresse LOW | ||
+ | I2cwbyte High_adresse 'Sende Speicheradresse High | ||
+ | I2cwbyte X 'Sende Wert | ||
+ | I2cstop 'stop | ||
+ | Waitms 10 | ||
+ | |||
+ | Locate 1 , 1 | ||
+ | Lcd "->Adres.=" ; Adresse ; "Wert=" ; X ; " " | ||
+ | Waitms 500 | ||
+ | Next Adresse | ||
+ | |||
+ | '---lesen---- | ||
+ | |||
+ | For Adresse = 250 To 260 | ||
+ | I2cstart 'Start | ||
+ | I2cwbyte &HA0 'Sende Slavadresse +1 für Schreiben | ||
+ | I2cwbyte Low_adresse 'Sende Speicheradresse Low | ||
+ | I2cwbyte High_adresse 'Sende Speicheradresse High | ||
+ | |||
+ | I2cstart 'Start | ||
+ | I2cwbyte &HA1 'Sende Slavadresse +1 für Schreiben | ||
+ | I2crbyte Lesen , Nack 'Lese Adresse vom EEprom | ||
+ | I2cstop 'Stop | ||
+ | |||
+ | Locate 2 , 1 | ||
+ | Lcd "<-Adres.=" ; Adresse ; "Wert=" ; Lesen ; " " | ||
+ | Waitms 500 | ||
+ | Next Adresse | ||
+ | |||
+ | |||
+ | |||
+ | Loop | ||
+ | |||
+ | |||
+ | End | ||
+ | |||
+ | </pre> | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
==Autor== | ==Autor== |
Version vom 25. Januar 2006, 23:48 Uhr
Inhaltsverzeichnis
Ansteuern vom I2C EEprom's mit Bascom
Allgemein
Struktur:
'---- schreiben ins EEprom ---------------------------------------- I2cstart 'Start I2C I2cwbyte Slave Adresse I2cwbyte Speicheradresse I2cwbyte Wert I2cstop 'Stop I2C Waitms 10 'warte 10ms '--- lesen vom EEprom -------------------------------------------- I2cstart 'Start I2C I2cwbyte Slave Adresse I2cwbyte Speicheradresse I2cstart 'Start I2C I2cwbyte Slave Adresse +1 für schreiben I2crbyte lese Wert I2cstop 'Stop I2C
Beispiel für EEprom 24C16
Zum besseren Verständniss werden hier die I2C Befehle untereinander geschrieben. In einem grösserem Programm, empfiehlt sich aber eine Sub-Routine zu deklarieren, die dann den Schreib/lese Vorgänge abwickelt.
Beispiel :
'============I2C EEprom schreiben/lesen ================================== ' =========== Für 24C16 EEprom ===================== ' 8MHz Quarz ' LCD auf Port B , ' $regfile = "m8def.dat" $crystal = 8000000 '---Config für LCD ----------------- Config Lcd = 40 * 2 Config Lcdpin = Pin , Db4 = Portb.0 , Db5 = Portb.1 , Db6 = Portb.2 , Db7 = Portb.3 , Rs = Portb.4 , E = Portb.5 Config Lcdbus = 4 Config Lcdmode = Port Cursor On 'SDA und SCL definieren Config Sda = Portd.5 Config Scl = Portd.7 Dim X As Byte Dim A As Byte Dim B As Byte Dim Lesen As Byte CLS Do '---- schreibe in EEprom ---- For A = 1 To 10 Incr X '1 bis Überlauf zählen I2cstart 'Start I2C I2cwbyte &HA0 'Sende Slave Adresse I2cwbyte A 'Sende Speicheradresse I2cwbyte X 'Sende Wert I2cstop 'Stop I2C Waitms 10 'warte 10ms Locate 1 , 1 Lcd "ins EEprom = " ; X ; " " ' Ausgabe der geschriebenen Werte am LCD Waitms 500 Next A '--- lesen vom EEprom ---- For B = 1 To 10 I2cstart 'Start I2C I2cwbyte &HA0 'sende Slave Adresse I2cwbyte B 'sende Speicheradresse I2cstart 'Start I2C I2cwbyte &HA1 'sende Slave Adresse +1 für schreiben I2crbyte Lesen , Nack 'lese Adresse vom EEprom I2cstop 'Stop I2C Locate 2 , 1 Lcd "Lese EEprom= " ; Lesen ; " " 'Ausgabe der EEprom Werte Waitms 500 Next B Loop End
Schleife A, schreibt den Wert 1-10 in die Speicherstelle 1-10
Schleife B, liest Speicherstelle 1-10 wieder aus und zeigt dies auch am LCD an.
Beispiel für EEprom 24C256
EEprom 24C128, 24C256 haben im Gegensatz zu den 24C16'er einen Adressraum von zwei Byte. (Weil grösserer Speicherbereich im EEprom vorhanden ist) Darum muss man den Adressberreich in Low und High Adressbereich trennen. (Zuerst Low-Adressbereich schreiben und dann High-Adressberreich)
Beispiel:
Wie Beispiel oben, nur mit erweiterten Adressbereich.
'============I2C EEprom schreiben/lesen ================================== ' =========== Für 24C256 EEprom ===================== ' 8MHz Quarz ' LCD auf Port B , ' $regfile = "m8def.dat" $crystal = 8000000 '---Config für LCD ----------------- Config Lcd = 40 * 2 Config Lcdpin = Pin , Db4 = Portb.0 , Db5 = Portb.1 , Db6 = Portb.2 , Db7 = Portb.3 , Rs = Portb.4 , E = Portb.5 Config Lcdbus = 4 Config Lcdmode = Port Cursor On 'SDA und SCL definieren Config Sda = Portd.5 Config Scl = Portd.7 Dim X As Byte Dim A As Byte Dim B As Byte Dim Lesen As Byte CLS Do '---- schreibe in EEprom ---- For A = 1 To 10 Incr X '1 bis Überlauf zählen I2cstart 'Start I2C I2cwbyte &HA0 'Sende Slave Adresse I2cwbyte A 'Sende Speicheradresse LOw I2cwbyte 1 'Sende Speicheradresse High I2cwbyte X 'Sende Wert I2cstop 'Stop I2C Waitms 10 'warte 10ms Locate 1 , 1 Lcd "ins EEprom = " ; X ; " " ' Ausgabe der geschriebenen Werte am LCD Waitms 500 Next A '--- lesen vom EEprom ---- For B = 1 To 10 I2cstart 'Start I2C I2cwbyte &HA0 'sende Slave Adresse I2cwbyte B 'sende Speicheradresse Low I2cwbyte 1 'sende Speicheradresse High I2cstart 'Start I2C I2cwbyte &HA1 'sende Slave Adresse +1 für schreiben I2crbyte Lesen , Nack 'lese Adresse vom EEprom I2cstop 'Stop I2C Locate 2 , 1 Lcd "Lese EEprom= " ; Lesen ; " " 'Ausgabe der EEprom Werte Waitms 500 Next B Loop End
Low/High Adressbereich mit Overlay leicht ansprechen
'============I2C EEprom versuch V1.05================================== ' ===========Für 24C256 EEprom===================== ' 8MHz Quarz ' LCD auf Port B , ' $regfile = "m8def.dat" $crystal = 8000000 '---Config für LCD ----------------- Config Lcd = 40 * 2 Config Lcdpin = Pin , Db4 = Portb.0 , Db5 = Portb.1 , Db6 = Portb.2 , Db7 = Portb.3 , Rs = Portb.4 , E = Portb.5 Config Lcdbus = 4 Config Lcdmode = Port Cursor On Config Sda = Portd.5 ' I2C-Port festlegen Config Scl = Portd.7 ' I2C-Port festlegen Dim X As Byte Dim A As Word Dim B As Word Dim Schreiben As Byte Dim Lesen As Byte Dim Adresse As Word At $160 Dim Low_adresse As Byte At $160 Overlay Dim High_adresse As Byte At $161 Overlay '===================Hauptprogramm=============================================== Cls Lcd "I2C EEprom Test" Waitms 500 Cls '------------------------------------------------------------------------------- Schreiben = 0 Do '----schreiben---- For Adresse = 250 To 260 Incr X '1 bis Überlauf I2cstart 'Start I2cwbyte &HA0 'Sende Slavadresse I2cwbyte Low_adresse 'Sende Speicheradresse LOW I2cwbyte High_adresse 'Sende Speicheradresse High I2cwbyte X 'Sende Wert I2cstop 'stop Waitms 10 Locate 1 , 1 Lcd "->Adres.=" ; Adresse ; "Wert=" ; X ; " " Waitms 500 Next Adresse '---lesen---- For Adresse = 250 To 260 I2cstart 'Start I2cwbyte &HA0 'Sende Slavadresse +1 für Schreiben I2cwbyte Low_adresse 'Sende Speicheradresse Low I2cwbyte High_adresse 'Sende Speicheradresse High I2cstart 'Start I2cwbyte &HA1 'Sende Slavadresse +1 für Schreiben I2crbyte Lesen , Nack 'Lese Adresse vom EEprom I2cstop 'Stop Locate 2 , 1 Lcd "<-Adres.=" ; Adresse ; "Wert=" ; Lesen ; " " Waitms 500 Next Adresse Loop End
Autor
Siehe auch
Aus dem Forum