
|
INFO - FAQ - CC2-Forum - CCPro-Forum |
|
> Hallo @all, > > Da ich für meine CCTools-Produkte auch Routinen zur Mikro schreiben muß, > poste ich anbei einmal meine Beispielroutinen. > Mit der Mikro zu arbeiten ist zeitweise bei den ganzen Bugs relativ nervenaufreibend. :-( > > MfG André H. > > > '----------------------------------------------------------------- > ' CCTools I²C-Bus-Routinen für C-Control Mikro > ' CCTools 2004 (http://cctools.hs-control.de) > '----------------------------------------------------------------- > ' Die häufigsten I²C-Bus-Adressen: > ' &h20 - &h2E MAX7311 16Bit Portexpander > ' &h30 - &h3E MAX7311 16Bit Portexpander > ' &h40 - &h4E MAX7311 16Bit Portexpander > ' &h40 - &h4E PCF8574 Portexpander > ' &h50 - &h5E MAX7311 16Bit Portexpander > ' &h50 - &h5E MAX520 4ch. 8Bit DA-Wandler > ' &h68 - &h6E MAX4572 Analog-Schalter (write only) > ' &h70 - &h7E PCF8574A Portexpander > ' &h90 - &h9E PCF8591 4ch. 8Bit AD-Wandler > ' &h90 - &h9E DS1631 12Bit Temperatursensor > ' &hA0 - &hA2 PCF8583 Uhrenbaustein > ' &hA0 - &hA6 serielle EEProms 24C128 - 24C512 > ' &hA0 - &hAE serielle EEProms 24C01 - 24C64 > ' &hA0 - &hAE MAX7311 16Bit Portexpander > ' &hB0 - &hBE MAX7311 16Bit Portexpander > ' &hC0 - &hCE MAX7311 16Bit Portexpander > ' &hD0 - &hDE MAX7311 16Bit Portexpander > '----------------------------------------------------------------- > ' Speicherbedarf der I²C-Bus-Routinen: 156 Byte > '----------------------------------------------------------------- > define SCL PORT[5] ' Pull-Up mit 4,7 bis 10k notwendig > define SDA PORT[6] ' Pull-Up mit 4,7 bis 10k notwendig > > define i byte[1] 'temporäres Byte > define data byte[2] 'Byte zur Datenübergabe zu/von I²C-Bus-Routinen > > > 'Beispiele: > 'Schreiben eines Bytes an einen PCF8574 an 0.0.0: > data = &h40 > gosub i2c_start > print "I2C-Start Ack: ",i 'Ack. über RS232 ausgeben > data = 0 ' alle Ports Low > gosub i2c_write > print "I2C-Write Ack: ",i 'Ack. über RS232 ausgeben > gosub i2c_stop > > 'Lesen eines Bytes von einen PCF8574 an 0.0.0: > data = &h41 > gosub i2c_start > print "I2C-Start Ack: ",i 'Ack. über RS232 ausgeben > gosub i2c_readlast > print "PCF8574 Daten: ",data 'Portzustände über RS232 ausgeben > gosub i2c_stop > > > 'Schreiben eines Bytes oder mehrerer an Bausteine mit Byte-Register: > ' z.B. PCF8583, PCF8591, 24C01 bis 24C02, MAX7311, MAX520, MAX4572, DS1631 > data = &hA0 > gosub i2c_start > data = 0 ' Register 0 > gosub i2c_write > data = 15 ' Datenbyte für Register 0 > gosub i2c_write > '... > ' weitere Daten können sequentiell geschrieben werden > '... > gosub i2c_stop > > > 'Lesen eines Bytes oder mehrerer an Bausteine mit Byte-Register: > ' z.B. PCF8583, PCF8591, 24C01 bis 24C02, MAX7311, MAX520 > data = &hA0 > gosub i2c_start > data = 0 ' Register 0 > gosub i2c_write > data = &hA1 > gosub i2c_start ' repeated start > gosub i2c_read > print "Daten: ",data > gosub i2c_read > print "Daten: ",data > '... > ' weitere Daten können sequentiell gelesen werden > '... > gosub i2c_readlast > print "Daten: ",data > gosub i2c_stop > > > > 'Schreiben eines Bytes oder mehrerer an Bausteine mit Word-Register: > ' z.B. EEProms 24C64 bis 24C512 > data = &hA0 > gosub i2c_start > data = 0 ' Register 0 Highbyte > gosub i2c_write > data = 0 ' Register 0 Lowbyte > gosub i2c_write > data = 15 ' Datenbyte für Register 0 > gosub i2c_write > '... > ' weitere Daten können sequentiell geschrieben werden > ' Achtung ! Page-Grenzen beachten ! > '... > gosub i2c_stop > > > 'Lesen eines Bytes oder mehrerer an Bausteine mit Word-Register: > ' z.B. EEProms 24C64 bis 24C512 > data = &hA0 > gosub i2c_start > data = 0 ' Register 0 Highbyte > gosub i2c_write > data = 0 ' Register 0 Lowbyte > gosub i2c_write > data = &hA1 > gosub i2c_start ' repeated start > gosub i2c_read > print "Daten: ",data > gosub i2c_read > print "Daten: ",data > '... > ' weitere Daten können sequentiell gelesen werden > '... > gosub i2c_readlast > print "Daten: ",data > gosub i2c_stop > > > end > '--------------------------------------- > 'I²C-Bus-Routinen > '--------------------------------------- > '--------------------------------------- > #i2c_stop > '--------------------------------------- > SDA = 0 > DEACT SCL > DEACT SDA > return > > '--------------------------------------- > #i2c_start 'returns Ack in i > '--------------------------------------- > SDA = 1 > SCL = 1 > SDA = 0 > SCL = 0 > '--------------------------------------- > #i2c_write 'returns Ack in i > '--------------------------------------- > SDA = data AND &h80 > TOG SCL > TOG SCL > for i=1 to 8 > SDA = data AND (&h80 SHR i) > TOG SCL > TOG SCL > next > DEACT SDA > TOG SCL > i = NOT SDA > TOG SCL > return > > '--------------------------------------- > #i2c_read 'returns Databyte in data > '--------------------------------------- > gosub i2c_sub_read > SDA = 0 > TOG SCL > TOG SCL > return > > '--------------------------------------- > #i2c_readlast 'returns Databyte in data > '--------------------------------------- > gosub i2c_sub_read > TOG SCL > TOG SCL > return > > #i2c_sub_read > DEACT SDA > data = 0 > for i=0 to 8 > TOG SCL > data = (data shl 1) or (SDA and 1) > TOG SCL > next > return > Hallo Andre! Die Routine sieht gut aus aber funktioniert nicht. Ich habe jetzt blos nicht die Zeit den Fehler zu suchen. MfG Jan Peter |
| Antwort schreiben |