PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Asuro Problem mit Programm



Florian2301
09.01.2012, 21:12
Ich habe folgendes Programm für meinen Asuro geschrieben, jedoch find ich den/die Fehler im Quelltext nicht warum es sich nicht mit der makeall übersetzen lässt.
Einen Fehler im Makefile kann ich ausschließen.
Vielen Dank für eure Hilfe
Florian

PS: Was bedeutet das /* ..... */



#include "asuro.h"


int Main (void)
{
// unsigned int i,data[2];
// unsigned char count = 0,flag = 0;
Init();
/*
for (i = 0; i < 0x1FFF; i++)
{
OdometrieData(data);
if ((data[0] < 200) && (flag == 1))
{
count ++;
flag = 0;
}
if (data[0] >= 600) flag = 1;
}
if (count > 10) Programme();
*/
while (1)
{
if (PollSwitch())
{
while (PollSwitch());
Programme();
}
Testfahrt();
}
return 0;
}


void Programme (void)
{
unsigned char sw;
SerPrint("Hello I am ASURO");
for (;;)
{
sw = PollSwitch();
if (sw == 0x01) Geradeaus();
if (sw == 0x02) Abgrund();
//if (sw == 0x04) L1();
//if (sw == 0x08) L2();
//if (sw == 0x16) L3();
//if (sw == 0x32) L4();
}
}


void Testfahrt(void)
{
unsigned char s1=100,s2=100;

MotorSpeed(150,150);
MotorDir(FWD,FWD);

while (1)
{
if (Wheelspeed[0]<150)s1++;
if (Wheelspeed[0]>160)s1--;
if (Wheelspeed[1]<150)s2++;
if (Wheelspeed[1]>160)s2--;

Msleep(2);
MotorSpeed(s1,s2);
}
}


void Abgrund(void)
#define STOP 200
{
unsigned int lineData[2];
unsigned char running = 1;
MotorDir(FWD,FWD);
FrontLED(ON);
MotorSpeed(255,255);
do
{
LineData(lineData);
if ((lineData[0] < STOP) || (lineData[1] < STOP))
{
MotorSpeed(0,0);
BackLED(ON,ON);
running = 0;
}
}
while (running);
while(1);
}


void Geradeaus(void)
{
int Lnow;
int Rnow;
int Rold;
int Lold;
int Count;
int sl;
int sr;
unsigned int data[2];
Count=0;
sl=120;
sr=120;
while(1){
MotorDir(FWD,FWD);
MotorSpeed(sl,sr);
OdometrieData(data);
if (data[0] > 512) Lnow = 1; else Lnow = 0;
if (data[1] > 512) Rnow = 1; else Rnow = 0;
if (Lnow ^ Lold) Count++;
if (Rnow ^ Rold) Count--;
Lold=Lnow;
Rold=Rnow;
if (Count>0) {sr++;}
if (Count<0) {sr--;}
if (sr>254){sr=255; sl--;}
if (sr<61){sr=60; sl++;}
}
}

Hubert.G
09.01.2012, 21:50
Was kommt den für eine Fehlermeldung?
Zwischen /*....*/ kommt Text oder Code der nicht eingebunden werden soll. Sollte auch farblich anders dargestellt werden.

radbruch
09.01.2012, 21:54
Hallo

Wenn du eine eigene Funktion aufrufst muss sie zuvor bekannt gemacht werden:


#include "asuro.h"


void Testfahrt(void)
{
unsigned char s1=100,s2=100;

MotorSpeed(150,150);
MotorDir(FWD,FWD);

while (1)
{
if (Wheelspeed[0]<150)s1++;
if (Wheelspeed[0]>160)s1--;
if (Wheelspeed[1]<150)s2++;
if (Wheelspeed[1]>160)s2--;

Msleep(2);
MotorSpeed(s1,s2);
}
}


void Abgrund(void)
#define STOP 200
{
unsigned int lineData[2];
unsigned char running = 1;
MotorDir(FWD,FWD);
FrontLED(ON);
MotorSpeed(255,255);
do
{
LineData(lineData);
if ((lineData[0] < STOP) || (lineData[1] < STOP))
{
MotorSpeed(0,0);
BackLED(ON,ON);
running = 0;
}
}
while (running);
while(1);
}


void Geradeaus(void)
{
int Lnow;
int Rnow;
int Rold=0;
int Lold=0;
int Count;
int sl;
int sr;
unsigned int data[2];
Count=0;
sl=120;
sr=120;
while(1){
MotorDir(FWD,FWD);
MotorSpeed(sl,sr);
OdometrieData(data);
if (data[0] > 512) Lnow = 1; else Lnow = 0;
if (data[1] > 512) Rnow = 1; else Rnow = 0;
if (Lnow ^ Lold) Count++;
if (Rnow ^ Rold) Count--;
Lold=Lnow;
Rold=Rnow;
if (Count>0) {sr++;}
if (Count<0) {sr--;}
if (sr>254){sr=255; sl--;}
if (sr<61){sr=60; sl++;}
}
}

