G3tzR@zor
19.05.2009, 15:58
Hi@all,
ich habe zufällig im Forum dieses Programm gefunden, um meinen Asuro durch ein Rechtwinkliges Labyrinth fahren zu lassen.
#include "asuro.h"
#define FULL_L 200
#define FULL_R 205
volatile unsigned int i;
void Fahren(void) /* Vorwärts fahren */
{
StatusLED(GREEN);
BackLED(OFF,OFF);
MotorDir(FWD,FWD);
MotorSpeed(FULL_L,FULL_R);
}
void Anhalten(void) /* Anhalten */
{
StatusLED(RED);
BackLED(OFF,OFF);
MotorDir(BREAK,BREAK);
}
void Zurueck(void) /* Zurück fahren */
{
StatusLED(YELLOW);
BackLED(ON,ON);
MotorDir(RWD,RWD);
MotorSpeed(FULL_L,FULL_R);
}
void KurveLR(void) /* Kurve rückwärts Links */
{
StatusLED(YELLOW);
BackLED(ON,OFF);
MotorDir(RWD,RWD);
MotorSpeed(FULL_L,0);
}
void KurveRR(void) /* Kurve rückwärts Rechts */
{
StatusLED(YELLOW);
BackLED(OFF,ON);
MotorDir(RWD,RWD);
MotorSpeed(0, FULL_R);
}
void KurveRF(void) /* Kurve vorwärts Rechts */
{
StatusLED(YELLOW);
BackLED(OFF,OFF);
MotorDir(BREAK,FWD);
MotorSpeed(0,FULL_R);
}
void Firstcol(void) /* Programm Rechtskurve im Parcour 1. Kollision */
{
Anhalten();
Msleep(250);
Zurueck();
Msleep(15);
Anhalten();
Msleep(10);
KurveRR();
Msleep(400);
Anhalten();
Msleep(250);
switched = 0;
StartSwitch ();
}
void Secondcol(void) /* Programm Linkskurve im Parcour, 2. Kollision */
{
Anhalten();
Msleep(250);
Zurueck();
Msleep(10);
Anhalten();
Msleep(250);
KurveLR();
Msleep(355);
Anhalten();
Msleep(250);
KurveRF();
Msleep(355);
Anhalten();
Msleep(250);
switched = 0;
StartSwitch();
}
void Thirdcol(void) /* Programm Sackgasse im Parcour, 3. Kollision */
{
Anhalten();
Msleep(250);
Zurueck();
Msleep(10);
KurveLR();
Msleep(310);
Anhalten();
Msleep(250);
switched = 0;
StartSwitch();
}
void Disco(void) /* PARTYTIME! -15mal blinken/piepsen-*/
{
for(i = 0; i < 16; i++)
{
MotorDir(FWD,FWD);
MotorSpeed(50,50);
BackLED(OFF,OFF);
StatusLED(OFF);
FrontLED(OFF);
Msleep(200);
MotorDir(BREAK,BREAK);
BackLED(ON,ON);
StatusLED(RED);
FrontLED(ON);
Msleep(200);
}
}
int main (void) /* Hauptprogrammbeginn */
{
unsigned int data[2]; /* Speicherplpatz für Helligkeitswert */
unsigned int Summe;
Init ();
switched = 0; /* Kollisionserkennung auf 0 setzen */
StartSwitch (); /* Taster-Interrupt aktivieren */
FrontLED(ON);
LineData(data); /* Speichern von Helligkeitswert in data[0,1] */
Summe = data[0]+data[1]; /* Summe der Werte beider Fototransistoren */
while (1)
{
if (switched == 1) /* Wenn 1. Kollision, dann Rechtskurve 90° aus */
{
Firstcol();
for(i = 0; i < 25000; i++) /* Setze Zeitschlaufe für 2. Kollision */
{
if (switched == 1) /* Wenn 2. Kollision, dann Drehung 180° */
{
Secondcol();
for(i = 0; i < 25000; i++) /* Setze Zeitschlaufe für dritte Kollision */
{
if (switched == 1) /* Wenn 3. Kollision, dann Linksdrehung 90° */
{
Thirdcol();
}
else /* Keine 3. Kollision, Fahre normal */
{
Fahren();
}
}
}
else /* Keine 2. Kollision, Fahre normal */
{
Fahren();
}
}
}
else /* gar keine Kollision, Fahre normal, Stopp bei Linie */
{
LineData(data);
if(data[0]+data[1]+10 > Summe) /* Untergrundhelligkeitsdifferenz feststellen */
{
Fahren();
}
else
{
Disco(); /* Party gut - Alles gut */
while(1)
{} /* Endlosschleife - Ende des Programmes */
}
}
}
return 0;
}
Dieses habe ich mit Hilfe der neuen Lib abgeändert!
#include "asuro.h"
#include "myasuro.h"
#define FULL_L 200
#define FULL_R 215
volatile unsigned int i;
void Fahren(void) /* Vorwärts fahren */
{
StatusLED(GREEN);
BackLED(OFF,OFF);
MotorDir(FWD,FWD);
MotorSpeed(FULL_L,FULL_R);
}
void Anhalten(void) /* Anhalten */
{
StatusLED(RED);
BackLED(OFF,OFF);
MotorDir(BREAK,BREAK);
}
void Zurueck(void) /* Zurück fahren */
{
Encoder_Init();
Go(-50,200);
}
void KurveR(void) /* Kurve Rechts 90° */
{
Encoder_Init();
Turn(90,200);
}
void KurveL(void) /* Kurve rückwärts Rechts */
{
Encoder_Init();
Turn(-90,200);
}
void Drehung(void) /*180° Kurve*/
{
Turn(180,200);
}
void Firstcol(void) /* Programm Rechtskurve im Parcour 1. Kollision */
{
Anhalten();
Msleep(250);
Zurueck();
Msleep(15);
Anhalten();
Msleep(10);
KurveR();
Msleep(400);
Anhalten();
Msleep(250);
switched = 0;
StartSwitch ();
}
void Secondcol(void) /* Programm Linkskurve im Parcour, 2. Kollision */
{
Anhalten();
Msleep(250);
Zurueck();
Msleep(10);
Anhalten();
Msleep(250);
Drehung();
Msleep(355);
Anhalten();
Msleep(250);
Anhalten();
Msleep(250);
switched = 0;
StartSwitch();
}
void Thirdcol(void) /* Programm Sackgasse im Parcour, 3. Kollision */
{
Anhalten();
Msleep(250);
Zurueck();
Msleep(10);
KurveL();
Msleep(310);
Anhalten();
Msleep(250);
switched = 0;
StartSwitch();
}
void Disco(void) /* PARTYTIME! -15mal blinken/piepsen-*/
{
for(i = 0; i < 16; i++)
{
MotorDir(FWD,FWD);
MotorSpeed(50,50);
BackLED(OFF,OFF);
StatusLED(OFF);
FrontLED(OFF);
Msleep(200);
MotorDir(BREAK,BREAK);
BackLED(ON,ON);
StatusLED(RED);
FrontLED(ON);
Msleep(200);
}
}
int main (void) /* Hauptprogrammbeginn */
{
unsigned int data[2]; /* Speicherplpatz für Helligkeitswert */
unsigned int Summe;
Init ();
switched = 0; /* Kollisionserkennung auf 0 setzen */
StartSwitch (); /* Taster-Interrupt aktivieren */
FrontLED(ON);
LineData(data); /* Speichern von Helligkeitswert in data[0,1] */
Summe = data[0]+data[1]; /* Summe der Werte beider Fototransistoren */
while (1)
{
if (switched == 1) /* Wenn 1. Kollision, dann Rechtskurve 90° aus */
{
Firstcol();
for(i = 0; i < 25000; i++) /* Setze Zeitschlaufe für 2. Kollision */
{
if (switched == 1) /* Wenn 2. Kollision, dann Drehung 180° */
{
Secondcol();
for(i = 0; i < 25000; i++) /* Setze Zeitschlaufe für dritte Kollision */
{
if (switched == 1) /* Wenn 3. Kollision, dann Linksdrehung 90° */
{
Thirdcol();
}
else /* Keine 3. Kollision, Fahre normal */
{
Fahren();
}
}
}
else /* Keine 2. Kollision, Fahre normal */
{
Fahren();
}
}
}
else /* gar keine Kollision, Fahre normal, Stopp bei Linie */
{
LineData(data);
if(data[0]+data[1]+200 > Summe) /* Untergrundhelligkeitsdifferenz feststellen */
{
Fahren();
}
else
{
Disco(); /* Party gut - Alles gut */
while(1)
{} /* Endlosschleife - Ende des Programmes */
}
}
}
return 0;
}
So weit funktioniert auch noch alles bis auf das gerade aus fahren"void fahren (void)", da dies doch sehr Batterieabhängig ist.
Da die Go Funktion nicht unterbrochen werden kann, wollte ich dies durch eine Regelng mit Hilfe der Odometrie realisieren.
Nachdem ich diese Regelung wie folgt in das Labyrinth Programm eingebunden habe bekomme ich beim Compilieren die Fehlermeldung
"List Index Out of Bounds(249)"
#include "asuro.h"
#include "myasuro.h"
#define TRIGGERLEVEL 830
#define HYSTERESIS 10
#define LOW 0
#define HIGH 1
volatile unsigned int i;
void Fahren(void) /* Vorwärts fahren */
{
unsigned int data[2];
signed int status[2]={0,0};
signed int difference=0;
MotorDir(FWD, FWD);
while(Pollswitch()<1) {
// 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++;
}
// Wechsel linker Sensor von hoch auf niedrig?
if ((status[0]==HIGH) && (data[0]<TRIGGERLEVEL-HYSTERESIS)) {
status[0]=LOW;
difference++;
}
// 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?ler
// den erlaubten Wertebereich verl?st
if (difference<-255) difference=-255;
if (difference>255) difference=255;
// Status-LED noch entsprechend der erkannten Segmente
// aufleuchten lassen, grn fr links, rot fr rechts
StatusLED(status[0]+status[1]*2);
// Z?ldifferenz passend auf die Motoren verteilen
if (difference>0) MotorSpeed(160-difference,160);
else MotorSpeed(160,160+difference);
}
void Anhalten(void) /* Anhalten */
{
StatusLED(RED);
BackLED(OFF,OFF);
MotorDir(BREAK,BREAK);
}
void Zurueck(void) /* Zurück fahren */
{
Encoder_Init();
Go(-10,200);
}
void KurveR(void) /* Kurve Rechts 90° */
{
Encoder_Init();
Turn(60,200);
}
void KurveL(void) /* Kurve rückwärts Rechts */
{
Encoder_Init();
Turn(-50,200);
}
void Drehung(void) /*180° Kurve*/
{
Turn(120,200);
}
void Firstcol(void) /* Programm Rechtskurve im Parcour 1. Kollision */
{
Anhalten();
Msleep(250);
Zurueck();
Msleep(15);
Anhalten();
Msleep(10);
KurveR();
Msleep(400);
Anhalten();
Msleep(250);
switched = 0;
StartSwitch ();
}
void Secondcol(void) /* Programm Linkskurve im Parcour, 2. Kollision */
{
Anhalten();
Msleep(250);
Zurueck();
Msleep(10);
Anhalten();
Msleep(250);
Drehung();
Msleep(355);
Anhalten();
Msleep(250);
Anhalten();
Msleep(250);
switched = 0;
StartSwitch();
}
void Thirdcol(void) /* Programm Sackgasse im Parcour, 3. Kollision */
{
Anhalten();
Msleep(250);
Zurueck();
Msleep(10);
KurveL();
Msleep(310);
Anhalten();
Msleep(250);
switched = 0;
StartSwitch();
}
void Disco(void) /* PARTYTIME! -15mal blinken/piepsen-*/
{
for(i = 0; i < 16; i++)
{
MotorDir(FWD,FWD);
MotorSpeed(50,50);
BackLED(OFF,OFF);
StatusLED(OFF);
FrontLED(OFF);
Msleep(200);
MotorDir(BREAK,BREAK);
BackLED(ON,ON);
StatusLED(RED);
FrontLED(ON);
Msleep(200);
}
}
int main (void) /* Hauptprogrammbeginn */
{
unsigned int data[2]; /* Speicherplpatz für Helligkeitswert */
unsigned int Summe;
Init ();
switched = 0; /* Kollisionserkennung auf 0 setzen */
StartSwitch (); /* Taster-Interrupt aktivieren */
FrontLED(ON);
LineData(data); /* Speichern von Helligkeitswert in data[0,1] */
Summe = data[0]+data[1]; /* Summe der Werte beider Fototransistoren */
while (1)
{
if (switched == 1) /* Wenn 1. Kollision, dann Rechtskurve 90° aus */
{
Firstcol();
for(i = 0; i < 25000; i++) /* Setze Zeitschlaufe für 2. Kollision */
{
if (switched == 1) /* Wenn 2. Kollision, dann Drehung 180° */
{
Secondcol();
for(i = 0; i < 25000; i++) /* Setze Zeitschlaufe für dritte Kollision */
{
if (switched == 1) /* Wenn 3. Kollision, dann Linksdrehung 90° */
{
Thirdcol();
}
else /* Keine 3. Kollision, Fahre normal */
{
Fahren();
}
}
}
else /* Keine 2. Kollision, Fahre normal */
{
Fahren();
}
}
}
else /* gar keine Kollision, Fahre normal, Stopp bei Linie */
{
LineData(data);
if(data[0]+data[1]+200 > Summe) /* Untergrundhelligkeitsdifferenz feststellen */
{
Fahren();
}
else
{
Disco(); /* Party gut - Alles gut */
while(1)
{} /* Endlosschleife - Ende des Programmes */
}
}
}
return 0;
}
Beide Programme einzeln compiliert funzen ohne probleme!
Gibt es vll noch eine einfachere Möglichkeit den Asuro eine unbestimmte Strecke gerade aus fahren zu lassen bis eine Kollision erfolgt?
Ich steh jetzt nach 3 Tagen ständigem rumprobiern irgendwie mit dem Kopf an der Mauer. BITTE HELFT MIR!!!
MfG
GetzRazor
Hier noch der Text aus der Memo von Asuro Flash!
>Session Environment Variables:
AF_AVRDIR=C:\WinAVR-20090313
AF_PROJECT=LMAA
AF_SOURCE_FILES=asuro.c LMAA.c new.c
AF_ASM_SRC_FILES=
AF_PRGDIR=C:\Programme\AsuroFlash
AF_PRJDIR=C:\Dokumente und Einstellungen\All Users\Anwendungsdaten\AsuroFlash\Projects\LMAA
AF_LIB_PATH=C:\WinAVR-20090313\lib
File asuro.c saved.
File asuro.h saved.
File LMAA.c saved.
File myasuro.h saved.
>Default make_all.cmd file created.
>Default makefile created.
Make
set -e; avr-gcc -MM -mmcu=atmega8 -DF_CPU=8000000UL -I. -g -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=new.lst -IC:\Programme\AsuroFlash\include -IC:\WinAVR-20090313\lib\inc new.c \
| sed 's,\(.*\)\.o[ :]*,\1.o \1.d : ,g' > new.d; \
[ -s new.d ] || rm -f new.d
set -e; avr-gcc -MM -mmcu=atmega8 -DF_CPU=8000000UL -I. -g -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=LMAA.lst -IC:\Programme\AsuroFlash\include -IC:\WinAVR-20090313\lib\inc LMAA.c \
| sed 's,\(.*\)\.o[ :]*,\1.o \1.d : ,g' > LMAA.d; \
[ -s LMAA.d ] || rm -f LMAA.d
set -e; avr-gcc -MM -mmcu=atmega8 -DF_CPU=8000000UL -I. -g -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=asuro.lst -IC:\Programme\AsuroFlash\include -IC:\WinAVR-20090313\lib\inc asuro.c \
| sed 's,\(.*\)\.o[ :]*,\1.o \1.d : ,g' > asuro.d; \
[ -s asuro.d ] || rm -f asuro.d
-------- begin --------
avr-gcc --version
avr-gcc (GCC) 3.3.1
Copyright (C) 2003 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Size before:
LMAA.elf :
section size addr
.text 2956 0
.data 16 8388704
.bss 32 8388720
.noinit 0 8388752
.eeprom 0 8454144
.stab 6012 0
.stabstr 2992 0
Total 12008
avr-gcc -c -mmcu=atmega8 -DF_CPU=8000000UL -I. -g -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=asuro.lst -IC:\Programme\AsuroFlash\include -IC:\WinAVR-20090313\lib\inc asuro.c -o asuro.o
avr-gcc -c -mmcu=atmega8 -DF_CPU=8000000UL -I. -g -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=LMAA.lst -IC:\Programme\AsuroFlash\include -IC:\WinAVR-20090313\lib\inc LMAA.c -o LMAA.o
LMAA.c: In function `Fahren':
LMAA.c:176: warning: `main' is normally a non-static function
LMAA.c:248: error: parse error at end of input
make: *** [LMAA.o] Error 1
C:\Dokumente und Einstellungen\All Users\Anwendungsdaten\AsuroFlash\Projects\LMAA>C:\WinAVR\utils\bin\make all
ExitCode 2
>Ready.
ich habe zufällig im Forum dieses Programm gefunden, um meinen Asuro durch ein Rechtwinkliges Labyrinth fahren zu lassen.
#include "asuro.h"
#define FULL_L 200
#define FULL_R 205
volatile unsigned int i;
void Fahren(void) /* Vorwärts fahren */
{
StatusLED(GREEN);
BackLED(OFF,OFF);
MotorDir(FWD,FWD);
MotorSpeed(FULL_L,FULL_R);
}
void Anhalten(void) /* Anhalten */
{
StatusLED(RED);
BackLED(OFF,OFF);
MotorDir(BREAK,BREAK);
}
void Zurueck(void) /* Zurück fahren */
{
StatusLED(YELLOW);
BackLED(ON,ON);
MotorDir(RWD,RWD);
MotorSpeed(FULL_L,FULL_R);
}
void KurveLR(void) /* Kurve rückwärts Links */
{
StatusLED(YELLOW);
BackLED(ON,OFF);
MotorDir(RWD,RWD);
MotorSpeed(FULL_L,0);
}
void KurveRR(void) /* Kurve rückwärts Rechts */
{
StatusLED(YELLOW);
BackLED(OFF,ON);
MotorDir(RWD,RWD);
MotorSpeed(0, FULL_R);
}
void KurveRF(void) /* Kurve vorwärts Rechts */
{
StatusLED(YELLOW);
BackLED(OFF,OFF);
MotorDir(BREAK,FWD);
MotorSpeed(0,FULL_R);
}
void Firstcol(void) /* Programm Rechtskurve im Parcour 1. Kollision */
{
Anhalten();
Msleep(250);
Zurueck();
Msleep(15);
Anhalten();
Msleep(10);
KurveRR();
Msleep(400);
Anhalten();
Msleep(250);
switched = 0;
StartSwitch ();
}
void Secondcol(void) /* Programm Linkskurve im Parcour, 2. Kollision */
{
Anhalten();
Msleep(250);
Zurueck();
Msleep(10);
Anhalten();
Msleep(250);
KurveLR();
Msleep(355);
Anhalten();
Msleep(250);
KurveRF();
Msleep(355);
Anhalten();
Msleep(250);
switched = 0;
StartSwitch();
}
void Thirdcol(void) /* Programm Sackgasse im Parcour, 3. Kollision */
{
Anhalten();
Msleep(250);
Zurueck();
Msleep(10);
KurveLR();
Msleep(310);
Anhalten();
Msleep(250);
switched = 0;
StartSwitch();
}
void Disco(void) /* PARTYTIME! -15mal blinken/piepsen-*/
{
for(i = 0; i < 16; i++)
{
MotorDir(FWD,FWD);
MotorSpeed(50,50);
BackLED(OFF,OFF);
StatusLED(OFF);
FrontLED(OFF);
Msleep(200);
MotorDir(BREAK,BREAK);
BackLED(ON,ON);
StatusLED(RED);
FrontLED(ON);
Msleep(200);
}
}
int main (void) /* Hauptprogrammbeginn */
{
unsigned int data[2]; /* Speicherplpatz für Helligkeitswert */
unsigned int Summe;
Init ();
switched = 0; /* Kollisionserkennung auf 0 setzen */
StartSwitch (); /* Taster-Interrupt aktivieren */
FrontLED(ON);
LineData(data); /* Speichern von Helligkeitswert in data[0,1] */
Summe = data[0]+data[1]; /* Summe der Werte beider Fototransistoren */
while (1)
{
if (switched == 1) /* Wenn 1. Kollision, dann Rechtskurve 90° aus */
{
Firstcol();
for(i = 0; i < 25000; i++) /* Setze Zeitschlaufe für 2. Kollision */
{
if (switched == 1) /* Wenn 2. Kollision, dann Drehung 180° */
{
Secondcol();
for(i = 0; i < 25000; i++) /* Setze Zeitschlaufe für dritte Kollision */
{
if (switched == 1) /* Wenn 3. Kollision, dann Linksdrehung 90° */
{
Thirdcol();
}
else /* Keine 3. Kollision, Fahre normal */
{
Fahren();
}
}
}
else /* Keine 2. Kollision, Fahre normal */
{
Fahren();
}
}
}
else /* gar keine Kollision, Fahre normal, Stopp bei Linie */
{
LineData(data);
if(data[0]+data[1]+10 > Summe) /* Untergrundhelligkeitsdifferenz feststellen */
{
Fahren();
}
else
{
Disco(); /* Party gut - Alles gut */
while(1)
{} /* Endlosschleife - Ende des Programmes */
}
}
}
return 0;
}
Dieses habe ich mit Hilfe der neuen Lib abgeändert!
#include "asuro.h"
#include "myasuro.h"
#define FULL_L 200
#define FULL_R 215
volatile unsigned int i;
void Fahren(void) /* Vorwärts fahren */
{
StatusLED(GREEN);
BackLED(OFF,OFF);
MotorDir(FWD,FWD);
MotorSpeed(FULL_L,FULL_R);
}
void Anhalten(void) /* Anhalten */
{
StatusLED(RED);
BackLED(OFF,OFF);
MotorDir(BREAK,BREAK);
}
void Zurueck(void) /* Zurück fahren */
{
Encoder_Init();
Go(-50,200);
}
void KurveR(void) /* Kurve Rechts 90° */
{
Encoder_Init();
Turn(90,200);
}
void KurveL(void) /* Kurve rückwärts Rechts */
{
Encoder_Init();
Turn(-90,200);
}
void Drehung(void) /*180° Kurve*/
{
Turn(180,200);
}
void Firstcol(void) /* Programm Rechtskurve im Parcour 1. Kollision */
{
Anhalten();
Msleep(250);
Zurueck();
Msleep(15);
Anhalten();
Msleep(10);
KurveR();
Msleep(400);
Anhalten();
Msleep(250);
switched = 0;
StartSwitch ();
}
void Secondcol(void) /* Programm Linkskurve im Parcour, 2. Kollision */
{
Anhalten();
Msleep(250);
Zurueck();
Msleep(10);
Anhalten();
Msleep(250);
Drehung();
Msleep(355);
Anhalten();
Msleep(250);
Anhalten();
Msleep(250);
switched = 0;
StartSwitch();
}
void Thirdcol(void) /* Programm Sackgasse im Parcour, 3. Kollision */
{
Anhalten();
Msleep(250);
Zurueck();
Msleep(10);
KurveL();
Msleep(310);
Anhalten();
Msleep(250);
switched = 0;
StartSwitch();
}
void Disco(void) /* PARTYTIME! -15mal blinken/piepsen-*/
{
for(i = 0; i < 16; i++)
{
MotorDir(FWD,FWD);
MotorSpeed(50,50);
BackLED(OFF,OFF);
StatusLED(OFF);
FrontLED(OFF);
Msleep(200);
MotorDir(BREAK,BREAK);
BackLED(ON,ON);
StatusLED(RED);
FrontLED(ON);
Msleep(200);
}
}
int main (void) /* Hauptprogrammbeginn */
{
unsigned int data[2]; /* Speicherplpatz für Helligkeitswert */
unsigned int Summe;
Init ();
switched = 0; /* Kollisionserkennung auf 0 setzen */
StartSwitch (); /* Taster-Interrupt aktivieren */
FrontLED(ON);
LineData(data); /* Speichern von Helligkeitswert in data[0,1] */
Summe = data[0]+data[1]; /* Summe der Werte beider Fototransistoren */
while (1)
{
if (switched == 1) /* Wenn 1. Kollision, dann Rechtskurve 90° aus */
{
Firstcol();
for(i = 0; i < 25000; i++) /* Setze Zeitschlaufe für 2. Kollision */
{
if (switched == 1) /* Wenn 2. Kollision, dann Drehung 180° */
{
Secondcol();
for(i = 0; i < 25000; i++) /* Setze Zeitschlaufe für dritte Kollision */
{
if (switched == 1) /* Wenn 3. Kollision, dann Linksdrehung 90° */
{
Thirdcol();
}
else /* Keine 3. Kollision, Fahre normal */
{
Fahren();
}
}
}
else /* Keine 2. Kollision, Fahre normal */
{
Fahren();
}
}
}
else /* gar keine Kollision, Fahre normal, Stopp bei Linie */
{
LineData(data);
if(data[0]+data[1]+200 > Summe) /* Untergrundhelligkeitsdifferenz feststellen */
{
Fahren();
}
else
{
Disco(); /* Party gut - Alles gut */
while(1)
{} /* Endlosschleife - Ende des Programmes */
}
}
}
return 0;
}
So weit funktioniert auch noch alles bis auf das gerade aus fahren"void fahren (void)", da dies doch sehr Batterieabhängig ist.
Da die Go Funktion nicht unterbrochen werden kann, wollte ich dies durch eine Regelng mit Hilfe der Odometrie realisieren.
Nachdem ich diese Regelung wie folgt in das Labyrinth Programm eingebunden habe bekomme ich beim Compilieren die Fehlermeldung
"List Index Out of Bounds(249)"
#include "asuro.h"
#include "myasuro.h"
#define TRIGGERLEVEL 830
#define HYSTERESIS 10
#define LOW 0
#define HIGH 1
volatile unsigned int i;
void Fahren(void) /* Vorwärts fahren */
{
unsigned int data[2];
signed int status[2]={0,0};
signed int difference=0;
MotorDir(FWD, FWD);
while(Pollswitch()<1) {
// 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++;
}
// Wechsel linker Sensor von hoch auf niedrig?
if ((status[0]==HIGH) && (data[0]<TRIGGERLEVEL-HYSTERESIS)) {
status[0]=LOW;
difference++;
}
// 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?ler
// den erlaubten Wertebereich verl?st
if (difference<-255) difference=-255;
if (difference>255) difference=255;
// Status-LED noch entsprechend der erkannten Segmente
// aufleuchten lassen, grn fr links, rot fr rechts
StatusLED(status[0]+status[1]*2);
// Z?ldifferenz passend auf die Motoren verteilen
if (difference>0) MotorSpeed(160-difference,160);
else MotorSpeed(160,160+difference);
}
void Anhalten(void) /* Anhalten */
{
StatusLED(RED);
BackLED(OFF,OFF);
MotorDir(BREAK,BREAK);
}
void Zurueck(void) /* Zurück fahren */
{
Encoder_Init();
Go(-10,200);
}
void KurveR(void) /* Kurve Rechts 90° */
{
Encoder_Init();
Turn(60,200);
}
void KurveL(void) /* Kurve rückwärts Rechts */
{
Encoder_Init();
Turn(-50,200);
}
void Drehung(void) /*180° Kurve*/
{
Turn(120,200);
}
void Firstcol(void) /* Programm Rechtskurve im Parcour 1. Kollision */
{
Anhalten();
Msleep(250);
Zurueck();
Msleep(15);
Anhalten();
Msleep(10);
KurveR();
Msleep(400);
Anhalten();
Msleep(250);
switched = 0;
StartSwitch ();
}
void Secondcol(void) /* Programm Linkskurve im Parcour, 2. Kollision */
{
Anhalten();
Msleep(250);
Zurueck();
Msleep(10);
Anhalten();
Msleep(250);
Drehung();
Msleep(355);
Anhalten();
Msleep(250);
Anhalten();
Msleep(250);
switched = 0;
StartSwitch();
}
void Thirdcol(void) /* Programm Sackgasse im Parcour, 3. Kollision */
{
Anhalten();
Msleep(250);
Zurueck();
Msleep(10);
KurveL();
Msleep(310);
Anhalten();
Msleep(250);
switched = 0;
StartSwitch();
}
void Disco(void) /* PARTYTIME! -15mal blinken/piepsen-*/
{
for(i = 0; i < 16; i++)
{
MotorDir(FWD,FWD);
MotorSpeed(50,50);
BackLED(OFF,OFF);
StatusLED(OFF);
FrontLED(OFF);
Msleep(200);
MotorDir(BREAK,BREAK);
BackLED(ON,ON);
StatusLED(RED);
FrontLED(ON);
Msleep(200);
}
}
int main (void) /* Hauptprogrammbeginn */
{
unsigned int data[2]; /* Speicherplpatz für Helligkeitswert */
unsigned int Summe;
Init ();
switched = 0; /* Kollisionserkennung auf 0 setzen */
StartSwitch (); /* Taster-Interrupt aktivieren */
FrontLED(ON);
LineData(data); /* Speichern von Helligkeitswert in data[0,1] */
Summe = data[0]+data[1]; /* Summe der Werte beider Fototransistoren */
while (1)
{
if (switched == 1) /* Wenn 1. Kollision, dann Rechtskurve 90° aus */
{
Firstcol();
for(i = 0; i < 25000; i++) /* Setze Zeitschlaufe für 2. Kollision */
{
if (switched == 1) /* Wenn 2. Kollision, dann Drehung 180° */
{
Secondcol();
for(i = 0; i < 25000; i++) /* Setze Zeitschlaufe für dritte Kollision */
{
if (switched == 1) /* Wenn 3. Kollision, dann Linksdrehung 90° */
{
Thirdcol();
}
else /* Keine 3. Kollision, Fahre normal */
{
Fahren();
}
}
}
else /* Keine 2. Kollision, Fahre normal */
{
Fahren();
}
}
}
else /* gar keine Kollision, Fahre normal, Stopp bei Linie */
{
LineData(data);
if(data[0]+data[1]+200 > Summe) /* Untergrundhelligkeitsdifferenz feststellen */
{
Fahren();
}
else
{
Disco(); /* Party gut - Alles gut */
while(1)
{} /* Endlosschleife - Ende des Programmes */
}
}
}
return 0;
}
Beide Programme einzeln compiliert funzen ohne probleme!
Gibt es vll noch eine einfachere Möglichkeit den Asuro eine unbestimmte Strecke gerade aus fahren zu lassen bis eine Kollision erfolgt?
Ich steh jetzt nach 3 Tagen ständigem rumprobiern irgendwie mit dem Kopf an der Mauer. BITTE HELFT MIR!!!
MfG
GetzRazor
Hier noch der Text aus der Memo von Asuro Flash!
>Session Environment Variables:
AF_AVRDIR=C:\WinAVR-20090313
AF_PROJECT=LMAA
AF_SOURCE_FILES=asuro.c LMAA.c new.c
AF_ASM_SRC_FILES=
AF_PRGDIR=C:\Programme\AsuroFlash
AF_PRJDIR=C:\Dokumente und Einstellungen\All Users\Anwendungsdaten\AsuroFlash\Projects\LMAA
AF_LIB_PATH=C:\WinAVR-20090313\lib
File asuro.c saved.
File asuro.h saved.
File LMAA.c saved.
File myasuro.h saved.
>Default make_all.cmd file created.
>Default makefile created.
Make
set -e; avr-gcc -MM -mmcu=atmega8 -DF_CPU=8000000UL -I. -g -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=new.lst -IC:\Programme\AsuroFlash\include -IC:\WinAVR-20090313\lib\inc new.c \
| sed 's,\(.*\)\.o[ :]*,\1.o \1.d : ,g' > new.d; \
[ -s new.d ] || rm -f new.d
set -e; avr-gcc -MM -mmcu=atmega8 -DF_CPU=8000000UL -I. -g -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=LMAA.lst -IC:\Programme\AsuroFlash\include -IC:\WinAVR-20090313\lib\inc LMAA.c \
| sed 's,\(.*\)\.o[ :]*,\1.o \1.d : ,g' > LMAA.d; \
[ -s LMAA.d ] || rm -f LMAA.d
set -e; avr-gcc -MM -mmcu=atmega8 -DF_CPU=8000000UL -I. -g -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=asuro.lst -IC:\Programme\AsuroFlash\include -IC:\WinAVR-20090313\lib\inc asuro.c \
| sed 's,\(.*\)\.o[ :]*,\1.o \1.d : ,g' > asuro.d; \
[ -s asuro.d ] || rm -f asuro.d
-------- begin --------
avr-gcc --version
avr-gcc (GCC) 3.3.1
Copyright (C) 2003 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Size before:
LMAA.elf :
section size addr
.text 2956 0
.data 16 8388704
.bss 32 8388720
.noinit 0 8388752
.eeprom 0 8454144
.stab 6012 0
.stabstr 2992 0
Total 12008
avr-gcc -c -mmcu=atmega8 -DF_CPU=8000000UL -I. -g -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=asuro.lst -IC:\Programme\AsuroFlash\include -IC:\WinAVR-20090313\lib\inc asuro.c -o asuro.o
avr-gcc -c -mmcu=atmega8 -DF_CPU=8000000UL -I. -g -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=LMAA.lst -IC:\Programme\AsuroFlash\include -IC:\WinAVR-20090313\lib\inc LMAA.c -o LMAA.o
LMAA.c: In function `Fahren':
LMAA.c:176: warning: `main' is normally a non-static function
LMAA.c:248: error: parse error at end of input
make: *** [LMAA.o] Error 1
C:\Dokumente und Einstellungen\All Users\Anwendungsdaten\AsuroFlash\Projects\LMAA>C:\WinAVR\utils\bin\make all
ExitCode 2
>Ready.