Site hosted by Angelfire.com: Build your free website today!

Quellcode für die C-Control 1

I2C Bus in CC-Basic



Der CC-Basic Quellcode zum I2CBus enthält alle Routinen zum Ansteuern und Abfragen von I2C Bus Slave Bausteinen. Diese Routinen können über den GOSUB Befehl einzeln aufgerufen werden. Parameter werden dabei mithilfe der Variablen I2C_Daten. Auch Rückgabewerte der Unterfunktionen werden in dieser Variablen gespeichert.

Der Quellcode muss also nur ans Ende ihres Programs eingefügt werden (nur der Code nach den Definition der Ports und Variablen !!). Ausserdem müssen zwei Digtialports mit dem Namen SDA und SCL definiert werden. Welche das sind ist völlig egal. Und es müssen zwei Variablen mit den Namen I2C_Daten und N definiert werden. Im downgeloadeten Quelltext sind diese Bedingungen bereits erfüllt, müssen aber so nicht unbedingt übernommen werden. Hier nun kurz eine Aufleistung der einzelnen Unterroutinen und Hilfe zu deren Verwendung:


#I2C_Start
Stellt am I2C Bus die Startbedingung her.

Beispiel:

gosub I2C_Start


#I2C_Stop
Stellt am I2C Bus die Stopbedingung her.

Beispiel:

gosub I2C_Stop

#I2C_Write
Schickt ein Byte an einen I2C Slave (+ 9. Taktimpuls (ACK))

Beispiel:

I2C_Daten=64
gosub I2C_Write     'schreibt das Byte 64

#I2C_Read
Empfängt ein Byte von einem I2C Slave (ohne ACK)

Beispiel:

gosub I2C_Read      'empfängt ein Byte
gosub NoAck         '9. Taktimpuls mit NO ACKNOWLEDGE
put I2C_Daten       'schickt das Empfangene Byte über die serielle Sch

Ack
sendet einen 9. Taktinpuls mit SDA Leitung LOW = ACKNOWLEDGE
sollte nach I2C_Read aufgerufen werden (es sei denn NO ACK ist gewünscht)


Beispiel:

gosub I2C_Read      'empfängt ein Byte
gosub Ack         '9. Taktimpuls mit ACKNOWLEDGE (=weiteres Byte empfangen)

NoAck
sendet einen 9. Taktinpuls mit SDA Leitung HIGH = KEIN ACKNOWLEDGE
sollte nach I2C_Read aufgerufen werden (es sei denn ACK ist gewünscht)


Beispiel:

gosub I2C_Read      'empfängt ein Byte
gosub NoAck         '9. Taktimpuls mit NO ACKNOWLEDGE (=kein weiteres Byte mehr empfangen)


Zum Schluss noch ein komplettes Beispiel zur Ansterung des Populären 24C02 (256 Bytes) DatenEEProms. In diesem einfachen Beispiel wird das Byte 250 in das EEProm (I2C Adresse 64)gespeichert und anschließend wieder gelesen. Der eingefärbte Quelltext kennzeichnet die Teile der downgeloadeten (notwendigen) Routinen.


'Verwendete Ports
define SDA Port[9]
define SCL Port[10]

'Notwendige Variablen
define I2C_Daten byte
define N byte

'Ruhezustand
SDA=ON
SCL=ON

'250 in den EEProm schreiben
gosub I2C_Start
I2C_Daten=64 'Bausteinadresse des 24C02 mit RW-Bit LOW
gosub I2C_Write
I2C_Daten=0 'Adresse im Speicher des 24C02
gosub I2C_Write
I2C_Daten=250 'Daten die im EEPRom gespeichert werden sollen
gosub I2C_Write
gosub I2C_Stop
pause 1       'pause um den EEProm die Daten speichern zu lassen

'wieder lesen
gosub I2C_Start
I2C_Daten=64 'Bausteinadresse des 24C02
gosub I2C_Write
I2C_Daten=0 'Adresse im Speicher des 24C02
gosub I2C_Stop
gosub I2C_Start
I2C_Daten=65 'Adresse mit RW-Bit HI (=lesen)
gosub I2C_Write
gosub I2C_Read 'Byte lesen
gosub NoAck    'kein weiteres Byte mehr lesen
gosub I2C_Stop

'das gelesene Byte befindet sich nun in I2C_Daten.

end


#I2C_Start
SDA=OFF
SCL=OFF
return

#I2C_Stop
SDA=OFF
SCL=ON
SDA=ON
return

#I2C_Write
for N=1 to 8
    SDA=OFF
    if (I2C_Daten and 128) =128 then SDA=ON
    pulse SCL
    I2C_Daten=I2C_Daten shl 1 '1 Bit nach links schieben
next
pulse SCL
return

#I2C_Read
I2C_Daten=0
deact SDA
for n=1 to 8
    I2C_Daten=I2C_Daten shl 1
    SCL=ON
    if SDA then I2C_Daten=I2C_Daten+1
    SCL=OFF
next
return

#Ack
SDA=0
pulse SCL
return

#NoAck
SDA=1
pulse SCL
return