'* Testprogramm zum Schreiben/Lesen des EEPROM über I2C
'* 10 Byte des EEPROM werden mit einer Dummyzahl beschrieben
'* Siehe Handbuch BASCOM
'* Stefan Weißer - Getestet, funktioniert

Config Lcd = 16 * 2
Config Lcdbus = 4
Config Lcdpin = Pin , Db4 = Portc.2 , Db5 = Portc.3 , Db6 = Portc.4 , Db7 = Portc.5 , E = Portb.4 , Rs = Portb.5

Config Scl = Portc.0                                        '* I2C Clock-Leitung definieren
Config Sda = Portc.1                                        '* I2C Datenleitung definieren
I2cinit

Dim X As Byte                                               '* Hilfsvariable für den zu schreibenden Wert
Dim Hb As Byte                                              '* High-Byte der Speicher-Adresse
Dim Lb As Byte                                              '* Low-Byte der Speicher-Adresse
Dim Lesen As Byte                                           '* Hilfsvariable zum Lesen aus dem EEPROM

Gosub Init

Do
Cls
Locate 1 , 1
Lcd "Taste druecken"
If Pind.6 = 0 Then Gosub Schreiben                          '* S1
If Pind.7 = 0 Then Gosub Lesen                              '* S2
Waitms 10
Loop

Init:                                                       '* Ausgabe der Eingangsmeldung
Cls
Ddrd = &B00111111                                           '* Bit 6 und 7 von Port D als Eingang definieren
Portd = &B11000000                                          '* PullUp der Eingänge 6 und 7 einschalten
Hb = 0                                                      '* High-Byte der Speicheradresse kann hier angeben
Locate 1 , 1
Lcd "Schreiben S1"                                          '* Zum Schreiben des I2C S1 drücken
Locate 2 , 1
Lcd "Lesen S2"                                              '* Zum Lesen des I2C S2 drücken
Wait 2
Return                                                      '* Aus Unterprogramm Init

Schreiben:                                                  '*---- schreibe in EEprom ----
X = 20                                                      '* Zu schreibender Wert, maximal 255 (1Byte)
For Lb = 0 To 10                                            '* Low-Byte wird incrementiert
I2cstart                                                    '* Start I2C
I2cwbyte &HA2                                               '* Sende gewünschte Slave Adresse und Control-Word
I2cwbyte Hb                                                 '* Sende High-Byte der Speicheradresse
I2cwbyte Lb                                                 '* Sende Low-Byte der Speicheradresse
I2cwbyte X                                                  '* Sende zu schreibenden Wert
I2cstop                                                     '* Stop I2C
Waitms 10                                                   '* warte 10ms, laut BASCOM Handbuch Grund?
Cls
Locate 1 , 1
Lcd "Schreibe Lb" ; " = " ; X                               '* Ausgabe der geschriebenen Werte am LCD
Incr X                                                      '* Zu Schreibenden Wert erhöhen
Waitms 500
Next Lb
Return                                                      '* Aus Unterprogramm Schreiben

Lesen:                                                      '*--- lesen vom EEprom ----
For Lb = 0 To 10
I2cstart                                                    '* Start I2C
I2cwbyte &HA2                                               '* sende gewünschten Slave Adresse und Control-Word
I2cwbyte Hb                                                 '* Sende High-Byte der Speicheradresse
I2cwbyte Lb                                                 '* Sende Low-Byte der Speicheradresse
I2cstart                                                    '* Erneuter Start I2C, ist vom 24C64 so spezifiziert
I2cwbyte &HA3                                               '* sende Slave Adresse +1 für Lesen, siehe Datenblatt 24C64 S.6
I2crbyte Lesen , Nack                                       '* lese Daten vom EEPROM, lesen mit NACK abschliessen
I2cstop                                                     '* Stop I2C
Cls
Locate 1 , 1
Lcd "Lese Lb " ; Lb ; "= " ; Lesen                          '* Ausgabe der ausgelesenen Werte
Waitms 500
Next Lb
Return                                                      '* Aus Unterprogramm Lesen


End                                                         '* Das Programm