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) |