- fchao-Sinus-Wechselrichter AliExpress         
Ergebnis 1 bis 8 von 8

Thema: Strings

  1. #1
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    24.09.2006
    Ort
    Nähe Mannheim
    Beiträge
    269

    Strings

    Anzeige

    Powerstation Test
    Hi
    Ich bin gerade dabei einen 4 Beinigen Roboter das Laufen beizubringen.
    Kann man sich vorstellen wie eine Schachtel mit 8 Servos drunter ;P.
    Ansteuern tu ich diese mit einer Software PWM.
    Mein verwendeter Chip ist der Atmega 8535 und wird Programmiert in Bascom.

    Die Servo positionen habe ich über eine Art Mischpult rausbekommen (8 Potis). Dabei kommt eine Tabelle raus die so aussieht:


    97 63 91 88 64 118 76 84
    98 63 91 125 65 118 76 84
    97 63 91 125 64 118 76 50
    97 63 92 56 59 113 71 47
    ...
    Jede Zahl ist die Gradzahl eines Servos.

    Da es mir einfach zuviel auswand ist jeden schritt in so eine Tabelle zu übertragen würde ich gerne die oben genannten schritte in Strings abspeichern.

    Tabhilfe = 1
    Warz(tabhilfe) = 2 '(Wartezeit bis ausgeführung in Nx 20mS)
    Servo_tab_1(tabhilfe) = 105
    Servo_tab_2(tabhilfe) = 65
    Servo_tab_3(tabhilfe) = 110
    Servo_tab_4(tabhilfe) = 90
    Servo_tab_5(tabhilfe) = 75
    Servo_tab_6(tabhilfe) = 105
    Servo_tab_7(tabhilfe) = 70
    Servo_tab_8(tabhilfe) = 80

    Das allein braucht 2% des Speichers,....

    Meine Frage dazu ist wie zerlege ich einen String in 8 kleinere Teile die minimal 1 und maximal 3 Ziffern haben können.

    Ich hatte mir überlegt das mit left bzw right zu realisieren sollte dann so aussehn:
    1. String wird in einen bearbeitungsstring kopiert
    2. es wird per "var = INSTR( start , string , substr )" geschaut wo ein leerzeichen steht.
    3. die stelle wird gespeichert und kopiert per "var = Left(var1 , n )"
    alles bis zu der stelle wo das Leerzeichen ist.
    4. rauskopierter String wird per "var = Val( s )" in eine Zahl umgewandelt und in ein Byte gespeichert (geht nicht über 180° hinaus ^^)
    5. lösche die ersten x Stellen bis zum leerzeichen und lösche dieses mit "var = LTRIM( org )". (falls nötig)
    6. zähle die Ziffern des Bearbeitungsstrings mit "var = LEN( string )"
    7. wiederhole das Ganze bis der Bearbeitungsstring keine Ziffern mehr enthält.

    Müsste so in etwa funktionieren.
    Aber das muss doch irgentwie einfacher gehn -_- und vorallem wie lösche ich Teile eines Strings ???


    mfg

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    22.05.2005
    Ort
    12°29´ O, 48°38´ N
    Beiträge
    2.731
    Du könntest in der Hilfe bei Dim schauen, da gibts die Option Overlay, damit kann man eine 2. Variable über eine schon bestehende legen.
    Man legt also die Stringvariable an, danach ein ByteArray an der gleichen Stelle, und kann so über das Bytearray auf die gewünschte Position des Strings zugreifen.

  3. #3
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    24.09.2006
    Ort
    Nähe Mannheim
    Beiträge
    269
    Dim S As String * 15 , Z As String * 15
    S = "ABCDEFG"
    Z = Mid(s , 2 , 3)
    Print Z 'BCD
    Z = "12345"
    Mid(s , 2 , 2) = Z
    Print S 'A12DEFG
    End
    Meinst du das ? hab gehofft da gibts was anderes

  4. #4
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    22.05.2005
    Ort
    12°29´ O, 48°38´ N
    Beiträge
    2.731
    Hmm, da kommt aber nirgends was mit Overlay drin vor:

    Code:
    Dim S As String * 16
    Dim B(16) As Byte At S Overlay
    Dann kann man mit B(1) auf das erste Zeichen von S zufgreifen.
    Man hat dann eine Zahl, die dem ASCII Code des Zeichens an dieser Stelle entspricht. Eine 0 entspricht dem Textende des Strings.

  5. #5
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Ich denk', man könnte noch besser helfen, wenn du sagst, wie du dann beim Ablauf diese Tabelle verwendest, also welche Speicherform am günstigsten wäre.
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  6. #6
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    19.07.2007
    Alter
    59
    Beiträge
    1.080
    Generell würde ich von der Verwendung von Strings, insbesondere funktionen wie str() und val() abraten, da sie einiges an speicher kosten und nicht grade schnell sind.
    Ansonsten stimme ich PicNick absolut zu - es wäre gut zu wissen, wann wie wo welche Daten der Tabelle benutzt werden.

    Wenn die 8 Werte jeweils für eine bestimmte Beinhaltung deines Bots stehen, wie sollen die Übergänge der einzelnen Haltungen vonstatten gehen?
    Wenn man nur zwischen dieses Positionen hin- und herschaltet, ähnelt der Bot in seinen Bewegungsabläufen recht schnell Pinoccio auf Ecstasy.

    Da kommt man in Bascom mit einem 8535 recht schnell an die Grenzen.

    Aber die Idee mit 4 Beinen und 8 Servos ist schon interessant! Bin gespannt auf Bilder & Videos!

    Gruß MeckPommER
    Mein Hexapod im Detail auf www.vreal.de

  7. #7
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Pinoccio auf Ecstasy.
    *rofl*
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  8. #8
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    24.09.2006
    Ort
    Nähe Mannheim
    Beiträge
    269
    Danke für die antworten.
    Wie erwähnt müssten diese Werte aus Strings in so eine Tabelle übertragen werden.
    Servo_tab_1(tabhilfe) = 105
    Servo_tab_2(tabhilfe) = 65
    Servo_tab_3(tabhilfe) = 110
    Servo_tab_4(tabhilfe) = 90
    Servo_tab_5(tabhilfe) = 75
    Servo_tab_6(tabhilfe) = 105
    Servo_tab_7(tabhilfe) = 70
    Servo_tab_8(tabhilfe) = 80

    bedeutet: es reicht vollkommen aus wenn die einzelnen zahlen in Bytes abgelegt werden und somit übertragen.
    Imer ein Zyklus (20ms) vor dem eigentlichen übertragen soll der String zerlegt werden. Wobei ich glaub das es eh auf ne halbe mS nicht ankommt.

    Zu den Befehlen:
    Gut das die so langsam sind ist mir rellativ neu aber sie müssen ja nur einmal alle 18mS benutzt werden.
    Was zwar langsam klingt aber es reicht vollkommen aus um flüssige bewegungen hervorzubringen.
    Gtu die Servos kosten 5€ da kann man eh nicht sooo viel erwarten *grinz*

    Ich denk ma mit dem
    Dim S As String * 16
    Dim B(16) As Byte At S Overlay
    könnte ich schon was anfangen ;P schau ma mal werd mich nochma ranhocken

    mfg

Berechtigungen

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

Labornetzteil AliExpress