Forum: Mikrocontroller und Digitale Elektronik Temperaturmessung mit dem LM75


von Achim S. (achims)


Lesenswert?

Hallo Gemeinde
meine Platine mit dem LM 75 und das Programm dazu laufen seit ein paar 
Tagen Störungsfrei. Habe das Programmm reingestellt. Kannn jeder nutzen. 
Eine Frage bleibt dabei.
Der LM 75 hat den Pin 3. Diesen kann ich als Schaltausgang nutzen. Nach 
dem Datenblatt muss ich Register setzten und Temp eingeben. Leider habe 
ich noch nicht rausbekommen wie das geht.
Kännte mr dabei jemand helfen?
achim

von Gerhard K. (mikros)


Lesenswert?

Im AVR-Praxis Forum hat Dir jemand das Datenblatt verlinkt.
Steht da nicht drinnen was Du suchst?

von Falk B. (falk)


Lesenswert?

@ Gerhard K. (mikros)

>Im AVR-Praxis Forum hat Dir jemand das Datenblatt verlinkt.
>Steht da nicht drinnen was Du suchst?

Sicher steht es dort drin, er versteht es aber nicht. Darum fragt er.

von achim (Gast)


Lesenswert?

Ja Falk, so ist es, verstehe es nicht.
Ja und ich traue mich danach zu fragen.
Warum, darf man nicht fragen, wenn man was nicht versteht?
Arbeite das Datenblatt, Seite 5, 9, 10, 11 durch, und hoffe was zu 
begreiffen.
achim

von Falk B. (falk)


Lesenswert?

@achim (Gast)

>Ja Falk, so ist es, verstehe es nicht.
>Ja und ich traue mich danach zu fragen.
>Warum, darf man nicht fragen, wenn man was nicht versteht?

Natürlich darf man das, das ist ja der Sinn eines Forums.

>Arbeite das Datenblatt, Seite 5, 9, 10, 11 durch, und hoffe was zu
>begreiffen.

Ist nicht so schwer. Der IC hat 5 Register. Das zentrale ist das 
Pointerregister. Dort wird eingestellt, in welchem Register ein Lese- 
oder Schreibzugriff landet.
In dem Rigister sind nur die beiden untersten Bits benutzt, um eben die 
vier anderen Register auszuwählen.
Hier mal als Super-Crashkurs

Pointer Register setzen

START
Adressbyte vom LM75 + R/W Bit =0 (Schreibzugriff)
Pointerbyte
STOP

Jetzt kann man das ausgewählte Register lesen.

Configurationsregister lesen

START
Adressbyte vom LM75 + R/W Bit =1 (Lesezugriff)
1 Byte lesen, NACK senden
STOP

Temperatur/Thys/Tos Register lesen

START
Adressbyte vom LM75 + R/W Bit =1 (Lesezugriff)
1 Byte lesen (MSB), ACK senden
1 Byte lesen (LSB),NACK senden
STOP

Beim Schreiben eines Registers muss als erstes das Pointerregister 
angegeben werden, danach die Daten das Zielregisters.

Configurationsregister schreiben

START
Adressbyte vom LM75 + R/W Bit =0 (Schreibzugriff)
Pointerregister schreiben
Configurationstregister schreiben
STOP

Temperatur/Thys/Tos Register schreiben

START
Adressbyte vom LM75 + R/W Bit =0 (Schreibzugriff)
Pointerregister schreiben
MSB schreiben
LSB schreiben
STOP

von Achim S. (achims)


Lesenswert?

Hallo Falk
danke für deinen Crashkurs. Versuche die fehlenden Teile zu ergänzen.
Es gibt 4 Register:

- Ist Temp 16 Bit nur lesen - lesen der Temp die wir messen
- obere Temp schwelle 16 Bit - Vorgabe des oberen Punktes
- untere Temp Schwelle 16 Bit - Vorgabe des unteren Punktes
- Config 8 Bit - ???

Als erstes die Kommunikation starten:
1
mess = i2c_start (0x91);   // start des Lesens
2
if (mess == 0)
3
  {
4
    msb_temp=i2c_readAck();
5
    lsb_temp=i2c_readNak();
6
    ......
7
  }
