@radbruch: dein programm ist irgendwie fehlerhaft. gut du hast die # bei include vergessen aber auch mit der # lässt sich das programm nicht kompilieren....
gruß
Hallo,
ich hab das mal schnell für radbruch gemacht (keine Angst, will keinen Code klauen)
Code:/*RP6 steuert ein Servo an der SL1-LED mit Sleep() 1.5.2008 mic */ include "RP6RobotBaseLib.h" // Denn vollen Funktionsumfang der Lib bezahlen // wir mit den störenden Interrupts uint8_t stellzeit, servopos=15; // 15=Servomitte, Drehbereich ca. 5-25 //d.h. du setzt "servopos" auf einen Wert 5-25 entsprechend der Position, die der Servo anfahren soll int main(void) { initRobotBase(); setLEDs(0); // alle LEDs aus/kein Impuls, da da ja auch die Servos mit dranhängen--> Störsignale vermeiden while(1) { stellzeit=30; // Wiederholungen für Stellzeit vorbelegen (zeit in [20ms], wie lange der Servo zum stellen der Postition braucht) while(stellzeit--) // Wir geben dem Servo Zeit zum Positionieren { // und senden solange das Steuersignal setLEDs(1); // Servo Impuls Anfang sleep(servopos); // Sleep() läuft mit 10kHz: 15 entspricht 1,5ms setLEDs(0); // Servo Impuls Ende sleep(200-servopos); // Das Signal soll alle 20ms gesendet werden } // Am Ende der Schleife sollte das Servo im Ziel sein servopos+=5; // Nächste Position berechnen, kannst du natürlich auch anders, z.B. dass du Taster, Sensoren etc. einliest if(servopos > 25) servopos=5; // Ende Drehbereich, zurück auf andere Seite mSleep(500); // Platzhalter für andere Aufgaben } return(0); }
so, ich hoffe ich konnte dir nun etwas helfen, eventuell kann ich dir in ein bis zwei wochen eine noch genauere Lösung anbieten, meine Servolib
damit ruft man nurnoch task_Servos(Parameter); auf und als Parameter gibt man lediglich ein, welche Stellung der Servo annehmen soll, dabei sind allerdings ein paar #define's nötig...
MfG Pr0gm4n
PS: radbruch, wie lange braucht so ein Servo für linker Anschlag bis rechter Anschlag? (deine Miniservos z.B.)
@radbruch: dein programm ist irgendwie fehlerhaft. gut du hast die # bei include vergessen aber auch mit der # lässt sich das programm nicht kompilieren....
gruß
Sorry, das passiert, wenn man nach dem Editieren nicht mehr kompiliert:
Aber es war schon spät und eigentlich nicht schwer zu finden: das # bei include und // bei der ersten Zeile...Code:// RP6 steuert ein Servo an der SL1-LED mit Sleep() 1.5.2008 mic #include "RP6RobotBaseLib.h" // Denn vollen Funktionsumfang der Lib bezahlen // wir mit den störenden Interrupts uint8_t stellzeit, servopos=15; // 15=Servomitte, Drehbereich ca. 5-25 int main(void) { initRobotBase(); setLEDs(0); // alle LEDs aus/kein Impuls while(1) { stellzeit=30; // Wiederholungen für Stellzeit vorbelegen while(stellzeit--) // Wir geben dem Servo Zeit zum Positionieren { // und senden solange das Steuersignal setLEDs(1); // Servo Impuls Anfang sleep(servopos); // Sleep() läuft mit 10kHz: 15 entspricht 1,5ms setLEDs(0); // Servo Impuls Ende sleep(200-servopos); // Das Signal soll alle 20ms gesendet werden } // Am Ende der Schleife sollte das Servo im Ziel sein servopos+=5; // Nächste Position berechnen if(servopos > 25) servopos=5; // Ende Drehbereich, zurück auf andere Seite mSleep(500); // Platzhalter für andere Aufgaben } return(0); }
Mach hier den Wert schrittweise kleiner bis das Servo nicht mehr sauber alle Positionen anfährt:wie lange braucht so ein Servo für linker Anschlag bis rechter Anschlag?
stellzeit=30;
War das nötig? Ist es nun verständlicher? Und zum Code klauen: Selbstverständlich sind alle meine hier geposteten Codeschnippsel open-source...ich hab das mal schnell für radbruch gemacht (keine Angst, will keinen Code klauen)
Gruß
mic
Bild hier
Atmel’s products are not intended, authorized, or warranted for use
as components in applications intended to support or sustain life!
Hi radbruch,
aus meiner Sicht waren deine Kommentierungen sehr gut ausreichend, ich möchte hier nur auf
verweisenjetzt noch ne frage die hauptsächlich radbruch betrifft... und zwar, könntest du mir bitte speziell zu deinem geposteten servoprogramm noch mehr kommentare dazu schreiben?
wär voll nett, dann könnt ich nämlich das programm besser verstehen....
das mit dem codklauen etc. sagte ich, weil einige leute meinen, es wäre so wichtig, dass ihr name im code einkommentiert drinsteht, auch wenn ihn dann jemand anderer per copy & paste editiert, verwendet oder im Inet anbietet, ein Kumpel von mir iss da schonmal voll ausgerastet, dass ich seine dummen Kommentierungen gelöscht hab bzw. glaub sogar nur geändert hab
ich hab jetzt mal mein Servo-Ansteuerungsprogramm fertig, in wiefern ich es Open-Source mache steht noch nicht fest, aber vermutlich poste ich es einfach irgendwo bzw. da es mehr ne art Lib ist biete ich es irgendwo zum Download
es geht für alle Atmels mit maximal 266 MHz
@radbruch: Ich schick dir das Servoteil dann mal irgendwie, kann ich dir 1716 Codezeilen per PN schicken? Wäre nett wenn du dir das mal anschaust
Wenn du dich wunderst warum ich da einige Funktionen mit gleichem Namen drinnen habe, das sind sog. Überladene Funktionen, ich denke zwar, dass die nur der Compiler kann, aber die Herren im Unterforum AVR-C-Programmierung meinten, das ginge auch so, könnte aber auch sein, ich werds sehen...
MfG Pr0gm4n
danke. jetzt läuft des programm. wolltest du aber nicht in programm schreiben, wo den servo ständig von linken zu rechten schwenken lässt? jetzt schwenkt der motor mit 3 mal anhalten nach rechts und dann durchgehend nach links.
gruß
Hallo Pr0gm4n
...weil du den Beitrag und die Kommentare erst nach meinem Edit (Zuletzt bearbeitet von radbruch am 01.05.2008, 00:21, insgesamt ein Mal bearbeitet) gelesen hast. Die erste Version war völlig ohne Kommentare...aus meiner Sicht waren deine Kommentierungen sehr gut ausreichend
Danke für's Angebot, aber das ist wirklich nicht nötig. Du kannst deinen Entwurf auch in einem Thread zur Disskusion stellen. Ich hätte aber keinen Bedarf an einer Servo-Lib. Meiner Meinung nach sind Servoanwendungen meist Speziallösungen die man mit einer Lib nicht vereinfachen kann. Ich lasse mich aber gerne vom Gegenteil überzeugen.Ich schick dir das Servoteil dann mal irgendwie...
@proevofreak: Mehr kann das Programm nicht:
Es ging ja nur um die Theorie. Wie man das anwenden kann ist eure Aufgabe.Code:servopos+=5; // Nächste Position berechnen if(servopos > 25) servopos=5; // Ende Drehbereich, zurück auf andere Seite
Gruß
mic
Bild hier
Atmel’s products are not intended, authorized, or warranted for use
as components in applications intended to support or sustain life!
Hi,
ich versteh zwar nicht, warum der Servo am linken Anschlag bleibt, aber versuch doch mal das: (nichtmehr nur 3 mal Anhalten)
Ich hab auch das Stellzeit=30; vor die while-schleife um es nicht ständig neu definieren zu müssen, das spart rechenzeit -->ruckelnCode:// RP6 steuert ein Servo an der SL1-LED mit Sleep() 1.5.2008 mic #include "RP6RobotBaseLib.h" // Denn vollen Funktionsumfang der Lib bezahlen // wir mit den störenden Interrupts uint8_t stellzeit, servopos=15; // 15=Servomitte, Drehbereich ca. 5-25 int main(void) { initRobotBase(); setLEDs(0); // alle LEDs aus/kein Impuls stellzeit=30; // Wiederholungen für Stellzeit vorbelegen while(1) { while(stellzeit--) // Wir geben dem Servo Zeit zum Positionieren { // und senden solange das Steuersignal setLEDs(1); // Servo Impuls Anfang sleep(servopos); // Sleep() läuft mit 10kHz: 15 entspricht 1,5ms setLEDs(0); // Servo Impuls Ende sleep(200-servopos); // Das Signal soll alle 20ms gesendet werden } // Am Ende der Schleife sollte das Servo im Ziel sein servopos+=1; // Nächste Position berechnen if(servopos > 25) servopos=5; // Ende Drehbereich, zurück auf andere Seite mSleep(500); // Platzhalter für andere Aufgaben } return(0); }
ist zwar nur ein Takt, aber wenn man das immer macht kommt doch manchmal was mit 0.05 ms oder so zusammen, was das ruckeln erheblich verbessert
MfG Pr0gm4n
Hallo
Das ist völliger Quatsch! Mit dieser Änderung wird stellzeit nur einmalig mit 30 geladen, alle weiteren Schleifendurchgänge starten dann mit 255, weil stellzeit vom Anfahren der letzten Position mit 0 belegt war. Das wird nur nicht offensichtlich weil anschliesend immer ein mSleep(500); folgt. Wenn man das auskommentiert wird man sehen, dass die Wartezeit ab der zweiten Position deutlich größer ist. Zudem werden wohl einige Positionen übersprungen.Ich hab auch das Stellzeit=30; vor die while-schleife um es nicht ständig neu definieren zu müssen, das spart rechenzeit -->ruckeln
Auch das ist Unsinn. Die Impulslänge wird hier gebildet:ist zwar nur ein Takt, aber wenn man das immer macht kommt doch manchmal was mit 0.05 ms oder so zusammen, was das ruckeln erheblich verbessert
Einzig ein Interrupt kann die Ausführungsdauer von Sleep() beeinflussen. Ein Ausschalten der Interrupts mit cli()/sei() führt hier aber nicht zum Ziel...Code:setLEDs(1); // Servo Impuls Anfang sleep(servopos); // Sleep() läuft mit 10kHz: 15 entspricht 1,5ms setLEDs(0); // Servo Impuls Ende
Und schlieslich:Das Servo bleibt nicht am linken Anschlag sondern startet dort einen neuen Demozyklus. Genau das macht "if(servopos > 25) servopos=5;" Wenn Position größer rechts dann Position=links.ich versteh zwar nicht, warum der Servo am linken Anschlag bleibt
Gruß
mic
Bild hier
Atmel’s products are not intended, authorized, or warranted for use
as components in applications intended to support or sustain life!
Hi,
erstmal sorry für all den mist den ich da geschrieben hab, frag mich grad, wie ich darauf gekommen bin...
trotzdem eine Beanstandung:
Ich habe dabei darauf geantwortet:Und schlieslich:Zitat:
ich versteh zwar nicht, warum der Servo am linken Anschlag bleibt
Das Servo bleibt nicht am linken Anschlag sondern startet dort einen neuen Demozyklus. Genau das macht "if(servopos > 25) servopos=5;" Wenn Position größer rechts dann Position=links.
er hat gesagt, dass bei deinem Programm der Servo erst an einen Anschlag fährt und dann bleibt er stehen und dass er das nicht versteht warum...jetzt schwenkt der motor mit 3 mal anhalten nach rechts und dann durchgehend nach links.
dann habe ich gemeint, das könnte ich ihm auch nicht sagen, denn eigentlich müsste der Servo ja dauernd hin- und herfahren...
MfG Pr0gm4n
PS: ich mach nen Thread auf in AVR-C-Programmierung, die sollen sich den doch ma anschauen, ob alles passt
Sorry für meinen pampigen Ton...erstmal sorry für all den mist den ich da geschrieben hab, frag mich grad, wie ich darauf gekommen bin...
Gute Idee :)ich mach nen Thread auf in AVR-C-Programmierung
Bild hier
Atmel’s products are not intended, authorized, or warranted for use
as components in applications intended to support or sustain life!
Lesezeichen