also der code von radbruch ist ja folgender:
Code:
#include "asuro.h"
#include <stdlib.h>
int main(void)
{
unsigned char sw, speed;
unsigned char ir,ir1,ir2;
Init();
DDRD |= (1 << DDD1); // Port D1 als Ausgang
PORTD &= ~(1 << PD1); // PD1 auf LOW
OCR2 = 0xFC;
speed=140;
ir = 0;
ir1 = 0;
ir2 = 0;
ir3 = 0;
ir4 = 0;
while(1)
{
ir=PIND & (1 << PD0);
if (ir || ir1){
BackLED(OFF,OFF);
MotorDir(FWD,FWD);
MotorSpeed(speed,speed);
} else {
BackLED(ON,ON);
MotorDir(RWD,RWD);
MotorSpeed(speed,speed);
if (speed > 0) Msleep(500);
MotorDir(BREAK,RWD);
MotorSpeed(0,speed);
if (speed > 0) Msleep(500);
}
ir2=ir1; ir1=ir;
sw = PollSwitch();
/*
if (sw & 0x01)
OCR2 = 0xFE;
if (sw & 0x02)
OCR2 = 0xFD;
*/
if (sw & 0x04)
OCR2 = 0xFC;
if (sw & 0x08)
OCR2 = 0xFB;
/*
if (sw & 0x10)
OCR2 = 0xFA;
if (sw & 0x20)
OCR2 = 0xF9;
*/
}
return 0;
}
der funktioniert bei mir ausgezeichnet
jetzt hab ich wie gesagt versucht, den etwas auszubauen, bzw abzuwandeln(sind sicher auch noch einige andere fehler drin)
Code:
#include "asuro.h"
#include <stdlib.h>
int Abbiegtest();
int main(void)
{
unsigned char speed,Abbiegen;
unsigned char ir,ir1,ir2,ir3,ir4;
Init();
DDRD |= (1 << DDD1); // Port D1 als Ausgang
PORTD &= ~(1 << PD1); // PD1 auf LOW
OCR2 = 0xFE;
speed=100;
while(1)
{
ir=PIND & (1 << PD0);
if (ir || ir1 || ir2 || ir3 || ir4) // ALLES OK
{
FrontLED(OFF);
BackLED(OFF,OFF);
MotorDir(FWD,FWD);
MotorSpeed(speed,speed);
}
else // HINDERNIS!!!!!!!!!!!!!!
{
BackLED(ON,ON);
FrontLED(ON);
/*Abbiegen = 1 & rand();
if(Abbiegen == 0) // nach links lenken
{
MotorSpeed(110,130);
Msleep(300);
if (Abbiegtest() == 0) //wenn in die linke Richtung ein Hindernis kommt...
{
MotorSpeed(230,100); //...eine Sekunde nach rechts lenken
Msleep(800);
}
else
continue;
}
else
{
MotorSpeed(speed,130);
Msleep(300);
if (Abbiegtest() == 0) //wenn in die linke Richtung ein Hindernis kommt...
{
MotorSpeed(100,230); //...eine Sekunde nach rechts lenken
Msleep(800);
}
else
continue;
}*/
}
ir4 = ir3;
ir3 = ir2;
ir2 = ir1;
ir1 = ir;
}
return 0;
}
int Abbiegtest ()
{
unsigned char i,infr,infr1,infr2;
OCR2 = 0xDE;
infr = PIND & (1 << PD0);
for(i=1;i<=50;i++)
{
if (infr||infr1)
continue;
else
return 0; // Hindernis in der Richtung
}
infr2 = infr1;
infr1 = infr;
return 1; // kein Hindernis, Richtung kann weiterbehalten werden
}
ich hab erstmal den rest vom else-teil auskommentiert, um den fehlerbereich einzugrenzen
fakt ist, lass ich in dem teil
Code:
if (ir || ir1 || ir2 || ir3 || ir4) // ALLES OK
{
FrontLED(OFF);
BackLED(OFF,OFF);
MotorDir(FWD,FWD);
MotorSpeed(speed,speed);
}
den MotorSpeed an, springt er jedes mal nach dem Anschalten in den else-teil
Kommentier ich es aus, Fangen die LEDs erst an zu leuchten, wenn ich zb mit der Hand vor meiner IR-Abteilung rumwinke
Lesezeichen