könntest du mir anhand dem Programm welches ich gesendet habe, aufzeigen? lg
Hallo
Die Drehrichtungen der Antriebe kann man mit setMotorDir() aus der Library RP6RobotBaseLib.c festlegen:
Wie beschrieben sollten die Drehrichtungen nicht bei Vollgas umgeschaltet werden!Code:/** * Sets the rotation direction of both motors. * * DO NOT CHANGE THE DIRECTION OF THE MOTORS WHILE THEY * ARE RUNNING AT HIGH SPEEDS!!! * It will not instantly damage the motors/gears, but they will * wear out much faster if you do it at high speeds - better wait * until speed has slowed down - and change direction AFTER this. * * ------------------------------------------------------------- * IT IS A BETTER IDEA NOT TO USE THIS FUNCTION AT ALL! * Use moveAtSpeed together with task_motionControl instead. * YOU CAN NOT USE setMotorPower AND setMotorDir WHEN YOU USE * task_motionControl! This will not work! * ------------------------------------------------------------- * * task_motionControl also ensures that the direction is changed * slowly and only after the motors have stopped! * * Example: * // DO NOT perform these commands directly after each * // other in your programs - this is just a LIST of possible * // combinations: * setMotorDir(FWD,FWD); // Move forwards * setMotorDir(BWD,FWD); // Rotate right * setMotorDir(FWD,BWD); // Rotate left * setMotorDir(BWD,BWD); // Move backwards * */ void setMotorDir(uint8_t left_dir, uint8_t right_dir) { mleft_dir = left_dir; mright_dir = right_dir; mleft_des_dir = left_dir; mright_des_dir = right_dir; if(left_dir) PORTC |= DIR_L; else PORTC &= ~DIR_L; if(right_dir) PORTC |= DIR_R; else PORTC &= ~DIR_R; }
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!
könntest du mir anhand dem Programm welches ich gesendet habe, aufzeigen? lg
Hi EK9,
sorry, aber da wirst du selber ran müssen. In dem Forum wird keiner für dich den Code umschreiben
Schau mal in die Anleitung und in die Beispielprogramme. Dort findest du viele Beispiele und Erklärungen zu den ganzen Funktionen, auch zu setMotorDir() usw.
Ist gar nicht so schwer, und durch ausprobieren lernst du mehr als durch ablesen.
Wenns dann scheitert, hilft dir hier sicherlich jeder herauszufinden, warum!
habe schon ein paar sachen ausprobiert und mit den beispielprogrammen wurde ich auch nicht fündig
Die Funktion setMotorDir() kannst du dir - wie schon von Radbruch gezeigt - in der RP6RobotBaseLib.c ansehen, wie sie verwendet wird z.B. in RP6Base_SELFTEST.c
Dort findet sich z.B. setMotorDir(FWD,FWD); ... wobei FWD wiederum in der RP6RobotBaseLib.h definiert ist, ebenso wie eine Zeile tiefer der Rückwärtsgang...
Einfach mal selber suchen und lesen... und nicht andere suchen lassen... so lernt man nichts.
Gruß Rolf
Sind Sie auch ambivalent?
Möchte den Arexx vom Start an rückwärts laufen lassen und nicht umschalten
Danke euch, bin leider noch nicht der Prof beim RP6. setMotorDir(BWD,BWD);
komme aus dem staunen kaum raus das es nur nach dem einfügen dieses Satzes funkioniert.
Aha! ok.. man muss auch nicht Prof sein um mit dem RP6 was zu machen.. lesen, lernen und umsetzen hilft meist schon.
Die Erklärung dazu: Mit SetMotorDir setzt man "eiskalt" die Drehrichtung der Ketten/Motoren wobei der Befehl eben direkt und schlagartig in die Hardware greift. Es gibt noch andere Befehle für den Motor, die z.B auch verhindern das man sich mit dem SetMotorDir das Getriebe schrottet - indem Anfahr- und Bremsrampen vor einem Richtungswechsel genutzt werden. Da Du nun schon mal was in den Quellcodes gefunden hast, sollte es dir nicht schwer fallen, z.B. alle Textstellen mit "Motor" zu suchen und durchzuarbeiten. Usw. usw. usw... Learning by doing.
Gruß Rolf
Geändert von RolfD (18.11.2013 um 00:56 Uhr)
Sind Sie auch ambivalent?
Guten Abend, kann mir jemand diese einzelnen Instruktionen erklären, was diese heissen?
void setMotorPWM(uint8_t power_links, uint8_t power_rechts)
{
extern uint8_t mleft_ptmp, mright_ptmp;
if(power_links > 210) power_links = 210;
if(power_rechts > 210) power_rechts = 210;
mleft_power=mleft_ptmp=power_links;
mright_power=mright_ptmp=power_rechts;
OCR1BL = power_links;
OCR1AL = power_rechts;
if(power_links || power_rechts)
TCCR1A = (1 << WGM11) | (1 << COM1A1) | (1 << COM1B1);
else
TCCR1A = 0;
Hallo
Es ist mir völlig unklar, warum du dich bei der umfangreichen RP6-Library ausgerechnet auf diese Funktion stürzt anstatt die Library anhand ihrer einzelnen Demoprogramme zu erkunden. Der RP6 ist so komplex, da wirst du nicht weit kommen, wenn du nicht etwas Eigeninitiative entwickelst.
Kurz zur Funktion setMotorPWM(). Sie dient dazu die PWM-Werte für die Antriebe direkt zu setzen und die entsprechenden Variablen der Library anzupassen:
Die erste Hälfte stellt den Bezug zu den in der Library verwendeten Variablen her, begrenzt die PWM-Werte auf den in der Lib verwendeten und in dieser Timerbetriebsart durch das ICRA-Register gesetzten Maximalwert von 210 und lädt schließlich die Libraryvariablen mit den geänderten Werten. Im zweiten Teil der Funktion werden die Compare-Register der beiden Seiten mit dem PWM-Wert geladen und der Timer aktiviert, wenn die PWM-Werte dies erfordern.
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!
Lesezeichen