PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Fragen eines RP6 Neulings



Goma
06.10.2011, 22:36
Hallo Roboternetz-Community,
habe mir vor kurzem den RP6 geholt und auch schon ein Testprogramm geschrieben gehabt um mich etwas mit C warm zu machen, da ich normalerweise (arbeitsbedingt) nur C++,C# und Co programmiere.
Habe nun nach einigen Tagen herumtestens ein paar Fragen bekommen, welche ich nicht direkt durch google (verweist meistens sowieso in dieses Forum) beantwortet bekommen habe.
Entschuldigung schonmal falls es doch irgendwo eine Antwort dazu gab oder die Frage offensichtlich etwas doof ist (und ja es gibt sicher doofe Fragen ;) ).

Hier mal meine Fragen:
1) Bei meinem Test Programm wollte ich die Bumper testen um darüber den Speed des RP6 zu steuern, dabei habe ich die Bedingung eingebaut das wenn beide Bumper gedrückt werden, er moveAtSpeed(0,0); setzen soll. Das klappt soweit auch alles, solange ich das ganze in einer Endlosschleife laufen lasse. Sobald ich allerdings in die Bedingung einbaue das er danach die Schleife verlassen soll, verlässt er zwar die Schleife (durch eine Textausgabe geprüft), setzt aber den moveAtSpeed nicht auf 0.
Kann mir einer dieses Phänomen erklären wieso man den moveAtSpeed in einer Endlosschleife laufen lassen muss, wenn ich den RP6 doch nur einmalig anhalten will?
2) Gibt es irgendwie eine Befehlsliste der Befehle des µC (bsp. Linker Motor drehen mit Speed x)? Ich wollte mir selber eine Lib schreiben um schneller zu verstehen was wann wo genau passiert und nicht die "vorgefertigten" Prozeduren vom RP6 zu benutzen, diese sind dort ja schon in eine "verständlichere" Sprache ummodeliert worden.
3) Gibt es die Möglichkeit das ganze auf C# zu adaptieren wenn man sich eine eigene Lib schreibt? Sowas hat doch sicher schonmal einer probiert oder?

Hoffe mir kann bei den Punkten jemand weiterhelfen.
Danke schonmal im voraus.

Gruß
Goma

fabqu
06.10.2011, 23:32
Hi!
Zu 1.) hab ich nur eine Idee:
setzt du den Speed irgendwo anders wieder auf einen anderen Wert? Dann kommt er nämlich nur "kurz" am moveAtSpeed(0,0) vorbei und bekommt dann einen neuen wert...
Zu 2.) schau mal ein, zwei Threads weiter unten, dort hat nil.at eine gute Zusammenstellung gebracht. Einfach runterladen
Zu 3. weiß ich leider auch keinen Rat, ich könnte mir es allerings schon vorstellen, solange Programmers Notepad (oder ein anderes Tool) das kann.

Grüße

Goma
07.10.2011, 00:39
Hallo,
danke für die schnelle Antwort.

Zu 1)
Hier mal mein Quellcode, wie gesagt ist nichts großes war nur zum Bumper und Motor testen. So wie er da steht ist es mit Endlosschleife da Abbruchbedingung x<4 ist und x nirgends 4< wird, so funktioniert es, lass ich dann beide Bumper los, fährt er auch wieder.
Änder ich allerdings die Abbruchbedingung in x<3 und drücke dann beide, müsste er ja den Motorspeed auf 0 setzen und dürfte nirgendwo sonst hinlaufen und danach nur noch die Ausgabe "Aus" ausgeben. Soweit tut er das auch bis eben auf den MotorSpeed.
Irgend eine Idee?


#include "RP6RobotBaseLib.h"

int main(void)
{
initRobotBase(); // Always call this first! The Processor will not work
// correctly otherwise.

setLEDs(0b111111); // Turn all LEDs on
mSleep(500); // delay 500ms
setLEDs(0b000000); // All LEDs off


//left_power = 5;
//right_power = 2;
powerON(); // Turn Encoders, Motor Current Sensors
changeDirection(FWD);
moveAtSpeed(0,0);
writeString("An\n");
int x = 0;
while(x<4)
{
if (bumper_left && bumper_right)
{
x=3;
writeString("Speed auf 0|0\n");
//while(bumper_left && bumper_right)
moveAtSpeed(0,0);
//task_RP6System();
//}
}
else if (bumper_right)
{
x=1;
moveAtSpeed(20,50);
writeString("Speed auf 20|50\n");
}
else if (bumper_left)
{
x=2;
moveAtSpeed(50,20);
writeString("Speed auf 50|20\n");
}
else if (!bumper_left && !bumper_right)
{
x=0;
moveAtSpeed(50,50);
writeString("Speed auf 50/50\n");
}
writeString("x="); writeInteger(x, DEC); writeString("\n");
task_RP6System();
}

writeString("Aus");
//stop();

return 0;
}


zu 2) ja den Thread habe ich gesehen, aber das ist nicht ganz das was ich suche. Das ist mehr oder weniger die Sammlung der premade RP6 Lib Prozeduren (z.B. eben die moveAtSpeed(x,y); Prozedur), welche mitgeliefert wird, ich suche allerdings viel mehr nach einer Erklärung der Befehle aus der sich dann diese fertigen Prozeduren zusammen setzen
Bsp: Prozedur getBumperLeft setzt sich aus folgendem zusammen:


uint8_t getBumperLeft(void)
{
PORTB &= ~SL6;
DDRB &= ~SL6;
nop();
uint8_t tmp = PINB & SL6;
if(statusLEDs.LED6) {
DDRB |= SL6;
PORTB |= SL6;
}
return tmp;
}

radbruch
07.10.2011, 01:17
Hallo

Versuche es mal so:


writeString("Aus\n");
//stop();

while(1) task_RP6System();
return 0;

moveAtSpeed(0,0); funktioniert mit Beschleunigungs- und Verzögerungsrampen die vom Tasksystem gesteuert werden. Mit isMovementComplete() kann man prüfen, ob beide Motoren bei PWM=0 angekommen sind.

Noch eine Alternative für den sofortigen Stop: move(0,FWD,0,BLOCKING);

Damit wird aber das Tasksystem "ausgehebelt", es ist das Ergebniss dieses Threads:
https://www.roboternetz.de/community/threads/49623-Bumper-betätigt-RP6-ignoriert-moveAtSpee-Befehl

Übrigends sollte ein Programm nie beendet werden, also immer in einer Endlosschleife vor dem return enden. (Deshalb hat meine Variante ein \n hinter "Aus"!)

Die Funktionen werden in der Library in den Dateien RP6RobotBase.h, RP6RobotBaseLib.h und RP6RobotBaseLib.c sowie in RP6Uart.c und .h definiert. Parametrierungen kann man in RP6Config.h ändern/anpassen.

Gruß

mic

Goma
09.10.2011, 20:52
Hi radbruch,
danke für die Aufklärung bzgl. des Speeds, werde das ganze mal Testen.

Wegen der Lib, genau in die habe ich geschaut (dort habe ich auch den Teil mit getBumperLeft her), Problem ist eben das ich die Befehle wie DDRB und PORTB nicht kennt und genau dafür eine Erklärung bräuchte, die gibts dort aber in der Lib leider nicht und es gibt ja noch mehr davon.

Gruß
Goma

radbruch
09.10.2011, 21:08
Hallo

http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Zugriff_auf_IO-Ports

Das hilft dir sicher weiter. Und dann natürlich das hier:
Schaltpläne des RP6: http://arexx.com/rp6/downloads/RP6_Schematics.zip
Datenblatt des Mega32: http://www.atmel.com/dyn/resources/prod_documents/doc2503.pdf

Gruß

mic

shedepe
10.10.2011, 19:08
Hey zu 3. Eine Portierung auf C# ist nicht möglich da C# einen nicht zu vernachlässigen Overhead erzeugt. D.h. es braucht, das .Net Framwork (das selbst mal in der kleinsten version viel zu groß für den Mega32 ist) und die CLR (Common Language Runtime) die den MSIL Code den dein C# Compiler erzeugt, just-in-time kompiliert. Auf einem PC (der wesentlich mehr Speicher und Rechenleistung besitzt) klappt das ohne Probleme. Auf einem Atmega 32 läuft das ganze allerdings nicht.