PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Strings



Feratu
25.03.2008, 21:58
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

linux_80
25.03.2008, 22:15
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.

Feratu
25.03.2008, 22:54
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

linux_80
26.03.2008, 00:07
Hmm, da kommt aber nirgends was mit Overlay drin vor:


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.

PicNick
26.03.2008, 10:06
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.

MeckPommER
26.03.2008, 11:03
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

PicNick
26.03.2008, 11:05
Pinoccio auf Ecstasy.

*rofl*

Feratu
26.03.2008, 20:12
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