hi leute
ich bin echt am verzweifeln hab nur noch eine woche und es klappt einfach nicht wie ich es möchte...
hab das Programm von oben um einiges erleichtert...denke ich
aber es funktioniert immernoch nicht
ich habe es jetzt mit dem SerRead gemacht aber ich verstehe nicht genau wie das funktioniert, kann mir da jemand pls helfen
die funktion heißt ja:
SerRead(&cmd,1,0xFFFE);
was bedeutet hier das &cmd und das 0xFFFE?
und wenn der knopf auf der tastatur gedrückt wurde, soll der asuro ja die ganze zeit dieentsprechende funktion ausführen, muss ich da dann noch eine while schleife reinbauen, denn sonst macht er die funktion ja nur einmal bis das nächste zeichen kommt
und was für werte soll ich für hell bzw. für dunkel einstellen
was für zahlen ungefähr? also ist 100 noch einigermaßen hell oder schon dunkel
hier nochmal der neue code, bitte bitte helft mir
Code:
#include "asuro.h"
#include "asuro.c"
#include <stdlib.h>
#define SPEED 0x8F
#define LEFT_KEY 'a' // a links abbiegen
#define MIDDLE_KEY 's' // s mittig halten
#define RIGHT_KEY 'd' // d rechts abbiegen
unsigned int data[2];
volatile unsigned char switchPressed;
SIGNAL (SIG_INTERRUPT1)
{
unsigned int i;
DDRD |= SWITCHES; // Switches as Output
SWITCH_ON; // Output HIGH for measurement
ADMUX = (1 << REFS0) | SWITCH; // AVCC reference with external capacitor
for (i = 0; i < 0xFE; i++);
ADCSRA |= (1 << ADSC); // Start conversion
while (!(ADCSRA & (1 << ADIF))); // wait for conversion complete
ADCSRA |= (1 << ADIF); // clear ADCIF
i = ADCL + (ADCH << 8);
// und ab gehts --- fahr zurück
MotorDir(RWD,RWD);
MotorSpeed(200,200);
FrontLED(ON);
BackLED(ON,ON);
for (i = 0; i < 0xFFFD; i++); // Sleep does not work here
switchPressed = TRUE;
SWITCH_OFF;
DDRD &= ~SWITCHES; // Switches as Input => ext. Int 1
}
void TurnRight(void) // Asuro orientiert sich rechts
{
LineData(data);
if (data[0] > 100) // 300 ist geschätzt!!! ASURO ist zu weit rechts, also muss er rechts schneller
{
StatusLED(GREEN); //green
MotorSpeed(80,130); // rechts mehr Gas geben!
}
if ( data[1] < 200) // 500 ist geschätzt!!! ASURO ist zu weit links er muss links schneller
{
StatusLED(RED); //red
MotorSpeed(130,80);
}
else
{
MotorSpeed(100,100);
}
}
void TurnLeft(void) // Asuro orientiert sich links
{
LineData(data);
if (data[1] > 100) // 300 ist geschätzt!!! ASURO ist zu weit links, also muss er links schneller
{
StatusLED(GREEN); // green
MotorSpeed(130,80); // links mehr Gas geben!
}
if ( data[0] < 200) // 500 ist geschätzt!!! ASURO ist zu weit rechts er muss rechts schneller
{
StatusLED(RED); //red
MotorSpeed(80,130);
}
else
{
MotorSpeed(100,100);
}
}
void DarkLine(void) //normale Linienverfolgung
{
LineData(data);
if (data [0] > data [1] ) // links heller als rechts...
{
MotorSpeed(130,80); // ... dann links mehr Gas geben...
}
else
{
MotorSpeed(80,130); // ... sonst rechts mehr Gas geben!
}
}
int main(void)
{
unsigned char cmd;
unsigned char cmdold;
MotorDir(FWD,FWD);
Init();
FrontLED(ON);
StartSwitch();
sei();
while (1)
{
// cmd = 0;
SerRead(&cmd,1,0xFFFE);
cmdold = cmd;
switch (cmdold)
{
case LEFT_KEY : TurnLeft(); break; // Wenn a dann links halten
case MIDDLE_KEY : DarkLine(); break; // wenn s dann mittig halten
case RIGHT_KEY : TurnRight(); break; // Wenn d dann rechts halten
}
}
return 0;
}
Lesezeichen