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
ich glaube diese beitrag hatte ich besser in elektronik und uc getan sorry !!!
Wenn es nur um eine Displaydarstellung geht, kannst du ruhig float nehmen. Was bringt dir eine Displayaktualisierung von 1000fps? :-)
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.
@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
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?
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??
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!!
@ 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
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).
@ 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
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
"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
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
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.
okay danke aber ich will das schon genau messen!! und auch anzeigen in meinem derzeitigen Projekt! aber für anderes sachen okay! danke mathias
War ja auch nur als kleine Ergänzung. Die Hauptaussage war das dir Float reicht.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.