hai1991 hat das erkannt: ich ha bne skizze gemacht damit das ganz klar ersichtlich wird :-)
er soll prinzipiell zwischen rechts und linkskurve unterscheiden können.
die skizze ist im anhang zum download frei :-)
Bild hier
Druckbare Version
hai1991 hat das erkannt: ich ha bne skizze gemacht damit das ganz klar ersichtlich wird :-)
er soll prinzipiell zwischen rechts und linkskurve unterscheiden können.
die skizze ist im anhang zum download frei :-)
Bild hier
Hi, zusammen,
ja, bei dieser Konstellation, muss ich euch Recht geben.
Na, dann bleibt ja noch der Timer-Interrupt, der so lustig vor sich hinzählt.
Da Msleep() benutzt wird, sehe ich, dass die Asuro-LIB benutzt wird.
Dort gibt es eine Funktion á la "HoleZeitInMSSekunden".
Hier ein ganz, ganz grober Rahmen. (Ich muss noch Arbeiten. hoffe es sieht jetzt kein Chef rein ;-))
Gruß SternthalerCode:long letzter_kontakt = 0;
long vor_letzter_kontakt;
if (switched == 1)
{
vor_letzter_kontakt = letzter_kontakt;
letzter_kontakt = "HoleZeitInMSSekunden";
if (letzter_kontakt > (ODER <??) vor_letzter_kontakt + (ODER -??) 100bisNochMehrMillisekunden)
variable_fuer_grad = 90; (Oder besser hier 180)
else
variable_fuer_grad = 180; (und dafuer hier nur 90?? ;-))
...
...
}
P.S.: Schöne Zeichnung sebär. Nun schaffe ich es auch dein Problem zu 'sehen'. Hab leider nur schlamperlich deinen Text gelesen.
wir haben das problem anders lösen können :-)
werde morgen den quelltext posten, damit ihr auch was davon habt, hab ihn aktuell nur aufm laptop in der schule und nicht hier zuhause ;)
danke für die viele hilfe!!
lg
sooo, hier unser finaler quellcode!
einige extras (z.b. Disco-funktion) haben wir zusätzlich noch eingebaut.
danke für die ganze hilfe :-)Code:############################################################################################
### - FloBa Productions Inc. proudly presents: ASURO Parcourprogramm - ###
### - Ausgelegt für Parcours mit rechten Winkeln - ###
### - Asuro sollte auf einer hellen Fläche fahren um Ziellinie zu erkennen - ###
### - Programm zur öffentlichen Verwendung, Missbrauch* wird geahndet - ###
### - * zum Beispiel schlechte Kritik - ###
### - Fehler sind ausschliesslich auf Hardware und Batterie zurückzuführen - ###
### - Viel Vergnügen beim Spielspass wünscht das Asuro-Care-Team - ###
############################################################################################
#include "asuro.h"
#define FULL_L 200
#define FULL_R 202
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;
}
lg
wollte den code mal testen .. kriege folgende fehlermeldung .. kann mir wer weiter helfen
Code:>Session Environment Variables:
AF_AVRDIR=C:\WinAVR
AF_PROJECT=Project1
AF_SOURCE_FILES=new.c
AF_ASM_SRC_FILES=
AF_PRGDIR=C:\Program Files\AsuroFlash
AF_PRJDIR=C:\ProgramData\AsuroFlash
AF_LIB_PATH=%AllUsersProfile%/AsuroFlash/asuro-lib/lib
File new.c saved.
>Default make_all.cmd file created.
>Default makefile created.
Make
C:\ProgramData\AsuroFlash>C:\WinAVR\utils\bin\make all
set -e; avr-gcc -MM -mmcu=atmega168 -DF_CPU=8000000UL -I. -g -Os -IC:\ProgramData/AsuroFlash/asuro-lib/lib/inc -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=new.lst new.c \
| sed 's,\(.*\)\.o[ :]*,\1.o \1.d : ,g' > new.d; \
[ -s new.d ] || rm -f new.d
-------- begin --------
avr-gcc --version
avr-gcc (WinAVR 20081205) 4.3.2
Copyright (C) 2008 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.
avr-gcc -c -mmcu=atmega168 -DF_CPU=8000000UL -I. -g -Os -IC:\ProgramData/AsuroFlash/asuro-lib/lib/inc -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=new.lst new.c -o new.o
avr-gcc -mmcu=atmega168 -DF_CPU=8000000UL -I. -g -Os -IC:\ProgramData/AsuroFlash/asuro-lib/lib/inc -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=new.o new.o --output Project1.elf -Wl,-Map=Project1.map,--cref -LC:\ProgramData/AsuroFlash/asuro-lib/lib -lm -lasuro168
new.o: In function `main':
C:\ProgramData\AsuroFlash/new.c:152: undefined reference to `Init'
make: *** [Project1.elf] Error 1
ExitCode 2
>Ready.
Hallo ezo2k3,
als erstes solltest du einmal die '\'-Zeichen in deinen Pfadangaben gegen das '/'-Zeichen tauschen.
Möglicherweise gibt es ein Problem, wenn eine Mischform, wie bei:
-IC:\ProgramData/AsuroFlash/asuro-lib/lib/inc
-LC:\ProgramData/AsuroFlash/asuro-lib/lib
entsteht.
Auch immer seeeehhhhr Kritisch sind Pfadangaben mit Leerzeichen im Namen.
Das hast du bei der Variablen AF_PRGDIR=C:\Program Files\AsuroFlash
Du solltest Verzeichnisse mit Sonderzeichen im Namen in dieser Umgebung unbedingt vermeiden.
Viel Erfolg und Gruß
Sternthaler