Zur Übersicht - INFO - Neueste 50 Beiträge - Neuer Beitrag - Suchen - FAQ - Zum CC1-Forum - Zum CC-Pro-Forum

Re: sht an pcf8574 Kategorie: I²C-Bus (von krassos - 3.11.2003 3:51)
Als Antwort auf Re: sht an pcf8574 von Andreas D. - 2.11.2003 23:38

Hallo,

ich poste einfach mal ins Forum:
Mein Beispiel besteht aus zwei Modulen:

Modul 1: shtpcf.c2

/******************************************************************/
/* Treiberbibliothek fuer Sensirion SHT Feuchtesensoren(12/14Bit) */
/* Autor     : André Helbig (andre.h@cc2net.de)                   */
/* Vorlage   : André Helbig (andre.h@cc2net.de)                   */
/* Version   : 1.0                                                */
/* Datum     : 20. Juli 2003                                      */
/* Getestet  : ja                                                 */
/* Benötigt  : ports.c2, system.c2, math.c2, mathx.c2             */
/* Bemerkung : Messung nur im hi-res.Mode(12Bit RH / 14Bit Temp.) */
/* modified  : krassos
               -angepasst auf sht an pcf8574
               -diverse Zeilenkommentare
               - Taupunktberechnung eingefügt

/******************************************************************/
byte Clock,Data,err,Adr;
/*************************************/
/* Schnittstelle initialisieren      !!!geändert!!!*/
/*************************************/
function init(byte adr, byte clock, byte data)
{byte i;
 Clock=clock%16; //modulo kann ggf wegfallen
 Data=data%16;
 Adr=adr%16;
 pcf.set(adr,Clock,0); //clockport auf 0 setzen
 pcf.on(adr, Data); // dataport als eingang schalten (high)
 for i = 0 ... 9 pcf.pulse(adr, Clock); //10 Pulse ausgeben
}

/*************************************/
/* Datenport festlegen              !!!!geändert !!!!*/
/*************************************/
function setDataPort(byte adr, byte data)
{byte i;
 pcf.on(adr, data);
 Data=data%16;
}

/*************************************/
/* Startbedingung senden           !!!geändert!!!!  */
/*************************************/
function start()
{
 pcf.set(Adr,Clock,1);
 pcf.set(Adr,Data,0);
 pcf.set(Adr,Clock,0);
 pcf.set(Adr,Clock,1);
 pcf.on(Adr,Data);
 pcf.set(Adr,Clock,0);
}

/*************************************/
/* Byte senden                  !!!geändert!!!!     */
/*************************************/
function Write(byte data) returns int
{int i;
 for i=0 ... 7
 {
  if (data shl i) and 0x80 pcf.on(Adr,Data);else pcf.set(Adr,Data,0);
  pcf.pulse(Adr,Clock);
 }
 pcf.on(Adr,Data);
 pcf.set(Adr,Clock,1);
 i=not(pcf.get(Adr,Data)); //ack vom sensor
 pcf.set(Adr,Clock,0);
 return i;
}

/*************************************/
/* Byte empfangen                 !!!geändert!!!!  */
/*************************************/
function Readbyte(int ack) returns byte
{byte data,i;
 data=0;
 for i=0 ... 7
 {
  pcf.set(Adr,Clock,1);
  data=(data shl 1) or pcf.get(Adr,Data) and 1;
  pcf.set(Adr,Clock,0);
 }
 if ack pcf.set(Adr,Data,0); else pcf.on(Adr,Data);
 pcf.pulse(Adr,Clock);
 pcf.on(Adr,Data);
 return data;
}

/*************************************/
/* Integer lesen                     */
/* wartet auf Bereitschaft (Data=Low)*/
/* (timeout 1sek.=Rückgabe 0xF000)   */
/*************************************/
function Readint(int ack) returns int
{long timer;int data;
 timer=system.timer();
 loop
 {
  if pcf.get(Adr,Data)==0 break;
  if system.timer()-timer>=1000 return 0xF000;
  yield;
 }
 data=Readbyte(1); //High-Byte
 data=(data shl 8) or Readbyte(0);//Low-Byte
 return data;
}

/*************************************/
/* Statusregister schreiben          */
/*************************************/
function setRegister(byte reg) returns int
{
 start();
 Write(0b00110);
 return Write(reg);
}

/*************************************/
/* Statusregister lesen              */
/*************************************/
function getRegister() returns byte
{
 start();
 Write(0b00111);
 return Readbyte(0);
}

/*************************************/
/* Software Reset                    */
/*************************************/
function Reset() returns int
{
 start();
 err=Write(0b11110); //errorbitauswertung
 return err;
}

/*************************************/
/* Heizung schalten                  */
/*************************************/
function setHeater(int state) returns int
{byte reg;
 reg=getRegister();
 reg=(reg and 0xFB) or (state!=0 and 0x4);
 return setRegister(reg);
}

/*************************************/
/* Temperatur auslesen               */
/* Format: 0,00                      */
/*************************************/
function getTemp() returns int
{int temp;
 start();
 Write(0b00011);
  return Readint(0)-4000;
}

/*************************************/
/* Feuchtigkeit auslesen             */
/* Format: 0,00 (temp & hyg)         */
/*************************************/
function getHyg(int temp) returns int
{int hyg;
 long SOrh,RHlin;
 start();
 Write(0b00101);
 hyg=Readint(0);
 if hyg and 0x8000 return -1;
 SOrh=hyg;
 RHlin=((405*SOrh - 40000)*250 + ((-7)*SOrh*SOrh))/25;
 hyg=(((temp-2500)*(1000+8*SOrh)/100)+RHlin)/1000;
 return hyg;
}


/* Taupunktberechnung                        by krassos*/
/* t = Temperatur im Format wie von getHyg() übergeben */
/* h = wie von getHyg() übergeben                      */
/* Rückgabewert Format 0,0                             */
function dew(int t, int h) returns int
{
float logEx,dew_point,t1,h1;
t1=t/100;
h1=h/100;
if h1 == 0 h1=0.01;              
logEx=0.66077+7.5*t1/(237.3+t1)+(math.log(h1)-2) ;
dew_point = (logEx - 0.66077)*237.3/(0.66077+7.5-logEx) ;
//dew_point = logEx;
return mathx.round(dew_point*10);
}

Modul 2: first.c2

int rH;
int T;



thread main
{
/**Initialisierungen****************************/

int a,b,c;
string sc,mn,hr,zeit,bs;
plm.beep(20);
system.TIME z;

lcd.init();
pcf.init();
pcflcd.setpcf(8); // Display an Addr. 0
pcflcd.init(); // Display inittialisieren
pcflcd.setLight(0); // licht aus

plm.beep(-1);


/************************************************/

loop
{
//erfassung der Uhrzeit und des dcf-status
system.gettime(z);
str.putintf(hr,z.hour,2);
str.putintf(mn,z.minute,2);
str.putintf(sc,z.second,2);
zeit=hr+":"+mn+":"+sc;
lcd.goto(0,0);
lcd.print(zeit);
bs="       ";
hr="";
zeit = "";
mn="";
sc="";
if system.dcferr() > 5 bs="nosync";
//Anzeige von Uhrzeit und dcf-status auf dem internen Display
lcd.goto(1,0);
lcd.print(bs);

///sht-anschluss: port 6 ist clock, port 7 ist data
shtpcf.init(9,6,7);
sleep 100;
T=shtpcf.getTemp();
rH=shtpcf.getHyg(T);
pcflcd.home();
pcflcd.zahl4n2(T);pcflcd.put(0xDF);pcflcd.put('C'); //Anzeige Temperatur
pcflcd.put(0x20);
pcflcd.zahl4n1(shtpcf.dew(T,rH));pcflcd.put(0xDF);pcflcd.put('C');  //Taupunktanzeige
pcflcd.line(2);
pcflcd.zahl4n2(rH);pcflcd.print("%rH");
sleep 2000; //Pause zwischen zwei Abfragen >800ms wegen Eignerwärmung
}

}






    Antwort schreiben


Antworten:

Re: sht an pcf8574 (von André H. - 7.11.2003 7:50)
    Re: sht an pcf8574 (von krassos - 7.11.2003 18:38)