Forum: Mikrocontroller und Digitale Elektronik LM76 Temperatur wird 10 Grad weniger angezeigt


von Michael B. (q202076)


Lesenswert?

Hallo allerseits,

ich habe ein kleines Problem. Seit Tagen versuche ich, dass mein LCD 
richtige Temperatur anzeigt. Es wird immer 10 Grad weniger angezeigt.
Ich benutze atmega2560, LM76 und Bascom.
Kann mir jemand in dem Bereich helfen?
Hier ist mein Code:


$regfile = "m2560def.dat"                       'Atmega Deklaration
$crystal = 16000000                            'Quarz 16MHz


Config Lcdpin = Pin , Db4 = Porta.7 , Db5 = Porta.5 , Db6 = Porta.3 , _
                       Db7 = Porta.1 , E = Porta.0 , Rs = Porta.2

'Definiert das LCD-Display als 16*4 Anzeige.
Config Lcd = 16 * 4


Config Sda = Portd.1
Config Scl = Portd.0

Const Lm76slavewrite = &H90
Const Lm76slaveread = &H91

Declare Sub Tempfuehler()


Dim Lm76high As Byte
Dim Lm76low As Byte
Dim Temp As Byte


Do

Call Tempfuehler

Cls

Deflcdchar Print , 12 , 18 , 18 , 12 , 32 , 32 , 32 , 32    ' 
°=Grad-Zeichen

Locate 2 , 1
Lcd "Temp.:"
Locate 2 , 8
Lcd Temp                 'Temperaturanzeige
Locate 2 , 11
Lcd Chr(0) ; "C"
'Cursor deaktivieren
Cursor Off

Loop

End

Sub Tempfuehler

   I2cinit
   I2cstart
   I2cwbyte Lm76slavewrite
   I2cstart
   I2cwbyte Lm76slaveread
   I2crbyte Lm76low , Nack
   I2cstop
   Temp = Lm76low        'Wert für Temperaturanzeige
   Wait 2

End Sub

von Arc N. (arc)


Lesenswert?

Da fehlt was in Tempfuehler...
Datenblatt zum LM76 Seite 11

von Michael B. (q202076)


Lesenswert?

Vielen Dank für die Antwort!

kann mir aber jemand sagen was da fehlt??

von Karl H. (kbuchegg)


Lesenswert?

Schon mal ins Datenblatt geschaut?
Die Temperatur wird in 2 Bytes als 13-Bit Zahl übertragen. Du hast ja 
nur die Hälfte geholt. Dir fehlen Bits!

zb
25 Grad sind in Bitschreibweise
   0 0001 1001 0000

Du holst dir nur die ersten 8 Bit

   0 0001 100

und Dezimal ist das 12. Also ungefähr deine 10 Grad zuwenig (Bei anderen 
Zahlen sind es dann ziemlich genau 10 Grad)

von Michael B. (q202076)


Lesenswert?

Erstmal vielen Dank Karl für deine Hilfe! es war sehr hilfreich für 
mich!

nun habe ich mein Unterprogramm etwas gehändert, sodass ich zwei Byte 
Empfangen kann und logisch nachvollziehen, so sieht es momentan aus:
'####################################################################### 
##
Sub Showtemperatur()
   I2cstart                  'Erzeugt eine Startbedingung
   I2cwbyte slaveread        'Sendet ein Byte Slave+RW "&H97 = 
&B10010111"
   I2crbyte Lm76high , Ack   'Emfaengt 1 Byte
   I2crbyte Lm76low , Nack   'Empaengt 2 Byte
   I2cstop                   'Erzeugt eine Stopbedingung
End Sub
'####################################################################### 
#

leider kann ich es rechnerisch nicht nachvollziehen:
wenn ich die Werte von Lm76high und Lm76low auslese kommen dann folgende 
Ergebnisse raus:
bei Lm76high (erste 8 Bit) = 11 was Binär 0000 1011 (laut dem 
Datenblatt) entspricht
bei Lm76low (denke restliche Bits) schwanken die Werte zwischen 136 und 
152 was Binär
136 = 1000 1000 entspricht (laut dem Datenblatt) und
152 = 1001 1000 entspricht (laut dem Datenblatt)
da ich nur max. 13 Bit auslesen kann muss ich die erste 8 Bit mit 5 Bit 
addieren kommt folgendes raus:
0000 1011 1000 1 = 369
0000 1011 1001 1 = 371

Was habe ich falsch gemacht?

