Andreas Bullmann
08.03.2013, 19:02
Halli Hallo
ich hab da mal ne Frage ...
Und zwar versuche ich grad über das Programmers Notepad von WinAVR einen Asuro zu programmieren, damit der dann eine Kollision erkennt und dann "ausparkt" umdreht und weiterfährt.
Blöderweise funzt das mit der while Schleife nicht so ganz. Setze ich das Switch= PollSwitch() davor, fährt der nur geradeaus, setze ich das drunter, macht der nur die Unterprogramme und leuchtet nur mal kurz vorne zum Zeichen der main function.
Könntet ihr da mal drüberschauen und mir evtl. sagen was ich falsch mache? Wäre echt lieb.
Die Taster sind aber noch alle intakt, das habe ich schon getestet, indem ich die Unterprogrammaufrufe auskommentiert habe.
Der geht momentan auch davon aus, dass er direkt beim starten seines Programmes ein Hindernis auf der rechten Seite hat.
Achso, bevor ichs vergesse. Den Asuro hab ich schon zusammengelötet bekommen. Allerdings sind die Motoren falsch herum angelötet worden, sodass der Befehlsaufruf MotorDir(FWD,FWD); dafür sorgt, dass der kleine rückwärts fährt, also nicht wundern warum der Quelltext sagt, dass der Roboter rückwärts fahren soll.
/************************************************** *************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* any later version. *
************************************************** *************************/
#include<asuro.h>
void sleep_ms(int ms){
while(ms>0){
Sleep(72);
ms=ms-1;
}
}
void hindernis_rechts(void){
MotorDir(BREAK,BREAK);
MotorSpeed(0,0);
sleep_ms(2000);
FrontLED(OFF);
StatusLED(YELLOW);
BackLED(ON,ON);
MotorDir(FWD,FWD);
MotorSpeed(100,50);
sleep_ms(2000);
BackLED(OFF,OFF);
MotorDir(BREAK,BREAK);
MotorSpeed(0,0);
sleep_ms(5000);
main();
}
void hindernis_links(void){
MotorDir(BREAK,BREAK);
MotorSpeed(0,0);
sleep_ms(2000);
FrontLED(OFF);
StatusLED(YELLOW);
BackLED(ON,ON);
MotorDir(FWD,FWD);
MotorSpeed(50,100);
sleep_ms(2000);
BackLED(OFF,OFF);
MotorDir(BREAK,BREAK);
MotorSpeed(0,0);
sleep_ms(5000);
main();
}
void main (void){
unsigned int Switch;
Init();
while(1){
FrontLED(ON);
StatusLED(GREEN);
MotorDir(RWD,RWD);
MotorSpeed(175,175);
Switch=PollSwitch();
if (Switch!=0){
StatusLED(RED);
if(Switch<=7){
BackLED(OFF,ON);
hindernis_rechts();
}
else
BackLED(ON,OFF);
hindernis_links();
}
else
BackLED(OFF,OFF);
}
}
ich hab da mal ne Frage ...
Und zwar versuche ich grad über das Programmers Notepad von WinAVR einen Asuro zu programmieren, damit der dann eine Kollision erkennt und dann "ausparkt" umdreht und weiterfährt.
Blöderweise funzt das mit der while Schleife nicht so ganz. Setze ich das Switch= PollSwitch() davor, fährt der nur geradeaus, setze ich das drunter, macht der nur die Unterprogramme und leuchtet nur mal kurz vorne zum Zeichen der main function.
Könntet ihr da mal drüberschauen und mir evtl. sagen was ich falsch mache? Wäre echt lieb.
Die Taster sind aber noch alle intakt, das habe ich schon getestet, indem ich die Unterprogrammaufrufe auskommentiert habe.
Der geht momentan auch davon aus, dass er direkt beim starten seines Programmes ein Hindernis auf der rechten Seite hat.
Achso, bevor ichs vergesse. Den Asuro hab ich schon zusammengelötet bekommen. Allerdings sind die Motoren falsch herum angelötet worden, sodass der Befehlsaufruf MotorDir(FWD,FWD); dafür sorgt, dass der kleine rückwärts fährt, also nicht wundern warum der Quelltext sagt, dass der Roboter rückwärts fahren soll.
/************************************************** *************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* any later version. *
************************************************** *************************/
#include<asuro.h>
void sleep_ms(int ms){
while(ms>0){
Sleep(72);
ms=ms-1;
}
}
void hindernis_rechts(void){
MotorDir(BREAK,BREAK);
MotorSpeed(0,0);
sleep_ms(2000);
FrontLED(OFF);
StatusLED(YELLOW);
BackLED(ON,ON);
MotorDir(FWD,FWD);
MotorSpeed(100,50);
sleep_ms(2000);
BackLED(OFF,OFF);
MotorDir(BREAK,BREAK);
MotorSpeed(0,0);
sleep_ms(5000);
main();
}
void hindernis_links(void){
MotorDir(BREAK,BREAK);
MotorSpeed(0,0);
sleep_ms(2000);
FrontLED(OFF);
StatusLED(YELLOW);
BackLED(ON,ON);
MotorDir(FWD,FWD);
MotorSpeed(50,100);
sleep_ms(2000);
BackLED(OFF,OFF);
MotorDir(BREAK,BREAK);
MotorSpeed(0,0);
sleep_ms(5000);
main();
}
void main (void){
unsigned int Switch;
Init();
while(1){
FrontLED(ON);
StatusLED(GREEN);
MotorDir(RWD,RWD);
MotorSpeed(175,175);
Switch=PollSwitch();
if (Switch!=0){
StatusLED(RED);
if(Switch<=7){
BackLED(OFF,ON);
hindernis_rechts();
}
else
BackLED(ON,OFF);
hindernis_links();
}
else
BackLED(OFF,OFF);
}
}