void Programme (void)
{
unsigned char sw;
SerPrint("Hello I am ASURO");
for (;;)
{
sw = PollSwitch();
if (sw == 0x01) Geradeaus();
if (sw == 0x02) Abgrund();
//if (sw == 0x04) L1();
//if (sw == 0x08) L2();
//if (sw == 0x16) L3();
//if (sw == 0x32) L4();
}
}


int main(void)
{
// unsigned int i,data[2];
// unsigned char count = 0,flag = 0;
Init();
/*
for (i = 0; i < 0x1FFF; i++)
{
OdometrieData(data);
if ((data[0] < 200) && (flag == 1))
{
count ++;
flag = 0;
}
if (data[0] >= 600) flag = 1;
}
if (count > 10) Programme();
*/
while (1)
{
if (PollSwitch())
{
while (PollSwitch());
Programme();
}
Testfahrt();
}
return 0;
}Umgestellt und Main() wird kleingeschrieben, SerPrint() und WheelSpeed() kann ich nicht prüfen. Rold und Lold initialisiert. Besser kann ich's nicht, weil ich nicht die aktuelle Version der Lib installiert habe.


#include "asuro.h"

void a(void) // Deklaration und Definition (Bekanntmachung und Definition)
{
}

void b(void) // dito
{
a();
}

void c(void); // Deklaration

int main(void)
{
Init();
a();
b();
c();
while (1);
return 0;
}

void c(void) // Definition
{
a();
b();
}
Ich hoffe, das stimmt so.

Gruß

mic

Florian2301
10.01.2012, 19:29
Hallo nochmal das umstellen hatte zunächst geklappt und die einzelnen methoden in meinem jetzigen code funktionieren einzeln auch.
Wenn ich jedoch mein programm compiliere kommt folgende fehlermeldung mit unwichtigen Warnungen aber einem Error.

21142

Der Code:



#include "asuro.h"


void Testfahrt(void)
{
#define FULL_L 250
#define FULL_R 250

/* Motor vorwärts */
void MotorFwd(void)
{
MotorDir(FWD,FWD);
MotorSpeed(FULL_L,FULL_R);
}

/* Motor rückwärts */
void MotorRwd(void)
{
MotorDir(RWD,RWD);
MotorSpeed(FULL_L,FULL_R);
}

/* Motor rückwärts Links */
void MotorRwdL(void)
{
MotorDir(RWD,RWD);
MotorSpeed(FULL_L,0);
}

/* Motor rückwärts Rechts */
void MotorRwdR(void)
{
MotorDir(RWD,RWD);
MotorSpeed(0, FULL_R);
}

/* Motor stop */
void MotorStop(void)
{
MotorSpeed(0,0);
}


unsigned char t1, t2;

while (1)
{
t1 = PollSwitch();
t2 = PollSwitch();
if (t1 == 0 && t2 == 0) /* keine Taste */
{
MotorFwd(); /* vorwärts fahren */
FrontLED(ON);
BackLED(OFF,OFF);
}
else if (t1 && t2 && t1 == t2)
{
MotorStop();
if (t1 & 0x07) /* Tasten links gedrückt? */
{
MotorRwdL(); /* Rückwärtskurve links fahren */
FrontLED(OFF);
BackLED(ON,OFF);
}
if (t1 & 0x38) /* Tasten rechts gedrückt? */
{
MotorRwdR(); /* Rückwärtskurve rechts fahren */
FrontLED(OFF);
BackLED(OFF,ON);
}
Msleep(1000); /* 1 Sekunde fahren */
}
}
while(1);
return(0);
}



void Abgrund(void)
#define STOP 200
{
unsigned int lineData[2];
unsigned char running = 1;
MotorDir(FWD,FWD);
FrontLED(ON);
Msleep(72);
MotorSpeed(255,255);
do
{
LineData(lineData);
if ((lineData[0] < STOP) || (lineData[1] < STOP))
{
MotorDir(RWD,RWD);
MotorSpeed(255,255);
BackLED(ON,ON);
Msleep(230);
running = 0;
}
}
while (running==1);
MotorDir(BREAK,BREAK);
Programme();
}


void Rechteck(void)
{

while(1)
{
StatusLED(GREEN);
MotorDir(FWD,FWD);
MotorSpeed(255,255);
Msleep(1000);
BackLED(ON,ON);
StatusLED(RED);
MotorDir(BREAK,BREAK);
Msleep(230);
BackLED(OFF,OFF);
MotorDir(FWD,RWD);
MotorSpeed(255,255);
Msleep(220);

}
}

