PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Minusgrade beim LM75



Bratwurst
18.02.2006, 12:11
Guten Morgen =)

Ich habe mir hier mit einem LM75 einem ATMega8 und einem Display versucht ein einfaches Thermometer aufzubauen. Dazu habe ich mir den folgenden Code zusammengeschnipselt:



I2cinit
Start:
Showtemperatur
Wait 142
Goto Start


Sub Showtemperatur()
I2cstart
I2cwbyte Lm75slaveread
I2crbyte Lm75high , Ack
I2crbyte Lm75low , Nack
I2cstop


If Lm75high > 127 Then
Temperatur = Lm75high And 127
Temperatur = Not Temperatur
Incr Temperatur
Else
Temperatur = Lm75high
End If
Lm75low = Lm75low And 128
If Lm75low > 0 Then
Nachkommastelle = ",5"
Else
Nachkommastelle = ",0"
End If

Locate 1 , 1
Lcd "Temp.:" ;
Locate 2 , 1
Lcd Temperatur ; Nachkommastelle ; Chr(0) ;


wenn dabei jedoch die Temperatur unter 0°C sinkt, zeigt mir das Display immer -127Grad an ?! Ich hab das schon x-mal versucht nachzuvollziehen oder es zu ändern... war aber leider nicht von Erfolg gekrönt 8-[

kann mich da villeicht jemand auf den entscheidenden Fehler hinweisen ?

vielen Dank schon einmal
mfG
Paul

Ratber
27.02.2006, 02:32
Ja,das kann ich.
Das ist nur ne Sache mit "Den Wald vor lauter Bäumen......"

Schau erstmal ins Datenblatt auf "Figure 2" wie die negativen Temperaturen dargestellt werden und dann schau auf deine Berechnung dann müßte dir der Denkfehler schon rektal ins Gesicht springen. :D

PS:
Es ist enorm Hilfreich die Eckwerte für Positiv,Negativ und einige Abschnitte Binär und Dezimal aufzuschreiben dann hat man das System leichter im Griff.

PicNick
27.02.2006, 09:06
Guck er da,
https://www.roboternetz.de/wissen/index.php/Sensorarten#Programm-Beispiel_f.C3.BCr_LM75

Bratwurst
01.03.2006, 20:23
So, jetzt habe ich es hinbekommen, wobei ich sagen muss, dass ich nicht genau verstanden habe warum \:D/

Also Minusgrade werden dann übermittelt wenn das letzte Bit im Highbyte (also Bit 7) = 1 ist oder ?
Und 0,5 werden dann nochmal dazugezählt wenn Bit 7 im LowByte = 1 ist ?

Wenn das so richtig ist habe ich aber immernoch nicht verstanden warum mit diesesn Operatoren "and" das Ganze nochmal invertiert wird ?!
Tut mir leid wenn ich mich schrecklich blöd anstellen sollte aber irgendwie habe ich da einen riesen Knoten im Hirn =)

Hier ist noch mein Code, für den Fall es juckt jemand in den Fingern mir zu zeigen warum man mit so einem winzigen Code so viel Speicher verbraten kann... Ich bin gerne bereit zu lernen.



$regfile = "M8def.dat"
$crystal = 4000000
$baud = 9600


Declare Sub Showtemperatur()


Const Lm75slaveread = &B10010001
Dim Lm75high As Byte
Dim Lm75low As Byte
Dim Temperatur As Integer
Dim Nachkommastelle As String * 2
Dim Eeadr As Byte
Dim Temp As Integer
Dim Speicher As Single
Dim Tempsing As Single
Dim Anzeige As String * 5

Config Sda = Portc.4
Config Scl = Portc.5

Config Lcd = 16 * 1a
Config Lcdpin = Pin , Db4 = Portb.0 , Db5 = Portd.7 , Db6 = Portd.6 , Db7 = Portd.5 , E = Portb.2 , Rs = Portb.1

Deflcdchar 0 , 28 , 20 , 28 , 32 , 32 , 32 , 32 , 32
Cls
Cursor Off

I2cinit


Do

Showtemperatur
Waitms 200
Loop



Sub Showtemperatur()
I2cstart
I2cwbyte Lm75slaveread
I2crbyte Lm75high , Ack
I2crbyte Lm75low , Nack
I2cstop


If Lm75high > 127 Then
Temperatur = Makeint(lm75high , &HFF)
Else
Temperatur = Lm75high
End If

Lm75low = Lm75low And 128

If Lm75low > 0 Then
Nachkommastelle = ".5"
Else
Nachkommastelle = ".0"
End If

Speicher = Temperatur
Tempsing = Val(nachkommastelle)
Speicher = Speicher + Tempsing
Anzeige = Fusing(speicher , " ##.&")

'Print Tempsing ; "-_-" ;

Locate 1 , 1
Lcd "Temp.:" ;

Locate 2 , 1
Lcd Fusing(speicher , " ##.&") ; Chr(0) ;

End Sub

O:)
Ich hoffe ihr könnt jetzt noch gut schlafen
MfG Paul

Ratber
01.03.2006, 20:31
Wenn das so richtig ist habe ich aber immernoch nicht verstanden warum mit diesesn Operatoren "and" das Ganze nochmal invertiert wird ?!
Tut mir leid wenn ich mich schrecklich blöd anstellen sollte aber irgendwie habe ich da einen riesen Knoten im Hirn =)

Ich sagte ja schon das du dir mal die Ausgabe genauer anschaust um es zu verstehen :wink:

Mach einfach mal so wie ich sagte.
Kostet nur etwas Zeit.

PicNick
01.03.2006, 20:52
dim singval as single
dim Ival as integer
dim Msb as byte
dim Lsb as byte
.....
.....
I2crbyte Msb , Ack
I2crbyte Lsb , Nack
I2cstop
If Msb.7 = 1 Then
Ival = Makeint(msb , &HFF) ' auffüllen mit den Vorzeichen bits
Else
Ival = Makeint(msb , &H00) ' positiv, also bleibt es so
End If
singval = Ival
If Lsb.7 = 1 Then
singval = singval + 0.5
End If
End if

Fusen und displayen kannst du selbst.