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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.