PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : was klappt hier nich?!?



[IN]Crusher
10.05.2006, 23:52
Moin moin!

schreibe grad ein Programm, dass mir die entfernung von nem srf08 ausliest und solang die entfernung > 50 is soll er fahren

ich hab mir das so gedacht:


Do
Call Fahrt
Goto Messen
Loop Until D < 50

Call Bremsen

D bekommt ich so:


D = Makeint(lsb , Msb)

ich denk ma, dass das problem darin liegt, dass ich meine cm angabe, die ich als word in D geschrieben bekomme in nen byte oder so umwandlen muss, oder?

oder is sonst irgendwas falsch?

MfG Jürchen

linux_80
11.05.2006, 01:02
Moin,

als erstes würde ich sagen das GOTO nicht der allerbeste weg ist, eine Funktion oder Subroutine aufzurufen, denn wie gehts denn von da aus wieder zurück in die Hauptschleife ?!

Versuches mal mit Gosub !

Besser wäre es allerdings noch, wenn wir den ganzen Code sehen könnten, vor allem was bei Messen sonst noch gemacht wird.

[IN]Crusher
11.05.2006, 06:40
moin!
So hier nochmal der ganze code


Declare Function Srf08_firmware(byval Sf08_adr_0 As Byte) As Byte
Declare Sub Anfahren()
Declare Sub Fahrt()
Declare Sub Bremsen()

$regfile = "m32def.dat"
$crystal = 16000000
$baud = 9600

Const Sf08_adr_0 = &HE0 ' I2C Adresse
Const Sf08_c_range = 100 ' Reichweite
Const Sf08_c_gain = 1 'Empfindlichkeit
Const Sf08_adr_0_read = &HE1

Dim I As Integer
Dim Infahrt As Bit
Config Scl = Portc.0 'Ports fuer IIC-Bus
Config Sda = Portc.1

'Ports für linken Motor
Config Pinc.6 = Output 'Linker Motor Kanal 1
Config Pinc.7 = Output 'Linker Motor Kanal 2
Config Pind.4 = Output 'Linker Motor PWM
'Ports für rechten Motor
Config Pinb.0 = Output 'Rechter Motor Kanal 1
Config Pinb.1 = Output 'Rechter Motor Kanal 2
Config Pind.5 = Output 'Rechter Motor PWM
Config Timer1 = Pwm , Pwm = 10 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down
Pwm1a = 0
Pwm1b = 0
Tccr1b = Tccr1b Or &H02 'Prescaler = 8


'################################################# ##############################
'################################################# ##############################
'## MAIN ##
'################################################# ##############################
'################################################# ##############################

I2cinit

'################################################# ##############################
'# Setzten des Range Wertes #
'################################################# ##############################

I2cstart
I2cwbyte Sf08_adr_0
I2cwbyte 2
I2cwbyte Sf08_c_range
I2cstop

'################################################# ##############################
'# Setzten des Gain Wertes #
'################################################# ##############################

I2cstart
I2cwbyte Sf08_adr_0
I2cwbyte 1
I2cwbyte Sf08_c_gain
I2cstop


Dim Lsb As Byte
Dim Msb As Byte
Dim Ival As Word
Dim D As Integer
Dim Firmware As Byte

'################################################# ##############################
'# Messung auslösen #
'################################################# ##############################
Messen:
Do

I2cstart
I2cwbyte Sf08_adr_0
I2cwbyte 0
I2cwbyte 81
Waitms 70

Warteaufmessung:
Waitms 1
Firmware = Srf08_firmware(&He0)
If Firmware = 255 Then Goto Warteaufmessung

'################################################# ##############################
'# Ergebnis abholen #
'################################################# ##############################

I2cstart
I2cwbyte Sf08_adr_0
I2cwbyte 2

I2cstart
I2cwbyte Sf08_adr_0_read
I2crbyte Msb , Ack
I2crbyte Lsb , Nack
I2cstop

