Forum: Mikrocontroller und Digitale Elektronik Atmega8 Problem bei Servo-Ansteuerung in Assembler


von Daniel K. (Gast)


Angehängte Dateien:

Lesenswert?

Hallo an alle, ich hoffe ihr könnt mir helfen:

Ich möchte fürs Fesselfliegen mit einem Brushlessmotor ein kleines 
Programm schreiben, was folgenden Programmablauf haben soll:

1. Warten bis Taster gedrückt wird
2. Dann 15 Sekunden warten, damit man Zeit hat zum Griff zu gehen
3. 3 Minuten Vollgas zum Fliegen
4. 5 Sekunden Halbgas um sich auf die Landung vorzubereiten
5. Motor aus um zu landen

Eine LED soll mir dann anzeigen, wo ich bin:
1. LED dauerhaft an
2. LED 1 Sekunden Blinken
3. LED aus
4. LED 1 Sekunden Blinken
5. LED dauerhaft an

Angeschlossen habe ich den Taster an PD6, die LED an PB5 und die 
Impulsleitung vom Servo an PD4. Das ist so merkwürdig, damit ich auf dem 
Lochraster möglichst keine Kabel benutzen musste.

So weit so gut, der Regeler wird ja wie ein normales Servo angesteuert 
und in einem anderen Beitrag habe ich gelesen, das ich alle 20ms ein 
Signal von 1ms bis 2ms erzeugen muss, wobei 1ms 0% entsprechen und 2ms 
100%, dementsprechend sind 1,5ms 50%. Aus dem AVR-Tutorial habe ich mir 
dann das Timerbeispiel von der Uhr genommen und die Werte so verändert, 
das ich mit dem internen Tackt vom Atmega8, also 1MHz, alle 0,5ms einen 
Interrupt bekomme. Über das Register r19 stelle ich nun ein, wie viele 
0,5ms Impluse ich alle 20ms haben möchte.
Und genau hier liegt das Problem, obwohl das 1 Sekunden Blinken der LED 
nach dem Tastendruck funktioniert, das Interrupt also richtig aufgerufen 
wird, läuft ein servo, wenn ich es anschließe an den Anschlag und summt 
weiter vor sich hin, als ob es noch weiter möchte. Am Servo liegt es 
nicht, denn ich habe es mit mehreren Probiert und kann mir nicht 
vorstellen, das alle kaputt sind.

Leider habe ich kein Oszilloskop um mir das Ausgangssignal mal 
anzuschauen, also wollte ich fragen, ob sich vielleicht einer von euch 
mal den Quellcode anschauen kann, und vielleicht den Fehler findet.

Schonmal vielen Dank im Vorraus.

MfG. Daniel

von Software-Entwickler (Gast)


Lesenswert?

Nutz doch die PWM Funktion vom Controller. Der kann dir eine PWM 
erzeugen, guck mal ins Datenblatt.

Ueber ein Compare-Register kannst du dann die Pulsweite steuern. Ist 
eigentlich nicht weiter schwer.

von Software-Entwickler (Gast)


Angehängte Dateien:

Lesenswert?

Und ueberhaupt: Warum machst du das nicht in C auf einem Mega 8? Ist 
doch genug Flash-Speicher vorhanden.

Hab mal ein Beispiel (hab ich damals fuer den ATTiny2313 gemacht, glaub 
ich) beigefuegt. Interrupts sind momentan auskommentiert.

Uebrigens: Servos sind nicht besonders genau in der Ansteuerung, je nach 
Hersteller verhalten die sich ein wenig anders, was die Pulsweite 
anbelangt.

von Daniel K. (Gast)


Lesenswert?

Erstmal Danke für die Hilfe,
ich versuche es jetzt mit PWM, melde mich nochmal, wenn ich Probleme 
habe.

MfG. Daniel

von Flieger (Gast)


Lesenswert?

Hallo,

ganz genau werden die 1-2ms von nahezu keinem Servo eingehalten. Es 
können auch mal 1,1-1,8ms sein oder ähnlich. Wenn der Servo an den 
Anschlag fährt und brummt bist du wahrscheinlich mit deiner Ansteuerung 
bei über 100%.

Gruß
Flieger

von Daniel K. (Gast)


Lesenswert?

Bei genauerer Betrachtung ist mir aufgefallen, das ich es im Prinzip 
doch genau so mache, wie im Abschnitt "PWM in Software" im AVR-Tutorial 
beschrieben. Es muss also einfach nur ein Problem mit dem Abstand der 
Impulse bzw. der Länge derselbigen geben. Wenn sich jemand mal meinen 
Quellcode anschauen und mir Tipps dazu geben könnte, wäre ich sehr 
dankbar.

MfG. Daniel

von Daniel K. (Gast)


Angehängte Dateien:

Lesenswert?

Sry für Doppelpost, habe aber gerade ein vergessenes rjmp eingefügt und 
nach einigem Debuggen jetzt auch Impulslaenge und -abstand einstellen 
können, aber das Servo macht immer noch nicht, was es soll. Jetzt ist es 
nur noch am Ticken, und zwar ziemlich schnell. Am RC-Empfänger 
funktioniert es einwandfrei.
Den geänderten Code hänge ich an.

MfG. Daniel

von Daniel K. (Gast)


Lesenswert?

Danke, hat sich erledigt, ich hatte den Pin, anstatt ihn auf Low zu 
setzen, High gesetzt, das signal war also genau andersrum, jetzt 
funktioniert alles prima.

MfG. Daniel

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
Noch kein Account? Hier anmelden.