-         

Ergebnis 1 bis 3 von 3

Thema: Probleme mit dem Hochzählen von Integervariablen

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    28.07.2008
    Beiträge
    19

    Probleme mit dem Hochzählen von Integervariablen

    Anzeige

    Hi,

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

    Code:
    #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 ???

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

    Von

    Code:
    if(counter == 10)
    zu

    Code:
    if(counter >= 10)
    aber das finde ich total grauenhaft.

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.791
    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

  3. #3
    Erfahrener Benutzer Roboter Experte Avatar von sternst
    Registriert seit
    07.07.2008
    Beiträge
    672
    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.
    MfG
    Stefan

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •