PDA

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

ehenkes
28.07.2007, 12:34
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

ehenkes
29.07.2007, 15:43
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

ehenkes
30.07.2007, 15:30
Danke für das positive Feedback! :)