Hallo, Ich habe mir ein ATMEL Evaluations-Board V2.0.1 mit einem ATmega32 besorgt und möchte damit meinen Futaba Brushless Digitalservo steuern. Ich hab erst vor 5 tagen mit Programmieren generell erst angefangen und noch nicht so die ahnung davon... habe folgendes Programm geschrieben: $regfile = "m32def.dat" $crystal = 1000000 Config Servos = 1 , Servo1 = Porta.1 , Reload = 10 Config Porta = Output Config Portd.2 = Input Config Portd.3 = Input Config Portd.4 = Input Enable Interrupts Do If Pind.2 = 1 Then Servo(1) = 50 End If If Pind.3 = 1 Then Servo(1) = 100 End If If Pind.4 = 1 Then Servo(1) = 150 End If Loop End nur leiden macht der servo keinen mucks. Nur wenn ich mit dem weißen signalkabel am PORTA ausgang rumspiele tut sich was, aber nicht wenn ich denn weißen kabel stecken lasse, geschweige das etwas über die 3 drucktaster was passiert. Kann mir da einer helfen??
Porta.=Output oder muß es nicht geschrieben werden: Porta.1 = Output
hallo Frank: funktioniert nicht. #also mit rumspielen meine ich, wenn ich mit dem weißen kabel immen an PORTA entlangstreife, dann fährt er mal nach rechts oder ganz links oder mitte. also hat er doch die positionen. Nur ist das ja nicht sinn der sache mit dem kabel immer rumzufummeln....
Hallo Michael! Das programm sieht mir sehr nach Bascom aus.Der Digitalservo benötigt Impulse von 400µs.Mit Ouarz oder Intern 1Mhz wird das Nichts.Ouartsfrequenz oder Intern min 8Mhz.
Eines habe ich noch vergessen.Versorge den Servo aus einer externen Spannungsversorgung,da die Servos einen"hohen Strom" ziehen und deshalb die Versorgung des Boards zusammenbricht.Eigene Erfahrung!
Ich verstehe es nicht!! Ich hab den code von den "3 Königen" für mein M32 angepasst. Und es passiert NICHTS! Liegt es daran das ich vlt. die elektronik aus den Servo rausnehmen muss??! $crystal = 80000000 $regfile = "m32def.dat" Dim Servospeed As Integer Dim Negservospeed As Integer Dim I As Integer Dim Centerservo As Integer Dim Leftservo As Integer Dim Rightservo As Integer Config Portb.0 = Output Config Pind.2 = Input Config Pind.3 = Input Config Pind.4 = Input Portd = &HFF Portb.0 = 0 Servospeed = 30 Negservospeed = -23 I = 1 Centerservo = 4000 Rightservo = 1700 Leftservo = 6400 Waitms 10 Loop: If Pind.2 = 0 Then For I = Rightservo To Centerservo Step Servospeed Pulseout Portb , 0 , I , Waitms 20 Next End If If Pind.3 = 0 Then For I = Centerservo To Leftservo Step Servospeed Pulseout Portb , 0 , I , Waitms 20 Next End If If Pind.4 = 0 Then For I = Leftservo To Rightservo Step Negservospeed Pulseout Portb , 0 , I, Waitms 20 Next End If Wait 1 Goto Loop End
Huch... :D das war es aber nicht. Ich frag mich was "I" fürne aufgabe hat und warum es als integer definiert ist. Und was "Portd = &HFF" heißt... Jedenfalls läuft es auch nicht anders als mein erster code ganz oben. gruß.
Ein Oszilloskop würde die Fehlersuche deutlich erleichtern. Ist dein Servo überhaupt für die "normale" Ansteuerfrequenz und Impulslänge ausgelegt oder ist es ein Teil das mit höherer Frequenz und kürzeren Impulsen angesteuert werden will (gibt es als Heli-Heckservo zum Anschluss an einen geeigneten Kreisel)?
Der servo ist ein Futaba Brushless Digitalservo : 89 € Stellgeschwindigkeit 0.07sek./40° mit 116Ncm... Ich finde das für mein Projekt ,denke ich mal, ausreichend. Wenn nicht muss ich einen zweiten deneben stellen und 232 Ncm zu haben. Ich will das dieser Schnelle Digitalservo 2 Positionen, so schnell wie er kann, erreichen mittels Drucktaster, später dann eine kleine Panasonic Gabellichtschranke ZWEI augänge bestizt mit je 12v 50mAh als Trigger. Sagen wir mal 150 ist die mittelstellung... -Dann soll der servo bsp. 164° erreichen sobald ein objekt in die lichtschanke bzw. "taster1" gedrückt ist. -sobalt das objekt wieder aus der lichtschranke raus ist, oder "taster2" gedrückt ist, soll der servo in etwa bsp. 139° "schießen". und dieses Objekt wird wohl so 5-7 mal pro sekunde da durch rauschen. Zu dem Soll der servo auch die position halten wenn gegendruck herrscht. Aber ich will das erstmal mit den avr board und drucktastern testen bevor ich mir den aufwand mache ein unkompizierteres bord mit anschluss der Gabellichtschranke zu bauen. gruß
> $crystal = 80000000 vorher war es noch > $crystal = 1000000 Ja, was denn nun? Mit welcher Taktfrequenz läuft denn dein Prozessor nun?
Mir hat einer gesagt das man auf 8 MHz erhöhen muss damit es läuft. Hab mich nur um eine null vertippt...
Das Servo sollte mit den normalen Ansteuerimpulsen funktionieren. Beim Pollin ATMEL Evaluations-Board V2.0.1 ist laut Anleitung am DIP 40 Sockel ein 16 MHz Quarz. Änder $crystal mal entsprechend.
Michael Baage schrieb: > Mir hat einer gesagt das man auf 8 MHz erhöhen muss damit es läuft. Das mag schon sein. Das ist aber nicht die Frage. Denn die eigentliche Frage lautet: Wie schnell ist denn dein Mega32 wirklich? Hinschreiben kannst du an dieser Stelle viel. Nur interessiert das den µC herzlich wenig. Der läuft mit der Taktfrequenz auf die er eingestellt ist. Die Angabe im Programm ist nur die Information für das Programm, wie schnell das ist.
ATmega 32/16 Fmax. 16MHz steht in der chipbeschreibung.
Michael Baage schrieb: > ATmega 32/16 Den CHip kann man auf fixe Taktfrequenzen 1 Mhz 2 Mhz 4 Mhz 8 Mhz einstellen. Und natürlich auch auf jede andere Taktfrequenz, wenn man einen Quarz für diese Frequenz hat. Also: Wie schnell läuft dein µC? > Fmax. 16MHz steht in der chipbeschreibung. Das 'max' macht dich nicht irgendwie stutzig? Der Chip geht maximal mit 16Mhz. Aber bis hinauf zu 16Mhz hast du mit einem Quarz die freie Wahl.
Stell es halt einfach fest. Mach dir eine LED an einen µC Pin (mit Vorwiderstand), schreib ein Programm, welches mit Wait die LED im Sekundentakt blinken lässt und dann variierst du die Angabe bei crystal, bis es tatsächlich 1 Sekunde ist. Wenn auf deinem Board ein Quarz verbaut ist, dann kann man ja als erstes einfach mal den dort aufgedruckten Wert benutzen.
Mein µc hat 3 quarze: 1x 8MHz und 2x 16MHz. Der antiny 2313 sockel hat den 8 MHz quarz. Mega8 sockel 16 MHz quarz und der Mega 16 sockel den 16 MHz quarz.
Also die bascom software hat einen eigenen Simulator. Den code den ich hier am 14.05.2011 gepostet habe, habe ich mal mit $crystal 16 MHz laufen lassen: Beim ersten "WAITMS 10" wartet die simulation dort genau 1 Minute. Stelle ich $crystal auf 1MHz wartet die Simulation dort nur noch 3 sekunden. ??????? gruß
Die Simulation ist uninteressant. Der reale Prozessor zählt: Wenn du einen do LED an wait 1 LED aus wait 1 loop machst (symbolischer Code), wie lange sind dann die Zeiten? Das ist doch nicht so schwer. Jeder BASCOM Anfänger muss das hinkriegen eine LED zum leuchten zu bringen, indem er einen Output Pin entsprechend konfiguriert und ansteuert. Wie willst du denn jemals ein Servo ansteuern, wenn dich schon die 'Kindergartenbeispiele' vor unüberwindliche Probleme stellen? Auch du wirst das alles von der Pieke auf lernen müssen.
Wahrscheinlich wird der uC mit 1 MHz laufen weil die Fuses im Auslieferungszustand so gesetzt sind, dass der interne RC Oszillator mit 8 MHz und der Vorteiler /8 ausgewählt sind. Für eine höhere Taktfrequenz oder um den Quarzozillator zu nutzen müssen die Fuses anders gesetzt werden. Mit $crystal wird nur dem Compiler mitgeteilt wie schnell der uC getaktet ist damit z.B. die Waitms Warteschleifen richtig berechnet werden können.
Ich war mal so fein und hab den prozessor gewechselt. hier ist es eine led auf dem AVR Board. In einem Video funktioniert es mit dem chrystal und waitms. BEI MIR LEUCHTET SIE NUR :( $regfile = "m8def.dat" $crystal = 1000000 Config Portd.5 = Output Dim Speed As Integer Speed = 1000 Do Portd.5 = 1 Waitms Speed Portd.5 = 0 Loop End Stefan schrieb: > müssen > > die Fuses anders gesetzt werden. Aha? und wo kann man das umstellen?? :) gruß
Wichtige Informationen zu den Fuses findest du hier: http://www.mikrocontroller.net/articles/AVR_Fuses Zu diesen allgemeinen Informationen brauchst du natürlich noch das Datenblatt deines AVRs. Auf welchen Wert du $crystal setzen musst findest du dann im BASCOM-AVR user manual: http://www.mcselec.com/index.php?option=com_docman&task=doc_download&gid=140&Itemid=54
Das ist doch mal Laienhaft erklärt. Damit kann ich mich schon mehr anfreunden, und auch vlt. andere leute :) ...."Würde der Timer direkt mit den 16MHz des Controllers getaktet werden, wäre die maximale Impulsbreite 16MHz/65536 = 0,0041 Sekunden lang. Setzen wir in der Interrupt-Routine den Timer auf 0, so läuft er 65536 Takte hoch, bevor wieder ein Interrupt ausgelöst wird. Wollten wir einen Impuls von 1,5ms auslösen, müßten wir den Timer mit einem Wert von 41536 belegen, damit 24000 Takte (brauchen 0,0015 Sekunden) beim Hochzählen nötig sind um wieder einen Interrupt zu erzeugen und den nächsten Servo einzuschalten" gefunden hier. http://www.vreal.de/index.php?Itemid=31&id=21&option=com_content&task=view
Hi >...."Würde der Timer direkt mit den 16MHz des Controllers getaktet >werden, wäre die maximale Impulsbreite 16MHz/65536 = 0,0041 Sekunden >lang. Setzen wir in der Interrupt-Routine den Timer auf 0, so läuft er... Das ist die altmodische Variante. Bei Timer mit Compare-Einheit(en) ist das unnötig. MfG Spess
DER HIER FUNKTIONIERT so wie ich es will !! ausgang ist ein OC1A oder PD5... So dann bedanke ich mich erstmal für eure zeit. Und frohes schaffen :) $regfile = "m32def.dat" $crystal = 1000000 Config Timer1 = Pwm , Pwm = 10 , Compare A Pwm = Clear Down , Prescale = 1 Config Pind.2 = Input Config Pind.3 = Input Config Pind.4 = Input Do If Pind.2 = 1 Then Compare1a = 389 Elseif Pind.3 = 1 Then Compare1a = 650 Elseif Pind.4 = 1 Then Compare1a = 1022 End If Loop End
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.