PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : wo ist der fehler??? please help!



Robotik84
28.11.2006, 15:29
also hier erstmal der quellcode

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

m.a.r.v.i.n
28.11.2006, 16:34
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

Robotik84
28.11.2006, 16:43
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???

m.a.r.v.i.n
28.11.2006, 17:03
In der Interrupt Funktion ein Merkflag setzen und in der Main Routine das Merkflag pollen, Wenn Merkflag gesetzt, MerkFlag loeschen und PrintInt aufrufen.

Gruß

Robotik84
28.11.2006, 17:22
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...