... kannst Du dies bitte mal näher erläutern, was Du hier genau meinst, oder war das nur eine allgemeine Frage?und obendrein kann auch 'mal so'n Tic verlorengehen?
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
... kannst Du dies bitte mal näher erläutern, was Du hier genau meinst, oder war das nur eine allgemeine Frage?und obendrein kann auch 'mal so'n Tic verlorengehen?
Hi ehenkes!
Gerne!... kannst Du dies bitte mal näher erläutern, ...
(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!
Gibt es auch 'ne Meinung/Antwort zu meiner Frage #2?Code: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); }
cu Helmut
Frage #2 selbst gelöst!)
In "globals.c" werden "int switched;" und "int encoder [2];" definiert.#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];"?
(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
Hi Erhard!
Zuerst 'mal ein großes Dankeschön!
Deine Inet-Seite habe ich mir angeschaut und finde auch Deine dortige...
Allgemeiner Hinweis zum Typ-Qualifizierer volatile: http://www.henkessoft.de/C++/Cpp_school/volatile.htm => einfach toll!!!
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!
Lesezeichen