void Melodie(void)
{
uint16_t i; //zähler
uint16_t data[2]; //odo
uint16_t zuf; //zufall



//----------------------------------------------------------------------------------------
//----------------------------------------------------------------------------------------

//
// uint8_t zufall()
//
// Liefert eine 8Bit Pseudozufallszahl zurück,
// die Zahlenfolge wiederholt sich spätestens nach 65535 Aufrufen
//

uint8_t zufall()
{
static uint16_t startwert=0x0AA;

uint16_t temp;
uint8_t n;

for(n=1;n<8;n++)
{
temp = startwert;
startwert=startwert << 1;

temp ^= startwert;
if ( ( temp & 0x4000 ) == 0x4000 )
{
startwert |= 1;
}
}

return (startwert);
}

//----------------------------------------------------------------------------------------
//----------------------------------------------------------------------------------------





// tone table: thanks to IVO

//Töne definieren - tiefere Töne brummen und scheppern
#define A4 440
#define B4 466
#define H4 493
#define C5 523
#define DES5 554
#define D5 587
#define ES5 622
#define E5 659
#define F5 698
#define GES5 740
#define G5 783
#define AS5 830
#define A5 880
#define B5 932
#define H5 987
#define C6 1046
#define DES6 1108
#define D6 1174
#define ES6 1244
#define E6 1318
#define F6 1396
#define GES6 1479
#define G6 1567
#define AS6 1661
#define A6 1760
#define B6 1864
#define H6 1975
#define C7 2093
#define DES7 2217
#define D7 2349
#define ES7 2489
#define E7 2637
#define F7 2793
#define GES7 2959
#define G7 3135
#define AS7 3322
#define A7 3520
#define H7 3729
#define B7 3951

#define HALF 300
#define FULL 600
#define _OFF 0
#define STOP 0


uint16_t duck_melody[]={
C5,HALF,
D5,HALF,
E5,HALF,
F5,HALF,
G5,FULL,
_OFF,HALF,
G5,FULL,
_OFF,HALF,
A5,HALF,
_OFF,HALF,
A5,HALF,
_OFF,HALF,
A5,HALF,
_OFF,HALF,
A5,HALF,
_OFF,HALF,
G5,FULL,
_OFF,HALF,
A5,HALF,
_OFF,HALF,
A5,HALF,
_OFF,HALF,
A5,HALF,
_OFF,HALF,
A5,HALF,
_OFF,HALF,
G5,FULL,
_OFF,HALF,

F5,HALF,
_OFF,HALF,
F5,HALF,
_OFF,HALF,
F5,HALF,
_OFF,HALF,
F5,HALF,
_OFF,HALF,
E5,FULL,
_OFF,HALF,
E5,FULL,
_OFF,HALF,

D5,HALF,
_OFF,HALF,
D5,HALF,
_OFF,HALF,
D5,HALF,
_OFF,HALF,
D5,HALF,
_OFF,HALF,

C5,FULL,
_OFF,HALF,

STOP,STOP
};

uint16_t unknown_melody[]={
G5,FULL,
G5,FULL,
A5,HALF,
G5,HALF,
C6,HALF,
H5,HALF/2,
G5,FULL,
G5,FULL,
A5,HALF,
G5,HALF,
D6,HALF,
C6,HALF/2,
G5,FULL,
G5,FULL,
G6,HALF,
E6,HALF,
C6,FULL,
C6,FULL,
H5,HALF,
A5,HALF,
F6,FULL,
F6,FULL,
E6,HALF,
C6,HALF,
D6,HALF,
C6,HALF/2,

STOP,STOP
};

uint16_t schwebung1[]={
C5,1000,
C5,1000,
C5,1000,
C5,2000,
STOP,STOP
};
uint16_t schwebung2[]={
D5,1000,
E5,1000,
F5,1000,
G5,2000,
STOP,STOP
};


/************************************************** *************************
* void StereoSound(uint16_t *noten1, uint16_t *noten2)
*
* use two motors as loudspeaker and create a sound on each motor
*
* input
* noten1,noten2: tables with tone pitch and duration
*
************************************************** *************************/
#define FS 31250 // controlled by timer2 8Mhz/256

void StereoSound(uint16_t *noten1, uint16_t *noten2)
{
uint16_t index1=0,index2=0;
uint16_t timer1,timer2;
uint16_t phase1,phase2,angle1,angle2;
uint8_t dir1=FWD,dir2=FWD;
uint8_t speed1,speed2;

angle1=(uint32_t)noten1[index1++]*65536/FS;
timer1=noten1[index1++]*(FS/1000);
if(angle1==0)speed1=0;
else speed1=255;

angle2=(uint32_t)noten2[index2++]*65536/FS;
timer2=noten2[index2++]*(FS/1000);
if(angle2==0)speed2=0;
else speed2=255;

MotorSpeed(speed1,speed2);



cli(); // stop all interrupts





while(timer1!=0)
{


timer1--;
timer2--;


if(timer1==0)
{
angle1=(uint32_t)noten1[index1++]*65536/FS;
timer1=noten1[index1++]*(FS/1000);
if(angle1==0)speed1=0;
else speed1=255;

MotorSpeed(speed1,speed2);


if ( angle1 > 0 )
{
//links an
PORTC |=(1<<PC1);
}

else
//links aus
{
PORTC &=~(1<<PC1);
}



//statusLED

zuf = zufall(); // Zufallszahlen zw. 0 und 255
zuf = zuf * 3; // 255 510 765

if ((zuf > 510))
{
StatusLED(RED);
}
else if ((zuf > 255) && (zuf <= 510))
{
StatusLED(YELLOW);
}
else if (zuf <= 255)
{
StatusLED(GREEN);
}




if(timer2==0)
{
angle2=(uint32_t)noten2[index2++]*65536/FS;
timer2=noten2[index2++]*(FS/1000);
if(angle2==0)speed2=0;
else speed2=255;

MotorSpeed(speed1,speed2);

if ( angle2 > 0 )
{
//rechts an
PORTC |=(1<<PC0);
}

else
//rechts aus
{
PORTC &=~(1<<PC0);
}
}





}

if(timer2==0)
{
angle2=(uint32_t)noten2[index2++]*65536/FS;
timer2=noten2[index2++]*(FS/1000);
if(angle2==0)speed2=0;
else speed2=255;

MotorSpeed(speed1,speed2);


}



phase1+=angle1;

if(phase1&0x8000) dir1=FWD;
else dir1=RWD;

phase2+=angle2;

if(phase2&0x8000) dir2=FWD;
else dir2=RWD;
MotorDir(dir1,dir2);

// sync with Timer2 ( 31250Hz )
while(!(TIFR&(1<<TOV2)));
TIFR|=TIFR&(1<<TOV2);
}


MotorSpeed(0,0);
sei(); // enable all interrupts
}





// 1 sec "Anfangs-Zufallszahl"
StatusLED(OFF);
BackLED(OFF,OFF);

Msleep(1000);

StatusLED(OFF);
BackLED(ON,ON);

DDRC = (1<<PC1);
DDRC |= (1<<PC0);
PORTC=(1<<PC1);
PORTC |=(1<<PC0);

// One voice on two notors
StereoSound(duck_melody,duck_melody);

StatusLED(OFF);
PORTC=(0<<PC1);
PORTC |=(0<<PC0);
Msleep(1000);

// Two voices, one on each Motor
StereoSound(duck_melody,&duck_melody[4]);

StatusLED(OFF);
PORTC=(0<<PC1);
PORTC |=(0<<PC0);
Msleep(1000);


// Two voices, one on each Motor
StereoSound(duck_melody,&duck_melody[6]);

StatusLED(OFF);
PORTC=(0<<PC1);
PORTC |=(0<<PC0);
Msleep(1000);

// Two voices, one on each Motor
StereoSound(duck_melody,&duck_melody[8]);

StatusLED(OFF);
PORTC=(0<<PC1);
PORTC |=(0<<PC0);
Msleep(1000);

// One voice on two notors
StereoSound(unknown_melody,unknown_melody);

StatusLED(OFF);
PORTC=(0<<PC1);
PORTC |=(0<<PC0);
Msleep(1000);

// Two voices, one on each Motor
StereoSound(unknown_melody,&unknown_melody[6]);

StatusLED(OFF);
PORTC=(0<<PC1);
PORTC |=(0<<PC0);
Msleep(1000);

// Two different melodies
StereoSound(unknown_melody,duck_melody);

StatusLED(OFF);
PORTC=(0<<PC1);
PORTC |=(0<<PC0);
Msleep(1000);

StatusLED(OFF);
StereoSound(schwebung1,schwebung2);

StatusLED(OFF);
PORTC=(0<<PC1);
PORTC |=(0<<PC0);
Msleep(1000);

StatusLED(Green);

Programme();



}

