OK ich habe das mal versucht. Ich wollte die Odometrie und die Ausgabe als Funktion machen. Jetzt kommen aber fehler.
Code:
test.c:88: warning: implicit declaration of function 'Odometrie'
test.c:112: warning: implicit declaration of function 'Ausgabe'
test.c: At top level:
test.c:361: warning: conflicting types for 'Odometrie'
test.c:88: warning: previous implicit declaration of 'Odometrie' was here
test.c:392: warning: conflicting types for 'Ausgabe'
test.c:112: warning: previous implicit declaration of 'Ausgabe' was here
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
//-----------------------------------------------------------------------------
MotorDir(FWD,FWD); //Richtung festlegen
Zeit1 = 0 ; //muss vor der Schleife genullt werden fals nioch restwert aus letzter Schleife
cmsright1 = 0;
cmsleft1 = 0;
FrontLED(ON);
for (speed=80;speed>245;speed +=10){ //Geschwindigkeit von 80 auf 255 in 10er schritten
MotorSpeed(speed,speed); //Geschwindigkeit einlesen
StatusLED(RED);
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
Odometrie();
//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
Ausgabe();
}
}
MotorSpeed(0,0);
return 0;}
void Odometrie (void){
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());
return;} //das ganze bis Zeit um (1s)
void Ausgabe (void){
//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");
return;}
Wo müssen die Funktionen hin?
Lesezeichen