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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.