Archiv verlassen und diese Seite im Standarddesign anzeigen : Beim abbiegen/ drehen blinken
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)
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)
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
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
> 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
Sobald ich keine Verbindung mehr zum RP6Loader hatte lief alles ohne reboot. Kann es denn dann an der Akkuleistung liegen?
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.
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 ^^
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.