Servo mit Bascom AVR

Servo von Conrad

Ich bin total begeistert! Ich habe soeben einen Servo aus alten Zeiten (mindestens schon 300 Jahre alt) mit Bascom und dem ATmega8 innerhalb von zehn Minuten wieder zum Leben erweckt. Dass es so einfach sein würde, hatte ich mir nicht gedacht. Aber so wie es aussieht, kann man mit Bascom und einem ATmega8 bis zu 16 Servos ansteuern. Und das mit ein paar kinderleichten Befehlen.

Mit Config Servos = 1, Servo1 = Portd.7, Reload = 10 habe ich angegeben, dass ich einen Servo auf Portd.7 anhängen möchte. Was "Reload = 10" bedeutet habe ich nicht verstanden, aber es funktioniert trotzdem. :-) (CONFIG SERVOS-Hilfe)

Und im Programm kann ich mit Servo(1) = <Zahlenwert> die Position des Servos angeben. Das war's! :-D

Mit diesem Code lasse ich meinen alten Servo in großen Schritten vor und zurück laufen. Man muss dem Servo natürlich die Zeit lassen, um eine Position zu erreichen, bevor man ihm eine neue Position übergibt. Das mache ich, indem ich mit Waitms 300 Millisekunden warte.

'Hardware: Rote LED (mit Vorwiderstand) und Servo (direkt) an Pin PD7
'          Servo und µC an 5V

$regfile = "m8def.dat"
$crystal = 8000000
Config Servos = 1 , Servo1 = Portd.7 , Reload = 10
Declare Sub Main
Enable Interrupts

'LED und Servo an PD7
Ddrd = &B10000000

Call Main()
End

Sub Main
    Local Neue_position As Byte

    Const Startwert = 50
    Const Endwert = 150

    'Startposition einnehmen
    Servo(1) = Startwert
    Waitms 300

    'In der Schleife vor und zurück
    Do
        For Neue_position = Startwert To Endwert Step 20
            Servo(1) = Neue_position
            Waitms 300
        Next Position
        For Neue_position = Endwert To Startwert Step -20
            Servo(1) = Neue_position
            Waitms 300
        Next I
    Loop
End Sub

Weiterführende Infos:

Nachtrag (2008-01-03):

Ich habe eine Aussage gefunden, die die Bedeutung der Impulslänge erklärt und auch warum mein Code erst mit einer Taktfrequenz von 8 Mhz so richtig funktionierte. :-)

http://www.roboternetz.de/phpBB2/viewtopic.php?p=340232#340232

Für die Benutzung des Servo-Befehls solltest du mindestens 8Mhz Taktfrequenz und einen Mindest-Reload-Wert von 10 haben. Der Reload Wert multipliziert mit dem Wert von Servo() ergibt die Impulslänge in Mikrosekunden. Sie sollte zwischen 1000 und 2000 liegen. Ist die Taktfrequenz und/oder der Reload Wert zu niedrig, gibt es Überläufe, die man schwer vorausberechnen kann -> Servo ruckelt.

Ich empfehle also mindestens 8 MHz Taktfrequenz für den Betrieb mit einem Servo. Wenn mehr Servos angesteuert werden sollen und auch sonst noch einiges im Programm gemacht wird, dann ist ein externer schneller Quarz siche keine schlechte Empfehlung.