TWI (I2C) - Lm75 - Atmega8 Funktionsproblem

OP #626306
Lesenswert?

/* 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
Angehängte Dateien:
OP #626432
Lesenswert?

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
Gast #626458
Lesenswert?

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
OP #630752
Lesenswert?

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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren