Hallo, ich habe mal mit bascom ein Servo angesteuert und festgestellt, dass wenn es sich bewegt dies immer in Schritten von ca 10grad geschieht. $regfile = "m8def.dat" $crystal = 1000000 Config Servos = 1 , Servo1 = Portd.0 , Reload = 20 Config Portd = Output Enable Interrupts Do Servo(1) = 20 Waitms 100 Servo(1) = 30 Waitms 100 Loop End Frage: Kann man mit Bascom ein Servo auch ruckelfrei ansteuern? Waitms 100 Das heißt doch dass 100ms (also 0,1s) warten soll? Bei mir dauert es jedoch ca 1s. Habe ich irgendwas falsch eingestellt? Mit freundlichen Grüßen und Dank für eure Antworten Jan Weber
So wie ich die Config-Servo-Routine von BAscom verstehe, haben deine Servos eine Auflösung von 20µs. Das sind 50 Schritte (1-2ms). Das ist aber alles egal! Dein Servo zuckt, weil du ihn dauernd zwischen zwei Endwerten hin- und herschickst. Hast du mal das Beispiel in der Bascom-Doku auf Seite 326 ausprobiert? Normale RC-Servos arbeiten mit Pulsen zwischen 1 und 2ms. Du müsstest also Werte für servo(1) = 50 oder servo(1) = 100 angeben... Wie gut, dass ich sowas in C programmiere... Da weiß man, was man hat (draus wird).
Was mich stutzig macht ist, das auf seiner Hardware eine programmierte Wartezeit von 0,1 sec in der Realitaet 'ca. 1 Sekunde' dauert. Ich denke mal seine $crystal Einstellung ist falsch. Damit stimmt klarerweise auch das restliche Timeing nicht.
Hallo,
danke für eure Antworten!
Ich habe mir auch schon gedacht dass es irgendwie an der taktung liegen
muss.
Der Mega 8 hat soviel ich weiß einen internen, voreingestellten 1Mhz
Oszillator.
Muss ich dann den Befehl
> $crystal = 1000000
benutzen oder einen anderen?
MfG
Jan
Hi Jan, wenn du Bascom mitteilst, dass der Chip mit 1Mhz läuft, dann muss er auch mit 1Mhz laufen, sonst berechnet Bascom falsche Werte für die Wait Befehle. Klemm das AVR Studio an und kontrolliere die Fuses. Stimmt der Wert nicht, dann setz ihn auf 1Mhz intern Oszi. Doch Vorsicht: programmiere niemals eine externe Frequenz, wenn kein Quarz montiert ist!!! Dann kannst den Chip nämlich nicht mehr programmieren. lg Ralf
Hallo, habe gerade mal eine einfache Blinkschaltung mit waitms 1000 gemacht und dei Led Blinkt im 1Hz takt. Also ist die tacktung richtig eingestellt. Kann es sein dass der Befehl Servo bei 1Mhz nicht funktioniert? Ich wede das ganze mal mit 8Mhz probieren! MfG Jan
Selbst in Assembler traue ich mir nicht zu, mit Warteschleifen eine ruckelfreie Servo-Ansteuerung zu programmieren. Sowas synchronisiert man mit Timern (auch in einer Hochsprache!). <Eigenwerbung> Ein ASM-Beispiel für Servoansteuerung findest du z.B. hier: http://www.hanneslux.de/avr/7ksend/7ksend01.html </Eigenwerbung> ...
geht waitms tatsächlich bei BASCOM auch bis 1000?!? bei "meinem" FastAVR geht maximal "Waitms 255". Gruß AxelR.
Achso und $Clock für 1Mhz heisst bei mir '///////////////////////////////////////////////////////// '/// FastAVR Basic Compiler for AVR by MICRODESIGN /// '/// '///////////////////////////////////////////////////////// $Device = mega16 'used device $Stack = 92 'stack depth $Clock = 1 'adjust for used crystal $Source = On 'basic source in Asm $Baud = 9600 $Timer0 = Counter, Rising, Compare= DisConnect, Clear 'zählt Schocksensorimpulse $Timer2 = Timer,Async,Prescale =128'128 'ext. 32.768 Crystal $WatchDog = 2048 also "1" und nicht "1000000"... Vielleicht daher? Aber gut, ich habe FastAVR, ist vielleicht anders hier. AxelR.
hab auch schon einiges mit servos rumgespielt... wenn du wirklich das servo ruckelfrei betreiben willst und das bei jedem servo(sowohl negative als auch positive impulse) , dann nimm nicht die bascom-interne-servo-ansteuerung, sondern mach dir n timerinterrupt von 20ms und schalt dein pin dann für 1-2ms ein... je nach dauer hast du n anderen winkel. wenn du kein interrupt machen willst kannst du auch einfach: Schleife { waitms 19 pin5=1 waitms 2 pin5=0 }
Hallo, danke für eure Antworten! Werde das gleich mal ausprobieren. Nur wegen Intresse: Weiß jemand wie der Bascom Interne Servo Befehl abläuft? MfG Jan
das steht im Handbuch beschrieben: Timer 0 läuft alle paar µs (wird vom Programmierer angegeben) über (Schrittweite), das nutzt Bascom zum herunterzählen einer Variablen (Servo(n)) Bei Gleichstand wird der entsprechende Pin ausgeschaltet. Ich finde die Methode doof, weil man den Timer0 nicht mehr für andere Sachen benutzen kann.
Hallo! Schau noch mal in die "Fuses" wenn der mit 8 MHz Takt läuft aber der Divide internally by 8 aktiviert ist gibt es auch nur Probleme. CU Frank
Den Servo wirds mittlerweile zerlegt haben (durchgeruckelt). Wo nehmt ihr immmmmer die alten Threads her? schönen Gruß AxelR. ;-))
>Divide internally by 8 aktiviert
kenne ich vom ATtiny2313, aber beim Mega8 konnte ich das garnicht
finden. Hab ich was übersehen?
Gruß,
Raimond
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.