So vielleicht:
(ungetestet)Code:void blink (void) { char anzahl=4; // viermal blinken DDRA |= ADC1; while(anzahl--) { PORTA |= ADC1; mSleep(500); PORTA &= ~ADC1; mSleep(500); } }
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.
MfGCode:#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; }
Ezalo
So vielleicht:
(ungetestet)Code:void blink (void) { char anzahl=4; // viermal blinken DDRA |= ADC1; while(anzahl--) { PORTA |= ADC1; mSleep(500); PORTA &= ~ADC1; mSleep(500); } }
Bild hier
Atmel’s products are not intended, authorized, or warranted for use
as components in applications intended to support or sustain life!
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
Klar, das war ja deine Vorgabe:Aber dann blinkt er ja (wenn) vor dem abbiegen und nicht während des abbiegens.
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:
(ungetestet)Code:#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; }
Bild hier
Atmel’s products are not intended, authorized, or warranted for use
as components in applications intended to support or sustain life!
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 wollteNun 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.
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
Sorry:Funktioniert soweit nur die Blinkled bleibt an,...
Code:while(!isMovementComplete()) { if(getStopwatch1() >= 200) PORTA |= ADC1; if(getStopwatch1() >= 500) { PORTA &= ~ADC1; setStopwatch1(0); } task_RP6System(); } PORTA &= ~ADC1; // LED ausschaltenMeno, das habe ich "überlesen". Nochmals sorry ;)Aber das drückt ja eigentlich aus...
Akkus leer?Dann geht alles aus und er bootet neu.
Du hast das schon recht gut im Griff ;)
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!
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
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
Hallo
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....vor dem Fahrmanöver Timer starten und danach stoppen.
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!
> 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
Lesezeichen