
|
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 |
| Antwort schreiben |