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
Vielen Dank für die Antwort! kann mir aber jemand sagen was da fehlt??
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)
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.
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?
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.
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
> 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.
Vielen dank an alle!! Heute habe ich eine ganze Menge was dazugelernt!! Nun versuche ich das ganze Theorie in Bascom umzusetzen.
Gibt es in Bascom ein Befel der zwei Byts ZUSAMMENSETZ?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.