I2C Abfrage SHT12 Kategorie: Programmierung Basic (von Hans - 4.01.2010 1:27) | ||
| ||
Servus Jungs und Mädls. Kenn mich bei der C Programmierung nicht besonders aus. Für die Abfrage des Temperatur-Feuchte Bausteins habe ich schon ein Beispiel gefunden. Nur leider ist das in C geschrieben. In Basic würde ich das Programmierte schon verstehen können. Kann mir da wer weiter helfen? Anbei die C-Programmierung Danke euch für die Hilfe Gru� Hans /******************************************************************/ /* Treiberbibliothek für Sensirion SHT Feuchtesensoren(12/14Bit) */ /* Autor : André Helbig (www.cc2net.de) */ /* Vorlage : André Helbig / CC2: sht.c2 */ /* Version : 1.0 */ /* Datum : 01. Oktober 2008 */ /* Benötigt : timer.cc */ /* Getestet : ja */ /* Bemerkung : Messung nur im hi-res.Mode(12Bit RH / 14Bit Temp.) */ /******************************************************************/ byte Clock,Data; /*************************************/ /* Schnittstelle initialisieren */ /*************************************/ void sht_init(byte clkport, byte dataport) {byte i; Clock=clkport; Data=dataport; Port_DataDirBit(Clock, 1); Port_WriteBit(Clock, 0); Port_DataDirBit(Data, 0); for(i=0;i<=10;i++) { Port_WriteBit(Clock, 1); Port_WriteBit(Clock, 0); // AbsDelay(1); } } /*************************************/ /* Datenport festlegen */ /*************************************/ void sht_setDataPort(byte dataport) {byte i; Port_DataDirBit(Data, 0); Data=dataport; } /*************************************/ /* Startbedingung senden */ /*************************************/ void sht_start(void) { Port_WriteBit(Clock, 1); // AbsDelay(1); Port_DataDirBit(Data, 1); Port_WriteBit(Data, 0); // AbsDelay(1); Port_WriteBit(Clock, 0); // AbsDelay(1); Port_WriteBit(Clock, 1); // AbsDelay(1); Port_DataDirBit(Data, 0); Port_WriteBit(Clock, 0); } /*************************************/ /* Byte senden */ /*************************************/ int sht_Write(byte databyte) {int i; for(i=0;i<=8;i++) { if((databyte << i) & 0x80) { Port_DataDirBit(Data, 0); } else { Port_DataDirBit(Data, 1); Port_WriteBit(Data, 0); } AbsDelay(1); Port_WriteBit(Clock, 1); AbsDelay(1); Port_WriteBit(Clock, 0); } Port_DataDirBit(Data, 0); AbsDelay(1); Port_WriteBit(Clock, 1); Port_WriteBit(Clock, 1);//dummy AbsDelay(1); i=(Port_ReadBit(Data)==0); Port_WriteBit(Clock, 0); AbsDelay(1); return i; } /*************************************/ /* Byte empfangen */ /*************************************/ byte sht_Readbyte(int ack) {byte data,i; data=0; for(i=0;i<=7;i++) { Port_WriteBit(Clock, 1); Port_WriteBit(Clock, 1);//dummy AbsDelay(1); data=(data << 1) | (Port_ReadBit(Data) & 1); Port_WriteBit(Clock, 0); AbsDelay(1); } if(ack) { Port_DataDirBit(Data, 1); Port_WriteBit(Data, 0); } else { Port_DataDirBit(Data, 1); } AbsDelay(1); Port_WriteBit(Clock, 1); AbsDelay(1); Port_WriteBit(Clock, 0); AbsDelay(1); Port_DataDirBit(Data, 0); return data; } /*************************************/ /* Integer lesen */ /* wartet auf Bereitschaft (Data=Low)*/ /* (timeout 1sek.=Rückgabe 0xF000) */ /*************************************/ int sht_Readint(int ack) {int timer, data; Port_DataDirBit(Data, 0); timer=timer10ms; while(Port_ReadBit(Data)) { if((timer10ms-timer)>30) return 0xF000;//300ms Timeout } data=sht_Readbyte(1); //High-Byte data=(data << 8) | sht_Readbyte(ack);//Low-Byte return data; } /*************************************/ /* Statusregister schreiben */ /*************************************/ int sht_setRegister(byte reg) { sht_start(); sht_Write(0x6);//0b00110 return sht_Write(reg); } /*************************************/ /* Statusregister lesen */ /*************************************/ byte sht_getRegister(void) { sht_start(); sht_Write(0x7);//0b00111 return sht_Readbyte(0); } /*************************************/ /* Software Reset */ /*************************************/ int sht_Reset(void) { sht_start(); return sht_Write(0x1e);//0b11110 } /*************************************/ /* Heizung schalten */ /*************************************/ int sht_setHeater(int state) {byte reg; reg=sht_getRegister(); reg=(reg & 0xFB) | (state!=0 & 0x4); return sht_setRegister(reg); } /*************************************/ /* Temperatur auslesen */ /* Format: 0,00 */ /*************************************/ int sht_getTemp(void) {int temp;byte i; i=0; do { sht_start(); sht_Write(0x3);//0b00011 temp= sht_Readint(0); i++; }while(temp==0xF000 && i<16); return temp-4000; } /*************************************/ /* Feuchtigkeit auslesen */ /* Format: 0,00 (temp & hyg) */ /*************************************/ int sht_getHyg(int temp) {int hyg;byte i; float SOrh,RHlin; i=0; do { sht_start(); sht_Write(0x5);//0b00101 hyg=sht_Readint(0); i++; }while(hyg==0xF000 && i<16); if(hyg & 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; } | ||
Antwort schreiben Antworten: |
Zur Übersicht - INFO - Neueste 50 Beiträge - Neuer Beitrag - Suchen - Zum C-Control-I-Forum - Zum C-Control-II-Forum