void Programme (void)
{
unsigned char sw;
SerPrint("Hello I am ASURO");
for (;;)
{
sw = PollSwitch();
if (sw == 0x01) Melodie();
if (sw == 0x02) Abgrund();
if (sw == 0x04) Rechteck();
//if (sw == 0x08) L2();
//if (sw == 0x16) L3();
//if (sw == 0x32) L4();
}
}


int main(void)
{
unsigned int i,data[2];
unsigned char count = 0,flag = 0;
Init();

for (i = 0; i < 0x1FFF; i++)
{
OdometrieData(data);
if ((data[0] < 200) && (flag == 1))
{
count ++;
flag = 0;
}
if (data[0] >= 600) flag = 1;
}
if (count > 10) Programme();

/* while (1)
{
if (PollSwitch())
{
while (PollSwitch());
Programme();
}
*/ else
Testfahrt();

// }

return 0;
}

radbruch
10.01.2012, 20:42
#include "asuro.h"

void Testfahrt(void)
{
#define FULL_L 250
#define FULL_R 250

/* Motor vorwärts */
void MotorFwd(void)
{
MotorDir(FWD,FWD);
MotorSpeed(FULL_L,FULL_R);
}

/* Motor rückwärts */
void MotorRwd(void)
{
MotorDir(RWD,RWD);
MotorSpeed(FULL_L,FULL_R);
}

/* Motor rückwärts Links */
void MotorRwdL(void)
{
MotorDir(RWD,RWD);
MotorSpeed(FULL_L,0);
}

/* Motor rückwärts Rechts */
void MotorRwdR(void)
{
MotorDir(RWD,RWD);
MotorSpeed(0, FULL_R);
}

/* Motor stop */
void MotorStop(void)
{
MotorSpeed(0,0);
}

unsigned char t1, t2;

while (1)
{
t1 = PollSwitch();
t2 = PollSwitch();
if (t1 == 0 && t2 == 0) /* keine Taste */
{
MotorFwd(); /* vorwärts fahren */
FrontLED(ON);
BackLED(OFF,OFF);
}
else if (t1 && t2 && t1 == t2)
{
MotorStop();
if (t1 & 0x07) /* Tasten links gedrückt? */
{
MotorRwdL(); /* Rückwärtskurve links fahren */
FrontLED(OFF);
BackLED(ON,OFF);
}
if (t1 & 0x38) /* Tasten rechts gedrückt? */
{
MotorRwdR(); /* Rückwärtskurve rechts fahren */
FrontLED(OFF);
BackLED(OFF,ON);
}
Msleep(1000); /* 1 Sekunde fahren */
}
}
}


