PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : meine Servo-ansteuerung ist zu groß für die Demo. mist!



gttoxiclt2
10.03.2008, 08:25
Hi.

Kann mir jemand bei einer Programm-verkürzung helfen?

In meinem Programm fahren 2 Servos gleichzeitig eine Strecke ab. die sieht so aus:

einmal hin:



If Pind.6 = 1 And Pind.7 = 0 And Pind.4 = 1 Then 'Monitor ist in Mitte & Relais1 eingeschalten
Enable Timer0 'Servos anschalten
Servo(1) = 48 'Servos schrittweise bis zum Endpunkt fahren
Servo(2) = 152
Waitms 20
Servo(1) = 49
Servo(2) = 151
Waitms 20
Servo(1) = 50
Servo(2) = 150
...
...
...
Servo(1) = 122 'erster Endpunkt (weiter geht nicht, wg Kante)
Servo(2) = 78
Waitms 20
Disable Timer0
End If



und wieder zurück:



If Pind.6 = 1 And Pind.7 = 1 And Pind.3 = 1 Then 'Monitor zurück nach Mitte gefahren und noch unten
Enable Timer0 'Servos anschalten
Servo(1) = 122
Servo(2) = 78
Waitms 20
Servo(1) = 121
Servo(2) = 79
Waitms 20
Servo(1) = 120
Servo(2) = 80
Waitms 20
...
...
...
...
Servo(1) = 49
Servo(2) = 151
Waitms 20
Servo(1) = 48
Servo(2) = 152
Waitms 20
Disable Timer0
End If



Diese dämliche Ansteuerung habe ich deshalb so geschrieben, weil die Servos in einer bestimmten Geschwindigkeit fahren sollen. Und wenn ich die Sprünge zu groß wähle, dann läufts abgehakt.
Einziger Nachteil: Dieses Programm kommt locker auf 560 Zeilen und damit über das Ende der Demo.

Hab mir schon die möglichen Servoansteuerungen angeschaut in der Hilfe.
Der Befehl hier würde mir gefallen und wäre evtl. genau richtig für mich:

Do

For I = 0 To 100

Servo(1) = I

Waitms 1000

Next


Allerdings, wo pack ich da meinen 2ten Servo hin? Der müßte dann ja von 100 to 0 fahren!
Geht das und wie?

Rofo88
10.03.2008, 08:33
z = 100 - I
Servo(2)=z

Bluesmash
10.03.2008, 08:55
oder z.B. so (ist flexibler):



dim Servo1 as byte
dim servo2 as byte

servo1 = 48
servo2 = 152

for i = 0 to 30
servo(1) = servo1
servo(2) = servo2
incr servo1
decr servo2
waitms 20
next



eventuell kann man auch gleich die servo(*) Variabeln erhöhen/erniedrigen und die hilfsvariablen servo* weglassen... bin mir da nicht ganz sicher...

gruss bluesmash

gttoxiclt2
10.03.2008, 08:58
mmh-
so geht etwas. aber ich hab kein Plan, was ich grad mache 8-[

die "z = 100 - I" hab ich vors Programm gepackt, ne dim z as byte dazu und im Programm stehts jetzt so:

' If Pind.6 = 1 And Pind.7 = 1 And Pind.3 = 1 Then
For I = 0 To 100
Servo(1) = I
Servo(2) = Z
Waitms 1000
Next
' End If

Wie gesagt, es geht was, nur was? Ich hab da bestimmt was völlig falsch geschrieben? Und die Zeit lässt sich mit waitms 1000 auch nicht wirklich beeinflussen.
Und das if then musste ich auch ausklammern, weils mit dem gar nicht ging.

n kleines Beispiel wäre cool O:)

python_rocks
10.03.2008, 09:03
Servo(1) = 48 'Servos schrittweise bis zum Endpunkt fahren
Servo(2) = 152
Waitms 20
Servo(1) = 49
Servo(2) = 151
Waitms 20
Servo(1) = 50
Servo(2) = 150
...
Hallo toxic!

Du könntest die FOR-Schleife verwenden um wiederkehrende Aktionen durchzuführen:

ungetestet:

dim schritt as byte
dim startwert(2) as byte
dim tmp as byte

startwert(1) = 48
startwert(2) = 152

for schritt = 0 to 10
tmp = startwert(1) + schritt
servo(1) = tmp
tmp = startwert(2) - schritt
servo(2) = tmp
next schritt
mfg
Gerold
:-)

PS:
Was ist los?
Sind wir alle gleichzeitig beim Antworten? :-)

.

gttoxiclt2
10.03.2008, 09:52
PS:
Was ist los?
Sind wir alle gleichzeitig beim Antworten? :-)

.

Ha [-o<

danke euch, ich werde die genannten Beispiele alle durchtesten. Super, die Hilfestellungen hier :-)

gttoxiclt2
10.03.2008, 10:33
coole Sache :-)

Hab es hinbekommen mit dem Code von Bluesmash. Danke euch nochmal!
Für das hoch und runter brauchte ich nur den incr und decr Befehl tauschen.
Das ganze WE gesucht, wie man die Variable einfach um eins hoch bzw. runter rechnen lassen kann.
Nix gefunden und dann schritt für schritt geschrieben, jetzt kann ich die knapp 450 Zeilen wieder löschen :-&
Macht aber nix, denn so ists bei weitem übersichtlicher.

Danke euch!

stefan_Z
15.03.2008, 15:42
Oder du trennst die Schrittfolgen vom eigentlichen Code und legst die im EEP ab. Da hast du dann auch keine Größenbeschränkung - oder generierst die Folgend direkt mit einem externen Programm und flashst sie dann nur nach.

Im Prinzip ließt das Listing dann nur noch sequenziell das EEPROM aus und stellt die Servos. Mit externem EEPROM über I2C hast du dann auch ewig Platz für Schrittfolgen.