8
else   // Rückgabe 1 - keine Kommunilation
9
  {
10
    // Ausgabe LM75 nicht ok
11
  }
Soweit ist es noch kein Problem. So könnte es sein:
1
i2c_start(0x90);
2
i2c_write();
3
msb_temp=i2c_writeAck(0x1B);   // Schaltschwelle oben 26 Grad
4
lsb_temp=i2c_writeNak(0x18);   // Schaltschwelle unten 24 grad
5
i2c_stop();
Mein erster Versuch zum schreiben. Bitte etwas Nachsicht
achim

von Gunnar (Gast)


Angehängte Dateien:

Lesenswert?

Achim Seeger schrieb:
> Config 8 Bit - ???
siehe Datenblatt S. 6

Bit 0 (LSB) = 1 Stromsparmodus (shut down)
Bit 1       = 0 Komperator, = 1 Interupt
Bit 2       Polarität der Alert-Ausgangs
Bit 3 und
Bit 4       Anzahl der Fehler (1/2/4/6) bis Alarm ausgelöst wird
Bit 5 und
Bit 6       Auflösung der Temperaturmessung (9/10/11/12 Bits)
Bit 7       Einzelmessung starten

Du wählst aus, was wie gehen soll, setzt die entsprechenden Bits und ab 
geht die Post...
Wo ist jetzt das Problem?

VG

von Falk B. (falk)


Lesenswert?

@Achim Seeger (achims)

>- Ist Temp 16 Bit nur lesen - lesen der Temp die wir messen
>- obere Temp schwelle 16 Bit - Vorgabe des oberen Punktes
>- untere Temp Schwelle 16 Bit - Vorgabe des unteren Punktes
>- Config 8 Bit - ???

Ja.
1
mess = i2c_start (0x91);   // start des Lesens
2
if (mess == 0)
3
  {
4
    msb_temp=i2c_readAck();
5
    lsb_temp=i2c_readNak();
6
    ......
7
  }
8
else   // Rückgabe 1 - keine Kommunilation
9
  {
10
    // Ausgabe LM75 nicht ok
11
  }

Passt noch nicht. Du musst vorher das Pointerregister schreiben.
1
i2c_start(0x90);
2
i2c_write();
3
msb_temp=i2c_writeAck(0x1B);   // Schaltschwelle oben 26 Grad
4
lsb_temp=i2c_writeNak(0x18);   // Schaltschwelle unten 24 grad
5
i2c_stop();

Beim Schreiben gibt es kein ACK/NACK, das macht der EMpfänger.
Was für I2C Funktionen nutzt du REAL? Die von Peter Fleury, die gleichen 
welche du auch für das LCD benutzt?
Dort gibt es

i2c_stop(void)
unsigned char i2c_start(unsigned char addr);
unsigned char i2c_write(unsigned char data);
unsigned char i2c_readAck(void);
unsigned char i2c_readNak(void);
1
// Obere Schaltschwelle schreiben
2
i2c_start(0x90);  // LM75 I2C Adresse
3
i2c_write(0x03);  // Pointerregister, T_OS 
4
i2c_write(msb);
5
i2c_write(lsb); 
6
i2c_stop();
7
8
9
// Untere Schaltschwelle schreiben
10
i2c_start(0x90);  // LM75 I2C Adresse
11
i2c_write(0x02);  // Pointerregister, T_HY 
12
i2c_write(msb);
13
i2c_write(lsb); 
14
i2c_stop();
15
16
17
// Config schreiben
18
i2c_start(0x90);  // LM75 I2C Adresse
19
i2c_write(0x01);  // Pointerregister, Config
20
i2c_write(config);
21
i2c_stop();
22
23
// Temperatur lesen
24
i2c_start(0x90);  // LM75 I2C Adresse
25
i2c_write(0x00);  // Temperaturregister 
26
i2c_stop();
27
i2c_start(0x91);  // LM75 I2C Adresse
28
msb = i2c_readAck();
29
lsb = i2c_readNak();
30
i2c_stop();

