mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Kommastellen in Assembler


Autor: Benno (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich habe gerade einen DS1620 Temperatursensor an meinen 80C32 gehängt.
Die Temperatur habe ich auch bereits ausgelesen, aber nur mit 0,5°C 
Auflösung.
Um die Temperatur genauer zu berechnen, gibt es folgende Formel:
Temperatur=gelesener 
Wert-0,25+(Korrekturfaktor-Zählerstand)/Korrekturfaktor

gelesener Wert liegt als signierte Byte Zahl vor, Korrekturfaktor und 
Zählerstand als Byte Zahl.
Den gelesenen Wert muss ich schlimmstenfalls um eins erhöhen, falls 
-0,25+(Korrekturfaktor-Zählerstand)/Korrekturfaktor größer 1 ist, aber 
ich habe keine Ahnung wie ich diesen Nachkommastellenteil ohne größeren 
Aufwand in Assembler berechnen kann.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Um z.B. 2 Nachkommastellen zu erhalten, multiplizierst Du alles mit 100:

Temperatur=gelesener 
Wert*100-25+((Korrekturfaktor-Zählerstand)*100)/Korrekturfaktor

Und bei der Ausgabe wird dann vor den beiden letzten Stellen ein Komma 
gesetzt.


Ganzzahl-Rechenfunktionen findest Du z.B. hier:

http://www.specs.de/users/danni/appl/soft/arithmet/index.htm


Peter

Autor: Benno (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Berechnung der Kommastelle mit mal 10, mal 100 usw. ist klar, aber 
dazu benötige ich 16bit Routinen, die zum Teil recht umfangreich sind.
Gibt es dafür nicht kürzer Routinen, bzw. irgendeinen Trick, wie man 
eine einzelne Kommastelle berechnen kann ?

Im Moment habe ich das so gelöst:

Temperatur=gelesener Wert

Nachkommastelle=2+(Korrekturfaktor-Zählerstand)/(Korrekturfaktor/10)

Wenn Nackommastelle >9 oder <0 dann Temperatur +1 bzw. -1.

Allerdings ergeben sich dadurch recht große Rundungsfehler, ab und zu 
erhalte ich dann Anzeigen wie 21,;°C.
Dies ist dannd er Fall wenn der berechnete Wert größer 19 oder kleiner 
-9 (also kleiner 246) ist. Dies dürfte normalerweise nicht vorkommen, 
aber entsteht durch Rundungsfehler (vermute ich mal)

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
"... Routinen, die zum Teil recht umfangreich sind."

Was meinst du damit ?


Meine oben genannten Routinen benötigen einmalig:

Addition: 17 Byte
Subtraktion: 17 Byte
Multiplikation: 51 Byte
Division: 88 Byte

und dann für jeden Aufruf 2 Byte (ACALL) bzw. 3 Byte (LCALL).

Das läßt selbst auf einem kleinen AT89C2051 noch sehr viel Platz für 
Deine Programme.


Peter

Autor: Benno (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich stelle die Frage anderst:
Von der Länge her sind die Routinen oftmals wirklich nicht lang, 
bestehen häufig aus Schleifen. Diese dauern oft sehr lange (zum Teil 
>100 Takte) bis das Ergebnis ansteht.

Ich habe mir z.B. eine Routine geschrieben, die mir eine Linie zwischen 
zwei Punkten zeichnet. Wenn für jeden Punkt 100us benötigt werden, ist 
der Controller ein paar Sekunden beschäftigt, um ein Bild aufzubauen.

Gibt es nun irgendwelche Tricks, Pseudo Kommatstellen oder irgendetwas, 
irgendeine hilfreiche Seite im Internet usw. um das ganze ohne viel 
Rechenleistung (eventuell mit Näherungen usw.) zu lösen ?

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das ist aber eine völlig andere Liga.
Zu Grafikfragen gibt es bestimmt bessere Foren als dieses hier. 
Bilddarstellung ist nun nicht gerade das Spezialgebiet von 
Mikrokontrollern.


Es ging doch um Temperaturmessung und da ist schneller als 1 Sekunde 
unnütz, d.h. Du hast mehr als reichlich Zeit für die 
16-Bit-Berechnungen.


Peter

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.