Jon
03.10.2007, 16:26
Hallo,
ich sitze jetzt schon seit heute morgen an diesem Problem ](*,) :
Ich habe diese Code:
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
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.
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
ich sitze jetzt schon seit heute morgen an diesem Problem ](*,) :
Ich habe diese Code:
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
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.
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