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
Lesezeichen