-
hallo,
hast du den code, den ich oben gepostet habe mal getestet? funktioniert der auch nicht?
du musst den zähler auch wieder auf 0 setzen, bevor du immer weiter hoch zählst.
also so irgendwie:
mfg jeffrey
Code:
//----------------------------------------------------------------------------------
//Projekt: HAUS VOM NIKOLAUS
//----------------------------------------------------------------------------------
#include "asuro.h"
#define TRIGGERLEVEL 680
#define HYSTERESIS 30
#define LOW 0
#define HIGH 1
//----------------------------------------------------------------------------------
//Variablen deklarieren
//----------------------------------------------------------------------------------
unsigned int data [2];
signed int status [2]={0,0};
unsigned int speed=255;
//Startwert für halbe Motorgeschwindigkeit
signed int difference=0;
unsigned int distance=0;
int i;
int zaehler=0;
//----------------------------------------------------------------------------------
//Unterprogramm Odometrie
//----------------------------------------------------------------------------------
void Odometrie (void)
{
//Helligkeitswerte der Lichtschranken auslesen
OdometrieData(data);
//Wechsel linker Sensor von niedrig auf hoch?
if((status[0]==LOW)&&(data[0]>TRIGGERLEVEL+HYSTERESIS)) {
status[0]=HIGH;
difference++;
distance++; }
//Wechsel linker Sensor von hoch auf niedrig?
if((status[0]==HIGH)&&(data[0]<TRIGGERLEVEL-HYSTERESIS)) {
status[0]=LOW;
difference++;
distance++; }
//Wechsel rechter Sensor von niedrig auf hoch?
if((status[1]==LOW)&&(data[1]>TRIGGERLEVEL+HYSTERESIS)) {
status[1]=HIGH;
difference--; }
//Wechsel rechter Sensor von hoch auf niedrig?
if((status[1]==HIGH)&&(data[1]<TRIGGERLEVEL-HYSTERESIS)) {
status[1]=LOW;
difference--; }
//zur Sicherheit: verhindern, dass der Differenzzähler den erlaubten
//Wertebereich verlässt
if(difference<-155) difference=-155;
if(difference>155) difference=155;
//StatusLED noch entsprechend der erkannten Segmente aufleuchten
//lassen, grün für links, rot für rechts
StatusLED(status[0]+status[1]*2);
//Zähldifferenz passemd auf die Motoren verteilen
if(difference>0) MotorSpeed(155-difference,155);
else MotorSpeed(155,155+difference);
}
//----------------------------------------------------------------------------------
//Unterprogramm Haus (Quadrat, Kantenlänge 29cm)
//----------------------------------------------------------------------------------
void Haus (void)
{
//Schleife (wird 4mal ausgeführt), da 4 Seiten
while (zaehler<4)
{
switch(distance)
{
//Hausseite
case 0: MotorDir(FWD,FWD);
MotorSpeed(speed,speed);
break;
case 110: speed=200;
break;
case 120: speed=150;
break;
//Drehung nach links, 90°
case 145: MotorDir(BREAK,BREAK);
for (i=0; i<100; i++)
{
Sleep(255);
}
MotorDir(RWD,FWD);
speed=255;
distance=146;
break;
case 176: speed=200;
break;
case 182: speed=150;
break;
//stehen bleiben und kurz warten
case 186: MotorDir(BREAK,BREAK);
for (i=0; i<100; i++)
{
Sleep(255);
}
MotorDir(FWD,FWD);
speed=255;
//zurück zum Anfang
distance=0;
//Schleifenzähler
zaehler++;
break;
}
Odometrie();
}
//stehen bleiben, nachdem ASURO ein Quadrat gefahren ist
MotorDir(BREAK,BREAK);
}
//--------------------------------------------------------------------------------
//Unterprogramm Dach1 (Diagonale 1, 41cm; Dach Seite 1, 19cm)
//--------------------------------------------------------------------------------
void Dach1 (void)
{
zaehler=0;
while(zaehler<1)
{
switch(distance)
{
//Drehung nach links, 45°
case 0: MotorDir(RWD,FWD);
MotorSpeed(speed,speed);
distance=1;
break;
case 10: speed=200;
break;
case 15: speed=150;
break;
//Diagonale 1
case 21: MotorDir(BREAK,BREAK);
for (i=0; i<100; i++)
{
Sleep(255);
}
MotorDir(FWD,FWD);
MotorSpeed(speed,speed);
break;
case 190: speed=200;
break;
case 200: speed=150;
break;
//Drehung nach rechts, 95°
case 227: MotorDir(BREAK,BREAK);
for (i=0; i<100; i++)
{
Sleep(255);
}
MotorDir(FWD,RWD);
speed=255;
distance=228;
break;
case 248: speed=200;
break;
case 258: speed=150;
break;
//Dach Seite 1, linke Seite
case 268: MotorDir(BREAK,BREAK);
for (i=0; i<100; i++)
{
Sleep(255);
}
MotorDir(FWD,FWD);
speed=255;
distance=269;
break;
case 340: speed=200;
break;
case 350: speed=150;
break;
case 363: MotorDir(BREAK,BREAK);
for (i=0; i<100; i++)
{
Sleep(255);
}
zaehler++;
break;
}
Odometrie();
}
MotorDir(BREAK,BREAK);
}
//---------------------------------------------------------------------------------
//Unterprogramm Dach2 (Diagonale 2, 41cm; Dach Seite 2, 19cm)
//---------------------------------------------------------------------------------
void Dach2 (void)
{
zaehler=0;
while(zaehler<1)
{
switch(distance)
{
//Drehung nach rechts, 80°
case 0: MotorDir(RWD,FWD);
MotorSpeed(speed,speed);
distance=1;
break;
case 25: speed=200;
break;
case 30: speed=150;
break;
//Dach Seite 2, rechte Seite
case 37: MotorDir(BREAK,BREAK);
for (i=0; i<100; i++)
{
Sleep(255);
}
MotorDir(FWD,FWD);
MotorSpeed(speed,speed);
break;
case 110: speed=200;
break;
case 120: speed=150;
break;
//Drehung nach rechts, 95°
case 131: MotorDir(BREAK,BREAK);
for (i=0; i<100; i++)
{
Sleep(255);
}
MotorDir(FWD,RWD);
speed=255;
distance=132;
break;
case 150: speed=200;
break;
case 160: speed=150;
break;
//Diagonale 2
case 171: MotorDir(BREAK,BREAK);
for (i=0; i<100; i++)
{
Sleep(255);
}
MotorDir(FWD,FWD);
speed=255;
distance=172;
break;
case 340: speed=200;
break;
case 350: speed=150;
break;
case 377: MotorDir(BREAK,BREAK);
for (i=0; i<100; i++)
{
Sleep(255);
}
zaehler++;
break;
}
Odometrie();
}
MotorDir(BREAK,BREAK);
}
//-----------------------------------------------------------------------------------
//Hauptprogramm
//-----------------------------------------------------------------------------------
int main (void)
{
Init();
while(zaehler<1)
{
BackLED(OFF,OFF);
StatusLED(OFF);
FrontLED(ON);
Haus();
FrontLED(OFF);
StatusLED(RED);
//MotorDir(FWD,FWD);
Dach1();
StatusLED(GREEN);
//MotorDir(FWD,FWD);
Dach2();
BackLED(ON,ON);
zaehler++;
}
return 0;
}
denke allerdings, dass dieses programm genau das gleiche macht wie meines von oben, vielleicht habe ih ja au nen denkfehler drin.
mfg jeffey
-
Hm ich dachte eigentlich, dass jedes Unterprogramm auf meine oben deklarierten Variablen zugreift. Sonst müsste ich sie ja immer wieder deklarieren und oben hab ich ja bereits den zaehler sowie distance auf 0 gesetzte.
Was ist eigentlich der Unterschied zwischen void Haus (void) und void Haus ()??
-
hi,
natürlich greifft jedes unterprogramm auf diese variable zu, allerdings hat die variable weiterhin den wert, den sie nach dem letzten unterprogramm hatte.
bei den fragen zum unterschied kann ich dir nix sagen, bin nicht mehr so drin in c, habe es schon lange nicht mehr verwendet.
mfg jeffrey
edit: ich weiß auch nicht, ob meine codevorschläge so funktionieren, habe selbst eider keinen asuro, und selbst wenn, hätte ich nicht das privileg während der "arbeit", obwohl dipl arbeit machen auch nicht richtig arbeiten ist, damit spielen und das testen zu können.
-
ok, Danke.
Er kommt inzwischen in das 2te Unterprogramm, bleibt aber manchmal drin hängen...
Vlt kann mir das mit dem void Haus(void) und void Haus() jemand anderes erklären!
-
Hi,
das hängen bleiben kommt denke ich vom case, also wenn dein distance > als 363 ist, dann wird dein stopp übersrungen. kann man auch den case distance>= 363 verwenden? dann nimm den, oder falls das nicht geht, lass den letzten case weg, und mache dafür eine if abfragen, also
Code:
if(distance>=363)
{
MotorDir(BREAK,BREAK);
for (i=0; i<100; i++)
{
Sleep(255);
}
zaehler++;
}
vielleicht hilft das, oder wo im unterprogramm bleibt es hängen?
gruß jeffrey
-
Er fährt mir nun mein Haus vom Nikolaus.. manchmal bleibt er stehn, dann muss man ihn einfach nochmal starten...
Hab das nun garnicht mit dem distance >363 gemacht... geht auch so, wenn man distance wieder auf null setzt.
Mein code sieht also so aus:
Code:
//----------------------------------------------------------------------------------
//Projekt: HAUS VOM NIKOLAUS
//----------------------------------------------------------------------------------
#include "asuro.h"
#define TRIGGERLEVEL 680
#define HYSTERESIS 30
#define LOW 0
#define HIGH 1
//----------------------------------------------------------------------------------
//Variablen deklarieren
//----------------------------------------------------------------------------------
unsigned int data [2];
signed int status [2]={0,0};
unsigned int speed=255;
//Startwert für halbe Motorgeschwindigkeit
signed int difference=0;
unsigned int distance=0;
int i;
int zaehler=0;
//----------------------------------------------------------------------------------
//Unterprogramm Odometrie
//----------------------------------------------------------------------------------
void Odometrie (void)
{
//Helligkeitswerte der Lichtschranken auslesen
OdometrieData(data);
//Wechsel linker Sensor von niedrig auf hoch?
if((status[0]==LOW)&&(data[0]>TRIGGERLEVEL+HYSTERESIS)) {
status[0]=HIGH;
difference++;
distance++; }
//Wechsel linker Sensor von hoch auf niedrig?
if((status[0]==HIGH)&&(data[0]<TRIGGERLEVEL-HYSTERESIS)) {
status[0]=LOW;
difference++;
distance++; }
//Wechsel rechter Sensor von niedrig auf hoch?
if((status[1]==LOW)&&(data[1]>TRIGGERLEVEL+HYSTERESIS)) {
status[1]=HIGH;
difference--; }
//Wechsel rechter Sensor von hoch auf niedrig?
if((status[1]==HIGH)&&(data[1]<TRIGGERLEVEL-HYSTERESIS)) {
status[1]=LOW;
difference--; }
//zur Sicherheit: verhindern, dass der Differenzzähler den erlaubten
//Wertebereich verlässt
if(difference<-155) difference=-155;
if(difference>155) difference=155;
//StatusLED noch entsprechend der erkannten Segmente aufleuchten
//lassen, grün für links, rot für rechts
StatusLED(status[0]+status[1]*2);
//Zähldifferenz passemd auf die Motoren verteilen
if(difference>0) MotorSpeed(155-difference,155);
else MotorSpeed(155,155+difference);
}
//----------------------------------------------------------------------------------
//Unterprogramm Haus (Quadrat, Kantenlänge 29cm)
//----------------------------------------------------------------------------------
void Haus (void)
{
distance=0;
zaehler=0;
//Schleife (wird 4mal ausgeführt), da 4 Seiten
while (zaehler<4)
{
switch(distance)
{
//Hausseite
case 0: MotorDir(FWD,FWD);
MotorSpeed(speed,speed);
break;
case 110: speed=200;
break;
case 120: speed=150;
break;
//Drehung nach links, 90°
case 145: MotorDir(BREAK,BREAK);
for (i=0; i<100; i++)
{
Sleep(255);
}
MotorDir(RWD,FWD);
speed=255;
distance=146;
break;
case 176: speed=200;
break;
case 182: speed=150;
break;
//stehen bleiben und kurz warten
case 186: MotorDir(BREAK,BREAK);
for (i=0; i<100; i++)
{
Sleep(255);
}
MotorDir(FWD,FWD);
speed=255;
//zurück zum Anfang
distance=0;
//Schleifenzähler
zaehler++;
break;
}
Odometrie();
}
//stehen bleiben, nachdem ASURO ein Quadrat gefahren ist
MotorDir(BREAK,BREAK);
}
//--------------------------------------------------------------------------------
//Unterprogramm Dach1 (Diagonale 1, 41cm; Dach Seite 1, 19cm)
//--------------------------------------------------------------------------------
void Dach1 (void)
{
distance=0;
zaehler=0;
while(zaehler<1)
{
switch(distance)
{
//Drehung nach links, 45°
case 0: MotorDir(RWD,FWD);
MotorSpeed(speed,speed);
distance=1;
break;
case 10: speed=200;
break;
case 15: speed=150;
break;
//Diagonale 1
case 21: MotorDir(BREAK,BREAK);
for (i=0; i<100; i++)
{
Sleep(255);
}
MotorDir(FWD,FWD);
MotorSpeed(speed,speed);
break;
case 190: speed=200;
break;
case 200: speed=150;
break;
//Drehung nach rechts, 95°
case 227: MotorDir(BREAK,BREAK);
for (i=0; i<100; i++)
{
Sleep(255);
}
MotorDir(FWD,RWD);
speed=255;
distance=228;
break;
case 248: speed=200;
break;
case 258: speed=150;
break;
//Dach Seite 1, linke Seite
case 268: MotorDir(BREAK,BREAK);
for (i=0; i<100; i++)
{
Sleep(255);
}
MotorDir(FWD,FWD);
speed=255;
distance=269;
break;
case 340: speed=200;
break;
case 350: speed=150;
break;
case 363: MotorDir(BREAK,BREAK);
for (i=0; i<100; i++)
{
Sleep(255);
}
break;
zaehler++;
}
Odometrie();
}
MotorDir(BREAK,BREAK);
}
//---------------------------------------------------------------------------------
//Unterprogramm Dach2 (Diagonale 2, 41cm; Dach Seite 2, 19cm)
//---------------------------------------------------------------------------------
void Dach2 (void)
{
while(zaehler<1)
{
switch(distance)
{
//Drehung nach rechts, 80°
case 0: MotorDir(RWD,FWD);
MotorSpeed(speed,speed);
distance=1;
break;
case 25: speed=200;
break;
case 30: speed=150;
break;
//Dach Seite 2, rechte Seite
case 37: MotorDir(BREAK,BREAK);
for (i=0; i<100; i++)
{
Sleep(255);
}
MotorDir(FWD,FWD);
MotorSpeed(speed,speed);
break;
case 110: speed=200;
break;
case 120: speed=150;
break;
//Drehung nach rechts, 95°
case 131: MotorDir(BREAK,BREAK);
for (i=0; i<100; i++)
{
Sleep(255);
}
MotorDir(FWD,RWD);
speed=255;
distance=132;
break;
case 150: speed=200;
break;
case 160: speed=150;
break;
//Diagonale 2
case 171: MotorDir(BREAK,BREAK);
for (i=0; i<100; i++)
{
Sleep(255);
}
MotorDir(FWD,FWD);
speed=255;
distance=172;
break;
case 340: speed=200;
break;
case 350: speed=150;
break;
case 377: MotorDir(BREAK,BREAK);
for (i=0; i<100; i++)
{
Sleep(255);
}
break;
zaehler++;
}
Odometrie();
}
MotorDir(BREAK,BREAK);
}
//-----------------------------------------------------------------------------------
//Hauptprogramm
//-----------------------------------------------------------------------------------
int main (void)
{
Init();
while(zaehler<1)
{
BackLED(OFF,OFF);
StatusLED(OFF);
FrontLED(ON);
Haus();
FrontLED(OFF);
StatusLED(RED);
Dach1();
StatusLED(OFF);
StatusLED(GREEN);
Dach2();
BackLED(ON,ON);
zaehler++;
}
return 0;
}
Werde nun meine Winkel noch ein wenig verfeinern und dann mal mein Ergebnis dem Wettbewerb präsentieren.
-
variablen, die ausserhalb der main-funktion deklariert wurden, sind global und können überall im programm verwendet werden. nachteil: sie ligen dauerhaft im speicher, auch wenn sie gerade nicht verwendet werden, und der ist natürlich stark begrenzt.
void steht am anfang: die funktion hat keinen rückgabewert (zB Odometriedata)
bei pollswitch zB steht hier char (oder unsigned char?), welcher zurückgegeben wird.
void steht in den klammern: die funktion benötigt keine argumente bzw übergabewerte, zB PollSwitch. Motordir hingegen bekommt die richtungen übergeben.
-
Hi,
und hast du den Wettbewerb gewonnen?
MfG Jeffrey