mikrocontroller.net

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


Autor: flwr (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: flwr (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ach ich merk gerade: die eine schleife ist überfluessig!

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
definiere 'komische Werte'

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: flwr (Gast)
Datum:

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

Autor: flwr (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: dummy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>so wie es sein soll und dann nur noch Werte
>zwischen 1023 und 9000.

Lösch das Display bevor du neue Werte ausgibst!

Autor: flwr (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hab ich getan. Außer dem werden doch die Werte permanent aktualisiert!

Autor: dummy (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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);

Autor: flwr (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ach so meinst du das.. na ich probier mal!

Autor: flwr (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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#Format...

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.

Autor: flwr (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.