stm32f4 ile sht 75 sensörü okuma

Başlatan denizhan50, 27 Mayıs 2012, 04:37:02

denizhan50

Arkadslar merhaba ,,stm32f4 ile sht 75 sıcaklık sensoru okumam  lazım tezımde ,örneek uygulmalarıı inceledım  ama harıcı sensörden verı okumaya rastlamadım ,,sht 75 ın diğer işmecılerle olan kodlarını stm32f4 için düzenledım ama verılerıı okuyamadım acaba nerde yanlıs yapıyorum?

#include "STM32F4xx.h"
#include "delay.h"
#include "HD44780.h"
#include "math.h"
#include "stdio.h"


            
                            //adr  komut   r/w
#define YAZMA_DURUM 0x06    //000   0011    0
#define OKUMA_DURUM 0x07    //000   0011    1
#define ISI_OLCUM 0x03      //000   0001    1
#define NEM_OLCUM 0x05      //000   0010    1
#define RESET 0x1e          //000   1111    0


#define noACK 0
#define ACK   1

#define DATA   GPIO_B(7)
#define SCK   GPIO_B(6)
void SystemInit(void)
{
unsigned int i;

    for (i=0;i<0x00100000;i++);          // OSC oturtma ve kurtarma rutini
    RCC->CFGR |= 0x00009400;         // AHB ve APB hizlarini max degerlere set edelim
    RCC->CR |= 0x00010000;            // HSE Xtal osc calismaya baslasin       
    while (!(RCC->CR & 0x00020000));// Xtal osc stabil hale gelsin
    RCC->PLLCFGR = 0x07405408;      // PLL katsayilarini M=8, N=336, P=2 ve Q=7 yapalim
//  RCC->PLLCFGR = 0x07402A04;     // PLL katsayilarini M=4, N=168, P=2 ve Q=7 yapalim
    RCC->CR |= 0x01000000;            // PLL calismaya baslasin  (Rehber Sayfa 95)
    while(!(RCC->CR & 0x02000000)); // Pll hazir oluncaya kadar bekle
//  FLASH->ACR = 0x00000705;        // Flash ROM icin 5 Wait state secelim ve ART yi aktif edelim (Rehber Sayfa 55)
    FLASH->ACR = 0x00000605;        // Flash ROM icin 5 Wait state secelim ve ART yi aktif edelim (Rehber Sayfa 55)
    RCC->CFGR |= 0x00000002;        // Sistem Clk u PLL uzerinden besleyelim
    while ((RCC->CFGR & 0x0000000F) != 0x0000000A); // Besleninceye kadar bekle
    RCC->AHB1ENR |= 0x0000001F;    // GPIO A,B,C,D,E clock'u aktif edelim
   
    GPIOD->MODER = 0x55005555;     // GPIOD nin 15, 14, 13, 12 pinleri cikis tanimlandi (LEDler icin) 0..7 arasıda çıkış
    GPIOB->MODER = 0x00000500;     // GPIOB 4 ve 5 i çıkış yaptık.
   //GPIOE->MODER = 0x00000880;      // GPIOE 4 ve 6 i çıkış yaptık.   
                           // DATA  ÇIKIŞ=E4 SCK ÇIKIŞ= E6
    GPIOA->OSPEEDR= 0x00000000;   // GPIOD nin tum cikislarinı Max. 2 Mhz de kullanacağız.
    GPIOB->OSPEEDR= 0xFFFFFFFF;     // AYnı şey GPIOB içinde geçerli
    GPIOC->OSPEEDR= 0xFFFFFFFF;
    GPIOD->OSPEEDR= 0xFFFFFFFF;
   GPIOE->OSPEEDR= 0xFFFFFFFF;
}

    

    void bekle( unsigned int sure )
{
   int i;
   while( sure != 0 )   
   {
      i = 120;
      while( i != 0 )
      {
         i --;
      }
      sure --;
   
   }
}
  void ee_delay(void)
  { unsigned long y;
  for(y=0; y<50; y++);
}


typedef union
{ unsigned int i;
  float f;
} value;

enum {ISI,NEM};

char s_yaz_byte(unsigned char deger)
{
  unsigned char i,hata=0; 
  for (i=0x80;i>0;i/=2)             
  { if (i & deger) DATA=1;         
    else  DATA=0;
    ee_delay();
   SCK=1;                         
   ee_delay();                       
   ee_delay();
   ee_delay();        
    SCK=0;
   ee_delay();
  }
DATA=1;   
  ee_delay();                       
   SCK=1;                         
 
  hata=DATA;
                     
   SCK=0;       
  return hata; 
                     
}

/***** bir bayt okumak için tanımlama *****/

char s_oku_byte(unsigned char ack)
{
  unsigned char i,val=0;
  DATA=1;                         
 
  for (i=0x80;i>0;i/=2)             //bit maskeleme
  { SCK=1;                          //iletişim için saat sinyali
   
   if (DATA) val=(val | i);        //bir bit oku 
    SCK=0;                 
  }
 
  DATA=!ack;
   ee_delay();                       
SCK=1;                           
ee_delay();
  ee_delay();
    ee_delay();     
  SCK=0;
  ee_delay();                     
  DATA=1;                           //veri değerini sil
  return val;
}

/***** yeni bir iletişim başlat *****/

void s_basla(void)


   DATA=1;  SCK=0;                   //ilk durum
  ee_delay();
  SCK=1;
   ee_delay();
  DATA=0;
    ee_delay();
   SCK=0; 
    ee_delay();
   ee_delay();
    ee_delay();
  SCK=1;
   ee_delay();
   DATA=1;         
    ee_delay();
   SCK=0;         
}
       /*** iletişim yenile: DATA-line=1 ve sonraki 9 SCK saykili takiben başa dön ***/

