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
@ 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.
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
@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
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
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
@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]
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
@ 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_tt_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_tt_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.
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
@ 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!
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.
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
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
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.
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