PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Beim abbiegen/ drehen blinken



Ezalo
14.08.2010, 20:39
Guten Abend,

hab an meinen RP6 4 Gelbe LEDs angeklemmt, jeweils 2 links und 2 rechts.
Nun weiß ich absolut nicht weiter wie ich ihne dazu bekomme beim Drehen/ Abbiegen zu "blinken".

Dadurch das ich für das blinken eine eigene Funktion gemacht habe, bleibt er da in der while- Schleife hängen und blinkt ewig. Ich weiß aber absolut nicht wie ich es umändern könnte das es funktioniert.


#include "RP6RobotBaseLib.h"

void blink (void){
DDRA |= ADC1;
while(0){
PORTA |= ADC1;
mSleep(500);
PORTA &= ~ADC1;
mSleep(500);
}
}

int main (void){
initRobotBase();
powerON();
int i;
DDRC |= (SDA | SCL);
PORTC |= SDA;
for(i = 0; i < 2; i++){
PORTC &= ~SCL;
move(80, FWD, DIST_MM(700), BLOCKING);
blink();
rotate(60, RIGHT, 120, BLOCKING);
move(80, FWD, DIST_MM(700), BLOCKING);
blink();
rotate(60, RIGHT, 120, BLOCKING);
move(80, FWD, DIST_MM(700), BLOCKING);
blink();
rotate(60, RIGHT, 120, BLOCKING);
PORTC |= SCL;
mSleep(2500);
}
while(1){
task_RP6System();
}
return 0;
}

MfG

Ezalo

radbruch
14.08.2010, 20:51
So vielleicht:

void blink (void)
{
char anzahl=4; // viermal blinken
DDRA |= ADC1;
while(anzahl--)
{
PORTA |= ADC1;
mSleep(500);
PORTA &= ~ADC1;
mSleep(500);
}
}(ungetestet)

Ezalo
14.08.2010, 20:54
Hab halt den ganzen Tag schon gegrübelt obs auch irgendwie möglich ist solange zu blinken bis der Endpunkt von rotate erreicht ist. Daher bin ich auch garnicht auf sowas gekommen ^^

Ist das denn noch so möglich wie meine Gedanken waren?

Danke erstmal für die Idee.

Edit: Aber dann blinkt er ja wenn vor dem abbiegen und nicht während des abbiegens.

MfG

Ezalo

radbruch
14.08.2010, 21:24
Aber dann blinkt er ja (wenn) vor dem abbiegen und nicht während des abbiegens. Klar, das war ja deine Vorgabe:

blink();
rotate(60, RIGHT, 120, BLOCKING);

Erst wenn das Blinken beendet ist beginnt die Drehung. So wie du im Moment programmierst wird jeder Befehl bis zu seinem Ende ausgeführt und erst dann der nächste Befehl gestartet. Was dir jetzt noch fehlt ist das Task-System des RP6. Grundgerüst für eine Drehung mit gleichzeitigem Blinken wäre etwa so:


#include "RP6RobotBaseLib.h"

int main (void)
{
initRobotBase();
powerON();
int i;
DDRC |= (SDA | SCL);
PORTC |= SDA;
DDRA |= ADC1;
PORTA &= ~ADC1;
startStopwatch1();
for(i = 0; i < 6; i++)
{
PORTC &= ~SCL;
move(80, FWD, DIST_MM(700), BLOCKING);
rotate(60, RIGHT, 120, NON_BLOCKING);
setStopwatch1(0);
while(!isMovementComplete())
{
if(getStopwatch1() >= 200) PORTA |= ADC1;
if(getStopwatch1() >= 500) { PORTA &= ~ADC1; setStopwatch1(0); }
task_RP6System();
}

if(i==2 || i==5) // :)
{
PORTC |= SCL;
mSleep(2500);
}
}
while(1); // fertig
return 0;
}(ungetestet)

Ezalo
14.08.2010, 21:33
Nun weiß ich absolut nicht weiter wie ich ihne dazu bekomme beim Drehen/ Abbiegen zu "blinken".

Dadurch das ich für das blinken eine eigene Funktion gemacht habe, bleibt er da in der while- Schleife hängen und blinkt ewig. Ich weiß aber absolut nicht wie ich es umändern könnte das es funktioniert.

Aber das drückt ja eigentlich aus das ich nur nicht weiß wie ich das programmieren soll und es nicht dem entspricht was ich erreichen wollte :)

Und danke für den Code, werds mal testen

Edit: Funktioniert soweit nur die Blinkled bleibt an, aber das lässt sich ja lösen ^^ Ich hab auch das Problem das er seit heute mitten im Programm "abstürzt". Also das Programm startet, läuft ein Stück. Dann geht alles aus und er bootet neu. Was ist da los? :( <<-- Ist das ein Problem wenn ich das UART Kabel nicht entferne?

MfG

Ezalo

radbruch
14.08.2010, 21:47
Funktioniert soweit nur die Blinkled bleibt an,...Sorry:

while(!isMovementComplete())
{
if(getStopwatch1() >= 200) PORTA |= ADC1;
if(getStopwatch1() >= 500) { PORTA &= ~ADC1; setStopwatch1(0); }
task_RP6System();
}
PORTA &= ~ADC1; // LED ausschalten



Aber das drückt ja eigentlich aus...Meno, das habe ich "überlesen". Nochmals sorry ;)


Dann geht alles aus und er bootet neu.Akkus leer?

Du hast das schon recht gut im Griff ;)

Gruß

mic

Ezalo
14.08.2010, 23:31
1. Sorry: es stand doch ungetestet drunter, entfällt also ;o)
2. Sorry: Wie soll ich das jetzt verstehen? ^^
3. Akku leer?: Nein, UART Kabel entfernt -> kein reboot mehr bei Programmausführung :-/
4. Wie ich hab das schon gut im Griff?

MfG

Ezalo

rockin_santa
15.08.2010, 14:07
Ich würde das ganze Problem folgendermaßen angehen:

LEDs über TimerISR toggeln.
Blinkfrequenz mittels Timer konfigurieren und dann vor dem Fahrmanöver Timer starten und danach stoppen.

Finde diesen Ansatz jetzt recht einfach und obendrein hast Du keine Wartezeiten, die unnötig bremsen, oder habe ich ein Gegenargument zu der Timerlösung überlesen (Habe kein RP6)?

Gruß

rockin_santa

radbruch
15.08.2010, 14:38
Hallo


...vor dem Fahrmanöver Timer starten und danach stoppen.Das ist im Prinzip schon richtig. Allerdings muss man beachten, dass der RP6 quasi ein eigenes "Betriebssystem" besitzt. Seine Library befindet sich zwischen seiner Hardware und dem Programm und steuert alle Zugriffe auf den RP6 mit seinem Task-System. Deshalb halte ich die Verwendung der Stopwatches() für die besser Lösung.

Gruß

mic

SlyD
15.08.2010, 15:13
> Akkus

das hatten wir ja schon in einem anderen Thread... teste doch mal wie stark die Akkuspannung im Selbsttest Test #8 bei verschiedenen Geschwindigkeiten einbricht (UBat Wert am ende der Ausgabezeilen beachten).

Natürlich im aktuellen Zustand der Akkus! Und danach dann mal alle einzeln aufladen und nochmal testen...

MfG,
SlyD

Ezalo
15.08.2010, 15:48
Sobald ich keine Verbindung mehr zum RP6Loader hatte lief alles ohne reboot. Kann es denn dann an der Akkuleistung liegen?

SlyD
15.08.2010, 16:00
Teste es doch bitte einfach damit - es geht ja auch darum ob das Testprogramm fehlerfrei läuft und nicht abstürzt währenddessen.

Btw. wenn Du den RP6 mit angestecktem USB Interface fahren lässt, kann es auch sein das das USB Kabel oder das Flachbandkabel "wackeln" und dadurch ein Reset ausgelöst wird.
Also mal den RP6 in der Hand halten und schauen obs dann auch noch passiert.


MfG,
SlyD

PS:
Wenns so funktioniert, wackel mal absichtlich am USB Kabel und am 10 Pol. Stecker.

Ezalo
15.08.2010, 16:15
Kompletter Testdurchlauf: 7,71V - 7,56V

Kabel/ Steckverbindungen "abgewackelt" - kein reboot

Eigenes Programm wieder geflast -> Probelauf mit wackeln - kein reboot

Ist natürlich etwas blöd das der Fehler jetzt weg ist, aber auch gut so ^^