Forum: Mikrocontroller und Digitale Elektronik ATMega Temperatur


von Peter (Gast)


Lesenswert?

Hallo Forum, die Überschrift sagt alles. Also ich kann ua binäre 
Division und Multiplikation und so einiges mehr, nur beim Thema 
Thermometer versage ich so richtig. Bevor jetzt wieder so Komentare 
kommen wie "Zu faul zum Suchen", "Fange erst mal mit was leichten an" 
usw. Bitte schreibt gar nicht, bevor ihr sowas schreibt. Ich habe 
gegoogelt, sogar in meiner Verzweiflung versucht den AVR-GCC Compiler zu 
überreden mir zu sagen wie er es mit der e-Funktion macht. Hatte keinen 
Erfolg. Ich komm nicht weiter. Jetz zu dem was ich mir vorstelle. Ich 
würde gerne sehr billige NTC`s nehmen. warum billige NTC's? Weil ich ca. 
gefühlte 1000 Stellen habe an denen ich die Temperatur messen möchte. 
Banggood ist da einen gute Quelle. An ATMegas anschließen und die 
Messungen dann über ein kleines Netzwerk zu einem Raspi oä schicken bzw 
im ATMega verarbeiten oder was mir sonst noch einfällt. Das Programm 
sollte den Wert nehmen den ich für 0°C vorgebe (kalibriere) und mit 
diesem dann mit dem B-Wert und dem W R25-Wert und dem ADC-Wert die 
aktuellen Temperatur ausrechnen. Am besten ein Unterprogramm in reinem 
Assembler. Warum in Assembler? Weil ich es halt in Assembler schreiben 
möchte. Ist mein Hobby. Das Unterprogramm könnte man hier auch anderen 
zur Verfügung stellen. Also Daten rein - Ergebnis raus. Ich würde mir 
einen Temperaturbereich von -50 bis +100 Grad wünschen. Fertige 
Assemblerprogramme wären auch io, aber nicht optimal. Ich müßte aber 
auch verstehen was dort programmiert wurde.
Bei mir hakt es vor allem bei der E-Funktion wenn ich folgente Formel 
nehme:
R = R25*e^(1/(T+Tk) -1/(25+Tk)
Könnte mir jmd weiterhelfen?
Schon mal vielen Dank.

:
von Einer K. (Gast)


Lesenswert?

Peter schrieb:
> Ich habe
> gegoogelt, sogar in meiner Verzweiflung versucht den AVR-GCC Compiler zu
> überreden mir zu sagen wie er es mit der e-Funktion macht.
> Hatte keinen Erfolg.
Wieso?
Das liegt doch offen zu tage.
https://github.com/vancegroup-mirrors/avr-libc/blob/master/avr-libc/libm/fplib/log.S

von c-hater (Gast)


Lesenswert?

Peter schrieb:

> Bei mir hakt es vor allem bei der E-Funktion wenn ich folgente Formel
> nehme:
> R = R25*e^(1/(T+Tk) -1/(25+Tk)

> Könnte mir jmd weiterhelfen?

Der Trick ist: du berechnest sowas nicht zur Laufzeit, sondern vorab auf 
dem PC und legst es dann in einer Tabelle auf dem µC ab.

Da die ADCs der ATMega eh' nur 10 Bit können, hat diese Tabelle maximal 
1024 Einträge. Aber da man mit NTCs kaum den gesamten Bereich der ADCs 
sinnvoll nutzen kann, werden es in der Praxis nochmal deutlich weniger.

Außerdem ist es natürlich sinnvoll, nicht nur den gezeigten Teil des 
Formelwerks zu in die Tabelle zu packen, sondern gleich die Ergebnisse 
der Gesamtfunktion. Sprich: ADC-Wert als Index verwenden (ggf. 
beschränkt auf sinnvolle Ober- und Untergrenze) und der indizierte 
Tabelleneintrag liefert direkt das Endergebnis in °C (oder was auch 
immer gewünscht ist).

Außer dem bissel Geschiebe, um aus dem ADC-Wert einen korrekten 
Tabellenindex zu machen, brauchst du dann zur Laufzeit garnix mehr 
rechnen.

von Zweifler (Gast)


Lesenswert?

c-hater schrieb:
> Der Trick ist: du berechnest sowas nicht zur Laufzeit, sondern vorab auf
> dem PC und legst es dann in einer Tabelle auf dem µC ab.

Ich fürchte nur dass man für jeden NTC eine spezifische Tabelle
- also eine Eichung/Kalibrierung - erzeugen muss damit die Messung
befriedigend genau ausfällt.

Siehe auch:

Peter schrieb:
> Das Programm
> sollte den Wert nehmen den ich für 0°C vorgebe (kalibriere)

von Wolfgang (Gast)


Lesenswert?

Peter schrieb:
> Bei mir hakt es vor allem bei der E-Funktion

Dazu musst du ggf. nicht den GCC befragen, sondern über ein paar 
Grundlagen in C verfügen. Der uC selbst kann die e-Funktion sowieso 
nicht, sondern muss sie approximieren.

Wenn du deine "gefühlt 1000 Stellen" mal realistisch nachzählst, kommst 
du ingesamt vielleicht zu dem Schluss, dass du mit direkt busfähigen 
DS18B20 besser fährst.

von Zweifler (Gast)


Lesenswert?

Wolfgang schrieb:
> dass du mit direkt busfähigen DS18B20 besser fährst.

Oder vielleicht doch besser I2C-Sensoren à la DS1631 damit der
Controller noch was anderes tun kann ausser auf den OneWire
Bus zu warten und sein strenges Timing einzuhalten.

von Peter (Gast)


Lesenswert?

Ich würde es gerne zur Laufzeit in Assembler erledigen. Bei Null Grad 
abzugleichen habe ich als leichteste Möglichkeit in einer alten 
ELV-Zeitschrift gelesen (Wasser und Eis zusammen mischen). Das im 
Assembler habe ich iwi nicht gefunden.

von PittyJ (Gast)


Lesenswert?

Peter schrieb:
> Warum in Assembler? Weil ich es halt in Assembler schreiben
> möchte. Ist mein Hobby.

Wenn es das Hobby ist, dann sollte man es doch auch verstehen.
Da werden hier die Sourcen angegeben. Warum nicht benutzt?

Und wenn man wirtklich Floating Point Rechnungen in Assembler machen 
möchte, dann solten auch ein paar Mathematik Kenntnisse vorhanden sein. 
Immerhin ist die Formel ja nur ein Einzeiler.

Ich habe jahrelang mit Assembler mein Geld verdient. Aber dafür nehme 
ich die lieber eine Hochsprache. Da ist man in 5 Minuten Programmierung 
am Ziel. Und dann dauert es bei der Rechenzeit eben 5 Millisekunden 
länger, was solls.

Nimm die richtigen Werkzeuge.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Peter schrieb:
> warum billige NTC's? Weil ich ca. gefühlte 1000 Stellen habe an denen
> ich die Temperatur messen möchte.
Wenn ich 1000 Stellen hätte, wo ich die Temperatur messen wollte, 
dann würde ich mir einen Sensor aussuchen, den ich enfach und ohne 
Nachkalibrierung tauschen könnte. Billige NTC taugen da meist nicht, 
weil sie initial eine Toleranz von +-5..10% haben.

Peter schrieb:
> Bei mir hakt es vor allem bei der E-Funktion wenn ich folgente Formel
> nehme:  R = R25*e^(1/(T+Tk) -1/(25+Tk)
> Könnte mir jmd weiterhelfen?
Ich würde diese Formel als kleine Tabelle mit z.B. 32 Stützpunkten 
ablegen und dazwischen linear interpolieren. Das ist angesichts der 
übliche Toleranzen von NTCs hinreichend genau und geht in Assembler mit 
einigen Additionen und einem Shift.

> wenn ich folgente Formel nehme:  R = R25*e^(1/(T+Tk) -1/(25+Tk)
> Könnte mir jmd weiterhelfen?
Der Witz daran ist, dass du für diese Formel zuerst mal aufwändig aus 
einem ADC-Wert eine Spannung und aus einer Spannungsteilerschaltung den 
Widerstand des NTC ausrechnen und dann mit der umgestellten obigen 
Formel letztlich die Temperatur berechnen.
Ich würde da also konsequenterweise alles für die gerade genannte 
Tabelle schon vorher in Excel o.ä. ausrechnen, was sowieso bekannt und 
konstant ist (NTC-Widerstandkennlinie, Spannungsteiler und dessen 
Spannungsverlauf über die Temperatur, AD-Werte über die Temperatur...). 
Dann würde ich direkt mit dem Binärwert aus dem AD-Wandler in die obige 
Tabelle einsteigen und als Ergebnis würde ich direkt die Temperatur 
erhalten...

: Bearbeitet durch Moderator
von Christian H. (Gast)


Lesenswert?

Zweifler schrieb:
> Oder vielleicht doch besser I2C-Sensoren à la DS1631 damit der
> Controller noch was anderes tun kann ausser auf den OneWire
> Bus zu warten und sein strenges Timing einzuhalten.

I2C ist aber nichts für lange Strecken. Es gibt aber 1-Wire-BUsmaster 
(DS2482) die mittels I2C angesteuert werden und das ganze Timing selber 
machen. Da braucht der Controller nicht mehr viel machen.

von Peter D. (peda)


Lesenswert?

Peter schrieb:
> Warum in Assembler? Weil ich es halt in Assembler schreiben
> möchte.

Dann mußt Du es eben selber schreiben.
Der Rest der Welt nimmt dafür die Libs des C-Compilers.
https://de.wikipedia.org/wiki/Math.h

Temperaturmessungen sind ja keine eiligen Sachen, da spielt die 
Rechenzeit keine Rolle. Sich da mit Assembler abzuquälen, ist also 
vollkommen überflüssig.

Und wie ja schon gasgt wurde, wirst Du mit dem internen 10Bit-ADC eh nur 
grobe Schätzwerte erhalten können.

von HildeK (Gast)


Lesenswert?

Mal unabhängig von dem richtigen Einwand:
Lothar M. schrieb:
> Wenn ich 1000 Stellen hätte, wo ich die Temperatur messen wollte,
> dann würde ich mir einen Sensor aussuchen, den ich enfach und ohne
> Nachkalibrierung tauschen könnte. Billige NTC taugen da meist nicht,
> weil sie initial eine Toleranz von +-5..10% haben.

kannst du dir auch mal diese Seite anschauen:
http://www.sebulli.com/ntc/

Allerdings in C, sollte aber für einen Assembler-Programmierer keine 
Problem sein, das umzusetzen.

von Peter D. (peda)


Lesenswert?

Zweifler schrieb:
> damit der
> Controller noch was anderes tun kann ausser auf den OneWire
> Bus zu warten und sein strenges Timing einzuhalten.

Bequem geht das als Interrupt im Hintergrund:
Beitrag "DS18B20 mit Interrupt, AVR-GCC"

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

HildeK schrieb:
> kannst du dir auch mal diese Seite anschauen:
> http://www.sebulli.com/ntc/
Nett. Genau so geht das...  ;-)


> Billige NTC taugen da meist nicht,
> weil sie initial eine Toleranz von +-5..10% haben.
Einen hätte ich da allerdings im Kopf, der enger spezifiziert ist:
https://shop.bb-sensors.com/Messtechnik-je-Branche/Maschinenbau/Temperatursensor-NTC-10-k.html
Oder den aus dem Abverkauf:
https://shop.bb-sensors.com/Abverkauf/NTC-Temperatursensor-1-k-1.html

Ich würde da dann aber eher auf den KTY81 zurückgreifen, der ist an 
jeder Ecke zu bekommen:
https://de.farnell.com/nxp/kty81-110-112/temperatursensor-sod70/dp/2066195

Beitrag #6546464 wurde von einem Moderator gelöscht.
von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Alles vorbei schrieb im Beitrag #6546464:
> Ich würde einen AVR mit eingebautem Temperatursenssor
> z.B. (Attiny24 oder 25) nehmen.

Völlig unbrauchbar. Ich habe keine Ahnung, warum Atmel damals sowas 
integriert hat, aber sinnlos ist es trotzdem. Ungenau, träge und 
schlecht zu kalibrieren. Weil man sich dann noch mit der Bandgap 
Referenz rumschlagen muss, hat man die nächste Fehlerquelle.

von Peter (Gast)


Lesenswert?

1000 KTY 81 kosten immer noch 489 € + Steuer und Versand.

Bei Sebulli kann ich mit der Tabelle nichts anfangen, wsl weil ich nicht 
erkennen kann, was er mit dem Ergebnis des ADC macht, wie er es 
verarbeitet. Seine Formel sieht aber besser aus als meine. Dort bräuchte 
ich allerdings den natürlichen LOG.

von Andreas B. (bitverdreher)


Lesenswert?

Und Du meinst es kommt billiger, 1000 Sensoren abzugleichen als gleich 
ordentliche Sensoren zu verwenden?

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Peter schrieb:
> 1000 KTY 81 kosten immer noch 489 €
Umsonst ist der Tod. Und der kostet das Leben. Der Abgleich und die 
Folgekosten sind bei billigen Sensoren garantiert um ein Vielfaches 
teurer.
>  + Steuer
In anderen Ländern sind die Steuern niedriger.
> und Versand.
Wenn du hinfährst und die Sensoren abholst, kannst du evtl. den Versand 
"sparen".
Bitte, was ist denn das für ein jämmerliches Niveau?

Peter schrieb:
> Bei Sebulli kann ich mit der Tabelle nichts anfangen, wsl weil ich nicht
> erkennen kann, was er mit dem Ergebnis des ADC macht, wie er es
> verarbeitet.
Du hast dich ja auch noch nicht arg lange damit beschäftigt...

Im Grunde nimmt er den 10 Bit AD-Wert und verwendet die oberen 5 Bits 
als Index für den Zugriff auf die Tabelle.
Und dann nimmt er die 5 unteren Bits des AD-Werts und gewichtet die 
beiden Tabellenwerte je nach "Abstand" zu den nächsten 
Tabellenstützpunkten.
Wenn z.B. der unterste Wert mit Index 0 in der Tabelle 10 ist und der 
zweite 20 und zudem der ADC-Wert 00_0000_0000, dann kommt als Ergebnis 
10 heraus, wiel die Bits 9..4 ja 00000 sind und damit der Index 0.
Und wenn der ADC-Wert 00_0010_0000 ist, dann kommt als Ergebnis 20 
heraus, weil ja die oberen 5 Bits 00001 und damit der Index 1 ist.
Beide Werte sind also deshalb so einfach zu ermitteln, weil der 
Stützwert direkt "getroffen" wird.

Wenn jetzt aber der ADC-Wert 00_0000_1111 ist (also im Grunde genau 
zwischen 10 und 20), dann ist der Index 0 und es wird zur Hälfte der 
untere Wert und zur Hälfte der mit dem Index drüber genommen und der 
Mittelwert gebildet. Und der Mittelwert ist einfach kommt als Ergebnis 
(10*16 + 20*16)/32 heraus. Und das sind 15.
Wenn der AD-Wert nun 00_0000_0111 sind (also ein Viertel zwischen 10 und 
20), dann ergibt die Rechnung (10*24 + 20*8)/32 = 12,5 (als integer dann 
natürlich 12).

Einfach mal einen halben oder ganzen Tag drüber nachdenken. Irgendwann 
tut es den Schnackler und dir geht das Licht auf. Besonders, wenn 
jemand, der gerne Assembler programiert, sowieso mit solchen 
Bitfrickeleien "per du" ist...

: Bearbeitet durch Moderator
von Axel R. (axlr)


Lesenswert?

Hey,
sitze ich auch gerade dran, an "sowas".
(Drehstromkochplatte und in einem 35-Liter(?) auf Topf 60°C halten)

HildeK schrieb:
> kannst du dir auch mal diese Seite anschauen:
> http://www.sebulli.com/ntc/

Hab ich mal gemacht. Witzig ansich. Wenn ich testhalber die 
Temperaturgrenzen ändere, ändert sich an den Tabelleneinträgen nichts.
Ich bekäme bei Vollausschlag 285° und im "MinimalFall" -71°C.
Vielleicht kann man drauf hinweisen, dass man sich vorab den Pull-Up so 
hinbastelt, dass das Spannungsteilerverhältnis auch praktiabel ist.
bei 25°C hat man halbe Vref, wenn der Pullup genauso groß ist, wie der 
NTC.

Hat zwar nicht viel mit der ausgangsfrage zu tun gehabt, wollte es 
trotzdem mal anbringen, weils mir eben auffiehl.
Bei mir wären 40°C - 80°C ein einzustellender Bereich.
1
Anzahl der Stützpunkte:--> 128
2
Einheit in °C:--> 1
3
ADC Auflösung:--> 8
4
NTC Beschaltung:--> NTC mit PullUp Widerstand
5
PullUp/Down-Widerstand in Ohm:--> 10000
6
Widerstand NTCs bei 25°C:--> 10000
7
BETA Wert des NTCs:--> 3480
8
Test resistance:--> 10000
9
Messbereich:--> Von 0°C bis 100°C
10
11
int NTC_table[129] = {
12
  285, 237, 189, 165, 149, 138, 129, 121, 115, 
13
  110, 105, 101, 97, 93, 90, 87, 85, 82, *80, 
14
  *77, *75, *73, *71, *70, *68, *66, *65, *63, *61, *60, 
15
  *59, *57, *56, *55, *53, *52, *51, *50, *49, *48, *47, 
16
  *46, *45, *43, *42, *42, *41, *40, 39, 38, 37, 36, 
17
  35, 34, 33, 32, 32, 31, 30, 29, 28, 27, 27, 
18
  26, 25, 24, 23, 23, 22, 21, 20, 19, 19, 18, 
19
  17, 16, 16, 15, 14, 13, 12, 12, 11, 10, 9, 
20
  9, 8, 7, 6, 5, 4, 4, 3, 2, 1, 0, -1, -2, 
21
  -2, -3, -4, -5, -6, -7, -8, -9, -10, -12, 
22
  -13, -14, -15, -16, -18, -19, -20, -22, -24, 
23
  -25, -27, -29, -31, -34, -36, -39, -43, -47, 
24
  -53, -62, -71
25
};
wie man gut sieht, sind von 128 Stützstellen lediglich paar'ndreissig
(von mir mitm Sternchen markiert) übrig geblieben.
Aber das mmit der Tabelle kann man auch in ASM gut umsetzen, Progmem und 
LPM (lange her, oder? AT90S1200)

Wenn es Recht ist, würde ich (in einem eigenen Tread) mal nach den 
Regelparametern fragen wollen und ob ich ein 40A 3-Phasen SSR kühlen 
muss. Grins)
Messen der Temperatur ist ja nur das eine; den riesigen Topf Wasser 
ausregeln stell' ich mir spannend vor.

Erst mal liebe Grüße in die Runde,
Äxl

: Bearbeitet durch User
von Einer K. (Gast)


Lesenswert?

Recht Offtopic, denke aber, dass da eine Klärung wichtig wäre.....


Matthias S. schrieb:
> Völlig unbrauchbar. Ich habe keine Ahnung, warum Atmel damals sowas
> integriert hat, aber sinnlos ist es trotzdem. Ungenau, träge und
> schlecht zu kalibrieren. Weil man sich dann noch mit der Bandgap
> Referenz rumschlagen muss, hat man die nächste Fehlerquelle.


Naa...
In deinen Augen völlig unverständlich.

Im AVR sind einige Dinge verbaut, welche schon temperaturabhängig sind.
Sei es die genannte Bandgap Referenz
Der RC Oszillator (OSCCAL) (Baud)
Auch der Oszillator des WDT

Für alle diese kann man Kalibrierwerte aus den Sensordaten erzeugen.
z.B. für den Außen/Kfz Einsatz, ohne Quarz und mit Serieller 
Schnittstelle.


> träge
Weil er unter dick Plastik auf dem Die wohnt.
Zudem direkt von der Eigenerwärmung des µC beeinflusst wird.
Das macht ihn als "Raumtemperatur Sensor" quasi unbrauchbar.
Aber zum Zwecke der Kalibrierung, goldrichtig.

Ja, er macht Sinn!
Nicht immer und scheinbar auch nicht für jeden.

von Stefan F. (Gast)


Angehängte Dateien:

Lesenswert?

Peter schrieb:
> Hallo Forum, die Überschrift sagt alles.

Die Überschrift sagt "ATMega Temperatur", also annähernd nichts.

Bei einem NTC genügt in der Praxis meistens eine einfache Linearisierung 
mittels Widerstand. Typischerweise Rs mit gleichem Wert wie der NTC und 
Rp mit dem Zehnfachen Ohm-Wert.

https://www.electronicdeveloper.de/MesstechnikNTCLinearR.aspx

Damit kommst kannst du eine Spanne von ca. 20 Grad (z.B. 15 bis 35°C) 
abdecken innerhalb der die Messung weniger als 1 Grad Abweichung 
liefert.

Genauer wird es nur theoretisch, denn in der Praxis driftet/altert der 
NTC ein bisschen mit der Zeit und der ADC ist nicht absolut linear. 
Größere Mühe lohnt sich nur, wenn man einen erheblich größeren 
Temperaturbereich abdecken muss.

> Ich würde mir einen Temperaturbereich von -50 bis +100 Grad wünschen.

Da kann sich mehr Aufwand schon lohnen, wenn du weniger als (geschätzte) 
5°C Abweichung in den Randbereichen brauchst. Irgendwo im Netz gibt es 
dazu ein Tool, das die Abweichung der obigen Schaltung ausrechnet.

Beitrag #6546794 wurde von einem Moderator gelöscht.
Beitrag #6546810 wurde von einem Moderator gelöscht.
Beitrag #6546814 wurde von einem Moderator gelöscht.
Beitrag #6546826 wurde vom Autor gelöscht.
Beitrag #6546925 wurde von einem Moderator gelöscht.
Beitrag #6546950 wurde von einem Moderator gelöscht.
Beitrag #6547020 wurde von einem Moderator gelöscht.
Beitrag #6547211 wurde von einem Moderator gelöscht.
Beitrag #6547227 wurde von einem Moderator gelöscht.
von Peter F. (avr_anfaenger)


Lesenswert?

Iwi ist das alles nicht so richtig zielführend. Es scheint mir bald so, 
sobald man einen Abgleich machen möchte, z.B. bei 0°C mit gefrorenen, 
destillierten Wasser, kommt man ohne natürlichen Logarithmus nicht mehr 
aus. Ich habe da eine Routine auf 
https://sites.google.com/site/avrasmintro/home/2c-logarithms gefunden.
Siehe unter "8. NATURAL LOGARITHM OF A SIXTEEN-BIT NUMBER". Funktioniert 
auch, nur habe ich zwei Teile im Ergebnis, als erstes "Fractional Part 
of Answer" und als zeites "Integer Part of Answer". Nun stellt siech mir 
die Frage, was kann ich mit welchem Teil machen, vor allem bräucht ich 
zum Schluß eine Festkommazahl um einen einigermaßen genauen Wert 
errechnen zu können.
Kann mir jmd erklären was ich genau mit den Zwei Integerzahlen machen 
kann und wie ich zu einer Festkommazahl komme?

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Peter F. schrieb:
> vor allem bräucht ich zum Schluß eine Festkommazahl um einen
> einigermaßen genauen Wert errechnen zu können.

Die Genauigkeit einer 32-Bit-Gleitkommazahl ist zu schlecht, oder warum 
diese Aussage?

von Peter F. (avr_anfaenger)


Lesenswert?

Und da kommt jetzt meine Unwissenheit ins Spiel, tut mir leid, aber ich 
verstehe nicht ganz wie Du auf 32-Bit-Gleitkommazahl kommst. Könntest Du 
mir hierzu ein paar Stichwörter schreiben?

von Einer K. (Gast)


Lesenswert?

Peter F. schrieb:
> wie Du auf 32-Bit-Gleitkommazahl kommst

Das übliche AVR Float steckt in 32 Bit.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Peter F. schrieb:
> aber ich verstehe nicht ganz wie Du auf 32-Bit-Gleitkommazahl kommst

Das wäre für mich in dem Moment, wo ich mit irgendwelche logarithmischen 
Rechnereien herum hantieren möchte, das Mittel der Wahl – es sei denn, 
es sprechen außerordentlich handfeste Gründe dagegen (Konsumgüter-Gadget 
in Millionenstückzahl, bei dem es auf jeden Cent ankommt, muss mit einem 
ATtiny13A auskommen oder dergleichen).

Die Gleitkomma-Implementierung der üblichen AVR-Compiler ist gut genug, 
dass man die Rechnerei auf einem halbwegs brauchbar ausgestatteten 
ATmega (der steht in der Überschrift) locker in Gleitkomma abhandeln 
kann, sowohl von der Rechenzeit als auch vom Flash-Bedarf. Damit spart 
man sich all diese Verrenkungen, irgendwelche Logarithmen in 
Festkommaarithmetik zu berechnen. Na klar geht sowas, aber der Aufwand, 
die Software dafür zu zimmern und zu pflegen, explodiert einfach im 
Vergleich zur simplen Lösung mit Gleitkommazahlen (wie du ja im Prinzip 
schon an deiner Frage erkennen kannst).

(Vor 30+ Jahren habe ich mal eine Approximation für einen 
Binär-Logarithmus mit Festkommazahlen gezimmert. Das war aber ein 
schwächlicher Z80 mit einem BASIC drunter, und die gesamte 
Logarithmierung diente nur der logarithmischen Achsen-Skalierung in der 
Grafik-Darstellung, musste also auch nicht übertrieben genau sein.)

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.