Forum: Compiler & IDEs TWI (I2C) - Lm75 - Atmega8 Funktionsproblem


von Nick M. (nickma)


Angehängte Dateien:

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

von Jörg X. (Gast)


Lesenswert?

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

von Nick M. (nickma)


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

von Jörg X. (Gast)


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

von Nick M. (nickma)


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

von Jörg X. (Gast)


Lesenswert?

;)

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.