PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Probleme mit dem Hochzählen von Integervariablen



Pyrgo
02.08.2008, 17:04
Hi,

ich hoffe mal ich bin hier richtig mit meinem kleinen Codeproblem für den RP6.


#include "RP6RobotBaseLib.h"

uint16_t counter;
uint16_t light_l;
uint16_t light_r;

void task_SearchAndFollow(void)
{
if(getStopwatch3() > 540)
{
//Manchmal liefert readADC einen falschen Wert zurück (0000)
light_l = 0;
light_r = 0;
while(light_l == 0000)
{
light_l = readADC(ADC_LS_L);
}
while(light_r == 0000)
{
light_r = readADC(ADC_LS_R);
}

//Ergebnisse werden ausgegeben writeString_P("L: ");
writeIntegerLength(light_l, DEC, 4);
writeString_P(" | R: ");
writeIntegerLength(light_r, DEC, 4);
writeString_P(" | I: ");
writeIntegerLength(counter, DEC, 2);
writeChar('\n');

counter++;
if(counter == 10)
{
stopStopwatch3();
}
setStopwatch3(0);
}
}

int main(void)
{
initRobotBase();
powerON();
rotate(100, LEFT, 360, 0);
counter = 0;
startStopwatch3();
while(true)
{
task_SearchAndFollow();
task_RP6System();
}
return 0;
}

Ich lasse meinen Roboter einmal um die eigene Achse drehen. Dabei nehme ich innerhalb von 5,4 Sekunden (solange dauert das Drehen) 10 Messdaten der Helligkeitssensoren.

Das ganze mache ich mit Stopwatches. Nach jedem Stopwatch wird counter eins hochgezählt mit counter++;

Wenn ich das ausgeben lasse kommt:



0
1
2
3
4
5
6
7
8
43
44
45
...


Manchmal zählt er nach 8 auch bei 96 weiter, manchmal kommt nach der 8 noch eine 8 ... das kann doch gar nicht sein ??? :-k

Ich versteh das überhaupt nicht. Ich sitze schon seit 10 Uhr früh dran, hattet auch die fabelhafte Idee, die Schleife zu ändern:

Von


if(counter == 10)

zu


if(counter >= 10)

aber das finde ich total grauenhaft. :D

Dirk
02.08.2008, 18:34
Hallo Pyrgo,

in deinem Prog kann es Probleme mit dem Lesen der Helligkeit geben, weil du die task_RP6System() benutzt und gleichzeitig die Helligkeitssensoren mit readADC ausliest.

In der Anleitung unten auf S. 91 wird unter task_ADC() darauf hingewiesen, dass man entweder readADC ODER die task_ADC verwenden kann (die task_ADC ist in task_RP6System enthalten!!).

Wenn du die task_RP6System benutzt, brauchst du die Helligkeitssensoren nur mit den vordefinierten Variablen adcLSL und adcLSR einlesen.

Das Zählerproblem kann ich so nicht erklären.
Eine Abfrage wie "while(light_l == 0000)" sieht nicht gut aus. Du testest ja auf 0 (Null) und nicht auf 4 Nullen.
Entweder while(light_l == 0) oder while(!light_l)

Gruß Dirk

sternst
03.08.2008, 08:40
Mich wundert es schon sehr, dass da nicht eine ganze Menge Müll ausgegeben wird, denn die Funktion writeString_P erwartet (zumindest dem Namen nach) einen String im Flash, deine liegen aber alle im RAM.

Wenn eine Variable unerwartet ihren Wert ändert, hat das fast immer einen von zwei möglichen Gründen:
1) Irgendwo in deinem Programm schreibst du an eine illegale Stelle (z.B. über das Ende eines Arrays hinaus, oder mit einem nicht initialisierten Pointer).
2) Der Stack wächst in den Bereich der globalen Variablen hinein.