Das Open-Control-Projekt - Die Alternative zur C-Control-I


Das Forum zur C-Control-1
Welche C-Control-Varianten existieren?
Übersicht - Suchen - Neueste 50 Beiträge - Neuer Beitrag - Login - Registrieren
INFO - FAQ - CC2-Forum - CCPro-Forum 

 I2C Routinen - jetzt aber richtig ;-) Kategorie: C-Control I Micro (von André H. - 21.08.2004 13:52)
 Als Antwort auf Re: I2C LCD-Ausgabe am MICRO von ibsi - 21.08.2004 0:25
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

Bisherige Antworten:

Re: I2C Routinen - jetzt aber richtig ;-) (von JanPeter - 22.08.2004 13:11)
    Re: I2C Routinen - jetzt aber richtig ;-) (von André H. - 22.08.2004 15:20)
        Re: I2C Routinen - jetzt aber richtig ;-) (von JanPeter - 22.08.2004 22:38)
            Re: I2C Routinen - jetzt aber richtig ;-) (von Dietmar - 24.08.2004 16:07)
            Re: I2C Routinen - jetzt aber richtig ;-) (von André H. - 23.08.2004 6:40)
                Re: I2C Routinen - jetzt aber richtig ;-) (von JanPeter - 24.08.2004 0:31)
                    Re: I2C Routinen - jetzt aber richtig ;-) (von Achim - 24.08.2004 0:45)
                       Re: I2C Routinen - jetzt aber richtig ;-) (von ibsi - 24.08.2004 15:46)
                          Re: I2C Routinen - jetzt aber richtig ;-) (von JanPeter - 25.08.2004 20:58)
                             Re: I2C Routinen - jetzt aber richtig ;-) (von André H. - 25.08.2004 22:07)
                                Re: I2C Routinen - jetzt aber richtig,Richtig ;-( (von JanPeter - 27.08.2004 21:34)
                                   Re: I2C Routinen - Das kann doch nicht war sein! (von André H. - 28.08.2004 8:18)
                                     Re: I2C Routinen - Das kann doch nicht war sein! (von JanPeter - 28.08.2004 20:49)
                                       Re: I2C Routinen (von André H. - 4.09.2004 11:36)
                                         Re: I2C Routinen (von JanPeter - 6.09.2004 23:21)
                                           Re: I2C Routinen (von André H. - 7.09.2004 8:27)
                                             Re: IR-Routine (von JanPeter - 7.09.2004 22:25)
                                               Re: IR-Routine (von JanPeter - 7.09.2004 22:32)
Re: I2C Routinen - jetzt aber richtig ;-) (von DIE HARD - 21.08.2004 13:58)
    Re: I2C Routinen - jetzt aber richtig ;-) (von André H. - 21.08.2004 15:22)
        Re: I2C Routinen - jetzt aber richtig ;-) (von DIE HARD - 21.08.2004 18:40)