So ich hab jetzt hoffentlich mal alles nach euren Tips geändert.
Leider gehts immer noch nicht so ganz.
Das Eigenartige ist: Ohne die SerPrintbefehle, die den Programmstatus (wo ist der ASURO gerade im Programm) angeben funktioniert das Programm eine zwei durchläufe. Dann hängt es sich auf. Mit den SerPrints geht gar nix. Mal geht die StatusLED auf ROT, mal auf GRÜN, mal AUS. Dann geben die Motoren Vollgas ... . Keine Ahnung was da los ist.
Code:
#include <asuro.h>
#include <string.h> // für strlen
/*Left min/max, right min/max values da minimiert auf acht bit *4
+00150 *4 = 600 744 //data[0] left
+00222 *4 = 888
798
+00190 *4 = 760 852 //data[1] right
+00236 *4 = 944
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
//---------------------------------------------------------------------------*/
//Statische Vergabe
#define Triggerlevel 798
#define Hysteresis 15
#define LOW 0
#define HIGH 1
//Variablenverageb
int einticklaenge = 2; // /10 da 2mm 0.02cm //Gefahrene Strecke bei einem Tick
int speed;
//PWM des Rades
float cmsleft; //Metre pro Sekunde (Radgeschwindigkeit links
float cmsright; //Metre pro Sekunde (Radgeschwindigkeit rechts
float cmsleft1; // Vorherige Geschwindigkeit (für a)
float cmsright1; // Vorherige Geschwindigkeit (für a)
float cmleft; //Gefahrene Strecke links
float cmright; //Gefahrene Strecke rechts
float aleft; //Beschleunigung linkes Rad
float aright; //Beschleunigung rechtes Rad
unsigned int data [2]; //Array erstellen mit 2 Speicherzellen für Odometriedaten
//data [0] links T11
//data [1] rechts T12
signed int status[2]={0,0};
int Zeit = 1000; //Zeit in der die Impulse gezählt werden 1s
int Zeit1; //letzte Zeit zur bestimmung der Zeit dif (für a)
int leftimpuls; //gezählte Impulse pro Zeit links
int rightimpuls; //gezählte Impulse pro Zeit rechts
unsigned int long stopzeit;
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
void Nullen_Sekunderwerte_a (void){
Zeit1 = 0 ;
cmsright1 =0;
cmsleft1 =0;
return;}
void Funktionsblock (void){
SerPrint("\n\rFunktionsblock begonnen\n\r");
SerPrint("\n\rNullen\n\r");
leftimpuls = 0; //Impullse vor Zählvorgang auf null
rightimpuls = 0; //Impullse vor Zählvorgang auf null
cmright = 0;
cmleft = 0;
cmsright = 0;
cmsleft = 0;
aright = 0;
aleft = 0;
//Detektierung der Impulse
stopzeit=Gettime()+Zeit; //1 sekunde Hell Dunkel Wechsel detektieren
SerPrint("\n\rOdometrie\n\r");
do {
OdometrieData(data); //Odo daten bereitstellen
//Wechselt linker Sensor von niedrig auf hoch?
if((status[0]==LOW)&&(data[0]>Triggerlevel+Hysteresis)){ //Wenn vorher Low und jetz HI dann
status[0] = HIGH;
leftimpuls++; //1 impuls ausgeben
}
//Wechselt linker Sensor von hoch auf niedrig?
if((status[0]==HIGH)&&(data[0]<Triggerlevel-Hysteresis)){
status[0] = LOW;
leftimpuls++;
}
//Wechselt rechter Sensor von niedrig auf hoch?
if((status[1]==LOW)&&(data[1]>Triggerlevel+Hysteresis)){
status[1] = HIGH;
rightimpuls++;
}
//Wechselt rechter Sensor von hoch auf niedrig?
if((status[1]==HIGH)&&(data[1]<Triggerlevel-Hysteresis)){
status[1] = LOW;
rightimpuls++;
}
} while (stopzeit>Gettime());
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
SerPrint("\n\rAuswertung\n\r");
//Auswertung der Impulse
//Zurückgelegter Weg
cmright = rightimpuls * einticklaenge /100;
cmleft = leftimpuls * einticklaenge /100;
//Geschwindigkeit
cmsright = cmright / (Zeit/1000);
cmsleft = cmleft / (Zeit/1000); //da ms
//Beschleunigung
aright = (cmsright-cmsright1) / (Zeit-Zeit1);
aleft = (cmsleft-cmsleft1) / (Zeit-Zeit1);
Zeit1 = Zeit; //jetzige Zeit Zwischenspeichern für a beim nächsen turn
cmsright1 = cmsright; //jetzige Geschwindigkeit Zwischenspeichern für a beim nächsen turn
cmsleft1 = cmsleft; //jetzige Geschwindigkeit Zwischenspeichern für a beim nächsen turn
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
SerPrint("\n\rAusgabe\n\r");
//rechts
SerPrint("\n\rRechtes Rad\t");
PrintInt(rightimpuls);
SerPrint(" Impulse-Rechts\t");
PrintFloat(cmright,2,2);
SerPrint (" cm\t");
PrintFloat(cmsright,2,2);
SerPrint(" cm/s\t");
PrintFloat(aright,2,2);
SerPrint(" cm/s²");
//Zeilenwechsel zwischen rechts und links
SerPrint("\n\r\n\r");
//links
SerPrint("\n\rLinkes Rad\t");
PrintInt(leftimpuls);
SerPrint(" Impulse-Links\t");
PrintFloat(cmleft,2,2);
SerPrint (" cm\t");
PrintFloat(cmsleft,2,2);
SerPrint(" cm/s\t");
PrintFloat(aleft,2,2);
SerPrint(" cm/s²");
//2*absatz
SerPrint("\n\r\n\r\n\r\n\r");
SerPrint("\n\rFunktionsblock beendet\n\r");
StatusLED(OFF);
return;}
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
int main(void)
{ BackLED(OFF,OFF);
Init();
while(1){
//-----------------------------------------------------------------------------
//Intro für Hyperterminal
//-----------------------------------------------------------------------------
SerPrint("Telemetriedaten\n\r\n\r");
//Überschrift im Hyperterminal für Vorwärts
SerPrint("Vorwärts\n\r\n\r");
//-----------------------------------------------------------------------------
//Los gehts beschleunigen
//-----------------------------------------------------------------------------
MotorDir(FWD,FWD); //Richtung festlegen
Nullen_Sekunderwerte_a();
for (speed=120;speed<245;speed +=10){ //Geschwindigkeit von 80 auf 255 in 10er schritten speed kleiner 245
MotorSpeed(speed,speed); //Geschwindigkeit einlesen
Funktionsblock();
}
//-----------------------------------------------------------------------------
//Langsamer werden
//-----------------------------------------------------------------------------
Nullen_Sekunderwerte_a();
for (speed=255;speed>125;speed -=10){
MotorSpeed(speed,speed);
Funktionsblock();
}
//-----------------------------------------------------------------------------
//Rückwärts
//-----------------------------------------------------------------------------
//Überschrieft im Hyperterminal
SerPrint("Rückwärts\n\r\n\r");
//-----------------------------------------------------------------------------
//Los gehts beschleunigen
//-----------------------------------------------------------------------------
MotorDir(RWD,RWD);
Nullen_Sekunderwerte_a();
for (speed=120;speed<245;speed +=10){
MotorSpeed(speed,speed);
Funktionsblock();
}
//-----------------------------------------------------------------------------
//Langsamer werden
//-----------------------------------------------------------------------------
Nullen_Sekunderwerte_a();
for (speed=255;speed>125;speed -=10){
MotorSpeed(speed,speed);
Funktionsblock();
}
}
MotorSpeed(0,0);
return 0;}
Bitte schaut es euch mal kurz an. Wäre nett wenn es jemand korrigieren könnte, mir erklärt was er gemacht hat und was nicht gegangen ist. Habe nur noch bis morgen Zeit.
Gruß NomiS
Lesezeichen