Forum: Mikrocontroller und Digitale Elektronik PIC18F97J60 und LM75


von Ingo S. (schicki)


Lesenswert?

Hallo Zusammen,

ich möchte gerade einen LM75 an meinen PIC18F97J60 anbinden. Aber 
irgendwie sehe ich vor den vilen Bäumen den Wald nicht. Ich bekomme 
einfach keine vernünftigen Messwerte hin. Hat hier jemand Erfahrung von 
Euch. Meinen anderen I²C Platinen funktionieren.

Ich wäre hier für jeden Tipp dankbar..

Hier wäre mein MC-Board:
http://www.schwabenplan.com/downloads/d03000.pdf

Hier wäre die LM75 Platine:
http://www.schwabenplan.com/downloads/d03200.pdf

Und hier wäre mein LM75 Programm:
/*********************************************************************** 
*/
unsigned int GetTempLM75 (void)
{
  unsigned int LM75_H, LM75_L, LM75_Temperatur;

  char addr = 0b10010001;

    IdleI2C2();        //wait until I2C2 module is idle.
    StartI2C2();

    WriteI2C2(addr);
    IdleI2C2();        //wait until I2C2 module is idle.
    if ( SSP2CON2bits.ACKSTAT )    // test received ack bit state
    {
    StopI2C2();
       return 0;            // bus device responded with  NOT ACK
    }

    LM75_H = ReadI2C2();
     IdleI2C2();
    if ( SSP2CON2bits.ACKSTAT )    // test received ack bit state
    {
    StopI2C2();
       return 0;            // bus device responded with  NOT ACK
    }

    LM75_L = ReadI2C2();
     IdleI2C2();
    if ( SSP2CON2bits.ACKSTAT )    // test received ack bit state
    {
    StopI2C2();
       return 0;            // bus device responded with  NOT ACK
    }

    StopI2C2();

    LM75_Temperatur =  (LM75_H << 8) | LM75_L;

    return LM75_Temperatur;
}
/*********************************************************************** 
*/

von B. S. (bestucki)


Angehängte Dateien:

Lesenswert?

> PIC18F97J60
Ist ein Billigtyp. Nicht dass du dich wunderst, wenn das Flash nach 
einigen Brennvorgängen (>100) den Geist aufgibt.
http://www.sprut.de/electronic/pic/18f.htm

> Ich bekomme einfach keine vernünftigen Messwerte hin.
Welche Messwerte erhälst du? Sind diese konstant, ändern sie sich, sind 
sie willkürlich? Auf den ersten Blick erkenne ich in deinem Programm 
nur, dass die umgerechnete Temperatur nie negativ werden kann.

> LM75_Temperatur =  (LM75_H << 8) | LM75_L;
Diese Zeile sieht komisch aus. Schau dir nochmals die Codierung im 
Datenblatt des LM75 an. Oder willst du nur die beiden Bytes 
zusammensetzen?

Schau dir mal das Sourcefile im Anhang an. Hab ich vor ca. 2 Wochen 
geschrieben, das Prinzip sollte dabei ersichtlich sein. Funktioniert 
soweit, ist aber noch nicht vollständig getestet (negative Temperaturen 
zum Beispiel).


Nachtrag:
Habe gerade gesehen, dass du den Adresszeiger des LM75 vor dem Lesen 
nicht setzt. Den musst du vor jedem Lesen der Temperatur auf das 
Temperaturregister setzen (siehe meine angehängte Datei).

von Ingo S. (schicki)


Lesenswert?

Hallo,

vielen Dank für die Unterstützung. Ich habe inzwischen den LM75 am 
laufen. Es waren zwei Gründe verantwortlich.

Versorgungsspannung:
Mit einer Versogrungsspannung von 3,3 Volt bekam ich keine stabilen 
Signale am I²C-Bus. Mit 5,0 Volt waren die Pegel ok.

  > LM75_Temperatur =  (LM75_H << 8) | LM75_L;
Hier war auch ein Fehler. Stimmt. Ich habe das ganze jetzt so 
umgeschriebenen das es funktioniert.

Vielen Dank
Ingo

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.