- 3D-Druck Einstieg und Tipps         
Ergebnis 1 bis 5 von 5

Thema: was klappt hier nich?!?

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    22.03.2004
    Ort
    37287 Wehretal
    Alter
    38
    Beiträge
    169

    was klappt hier nich?!?

    Anzeige

    LiFePo4 Akku selber bauen - Video
    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:

    Code:
      Do
        Call Fahrt
        Goto Messen
      Loop Until D < 50
    
        Call Bremsen
    D bekommt ich so:

    Code:
    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

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    22.05.2005
    Ort
    12°29´ O, 48°38´ N
    Beiträge
    2.731
    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.

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    22.03.2004
    Ort
    37287 Wehretal
    Alter
    38
    Beiträge
    169
    moin!
    So hier nochmal der ganze code
    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

  4. #4
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    22.03.2004
    Ort
    37287 Wehretal
    Alter
    38
    Beiträge
    169
    was mir auch helfen würde, wäre eine auflistung der basic befehle und wie ich sie einsetzte bzw. sie strukturiert sind...

    mfg

  5. #5
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    22.05.2005
    Ort
    12°29´ O, 48°38´ N
    Beiträge
    2.731
    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.

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad