Zur Übersicht - INFO - Neueste 50 Beiträge - Neuer Beitrag - Suchen - Zum C-Control-I-Forum - Zum C-Control-II-Forum

I2C Abfrage SHT12 Kategorie: Programmierung Basic (von Hans - 4.01.2010 1:27)
Ich nutze:
C-Control Pro Mega128
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: