Archiv verlassen und diese Seite im Standarddesign anzeigen : [Prog.-Frage] examples\EncoderTest\test.c und Funktion "
helmut_w
28.07.2007, 12:28
Hallo!
Wie Ihr wisst, bin ich neu hier und habe 'mal wieder einige Fragen an Euch.
(Diesmal zum Programmieren!)
#2: zu EncoderTest:
Warum finde ich nirgends - also weder in test.c noch in den "Include-Dateien" noch
im ISP "SIGNAL (SIG_ADC)" - die _Definition_ "volatile int encoder[2];"?
In asuro.h findet man unter /* --- Globale Variablen ----*/ NUR die _Deklaration_
"extern volatile int encoder[2];"
(Ich habe schon 'mal das "volatile" vorsorglich ergänzt!:))
Kann dies der Compiler selbst oder wurde es 'nur' vergessen?
------------------------------
#3: an @Andun und @stochri zur Funktion "Go()":
Warum verwendet Ihr die Variable "int tot_count"? Die macht doch m.M. nach genau das,
was in der Array-Var. "encoder[0]" steht! Also, warum wird die Funktion "Go()" erst
'mal größer mit "tot_count += encoder[LEFT];" und "EncoderSet(0,0);" und obendrein kann
auch 'mal so'n Tic verlorengehen?
Schon jetzt: Vielen Dank für Eure Antworten! (... und Euer Verständnis!:))
cu Helmut
und obendrein kann auch 'mal so'n Tic verlorengehen?
... kannst Du dies bitte mal näher erläutern, was Du hier genau meinst, oder war das nur eine allgemeine Frage?
helmut_w
28.07.2007, 22:53
Hi ehenkes!
... kannst Du dies bitte mal näher erläutern, ...
Gerne!:)
(zu meiner Frage #3!)
Die ISP (Interrupt Service Routine) SIGNAL (SIG_ADC) läuft im Hintergrund 'fleissig' weiter!
Zwischen der Abfrage des Wertes für "tot_count" in der Zeile "tot_count += encoder[LEFT];"
und dem Zurücksetzen der beiden (Array-)Variablen "encoder[0/1]" mit der Zeile "EncoderSet(0,0);"
vergeht einige Zeit, in der sich der Inhalt sowohl von "encoder[LEFT]" als auch von
"encoder[RIGHT]" verändert haben kann! Und das bemerkt unser Programm überhaupt nicht: Also
können doch einige Tic's verloren gehen.
Wenn aber die Variable "enc_count" anstatt mit "tot_count" mit "encoder[LEFT]" verglichen
würde, gehen KEINE Tic's verloren und wir sparen uns noch den (Assembler-)Code der Zeile "EncoderSet(0,0);" und last not least brauchen wir auch die Var. "int tot_count" nicht!
void Go (int distance, int speed)
{
uint32_t enc_count;
int tot_count = 0;
int diff = 0;
int l_speed = speed, r_speed = speed;
// calculation tics/mm
enc_count=abs(distance)*10000L;
enc_count/=MY_GO_ENC_COUNT_VALUE;
EncoderSet(0,0); // reset encoder
MotorSpeed(l_speed,r_speed);
if (distance<0) MotorDir(RWD,RWD);
else MotorDir(FWD,FWD);
while (tot_count<enc_count)
/*++++++++++++++++++++++++++*/
{
tot_count += encoder[LEFT];
/***************************/
diff = encoder[LEFT] - encoder[RIGHT];
if (diff > 0)
{ //Left faster than right
if ((l_speed > speed) || (r_speed > 244)) l_speed -= 10;
else r_speed += 10;
}
if (diff < 0)
{ //Right faster than left
if ((r_speed > speed) || (l_speed > 244)) r_speed -= 10;
else l_speed += 10;
}
EncoderSet(0,0); // reset encoder
/****************/
MotorSpeed(l_speed,r_speed);
Msleep(1);
}
MotorDir(BREAK,BREAK);
Msleep(200);
}
Gibt es auch 'ne Meinung/Antwort zu meiner Frage #2?
cu Helmut
helmut_w
29.07.2007, 15:10
Frage #2 selbst gelöst!:))
#2: zu EncoderTest:
Warum finde ich nirgends - also weder in test.c noch in den "Include-Dateien" noch
im ISP "SIGNAL (SIG_ADC)" - die _Definition_ "volatile int encoder[2];"?
In "globals.c" werden "int switched;" und "int encoder [2];" definiert.
(Man sollte noch "volatile" ergänzen!)
Leider hatte ich nach "encoder[2];" -also OHNE Space- gesucht und deshalb
nichts gefunden! Sorry, dass ich Euch genervt habe.!;(
cu Helmut
Ist doch kein Problem. Mehrfaches Hinterfragen kann nichts schaden.
Allgemeiner Hinweis zum Typ-Qualifizierer volatile: http://www.henkessoft.de/C++/Cpp_school/volatile.htm
helmut_w
30.07.2007, 11:49
Hi Erhard!
Zuerst 'mal ein großes Dankeschön!
...
Allgemeiner Hinweis zum Typ-Qualifizierer volatile: http://www.henkessoft.de/C++/Cpp_school/volatile.htm => einfach toll!!!
Deine Inet-Seite habe ich mir angeschaut und finde auch Deine dortige
Arbeit _Spitze_! Außerdem habe ich mir vorgenommen, demnächst bei Dir
zu stöbern (allerdings muss man da viel Zeit mitbringen!:)) und damit
auch 'mal wieder hinzu zu lernen!
Nochmals Danke!
cu Helmut
Danke für das positive Feedback! :)
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.