@yaro: das generelle freischalten wäre schlecht ich halte mir die option auf das noch weitere teilnehmer dazukommen. zudem muss ich auch immer wissen welches empfangene byte zu welcher slaveadresse gehört.
@uwegw: wie würde der code den ungefähr aussehen?
mein bisheriger code mit nur einer adresse sieht wie folgt aus:
Code:
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
'-------------------------------------------------------------------------------
'***| 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
ich hatte mir nun gedacht das ganze so abzuändern das ich die routine in der hauptschleife einfach dreimal hintereinander aufrufe und vorher die slaveadresse (Twar) ändere!?
würde das so funktionieren oder wie sollte der code ungefähr aussehen?
@besserwessi: einen anderen µC kann ich natürlich nehmen zum testen wäre natürlich der atmega8 am schönsten da ich diesen hier habe. wobei ich demnächst eh bei Reichelt bestellen werde da könnte ich mir einen anderen mitbestellen. ist der atmega88 nicht sogar pinkompatibel mit dem atmega8
gruß und danke schon mal,
Bammel
Lesezeichen