- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Seite 1 von 3 123 LetzteLetzte
Ergebnis 1 bis 10 von 25

Thema: For-Next-Schleife läuft nicht so wie gewollt :(

  1. #1
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    22.02.2005
    Beiträge
    385

    For-Next-Schleife läuft nicht so wie gewollt :(

    Anzeige

    LiFePo4 Akku selber bauen - Video
    Hi,
    ich habe meinen Roboterarm jetzt schon fast fertig aufgebaut. Es fehlt nur noch der Greifer. Ich wollte jetzt ein bischen mit der Positionierung herumexperimentieren und bin auf ein sicherlich sehr einfach zu lösendes Problem gestoßen, nur komm ich nicht drauf.
    Hier mal der Code:

    Code:
    $crystal = 8000000
    $baud = 9600
    
    Declare Sub Shoulder_move(byval Shoulder_goto_pos As Byte)                                        
    
    Dim Shoulder_curr_pos As Byte
    Shoulder_curr_pos = 127
    
    Hauptschleife:
       Wait 2
       Call Shoulder_move(255)
    Goto Hauptschleife
    
    
    
    Sub Shoulder_move(byval Shoulder_goto_pos As Byte)
       Local Schritt As Integer
    
       If Shoulder_curr_pos < Shoulder_goto_pos Then
          Schritt = 1
       Elseif Shoulder_curr_pos > Shoulder_goto_pos Then
          Schritt = -1
       End If
    
       Open "comd.7:9600,8,n,1" For Output As #2
       For Shoulder_curr_pos = Shoulder_curr_pos To Shoulder_goto_pos Step Schritt
          Print #2 , "#s" ; Chr(1) ; Chr(shoulder_curr_pos)
          Print #2 , "#s" ; Chr(2) ; Chr(shoulder_curr_pos)
          Waitms 30
          Print " SCHRITT: " ; Schritt ; "  CURR_POS: " ; Shoulder_curr_pos ; "   GOTO_POS: " ; Shoulder_goto_pos
       Next Shoulder_curr_pos
       Close #2
    
       Shoulder_curr_pos = Shoulder_goto_pos
    
    End Sub
    
    End
    Der kommt gar nicht aus der For-Schleife raus. Die Variable Shoulder_curr_pos geht immer auf 255 und springt dann auf 0. Damit bewegt er sich plötzlich auch 0 und dann gehts wieder weiter zu 255, usw.
    Habs mit 255 und 0 für Shoulder_goto_pos probiert. In beiden Fällen passiert das gleiche. An der Variable Schritt liegts nicht. Die ist immer richtig.
    Oh man, das ist bestimmt total einfach und ich checks wieder nicht. Naja hoffentlich eine von euch.
    mfg
    jagdfalke[/code]

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    29.01.2004
    Beiträge
    2.441
    Wenn du dir dein Programm mal in den Bascom-Simulator läst und laufen lässt, wirst du sehen, dass deine Variable "Shoulder_curr_pos" kurz überläuft, dadurch auf 0 zurückspringt und die For-Schleife von vorne losgeht.

    Wenn du "Shoulder_curr_pos" als Word anstatt als Byte deklarierst bleibt die For-Schleife bei 255 hängen.

    Woher hast du die Syntax für deine For-Schleife?
    For Shoulder_curr_pos = Shoulder_curr_pos To Shoulder_goto_pos Step Schritt

    For Shoulder_curr_pos = Shoulder_curr_pos macht irgendwie wenig Sinn, da die Bedingung immer erfüllt ist.

  3. #3
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    For Shoulder_curr_pos = Shoulder_curr_pos macht irgendwie wenig Sinn, da die Bedingung immer erfüllt ist.
    Um diese Uhrzeit muß man aufpassen, da schreibt man manches Unüberlegtes. Was du bemäkelst ist ja nicht die Bedingung, sondern der Anfangswert.
    Bedingung ist "TO"


    @Jadfalke: du bringst den Bascom ins Schleudern mit den Vorzeichen und Umwandlungen.
    Du mußt .._curr_pos und .. goto_pos auch als integer definieren
    Die For Schleife ist sonst genau richtig.
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  4. #4
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    29.01.2004
    Beiträge
    2.441
    Um diese Uhrzeit muß man aufpassen, da schreibt man manches Unüberlegtes.
    Stimmt In dem Fall waren es aber mehr Probleme auszudrücken was ich meine.

    Mir kommt es etwas seltsam vor die Variable die hochgezählt wird gleich dem Anfangswert zu setzen und den Anfangswert bei jedem Schleifendurchlauf hochzuzählen.
    Mag ja sein, dass es funktioniert, aber übersichtlicher macht das die Geschichte irgendwie nicht.

  5. #5
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    22.02.2005
    Beiträge
    385
    Hi Jungs,
    ich hab die Variablentypen angeglichen und jetzt läufts. Nur leider erschien ein neues Problem:

    Code:
    $crystal = 8000000
    $baud = 9600
    
    Declare Sub Servo_move(byval Servo As Integer , Byval Servo_goto_pos As Integer)
    
    $crystal = 8000000                                          'Quarzfrequenz
    
    Dim Shoulder_curr_pos As Integer
    Shoulder_curr_pos = 127
    
    Dim Elbow_curr_pos As Integer
    Elbow_curr_pos = 127
    
    Hauptschleife:
       Wait 2
       Call Servo_move(1 , 255)
       Wait 2
       Call Servo_move(1 , 0)
    Goto Hauptschleife
    
    
    
    Sub Servo_move(byval Servo As Integer , Byval Servo_goto_pos As Integer)
       Local Schritt As Integer
    
       If Servo = 0 Then                                        'Schulter bewegen
    
          If Shoulder_curr_pos < Servo_goto_pos Then
             Schritt = 1
          Elseif Shoulder_curr_pos > Servo_goto_pos Then
             Schritt = -1
          Elseif Shoulder_curr_pos = Servo_goto_pos Then
             Exit Sub
          End If
    
          Open "comd.7:9600,8,n,1" For Output As #2
          For Shoulder_curr_pos = Shoulder_curr_pos To Servo_goto_pos Step Schritt
             Print #2 , "#s" ; Chr(1) ; Chr(shoulder_curr_pos)
             Print #2 , "#s" ; Chr(2) ; Chr(shoulder_curr_pos)
          Next Shoulder_curr_pos
          Close #2
    
          Shoulder_curr_pos = Servo_goto_pos
       End If
    
       If Servo = 1 Then                                        'Ellbogen bewegen
    
          If Elbow_curr_pos < Servo_goto_pos Then
             Schritt = 1
          Elseif Elbow_curr_pos > Servo_goto_pos Then
             Schritt = -1
          Elseif Elbow_curr_pos = Servo_goto_pos Then
             Exit Sub
          End If
    
          Open "comd.7:9600,8,n,1" For Output As #2
          For Elbow_curr_pos = Elbow_curr_pos To Servo_goto_pos Step Schritt
             Print #2 , "#s" ; Chr(3) ; Chr(elbow_curr_pos)
             Print "CURR: " ; Elbow_curr_pos ; "  GOTO: " ; Servo_goto_pos
          Next Elbow_curr_pos
          Close #2
    
          Elbow_curr_pos = Servo_goto_pos
    
       End If
    
    End Sub
    
    End

    Der Code für Servo = 1 ist eigenlich 1:1 kopiert aus dem Servo=0-Teil aber er funktionert nicht. Ich hab per Terminal überprüft ob er wirklich in die For-Schleife rein geht und er tut es. Elbow_curr_pos wird vergrößert, definitiv. Anscheinend passiert dann bei
    Print #2 , "#s" ; Chr(3) ; Chr(elbow_curr_pos)
    gar nichts. Ich hab den Servo 100%ig am 3. Servoanschluss angeschlossen !!! Das komische ist, wenn ich das hier
    Code:
          Open "comd.7:9600,8,n,1" For Output As #2
          For I = 127 To 255 Step 1
             Print #2 , "#s" ; Chr(3) ; Chr(i)
          Next I
          Close #2
    direkt in die Haupschleife einbaue, dann bewegt er sich wie er soll. Ich bin ratlos.

    EDIT: "funktioniert nicht" bedeutet er bewegt sich keinen Millimeter.

    mfg
    jagdfalke [/shadow]

  6. #6
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    sehe ich direkt keinen Fehler:
    Aber falls ihn das chr(xx) von einem Integer stören sollte, probier das mal, um zu sehen
    Code:
    Dim Temp As byte
    ....
    ....
          Open "comd.7:9600,8,n,1" For Output As #2 
        For Shoulder_curr_pos = Shoulder_curr_pos To Servo_goto_pos Step Schritt 
             TEMP = shoulder_curr_pos
             Print #2 , "#s" ; Chr(1) ; Chr(TEMP)
    Der Bascom hat's nicht so mit verdeckten Typenänderungen
    Is'n Versuch, du kannst für alle Servos das gleiche TEMP nehmen.
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  7. #7
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    22.02.2005
    Beiträge
    385
    Aber komischerweise funktionierts ja auch mit Servo = 0 also der Schulter vom Arm. Hab Temp mal eingeführt und es so gemacht wie oben. Geht aber immernoch nicht. Die Ausgaben für Temp, Goto_pos und Schritt im passen alle (überprüft im Terminal).

    Wenn ich aber dern Servo 3 in der schleife von Servo = 0 laufen lass, dann geht er einwandfrei. Ich werd nicht schlau daraus.

  8. #8
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    mmmm.

    Ganz was blödes: Wie schaut's mit den Größen von Soft-Stack und Frame aus ?
    Ich verwend HW 128 /SW 256 /Fram 32
    Auch da kann er spinnen

    so , bis morgen !
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  9. #9
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    22.02.2005
    Beiträge
    385
    was zu geier bedeutet das?
    HW 128 /SW 256 /Fram 32

  10. #10
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    29.01.2004
    Beiträge
    2.441
    was zu geier bedeutet das?
    Zitat:
    HW 128 /SW 256 /Fram 32
    Das sind Einstellungen, wie der Bascom-Compiler die internen Resourcen des Controllers nutzt (oder so ähnlich)
    Guck in Bascom mal durch die Menüs, dann findest du Dialoge, in denen du das Vorgeben kannst. Vermutlich kann man es auch im Quellcode angeben.

Seite 1 von 3 123 LetzteLetzte

Berechtigungen

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

fchao-Sinus-Wechselrichter AliExpress