PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Servos "zucken" in die Endstellung



ChiefGlider
13.02.2009, 13:50
Hallo,

ich mache gerade meine ersten Schritte mit AVRs und Bascom. Nachdem Taster und LEDs schonmal hinbekomme habe ich mich nun an einen Servo gewagt.

Der MEGA8 hat keinen externen Quarz und ich versuche es mit der Standard-Routine



$regfile = "m8def.dat"
Config Portd = Output
Config Servos = 1 , Servo1 = Portd.2 , Reload = 10
Enable Interrupts
Servo(1) = 100
Waitms 1000


fehlt da noch ein "crystal" oder ein "end" ?

Ich habe schon recht viel rumprobiert, aber es ist immer das selbe: Der Servo (Conrad ES-030) dreht in ruckartigen Bewegungen in die Endstellung und zuckt auch dann weiter. Was läuft da falsch?

LG,
David

MeckPommER
13.02.2009, 13:58
Hallo,

- es fehlen compilerangaben zum crystal
- es fehlen angaben zum stack, frame und das ganze "normale gedöns"
- es fehlt ein end

und mehr als einmal zucken bekommt der Servo ja auch nicht mitgeteilt, da du den Servowert einmal setzt und das Programm dann ins Leere läuft.

Ein Blick in die Bascom-Hilfe "config servos" könnte weiterhin helfen.

Gruß MeckPommER

ChiefGlider
13.02.2009, 15:23
Also, habe ein bisschen geforscht.

Der Servo scheint die Anschläge bei 8 und 31 zu haben. Außerdem stimmt etwas mit dem Timing nicht.

Bei diesem Programm:


$regfile = "m8def.dat"
$crystal = 1000000

Config Portb = Output
Do
Portb.0 = 1
Waitms 1000

Portb.0 = 0
Waitms 1000

Loop

End

kommt das mit der 1 sek gut hin.

Ändere ich das Programm auf diese:


$regfile = "m8def.dat"
$crystal = 1000000

Config Portb = Output
Config Portd = Output

Config Servos = 1 , Servo1 = Portd.2 , Reload = 10

Enable Interrupts

Do

Portb.0 = 1
Servo(1) = 31

Waitms 1000

Portb.0 = 0
Servo(1) = 8

Waitms 1000

Loop

End

sind das gemessen 33 sekunden!

Da läuft doch was schief :P

LG

Dirk
13.02.2009, 15:33
Man kann ja nur raten, wenn du keine vollständigen Angaben machst:

1. Welche Taktfrequenz hat denn dein Board? Stimmt die mit der $crystal-Angabe überein?
2. Stack, frame hast du auch noch nicht ergänzt (hatte dir MeckPommER ja schon geschrieben!)?
3. Was meinst du mit "gemessen 33 sekunden"? Was hast du da genau gemessen?

Gruß Dirk

MeckPommER
13.02.2009, 16:39
... und was sagen deine fuses?

ChiefGlider
13.02.2009, 19:31
Hi,

also ich habe keinen externen Quarz - d.h. der 1 Mhz interne Quarz wird genutzt. Das stimmt auch wenn ich ne Blink-LED mit 1s Schaltzeit mache ist das korrekt (siehe erstes Programm).

$hwstack = 32
$swstack = 8
$framesize = 24

Die 33 Sekunden habe ich mit meiner Armbanduhr gemessen die ich daneben gelegt habe.

Ich nutze AVRprog und ein USB-RS232 Adapter an Vista32. Die HEX-Dateien erstellt Bascom-AVR. Der Progger ist dieser: http://www.klaus-leidinger.de/mp/Mikrocontroller/AVR-Prog/AVR-Programmer.html

funktioniert eigentlich ordentlich.

Fuses siehe Bild im Anhang

MeckPommER
13.02.2009, 22:33
Die Frage war nicht, MIT was du gemessen hast, sondern WAS du gemessen hast, wobei dann 33 Sekunden herauskamen.

Und wo hapert es nun noch?

Gruß MeckPommER

ChiefGlider
14.02.2009, 09:19
Hi,

ich habe ja in dem vorletzen Post zwei Programme geschrieben. Einmal eine einfache Blink-LED im 1-Sekunden-Takt. Diese eine Sekunde kommt auch sehr gut hin.

Im zweiten Programm habe ich in das selbe Programm den Servo dazugenommen, der auch im 1-Sekunden-Takt Anfangs- und Endstellung einnehmen soll. Doch im zweiten Program ist das waitms 1000 nicht eine Sekunde, sondern 33 Sekunden, und ich kann mir nicht erklären woher diese stammen.

Die Servos drehen also - aber langsam und ruckelnd und haben nur eine Auflösung von 23 Schritten.

MeckPommER
14.02.2009, 10:40
Entweder spinnt deine Hardware, oder deine gewählten Angaben zu Stacks und Framesize sind zu klein. Ich würde einfach mal die Werte auf 80 ändern.

Das mit der Auflösung ist nicht so prickelnd, das stimmt. Für Anwendungen, in denen ein Servo fein fühliger gesteuert werden soll, nehmen die meisten einen 16-Bit Timer und basteln sich die Ansteuerung eines Servos per Interrupt selber.

Gruß MeckPommER

ChiefGlider
14.02.2009, 11:06
Auch mit Stack/Framesize von 80 ändert sich daran nichts.

Was an meiner Hardware kann denn spinnen?

Ich habe auch schon andere Pins ausprobiert, es ist überall gleich. Auch hängt an den Pins nichts anderes dran.

LEDs und Taster funktionieren jedoch. Was an den Servos macht solche Probleme?

Oder ist der interne Quarz für sowas nicht geeignet?

python_rocks
14.02.2009, 11:13
Hallo David!

Ich habe die Erfahrung gemacht, dass die Servoansteuerung von Bascom bei 1 Mhz Taktfrequenz nicht korrekt funktioniert. Erst wenn ich auf 8 Mhz umstelle, funktioniert die Ansteuerung wie gewünscht.

Probiere es mal aus. Schalte den ATmega8 auf 8 Mhz um.

mfg
Gerold
:-)

ChiefGlider
14.02.2009, 11:45
Der entscheidende Tipp! Super, es funktioniert nun! Vielen Dank - sollte man vielleicht ins Wiki aufnehmen :)

mfg,
David