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.
In Fragezeichen habe ich mal makiert was ich noch hinzugefügt habe was aber auch nicht richtig ist, wie es scheint.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
am Master hab ich auch schon verschiedene Codes ausprobiert ausprobiert:
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)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
Danke für schonmal im Vorraus an alle die sich meiner erbarmenaber ich finde den Fehler echt nicht. Ich mache schon eine halbe Ewigkeit damit rum






Zitieren

Lesezeichen