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: