PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [ERLEDIGT] Servoansteuerung über Funkfernsteuerung



Richy
09.06.2013, 13:19
Hallo Ihr Tüftler!

Ich bin noch Neuling in Sachen Mikrocontrollerprogr. und bitte deshalb mal um Eure Hilfe.
Ich möchte mit einem Attiny13 einen Servo über Funk ansteuern. Dabei soll der Servo aber mit einer langsamen Geschwindigkeit fahren. (Landeklappen, Fahrwerk an einem Modellflugzeug)

Da ich Basic-Vorkenntnisse (VB.net), habe ich mich für Bascom entschieden und auch schon kleine
Sachen problemlos zum Laufen bekommen. Der Programmer ist ein Diamex Prog-S.

Ich habe folgenden Quellcode mir mal zusammengebastelt.
So wie er hier zu sehen ist, schaltet die LED noch das Servo.
Wenn ich „Enable Interrupts“ auskommentiere, kann ich mit der Fernst. Die LED schalten.
Ebenfalls läuft mein Servo, wenn ich statt des Empfängereingangs einen Taster einbaue.
Aber warum läuft es zusammen nicht?

Schon mal vielen Dank im Voraus.
VG Richy


$regfile = "ATtiny13.dat"
$crystal = 9600000
$hwstack = 32
$swstack = 5
$framesize = 20

!LDI R16, &b10000000
!LDI R17, &b00000000
!OUT CLKPR, R16
!OUT CLKPR, R17

Config Servos = 1 , Servo1 = Portb.0 , Reload = 5
Config Pinb.0 = Output
Config Pinb.2 = Output
Config Pinb.4 = Input

'Taster1 Alias Pinb.4
'Taster1 = 1
Led Alias Portb.2

Dim A As Word
Dim W As Word

Enable Interrupts

Do

Pulsein W , Pinb , 4 , 1

If W <= 150 Then And A < 200 Then 'If Taster1 = 1 And A < 200 Then

For A = 100 To 200 Step 1
Servo(1) = A
Led = 0
Waitms 10
Next A

Elseif W > 170 Then And A > 100 Then 'Elseif Taster1 = 0 And A > 100 Then

For A = 200 To 100 Step -1
Servo(1) = A
Led = 1
Waitms 5
Next A

Else

Servo(1) = A

End If

Loop

End

