hey.. Ich habe mein Problem wohl nicht gut geschildert. Naja das am Master war schonmal der erste Fehler, aber in meinem Slave hats sicher auch noch irgendwo Fehler.
Ich muss einen Sensor abfragen, (8 I/O Werte) und dann 2 byte auf Befehl vom Master übertragen. Master ist ein Mega32 und Slave ein Mega8. Ich habe den Code von Bammel mal übernommen und der Weg Master --> Slave funktioniert auch einwandfrei. aber Slave-->Master funktioniert nicht.
Hier mal der Slave Code.
Code:
'===============================================================================
'***| 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 Befehl As Byte
Dim Anzahl_bytes As Byte
Dim Neuesb_flagge As Byte
Dim Buffer(8) As Byte
Dim N As Byte 'zähler/index variable
Enable Interrupts
'Init
'=====
Portb.2 = 0
For N = 1 To 8
Buffer(n) = 0
Next N
Befehl = 0
Anzahl_bytes = 0
Soll_motor_r = 100
Soll_motor_l = 100
Call Twi_init_slave
'-------------------------------------------------------------------------------
'***| Hauptprogramm |***********************************************************
'-------------------------------------------------------------------------------
'auf Befehle vom master warten
Do
Neuesb_flagge = 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
Befehl = Twdr ' neue Daten merken
Neuesb_flagge = 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 Neuesb_flagge <> 0 Then
'Register zuordnen -> Befehl
Select Case Befehl
Case 1
Gosub Klappen_abfrage
Case 10
Gosub Beep
Case 255
Gosub Softreset
End Select
End If
Loop
End
'-------------------------------------------------------------------------------
'***|KLappenabfrage|*****************************************************************
'-------------------------------------------------------------------------------
Klappen_abfrage:
Incr Soll_motor_r
Incr Soll_motor_l
Buffer(1) = Soll_motor_r
Buffer(2) = Soll_motor_l
Anzahl_bytes = 2
Gosub I2c_tx
Return
'-------------------------------------------------------------------------------
'***| I2C-BUS Daten Empfangsroutinen |******************************************
'-------------------------------------------------------------------------------
I2c_rx:
For N = 1 To Anzahl_bytes
'erstes Byte empfangen
Neuesb_flagge = 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
Buffer(n) = Twdr
Neuesb_flagge = 2
End If
Twcr = &B11000100
End If
If Neuesb_flagge = 2 Then Exit Do
Loop
Next N
Return
'-------------------------------------------------------------------------------
'***| I2C-BUS Daten Senderoutinen |******************************************
'-------------------------------------------------------------------------------
I2c_tx:
'-?????
Twar = &H23 ' Slaveadresse setzen I2C-RX-Adr:Hex23
'-??????
For N = 1 To Anzahl_bytes
'erstes Byte empfangen
Neuesb_flagge = 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 = Buffer(n)
Neuesb_flagge = 2
End If
Twcr = &B11000100
End If
If Neuesb_flagge = 2 Then Exit Do
Loop
Next N
'????
Twar = &H22 ' Slaveadresse setzen I2C-RX-Adr:Hex22
'?????
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
In Fragezeichen habe ich mal makiert was ich noch hinzugefügt habe was aber auch nicht richtig ist, wie es scheint.
am Master hab ich auch schon verschiedene Codes ausprobiert ausprobiert:
Code:
Sub Automatik
Waitms 10
I2cstart
I2cwbyte Mega8_adresse
I2cwbyte 1
I2cstop
?? waitms 10
I2cstart
I2cwbyte Mega8_adresse_r
I2crbyte E , Ack
I2crbyte W , Nack
I2cstop
End Sub
Ich empfange mit der "i2crbyte" am master immer das byte, welches ich als letzes geschickt habe, in meinem Fall die Adresse des Slaves (bei h22 und h23)
Danke für schonmal im Vorraus an alle die sich meiner erbarmen
aber ich finde den Fehler echt nicht. Ich mache schon eine halbe Ewigkeit damit rum
Lesezeichen