Testprogramm

 

 

 


dESµ Modelle              

Temperatursensor LM75       


 

                               





 

 

 


Bemerkungen
Das nachfolgende Programm initialisiert den LM75-Sensor. Es beschreibt zu Testzwecken dessen Kontrollregister sowie die Grenzwertregister THY und TOS, liest diese dann und zeigt deren Werte an.

In der Folge liest das Programm in einer Schleife das Temperaturregister und gibt die gemessene Temperatur zum Terminalbildschirm aus. Es endet nach einem Druck auf die Taste [ESC].

Das Programm benötigt die I2C-Headerdatei .. 'I2C.H' .. in welcher die Unterprogramme zum Betrieb des I2C-Busses stehen.






// lm75.CPP
// ------------   Version 22.03.2006
//                Borland IDE C++ 3.1 oder 5.2
//                Model:  SMALL
//                www.GoBlack.de, D.Schwarzer
// --------------------------------------------------------

// Das Programm zeigt die Werte der internen Register von
// LM75 Temperatursensoren am I2C-Bus des dESµ-Systems.

// Welche Adresse besitzt der Sensor am I2C-Bus?
   #define LM75 0x9E


// Adressen der Register im LM75 Temperatursensor

  #define KonReg 01                     // Kontrollregister
  #define ThyReg 02                     // Untergrenze
  #define TosReg 03                     // Obergrenze
  #define TmpReg 00                     // Temperatur

  #include <stdio.h>                    // für printf()
  #include "i2c.h"                      // Header I2C-Bus


char getbuf[2];                         // Rückgabespeicher


// write75()
// schreibt zum LM75 mit der I2C-Adresse 'i2cadr', die
// LM75 Adresse des Registers 'adr', welche die nachfol-
// genden Daten 'dat1' und 'dat2' aufnehmen soll.
// Bei der Adressierung des Kontrollregisters 'adr'=01
// welches nur ein Byte übernehmen kann, wird nur 'dat1'
// übernommen.
int write75(char i2cadr, char adr, char dat1, char dat2)
{
 char sendbuf[3];                     // Sendespeicher
 sendbuf[0]= adr;                     // Registeradresse
 sendbuf[1]= dat1;                    // Sendewert 1
 sendbuf[2]= dat2;                    // Sendewert 2
 i2c_transblock (i2cadr, sendbuf, 3);
 i2c_release();
 return 0;
}


// read75()
// liest vom LM75 mit der I2C-Adresse 'i2cadr', das
// interne LM75 Registers mit der Adresse 'adr'.
// Bei den 16 Bit Registern befindet sich das HIGH-Byte
// in getbuf[0], das LOW-Byte in getbuf[1]. Da vom LOW-
// Byte nur Bit 7 interessant ist, wird getbuf[1] nach
// recht geschoben. So steht die Rückgabe in Bit 1
// Beim Lesen des Kontrollregister befindet sich der
// Rückgabewert nur in getbuf[0]
char read75(char i2cadr, char adr)
{
 i2c_transmit(i2cadr, adr);           // Register wählen
 i2c_release();
 i2c_receive(i2cadr,&getbuf[0],1);    // Rückgabe HIGH
 i2c_receive(i2cadr,&getbuf[1],0);    // Rückgabe LOW
 i2c_release();
 getbuf[1]=getbuf[1]>>7;             // Werte nur in Bit7
 return 0;
}


// main()
// Das Programm initialisiert den LM75, liest dann dessen
// Register und fragt hernach alle ifaktor * 50ms das
// Temperaturregister ab.

void main(void)
{
 #define TOS      70             // oberer Tempwert
 #define TOSn     0x80           // Nachkommastelle 0.5
 #define THY      50             // unterer Tempwert
 #define THYn     0x00           // Nachkommastelle 0.0

 #define rauschen 2              // Lesewiederholungen
                                 // bei Wertwechsel
 #define ifaktor 10              // Faktor *50ms

 char dt=ifaktor;                // steuert Intervalle
 char start=0xFF;                // steuert die Ausgabe
 char highval =0;                // Bits15-8 Temperatur
 char lowval  =0;                // Bit    7 Temperatur
 char c=0, n=0;                  // Tastendruck, Hilfsvar.

 setStdio(2);
 printf("\r\n [Start] LM75-Temperatur");
 printf("\r\n "
        "---------------------------------------------");
 printf("\r\n Die Register des LM75 werden gesetzt, gelesen"
        "\r\n und anzeigt."
        "\r\n                [ESC] Programmende\r\n");

 // Sensor suchen
 if (i2c_scan (LM75, LM75)!=LM75) {
  printf("\r\n         Fehler: LM75 nicht gefunden\r\n");
  return;
 }

 // Sensor zu Testzwecken beschreiben und die gesetzten
 // Werte lesen und anzeigen

 write75(LM75,KonReg,0x18,0x00);      // Kontr.Reg setzen
 read75 (LM75,KonReg);                // Kontr.Reg lesen
 printf ("\r\n   Wert KonReg =  %.2Xh", getbuf[0]);

 write75(LM75,TosReg,TOS,TOSn);       // Obergrenze setzen
 read75 (LM75,TosReg);                // Obergrenze lesen
 printf ("\r\n   Wert TosReg = %3.0d.", getbuf[0]);
 if(getbuf[1]) printf("5°C");
 else          printf("0°C");

 write75(LM75,ThyReg,THY,THYn);       // Untergrenze setzen
 read75 (LM75,ThyReg);                // Untergrenze lesen
 printf ("\r\n   Wert ThyReg = %3.0d.", getbuf[0]);
 if(getbuf[1]) printf("5°C");
 else          printf("0°C");
 printf("\r\n\n");


 // Das Temperaturregister wird nach Zeitintervallen von
 // dt*50ms abgefragt, die Tastatur alle 50ms.

 while (c!= ESC){
  read75(LM75, TmpReg);               // Temperatur lesen
  if(start==0xFF) start=1;            // Startausgabe

  // Nur wenn n mal der gleiche Wert gelesen wurde, diesen
  // Wert ausgeben.

  if(lowval!=getbuf[1]|| highval != getbuf[0]){
   n++;
   if (n>=rauschen)start=1;
  }
  else n=0;

  // Wert zum Terminalprogramm ausgeben, wenn start=1

  if(start){
   n=0; start=0;
   lowval  = getbuf[1];
   highval = getbuf[0];

   printf ("\r   Temperatur  = %3.0d.", highval);
   if(lowval) printf("5°C");
   else       printf("0°C");
  }

  // Tastatur alle 50ms abfragen, insgesamt ifaktor *50ms
  // warten

  dt=ifaktor;
  while(dt && c!=ESC){
   c=isKey();
   dt--;
   api_sleep(50);
  }
 }

 // Programmende nach Druck auf ESC

 printf("\r\n\n [Ende]  LM75-Temperatur\r\n");
 setStdio(3);
}


 

 

 

www.GoBlack.de