Des Weiteren suche ich einen Befehl in Bascom, der eventuell wenn meine 
Gedanken richtig sind Lm76high und Lm76low zusammenverbindet und in eine 
Variable abspeichert.

von Icke (Gast)


Lesenswert?

irgendwas = (high*256)+low

von Christian H. (netzwanze) Benutzerseite


Lesenswert?

Schon mal ins Datenblatt gesehen?
Dort steht drin, wie die 12 bit aufgebaut sind.

Michael Beispiel schrieb:
> da ich nur max. 13 Bit auslesen kann muss ich die erste 8 Bit mit 5 Bit
> addieren kommt folgendes raus:

Was meinst Du mit addieren? Du musst die Bits zusammensetzen. 2x 8bit = 
16bit = High Low

High = 0000 1011
Low  = 1000 1000

High Low = 0000 1011 1000 1000

Laut Datenblatt sind die letzten 4bit die Nachkommastellen (Wert * 
0,0625°C).
Die restlichen 9 bit (also 0 1011 1000) wären in diesem Fall 184°C; plus 
die Nachkommastellen wäre das also 184,5°C. Das kommt mir aber nicht 
korrekt vor.

Was soll denn rauskommen?

von Karl H. (kbuchegg)


Lesenswert?

Christian H. schrieb:
> Schon mal ins Datenblatt gesehen?
> Dort steht drin, wie die 12 bit aufgebaut sind.
>
> Michael Beispiel schrieb:
>> da ich nur max. 13 Bit auslesen kann muss ich die erste 8 Bit mit 5 Bit
>> addieren kommt folgendes raus:
>
> Was meinst Du mit addieren? Du musst die Bits zusammensetzen. 2x 8bit =
> 16bit = High Low
>
> High = 0000 1011
> Low  = 1000 1000
>
> High Low = 0000 1011 1000 1000
>
> Laut Datenblatt sind die letzten 4bit die Nachkommastellen (Wert *
> 0,0625°C).

Nicht ganz.
Laut Datenblatt beginnen die 13 Bit beim HSB. die letzten 3 Bits sind 
also nicht temperaturcodierend.  -> Die 16 Bit, nachdem sie 
zusammengesetzt wurden, um 3 Bit nach rechts schieben und fertig.
Aus

  0000 1011 1000 1000

wird so

  0000 0001 0111 0001

und da sind jetzt die letzten 4 Bits die Nachkommastellen.
Das sind also 10111 = 23 Grad und 0001 = 1*0.0625 Grad. Also proaktisch 
23 Grad und ein paar Zerquetschte.

von Christian H. (netzwanze) Benutzerseite


Lesenswert?

Ach, im Datenblatt steht ja sogar die Aufteilung der Bits im 
I2C-Datentrom.

D15 = Sign
D14..D3 = Bit 11 .. Bit 0
D2..D0  = Status

0000 1011 1000 1000

D15     = 0 (also positive Temperaturen)
D14..D3 = 0001 0111 0001  => 23,0625°C
D2..D0  = Status = Kein Fehler, Keine Grenzwertüberschreitungen

von Karl H. (kbuchegg)


Lesenswert?

> da ich nur max. 13 Bit auslesen kann muss ich die erste 8 Bit mit
> 5 Bit addieren kommt folgendes raus:
> 0000 1011 1000 1 = 369
> 0000 1011 1001 1 = 371
>
> Was habe ich falsch gemacht?

Nichts. Passt doch.
Nur kommen da noch keine Grad raus, sondern die Zahl ist in Einheiten 
von 0.0625 Grad

  369 * 0.0625 = 23.0625 Grad
  371 * 0.0625 = 23.1875 Grad

Im Datenblatt ist das alles doch sooo schön aufgemalt. Schreib deine 
Bits rein und dann dekodierst du sie mit dem Datenblatt.

von Michael B. (q202076)


Lesenswert?

Vielen dank an alle!! Heute habe ich eine ganze Menge was dazugelernt!!

Nun versuche ich das ganze Theorie in Bascom umzusetzen.

von Michael B. (q202076)


Lesenswert?

Gibt es in Bascom ein Befel der zwei Byts ZUSAMMENSETZ?

von Karl H. (kbuchegg)


Lesenswert?


von Stefan B. (stefan) Benutzerseite


Lesenswert?

Michael Beispiel schrieb:
> Gibt es in Bascom ein Befel der zwei Byts ZUSAMMENSETZ?

http://avrhelp.mcselec.com/makeint.htm

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.