also hier erstmal der quellcode
also das is ein ausschnitt ... dieser code steht bei mir in der asuro.c ...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); }
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







Zitieren

Lesezeichen