So habe das mit den Tastern verbessert.
Der ganze Code sieht jetzt in etwa so aus:
Code:
#include "asuro.h"
#include <stdlib.h>
unsigned char ir1;
#define PWM_STEP 5
#define MESSZEIT 500 //ms
#define FULL_L 130
#define FULL_R 130
/* 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);
}
int main (void)
{
unsigned int lData[2];
unsigned char sw, speed;
unsigned char ir;
int t1, t2;
int u;
int Reibung_links;
int Reibung_rechts;
unsigned char ir2;
Init();
DDRD |= (1 << DDD1); // Port D1 als Ausgang
PORTD &= ~(1 << PD1); // PD1 auf LOW
OCR2 = 0xFB;
speed=130;
Encoder_Init();
for(;;)
{
ir=PIND & (1 << PD0);
FrontLED(ON);
LineData(lData);
if (PIND & (1 << PD0))
{
if(lData[1] <= 80 && lData[1] >= 10)
{
BackLED(ON,ON);
StatusLED(GREEN);
MotorDir(RWD, RWD);
MotorSpeed(190, 190);
Msleep(500);
MotorDir(BREAK, RWD);
MotorSpeed(0, 150);
Msleep(500);
}
else
{
FrontLED(ON);
BackLED(OFF,OFF);
StatusLED(RED);
MotorDir(FWD, FWD);
MotorSpeed(140, 140);
}
}
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);
}
ir1=ir;
ir2=ir1;
sw = PollSwitch();
if (sw & 0x04)
{
OCR2 = 0xFC;
}
if (sw & 0x08)
{
OCR2 = 0xFB;
}
u=Batterie(); // u=922 entspricht 5.03V
Encoder_Set(0,0); // Messung starten
Msleep(500); // 500 ms Messen
Reibung_links = PWM*u*10/255-25*encoder[LEFT];
Reibung_rechts = PWM*u*10/255-25*encoder[RIGHT];
LineData(lData); // nochmals erneut prüfen ob er eine Tischkante erreicht hat,
//da er ja 0,5 Sekunden für das Messen gebraucht hat.
if(lData[1] <= 80 && lData[1] >= 10)
{
BackLED(ON,ON);
StatusLED(GREEN);
MotorDir(RWD, RWD);
MotorSpeed(190, 190);
Msleep(500);
MotorDir(BREAK, RWD);
MotorSpeed(0, 150);
Msleep(500);
}
if(Reibung_links >= 108 || Reibung_rechts >= 108) //Jetzt prüfen ob die Reibung den bestimmten Wert erreicht hat
{
BackLED(ON,ON);
StatusLED(YELLOW);
MotorDir(RWD, RWD);
MotorSpeed(150, 150);
Msleep(800);
MotorDir(BREAK, RWD);
MotorSpeed(0, 150);
Msleep(530);
}
t1 = PollSwitch();
t2 = PollSwitch();
if (t1 == 0 && t2 == 0)
{
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 */
}
}
return 0;
}
Nun kommen aber noch 2 Warnungen:
test.c:136: warning: suggest parentheses around arithmetic in operand of |
test.c:137: warning: suggest parentheses around arithmetic in operand of |
in diesen Zeilen:
Reibung_links = PWM*u*10/255-25*encoder[LEFT];
Reibung_rechts = PWM*u*10/255-25*encoder[RIGHT];
Lesezeichen