Forum: Mikrocontroller und Digitale Elektronik AccSensor auswerten


von Fabian K. (fabian_k)


Lesenswert?

Hallo,

ich hab ein kleines Problem mit meinem AccSensor.

Source Code, zum lesen vom AccWert:
long adc_read(char axis)
{
  long adc_value=0;
  long volt_value=0;
  long g_value=0;

  if(axis=='x')
  {
    ADMUX = (0<<MUX4) | (0<<MUX3) | (1<<MUX2) | (1<<MUX1) | (0<<MUX0);
  }

  if(axis=='y')
  {
    ADMUX = (0<<MUX4) | (0<<MUX3) | (1<<MUX2) | (1<<MUX1) | (1<<MUX0);
  }

  if(axis=='z')
  {
    ADMUX = (0<<MUX4) | (0<<MUX3) | (1<<MUX2) | (0<<MUX1) | (1<<MUX0);
  }

  ADCSRA |= (1<<ADSC);
  adc_value = ADCL;
  adc_value += (ADCH<<8);

  volt_value=(3000*adc_value)/1024;
  g_value=((1000*(volt_value-1494))/600);

  return(g_value);
}

Im Hauptprogramm hab ich eine Schleife:
while(1)
  {
    g_value=adc_read('x');
    itoa(g_value,value_string,10);
    usart_puts("(x: ");
    usart_puts(value_string);
    usart_puts("mg|");

    g_value=adc_read('y');
    itoa(g_value,value_string,10);
    usart_puts("y: ");
    usart_puts(value_string);
    usart_puts("mg|");

    g_value=adc_read('z');
    itoa(g_value,value_string,10);
    usart_puts("z: ");
    usart_puts(value_string);
    usart_puts("mg)");

          usart_puts("  ");

    _delay_ms(800);
  }

Das Problem ist: Wenn ich immer nur eine Achse lese, also:
while(1)
{
g_value=adc_read('x');
itoa(g_value,value_string,10);
usart_puts("(x: ");
usart_puts(value_string);
usart_puts("mg|");
}
funktionierts, aber wen ich alle zusammen hintereinander lese und 
ausgebe, mischt er die Werte, zuerst z, dann x und dann y.
Warum?

MfG

von Floh (Gast)


Lesenswert?

Fabian K. schrieb:
> ADCSRA |= (1<<ADSC);
>   adc_value = ADCL;
>   adc_value += (ADCH<<8);

Du startest die Messung und willst direkt den Wert auslesen.
Das geht so nicht, das Teil ist lahm und deshalb musst du warten.

Daher funktioniert das bei einer Achse, da du immer den Wert der 
VORHERIGEN Messung ausliest. Bei mehreren Achsen passen dann die Werte 
nicht mehr, da du ja den Kanal umschaltest.
:-)

von Fabian K. (fabian_k)


Lesenswert?

Danke. Immer solche blöden Fehler, wo ich einfach nicht draufkomm. 
Danke, Danke, Danke.

MfG

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.