mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Problem mit ADC/UART


Autor: Doran S. (utzer)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe ein Programm für einen ATmega32 geschrieben. Da wird eine 
Spannung mit dem ADC gemessen.
Die eigentlich Messung funktioniert auch, ich erhalte den ADC-Wert ohne 
Probleme.
Doch dieser Wert ist nun in einem int.
Nun möchte ich daraus die Spannung berechnen. Wie das eigentlich 
funktioniert ist mir auch klar, mit dem Taschenrechner funktioniert auch 
alles, nur im µC nicht.
Meine Referenzspannung beträgt 5V. Ich setzte einen Spannungsteiler ein, 
1k nach Masse, 10k nach Plus, in der Mitte ist der ADC-Pin.
somit erhalte ich bei 12V einen Wert von ca. 223.

Ich habe bereits versucht, nun mit dem Mikrocontroller die Spannung zu 
errechnen und über den UART auszugeben, doch leider bisher ohne Erfolg.

Hier Mein Versuch:
        int wert;
  double ua;
  double volt;
  char a[100];

  uart_init();    //UART-initialisierung

    wert=lesen(0); //Nun liegt in "wert" 223....
    ua=(wert/1023)*5;
    volt=(ua/1000)*(10000+1000);

    sprintf(a, "%f", volt);
in "a" liegt jetzt leider nun "?" was mache ich falsch???
Mein UART funktioniert soweit ganz gut......
Ich glaube, mein größstes Problem ist die Umrechnung von double nach 
char a[100]

wo liegt der Fehler?

mfg

utezr

Autor: Michael U. (amiga)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Doran S. schrieb:
>
>         int wert;
>   double ua;
>   double volt;
>   char a[100];
> 
>   uart_init();    //UART-initialisierung
> 
>     wert=lesen(0); //Nun liegt in "wert" 223....
>     ua=(wert/1023)*5;
>     volt=(ua/1000)*(10000+1000);
> 
>     sprintf(a, "%f", volt);
> 
> in "a" liegt jetzt leider nun "?" was mache ich falsch???

ich übe mal etwas C (muß ich sowieso immernoch...

>     ua=(wert/1023)*5;
 Was amcht der Compiler?
223/1023 = 0 (ist ja alles Integer)
0 * 5 ist immernoch 0 (eigentlich nuß man nicht weitermachen...)

Oder irre ich da?

Gruß aus Berlin
Michael

Autor: Doran S. (utzer)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

  double wert=223;
  double ua;
  double volt;
  char a[100];

  uart_init();    //UART-initialisierung

    ua=(wert/1023)*5;
    volt=(ua/1000)*(10000+1000);

    sprintf(a, "%f", volt);

Wenn ich jetzt aber "a" über den UART ausgeben, dann kommt immernoch nur 
"?".....

was jetzt????

mfg

utzer

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Wenn ich jetzt aber "a" über den UART ausgeben, dann kommt immernoch nur
>"?".....

Du hast ein sprintf() ohne Floating Point Support gelinkt.
Wie ging denn das noch im makefile?

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Forumsuche nach "printf fragezeichen" sollte dir weiterhelfen.

Autor: Doran S. (utzer)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

vielen Dank für die Hilfe, es funktioniert nun, nachdem ich dashier...

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

...durchgeführt hatte.

Ich verstehe zwar ehrlich gesagt nicht genau, was das macht(irgentwas 
wegen dem Komma????)
Aber es funktioniert.....


mfg

utzer

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Warum steht in dem von dir verlinkten Artikel

..."Beim WinAVR/AVR-Studio wird standardmässig eine Version der 
printf-Bibliothek verwendet, die keine Floating Point Verarbeitung 
unterstützt. Die meisten Programme benötigen keine Floating Point 
Unterstützung, sodass hier wertvoller Programmspeicherplatz gespart 
werden kann.

Benutzt man dann allerdings eine printf Variante für die Ausgabe von 
Floating Point Zahlen, so erscheint an Stelle der korrekt formatierten 
Zahl lediglich ein '?'. Dies ist ein Indiz, dass die Floating Point 
Verarbeitung im Projekt aktiviert werden muss."...

Autor: Doran S. (utzer)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

danke an Gast, für den Hinweis :-)
Allerdings fällt mir jetzt auf, dass meine Spannungsmessung nur ca. 
stimmt, und 11,98 anzeigt, statt 12,2(Multimeter).....
Liegt das an der Referenzspannung, ich verwende AVR-Studio und da kann 
man die noch mit so einem "Regler" einstellen(hab ich auf 5V 
gestellt)..... ich habe aber natürlich auch
REFS0 auf '1' gesetzt und REFS1 auf '0'..... also auch 5V(da der AVR ja 
mit 5V betrieben wird).....

Wie muss ich eigentlich die Fuses programmieren???
Was macht eigentlich der Statur "reserviert"(bei der Referenzspannung)?


mfg

utzer

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

Bewertung
0 lesenswert
nicht lesenswert
Doran S. schrieb:
> Hallo,
>
> danke an Gast, für den Hinweis :-)
> Allerdings fällt mir jetzt auf, dass meine Spannungsmessung nur ca.
> stimmt, und 11,98 anzeigt, statt 12,2(Multimeter).....

Dein 1k Widerstand wird nicht genau 1k haben.
Dein 10k Widerstand wird nicht genau 10k haben.

> Wie muss ich eigentlich die Fuses programmieren???

Kommt drauf an, was du erreichen willst.

> Was macht eigentlich der Statur "reserviert"(bei der Referenzspannung)?

Nichts. Das Bitmuster hat sich Atmel für zukünftige Erweiterungen (bei 
anderen Prozessoren) reserviert. Auf deinem µC macht diese Einstellung 
nichts, auf einem anderen µC könnte sie irgendetwas sinnvolles machen.

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>Liegt das an der Referenzspannung, ich verwende AVR-Studio und da kann
>man die noch mit so einem "Regler" einstellen(hab ich auf 5V
>gestellt)..... ich habe aber natürlich auch
>REFS0 auf '1' gesetzt und REFS1 auf '0'..... also auch 5V(da der AVR ja
>mit 5V betrieben wird).....

Das sind zwei paar Schuhe. Wenn du die Einstellung vom AVR-Studio nutzen 
willst müssen REFS0/1 beide 0 sein (und Jumper richtig setzen). Bei 
deiner Einstellung wird VCC als Referenz benutzt. Allerdings solltest du 
dich nicht unbedingt auf beide Werte verlassen.
Wenn du genauer messen willst, passe deinen Spannungsteiler an und 
benutze die interne Referenz.

>Was macht eigentlich der Statur "reserviert"(bei der Referenzspannung)?

Nimm es mal als: NICHT BENUTZEN!

MfG Spess

Autor: Doran S. (utzer)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ok, danke

utzer

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.