PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Tasterauswertung und Kollisionserkennung Problem



spomue
10.06.2008, 06:19
Hallo liebe Asuro Begeisterte,

ich spiele schon einwenig mit dem Asuro herum doch ein Problem bekomm ich einfach nicht hin.
Zum einen habe ich ein kleines Programm das die Taster auswertet und dementsprechend umdreht. Zum anderen habe ich mir das Kollisionsprogramm aus eurem Forum genommen.
Beide funktionieren getrennt voneinander super. Versuche ich beide nur Schritt für Schritt zusammen zubringen habe ich beim Messen der Geschwindigkeit meine großen Probleme.
Ich habe mir das Tasterprogramm genommen und die Geschwindigkeitsmessung eingebunden. Es wird noch nicht reagiert auf eine Änderung.

1. Die gemessenen Geschwindigkeiten sind im Vergleich zum einzel Programm sehr viel kleiner( normal sind es 190, im Tasterprogramm sind es 150).
2. Nachdem ich eine Taste gedrückt habe wird als Geschwindigkeit nur noch 0 angegeben.

Warum ist das so? was habe ich vergessen?

Bitte helft mir. Ich weiß einfach nicht mehr weiter.

Hier mein Programm und die header- Datei habe ich auch angehangen.



#include "asuro.h" // bitte die neue Datei benutzen
// asuro.h und asuro.c vom 31.03.05

#define aus {MotorState(BREAK,BREAK);}
#define go {MotorSpeed(150,150);MotorState(FWD,FWD);}
#define backturn { MotorSpeed(50,-50);MotorState(RWD,RWD);msleep(500);}
#define backward { MotorSpeed(-50,-50);MotorState(RWD,RWD);msleep(300);}
#define rightturn { MotorSpeed(50,-50);msleep(300);}
#define leftturn { MotorSpeed(-50,50);msleep(300);}

static volatile uint8_t switched=0;
uint8_t status_led = 0;

inline void msleep(uint16_t time)
{
uint16_t i;
for(i=time;i>0;i--)
Sleep(72);
}

void status(void){
if (status_led == 0){
status_led = 1;
StatusLED(GREEN);
}
else if (status_led == 1){
status_led = 0;
StatusLED(RED);
}
return;
}

void write(char* text)
{
uint8_t i=0;
while((text[i]!='\0')&&(i<255)) i++;

SerWrite((unsigned char*)text,i);
}

void writeint(int16_t zahl)
{
char text[7]={'\0'};
itoa(zahl,text,10);
write(text);
}

int speed(void)
{
int rightspeed,leftspeed;
int leftold,rightold;

EncoderReset(); // reset encoder


leftold=encoder[LEFT];
rightold=encoder[RIGHT];
msleep(300);
leftspeed=encoder[LEFT]-leftold;
rightspeed=encoder[RIGHT]-rightold;

write("/n/r speed Left,Right ");
writeint(leftspeed);
writeint(rightspeed);
return leftspeed+rightspeed;
}

ISR(INT1_vect)
{
StopSwitch();
switched=1;
}

int main(void)
{
int16_t num_of_switch;
int v;

Init();
EncoderInit();
StatusLED(OFF);
write("\n\rASURO OK\n\r");

go;
msleep(500);

while(1)
{
BackLED(OFF,OFF);
StartSwitch();

while(switched == 0){
status();
v=speed();
write("\n\r speed ");
writeint(v);
}


// Wenn Taster gedrückt wurde
if(switched == 1){
write("\n\r auf taster gefahren ");
num_of_switch = PollSwitch ();

if(num_of_switch < 5){
BackLED(OFF,ON);
backward;
rightturn;
go;
num_of_switch = 0;
msleep(500);
}

if(num_of_switch > 5) {
BackLED(ON,OFF);
backward;
leftturn;
go;
num_of_switch = 0;
msleep(500);
}
switched = 0;
}
}
return 0;
}



Danke für eure Hilfe.

trapperjohn
10.06.2008, 08:58
Ich habs nur kurz überflogen - könnte es sein, dass das Setzen der BackLEDs zwischendurch dir die Odometrie kaputt macht?

Ansteuerung der hinteren LEDs und die Odometrie funktioniert nicht gleichzeitig (siehe Doku der Asuro Library).

spomue
10.06.2008, 10:20
Ich habs nur kurz überflogen - könnte es sein, dass das Setzen der BackLEDs zwischendurch dir die Odometrie kaputt macht?

Ansteuerung der hinteren LEDs und die Odometrie funktioniert nicht gleichzeitig (siehe Doku der Asuro Library).Du hast recht. Ich hab das gerade mal nachgelsen. Werd es heute abend gleich mal ausprobieren.

Hansi41
21.06.2008, 21:35
hallo

kommt denn irgendeine fehlermeldung, wenn du das programm versuchst zu compilieren?
oder eine warnung?

schönen abend noch

max

damaltor
23.06.2008, 23:44
backleds und odometrie funktionieren nicht gleichzeitig. allerdings produziert das auch keine fehler beim kompilieren.

Sternthaler
24.06.2008, 00:35
Hallo spomue,
willkommen im Forum.

Es sollte reichen, wenn du das ausserhalb der main() while(1)-Loop liegende EncoderInit(); in die While(1)-Schleife verschiebst. Im EncoderInit() wird alles für die Odometrie- und damit für die Encoder-Funktionalität wieder initialisiert.

Wie von trapperjohn schon angedeutet bringt das Schalten an den Back-LED's tatsächlich alles durcheinander.
Sinnvoll wäre dann wohl die Position direkt nach deinem BackLED(OFF,OFF);. Denn auch ein (OFF,OFF) fummelt an den Port-Pins PC0 und PC1 rum.

Viel Erfolg
Gruß Sternthaler

P.S.: Warum kommt dann immer eine 0 aus der Speed()-Funktion?
Es müsste daran liegen, dass die Umschaltung des doppelt belegten Port-Pins (Odometrie bzw. Back-LED's) dazu führt, dass beim ODO messen immer ein gleiches Ergebnis gemessen wird. Ist aber das Ergebnis immer gleich, kann die Encoder-Funktion keinen Schwarz-/Weis-Wechsel feststellen. Somit werden keine Tik's gezählt und somit steht der Asuro. -> Speed() = 0;