www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Char wandeln


Autor: guest (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Ich versuche grade eine Spannungsmessung mit dem ADC des Mega32 zu 
basteln. Bisher liefs auch ganz gut. Ich möchte nun aber nicht nur den 
digitalen Wert des ADC Wandler aufs Display bringen, sondern auch eine 
Umrechnung auch Volt.

Ich bekomme aber mein Char Array nicht konvertiert. atof() bringt meinen 
Compiler zum weinen und ich weiß nicht warum.

Hier mal der Code bisher
#include <avr/io.h>
#include <avr/delay.h>
#include <util/display.h>
#include <stdio.h>
#include <stdlib.h>
#include <avr/interrupt.h>


void main()
{
  int i=0;
  int result;                // Ergebniss der ADC Messung
  char buffer[6];              // Var für Wandlung Binär->Dez

  // ADC TESTS
  display_init();    
  ADMUX = 0b01000000;            // AD Kanal und Referenz einstellung
  do
  {
    ADCSRA = 0b11101110;        // ADC Initialisieren

    _delay_ms(15);
    result = ADC;        
    itoa(result, buffer, 10 );      // Wandlung Binär->Dez
    display_ptext("ADC:",2,1);      // Ausgabe
    display_position(2,6);
    display_text(buffer);
    if(buffer<'1000')          // 1/1000 bei Nichtnutzung löschen
    {
      display_ptext(" ",2,9);
    }
    _delay_ms(5);
  } while(i < 1);
}

Nun würde ich halt gerne:
spannung = ((buffer/1023)*5) rechnen. Geht natürlich nicht. Wie muss ich 
da vorgehen? Am liebsten in c++ ^^

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du verfolgst fast den richtigen Ansatz, aber machst kurz vor der 
Zielgeraden einen entscheidenden Fehler.

Einerseits wandelt itoa nicht "Binär->Dez" um, sondern erzeugt eine 
Klartext-Repräsentation (ein String, eine Zeichenkette) des übergebenen 
numerischen Wertes, andererseits musst Du, um Deine Berechnung anstellen 
zu können, das nicht mit der Klartext-Repräsentation des Wertes 
anstellen.

Am einfachsten ist das mit Floating-Point-Arithmetik:
int result;
float spannung;
 
spannung = (result / 1023.0) * 5.0;
(Beachte hier die abweichende Schreibweise der Konstanten!)

Diesen so bestimmten /float/-Wert musst Du noch für die Ausgabe in eine 
Klartextrepräsentation umwandeln, das geht am einfachsten mit der 
Funktion sprintf.
sprintf(buffer, "%2.2f V", spannung);

Der Ansatz hat aber zwei Nachteile:

- Floating-Point-Arithmetik ist rechenzeitintensiv und benötigt viel 
Codespeichher

- sprintf benötigt ebenfalls viel Codespeicher

Autor: H.Joachim Seifert (crazyhorse)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
geht doch mit Ganzzahl genauso.
(long) result*5000/1023;
liefert dir die Angabe in mV. komma passend setzen, fertig.

Autor: guest (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Rufus ich habe mein programm jetzt um deinen code erweitert. Leider 
steht nun an der stelle wo die spannung stehen sollte nur ein 
fragezeichen. diese ganze umwandelei von datentypen ist mir allerdings 
auch noch ein rätsel. vielleicht kannst du mir nochmal sagen was ich 
falsch gemacht habe.
#include <avr/io.h>
#include <avr/delay.h>
#include <util/display.h>
#include <stdio.h>
#include <stdlib.h>
#include <avr/interrupt.h>


void main()
{
  int i=0;
  float spannung;
  int result;                // Ergebniss der ADC Messung
  char buffer[6];              // Var für Wandlung Binär->Dez

  // ADC TESTS
  display_init();    
  ADMUX = 0b01000000;            // AD Kanal und Referenz einstellung
  do
  {
    ADCSRA = 0b11101110;        // ADC Initialisieren

    _delay_ms(15);
    result = ADC;        
    itoa(result, buffer, 10);      // Wandlung Binär->Dez
    display_ptext("ADC:",2,1);      // Ausgabe
    display_position(2,6);
    display_text(buffer);
    if(buffer<'1000')          // 1/1000 bei Nichtnutzung löschen
    {
      display_ptext(" ",2,9);
    }
    spannung = (result / 1023.0) * 5.0;
    display_ptext("Spannung:",3,1);
    sprintf(buffer, "%2.2f V", spannung);
    display_position(3,10);
    display_text(buffer);
    _delay_ms(5);
  } while(i < 1);
}

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
    if(buffer<'1000')
Das ist ..., naja, Unsinn halt.
->
    if(result<1000)

> Leider steht nun an der stelle wo die spannung stehen sollte nur
> ein fragezeichen.

http://www.mikrocontroller.net/articles/FAQ#Aktivi...

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

Bewertung
0 lesenswert
nicht lesenswert
@ Thread Opener

>
    if(buffer<'1000')
> Das ist ..., naja, Unsinn halt.

Ohne Vorkentnisse in Stringverarbeitung ist das nicht wirklich zu 
verstehen, warum das überhaupt compiliert. Es compiliert, aber es macht 
etwas völlig anderes als du vermutest.

Zum Thema Stringverarbeitung: Scroll in der von Stefan verlinkten FAQ 
auch etwas nach oben. Dort findest du eine kurze, minimalistische 
Abhandlung über Strings. Die umfasst ungefähr 10% von dem was es über 
Strings so alles zu erzählen gäbe.

> sprintf(buffer, "%2.2f V", spannung);

Du solltest dir auch in einem C-Lehrbuch deiner Wahl die Bedeutung der 
Buchstaben und Ziffern im Formatstring von sprintf ansehen.

%2.2f ist nicht sehr sinnvoll. Das besagt:
Die Floating Point Zahl wird in einem Feld der Länge 2 ausgegeben, wobei 
2 Stellen davon Nachkommastellen sein sollen.
Nun sind 2 Stellen + der klarerweise notwendige Dezimalpunkt schon 
mindestens 3 Stellen und da sind jetzt noch gar keine Stellen vor dem 
Komma gerechnet. 2.2 kann daher schon nicht passen, weil es mindestens 
4.2 sein müssten (das Feld muss mindestens 4 Stellen breit sein: Eine 
Vorkommastelle, der Dezimalpunkt und 2 Nachkommastellen macht 4 Stellen 
gesamt). Jetzt ist da noch kein eventuell vorhandenes Vorzeichen gezählt 
(gut, kommt bei dir nicht vor) und mit einer Vorkommastelle wirst du 
auch nicht auskommen.
Gut ist nur, dass sprintf deine Angaben weitgehend ignoriert, wenn es 
damit nicht zurechtkommt. Trotzdem solltest du das richtig stellen.
Dazu musst du aber wissen, was es so alles gibt.


-> Das lernst du aus einem C-Buch!
Du brauchst eines! Ohne geht es nicht!

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> %2.2f ist nicht sehr sinnvoll.

Da hast Du natürlich wie so oft recht.

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.