|
|
Testprogramm |
|
|
|
|
|
|
|
Temperatursensor LM75 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 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); } |
|
|
|
|
|