tobimc
23.03.2005, 11:59
Hallo!
Ich teste gerade das SRF08-Modul für Suny.
Ich habe es am I²C angeschlossen; mit einem AtMega8 @ 16MHz.
Folgender Code, die I²C-Funktionen sind 1:1 aus dem AVR-Buch...
Auch die Überprüfung der Fehlercodes...
$crystal = 16000000
$regfile = "m8def.dat"
$baud = 9600
Config Portb = Output
Config Portd = Output
Twsr = &B00000000 'Bits1+0=00: TWI-Vorteilung 1
Twbr = &H0C 'IC2-Bitrate 400000Hz bei 16MHz
'BitRate=AvrClock/(16+2*TWBR*4^TwiPrescale)
Declare Function Twistart() As Byte
Declare Function TwiSend(ByVal DataByte As Byte) As Byte
Declare Function TwiReceive(ByRef DataByte As Byte) As Byte
Declare Sub TwiStop()
Dim I As Byte
Dim J As Byte
Enable Interrupts
Wait 1
Print "STARTING......."
If Twistart() <> &H08 Then
Print "ERROR!" ; " Occured by sending START CONDITION!"
End If
If Twisend(&He0) <> &H18 Then
Print "ERROR!" ; " Occured by sending ADDRESS!"
End If
If Twisend(0) <> &H18 Then
Print "ERROR!" ; " Occured by sending REGISTER-ADDRESS!"
End If
If Twisend(&H51) <> &H18 Then
Print "ERROR!" ; " Occured by sending ADDRESS!"
End If
Twistop
Print "SENT MEASURING-ORDER."
Waitms 250
End
Function TwiStart() As Byte
Twcr = &B10100100 'START-Signal erzeugen
Do : Loop Until Twcr.twint = 1 'Warten bis fertig
Twistart = Twsr And &B11111000 'Status-Code zurückgeben
End Function
'----------------------------------------------------------
Function TwiSend(ByVal DataByte As Byte) As Byte
Twdr = Databyte 'Byte ins Datenregister
Twcr = &B10000100 'TWI-Operation starten
Do : Loop Until Twcr.twint = 1 'Warten bis fertig
Twisend = Twsr And &B11111000 'Status-Code zurückgeben
End Function
'----------------------------------------------------------
Function TwiReceive(ByRef DataByte As Byte) As Byte
Twcr = &B10000100 'TWI-Operation starten
Do : Loop Until Twcr.twint = 1 'Warten bis fertig
Databyte = Twdr
Twireceive = Twsr And &B11111000 'Status-Code zurückgeben
End Function
'----------------------------------------------------------
Sub TwiStop()
Twcr = &B10010100 'STOP-Signal erzeugen
End Sub
Das sieht auch ganz gut aus; aber der erste Fehler kommt nach dem senden der Registeradresse, also 0.
Dann beim Senden des Befehls.
Das sind die Ausgaben des Terminalprogramms:
STARTING.......
ERROR! Occured by sending REGISTER-ADDRESS!
ERROR! Occured by sending ADDRESS!
SENT MEASURING-ORDER.
Ich weis jetzt nicht, aber die LED des SRF flackert ganz kurz auf, wenn ich das Programm laufen lasse...
...und im DS steht, dass das dann auftritt, wenn man eine Messung befiehlt...
Was läuft da falsch? das senden der Ragisterardesse, oder halte ich das Prtokoll nicht ein?!
Ist der erste Versuch...
Danke schonmal!
Ganz liebe Grüße,
Tobi
Ich teste gerade das SRF08-Modul für Suny.
Ich habe es am I²C angeschlossen; mit einem AtMega8 @ 16MHz.
Folgender Code, die I²C-Funktionen sind 1:1 aus dem AVR-Buch...
Auch die Überprüfung der Fehlercodes...
$crystal = 16000000
$regfile = "m8def.dat"
$baud = 9600
Config Portb = Output
Config Portd = Output
Twsr = &B00000000 'Bits1+0=00: TWI-Vorteilung 1
Twbr = &H0C 'IC2-Bitrate 400000Hz bei 16MHz
'BitRate=AvrClock/(16+2*TWBR*4^TwiPrescale)
Declare Function Twistart() As Byte
Declare Function TwiSend(ByVal DataByte As Byte) As Byte
Declare Function TwiReceive(ByRef DataByte As Byte) As Byte
Declare Sub TwiStop()
Dim I As Byte
Dim J As Byte
Enable Interrupts
Wait 1
Print "STARTING......."
If Twistart() <> &H08 Then
Print "ERROR!" ; " Occured by sending START CONDITION!"
End If
If Twisend(&He0) <> &H18 Then
Print "ERROR!" ; " Occured by sending ADDRESS!"
End If
If Twisend(0) <> &H18 Then
Print "ERROR!" ; " Occured by sending REGISTER-ADDRESS!"
End If
If Twisend(&H51) <> &H18 Then
Print "ERROR!" ; " Occured by sending ADDRESS!"
End If
Twistop
Print "SENT MEASURING-ORDER."
Waitms 250
End
Function TwiStart() As Byte
Twcr = &B10100100 'START-Signal erzeugen
Do : Loop Until Twcr.twint = 1 'Warten bis fertig
Twistart = Twsr And &B11111000 'Status-Code zurückgeben
End Function
'----------------------------------------------------------
Function TwiSend(ByVal DataByte As Byte) As Byte
Twdr = Databyte 'Byte ins Datenregister
Twcr = &B10000100 'TWI-Operation starten
Do : Loop Until Twcr.twint = 1 'Warten bis fertig
Twisend = Twsr And &B11111000 'Status-Code zurückgeben
End Function
'----------------------------------------------------------
Function TwiReceive(ByRef DataByte As Byte) As Byte
Twcr = &B10000100 'TWI-Operation starten
Do : Loop Until Twcr.twint = 1 'Warten bis fertig
Databyte = Twdr
Twireceive = Twsr And &B11111000 'Status-Code zurückgeben
End Function
'----------------------------------------------------------
Sub TwiStop()
Twcr = &B10010100 'STOP-Signal erzeugen
End Sub
Das sieht auch ganz gut aus; aber der erste Fehler kommt nach dem senden der Registeradresse, also 0.
Dann beim Senden des Befehls.
Das sind die Ausgaben des Terminalprogramms:
STARTING.......
ERROR! Occured by sending REGISTER-ADDRESS!
ERROR! Occured by sending ADDRESS!
SENT MEASURING-ORDER.
Ich weis jetzt nicht, aber die LED des SRF flackert ganz kurz auf, wenn ich das Programm laufen lasse...
...und im DS steht, dass das dann auftritt, wenn man eine Messung befiehlt...
Was läuft da falsch? das senden der Ragisterardesse, oder halte ich das Prtokoll nicht ein?!
Ist der erste Versuch...
Danke schonmal!
Ganz liebe Grüße,
Tobi