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
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