DanielSan
10.06.2013, 14:40
Ich vermute weil "Pulsein" und "Servo()" den gleichen Timer benutzen. Das kann dann nicht funktionieren. Ich mag den Servobefehl nicht besonders dewswegen hab ich mir damals eine eigene Servoroutine geschrieben. Da ich aber mittlwerweile mit Arduino arbeite kann ich dir die Routine nicht geben ist irgendwann bei ner neuinstallation meines Systems auf der strecke geblieben... :-(

Richy
10.06.2013, 20:07
Hallo, danke erst mal für Deine Antwort.

Würde da ein anderer µC mit 2 Timern nach diesem Schema funktionieren?
Bzw. wie kann ich mir so eine Servoroutine vorstellen, wenn man nur diesen 8 Bit Timer hat?

Gruß Richy

MagicWSmoke
10.06.2013, 20:20
Ich vermute weil "Pulsein" und "Servo()" den gleichen Timer benutzen.
Pulsein benutzt keinen Timer, sondern ist 'ne einfache Zählschleife, diese Schleife wird jedoch vom Timerinterrupt für das Servo laufend unterbrochen und bringt dann nicht mehr das richtige Ergebnis.

Richy
10.06.2013, 21:26
Geht das zu verhindern?
Funktionieren muß es. Habe sowas schon mit dem Tiny 13 gesehen.
Oder gibt es da noch einen einfachereen Weg mit 'nem anderen µC? Es muß ja nicht der Attiny13 sein.
Aber Bascom solls schon sein.

MagicWSmoke
10.06.2013, 21:49
Geht das zu verhindern?
Nicht wirklich. Sperren des Interrupts ist in diesem Fall keine Option.

Funktionieren muß es. Habe sowas schon mit dem Tiny 13 gesehen.
Ach, man kann sogar sehr viel mit 'nem Tiny13 anstellen.

Oder gibt es da noch einen einfachereen Weg mit 'nem anderen µC?
Es gibt 'nen einfacheren Weg mit dem Tiny13, solange die Forderungen an die Funktionalität nicht ausufern.
Was steht denn z.B dagegen, den Servokrams komplett wegzulassen und nach der Pulsein den Servopuls per Verzögerungsschleife zu erzeugen?
Timer braucht's nicht dafür, denn schließlich wird Pulsein genau im Takt der eintreffenden Servoimpulse durchlaufen, das reicht für das Timing.

HeXPloreR
10.06.2013, 21:57
...

Es gibt 'nen einfacheren Weg mit dem Tiny13, solange die Forderungen an die Funktionalität nicht ausufern.
Was steht denn z.B dagegen, den Servokrams komplett wegzulassen und nach der Pulsein den Servopuls per Verzögerungsschleife zu erzeugen?
Timer braucht's nicht dafür, denn schließlich wird Pulsein genau im Takt der eintreffenden Servoimpulse durchlaufen, das reicht für das Timing.

...jo, richtig. Und da die nächste Frage schon wartet: Der Befehl zum Servos ansteuern lautet "Pulseout". Und das ganze Pulsein und -out funktioniert am bessten ab einem Takt von ca 4MHz. Der Tiny13 kann 9,6MHz wenn man den Teiler von 8 deaktiviert.

Richy
10.06.2013, 22:40
Ok, danke erst mal für die Tipps. (Wie gesagt beschäftige mich erst seit paar Wochen mit der Materie tu mich noch bissel schwer mit Timern, Freq. usw.)
Die Anforderungen sind eigentlich nur: "Benutzerdefiniert" LANGSAM und möglichst ohne großes ruckeln.
Werd mich morgen mal damit versuchen.

Bis dahin.
Gruß Richy

Richy
12.06.2013, 21:40
Super, es läuft!!! :p
Servobefehl raus, PulseOut rein und dann noch die Zeiten angepasst.


For A = 1000 To 5000 Step 10
Pulseout Portb , 0 , A
Waitms 5
Next A

Allen beteiligten ein großes Dankeschön!

VG Richy

Smith-mini-plane
12.06.2013, 23:40
Hallo Richy,
kannst du vielleicht den funktionierenden Code reinstellen.

Gruß und Danke

Thomas

Richy
13.06.2013, 21:08
Hallo,

hier noch mal der gesamte Code.


$regfile = "ATtiny13.dat"
$crystal = 9600000
$hwstack = 32
$swstack = 5
$framesize = 20

!LDI R16, &b10000000
!LDI R17, &b00000000
!OUT CLKPR, R16
!OUT CLKPR, R17

Config Pinb.0 = Output 'Servo
Config Pinb.4 = Output 'LED
Config Pinb.2 = Input 'Empfänger
Pinb = 0

Led Alias Portb.4

Dim A As Word
Dim W As Word

Enable Interrupts
Pulseout Portb , 0 , 1000 'Servo in Startpos. bringen

Do

Pulsein W , Pinb , 2 , 1 'Eingang Empfängersignal



If W <= 150 And A <= 5000 Then

For A = 1000 To 5000 Step 10 'mit diesen Einstellungen läuft der Servo
Pulseout Portb , 0 , A 'nach meinen Wünschen.
Led = 0 'LED ist nur opt. Indikator beim Test
Waitms 5 'mit diesem Wert kann die Geschwindigkeit beeinflusst werden

Next A

Elseif W > 170 And A >= 1000 Then

For A = 5000 To 1000 Step -10
Pulseout Portb , 0 , A
Led = 1
Waitms 5

Next A

Else

Pulseout Portb , 0 , A 'Servo bleibt an letzter Pos. stehen

End If

Loop

End

Viele Grüße
Richy

Smith-mini-plane
13.06.2013, 22:54
Hallo Richy,
vielen Dank.
Gruß Thomas