Forum: Mikrocontroller und Digitale Elektronik ADC ließt falsche Werte aus


von flwr (Gast)


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!

von flwr (Gast)


Lesenswert?

ach ich merk gerade: die eine schleife ist überfluessig!

von Karl H. (kbuchegg)


Lesenswert?

definiere 'komische Werte'

von Karl H. (kbuchegg)


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?

von flwr (Gast)


Lesenswert?

hoechstwahrscheinlich! ;) dann werd ich mich mal um ne alternative 
bemühen! danke erstmal!

von flwr (Gast)


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.

von dummy (Gast)


Lesenswert?

>so wie es sein soll und dann nur noch Werte
>zwischen 1023 und 9000.

Lösch das Display bevor du neue Werte ausgibst!

von flwr (Gast)


Lesenswert?

Hab ich getan. Außer dem werden doch die Werte permanent aktualisiert!

von dummy (Gast)


Lesenswert?

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

von flwr (Gast)


Lesenswert?

ach so meinst du das.. na ich probier mal!

von flwr (Gast)


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

von Karl H. (kbuchegg)


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.

von flwr (Gast)


Lesenswert?

ja du hast recht. Ich hab bevor ich das gepostet hab nach platzhalter 
gegooglet. ich werd mich mal um ein buch bemühen! danke schön trotz dem.

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.