Azubi007
12.12.2006, 08:56
Moin!
@EDH Nein, das haben wir noch nicht probiert. Mussten gestern Mittag eine Entscheidung treffen und hatten uns dann entschieden das ganze als 2 Programme zu realisieren. Einmal wenn wir den Aufbau für die Linienerkennung und wenn wir den US Aufbau drauf haben.
Stehe nämlich etwas unter zeitdruck, weil wir das ganze Projekt nächste Woche unserem Chef präsentieren sollen. :-b
Abwarten....
Aber poste mal unseren Code:
Wichtig: Es fehlen noch 2 "Programme" die als Funktion eingefügt werden sollen.
Abgrundfahrt und der Selftest
Der ganze Aufruf der einzelnen programmme soll immer so laufen wie bei der US-Fahrt.
Aber jetzt wirklich mal der Code:
#include "asuro.h"
#include "stdlib.h"
#include "string.h"
unsigned int mittel_links=0;
unsigned int mittel_rechts=0;
unsigned int mittel[2];
unsigned int geschw_l = 200;
unsigned int geschw_r = 200;
unsigned int odo_gL;
unsigned int odo_gR;
unsigned int gbr;
unsigned int gbl;
void verzoegern(int zeit) //Programm um Zeitverzögerung einzubringen
{
int i=0;
for(i=0;i<zeit;i++)
{
Sleep(250);
}
}
void zeile(int zeilen) //Programm um leere Zeilen im HyperTerminal auszugeben
{
unsigned char newline = 10;
unsigned char cR = 13;
int i = 0;
for(i=0;i<zeilen;i++)
{
SerWrite(&newline,1);
SerWrite(&cR,1);
}
}
void countdown(void) //Countdown Programm
{
Init();
zeile(1);
SerWrite(">>>> Countdown <<<<",19);
zeile(2);
SerWrite(">>>> 3 <<<<",19);
zeile(2);
StatusLED(RED);
verzoegern(250);
SerWrite(">>>> 2 <<<<",19);
zeile(2);
StatusLED(YELLOW);
verzoegern(250);
SerWrite(">>>> 1 <<<<",19);
zeile(2);
StatusLED(GREEN);
verzoegern(250);
SerWrite(">>>> Start <<<<",19);
}
void odometrie(void) //Programm zu Kalibrierung der Motoren
{
long int summe_rechts=0;
long int summe_links=0;
unsigned char mittell[10];
unsigned char mittelr[10];
unsigned char flagl=FALSE;
unsigned char flagr=FALSE;
unsigned int mittelwert0=0;
unsigned int mittelwert1=0;
unsigned char fR[10];
unsigned char fL[10];
unsigned char UR[10];
unsigned char UL[10];
unsigned char SL[10];
unsigned char SR[10];
unsigned int data[2];
unsigned int faktorr;
unsigned int faktorl;
unsigned int count=0;
unsigned int i=0;
unsigned int L=0;
unsigned int R=0;
float a=0;
float b=0;
MotorDir(FWD,FWD);
MotorSpeed(200,200);
for(count=0;count<400;count++)
{
verzoegern(3);
OdometrieData(data);
summe_links = summe_links + data[0];
summe_rechts = summe_rechts + data[1];
}
mittelwert0 = summe_links / count;
mittelwert1 = summe_rechts / count;
itoa(mittelwert0, mittell,10);
itoa(mittelwert1, mittelr,10);
zeile(2);
SerWrite("Mittelwert links: ",18);
SerWrite(mittell,strlen(mittell));
zeile(2);
SerWrite("Mittelwert rechts: ",19);
SerWrite(mittelr,strlen(mittelr));
itoa(summe_links, SL,10);
itoa(summe_rechts, SR,10);
zeile(2);
SerWrite("Summe links: ",13);
SerWrite(SL,strlen(SL));
zeile(2);
SerWrite("Summe rechts: ",14);
SerWrite(SR,strlen(SR));
for(i=0;i<count;i++)
{
verzoegern(2);
OdometrieData(data);
if (data[0] < mittelwert0 && flagl == TRUE)
{
L++;
flagl = FALSE;
}
if (data[0] > mittelwert0 && flagl == FALSE)
{
L++;
flagl = TRUE;
}
if (data[1] < mittelwert1 && flagr == TRUE)
{
R++;
flagr = FALSE;
}
if (data[1] > mittelwert1 && flagr == FALSE)
{
R++;
flagr = TRUE;
}
}
if(L<R)
{
a=R/8;
b=L/8;
faktorl=(100/a)*b;
faktorr=100;
}
if(R<L)
{
a=R/8;
b=L/8;
faktorr=(100/b)*a;
faktorl=100;
}
if(R==L)
{
faktorr=faktorl=100;
}
MotorSpeed(0,0);
itoa(faktorl, fL,10);
itoa(faktorr, fR,10);
itoa(L, UL,10);
itoa(R, UR,10);
zeile(2);
SerWrite("Umdrehungen links: ",19);
SerWrite(UL,strlen(UL));
zeile(2);
SerWrite("Umdrehungen rechts: ",20);
SerWrite(UR,strlen(UR));
zeile(2);
SerWrite("Faktor links: ",14);
SerWrite(fL,strlen(fL));
zeile(2);
SerWrite("Faktor rechts: ",15);
SerWrite(fR,strlen(fR));
zeile(4);
odo_gL=(geschw_l*faktorr)/100;
odo_gR=(geschw_r*faktorl)/100;
}
void erkennung(void) //Programm um vordere Diodenwerte einzulesen
{
unsigned int datahell[2];
unsigned int datadunkel[2];
unsigned int temp_h[2];
unsigned int temp_d[2];
unsigned char temp_char0[4];
unsigned char temp_char1[4];
unsigned char temp_mit0[4];
unsigned char temp_mit1[4];
unsigned int i = 2;
unsigned int taster;
StatusLED(OFF);
while (i > 0)
{
taster = PollSwitch();
{
if (taster>0 && taster<33 && i==2)
{
FrontLED(ON);
verzoegern(150);
LineData(temp_h);
datahell[0]=temp_h[0];
datahell[1]=temp_h[1];
StatusLED(RED);
verzoegern(200);
StatusLED(OFF);
verzoegern(200);
FrontLED(OFF);
i=1;
itoa(temp_h[0],temp_char0,10);
itoa(temp_h[1],temp_char1,10);
SerWrite("Asuro: ",7);
zeile(2);
SerWrite("Hell l: ",8);
SerWrite(temp_char0,strlen(temp_char0));
zeile(1);
SerWrite("Hell r: ",8);
SerWrite(temp_char1,strlen(temp_char1));
zeile(2);
}
taster = PollSwitch();
if (taster>0 && taster<33 && i==1)
{
FrontLED(ON);
verzoegern(150);
LineData(temp_d);
datadunkel[0]=temp_d[0];
datadunkel[1]=temp_d[1];
StatusLED(YELLOW);
verzoegern(200);
FrontLED(OFF);
i=0;
StatusLED(GREEN);
itoa(temp_d[0],temp_char0,10);
itoa(temp_d[1],temp_char1,10);
SerWrite("Dunkel l: ",10);
SerWrite(temp_char0,strlen(temp_char0));
zeile(1);
SerWrite("Dunkel r: ",10);
SerWrite(temp_char1,strlen(temp_char1));
zeile(1);
}
}
}
mittel_links=(datahell[0]+datadunkel[0])/2;
mittel_rechts=(datahell[1]+datadunkel[1])/2;
mittel[0]=mittel_links;
mittel[1]=mittel_rechts;
itoa(mittel_links,temp_mit0,10);
itoa(mittel_rechts,temp_mit1,10);
zeile(2);
SerWrite("Mittelwert l: ",14);
SerWrite(temp_mit0,strlen(temp_mit0));
zeile(1);
SerWrite("Mittelwert r: ",14);
SerWrite(temp_mit1,strlen(temp_mit1));
}
void linienfahrt(void) //Programm um einer Linie zu folgen
{
unsigned int data[2];
unsigned int wert_links;
unsigned int wert_rechts;
unsigned int a=0;
unsigned int b=0;
FrontLED(ON);
while(1)
{
LineData(data);
wert_links=data[0];
wert_rechts=data[1];
if(b>20000)
{
a=0;
}
if((wert_links < mittel_links) && (wert_rechts < mittel_rechts))
{
MotorDir(FWD,FWD);
MotorSpeed(odo_gL,odo_gR);
BackLED(OFF,OFF);
a=0;
b=0;
}
if((wert_links > mittel_links) && (wert_rechts > mittel_rechts) && a==0)
{
MotorDir(FWD,FWD);
MotorSpeed(odo_gL,odo_gR);
}
if((wert_links > mittel_links) && (wert_rechts > mittel_rechts) && a==1)
{
MotorDir(FWD,FWD);
gbr=odo_gL*0,4;
gbl=odo_gR;
MotorSpeed(gbr,gbl);
b++;
}
if((wert_links > mittel_links) && (wert_rechts > mittel_rechts) && a==2)
{
MotorDir(FWD,FWD);
gbr=odo_gL;
gbl=odo_gR*0,4;
MotorSpeed(gbr,gbl);
b++;
}
if((wert_links < mittel_links) && (wert_rechts > mittel_rechts))
{
MotorDir(FWD,FWD);
gbr=odo_gL*0,6;
gbl=odo_gR;
MotorSpeed(gbr,gbl);
BackLED(ON,OFF);
a=1;
}
if((wert_links > mittel_links) && (wert_rechts < mittel_rechts))
{
MotorDir(FWD,FWD);
gbr=odo_gL;
gbl=odo_gR*0,6;
MotorSpeed(gbr,gbl);
BackLED(OFF,ON);
a=2;
}
}
}
void gatter(void) //Programm um in einem Kreis zu bleiben
{
unsigned int zwert[2];
while(1)
{
FrontLED(ON);
MotorDir(FWD,FWD);
MotorSpeed(odo_gL,odo_gR);
LineData(zwert);
if(zwert[0] < mittel_links && zwert[1] > mittel_rechts)
{
MotorDir(RWD,RWD);
gbr=odo_gL*0,75;
gbl=odo_gR*0,75;
MotorSpeed(gbr,gbl);
verzoegern(150);
MotorDir(FWD,RWD);
MotorSpeed(odo_gL,odo_gR);
StatusLED(GREEN);
verzoegern(150);
}
if(zwert[1] < mittel_rechts && zwert[0] > mittel_links)
{
MotorDir(RWD,RWD);
gbr=odo_gL*0,75;
gbl=odo_gR*0,75;
MotorSpeed(gbr,gbl);
verzoegern(150);
MotorDir(RWD,FWD);
MotorSpeed(odo_gL,odo_gR);
verzoegern(150);
StatusLED(GREEN);
}
}
}
void tast(void) //Programm um mit Tastern zu fahren
{
unsigned char t1, t2;
Init();
while(1)
{
t1 = PollSwitch();
t2 = PollSwitch();
if(t1 == 0 && t2 == 0) /* keine Taste */
{
MotorDir(FWD,FWD);
MotorSpeed(odo_gL,odo_gR);
StatusLED(GREEN);
FrontLED(ON);
BackLED(OFF,OFF);
}
else if (t1 && t2 && t1 == t2)
{
if(t1 == 1 && t2 == 1) /* Taster 1 gedrückt? */
{
StatusLED(RED);
FrontLED(OFF);
BackLED(ON,ON);
MotorDir(RWD,RWD);
gbr=odo_gL*0,75;
gbl=odo_gR*0,75;
MotorSpeed(gbr,gbl);
verzoegern(333);
BackLED(OFF,ON);
gbr=odo_gL*0,75;
gbl=odo_gR*0;
MotorSpeed(gbr,gbl);
verzoegern(450);
}
if(t1 & 0x02 && t2 & 0x02) /* Taster 2 gedrückt? */
{
StatusLED(RED);
FrontLED(OFF);
BackLED(ON,ON);
MotorDir(RWD,RWD);
gbr=odo_gL*0,75;
gbl=odo_gR*0,75;
MotorSpeed(gbr,gbl);
verzoegern(333);
BackLED(OFF,ON);
gbr=odo_gL*0,75;
gbl=odo_gR*0;
MotorSpeed(gbr,gbl);
verzoegern(450);
}
if(t1 & 0x04 && t2 & 0x04) /* Taster 3 gedrückt? */
{
StatusLED(RED);
FrontLED(OFF);
BackLED(ON,ON);
MotorDir(RWD,RWD);
gbr=odo_gL*0,75;
gbl=odo_gR*0,75;
MotorSpeed(gbr,gbl);
verzoegern(333);
BackLED(OFF,ON);
gbr=odo_gL*0,75;
gbl=odo_gR*0;
MotorSpeed(gbr,gbl);
verzoegern(450);
}
if(t1 & 0x08 && t2 & 0x08) /* Taster 4 gedrückt? */
{
StatusLED(RED);
FrontLED(OFF);
BackLED(ON,ON);
MotorDir(RWD,RWD);
gbr=odo_gL*0,75;
gbl=odo_gR*0,75;
MotorSpeed(gbr,gbl);
verzoegern(333);
BackLED(ON,OFF);
gbr=odo_gL*0;
gbl=odo_gR*0,75;
MotorSpeed(gbr,gbl);
verzoegern(450);
}
if(t1 & 0x16 && t2 & 0x10) /* Taster 5 gedrückt? */
{
StatusLED(RED);
FrontLED(OFF);
BackLED(ON,ON);
MotorDir(RWD,RWD);
gbr=odo_gL*0,75;
gbl=odo_gR*0,75;
MotorSpeed(gbr,gbl);
verzoegern(333);
BackLED(ON,OFF);
gbr=odo_gL*0;
gbl=odo_gR*0,75;
MotorSpeed(gbr,gbl);
verzoegern(450);
}
if(t1 & 0x32 && t2 & 0x20) /* Taster 6 gedrückt? */
{
StatusLED(RED);
FrontLED(OFF);
BackLED(ON,ON);
MotorDir(RWD,RWD);
gbr=odo_gL*0,75;
gbl=odo_gR*0,75;
MotorSpeed(gbr,gbl);
verzoegern(333);
BackLED(ON,OFF);
gbr=odo_gL*0;
gbl=odo_gR*0,75;
MotorSpeed(gbr,gbl);
verzoegern(450);
}
}
}
}
void LocalInit(void) //Programm für US
{
TCCR2 = (1 << WGM21) | (1 << CS20);
OCR2 = 0x64;
ADCSRA = 0x00;
ACSR = 0x02;
ADMUX = 0x03;
SFIOR |= (1 << ACME);
DDRD &= ~(1 << 6);
}
void Ping(unsigned char length) //Programm für US
{
count72kHz = 0;
TCCR2 = (1 << WGM21) | (1 << COM20) | (1 << CS20);
while(count72kHz < length)
{
OCR2 = 0x64 + length / 2 - count72kHz;
}
TCCR2 = (1 << WGM21) | (1 << CS20);
OCR2 = 0x64;
}
void ultraschall (void) //Programm um mit US zu fahren
{
int pos, i;
int posmarker;
Init();
LocalInit();
while(TRUE)
{
posmarker = 0;
Ping(20);
for(pos = 0; pos < 100; pos++)
{
Sleep(10);
if((ACSR & (1 << ACI)) != 0)
{
if(posmarker == 0) { posmarker = pos; }
}
ACSR |= (1 << ACI);
}
if(posmarker > 10)
{
StatusLED(GREEN);
MotorDir(FWD, FWD);
MotorSpeed(odo_gL,odo_gR);
}
else
{
StatusLED(RED);
MotorDir(FWD, RWD);
MotorSpeed(odo_gL*0,odo_gR);
for(i = 0; i<100; i++) { Sleep(200); }
}
}
}
int main(void)
{
unsigned int taster_1=0;
unsigned int taster_2=0;
unsigned int abfrage_1=0;
unsigned int abfrage_2=0;
unsigned int x=0;
Init();
zeile(1);
SerWrite(">>>> Willkommen in der unglaublichen Welt des Asuro! <<<<",57);
zeile(5);
SerWrite("Mit welcher Erweiterung soll der Asuro betrieben werden: ",57);
zeile(2);
SerWrite("Druecken sie bitte den entsprechenden Taster:",44);
zeile(2);
SerWrite("1 >>> Ultraschallerweiterung",28);
zeile(1);
SerWrite("2 >>> Lienienerkennung",22);
while(x==0)
{
taster_1=PollSwitch();
abfrage_1=taster_1;
x=taster_1;
taster_1=0;
taster_2=0;
if(x==1) //Ultraschallerweiterung
{
zeile(24);
SerWrite(">>>> Sie moechten den Asuro mit Ultraschallerweiterung betreiben. <<<<",70);
zeile(5);
SerWrite("Programmauswahl:",16);
zeile(2);
SerWrite("Druecken sie bitte den entsprechenden Taster:",44);
zeile(2);
SerWrite("1 >>> Ultraschall-Fahrt",23);
zeile(1);
SerWrite("2 >>> Taster-Fahrt",18);
zeile(1);
taster_2=PollSwitch();
abfrage_2=taster_2;
taster_1=0;
taster_2=0;
if(abfrage_1==1 && abfrage_2==1) //Ultraschall
{
zeile(24);
SerWrite(">>>> Sie haben das Programm Ultraschall-Fahrt gewaehlt! <<<<",59);
zeile(5);
SerWrite(">>>> Kalibrierung der Motoren... <<<<",37);
zeile(5);
odometrie();
SerWrite(">>>> Kalibrierung abgeschlossen <<<<",37);
zeile(5);
verzoegern(100);
countdown();
ultraschall();
}
if(taster_1==1 && taster_2==2) //Taster
{
zeile(24);
SerWrite(">>>> Sie haben das Programm Taster-Fahrt gewaehlt! <<<<",54);
zeile(5);
countdown();
}
}
if(x==2) // Auswahl Linienverfolgung
{
zeile(24);
SerWrite(">>>> Sie moechten den Asuro mit Linienerkennung betreiben. <<<<",63);
zeile(5);
SerWrite("Programmauswahl:",16);
zeile(2);
SerWrite("Druecken sie bitte den entsprechenden Taster:",44);
zeile(2);
SerWrite("1 >>> Selbsttest",16);
zeile(1);
SerWrite("2 >>> Abgrund-Fahrt",19);
zeile(1);
SerWrite("3 >>> Gatter-Fahrt",18);
zeile(1);
SerWrite("4 >>> Linienverfolgungs-Fahrt",29);
zeile(1);
SerWrite("6 >>> Taster-Fahrt",18);
zeile(1);
taster_2=PollSwitch();
abfrage_2=taster_2;
taster_1=0;
taster_2=0;
if(abfrage_1==2 && abfrage_2==1) //Selbsttest
{
zeile(24);
SerWrite(">>>> Sie haben das Programm Sebsttest gewaehlt! <<<<",59);
zeile(5);
countdown();
}
if(abfrage_1==2 && abfrage_2==2) //Abgrund
{
zeile(24);
SerWrite(">>>> Sie haben das Programm Abgrund-Fahrt gewaehlt! <<<<",55);
zeile(5);
countdown();
}
if(abfrage_1==2 && abfrage_2==4) //Gatter
{
zeile(24);
SerWrite(">>>> Sie haben das Programm Gatter-Fahrt gewaehlt! <<<<",55);
zeile(5);
countdown();
}
if(abfrage_1==2 && abfrage_2==8) //Lienienverfolgung
{
zeile(24);
SerWrite(">>>> Sie haben das Programm Lienenverfolgungs-Fahrt gewaehlt! <<<<",65);
zeile(5);
countdown();
}
if(abfrage_1==2 && abfrage_2==32) //Taster
{
zeile(24);
SerWrite(">>>> Sie haben das Programm Taster-Fahrt gewaehlt! <<<<",55);
zeile(5);
countdown();
}
}
}
while(1);
return 0;
}
mfg
SprinterSB
13.12.2006, 22:32
Dir ist ja klar, daß du ein Großteil des Flash mit Strings vollhaust, gleiches gilt für den SRAM. Du hast hier eine kleinen ATmega8 vor dir, kein PC mit 1GB Hauptspeicher und nem virtuellen Speicher von oo.
Den Platz, den das Programm belegt, kannst du mit avr-size anzeigen lassen. Wie das geht erzählt dir
avr-size --help
Allein die main() hat riesiges Sparpotential!
Die Multiplikationen mit 0,75 machen nicht das, was du willst!!!
https://www.roboternetz.de/wissen/index.php/Fallstricke_bei_der_C-Programmierung?robotik_mw_session=d1a39dbc233c260a 0c099ea7a86c8d1c#Ein_.2C_anstatt_._in_Konstante
Eine Multiplikation mit 0.75 wirst du auch nicht wollen, weil das dem ATmega8 erst recht den Boden raushaut. Also: Multipliziere mit 3 und teile dann durch 4 (gcc ist übrigens gescheit genug, um /4 durch einen Shift zu ersetzen).
Die beste Oprimierungsstufe für AVR ist -Os
Falls das RAM voll mit den Strings ist, dann legt die ins Flash und schreibt euch ne Funktion, die die Strings aus dem Flash ausgibt (merke: konstante Strings im RAM belegen Platz um RAM *und* im Flash).
https://www.roboternetz.de/wissen/index.php/Avr-gcc#Konstante_Strings_ins_Flash
Die Länge zu übergeben braucht bei jedem Aufruf nochmal 4 Bytes unnötig... und und und...
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.