/* Settings Atmega8 @ Internal RC Oszillator 4Mhz @STK500 UART Übertragung OK LM75 Adresse = 0b1001000 */ Hallo, Ich komme nicht ganz mit dem I²C bus zurecht. Ich möchte den Temperatursensor LM75 auslesen. (Versuche da jetzt seit zwei Tagen herum :-/ ) Ich bekomme aber immer nur Werte zurück wie: 95 (0b1011111) oder 127 (0b1111111) manchmal auch 255 (0b11111111). Kann sich bitte mal jemand einmal den C-Code (Anhang -> TWI_lm75.c) zu Gemüte ziehen? (Könnte leicht sein, dass auch nur die Adressen nicht passen? Bin Ratlos.) Eine Skizze meines Schaltplans liegt auch als PDF bei. Danke vorab! Greez, Nick
Ich verweise dich mal dahin: Beitrag "LM75 am Atmel 128 mit TWI_Master" Da hab ich das Format des Sensorwerts erklärt ;) hth. Jörg
Hallo, danke für die rasche Antwort. Du meinst die Division durch 2 im positiven Bereich? Ich teste das, sobald ich daheim bin. Denke aber dass grundlegend etwas nicht passt. Der Sensor sollte Zimmertemperatur zurück geben. Stimmt diese Passage:
1 | void lm75_read(void) |
2 | {
|
3 | i2c_send_stop(); |
4 | i2c_send_start(0x91); //Hier kommt die Adresse vom Temp Sensor |
5 | temp.high = i2c_read(0x90,ACK); |
6 | temp.low = i2c_read(0x90, NACK); |
7 | i2c_send_stop(); |
8 | }
|
die sich nämlich von den Adressen her zu der von Gerhard. (Beitrag "LM75 am Atmel 128 mit TWI_Master") unterscheidet (Pointer im Temp.Register setzte ich nämlich auch keinen)
1 | i2c_start(); // |
2 | i2c_write(0x90); // Screib Mode ist aktiv |
3 | i2c_write(0x00); // Das Pointer register ist auf Temperatur |
4 | register gerichtet |
5 | i2c_start(); // |
6 | i2c_write(0x91); // Lese Modus eingestellt |
7 | value.tmp_in[1]=i2c_read(); // Lese MSB mit ACK |
8 | value.tmp_in[0]=i2c_read(0); // Lese LSB mit NACK |
9 | i2c_stop(); |
Grüße Nick
0x00 ist der Start-Up Wert des Pointerregisters, es sollte also auch so gehen. Aber der Sensor braucht bis zu 300ms um die Temperatur zu messen, vielleicht hilft einfach mal abwarten: > The LM75 can be accessed at any time and reading the Temperature Register > will yield result from the last temperature conversion. When the LM75 is > accessed, the conversion that is in process will be interrupted and it will > be restarted after the end of the communication. Accessing the LM75 > continuously without waiting at least one conversion time between > communications will prevent the device from updating the Temperature > Register with a new temperature conversion result. Consequently, the LM75 > should not be accessed continuously with a wait time of less than 300 ms (eine Fußnote aus dem Datasheet) hth. Jörg
Hallo, es hat sich gelöst. FEHLER:
1 | temp.low >>= 1; |
2 | temp.high <<= 7; |
3 | ganzzahl= temp.low | temp.high; |
Die Werte wurden schon richtig übertragen und stehen richtig in der Struct "temp". Danke Jörg an dieser Stelle, war wie von dir gesagt nur ein Rechenfehler. Greez Nick
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.