PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : EncoderInit beeinflusst LineData



raid_ox
14.04.2007, 17:06
Hi, wenn ich EncoderInit starte und LineData abfrage, bekomm ich immer unterschiedliche werte, wenn aber EncoderInit nicht gestartet ist, dann ist es normal. Hat jemand idee?

damaltor
14.04.2007, 18:03
encoder init beeinflusst die interrupts. evtl wird dadurch während einer linedata-messung der prozessor unterbrochen, der adc wird vom encoder ausgemessen (dadurch werden die werte der linedata versaut) und dann rechnet linedata halt mist aus.. könnte ich mit vorstellen. mach mal folgendes:

EncoderInit starten

cli(); //deaktiviert alle interrupts.
Jetzt Linedata messen
sei(); //aktiviert die interrupts wieder

achtung: zwischen cli() und sei() darf nichts benutzt werden, was auf interrupts basiert. also encoder-irgendwas, sleep, msleep usw. sind verboten, ansonsten bleibt der asuro hier in einer endlosschleife hängen.

deshalb sollte zwischen cli und sei so wenig wie möglich stehen!

raid_ox
14.04.2007, 18:04
Hi,

Ich hab es auch versucht, anschein hilf es nicht viel, man hat immer noch diese schwankung

m.a.r.v.i.n
16.04.2007, 15:34
Hallo Raid,

da schlummert wohl noch ein Bug in der Asuro Lib. RN-User Thowil hatte mich schon vor einiger Zeit darauf aufmerksam gemacht. Leider konnte ich den Bugfix bisher weder testen noch einspielen. Deshalb weis ich auch niocht, ob dein Problem damit gelöst ist.Der Fix bezieht sich noch auf die V2.70rc2 oder älter (ohne Benutzung der my_asuro.h).

Hier der geänderte Code zum Selbertesten (ohne Gewähr):



SIGNAL (SIG_ADC)
{
static unsigned char tmp [2], flag [2], toggle = FALSE;

if (autoencode)
{
// Übernehme nur Werte, die von den Odometriesensoren stammen...
if ( (ADMUX & 0x0F) == WHEEL_LEFT || (ADMUX & 0x0F) == WHEEL_RIGHT ){

tmp [toggle] = ADCH;

if ((tmp [toggle] < 140) && (flag[toggle] == TRUE))
{
encoder [toggle] ++;
flag [toggle] = FALSE;
}
if ((tmp [toggle] > 160) && (flag [toggle] == FALSE))
{
encoder [toggle] ++;
flag [toggle] = TRUE;
}

} else {
//War ein anderer Channel eingestellt, dann reinitialisiere den Wandler (zusammen mit Zeile #)
ADCSRA &= ~(1<<ADEN);
}

if (toggle)
ADMUX = (1 << ADLAR) | (1 << REFS0) | WHEEL_RIGHT;
else
ADMUX = (1 << ADLAR) | (1 << REFS0) | WHEEL_LEFT;

ADCSRA |= (1<<ADEN)|(1<<ADSC); // #

toggle ^= 1;
}

}

m.a.r.v.i.n
22.04.2007, 22:23
Hallo Raid,

ich habe versucht, den Fehler zu verifizieren, kann aber keine Abweichung entdecken. Die Werte der Liniensensoren werden bei mir nicht durch EncoderInit beeinflußt (weder mit V2.7 und auch nicht bei V2.6). Vielleicht hat da noch etwas anderes einen Einfluß.