Mehr braucht man praktisch nicht. Die Kodierung der Temperatur ist in 
allen drei Temperaturregistern gleich (untere 7 Bits unbenutzt, dann 9 
Bits mit 0,5°C Auflösung)

>Mein erster Versuch zum schreiben. Bitte etwas Nachsicht

Ich versuchs [seufz]

von Achim (Gast)


Lesenswert?

Hallo Gunnar
ist das der selbe IC wie der LM75 bzw. gilt das gleiche?

Hallo Falk
Es sind leichte Erhellungen am Horizont sichtbar. Auch wenn es dir 
persönlich schwerfällt, ein bischen Nachsicht zu üben, danke ich dir für 
dein Verständnis. Ja, ich nutze das von Peter. Da sind mitlerweile so 
viele Änderungen drin, das es nicht lohnt noch mal was zu machen. Bin 
nicht auf die Idee gekommen, das dort was drin steht und man verwenden 
kann.

> i2c_start(0x90);  // LM75 I2C Adresse

> i2c_write(0x03);  // Pointerregister, T_OS - oberer Punkt
> i2c_write(0x02);  // Pointerregister, T_HY - unterer Punkt
> i2c_write(0x01);  // Pointerregister, Config
> i2c_write(0x00);  // Temperaturregister - nur lesen

Wenn ich das jetzt richtig verstehe:
- Adresse des LM75
dann die Pointeradressen der einzenen Register mit der Nutzung
Weiter schreibst du:

> // Untere Schaltschwelle schreiben
> i2c_start(0x90);  // LM75 I2C Adresse
> i2c_write(0x02);  // Pointerregister, T_HY
> i2c_write(msb);
> i2c_write(lsb);
> i2c_stop();

Damit setze ich die Werte für den oberen und unteren Schaltpunkt mit msb 
und lsb jeweils getrennt. msb und lsb muss ich vorher angeben.
Wenn ich z.B. den Wert von 0x1b nehme, wie setze ich den in msb und lsb?
Da ich z.B. 0x1b nehme, kommt das in den unteren?

Wenn ich den Ablauf des Prg nehme erfolgt z.B.:

- Abfrage ob LM75 vorhanden ist - sonst Fehlerausgabe
- Abfrage der aktuellen Temp - mit Anzeige der Temp
- setzen des Pointer auf obere Schaltschwelle und übertragung der Werte
- setzen des Pointer auf untere Schaltschwelle und übertragen des Werte
- Ausgang auf Pin 3 schaltet innerhalb der definierten Werte
- setzen des Pointer auf Temp auslesen und Kontrolle des aktuellen 
wertes und damit Kontrolle des Pins 3 und Ausganges
- Bei Spannungsverlust oder Ausschalten gehen die Daten im LM 75 
verloren und alles neu machen. Bei anstehender Spannung bleiben die 
Werte im LM75. übergabe der werte muss nur einmal beim start erfolgen.

Das Pointerregister zeigt an, auf welches register der Zeiger steht?
Wenn das so ist, muss ich vor dem lesen oder schreiben eines anderen 
Wertes jedes mal den Pointer ändern?

Gilt das auch für andere ICs? Vielleicht nur andere register oder Namen?
achim

von Falk B. (falk)


Lesenswert?

@ Achim (Gast)

>ist das der selbe IC wie der LM75 bzw. gilt das gleiche?

Es ist kompatibel, er kann ein klein wenig mehr.

>dein Verständnis. Ja, ich nutze das von Peter.

Gut.

> Da sind mitlerweile so
>viele Änderungen drin, das es nicht lohnt noch mal was zu machen.

Was meinst du damit? An der Software für den I2C Zugriff musst du rein 
GAR NICHTS ändern! Die ist gut so wie sie ist! Jegliche Software, sei es 
für das LCD ("meine" Lib) oder für den LM75 liegt eine Ebene höher und 
greift auf diefertigen, UNVERÄNDERTEN Funktion für den I2C Zugriff zu.

>Bin
>nicht auf die Idee gekommen, das dort was drin steht und man verwenden
>kann.

OMG!

>> i2c_start(0x90);  // LM75 I2C Adresse