Ival = Makeint(lsb , Msb)

'################################################# ##############################
'# Ergebnis anzeigen #
'################################################# ##############################

Print "Die Entfernung beträgt " ; Ival ; " Zentimeter."
Print "************************************************** *"
Waitms 100

'################################################# ##############################
'# Fahren #
'################################################# ##############################


Print "************************************************** *"
If Infahrt = 0 Then
Call Anfahren
Infahrt = 1
End If


Do
Call Fahrt
Print "und messen..."
Goto Messen
Loop Until Ival < 50

Call Bremsen
Wait 3

Loop

End

'################################################# ##############################
'################################################# ##############################
'## MAIN ENDE ##
'################################################# ##############################
'################################################# ##############################


Function Srf08_firmware(byval Sf08_adr_0 As Byte) As Byte

Local Sf08_adr_0_read As Byte

I2cstart
I2cwbyte Sf08_adr_0
I2cwbyte 0 'Leseregister festlegen
I2cstop

I2cstart
I2cwbyte &HE1
I2crbyte Firmware , Nack
I2cstop

Srf08_firmware = Firmware
End Function


Sub Anfahren()
'Linker Motor ein
Portc.6 = 1 'bestimmt Richtung
Portc.7 = 0 'bestimmt Richtung
Portd.4 = 1 'Linker Motor EIN
'Rechter Motor ein
Portb.0 = 1 'bestimmt Richtung rechter Motor
Portb.1 = 0 'bestimmt Richtung rechter Motor
Portd.5 = 1 'rechter Motor EIN

I = 0
Do
Pwm1a = I
Pwm1b = I
Waitms 40
I = I + 5
Loop Until I > 1023

End Sub

Sub Fahrt()
'Linker Motor ein
Portc.6 = 1 'bestimmt Richtung
Portc.7 = 0 'bestimmt Richtung
Portd.4 = 1 'Linker Motor EIN
'Rechter Motor ein
Portb.0 = 1 'bestimmt Richtung rechter Motor
Portb.1 = 0 'bestimmt Richtung rechter Motor
Portd.5 = 1 'rechter Motor EIN

I = 1023
Pwm1a = I
Pwm1b = I
End Sub

Sub Bremsen()
'Linker Motor ein
Portc.6 = 1 'bestimmt Richtung
Portc.7 = 0 'bestimmt Richtung
Portd.4 = 1 'Linker Motor EIN
'Rechter Motor ein
Portb.0 = 1 'bestimmt Richtung rechter Motor
Portb.1 = 0 'bestimmt Richtung rechter Motor
Portd.5 = 1 'rechter Motor EIN

I = 1023
Do
Pwm1a = I
Pwm1b = I
Waitms 40
I = I - 30
Loop Until I < 5

Pwm1a = 0
Pwm1b = 0

End Sub

ich hab dieses 'und messen...' nur mal in die schleife reingemacht um zu kontrollieren, ob er aus der 'Fahren-Sub' rausgeht...
das macht er soweit...
also muss das problem wirklich an dem vergleich liegen...
so dass er eben nicht erkennt wenn die entfernung kleiner 50 ist ( ival<50)

mfg

Jürchen

[IN]Crusher
11.05.2006, 19:24
was mir auch helfen würde, wäre eine auflistung der basic befehle und wie ich sie einsetzte bzw. sie strukturiert sind...

mfg

linux_80
11.05.2006, 19:33
Hallo,
Die Basic-befehle sind in der Bascomhilfe alle drin, incl. Beispiele.
Einfach mal F1 drücken.

Dann zu dem Goto, da springst du aus der inneren Schleife ganz nach aussen, denn das Label Messen steht auch noch ausserhalb des ersten Do !
Du solltest da auch irgendwie eine Subroutine oder Function bauen, bei der nur der Wert zurückgegeben wird, nicht so kompliziert wie jetzt.