void Programme (void);
void Abgrund(void)
#define Anhalten 200
{
unsigned int lineData[2];
unsigned char running = 1;
MotorDir(FWD,FWD);
FrontLED(ON);
Msleep(72);
MotorSpeed(255,255);
do
{
LineData(lineData);
if ((lineData[0] < Anhalten) || (lineData[1] < Anhalten))
{
MotorDir(RWD,RWD);
MotorSpeed(255,255);
BackLED(ON,ON);
Msleep(230);
running = 0;
}
}
while (running==1);
MotorDir(BREAK,BREAK);
Programme();
}


void Rechteck(void)
{

while(1)
{
StatusLED(GREEN);
MotorDir(FWD,FWD);
MotorSpeed(255,255);
Msleep(1000);
BackLED(ON,ON);
StatusLED(RED);
MotorDir(BREAK,BREAK);
Msleep(230);
BackLED(OFF,OFF);
MotorDir(FWD,RWD);
MotorSpeed(255,255);
Msleep(220);

}
}

void Melodie(void)
{
//uint16_t i; //zähler
//uint16_t data[2]; //odo
uint16_t zuf; //zufall



//----------------------------------------------------------------------------------------
//----------------------------------------------------------------------------------------

//
// uint8_t zufall()
//
// Liefert eine 8Bit Pseudozufallszahl zurück,
// die Zahlenfolge wiederholt sich spätestens nach 65535 Aufrufen
//

uint8_t zufall(void)
{
static uint16_t startwert=0x0AA;

uint16_t temp;
uint8_t n;

for(n=1;n<8;n++)
{
temp = startwert;
startwert=startwert << 1;

temp ^= startwert;
if ( ( temp & 0x4000 ) == 0x4000 )
{
startwert |= 1;
}
}

return (startwert);
}

//----------------------------------------------------------------------------------------
//----------------------------------------------------------------------------------------





// tone table: thanks to IVO

//Töne definieren - tiefere Töne brummen und scheppern
#define A4 440
#define B4 466
#define H4 493
#define C5 523
#define DES5 554
#define D5 587
#define ES5 622
#define E5 659
#define F5 698
#define GES5 740
#define G5 783
#define AS5 830
#define A5 880
#define B5 932
#define H5 987
#define C6 1046
#define DES6 1108
#define D6 1174
#define ES6 1244
#define E6 1318
#define F6 1396
#define GES6 1479
#define G6 1567
#define AS6 1661
#define A6 1760
#define B6 1864
#define H6 1975
#define C7 2093
#define DES7 2217
#define D7 2349
#define ES7 2489
#define E7 2637
#define F7 2793
#define GES7 2959
#define G7 3135
#define AS7 3322
#define A7 3520
#define H7 3729
#define B7 3951

#define HALF 300
#define FULL 600
#define _OFF 0
#define STOPP 0


uint16_t duck_melody[]={
C5,HALF,
D5,HALF,
E5,HALF,
F5,HALF,
G5,FULL,
_OFF,HALF,
G5,FULL,
_OFF,HALF,
A5,HALF,
_OFF,HALF,
A5,HALF,
_OFF,HALF,
A5,HALF,
_OFF,HALF,
A5,HALF,
_OFF,HALF,
G5,FULL,
_OFF,HALF,
A5,HALF,
_OFF,HALF,
A5,HALF,
_OFF,HALF,
A5,HALF,
_OFF,HALF,
A5,HALF,
_OFF,HALF,
G5,FULL,
_OFF,HALF,

F5,HALF,
_OFF,HALF,
F5,HALF,
_OFF,HALF,
F5,HALF,
_OFF,HALF,
F5,HALF,
_OFF,HALF,
E5,FULL,
_OFF,HALF,
E5,FULL,
_OFF,HALF,

D5,HALF,
_OFF,HALF,
D5,HALF,
_OFF,HALF,
D5,HALF,
_OFF,HALF,
D5,HALF,
_OFF,HALF,

C5,FULL,
_OFF,HALF,

STOPP,STOPP
};

uint16_t unknown_melody[]={
G5,FULL,
G5,FULL,
A5,HALF,
G5,HALF,
C6,HALF,
H5,HALF/2,
G5,FULL,
G5,FULL,
A5,HALF,
G5,HALF,
D6,HALF,
C6,HALF/2,
G5,FULL,
G5,FULL,
G6,HALF,
E6,HALF,
C6,FULL,
C6,FULL,
H5,HALF,
A5,HALF,
F6,FULL,
F6,FULL,
E6,HALF,
C6,HALF,
D6,HALF,
C6,HALF/2,

STOPP,STOPP
};

uint16_t schwebung1[]={
C5,1000,
C5,1000,
C5,1000,
C5,2000,
STOPP,STOPP
};
uint16_t schwebung2[]={
D5,1000,
E5,1000,
F5,1000,
G5,2000,
STOPP,STOPP
};


/************************************************** *************************
* void StereoSound(uint16_t *noten1, uint16_t *noten2)
*
* use two motors as loudspeaker and create a sound on each motor
*
* input
* noten1,noten2: tables with tone pitch and duration
*
************************************************** *************************/
#define FS 31250 // controlled by timer2 8Mhz/256

void StereoSound(uint16_t *noten1, uint16_t *noten2)
{
uint16_t index1=0,index2=0;
uint16_t timer1,timer2;
uint16_t phase1=0,phase2=0,angle1,angle2;
uint8_t dir1=FWD,dir2=FWD;
uint8_t speed1,speed2;

angle1=(uint32_t)noten1[index1++]*65536/FS;
timer1=noten1[index1++]*(FS/1000);
if(angle1==0)speed1=0;
else speed1=255;

angle2=(uint32_t)noten2[index2++]*65536/FS;
timer2=noten2[index2++]*(FS/1000);
if(angle2==0)speed2=0;
else speed2=255;

MotorSpeed(speed1,speed2);



cli(); // stop all interrupts





while(timer1!=0)
{


timer1--;
timer2--;


if(timer1==0)
{
angle1=(uint32_t)noten1[index1++]*65536/FS;
timer1=noten1[index1++]*(FS/1000);
if(angle1==0)speed1=0;
else speed1=255;

MotorSpeed(speed1,speed2);


if ( angle1 > 0 )
{
//links an
PORTC |=(1<<PC1);
}

else
//links aus
{
PORTC &=~(1<<PC1);
}



//statusLED

zuf = zufall(); // Zufallszahlen zw. 0 und 255
zuf = zuf * 3; // 255 510 765

if ((zuf > 510))
{
StatusLED(RED);
}
else if ((zuf > 255) && (zuf <= 510))
{
StatusLED(YELLOW);
}
else if (zuf <= 255)
{
StatusLED(GREEN);
}




if(timer2==0)
{
angle2=(uint32_t)noten2[index2++]*65536/FS;
timer2=noten2[index2++]*(FS/1000);
if(angle2==0)speed2=0;
else speed2=255;

MotorSpeed(speed1,speed2);

if ( angle2 > 0 )
{
//rechts an
PORTC |=(1<<PC0);
}

else
//rechts aus
{
PORTC &=~(1<<PC0);
}
}





}

if(timer2==0)
{
angle2=(uint32_t)noten2[index2++]*65536/FS;
timer2=noten2[index2++]*(FS/1000);
if(angle2==0)speed2=0;
else speed2=255;

MotorSpeed(speed1,speed2);


}



phase1+=angle1;

if(phase1&0x8000) dir1=FWD;
else dir1=RWD;

phase2+=angle2;

if(phase2&0x8000) dir2=FWD;
else dir2=RWD;
MotorDir(dir1,dir2);

// sync with Timer2 ( 31250Hz )
while(!(TIFR&(1<<TOV2)));
TIFR|=TIFR&(1<<TOV2);
}


MotorSpeed(0,0);
sei(); // enable all interrupts
}





// 1 sec "Anfangs-Zufallszahl"
StatusLED(OFF);
BackLED(OFF,OFF);

Msleep(1000);

StatusLED(OFF);
BackLED(ON,ON);

DDRC = (1<<PC1);
DDRC |= (1<<PC0);
PORTC=(1<<PC1);
PORTC |=(1<<PC0);

// One voice on two notors
StereoSound(duck_melody,duck_melody);

StatusLED(OFF);
PORTC=(0<<PC1);
PORTC |=(0<<PC0);
Msleep(1000);

// Two voices, one on each Motor
StereoSound(duck_melody,&duck_melody[4]);

StatusLED(OFF);
PORTC=(0<<PC1);
PORTC |=(0<<PC0);
Msleep(1000);


// Two voices, one on each Motor
StereoSound(duck_melody,&duck_melody[6]);

StatusLED(OFF);
PORTC=(0<<PC1);
PORTC |=(0<<PC0);
Msleep(1000);

// Two voices, one on each Motor
StereoSound(duck_melody,&duck_melody[8]);

StatusLED(OFF);
PORTC=(0<<PC1);
PORTC |=(0<<PC0);
Msleep(1000);

// One voice on two notors
StereoSound(unknown_melody,unknown_melody);

StatusLED(OFF);
PORTC=(0<<PC1);
PORTC |=(0<<PC0);
Msleep(1000);

// Two voices, one on each Motor
StereoSound(unknown_melody,&unknown_melody[6]);

StatusLED(OFF);
PORTC=(0<<PC1);
PORTC |=(0<<PC0);
Msleep(1000);

// Two different melodies
StereoSound(unknown_melody,duck_melody);

StatusLED(OFF);
PORTC=(0<<PC1);
PORTC |=(0<<PC0);
Msleep(1000);

StatusLED(OFF);
StereoSound(schwebung1,schwebung2);

StatusLED(OFF);
PORTC=(0<<PC1);
PORTC |=(0<<PC0);
Msleep(1000);

StatusLED(GREEN);

Programme();



}

