Zur Übersicht - INFO - Neueste 50 Beiträge - Neuer Beitrag - Suchen - Zum C-Control-I-Forum - Zum C-Control-II-Forum

Re: LM75 Temperatur auslesen Kategorie: Programmierung C (von Thomas - 8.03.2010 19:21)
Als Antwort auf LM75 Temperatur auslesen von Pk3 - 15.02.2010 10:03
Ich nutze:
C-Control Pro Mega128, CC-Pro 128 Application Board
Hallo Pk3,
ich habe es folgenderma├čen gel├Âst:

/*********************************************************************************
 * Libary zum auslesen eines LM75-Temperatursensor
 * Die Adresse des Sensors am I2C-Bus wird beim aufruf der Libary
 * in den klammern angegeben und der R├╝ckgabewert(Temperatur in Celsius)
 * wird in der vorangestellten Variable gespeichert. Diese muss vom
 * Typ Float/Single sein. Beispiel in Basic:
 *
 *----------------------------------------
 * Sub Read
 *  Dim Grad As Single
 *  Dim Adresse As Byte
 *  Adresse=0x91
 *  Grad=LM75_Read(Adresse)
 * End Sub
 * ---------------------------------------
 *
 * Temperaturwert befindet sich in  2-Byte Register an folgenden Stellen:
 *               _________________________________________________
 * Temp-Register |MSB                    |LSB                    |
 *               | 7| 6| 5| 4| 3| 2| 1| 0| 7| 6| 5| 4| 3| 2| 1| 0|
 *                  |                       |
 * Temp-Wert     |+-| 7| 6| 5| 4| 3| 2| 1| 0|
 *
 * MSB Bit-7 ist 0 f├╝r positive Temperaturen
 *           ist 1 f├╝r negative Temperaturen
 *
 * MSB Bit-0 .. -6 sind die Bits 1..7 des Temperaturwertes.
 *     Zur Ermittlung der Temperatur (ohne Vorzeichen)
 *     wird also das MSB um 1 Stelle nach links geshiftet
 *
 * LSB Bit-7 ist das Bit-0 des Temperaturwertes
 *     Bit-0 .. -6 sind irrelevant
 *     um das Bit-7 zu isolieren, wird das Byte um 7 Stellen nach rechts geshiftet
 *     und abschliessend werden MSB und LSB zum Temperaturwert addiert.
 *
 * F├╝r die Ermittlung, ob es sich um eine PLUS- oder MINUS-Temperatur handelt,
 * wird gepr├╝ft, ob Bit-7 des urspr├╝nglichen MSB (jetzt msb1) gesetzt war.
 * Falls ja, wird von dem Wert 256 subtrahiert.
 * Abschliessend muss der Temp-Wert noch durch 2 dividiert werden.
 * Aufl├Âsungsgenauigkeit ist 0.5 Grad Celsius
 ********************************************************************************/

float LM75_Read(byte addr)
{
    byte msb1;
    byte MSB; byte LSB; float temp;

    I2C_Start();                                 // Sequenz starten
    I2C_Write(addr);                         // Moduladresse auf den Bus schreiben
    msb1 = I2C_Read_ACK();           // MSB auslesen und in msb1 speichern
    MSB = (msb1 << 1);                  // f├╝r Temperatur 1 Stelle nach links shiften
    LSB = (I2C_Read_ACK() >> 7);  // LSB auslesen und 7 Stellen nach rechts
    I2C_Stop();                              // Sequenz stoppen, Bus freigeben

    temp = MSB+LSB;                  // Temperaturwert nach temp addieren
    if (msb1>0x80)                        // Bit-7 von msb1 = 1, dann MINUS-Temperatur
     {
        temp = (temp-256);             // negativen Komplement├Ąrwert erzeugen
     }
    return temp/2-3;                     // Division durch 2 und 3 Grad abziehen zum cal.

}

Den Code oben kannst Du einfach als Libary im Projekt integrieren. Aber bitte nicht Kommerziell
verarbeiten......
Des weiteren solltest Du auf Pullupwiderst├Ąnde achten die an SCA und SCL dran m├╝ssen.
4,7k tun bei mir gute Dienste. Aber auf dem Mega128 Application Board sind diese ja schon drauf
wenn Du nicht den I2C-EEprom abgeschaltet hast.
Und Du musst darauf achten das die Adresspins A0-A2 des LM75 nicht offen bleiben. Diese m├╝ssen
Vcc- oder GND-Pegel haben.
Bei mir Funktioniert der Code erstklassig. In meinem Projekt sind 7 LM75-Temperatursensoren verbaut
die alle an einem ca. 5m langen Bus h├Ąngen.

Gru├č Thomas


    Antwort schreiben


Antworten: