mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ADC & Typenwandlung


Autor: Sascha (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So,

nachdem mein Programm soweit läuft, suche ich unterstützung, um meine
AD-Werte dezimal auf dem LCD-Display anzuzeigen. Habe schon mal gesucht
und diese Funktion "itoa" gefunden. Kann mir einer erklären, wie ich
diese anwende?

Mfg sascha

Autor: Fritz Ganter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
so wie es in der Doku steht:
itoa(x,buffer,10);

x ist deine Integervariable
buffer ist ein char array, z.b:
char buffer[10];

10 ist für Dezimalsystem

du kannst auch sprintf nehmen:

sprintf(buffer,"%d Grad",x);

oder falls x eine Fliesskommavariable ist:
sprintf(buffer,"%.1f Grad",x);
zeigt dann mit einer Dezimalstelle an.

Autor: Sascha (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Fritz

Danke, hat mir geholfen. Da ich mit den AVR`s und C programmierung
gerade erst anfange, werd ich leider ab und zu hier mit fragen nerven
:-)

Mfg sascha

Autor: Fritz Ganter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Beachte aber, dass sprintf ca. 1300 Byte braucht (avr-libc).

Autor: Sascha (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

habe es mit itoa hingekriegt. Das LCD zeigt mir jetzt die ADC Werte
0-1023 an. Nun möchte ich aber die Spannung direkt anzeigen. Habe dazu
wie folgt gerechnet:

                read_adc(0);
    x=ADCW;
    x=((2510/1023)*x);
    itoa(x,buffer,10);
    lcd_gotoxy(0,1);
    lcd_puts(buffer);

Nun habe ich aber nur 2'er Schritte bis zum Wert 2046. Danach rührt
sich nichts mehr. Was habe ich da für einen Denkfehler?

Mfg Sascha

Autor: Fritz Ganter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
du rechnest falsch.

du musst x=((2510*x)/1023); machen, weil 2510/1023 ergibt 2, und damit
wird dann x multipliziert.

Autor: Sascha (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

dann zeigt er mir aber nur noch zwei Stellen im Display an.

Mfg Sascha

Autor: Fritz Ganter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Versteh ich nicht, warum es nur noch 2 Stellen sind.

Zu deinem ursprünglichen Code: das mit 2er Schritten passt schon, weil
der Wandler nur 10bit hat=1024 Werte. Mehr kann er nicht drauss machen,
wenn du mit 10 multiplizierst hast halt 10er Schritte.

Autor: Olaf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
... wo ist denn bitte der Unterschied zwischen
x=((2510/1023)*x); und
x=((2510*x)/1023);?
Macht beim zweiten Ausdruck vielleicht das 2510*x Schwierigkeiten
(Bereichsüberschreitung?)? Fritz hat ganz recht, 2510/1023 ist ein
konstanter Ausdruck, beide Berechnungen sollten aber das selbe Ergebnis
zur Folge haben. Ich weiß ja nicht welchen Controller du benutzt,
dementsprechend solltest du dir aber die Frage stellen, ob hier immer
eine (vielleicht rechenintensive und überflüssige) Division sinnvoll
ist.
Schreib doch mal, welchen Controller du benutzt, was für ein Signal du
abtastest und welche Uref du benutzt.

Olaf

Autor: Sascha (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also,

ich nutze einen ATmega16, dessen int. Ref.-Spg. und gebe das ganze über
ein 10k Poti auf den ADC0.  Die 2510 ist die gemessene Ref.-Spg. mit
einem Multimeter. Normalerweiße sollte bei der Rechnung die Spannung
von 0-2510 angezeigt werden.

Mfg Sascha

Autor: Fritz Ganter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sorry, war wohl müde:

nimm an, du bekommst den Wert 1000 gemessen:
1000*2510=2510000 dazu brauchst du einen 32bit integer um das zu
speichern.

Wenn du in C 2510/1023 rechnest, kommt 2 raus, wenn es richtig sein
soll, musst du 2510/1023.0 rechnen, dann kommt 2.45... raus, also
fliesskomma, damit kannst du mit x multiplizieren. Ist in C halt so,
Berechnungen in denen nur Integer vorkommt werden auch nur Ganzzahlig
gerechnet.

Fliesskomma ist halt speicherfressend und langsam.

An den 2er Schritten wirst mit einem 10bit Wandler nix ändern können.

Ich programmiere auch erst ein paar Tage MCs, muss mich auch erst von
32-bit auf 8-bit umgewöhnen.

Autor: Sascha (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hört sich ganz gut an. Werd es ausprobieren.
Habe sonst nur die 8051er in Assembler programmiert. Ist halt ne
Umstellung von MCS-51 nach AVR und vor allem von Assembler nach C. Aber
irgendwie find ich vieles in C einfacher.

Mfg sascha

Autor: Sascha (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So,

habs ausprobiert. Es funktioniert einmalig. Nur wie kann ich daraus
eine Formatierte Ausgabe machen wie z.B. 0.00V?

Mfg Sascha

Autor: Fritz Ganter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Steht ja schon oben:

du kannst auch sprintf nehmen:

sprintf(buffer,"%d Grad",x);

oder falls x eine Fliesskommavariable ist:
sprintf(buffer,"%.1f Grad",x);
zeigt dann mit einer Dezimalstelle an.

Also, wenn du Fliesskomma hast:
sprintf(buffer,"%.2fV",x);
lcd_puts(buffer);

Autor: Frank Simon (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ganz was anderes: meines Wissens musst Du zum Normieren durch die Zahl
der Stufen teilen, also durch 1024. Ich wollte es auch immer nicht
glauben, aber das kommt genau hin: du hast dann unten für den Wert
0b.00.0000.0000 ein halbes LSB und für den Maximalwert (den man
genaugenommen nicht mehr erfassen kann, denn er wäre ja
0b100.0000.0000) noch ein halbes LSB, und damit die (bis auf
Wandlungsfehler) ideale Tranferfunktion.
mfg
Frank

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.