Forum: Mikrocontroller und Digitale Elektronik Ausgabe von Gleitkommazahlen


von mathias giacomuzzi (Gast)


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

von mathias giacomuzzi (Gast)


Lesenswert?

ich glaube diese beitrag hatte ich besser in elektronik und uc getan
sorry !!!

von Mike (Gast)


Lesenswert?

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

von Jörg Wunsch (Gast)


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.

von mathias giacomuzzi (Gast)


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

von Mike (Gast)


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?

von mathias giacomuzzi (Gast)


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??

von mathias giacomuzzi (Gast)


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!!

von mathais giacomuzzi (Gast)


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

von Jörg Wunsch (Gast)


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).

von mathias giacomuzzi (Gast)


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

von OldBug (Gast)


Lesenswert?

sizeof liefert die Größe des Objekts in Bytes...

von peter dannegger (Gast)


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

von peter dannegger (Gast)


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

von mathias giacomuzzi (Gast)


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

von R2D2 (Gast)


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.

von mathias giacomuzzi (Gast)


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

von R2D2 (Gast)


Lesenswert?

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

von mathias giacomuzzi (Gast)


Lesenswert?

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

mfg mathias

von gerd (Gast)


Lesenswert?

Wenn es Assembler und schnell sein darf:

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

mfg
gerd

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.