Hallo,
mir gefällt dein modularsysten selbstverständlich auch.
ich werfe mal für dein I2C-Slave prob einen code in raum! bei fragen dazu immer raus damit!
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
achso ich würde die kanten tatsächlich noch abrunden oder irgendwei schützen. das gibt in möbel oder ähnliches ganz hässliche macken wenn das teil da reinfährt.
schöne grüße, Bammel







Zitieren

Lesezeichen