Hallo,
schau dir mal unter stehenden code an. diesen verwende ich bei mir und der läuft ganz gut.
Gruß,Code:'******************************************************************************* ' um mit dem master zu senden folgenden code benutzen ' ' I2cstart ' i2cwbyte &H22 'slave-id ' I2cwbyte 1 'für motor 1 ' I2cwbyte PWM1 ' I2cwbyte PWM1b 'falls die pwm variable größer als ein byte ist ' I2cstop ' '******************************************************************************* '=============================================================================== '***| Mikrocontroller Config |************************************************** '=============================================================================== 'Microcontroller '================ $regfile = "m8def.dat" $crystal = 16000000 $hwstack = 32 $swstack = 10 $framesize = 40 'TWI '==== Declare Sub Twi_init_slave Dim Twi_control As Byte Dim Twi_status As Byte Dim Command As Byte Dim Index As Byte Dim Newbyte As Byte Dim I2cbyte(10) As Byte Dim N As Byte Enable Interrupts 'Init '===== For N = 1 To 10 I2cbyte(n) = 0 Next N Command = 0 Index = 0 Call Twi_init_slave '------------------------------------------------------------------------------- '***| Hauptprogramm |*********************************************************** '------------------------------------------------------------------------------- Do Newbyte = 0 'schauen ob TWINT gesetzt ist Twi_control = Twcr And &H80 ' Bit7 von Controlregister If Twi_control = &H80 Then Twi_status = Twsr And &HF8 ' Status 'wurde ein Byte geschickt? If Twi_status = &H80 Or Twi_status = &H88 Then Command = Twdr ' neue Daten merken Newbyte = 1 ' merken das ein neues Byte da ist End If 'TWINT muss immer gelöscht werden, damit es auf dem Bus weiter geht Twcr = &B11000100 ' TWINT löschen, erzeugt ACK End If 'wenn ein neues Byte gekommen ist verarbeiten If Newbyte <> 0 Then 'Register zuordnen -> Befehl Select Case Command Case 1 Gosub Motor1 Case 2 Gosub Motor2 Case 3 Gosub Motor3 End Select End If Loop End '------------------------------------------------------------------------------- '***| Motor 1 |***************************************************************** '------------------------------------------------------------------------------- Motor1: Index = 1 '1 Byte holen / gibt an wieviele bytes geholt werden sollen hier im beispiel max. 10 "i2cbyte(1 bis 10)" Gosub I2c_rx 'PWM1 = i2cbyte(1) Return '------------------------------------------------------------------------------- '***| Motor 2 |***************************************************************** '------------------------------------------------------------------------------- Motor2: Index = 1 '1 Byte holen Gosub I2c_rx 'PWM2 = i2cbyte(1) Return '------------------------------------------------------------------------------- '***| Motor 3 |***************************************************************** '------------------------------------------------------------------------------- Motor3: Index = 1 '1 Byte holen Gosub I2c_rx 'PWM3 = i2cbyte(1) Return '------------------------------------------------------------------------------- '***| I2C-BUS Daten Empfangsroutinen |****************************************** '------------------------------------------------------------------------------- I2c_rx: For N = 1 To Index 'erstes Byte empfangen Newbyte = 0 Do Twi_control = Twcr And &H80 If Twi_control = &H80 Then Twi_status = Twsr And &HF8 If Twi_status = &H80 Or Twi_status = &H88 Then I2cbyte(n) = Twdr Newbyte = 2 End If Twcr = &B11000100 End If If Newbyte = 2 Then Exit Do Loop Next N Return '------------------------------------------------------------------------------- '***| I2C-BUS Daten Senderoutinen |****************************************** '------------------------------------------------------------------------------- I2c_tx: For N = 1 To Index 'erstes Byte empfangen Newbyte = 0 Do Twi_control = Twcr And &H80 If Twi_control = &H80 Then Twi_status = Twsr And &HF8 If Twi_status = &HA8 Or Twi_status = &HB8 Then Twdr = I2cbyte(n) Newbyte = 2 End If Twcr = &B11000100 End If If Newbyte = 2 Then Exit Do Loop Next N Return '------------------------------------------------------------------------------- '***| TWI: Slavekonfiguration |************************************************* '------------------------------------------------------------------------------- Sub Twi_init_slave Twsr = 0 ' status und Prescaler auf 0 Twdr = &HFF ' default Twar = &H22 ' Slaveadresse setzen I2C-RX-Adr:Hex22 Twcr = &B01000100 ' TWI aktivieren, ACK einschalten End Sub
Bammel







Zitieren

Lesezeichen