void Programme (void)
{
unsigned char sw;
SerPrint("Hello I am ASURO");
for (;;)
{
sw = PollSwitch();
if (sw == 0x01) Melodie();
if (sw == 0x02) Abgrund();
if (sw == 0x04) Rechteck();
//if (sw == 0x08) L2();
//if (sw == 0x16) L3();
//if (sw == 0x32) L4();
}
}


int main(void)
{
unsigned int i,data[2];
unsigned char count = 0,flag = 0;
Init();

for (i = 0; i < 0x1FFF; i++)
{
OdometrieData(data);
if ((data[0] < 200) && (flag == 1))
{
count ++;
flag = 0;
}
if (data[0] >= 600) flag = 1;
}
if (count > 10) Programme();

/* while (1)
{
if (PollSwitch())
{
while (PollSwitch());
Programme();
}
*/ else
Testfahrt();

// }

return 0;
}Nur die Kompilerfehler und -warnungen beseitigt, Ablauf oder Funktion nicht überprüft. Dein #define STOP-Konzept solltest du mal überdenken.

Mehr Übersicht erhältst du mit der #include-Funktion. Wenn du z.B. den folgenden Code in einer Datei testfahrt.c speicherst

void Testfahrt(void)
{
#define FULL_L 250
#define FULL_R 250

/* Motor vorwärts */
void MotorFwd(void)
{
MotorDir(FWD,FWD);
MotorSpeed(FULL_L,FULL_R);
}

/* Motor rückwärts */
void MotorRwd(void)
{
MotorDir(RWD,RWD);
MotorSpeed(FULL_L,FULL_R);
}

/* Motor rückwärts Links */
void MotorRwdL(void)
{
MotorDir(RWD,RWD);
MotorSpeed(FULL_L,0);
}

/* Motor rückwärts Rechts */
void MotorRwdR(void)
{
MotorDir(RWD,RWD);
MotorSpeed(0, FULL_R);
}

/* Motor stop */
void MotorStop(void)
{
MotorSpeed(0,0);
}

unsigned char t1, t2;

while (1)
{
t1 = PollSwitch();
t2 = PollSwitch();
if (t1 == 0 && t2 == 0) /* keine Taste */
{
MotorFwd(); /* vorwärts fahren */
FrontLED(ON);
BackLED(OFF,OFF);
}
else if (t1 && t2 && t1 == t2)
{
MotorStop();
if (t1 & 0x07) /* Tasten links gedrückt? */
{
MotorRwdL(); /* Rückwärtskurve links fahren */
FrontLED(OFF);
BackLED(ON,OFF);
}
if (t1 & 0x38) /* Tasten rechts gedrückt? */
{
MotorRwdR(); /* Rückwärtskurve rechts fahren */
FrontLED(OFF);
BackLED(OFF,ON);
}
Msleep(1000); /* 1 Sekunde fahren */
}
}
}
kannst du die Datei an jeder beliebigen Stelle in deinem Programm wieder einsetzen. Für den Kompiler ist es dann so als ob der Inhalt der Datei genau an dieser Stelle eingegeben worden wäre:

