PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Großes Problem mit Servo-Ansteuerung



PhilippW
14.12.2006, 13:44
Hallo!

Ich steh momentan vor einem Problem, dass ich mir selbst nicht erklären kann:
Servo-Ansteuerung unter Bascom ist ja recht leicht und wurde hier ja auch schon mehrfach besprochen...
Mein Anliegen ist jedoch, dass der Controller (AtMega8) solange Befehle ausführen soll, bis er über die serielle Schnittstelle eine "1" empfängt... Soweit auch kein Problem...
Nachdem er diese Zahl empfangen hat, soll er einen Servo in Einzelschritten drehen. Auch das hat bereits in einem anderen Projekt bestens funktioniert!
Nur wenn ich alles zusammen pack, also die Schnittstellen- mit der Servogeschichte, versagt die Drehung jämmerlich... :-(
Ich habe versucht, dem ganzen auf den Grund zu gehen und am Programmanfang und nach dem Schleifendurchlauf eine vollständige Drehung nach links, sowie am Programmende eine Drehung nach rechts eingeleitet... Das funktioniert auch bestens!
Nur in der FOR-Schleife tut sich mit dem Servo rein gar nichts...

Hier der Code:


$regfile = "m8def.dat"
$crystal = 4000000
$baud = 9600

Dim Servopos As Integer
Dim L As Integer
Dim R As Integer
Dim S As Integer
Dim Inpt As String * 1

Config Servos = 1 , Servo1 = Portb.0 , Reload = 10
Config Portb = Output

On Urxc Onrxd
Enable Urxc
Enable Interrupts


L = 100
R = 30
S = -1


Print "Servo wird ausgerichtet..."

Servo(1) = L

Print "Servo linksseitig ausgerichtet!"


Do


Main:

Print "Main"

Wait 1

Goto Main


Command:

Print "Command"

If Inpt = "1" Then Gosub Rotation

Inpt = ""

Return


Rotation:

Print "Starte Drehung..."


For Servopos = L To R Step S

Servo(1) = Servopos

Waitms 3

Next


Print "Drehung beendet!"

Servo(1) = L

Print "Servo zurückgesetzt!"

Return


Onrxd:

Print "Empfange Signal..."

Inpt = Inpt + Chr(udr)

Gosub Command

Print "Signalempfang beendet!"

Servo(1) = R

Print "Servo rechtsseitig ausgerichtet!"

Return


Loop


Hat jemand eine Idee, woran das liegen könnte und was ich tun muss, damit es funktioniert?
Ich hab schon alles versucht... Controller ausgetauscht, den Servo an einen anderen Port angeschlossen... Es tut sich jedoch rein gar nichts... :-(
Könnte es daran liegen, dass der Servo innerhalb eines Interrupts irgendwie deaktiviert ist?
Wenn ich die FOR-Schleife in den Main-Bereich verlege, funktioniert die Servo-Drehung...

Ich hoffe, ihr könnt mir helfen!

Mit freundlichen Grüßen

Philipp

Torsten_G
16.12.2006, 21:33
Versuch doch mal, diese ganzen verschachtelten Gosubs aufzulösen - da wird einem ja schwindelig! :mrgreen:
Besonders pikant ist der Gosub-Aussprung in der eigentlichen Interrupt-Routine - da spielt der Stack Pointer ganz schnell Roulette.

Lieber ein paar If-Then in der Hauptschleife, und gut ist.

Grüße

Torsten

PhilippW
17.12.2006, 18:01
Ich hab das Problem gelöst... :D
Es scheint wirklich so zu sein, dass während eines Interrupts bestimmte Dinge nicht funktionieren und so hab ich einfach noch eine zusätzliche Variable eingefügt, die von der Hauptschleife ständig abgefragt wird und bei Empfang über die serielle Schnittstelle ihren Wert ändert.
Trotzdem vielen Dank für deine Bemühungen und Tipps!

Mit freundlichen Grüßen

Philipp