Ja das dachte ich mir nach Sternthalers link schon. Ich habe zur Zeit leider irgend ein Problem mit dem Compiler. Wenn ich ein und die selbe datei UNVERÄNDERT mehrmals compilieren und dann flashe ist die Packetanzahl und die Größe ab und an mal anderst. Komisch !!!
Na ja
Ich hab mal bisschen was am code geändert. Geht zwar jetzt gar nicht mehr aber ich Poste ihn trotzdem mal. Das ist lediglich der geänderte Teil. Wie man eine Funktion erstellt habe ich aber Leider immer noch nicht heraus. Und verkürzt sich durch Funktionen der code?
Ersetzt der Compiler nicht den Funktionsaufruf mit der Funktion oder gibt es den Teil dann nur einmal als Unterprogramm?
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 25
#define LOW 0
#define HIGH 1
//Variablenverageb
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 = 0; //letzte Zeit zur bestimmung der Zeit dif (für a)
int leftimpuls = 0; //gezählte Impulse pro Zeit links
int rightimpuls = 0; //gezählte Impulse pro Zeit rechts
unsigned int long stopzeit;
int anzahldercodescheibensegmente_umfang = 1; //Breite eines Segmentes
//-----------------------------------------------------------------------------
int main(void)
{
BackLED(OFF,OFF); //alle LED werden im Programm zur Veranschaulichung genutzt
StatusLED(RED); //d.h. wo bin ich im Prog. die Backeled´s sind aus da Odometrie an
Init();
while(1){
//-----------------------------------------------------------------------------
//Intro für Hyperterminal
//-----------------------------------------------------------------------------
SerPrint("\t Telemetriedaten\n\r\n\r");
//Überschrift im Hyperterminal für Vorwärts
SerPrint("\tVorwärts\n\r\n\r");
//-----------------------------------------------------------------------------
//Los gehts beschleunigen
//-----------------------------------------------------------------------------
StatusLED(GREEN);
MotorDir(FWD,FWD); //Richtung festlegen
Zeit1 = 0 ; //muss vor der Schleife genullt werden fals nioch restwert aus letzter Schleife
cmsright1 = 0;
cmsleft1 = 0;
for (speed=80;speed>245;speed +=10){ //Geschwindigkeit von 80 auf 255 in 10er schritten
MotorSpeed(speed,speed); //Geschwindigkeit einlesen
leftimpuls = 0; //Impullse vor Zählvorgang auf null
rightimpuls = 0; //Impullse vor Zählvorgang auf null
//Detektierung der Impulse
stopzeit=Gettime()+Zeit; //1 sekunde Hell Dunkel Wechsel detektieren
do {
OdometrieData(data); //Odo daten bereitstellen
//Wechselt linker Sensor von niedrig auf hoch?
if((status[0]==LOW)&&(data[0]>Triggerlevel+Hysteresis)){
status[0] = HIGH;
leftimpuls++;}
//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;
StatusLED(RED);
rightimpuls++; }
//Wechselt rechter Sensor von hoch auf niedrig?
if((status[1]==HIGH)&&(data[1]<Triggerlevel-Hysteresis)){
status[1] = LOW;
rightimpuls++; }
} while (stopzeit>Gettime()); //das ganze bis Zeit um (1s)
//Auswertung der Impulse
//Zurückgelegter Weg
cmright = ((rightimpuls / anzahldercodescheibensegmente_umfang)/5); // /5 da Übersetzungsverhältniss 1/5
cmleft = ((leftimpuls / anzahldercodescheibensegmente_umfang)/ 5 );
//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
//Ausgabe
//rechtes
SerPrint("Rechtes Rad ");
PrintFloat(cmright,2,2);
SerPrint (" cm ");
PrintFloat(cmsright,2,2);
SerPrint(" cm/s" );
PrintFloat(aright,2,2);
SerPrint(" cm/s²");
//Lehrstellen zwischen rechts und links
SerPrint(" - ");
//links
SerPrint("Linkes Rad ");
PrintFloat(cmleft,2,2);
SerPrint (" cm ");
PrintFloat(cmsleft,2,2);
SerPrint(" cm/s ");
PrintFloat(aleft,2,2);
SerPrint(" cm/s²");
//2*absatz
SerPrint("\n\r\n\r");
}
}
MotorSpeed(0,0);
return 0;}
/*
void Odometrie (){
do {
OdometrieData(data); //Odo daten bereitstellen
if(data[0]<=760 + 50 || data[0]>=888 -50) //wenn data = trigerlevel
rightimpuls++; //impulse erhöhen
if(data[1]<=600 +50 || data[1]>8888 - 50) //siehe zwei drüber
leftimpuls++; //siehe zwei drüber
} while (stopzeit>Gettime());}*/
Wie geht den, dass mit Daten direkt in Excel importiert werden? Währe ganz net wenn das Programm das machen würde, dann müsste man nicht immer mit diesem Hyperterminal arbeiten und hätte eine saubere Liste.
Lesezeichen