PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Servo ansteuern



sp33dy
18.05.2010, 15:15
Hallo,
ich habe rn1.4 und sd 21. Die Servos ansteuern ist kein Problem. Da das ganze auf ein Faller-Car-System zur Steuerung kommen soll - wenn es mal fertig ist, werden ca 40 servos (2x sd21) in Betrieb sein zur Steuerung der Weichen und Magnete.
Das Problem: Das Programm muss jedesmal mit einer "wait oder waitms-Anweisung" so lange angehalten werden, bis das Servo seine Zielstellung erreicht hat. Während dieser Zeit sind die ebenfalls ca 40 Reedkontakte ohne Überwachung, was dann zu Fehlschaltungen führt.
Gibt es eine Möglichkeit, dass das Programm weiterläuft und das Servo "nebenbei" seine Position anfährt? Von der Lösung würde das ganze Projekt abhängen.
Danke im Voraus
mfg
bernhard

wkrug
18.05.2010, 16:23
Das Programm muss jedesmal mit einer "wait oder waitms-Anweisung" so lange angehalten werden, bis das Servo seine Zielstellung erreicht hat.
Wozu das denn ?
Wenn es wirklich nicht anders geht, könntest Du einen Controller mit PIN Change Interrupts verwenden und an die entsprechenden Eingänge deine Reed Kontakte hängen.

Anderer Vorschlag:
Normalerweise sollte es aber reichen, wenn Du einen Timer mitlaufen lässt, der in seinen Overflow Interrupts ein Register hochzählt.
Ist dann die gewünschte Zeit vergangen ( Das Register hat den gewünschten Zählerstand erreicht ) , kann man im Hauptprogramm in eine neue Subroutine gehen oder sonstwas machen.

Während der Timer läuft wird aber die Programm Hauptschleife trotzdem ständig durchlaufen.

sp33dy
18.05.2010, 16:50
Danke,
das mit dem Timer hört sich gut an, geht aber über meinen Wissensstand hinaus. Gibt's irgendwo ein kleines Beispiel, das ich mir "zurechtbiegen" kann?
mfg
bernhard

wkrug
18.05.2010, 19:44
Gück einfach mal in ein BASCOM Tutorial in der Rubrik Interrupts.

Das was Du brauchst ist ein "Timer Overflow Interrupt".
Der Timer wird initialisiert und die Interrupts freigegeben.
Nachdem der Timer seinen maximalen Zählerstand überschritten hat wird dann der Timer Overflow Interrupt ausgelöst.

In dieser Interruptroutine wird dann einfach eine Variable hochgezählt.
Du kannst auch noch eine Bedingung reinmachen, ob das Servo gerade am laufen ist oder nicht.

Im Hauptprogramm wird bei einem Servostart diese Variable auf 0 gesetzt und dann im Hauptprogramm immer wieder abgefragt.

Ist der gewünschte Wert der Variable erreicht oder überschritten ist die gewälte Zeit erreicht.

Ich kann Dir leider keinen fertigen Code für so was liefern, weil ich in "C" progge.

sp33dy
18.05.2010, 19:57
Danke,
habe auch schon im Bascom-Tutorial gestöbert - so komme ich weiter...
mfg
bernhard