Ich hab jetzt ein Programm geschrieben. Das war ein Haufen Arbeit. Ich hoffe, dass es vom Prinzip her funktionieren würde. Ich weiß nicht, woran der Fehler liegt. Die Status LED flackert nur, daher behaupte ich, dass da ein Fehler im Programm sein muss.
Code:
#include "asuro.h"
#include <math.h>
int main(void){
float w=0,r=0,puls=1;
unsigned int obj=0, objx[500], objy[500], Rmin = 1024, Rmax = 0, Lmin = 1024, Lmax = 0, Rmitte = 512, Lmitte = 512, data[2], wegr=0, wegl=0, richt=1, x=0, y=0, i=0;
unsigned char flagl=FALSE, flagr=FALSE, eingetr=FALSE;
Init();
DDRD |= (1 << DDD1); // Port D1 als Ausgang
PORTD &= ~(1 << PD1); // PD1 auf LOW
puls = 1;
while(1){
if (PIND & (1 << PD0)){
StatusLED(GREEN); // kein Hindernis
} else {
if(eingetr==FALSE){
objx[obj]=x;
objy[obj]=y;
obj++;
eingetr=TRUE;
}
richt=2;
StatusLED(RED); // Hindernis erkannt
}
puls = 1.02 * puls; // Pulsbreite wird um 2% erhöht
if (puls > 10){
if (PIND & (1 << PD0)){ richt=1; eingetr=FALSE; }
puls = 1; }
OCR2 = 255 - (int)(puls);
if(richt==0) MotorDir(BREAK,BREAK);
if(richt==1) MotorDir(FWD,FWD);
if(richt==2) MotorDir(BREAK,FWD);
MotorSpeed(150,150);
for(i=0;i<=obj;i++){
if((x<=objx[i]+10) && (y<=objy[i]+10)) richt=2;
}
//-----------------------Schritte zählen-----------------------------------
OdometrieData(data); // 0. links, 1. rechts
// max links
if (data[0] > Lmax)
Lmax += (data[0] - Lmax) / 2;
// min links
if (data[0] < Lmin)
Lmin -= (Lmin - data[0]) / 2;
// max rechts
if (data[1] > Rmax)
Rmax += (data[1] - Rmax) / 2;
// min rechts
if (data[1] < Rmin)
Rmin -= (Rmin - data[1]) / 2;
Rmitte=(Rmax+Rmin)/2;
Lmitte=(Lmin+Lmax)/2;
if ((data[0] < Lmitte) && (flagl == TRUE)) {
flagl = FALSE;
}
if ((data[0] > Lmitte) && (flagl == FALSE)) {
flagl = TRUE;
wegl++;
}
if ((data[1] < Rmitte) && (flagr == TRUE)) {
flagr = FALSE;
}
if ((data[1] > Rmitte) && (flagr == FALSE)) {
flagr = TRUE;
wegr++;
}
//------------------------------------------------------------------------
//------------------------POSITIONSBESTIMMUNG-----------------------------
w=1.607143*(wegl-wegr); //winkel
r=((wegl+wegr)/2)*w;
x=(int)(r*cos(w));
y=(int)(r*sin(w));
}
return(0);
}
Lesezeichen