void s_baglanti_reset(void)


  unsigned char i;
  DATA=1; SCK=0;                    //ilk durum
  for(i=0;i<9;i++)                  //9 SCK saykili
  { SCK=1;
    SCK=0;
  }
  s_basla();                   //aktarmayi baslat
}
//----------------------------------------------------------------------------------
char s_softreset(void)
 

  unsigned char hata=0;   
  s_baglanti_reset();              //reset communication
  hata+=s_yaz_byte(RESET);       //send RESET-command to sensor
  return hata;                     //error=1 in case of no response form the sensor
}   

//----------------------------------------------------------------------------------
char s_oku_statusreg(unsigned char *p_deger, unsigned char *p_top)
//----------------------------------------------------------------------------------
// reads the status register with checksum (8-bit)

  unsigned char hata=0;
  s_basla();                   //transmission start
  hata=s_yaz_byte(OKUMA_DURUM); //send command to sensor
  *p_deger=s_oku_byte(ACK);        //read status register (8-bit)
  *p_top=s_oku_byte(noACK);   //read checksum (8-bit)   
  return hata;                     //error=1 in case of no response form the sensor
}
 

  //----------------------------------------------------------------------------------
char s_yaz_statusreg(unsigned char *p_deger)
//----------------------------------------------------------------------------------
// writes the status register with checksum (8-bit)

  unsigned char hata=0;
  s_basla();                   //transmission start
  hata+=s_oku_byte(YAZMA_DURUM);//send command to sensor
  hata+=s_yaz_byte(*p_deger);    //send value of status register
  return hata;                    //error>=1 in case of no response form the sensor

   


   
   /**** ölcüm yapar (nem/sıcaklık)****/
    char s_olcum(unsigned char *p_deger, unsigned char *p_top, unsigned char mod)
{
  unsigned hata=0;
  unsigned int i;

  s_basla();                   //aktarmayı başlat.
  switch(mod){                     //sensöre komut göder.
    case ISI   : hata+=s_yaz_byte(ISI_OLCUM); break;
    case NEM   : hata+=s_yaz_byte(NEM_OLCUM); break;
    default     : break;   
  }
 
  for (i=0;i<65535;i++) if(DATA==0) break; //sensör ölçümü tamamlayana kadar bekle.
  if(DATA) hata+=1;                // süre 2 saniye yi astiginda
  *(p_deger)  =s_oku_byte(ACK);    //ilk bayti oku
  *(p_deger+1)=s_oku_byte(ACK);    //ikinci bayti oku
  *p_top =s_oku_byte(noACK);      //toplamı oku
 
  return hata;
}



void sensor_hesapla(float *p_nem ,float *p_isi)
{
const float C1=-2.0468;           // for 12 Bit RH
  const float C2=+0.0367;           // for 12 Bit RH
  const float C3=-0.0000015955;     // for 12 Bit RH
  const float T1=+0.01;             // for 12 Bit RH
  const float T2=+0.00008;          // for 12 Bit RH


  float rh=*p_nem;               // rh:      nem [saat darbesi] 12 Bit
  float t=*p_isi;               // t:       sicaklik [saat darbesi] 14 Bit
  float rh_lin;                     // rh_lin:  nem doğrusal
  float rh_true;                    // rh_true: sicaklik telafi nem
  float t_C;                      // t_C   :  sicaklik [íC]

  t_C=t*0.01 - 40;                     //[íC] dan sıcaklık hesapla.
  rh_lin=C3*rh*rh + C2*rh + C1;        //[%RH] dan nem hesapla
  rh_true=(t_C-25)*(T1+T2*rh)+rh_lin;  //[%RH] sıcaklık ısı telefisi hesapla

   

  *p_isi=t_C;               //sıcaklık değeri döndür[íC]
  *p_nem=rh_true;              //nem değeri döndür.[%RH]
}





void  main(void)
{
    void SystemInit();
    value nem_deger,isi_deger;
  unsigned char  topla, hata;
  unsigned int i;
  char S1[16],S2[16];
   
   s_baglanti_reset();

    while(1)
    {
   
      hata=0;
      //hata+=s_olcum((unsigned char*) &nem_deger.i,&topla,NEM);               
    s_olcum((unsigned char *)&nem_deger.i,&topla,NEM);    //nem ölçümü
    //hata+=s_olcum((unsigned char*) &isi_deger.i,&topla,ISI);
   s_olcum((unsigned char *)&isi_deger.i,&topla,ISI);    //sıceklık ölçümü
    //if(hata!=0) s_baglanti_reset();
   //else//{
   nem_deger.f=(float)nem_deger.i;                   //tip dönüşümü
    isi_deger.f=(float)isi_deger.i;                   //tip dönüşümü
   
   sensor_hesapla(&nem_deger.f,&isi_deger.f);            //sıcaklık ve nem hesapla

          for (i=0;i<40000;i++); //(be sure that the compiler doesn't eliminate this line!)

   //}

    // sprintf(S1,"SiCAKLiK :%5.1fC%",isi_deger.f);   //sicaklik değerini s1 degiskenine bastır
   //sprintf(S2,"NEM......:%5.1f%%",nem_deger.f); //nem değerini s2 degiskenine bastır

         
      Lcd_init();
      Lcd_Imlec_Yok();
     sprintf(S1,"SiCAKLiK :%5.1fC%",isi_deger.f);   //sicaklik değerini s1 degiskenine bastır
      Lcd_Yaz(S1); Lcd_Git(2,1);
        sprintf(S2,"NEM......:%5.1f%%",nem_deger.f); //nem değerini s2 degiskenine bastır
      Lcd_Yaz(S2);

      Delay_ms(250);



    }

}