Ich hab' jetzt mal versucht, Servo-Steuerpulse mit timer2 und ctc zu erzeugen. Meine Hintergründe sind die:
Puls min 1msec, max 2msec lang, Servo auf Anschlag mit 1msec Puls, Mittelstellung 1,5msec Puls, anderer Anschlag 2msec Puls.
Kontroller läuft mit 20MHz, timer2 prescaler=128, 156 Takte ergeben 1msec. Also habe ich 156 mögliche Stellungen der Servos.
Der 2msec Puls braucht somit 318 Takte, deshalb hab' ich das so gelöst, dass ich einen 'Abschnitt mit 0,5msec erzeuge (78 Takte) und einen folgenden mit 0,5..1,5msec (78..234 Takte).
Das passt laut Oszi auch ganz gut, nur meine mikro-Servos bewegen sich nur in einer Hälfte des möglichen Ausschlags und das verstehe ich nicht. Habe ich schon wieder Murks programmiert?
Alles anzeigen
Puls min 1msec, max 2msec lang, Servo auf Anschlag mit 1msec Puls, Mittelstellung 1,5msec Puls, anderer Anschlag 2msec Puls.
Kontroller läuft mit 20MHz, timer2 prescaler=128, 156 Takte ergeben 1msec. Also habe ich 156 mögliche Stellungen der Servos.
Der 2msec Puls braucht somit 318 Takte, deshalb hab' ich das so gelöst, dass ich einen 'Abschnitt mit 0,5msec erzeuge (78 Takte) und einen folgenden mit 0,5..1,5msec (78..234 Takte).
Das passt laut Oszi auch ganz gut, nur meine mikro-Servos bewegen sich nur in einer Hälfte des möglichen Ausschlags und das verstehe ich nicht. Habe ich schon wieder Murks programmiert?
BASCOM-Quellcode
- $regfile = "m168pdef.dat"
- $crystal = 20000000
- $hwstack = 32
- $swstack=32
- $framesize = 30
- Dim Xx_ As Byte 'Umschalterin der isr
- Dim Servo_n As Byte 'Servonummer in der isr
- Dim Servo(8) As Word 'Stellwert0=1msec, 156=2msec
- Servoport Alias Portd
- Config Servoport = Output
- Config Timer2 = Timer , Prescale = 128 , Clear_timer = 1 '156 Takte für 1 msec
- On Compare2a Timer2_isr
- Start Timer2
- Enable Interrupts
- Dim N As Byte
- Compare2a = 156 'Startwert
- Servo_n = 0 : Xx_ = 0 'Startwert
- Enable Compare2a
- Servo(1) = 78
- Servo(2) = 78
- Servo(3) = 78
- Servo(4) = 78
- Servo(5) = 78
- Servo(6) = 78
- Servo(7) = 78
- Servo(8) = 78
- Do
- For N = 0 To 156
- Servo(1) = N
- Waitms 1
- Next N
- For N = 156 To 0 Step -1
- Servo(1) = N
- Waitms 2
- Next N
- Loop
- End
- Timer2_isr:
- If Xx_ = 0 Then
- Compare2a = 78 'für die Dauer von 0,5 msec
- Servoport.servo_n = 0 'Portpin wird gesetzt
- Incr Servo_n 'Servonummer hochzählen
- If Servo_n > 8 Then Servo_n = 0
- Servoport.servo_n = 1
- Xx_ = 1 'beim nächsten mal den else-Teil ausführen
- Else
- Compare2a = Servo(servo_n + 1) + 78 'Einschaltdauer+ 0,5 msec =max 1,5 msec
- Xx_ = 0 'beim nächsten mal den true-Teil ausführen
- End If
- Return
Raum für Notizen
-----------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------