#include "asuro.h"

#include "testfahrt.c" // Datei muss im selben Verzeichniss wie das Programm sein!

void Programme (void);
void Abgrund(void)
#define Anhalten 200
{
unsigned int lineData[2];
unsigned char running = 1;
MotorDir(FWD,FWD);
FrontLED(ON);
Msleep(72);
MotorSpeed(255,255);
do
{
LineData(lineData);
if ((lineData[0] < Anhalten) || (lineData[1] < Anhalten))
{
MotorDir(RWD,RWD);
MotorSpeed(255,255);
BackLED(ON,ON);
Msleep(230);
running = 0;
}
}
while (running==1);
MotorDir(BREAK,BREAK);
Programme();
}


void Rechteck(void)
{

while(1)
{
StatusLED(GREEN);
MotorDir(FWD,FWD);
MotorSpeed(255,255);
Msleep(1000);
BackLED(ON,ON);
StatusLED(RED);
MotorDir(BREAK,BREAK);
Msleep(230);
BackLED(OFF,OFF);
MotorDir(FWD,RWD);
MotorSpeed(255,255);
Msleep(220);

}
}

#include "melodie.c" // Die ausgelagerten Soundfunktionen

void Programme (void)
{
unsigned char sw;
SerPrint("Hello I am ASURO");
for (;;)
{
sw = PollSwitch();
if (sw == 0x01) Melodie();
if (sw == 0x02) Abgrund();
if (sw == 0x04) Rechteck();
//if (sw == 0x08) L2();
//if (sw == 0x16) L3();
//if (sw == 0x32) L4();
}
}


