PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : srf02 Programmierung



Beule
21.01.2008, 18:19
Und zwar hab ich den sfr02 über i2c angeschlossen und lesen die entfernung aus. nun möchte ich die ausgelesenen daten auswerten

dafür hab ich mir folgende select case anweisung geschrieben

Do

Select Case Entfernung


Case 200 To 150 : Sound Portb.2 , 200 , 300

Case 150 To 100 : Sound Portb.2 , 200 , 400

Case 100 To 50 : Sound Portb.2 , 200 , 500

Case 50 To 10 : Sound Portb.2 , 200 , 600

End Select
Wait 1

Loop

aber irgendwie klappt das nicht, hat jemand da ne idee?

Dirk
21.01.2008, 19:06
1. Das ist nur ein Teil deines Codes. Wie soll man da wissen, was nicht klappt?
2. Was klappt denn "irgendwie" nicht?

Gruß Dirk

Jon
21.01.2008, 20:02
Ich würde jetzt mal so ins Blaue tippen, dass du unter den Tönen keinen wirklichen Unterschied hörst?
Wie wäre es denn dann, wenn du die Unterschiede größer machst? So sind die Töne relativ gleich.

eine genauere Beschreibung deines Problems wäre hilfreich!

jon

Beule
21.01.2008, 20:28
Nein es ist mehr so dass ich gar keine töne höre



Declare Function Srf02_firmware(byval Slaveid As Byte) As Byte
Declare Function Srf02_entfernung(byval Slaveid As Byte) As Integer


$regfile = "m32def.dat"
$framesize = 42
$swstack = 42
$hwstack = 42

$crystal = 16000000 'Quarzfrequenz
$baud = 9600
Config Portb.2 = Output
'Portb.2 = 1
Config Scl = Portc.0 'Ports fuer IIC-Bus
Config Sda = Portc.1


Const Srf02_slaveid = &HE0 'Standard I2C Adresse von SRF02

Dim Entfernung As Integer
Dim V As Byte




Wait 3 'Warte 3 Sekunden
I2cinit

V = 1
Do

Select Case Entfernung


Case 200 To 150 : Sound Portb.2 , 200 , 300

Case 150 To 100 : Sound Portb.2 , 200 , 400

Case 100 To 50 : Sound Portb.2 , 200 , 500

Case 50 To 10 : Sound Portb.2 , 200 , 600

End Select
Wait 1
Loop


End
'------------- Hilfsfunktionen für SRF02 ----------
Function Srf02_firmware(byval Slaveid As Byte) As Byte
Local Firmware As Byte
Local Slaveid_read As Byte
slaveid_read = Slaveid + 1
I2cstart
I2cwbyte Slaveid
I2cwbyte 0 'Leseregister festlegen
I2cstop
I2cstart
I2cwbyte Slaveid_read
I2crbyte Firmware , Nack
I2cstop
Srf02_firmware = Firmware
End Function

Function Srf02_entfernung(byval Slaveid As Byte) As Integer
Local Lob As Byte
Local Hib As Byte
Local Firmware As Byte
Local Temp As Byte
Local Slaveid_read As Byte

slaveid_read = Slaveid + 1

'Messvorgang in starten
I2cstart
I2cwbyte Slaveid
I2cwbyte 0
I2cwbyte 81 'in Zentimetern messen
I2cstop

Warteaufmessung:
Waitms 1
Firmware = Srf02_firmware(slaveid)
If Firmware = 255 Then Goto Warteaufmessung

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


Ich benutze zum größten teil das srf02 beispiel
und mit if und einer entfernung geht das aber nicht im case

und wenn ich


select case entfernung
case etfernung <=100: Sound usw..
mache bekomme ich nur fehler meldungen

Jon
21.01.2008, 20:35
Tipp:
BASCOM hat eine Hilfe, die man mit F1 schnell öffnen kann. Wenn man dort Case in die Suche eingibt, findet man unter Anderem das Programm

$regfile = "m48def.dat" ' specify the used micro

$crystal = 4000000 ' used crystal frequency

$baud = 19200 ' use baud rate

$hwstack = 32 ' default use 32 for the hardware stack

$swstack = 10 ' default use 10 for the SW stack

$framesize = 40 ' default use 40 for the frame space







Dim I As Byte 'dim variable

Dim S As String * 5 , Z As String * 5




Do




Input "Enter value (0-255) " , I

Select Case I

Case 1 : Print "1"

Case 2 : Print "2"

Case 3 To 5 : Print "3-5"

Case Is >= 10 : Print ">= 10"

Case Else : Print "Not in Case statement"

End Select

Loop

End




'note that a Boolean expression like > 3 must be preceded

'by the IS keyword

Mehr muss ich dazu eigentlich nicht sagen, steht alles da.

jon

radbruch
21.01.2008, 20:47
Hallo


und mit if und einer entfernung geht das aber nicht im case
Echt? Das kann ich irgendwie nicht glauben, denn es fehlt etwas in der Art: "Entfernung=Srf02_entfernung(Srf02_slaveid)" oder "Select Case Srf02_entfernung(Srf02_slaveid)"

Oder braucht man das in Bascom nicht?

Gruß

mic

Jon
21.01.2008, 21:01
Da du es sagst, fällt es mir auch auf. Es fehlt die Zeile "Entfernung=Srf02_entfernung(Srf02_slaveid)" vor der "Select case Entfernung".

Natürlich braucht man die in BASCOM.

jon

sechsrad
22.01.2008, 09:13
irgendwie stimmt dein code nicht, nimm diesen mal und bring deine case rein und deine atmegaanpassungen.



Declare Function Srf02_firmware(byval Slaveid As Byte) As Byte
Declare Function Srf02_entfernung(byval Slaveid As Byte) As Integer


$regfile = "m32def.dat"
$framesize = 42
$swstack = 42
$hwstack = 42

$crystal = 8000000 'Quarzfrequenz
$baud = 19200

Config Scl = Portc.0 'Ports fuer IIC-Bus
Config Sda = Portc.1


Const Srf02_slaveid = &HE0 'Standard I2C Adresse von SRF02

Dim Entfernung As Integer
Dim V As Byte

Wait 1
I2cinit
Print "SRF02 Ultraschall-Firmware Version:" ; Srf02_firmware(srf02_slaveid)

Do
Entfernung = Srf02_entfernung(srf02_slaveid)
Print "Entfernung:" ; Entfernung ; "cm"
Wait 1
Loop


End


'------------- Hilfsfunktionen für SRF02 ----------


Function Srf02_firmware(byval Slaveid As Byte) As Byte
Local Firmware As Byte
Local Slaveid_read As Byte

Slaveid_read = Slaveid + 1

I2cstart
I2cwbyte Slaveid
I2cwbyte 0 'Leseregister festlegen
I2cstop

I2cstart
I2cwbyte Slaveid_read
I2crbyte Firmware , Nack
I2cstop

Srf02_firmware = Firmware
End Function



Function Srf02_entfernung(byval Slaveid As Byte) As Integer
Local Lob As Byte
Local Hib As Byte
Local Firmware As Byte
Local Temp As Byte
Local Slaveid_read As Byte

Slaveid_read = Slaveid + 1

'Messvorgang in starten
I2cstart
I2cwbyte Slaveid
I2cwbyte 0
I2cwbyte 81 'in Zentimetern messen
I2cstop


Waitms 65 'minimale Wartezeit für Messung bei SRF02

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