-         

Ergebnis 1 bis 5 von 5

Thema: wo ist der fehler??? please help!

  1. #1
    Robotik84
    Gast

    wo ist der fehler??? please help!

    Anzeige

    also hier erstmal der quellcode
    Code:
    ISR(ADC_vect)
    {									// ADIF automatisch von HW zurückgesetzt
    	static unsigned char ask = 0, max = 0, min = 0, toggle = 1;
    	static unsigned char adc_data[2], adc_data_help[2];
    	unsigned int counter_help[2];
    	
    	if (toggle)	
    		ADMUX = (1 <<ADLAR) | (1 <<REFS0) | WHEEL_RIGHT; 
    	else 
    		ADMUX = (1 <<ADLAR) | (1 <<REFS0) | WHEEL_LEFT; 
    	
    	
    	adc_data_help[toggle] = adc_data[toggle];
    	adc_data[toggle] = ADCH;
    	
    	counter_help[toggle] = counter[toggle];
    	
    	if ((adc_data[toggle] - adc_data_help[toggle] > 40) && (ask == 0))
    	{
    		adc_data[toggle] = adc_data_help[toggle] + 3;
    	}
    	else
    	{	// Maximum im Schwarzen erkennen
    		if (adc_data[toggle] - adc_data_help[toggle] > 0)
    		{													
    			max = adc_data[toggle];
    		}
    		else
    		{
    			if ((max - adc_data[toggle]) > 15)
    			{
    				ask = 1;
    				counter[toggle]++;
    				max = 0;
    			}
    		}
    	}
    	
    	if ((adc_data_help[toggle] - adc_data[toggle] > 40) && (ask == 1))
    	{
    		adc_data[toggle] = adc_data_help[toggle] - 3;
    	}
    	else
    	{	// Minimum im Weißen erkennen
    		if (adc_data_help[toggle] - adc_data[toggle] > 0)	 
    		{													
    			min = adc_data[toggle];
    		}
    		else
    		{
    			if ((adc_data[toggle] - min) > 15)
    			{
    				ask = 0;
    				counter[toggle]++;
    				min = 0;
    			}
    		}
    	}
    	
    	if (counter[toggle] != counter_help[toggle])	// Ausgabe nur bei neuem Zählerstand
    		PrintInt(counter[toggle]);
    		
    	toggle ^= 1;
    }
    
    void PrintInt(unsigned int wert)
    {  	
    	char text[16]="      ";
    	itoa(wert,text,10);
    	SerWrite(text,strlen(text));
    	SerWrite(" ",2);
    }
    
    void Odometrie_Set(int a, int b)
    {
    	counter[LEFT] = a;
    	counter[RIGHT] = b;
    }
    
    
    void Odometrie_Init()
    {
    	cli();
    	DDRC &= ~((1 << PC0) | (1 << PC1)); 	// Input -> no break LED
    	ADMUX  = (WHEEL_LEFT) | (1 << ADLAR) | (1 << REFS0);
    	// Wheel_Right -> ADC0 out
    	// ADLAR -> ADCH = Bit2 - Bit9
    	//			ADCL = Bit0 - Bit1
    	// Refs0 ->	AVCC Voltage with external capacitor at Aref Pin
    	ODOMETRIE_LED_ON;
    	ADCSRA = (1 << ADEN) | (1 << ADFR) | (1 << ADSC) | (1 << ADIE)  
    			| (1 << ADPS2); //| (1 << ADPS1) | (1 << ADPS0);
    	// ADEN  ->	AD - Enable
    	// ADFR  ->	AD - Free Running
    	// ADSC	 ->	AD - Start Conversation
    	// ADIE  ->	AD - Interrupt Enable
    	// ADPS2 -> 8M/128 = 62.5kHz -> Zykluszeit=13 -> 62.5/13 = 5kHz -> Abtastfrequenz
    	sei();
    	Odometrie_Set(0,0);
    }
    also das is ein ausschnitt ... dieser code steht bei mir in der asuro.c ...
    im hauptprogramm wird nur Odometrie_Init() aufgerufen ...

    das obige programm kann die wechsel von dunkel/hell und umgekehrt dynamisch zählen und ausgeben... nur ist das problem wenn i ein rad anhalte wird trotzdem die seite weiterhochgezählt die angehlaten wird ...
    wenn i im proramm seperat die wechsel ausgeben lasse, d. h. toggle is einmal nur 0 und einmal nur 1 dann funktioniert es ...
    aber sobald i beide ausgeben, quasi toggle ^= 1; ist vorhanden, will klappt das nicht mehr...und i find einfach den grund net...

    bitte euch um hilfe ...

    Gruß Jens

  2. #2
    Erfahrener Benutzer Roboter Genie Avatar von m.a.r.v.i.n
    Registriert seit
    24.07.2005
    Ort
    Berlin
    Beiträge
    1.247
    Hallo Jens,

    das dürfte am Aufruf der PrintInt Funktion liegen. Sowas geht bestimmt schief, wenn man die Funktion in der Interrupt Funktion aufruft.

    Gruß m.a.r.v.i.n

  3. #3
    Robotik84
    Gast
    und wie soll i sonst meine beiden counter, also counter[left], counter[right], ausgeben???
    bzw wie würde i das machen wenn i das in meiner main ausgeben möcht???

  4. #4
    Erfahrener Benutzer Roboter Genie Avatar von m.a.r.v.i.n
    Registriert seit
    24.07.2005
    Ort
    Berlin
    Beiträge
    1.247
    In der Interrupt Funktion ein Merkflag setzen und in der Main Routine das Merkflag pollen, Wenn Merkflag gesetzt, MerkFlag loeschen und PrintInt aufrufen.

    Gruß

  5. #5
    Robotik84
    Gast
    i habe den fehler gefunden...

    das problem war im programm durch die differenz zweier unsigned variblen das ergebnis verfuscht wird und somit nur mist rauskommt...

    durch die deklartion von signed typen ging das dann einwandfrei...

Berechtigungen

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