www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Ausgabe von Gleitkommazahlen


Autor: mathias giacomuzzi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo ich habe mal eine frage?

wie macht man dann das richtig wenn man beispielweise eine spannung mit
dem ADC messen, und diese dann auf dem display ausgeben will.

das messen mit ADC ist so glaube ich, habe es bisher noch nicht
gebraucht, kein problem, aufs display schreiben auch nicht!

aber wie ist es denn mit den datentypen?? denn eine spannung hat ja
meistens irgende ein float wert zum beispiel 12.23 ==> und wie schreibt
mann die nun aufs display, ohne der double to string funktion und auch
so, dass es den uc nicht langsam macht, ich bin student und habe eben
noch nicht sehr viel erfarung bezüglich solchen sachen die eigentlich
doch sehr wichtig sind oder??!!

oder ist es besser wenn man solche sachen überhaupt ohne
gleitkommazahlen macht und zum beispiel alles gleich mal 1000 rechnet
und dann bei der ausgabe das komma irgendwie, aber ich weis nicht wie
einfügt, oder wie macht man denn sowas richtig?

vielleicht hat jemand auch mal ein paar code ausschnitte wo man sowas
sieht, wie es richtig ist!!

besten dank für eure hilfe im voraus

mfg mathias giacomuzzi

Autor: mathias giacomuzzi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich glaube diese beitrag hatte ich besser in elektronik und uc getan
sorry !!!

Autor: Mike (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn es nur um eine Displaydarstellung geht, kannst du ruhig float
nehmen. Was bringt dir eine Displayaktualisierung von 1000fps? :-)

Autor: Jörg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ansonsten hängt das auch vom Controller ab, den du nehmen willst.

Wenn du den Platz hast, ist Gleitkomma immer die bequemste Variante.
Wenn du eine 10000er Serie auflegst, bei der sich EUR 0,50 pro
Controller Einsparung dann schon lohnen, sind scaled integers sicher
einen Blick wert.

Autor: mathias giacomuzzi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Mike ja das hätte ich auch nicht vorgehabt, und eigentlich geht es auch
um das messen und nachher rechnen mit floats.

Also ich möchte mit einem Atmega32 mit allen Kanälen des ADC eine
Spannung bzw. beim einen oder aderen noch eine Strom messen! Danach
möchte ich noch eine Amperestundenzähler realisieren und das heisst ja
rechnen, wieder rechnen und wieder rechnen und alles mit floats! Und
dann sollte alles auch noch in sinvollen abständen auf dem Display
angezeigt werden, so ca. alle sekunde.

@Jörg Wunsch
und das Problem ist eigentlich die Grösse von double, denn in der
avr-lib habe ich nicht über double gefunden ==> wie macht das denn der
AVR bezüglich speicher und so!! und wie genau ist das zum beispiel auf
dem mega32 ==> stellen vor und nach dem komma, ich denke ja nicht
gleich wie zum beispiel auf einer windoof maschine!

==> neben dem ganze möchte ich auch noch eine Temperatur via I2C messen
und auch über I2C einen DA-Wandler ansteuern!

... und deshalb dachte ich das es mit float vielleicht alles zu langsam
wird!!

ja und noch was anderers: sollte man eigentlich für sowas eine
scheduler verwenden?? oder reicht das auch wenn man das sauber
interrupt gesteurert aufbaut!?

besten dank im voraus

mfg mathias