>> i2c_write(0x03);  // Pointerregister, T_OS - oberer Punkt
>> i2c_write(0x02);  // Pointerregister, T_HY - unterer Punkt
>> i2c_write(0x01);  // Pointerregister, Config
>> i2c_write(0x00);  // Temperaturregister - nur lesen

Wo bitte hast du DIESE Zeilen her? Die stehen NIRGENDWO im Thread.
Ach so, du hast die einzelnen Zeilen rauskopiert. Ab SO ergeben sie 
keinen Sinn!

>Wenn ich das jetzt richtig verstehe:
>- Adresse des LM75
>dann die Pointeradressen der einzenen Register mit der Nutzung

Ja.

Weiter schreibst du:

>> // Untere Schaltschwelle schreiben
>> i2c_start(0x90);  // LM75 I2C Adresse
>> i2c_write(0x02);  // Pointerregister, T_HY
>> i2c_write(msb);
>> i2c_write(lsb);
>> i2c_stop();

>Damit setze ich die Werte für den oberen und unteren Schaltpunkt

NEIN! DIESER Ausschnitt setzt nur die UNTERE Schaltschwelle! DAS STEHT 
DOCH DA! Mensch Meier! Wenn du dich mit sowas wie 
Computer/Mikrokontrollerprogrammierung beschäftigen willst, MUSST du 
dich auch mal KLAR UND DEUTLICH ausdrücken und nicht solche unscharfen 
Formulierungen benutzen. Sagte ich bereits mehrfach.

> mit msb
>und lsb jeweils getrennt.

Ja.

> msb und lsb muss ich vorher angeben.

Ja, die musst du aus dem 16 Bit Wert ableiten. Das ist mal eine Aufgabe 
für dich.

>Wenn ich z.B. den Wert von 0x1b nehme, wie setze ich den in msb und lsb?
>Da ich z.B. 0x1b nehme, kommt das in den unteren?

Hier sind wir wieder bei der klaren Kommunikation, an welcher du 
DRINGEND arbeiten musst. Was soll 0x1b sein? Apfelstückchen? Kilogamm? 
Grad Celsius? Ahhh, nehmen wir an Grad Celsius. 0x1b = 27 (°C). Ok. Aber 
"dummerweise" ist die Temperatur in den Registern etwas anders kodiert. 
Schrieb ich bereits.

"Die Kodierung der Temperatur ist in
allen drei Temperaturregistern gleich (untere 7 Bits unbenutzt, dann 9
Bits mit 0,5°C Auflösung)"

Ok, pädagogisch nicht wertvoll, hier die Lösung. Wenn man nur mit ganzen 
Grad Auflösung arbeitet, ist es trivial!

1
int16_t t_hy;    // VORZEICHENBEHAFTET!
2
t_hy = 27;    // als Beispiel, 27°C
3
lsb = 0;        
4
msb = t_hy;

Wenn man die volle Auflösung des LM75 (0,5 Grad) nutzen will, dann so. 
Dabei wird aber die Temperatur immer in 0,5 °C Schritten angegeben, 
siehe Festkommaarithmetik!

1
int16_t t_hy;     // VORZEICHENBEHAFTET!
2
t_hy = 54;       // als Beispiel, 27°C, 0,5Grad Schritte!
3
lsb = t_hy << 7; // untere 7 Bit sind leer
4
msb = t_hy >> 1;

>- Abfrage ob LM75 vorhanden ist - sonst Fehlerausgabe
>- Abfrage der aktuellen Temp - mit Anzeige der Temp
>- setzen des Pointer auf obere Schaltschwelle und übertragung der Werte
>- setzen des Pointer auf untere Schaltschwelle und übertragen des Werte
>- Ausgang auf Pin 3 schaltet innerhalb der definierten Werte
>- setzen des Pointer auf Temp auslesen und Kontrolle des aktuellen
>wertes und damit Kontrolle des Pins 3 und Ausganges
>- Bei Spannungsverlust oder Ausschalten gehen die Daten im LM 75
>verloren und alles neu machen. Bei anstehender Spannung bleiben die
>Werte im LM75. übergabe der werte muss nur einmal beim start erfolgen.

Passt!

>Das Pointerregister zeigt an, auf welches register der Zeiger steht?

Ja. Nomen est Omen!

>Wenn das so ist, muss ich vor dem lesen oder schreiben eines anderen
>Wertes jedes mal den Pointer ändern?

GENAU!
Ich hab noch Hoffnung, dass auch du es irgendwann mal verstehst!

>Gilt das auch für andere ICs?

Kann man so allgemein nicht sagen. Es gibt sicher viele ICs, die ähnlich 
funktionieren.

von Achim (Gast)


Lesenswert?

Hallo Falk
diese Adressen habe ich rauskopiert, aber nur zu meinem Verständnis
und das ich nichts verwechsle

>>> i2c_start(0x90);  // LM75 I2C Adresse
>
>>> i2c_write(0x03);  // Pointerregister, T_OS - oberer Punkt
>>> i2c_write(0x02);  // Pointerregister, T_HY - unterer Punkt
>>> i2c_write(0x01);  // Pointerregister, Config
>>> i2c_write(0x00);  // Temperaturregister - nur lesen
>
> Wo bitte hast du DIESE Zeilen her? Die stehen NIRGENDWO im Thread.
> Ach so, du hast die einzelnen Zeilen rauskopiert. Ab SO ergeben sie
> keinen Sinn!

Peter seine Sachen laufen ohne Probleme. Habe die main angepasst und 
meine Einstellungen drin. Da nutze ich immer das selbe.
Bei den Schaltschwellen habe ich einfach die Einstellung gemeint.
Die codierung der Temp werte steht im Datenblatt drin. Diese meinst du.
Auf die Festkommaarithmetik werde ich mich gleich stürzen und noch mal 
alles unter diesem Aspekt nachlesen.
An sonsten habe ich den leichten Eindruck, das sich die Anzahl deiner 
Zustimmungen leicht erhöht hat.
Komme leider erst heute abend an meinen eigenen Rechner und werde es 
machen. Das Programm stelle ich hier rein. Suchen bestimmt auch andere 
was dazu. Egal, danke dir für deine konstuktive Schelte und Hilfe
achim

von Falk B. (falk)


Lesenswert?

@ Achim (Gast)

>Peter seine Sachen laufen ohne Probleme. Habe die main angepasst und
>meine Einstellungen drin.

Das solltest du das auch GENAU SO SAGEN!

"Ja, ich nutze das von Peter. Da sind mitlerweile so
viele Änderungen drin, das es nicht lohnt noch mal was zu machen."

Das versteht jeder so, dass du die I2C Routinen von Peter verändert 
hast. Das ist aber eben nicht so! -> Massives Missverständnis!

>Da nutze ich immer das selbe.
>Bei den Schaltschwellen habe ich einfach die Einstellung gemeint.

Was du MEINST musst du auch so ausdrücken!

von Karl H. (kbuchegg)


Lesenswert?

Achim schrieb:

> Peter seine Sachen laufen ohne Probleme. Habe die main angepasst ...


Ähm.
Die main() von Peter ist einfach nur eine Demo, die praktisch zeigen 
soll, wie man die Funktionen benutzt. Mehr nicht.

Wenn du selbst ein Programm schreibst, dann rate ich dir dringend, dich 
nicht an der Demo zu vergreifen sondern dein eigenes Projekt 
aufuzusetzen, die I2C Funktionen vom Peter (und nur die I2C Funktionen) 
in das Projekt zu kopieren und dann dein eigens main() zu schreiben.

Und zwar jedes mal, wenn du wieder was neues ausprobierst. Sei es eine 
neuer Test vom LCD, sei es ein anderer IC, den du über I2C ansprichts, 
sei es ....

Selbst wenn das nur zu Testzwecken ist, weil du einfach nur ausprobieren 
willst, wie das funktioniert. Fang jeweils ein neues Projekt an. 
Irgendwann wirst du froh sein, wenn du auf einen Ordner mit von dir 
geschriebenen Testprojekten zurückgreifen kannst, in dem es um einen 
bestimmten Themenkreis geht und du dir nicht erst aus einem Wust von 
auskommentierten und schon lange nicht mehr gültigen Programmzeilen 
kämpfen musst um zu sehen, wie du das damals gemacht hast.

Und so wie das aussieht, kannst du die Übung, die du dabei automatisch 
kriegst, mehr als gut gebrauchen.

von Achim (Gast)


Lesenswert?

Hallo Karl Heinz
eigentlich mache ich es so wie du es schreibst. In der main habe ich 
feste Sachen drin, z.B. CPU frequenz, I2C Adressen. diese Sachen werden 
von verschiednen Teilen und/oder Datein gebraucht. Hat den Vorteil, nur 
eine Einstellung und übersicht über alle verwendeten Adressen. Ich 
möchte nicht in jedem Teil was einstellen müssen. Damit kommt man 
schnell durcheinander. Jedes neue Projekt oder IC zum testen kommt in 
eigenen Ordner mit allen notwendigen Unterdatein und Datenblättern. Es 
wird nichts vermischt und dort oder anders geändert. I2c Datein werden 
nicht verändert. Notiere mir die Hinweise von dir ( z.B. Entprellung 
oder von Falk) dazu, schreibe mir teilweise extra Sachen auf oder 
kommentiere es grosszügig oder sogar ein Tut dazu. Damit kann man auch 
in einem Jahr noch viel nachvollziehen.
Hat einen Vorteil für mich, ich kann von anderen Projekten Teile nutzen 
und von dem gelernten weitermachen. Eure Technik werde ich nie 
erreichen. Bemühe mich aber jeden tag, lerne gern dazu und frage (nerve) 
dazu.
Hoffe auch anderen helfen zu können. Bin halt neugierig
Du hast mir schon mehr als einaml geholfen (Entprellung, Multitasking)
und habe viel gelernt. Danke
achim

von Achim S. (achims)


Lesenswert?

Sorry, Falk
muss noch mal was fragen
Die Register 0x03 und 0x04 haben R/W nach Datenblatt. Danach kann ich 
die Daten schreiben und anschlessend auslesen und kontrollieren. Bin ich 
da richtig?
achim

von Karl H. (kbuchegg)


Lesenswert?

Achim Seeger schrieb:
> Sorry, Falk
> muss noch mal was fragen
> Die Register 0x03 und 0x04 haben R/W nach Datenblatt. Danach kann ich
> die Daten schreiben und anschlessend auslesen und kontrollieren. Bin ich
> da richtig?

Die kurze Antwort: ja

Die lange Antwort: Warum so ungläubig. Es ist ja wohl ziemlich normal, 
dass man alle Konfigurationsdaten (im weitesten Sinne), die man in einen 
IC schreiben kann, auch von ihm wieder auslesen kann. Zumal das ja im 
Grunde für die Designer einfacher ist, als wenn sie Zusatzlogik brauchen 
um das Lesen aus bestimmten Registern zu verhindern und statt dessen 
einen Standardwert auf den Weg bringen, wenn es doch versucht wird. Die 
Information muss ja sowieso irgendwie im IC gespeichert werden. Also 
warum soll man die nicht mehr auslesen können.

: Bearbeitet durch User
von Falk B. (falk)


Lesenswert?

Ja.

von Achim S. (achims)


Lesenswert?

Ist eine einfache Sache für mich. Lerne mit dem IC umzugehen und das 
beschreiben von Registern und es schult ungemein. Danke für die Antwort
achim

von Achim S. (achims)


Lesenswert?

Hallo Falk
es läuft korrekt !!! Habe es in den Griff bekommen. Einschalten bei 26 
Grad, ausschalten bei 24 Grad. Auf der Anzeige kann dabei die Temp 
amgesehen werden die aktuell ist. Danke soweit. Programm aufräumen dann 
kann es ins Netz für alle. Danke
achim

von Falk B. (falk)


Lesenswert?

Herzlichen Glühstrumpf!

von Achim S. (achims)


Lesenswert?

Danke für deine Anteilnahme. Der Weg ist das Ziel, oder so.
bis morgen, um 4:00 ist die Nacht zu ende
achim

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.