ADC ließt falsche Werte aus

Gast #1102332
Lesenswert?

hi, ich hab ein Programm zum Spannungsmessen mit bascom geschrieben und 
nun wollte ich das in C verwirklichen nur spuckt der ADC komische Werte 
aus.

Ich habe das myAVR MK1 board mit dem Atmel Mega 8

momentan übertrage ich nur den gemessenen Wert auf das LCD

hier ist der C-code

#include <lcd.h>
#include <avr\io.h>
#include <delay.h>
#include <delay_basic.h>
#include <stdio.h>
#include <lcd.c>

main (void)
{
  int i=0, x=0;
  float volt;
  char Buffer[16];
  char wert;
  lcd_init();
  wait_ms(10);
  lcd_home();
  lcd_write_s("Voltmeter");

  ADCSRA = (1<<ADEN) | (1<<ADPS1) | (1<<ADPS0);
  ADMUX |= (0<<REFS1) | (1<<REFS0);
  ADMUX=0x40;

  do
  {

    for (;;)
    {

      ADCSRA |= (1<<ADEN);
      wait_ms(10);
      ADCSRA |= (1<<ADSC);
      while ( ADCSRA & (1<<ADSC)){}
      ADCSRA &= ~(1<<ADEN);

      x = ADCW;
      volt = x*5;
      volt = volt/1024;

      sprintf(Buffer, "%d", x );
      lcd_goto(2,1);
      lcd_write_s(Buffer);

    }

  }
  while(true);

}

danke fuer eure hilfe!
#1102364
Lesenswert?

Dir ist klar, dass der sprintf momentan das Ergebnis linksbündig in das 
Buffer Array schreibt, und das bei der Ausgabe der vorhergehnde Wert 
nicht notwendigerweise vollständig überschrieben wird?

Bsp. angenommen der jetzige Messwert ist 1000
dann steht auf dem Display

1000

nun sei der nächste Messwert 999, da 999 aber nur aus 3 Ziffern besteht, 
werden auch nur 3 Ziffern ausgegeben. Diese überschreiben die 1000, aber 
eben nur die ersten 3 Ziffern. Im Display steht dann

9990


Ist es das was du mit 'komischen Werten' meinst?
Gast #1102397
Lesenswert?

ich habe jetzt

sprintf(Buffer, "%d", x );

durch

itoa( x, Buffer, 10 );

ersetzt. Doch leider habe ich immer noch das gleiche Problem. am anfang 
werte zwischen 0 und 1023... so wie es sein soll und dann nur noch Werte 
zwischen 1023 und 9000.
Gast #1102433
Lesenswert?

alles klar! Danke schön! Dann war das nur ein Darstellungsfehler.

und um das ganze jetzt als gleitkommazahl darzustellen muss ich das mal 
Vref und durch 1024 dividieren, richtig?

double volt=0;

x = ADCW;
volt = x*5;
volt = volt/1024;

sprintf(Buffer, "% 4d", volt );
lcd_goto(2,1);
lcd_write_s(Buffer);

so bekomme ich bei einer batterie die 1.22V hat (gemessen) einen wert 
von -16384
#1102450
Lesenswert?

flwr wrote:
> sprintf(Buffer, "% 4d", volt );

Du solltest dich mal intensiv mit den Kürzeln im Formatstring bei printf 
beschäftigen. Insbesondere ist d die Angabe, das an der betreffenden 
Stelle in den Argumenten zu printf ein int steht. Du hast aber keinen 
int, du hast einen double. Und das Kürzel für double ist nun mal f und 
nicht d

http://www.mikrocontroller.net/articles/FAQ#Formatierungen_mit_printf

Spätestens jetzt ist der Hinweis auf ein vernünftiges Buch über C 
angebracht. Wie du gesehen hast warten da einige Überraschungen, die man 
nicht mit der Methode 'Versuch und Irrtum' rausfinden kann.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren