ADC ließt falsche Werte aus

Gast #1102332
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!
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
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
>Hab ich getan. Außer dem werden doch die Werte permanent aktualisiert!

Aber nicht vor JEDER Ausgabe.

Versuch mal

     sprintf(Buffer, "% 4d", x );
      lcd_goto(2,1);
      lcd_write_s(Buffer);
Gast
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
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

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.