Autor: Mike (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Soweit ich weiß ist auf dem AVR double=float von der Größe her.

Ich würde es so machen, dass das Abholen und Senden (DAC) der Werte per
Interrupt geschieht. Sämtliche Berechnung laufen dann in der main-loop.
Dort geschieht auch die Ausgabe auf dem LCD.

Zum Thema Laufzeit: Unterschätze einen AVR bei 16MHz nicht. Wenn du es
sauber programmierst und unnötigen Kram weglässt dürfte der AVR das
locker schaffen. Was willst du denn alles rechnen?

Autor: mathias giacomuzzi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja also das ganze soll mal ein Solarladeregler werden! Die Regelung
machen wir, also wir machen es zu zweit, analog und der AVR steuert
eigentlich nur die Analoge Schaltung also das ist nichts was probleme
macht!! aber dann soll eben noch, wie schon gesagt die Spannung und der
Ladestrom in sinvollen Abständen gemessen werden==> also nicht zu
langsam!!, und dann daraus eine Amperestundenzähler und
Wattstundenzähler realisiert werden, und ben von einwenig I2C
dazwischen und wenn es irgendwie dann läuft vielleicht noch eine
Uhrzeit ==> dcf77 oder so!!

und ja wieso in der main-loop rechnen macht man das dann nicht alles in
den interrupt routinen??

Autor: mathias giacomuzzi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ach ja ich möchte noch ergänzen, es ist eben so dass ich bisher nur
immer kleine sachen mit avrs gemacht habe und noch nie darauf geachtet
wegen double und so weiter!!

Autor: mathais giacomuzzi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ jörg wunsch.. und wenn ich jetzt double bzw. float, was nimmt man
eingentlich auf nem avr, nehme => ist es dann besser mit double to
string oder mit sprintf oder gibts noch etwas schöneres, besseres??


danke ich weis ich bin lästig, aber halt eben noch anfänger, ja und
vorweg ich lese c-bücher K&R und habe momentan sogar auch C unterricht,
wie gesagt student eben, aber auf dem AVR kann man ja nicht alles so
machen wie mans auf einer 32bit windows maschine macht!!

mfg mathias

Autor: Jörg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie schon jemand schrieb, derzeit ist bei AVR-GCC + avr-libc
sizeof(double) == sizeof(float) [== 4].  Das könnte sich eventuell mal
ändern (falls wir es wirklich schaffen, ,,richtige'' doubles zu
implementieren), aber sicher nicht heute und morgen und sicher auch
nicht ohne Rückwärtskompatibilität.

sprintf() hat natürlich den Vorteil einer guten Konfigurierbarkeit und
einfachen Handhabung, dafür ist es groß.  Wenn du den Platz hast, nimm
es, sonst nimm dtostre() oder dtostrf().  Gerade dtostre() hat aber
erwiesenermaßen Bugs (handgefeilter Assemblercode).

Autor: mathias giacomuzzi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ jörg wunsch ....also das sagt mir jetzt nichts sizeof(double)==4
heisst das jetzt vier bit oder wie, das kanns ja nicht sein oder.
vielleicht finde ich ja was im buch!!

danke für die Hilfe, nur noch ne kleine Frage bezüglich grösse. ich
habe irgendwo gelesen das es in der neuen lib etwas gib wo man die
grösse anschauen kann, wo finde ich das ??

danke mathias

Autor: OldBug (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
sizeof liefert die Größe des Objekts in Bytes...

Autor: peter dannegger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Früher in der Schule haten wir mal Fehlerabschätzung behandelt.

Grob gesagt bedeutet das, man macht sich Gedanken, welcher Fehler im
worst case bei einer Rechnung auftreten kann und welcher Fehler
tolerabel ist.

Es macht z.B. überhaupt keinen Sinn, einen 10 Bit ADC-Wert auf 10
Dezimalstellen genau auszugeben (10 Bit = 3 Dezimalstellen).

D.h. man merkt schnell, daß double fast nie benötigt wird, eigentlich
fallen mir nur Astronomie und Finanzwesen als potentielle Anwendungen
ein.


Peter

Autor: peter dannegger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
"und ja wieso in der main-loop rechnen macht man das dann nicht alles
in
den interrupt routinen??"


Der AVR hat keine Interruptprioritäten, d.h. solange man sich in einem
Interrupt befindet, stehen sämtliche anderen Prozesse.

Meistens ist das nicht tolerabel, dann hilft nur, das notwendigste im
Interrupt zu machen und alle nicht eiligen Sachen dann später im Main.


Peter

Autor: mathias giacomuzzi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
aha okay danke!!

@ Peter ...also das heist es ist besser wie oben bereits geschrieben
die werte in int umrechen und dann bei der ausgabe denn punkt dazu zu
fügen mit sprintf zum beispiel. oder??

mathias

Autor: R2D2 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das heißt, das dir die Float typen auf dem AVR mehr als reichen. Dein
ADC liefert 10bit. float hat 4*8=32bit=>3xmehr als nötig. Damit hast du
dann noch mehr als genug Genauigkeit, so dass Rundungsfehler nicht ins
Gewicht fallen. Noch 'n kleiner Hinweis:

Wenn man von so nem 10bit ADC z.B. nur %-Werte anzeigen lassen will
kann man auch einfach den int in nen string umwandeln und an die 3te
Stelle ein Komma setzen. Macht sich häufig nicht weiter bemerkbar, dass
es nicht exakt stimmt. Fehler:1-1024/1000=2,4%. Is dann extrem
Rechenzeit sparend.

Autor: mathias giacomuzzi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
okay danke aber ich will das schon genau messen!! und auch anzeigen in
meinem derzeitigen Projekt!

aber für anderes sachen okay!

danke mathias

Autor: R2D2 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
War ja auch nur als kleine Ergänzung. Die Hauptaussage war das dir Float
reicht.

Autor: mathias giacomuzzi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja mehr gibt ja eh nicht oder? ==> nur so ne frage??

mfg mathias

Autor: gerd (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn es Assembler und schnell sein darf:

http://www.avr-asm-tutorial.net/avr_de/rechnen/fpconv.html

mfg
gerd

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.