Guten Tag zusammen,
ich benutze den LM75A und versuche mit Hilfe des Atmega 32 einen
negativen Temperaturwert auszugeben auf einem LCD Display. Doch leider
befindet sich in der negativen Berechnung ein Fehler, welchen ich nicht
finde.
Die positive Temperaturmessung funktioniert.
Hat jemand eine Idee warum es nicht klappt? Lauf dem Datenblatt muss ich
für negative Werte das Zweierkomplement anwenden und dieses Wert mit
0,125 multiplizieren. Doch bei -1 Grad Celsius wird mir sofort -7937.000
Grad auf dem LCD Display angezeigt.
Vielen Dank im Vorraus!
Der LM75 liefert ein 9-Bit Ergebnis im 2er-Komplement. Nur bezieht sich
das "2er-Komplement" auf dieses 9-Bit Ergebnis, nicht auf eine
16-Bit-Zahl. Man muss also nach dem Bilden des 2er-Komplements die nicht
vorhandenen 7 oberen Bits ausmaskieren.
Aber warum überhaupt so kompliziert? Wenn man das 9-Bit Ergebnis
*LINKS*bündig als signed int interpretiert und dann nach float
umwandelt, geht das doch alles automatisch ...
Die ganze Fallunterscheidung ist höchst überflüssig.
Das #define F_CPU 8000000 gehört in das Makefile.
Und hier fehlt eine Klammer auf "{" nach while:
int main(void)
{
while (1)
/****Reading in values of temp register LM75 I²C ***/
lcd_init();
A. B. schrieb:> Der LM75 liefert ein 9-Bit Ergebnis im 2er-Komplement. Nur bezieht sich> das "2er-Komplement" auf dieses 9-Bit Ergebnis, nicht auf eine> 16-Bit-Zahl. Man muss also nach dem Bilden des 2er-Komplements die nicht> vorhandenen 7 oberen Bits ausmaskieren.>
ich benötige die 11-Bit-Zahl, da ich die negativen Werte auch mit der
Nachkommazahl angeben möchte. Wie genau kann ich denn die oberen Bits
ausmaskieren, dass diese nicht mit in die "Berechnung" fallen?
Pete K. schrieb:> Das #define F_CPU 8000000 gehört in das Makefile.>> Und hier fehlt eine Klammer auf "{" nach while:> int main(void)> {>> while (1)> /****Reading in values of temp register LM75 I²C ***/>>> lcd_init();
Habe beim Einfügen des Textes die Kommentare gelöscht. Habe wohl die von
dir erwähnte Klammer beim löschen erwischt!
Aber danke!
@ D. R. (misterdimi1992)
>> Der LM75 liefert ein 9-Bit Ergebnis im 2er-Komplement. Nur bezieht sich>> das "2er-Komplement" auf dieses 9-Bit Ergebnis, nicht auf eine>> 16-Bit-Zahl. Man muss also nach dem Bilden des 2er-Komplements die nicht>> vorhandenen 7 oberen Bits ausmaskieren.
Jain, er muss vorzeichenrichtig erweitern, bzw. schieben.
>ich benötige die 11-Bit-Zahl, da ich die negativen Werte auch mit der>Nachkommazahl angeben möchte. Wie genau kann ich denn die oberen Bits>ausmaskieren, dass diese nicht mit in die "Berechnung" fallen?
Du musst eine vorzeichenbehaftete Zahl zur Speicherung nutzen. Dann kann
man auch ohne Hackertricks und kryptische Auswertung damit arbeiten. Und
mit etwa Know How kann man auch Fließkommazahlen verzichten und mit
einfacher Festkommaarithmetik arbeiten.
1
#include <avr/io.h>
2
#define F_CPU 8000000
3
#include <util/delay.h>
4
#include "lcd-routines.h"
5
#include "i2cmaster.h"
6
7
uint8_tMSByte_LM75,LSByte_LM75;
8
int16_ttempdata;
9
charcBuffer_LM75[16];
10
chartemp_min[16],temp_max[16];
11
12
intmain(void){
13
14
i2c_init();
15
lcd_init();
16
17
while(1){
18
/****Reading in values of temp register LM75 I²C ***/
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