int main(void)
{
unsigned int i,data[2];
unsigned char count = 0,flag = 0;
Init();

for (i = 0; i < 0x1FFF; i++)
{
OdometrieData(data);
if ((data[0] < 200) && (flag == 1))
{
count ++;
flag = 0;
}
if (data[0] >= 600) flag = 1;
}
if (count > 10) Programme();

/* while (1)
{
if (PollSwitch())
{
while (PollSwitch());
Programme();
}
*/ else
Testfahrt();

// }

return 0;
}Mit der Tonausgabe und melodie.c funktioniert es genauso. Das ist der Anfang eigener Libraries.

Gruß

mic

Florian2301
10.01.2012, 21:08
Super wirklich vielen Dank!
Im Moment nutze ich Programmers Notepad aber wie gesagt ist es für mich sehr schwer die Fehler in meinem Quelltext zu finden.
Wie findest du alle Fehler immer so schnell?
Gibt es auch bessere Programmierumgebungen die mir konkretere Auskünfte über die Fehler geben.
Deine Hilfe ist wirklich genial für so einen Anfänger wie mich.
MfG Florian

Florian2301
11.01.2012, 19:17
Andere Programmierumgebung zur besseren Fehlersuche?

Valen
17.01.2012, 09:54
Super wirklich vielen Dank!
Im Moment nutze ich Programmers Notepad aber wie gesagt ist es für mich sehr schwer die Fehler in meinem Quelltext zu finden.
Wie findest du alle Fehler immer so schnell?
Gibt es auch bessere Programmierumgebungen die mir konkretere Auskünfte über die Fehler geben.
Deine Hilfe ist wirklich genial für so einen Anfänger wie mich.
MfG FlorianIn die Fehlermeldungen steht zwischen die Datei Name und der bestimmte Fehlerbeschreibung die Regelnummer wo es schief geht. Dort ist es. Aber leider sind die Fehlermeldungen ganz Kryptisch.