Hallo,
ich sitze jetzt schon seit heute morgen an diesem Problem:
Ich habe diese Code:
Die ersten paar Sekunden läuft das auch so, wie es soll. Aber danach endet er in der Funktion Twi_read_byte, die ich aus der Wiki habe. Die Abfrage des SRF02 habe ich im Moment auskommentiert, da ich damit weitere Fehlerquelle vermeiden möchte, und weitere Geräte am I2C-bus gibt es nicht.Code: [Ansicht]Declare Function Twi_read_byte(byval Slave As Byte) As Byte Declare Function Srf02_entfernung(byval Slaveid As Byte) As Integer $regfile = "M32def.dat" ' the used chip $crystal = 16000000 ' frequency used $framesize = 84 $swstack = 84 $hwstack = 84 $baud = 19200 ' baud rate Config Scl = Portc.0 Config Sda = Portc.1 I2cinit Const Srf02_slaveid = &HE0 Dim Entfernung_hi As Integer Dim Gegenstand_hi As Byte Dim Gegenstand_alle As Byte Dim Twi_control As Byte ' Controlregister lokale kopie Dim Twi_status As Byte Dim Twi_data As Byte Dim Eingang_slave_senoren As Byte Dim Eingang_slave_led As Byte Dim Error As Byte ' Fehlermerker ' TWI Init Twcr = &B00000100 ' erstmal nur TWI aktivieren Twsr = 0 ' Status und Prescaler Register Twbr = 72 ' Bit Rate Register, 100kHz 'Motoren: Config Servos = 2 , Servo1 = Portc.2 , Servo2 = Portc.3 , Reload = 5 Config Portc.2 = Output 'rechts Config Portc.3 = Output 'links Enable Interrupts Dim Servo_1 As Byte Dim Servo_2 As Byte '192 = Stopp '128 = Vollgas vor '255 = Vollgas rück 'Main ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Wait 2 Do 'Entfernung_hi = Srf02_entfernung(srf02_slaveid) 'If Entfernung_hi < 40 Then ' Gegenstand_hi = 4 ' Else ' Gegenstand_hi = 0 'End If Gegenstand_hi = 0 Eingang_slave_senoren = Twi_read_byte(&H40) Print Eingang_slave_senoren ; Gegenstand_alle = Eingang_slave_senoren + Gegenstand_hi Select Case Gegenstand_alle Case 0 : Gosub Vorm Case 1 : Gosub Rechtsm Case 2 : Gosub Linksm Case 3 : Gosub Rueckm Case 4 : Gosub Vorm Case 5 : Gosub Rechtsm Case 6 : Gosub Linksm Case 7 : Gosub Stopm End Select Waitms 100 Loop End 'Subs ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ '------------- Empfangen von Slave_sensoren @ &H40 ----------------------------- Function Twi_read_byte(slave As Byte) As Byte Error = 0 Twi_read_byte = 0 Twcr = &B10100100 Gosub Twi_wait_int If Twi_status = &H08 Or Twi_status = &H10 Then Twdr = Slave Or &H01 ' slave adresse + Read Twcr = &B10000100 ' TWINT löschen, Byte senden Gosub Twi_wait_int If Twi_status = &H40 Then Twcr = &B10000100 Gosub Twi_wait_int If Twi_status = &H58 Or Twi_status = &H50 Then Twi_read_byte = Twdr ' Daten lesen Error = 0 ' kein Fehler Else Error = Twi_status ' Fehler End If Else Error = Twi_status ' Fehler End If Twcr = &B10010100 Else Twcr = &B10000100 ' TWINT löschen, Bus freigeben Error = Twi_status ' Fehler End If End Function Twi_wait_int: Do Twi_control = Twcr And &H80 Loop Until Twi_control = &H80 Twi_status = Twsr And &HF8 Return '------------- SRF02 (hinten) -------------------------------------------------- Function Srf02_entfernung(byval Slaveid As Byte) As Integer Local Lob As Byte Local Hib As Byte Local Slaveid_read As Byte Slaveid_read = Slaveid + 1 I2cstart I2cwbyte Slaveid I2cwbyte 0 I2cwbyte 81 'in Zentimetern messen I2cstop I2cstart I2cwbyte Slaveid I2cwbyte 2 'Leseregister festlegen I2cstop I2cstart I2cwbyte Slaveid_read I2crbyte Hib , Ack I2crbyte Lob , Nack I2cstop Srf02_entfernung = Makeint(lob , Hib) End Function End '------------- Motorbefehle ---------------------------------------------------- Vorm: Servo(1) = 150 Servo(2) = 150 Return Linksm: Servo(1) = 225 Servo(2) = 158 Return Rechtsm: Servo(1) = 158 Servo(2) = 225 Return Stopm: Servo(1) = 192 Servo(2) = 192 Return Rueckm: Servo(1) = 230 Servo(2) = 230 Return
Kann mir jemand weiterhelfen, oder braucht ihr noch irgendwelche Infos?
Ich bin dankbar für jede Antwort, da ich das für den Robotiktreff in Braunschweig brauche!
jon