اطلاعیه

Collapse
No announcement yet.

SHT75 با AVR و C

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    SHT75 با AVR و C

    سلام
    کسی با سنسور دما و رطوبت SHT75 و codvison کار کرده ؟
    برنامه ای اگه دارید بزارید .

    #2
    پاسخ : SHT75 با AVR و C

    سلام ...............

    ببینید بر طبق این دیتاشیتی که از اینترنت دیدم نوع برقراری ارتباط با این سنسور از طریق پروتکل İ2C هست . با این تفاسیر شما باید از این قسمت در CodeVision استفاده کنید . به لینک زیر یه نگاه بندازید ببینید مشکلتون برطرف میشه؟

    http://www.eca.ir/forum2/index.php?topic=18689.0

    موفق باشید .

    دوستان! مدتی کمتر به سایت میام ..

    دیدگاه


      #3
      پاسخ : SHT75 با AVR و C

      سلام
      آقا حتما باید از طریق i2c استفاده کرد؟نمیشه دیتا رو از طریق سریال ارسال کرد؟

      دیدگاه


        #4
        پاسخ : SHT75 با AVR و C

        سلام ..................

        ببینید به لینک زیر توجه کنید فکر کنم اون موقع جوابتون رو پیدا میکنید ...

        http://www.sensirion.co.jp/pdf/doc_c...7x_V4.1_C1.pdf

        موفق باشید .

        دوستان! مدتی کمتر به سایت میام ..

        دیدگاه


          #5
          پاسخ : SHT75 با AVR و C

          سلام من راش انداختم به خوبی جواب داد
          دارم لابرریش میکنم آماده بشه اینجا قرار میدم

          دیدگاه


            #6
            پاسخ : SHT75 با AVR و C

            سلام
            من هم دارم روی این سنسور کار می کنم . اما اگه دیتاشیت رو دقت کرده باشید نوشته کاملا سازگار با I2C نیست.
            باید حتما bitbang بشه.
            من به نتیجه رسیدم میزارم توی همین پست.

            :job:

            دیدگاه


              #7
              پاسخ : SHT75 با AVR و C

              ایم سنسور 2 حالت داره
              هم دما رو تشخیص میده هم رطوبت
              با i2c هم خروجی میده و دقت بسیار خوبی دار.
              سنسور های دیگه رطوبت با دقت خوب خروجیش تغییر ظرفیت خازنی هست و درایو کردنشون با دقت خوب خیلی عذاب آوره.این عالیه.
              درضمن این قطعه جزو قطعات شناسنامه داره.
              فقط یکم گرونه
              خدا گفت : به جهنم ببریدش، او برگشت و با تعجب به خدا نگاه کرد. خدا گفت : به بهشت ببریدش. فرشتگان پرسیدند: چرا؟! خدا گفت : او هنوز به من امیدوار است...

              دیدگاه


                #8
                پاسخ : SHT75 با AVR و C

                سلام دوستان
                sample برای راه اندازی shtxx ارائه شده از شرکت سازنده . www.sensirion.com

                http://www.sensirion.com/en/pdf/product_information/Sample_Code_humidity_sensor_SHTxx.pdf

                البته برای keil هست . با یکم تغییرات میتونید در cavr استفاده کنید. هنوز وقت روش نزاشتم.

                و یه نکته. دوستانی که می فرماین پروتکل ارتباطی i2c هست لطفا کمی بیشتر توضیح بدن چون من که با i2c کد میفرستم برای سنسور , ack و ... بر نمی گدونه.

                دیدگاه


                  #9
                  پاسخ : SHT75 با AVR و C

                  من برنامه کامل رو که برای میکروی مگا 16 و با codevision نوشتم

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


                  Project :
                  Version :
                  Date : 2008/12/06
                  Author : F4CG
                  Company : F4CG
                  Comments:


                  Chip type : ATmega16
                  Program type : Application
                  Clock frequency : 2.000000 MHz
                  Memory model : Small
                  External SRAM size : 0
                  Data Stack size : 256
                  ************************************************** ***/

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


                  SHT1X Humidity and Temperature Sensor
                  AVR
                  Pin 1 GND
                  Pin 2 Data (PB0)
                  Pin 3 Serial Clock (PB1)
                  Pin 4 VDD (2.4V to 5.5V)

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

                  #include <mega32.h>
                  #include <stdio.h>
                  #include <delay.h>
                  #include <math.h>
                  #include <stdlib.h>
                  // Alphanumeric LCD Module functions
                  #asm
                  .equ __lcd_port=0x1B
                  #endasm
                  #include <lcd.h>

                  // Declare your global variables here

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


                  enum {TEMP,HUMI};

                  sfrb PINB = 0x16;
                  sfrb PORTB = 0x18;
                  sfrb DDRB = 0x17;

                  #define SHT_DATA_OUT DDRB.0
                  #define SHT_DATA_IN PINB.0
                  #define SHT_SCK PORTB.1
                  #define noACK 0
                  #define ACK 1
                  //adr command r/w
                  #define STATUS_REG_W 0x06 //000 0011 0
                  #define STATUS_REG_R 0x07 //000 0011 1
                  #define MEASURE_TEMP 0x03 //000 0001 1
                  #define MEASURE_HUMI 0x05 //000 0010 1
                  #define RESET 0x1e //000 1111 0

                  const float C1=-4.0; // for 12 Bit
                  const float C2=+0.0405; // for 12 Bit
                  const float C3=-0.0000028; // for 12 Bit
                  const float T1=+0.01; // for 14 Bit @ 5V
                  const float T2=+0.00008; // for 14 Bit @ 5V

                  //SHT Functions
                  char SHT_WriteByte(unsigned char value);
                  char SHT_ReadByte(unsigned char ack);
                  void s_transstart(void);
                  void s_connectionreset(void);
                  char s_softreset(void);
                  char s_measure(unsigned char *p_value, unsigned char *p_checksum, unsigned char mode);
                  void calc_sth11(float *p_humidity ,float *p_temperature);
                  float calc_dewpoint(float h,float t);

                  unsigned char key=16,uch_TempTime_Number=0;
                  int intTemp1=0,intTime1=0,intTemp2=0,intTime2=0,intTem p3=0,intTime3=0;
                  int intTemp4=0,intTime4=0,intTemp5=0,intTime5=0,intTem p6=0,intTime6=0;






                  void print_temp_humy (void)
                  {
                  char str_hum_temp[10];

                  value humi_val, temp_val;
                  unsigned char error, checksum, status;
                  float dew_point;
                  error=0;
                  error+=s_measure((unsigned char*) &humi_val.i,&checksum,HUMI);
                  error+=s_measure((unsigned char*) &temp_val.i,&checksum,TEMP);
                  if(error!=0) s_connectionreset();
                  else{
                  humi_val.f=(float)humi_val.i; //converts integer to float
                  temp_val.f=(float)temp_val.i; //converts integer to float
                  calc_sth11(&humi_val.f,&temp_val.f); //calculate humidity, temperature
                  dew_point=calc_dewpoint(humi_val.f,temp_val.f); //calculate dew point
                  }
                  ftoa(temp_val.f,0,str_hum_temp);
                  lcd_clear();
                  lcd_putsf("Tempreature: "
                  lcd_puts(str_hum_temp);
                  ftoa(humi_val.f,0,str_hum_temp);
                  lcd_gotoxy(0,1);
                  lcd_putsf("Humydity: "
                  lcd_puts(str_hum_temp);
                  }

                  void main(void)
                  {
                  // Declare your local variables here




                  PORTA=0x00;
                  DDRA=0x00;
                  PORTB=0x00;
                  DDRB=0x00;

                  DDRC=0x0F;
                  PORTC=0xF0;

                  DDRD=0x0F;
                  PORTD=0xF0;

                  TCCR0=0x00;
                  TCNT0=0x00;
                  TCCR1A=0x00;
                  TCCR1B=0x00;
                  TCNT1H=0x00;
                  TCNT1L=0x00;
                  OCR1AH=0x00;
                  OCR1AL=0x00;
                  OCR1BH=0x00;
                  OCR1BL=0x00;
                  ASSR=0x08;
                  TCCR2=0x05;
                  TCNT2=0x00;
                  OCR2=0x00;
                  //GIMSK=0x00;
                  MCUCR=0x00;
                  TIMSK=0x40;
                  ACSR=0x80;

                  // Setup Sensibus Pins

                  PORTB.1 = 0; // ClockLow
                  DDRB.1 = 1; // SCK is an output

                  PORTB.0 = 0; // Always Zero
                  // Toggle DDRB.0 for Data

                  // LCD module initialization
                  lcd_init(16);

                  Start:

                  s_softreset();
                  print_temp_humy();

                  while (1)
                  {
                  delay_ms(500);
                  print_temp_humy();



                  goto Start;
                  }

                  }


                  //----------------------------------------------------------------------------------
                  // tulis byte ke SHT
                  //----------------------------------------------------------------------------------
                  char SHT_WriteByte(unsigned char value)
                  {
                  unsigned char i,error=0;
                  for (i=0x80;i>0;i/=2)
                  {
                  if (i & value) SHT_DATA_OUT=0;
                  else SHT_DATA_OUT=1;
                  SHT_SCK=1;
                  delay_us(5); //pulswith approx. 5 us
                  SHT_SCK=0;
                  }
                  SHT_DATA_OUT=0; //release DATA-line
                  SHT_SCK=1; //clk #9 for ack
                  error=SHT_DATA_IN; //check ack (DATA will be pulled down by SHT11)
                  SHT_SCK=0;
                  return error; //error=1 in case of no acknowledge
                  }

                  //----------------------------------------------------------------------------------
                  // baca byte dari SHT, dan berikan ACK
                  //----------------------------------------------------------------------------------
                  char SHT_ReadByte(unsigned char ack)
                  {
                  unsigned char i,val=0;
                  SHT_DATA_OUT=0; //release DATA-line
                  for (i=0x80;i>0;i/=2)
                  {
                  SHT_SCK=1;
                  if (SHT_DATA_IN) val=(val | i); //read bit
                  SHT_SCK=0;
                  }
                  SHT_DATA_OUT=ack; //in case of "ack==1" pull down DATA-Line
                  SHT_SCK=1; //clk #9 for ack
                  delay_us(5); //pulswith approx. 5 us
                  SHT_SCK=0;
                  SHT_DATA_OUT=0; //release DATA-line
                  return val;
                  }

                  //----------------------------------------------------------------------------------
                  // kondisi start
                  // _____ ________
                  // DATA: |_______|
                  // ___ ___
                  // SCK : ___| |___| |______
                  //----------------------------------------------------------------------------------
                  void s_transstart(void)
                  {
                  SHT_DATA_OUT=0;
                  SHT_SCK=0; //Initial state
                  delay_us(1);
                  SHT_SCK=1;
                  delay_us(1);
                  SHT_DATA_OUT=1;
                  delay_us(1);
                  SHT_SCK=0;
                  delay_us(5);
                  SHT_SCK=1;
                  delay_us(1);
                  SHT_DATA_OUT=0;
                  delay_us(1);
                  SHT_SCK=0;
                  }

                  //----------------------------------------------------------------------------------
                  // reset koneksi, 9 clock diikuti dengan kondisi start
                  // __________________________________________________ ___ ________
                  // DATA: |_______|
                  // _ _ _ _ _ _ _ _ _ ___ ___
                  // SCK : __| |__| |__| |__| |__| |__| |__| |__| |__| |______| |___| |______
                  //----------------------------------------------------------------------------------

                  void s_connectionreset(void)
                  {
                  unsigned char i;
                  SHT_DATA_OUT=0; SHT_SCK=0; //Initial state
                  for(i=0;i<9;i++) //9 SCK cycles
                  {
                  SHT_SCK=1;
                  delay_us(1);
                  SHT_SCK=0;
                  }
                  s_transstart(); //transmission start
                  }

                  //----------------------------------------------------------------------------------
                  // reset SHT-nya !!
                  //----------------------------------------------------------------------------------

                  char s_softreset(void)
                  {
                  unsigned char error=0;
                  s_connectionreset(); //reset communication
                  error+=SHT_WriteByte(RESET); //send RESET-command to sensor
                  return error; //error=1 in case of no response form the sensor
                  }

                  //----------------------------------------------------------------------------------
                  // pengukuran data
                  //----------------------------------------------------------------------------------
                  char s_measure(unsigned char *p_value, unsigned char *p_checksum, unsigned char mode)
                  {
                  unsigned error=0;
                  unsigned int i;

                  s_transstart(); //transmission start
                  switch(mode){ //send command to sensor
                  case TEMP : error+=SHT_WriteByte(MEASURE_TEMP); break;
                  case HUMI : error+=SHT_WriteByte(MEASURE_HUMI); break;
                  default : break;
                  }
                  for (i=0;i<65535;i++) if(SHT_DATA_IN==0) break; //wait until sensor has finished the measurement
                  if(SHT_DATA_IN) error+=1; // or timeout (~2 sec.) is reached
                  *(p_value+1) =SHT_ReadByte(ACK); //read the first byte (MSB)
                  *(p_value) =SHT_ReadByte(ACK); //read the second byte (LSB)
                  *p_checksum =SHT_ReadByte(noACK); //read checksum
                  return error;
                  }

                  //----------------------------------------------------------------------------------------
                  // hitung temperature [°C] and humidity [%RH]
                  // input : humi [Ticks] (12 bit)
                  // temp [Ticks] (14 bit)
                  // output: humi [%RH]
                  // temp [°C]
                  //----------------------------------------------------------------------------------------

                  void calc_sth11(float *p_humidity ,float *p_temperature)
                  {

                  //float rh=*p_humidity; // rh: Humidity [Ticks] 12 Bit
                  //float t=*p_temperature; // t: Temperature [Ticks] 14 Bit
                  float rh_lin; // rh_lin: Humidity linear
                  float rh_true; // rh_true: Temperature compensated humidity
                  float t_C; // t_C : Temperature [°C]

                  t_C=*p_temperature*0.01 - 40; //calc. temperature from ticks to [°C]
                  rh_lin=C3*(*p_humidity)*(*p_humidity) + C2*(*p_humidity) + C1; //calc. humidity from ticks to [%RH]
                  rh_true=(t_C-25)*(T1+T2*(*p_humidity))+rh_lin; //calc. temperature compensated humidity [%RH]
                  if(rh_true>100)rh_true=100; //cut if the value is outside of
                  if(rh_true<0.1)rh_true=0.1; //the physical possible range

                  *p_temperature=t_C; //return temperature [°C]
                  *p_humidity=rh_true; //return humidity[%RH]
                  }

                  //--------------------------------------------------------------------
                  // calculates dew point
                  // input: humidity [%RH], temperature [°C]
                  // output: dew point [°C]
                  //--------------------------------------------------------------------

                  float calc_dewpoint(float h,float t)
                  {
                  float logEx,dew_point;
                  logEx=0.66077+7.5*t/(237.3+t)+(log10(h)-2);
                  dew_point = (logEx - 0.66077)*237.3/(0.66077+7.5-logEx);
                  return dew_point;
                  }
                  اینم برنامه کامل پایه های دیتا و کلاک sht باید بره به پایه های یک و 2 میکرو و lcd هم به پورت d وصل کنید طبق دستور کد ویژن دیگه چیز خاصی نداره
                  سه کس را شنیدم که غیبت رواست وز این درگذشتی چهارم خطاست
                  یکی پادشاهی ملامت پسند کز او بر دل خلق بینی گزند
                  حلال است از او نقل کردن خبر مگر خلق باشند از او بر حذر
                  دوم پرده بر بی حیائی متن که خود میآ‌درد پرده بر خویشتن
                  ز حوضش مدار ای برادر نگاه که او میآ‌درافتد به گردن به چاه
                  سوم کژ ترازوی ناراست خوی ز فعل بدش هرچه دانی بگوی

                  دیدگاه


                    #10
                    پاسخ : SHT75 با AVR و C

                    راستی یادم رفت بگم این برنامه دما و رطوبت رو بدست میاره و روی lcd با فاصله حدود 500 میلی ثانیه نمایش میده راستی مقاومت pull up پایه 2 میکرو که وصل میشه به پایه دیتای shtxx یادتون نره بدم اون کار نخواهد کرد در ضمن کریستال رو حتما داخلی 2 مگا انتخاب کنید چون در غیر این صورت برنامه جواب نخواهد داد البته اگه ضرورت داره که کریستال خارجی یاداخلی با فرکانس دیگه ای استفاده بشه راهش وجود داره یه تغییر کوچولو باید توی نرم افزارش بدی اون باشه واسه بعد اگه لازم شد بگو برات توضیح میدم حله؟؟
                    سه کس را شنیدم که غیبت رواست وز این درگذشتی چهارم خطاست
                    یکی پادشاهی ملامت پسند کز او بر دل خلق بینی گزند
                    حلال است از او نقل کردن خبر مگر خلق باشند از او بر حذر
                    دوم پرده بر بی حیائی متن که خود میآ‌درد پرده بر خویشتن
                    ز حوضش مدار ای برادر نگاه که او میآ‌درافتد به گردن به چاه
                    سوم کژ ترازوی ناراست خوی ز فعل بدش هرچه دانی بگوی

                    دیدگاه


                      #11
                      پاسخ : SHT75 با AVR و C

                      #include <avr/io.h>
                      #include <stdlib.h>
                      #include <math.h>

                      #define DATA_REG_OUT DDRC|=_BV(PC7);
                      #define DATA_REG_IN DDRC&=~_BV(PC7);

                      #define SET_SCK PORTC|=_BV(PC6);
                      #define CLEAR_SCK PORTC&=~_BV(PC6);

                      #define SET_DATA PORTC|=_BV(PC7);
                      #define CLEAR_DATA PORTC&=~_BV(PC7);

                      #define noACK 0
                      #define ACK 1

                      //SHT7x commands
                      #define STATUS_REG_W 0x06 //000 0011 0
                      #define STATUS_REG_R 0x07 //000 0011 1
                      #define MEASURE_TEMP 0x03 //000 0001 1
                      #define MEASURE_HUMI 0x05 //000 0010 1
                      #define RESET 0x1e //000 1111 0

                      // SHTxx constants
                      #define C1 -4.0
                      #define C2 0.0405
                      #define C3 -0.0000028

                      #define D1 -40.0
                      #define D2 0.04

                      #define T1 0.01
                      #define T2 0.00008

                      ....
                      <LCD procedures>
                      ....

                      //SHT75

                      /************************************************** **************************/
                      // START TRANSMISSION
                      // _____ _________
                      // DATA: |_______|
                      // ___ ___
                      // SCK : ___| |___| |______
                      /************************************************** **************************/

                      void s_transstart(void)
                      {
                      DATA_REG_OUT; //DATA as output
                      asm("nop"
                      SET_DATA;
                      CLEAR_SCK;
                      asm("nop"
                      SET_SCK;
                      asm("nop"
                      CLEAR_DATA;
                      asm("nop"
                      CLEAR_SCK;
                      asm("nop"
                      SET_SCK;
                      asm("nop"
                      SET_DATA;
                      asm("nop"
                      CLEAR_SCK;
                      asm("nop"
                      }

                      /************************************************** **************************/
                      // WRITE BYTE
                      /************************************************** **************************/

                      unsigned char s_write_byte(unsigned char value)
                      {
                      unsigned char i, error=0;

                      DATA_REG_OUT; //DATA as output
                      CLEAR_SCK;

                      for (i=0x80;i>0; i/=2) //mask
                      {
                      if (( i & value ))
                      {
                      SET_DATA;
                      }
                      else
                      {
                      CLEAR_DATA;
                      }
                      SET_SCK;
                      asm("nop"
                      CLEAR_SCK;
                      }
                      DATA_REG_IN; //DATA as input
                      asm("nop"
                      SET_SCK;

                      //sprawdz ack
                      if(bit_is_set(PINC,7))
                      {
                      error=1;
                      }
                      if(bit_is_clear(PINC,7))
                      {
                      error=0;
                      }

                      asm("nop"
                      CLEAR_SCK;
                      return error; //error=1 if no ack from sht
                      }

                      /************************************************** **************************/
                      // READ BYTE
                      /************************************************** **************************/

                      unsigned char s_read_byte(unsigned char ack)

                      {
                      unsigned char i, val=0;

                      DATA_REG_IN; //DATA as input
                      for (i=0x80;i>0;i/=2) //mask
                      {
                      SET_SCK;

                      if (bit_is_set(PORTC,7))
                      {
                      val=((val | i)); //read bit
                      }

                      CLEAR_SCK;
                      }

                      DATA_REG_OUT; //DATA as output

                      if(ack==1)
                      {
                      CLEAR_DATA;
                      }
                      if(ack==0)
                      {
                      SET_DATA;
                      }

                      SET_SCK;
                      asm("nop"
                      CLEAR_SCK;
                      DATA_REG_IN; //DATA as input
                      return val;
                      }

                      //----------------------------------------------------------------------------------
                      // Communication reset: DATA=1 i 9 *SCK
                      // __________________________________________________ ___ ________
                      // DATA: |_______|
                      // _ _ _ _ _ _ _ _ _ ___ ___
                      // SCK : __| |__| |__| |__| |__| |__| |__| |__| |__| |______| |___| |______
                      //----------------------------------------------------------------------------------

                      void s_connectionreset(void)
                      {
                      unsigned char i;
                      DATA_REG_OUT;
                      SET_DATA;
                      CLEAR_SCK;
                      asm("nop"
                      for(i=0;i<9;i++)
                      {
                      SET_SCK;
                      asm("nop"
                      CLEAR_SCK;
                      }
                      s_transstart(); //start transmisji
                      }



                      /************************************************** **************************/
                      // MAIN
                      /************************************************** **************************/

                      int main (void)
                      {
                      int lValue_Temp,fTemp_true,i;
                      unsigned char byte_1,byte_2,a=5;
                      unsigned char temp[10];

                      DDRC=0xFF;
                      DDRA=0xFF;
                      DDRB=0x07;
                      DDRD=0x00;

                      for(i=0;i<10000;i++)
                      {
                      asm("nop"
                      }

                      s_connectionreset();

                      for(i=0;i<10000;i++)
                      {
                      asm("nop"
                      }

                      s_transstart();
                      a=s_write_byte(MEASURE_TEMP);

                      while(bit_is_set(PINC,7));


                      byte_1 = (unsigned char) s_read_byte(ACK);
                      byte_2 = (unsigned char) s_read_byte(ACK);
                      s_read_byte(noACK);

                      lValue_Temp = ((unsigned char)byte_1 * 256) + (unsigned char)byte_2;

                      fTemp_true = (D1+(D2*lValue_Temp))*100;


                      itoa(fTemp_true, temp, 10);


                      lcd_init();

                      write_text(temp);


                      return 0;
                      }//end main

                      دیدگاه


                        #12
                        پاسخ : SHT75 با AVR و C

                        سلام دوست گرامی
                        اگه میشه خواهش کنم برنامه رطوبت سنج رو با ****ام بگذارید آخه من بیچاره فقط با بیسکام بلدم تازه اونم مدت یک سالی بیش نیست!
                        ممنونم
                        قال امام صادق (ع):
                        هر چیزی زکاتی دارد و زکات علم آنست که به اهلش بیاموزی.

                        دیدگاه


                          #13
                          پاسخ : SHT75 با AVR و C

                          سلام من این برنامه رو تو avr stdio کامپایلش کردم این error ها رو داد
                          دلیلش چیه؟
                          Build started 29.8.2010 at 1831
                          avr-gcc -mmcu=atmega16 -Wall -gdwarf-2 -O0 -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wp,-M,-MP,-MT,sh.o,-MF,dep/sh.o.d -c ../sh.c -o sh.o
                          ../sh.c error: parse error before '...' token
                          ../sh.c error: parse error before "volatile"
                          ../sh.c error: parse error before "volatile"
                          ../sh.c:56: error: parse error before "volatile"
                          ../sh.c error: parse error before "volatile"
                          ../sh.c error: parse error before "volatile"
                          ../sh.c:62: error: parse error before "volatile"
                          ../sh.c error: parse error before "volatile"
                          ../sh.c error: parse error before "volatile"
                          ../sh.c error: parse error before '}' token
                          ../sh.c: In function `s_connectionreset':
                          ../sh.c:175: warning: implicit declaration of function `s_transstart'
                          ../sh.c: In function `main':
                          ../sh.c:225: warning: implicit declaration of function `lcd_init'
                          ../sh.c:227: warning: implicit declaration of function `write_text'
                          make: *** [sh.o] Error 1
                          Build failed with 11 errors and 3 warnings...

                          دیدگاه


                            #14
                            پاسخ : SHT75 با AVR و C

                            سلام من این برنامه رو تو codevision نوشتم این error ها رو میده هر کار میکنم حل نمیشه کسی میتونه کمکم کنه؟


                            #include <mega32.h>
                            #include <stdio.h>
                            #include <delay.h>
                            #include <math.h>
                            #include <stdlib.h>
                            // Alphanumeric LCD Module functions
                            #asm
                            .equ __lcd_port=0x1B
                            #endasm
                            #include <lcd.h>
                            typedef union
                            { unsigned int i;
                            float f;
                            } value;

                            //----------------------------------------------------------------------------------
                            // modul-var
                            //----------------------------------------------------------------------------------
                            enum {TEMP,HUMI};

                            #define DATA PORTB.1
                            #define SCK PORTB.0

                            #define noACK 0
                            #define ACK 1
                            //adr command r/w
                            #define STATUS_REG_W 0x06 //000 0011 0
                            #define STATUS_REG_R 0x07 //000 0011 1
                            #define MEASURE_TEMP 0x03 //000 0001 1
                            #define MEASURE_HUMI 0x05 //000 0010 1
                            #define RESET 0x1e //000 1111 0

                            //----------------------------------------------------------------------------------
                            char s_write_byte(unsigned char value)
                            //----------------------------------------------------------------------------------
                            // writes a byte on the Sensibus and checks the acknowledge
                            {
                            unsigned char i,error=0;
                            for (i=0x80;i>0;i/=2) //shift bit for masking
                            { //if (i & value) DATA=1; //masking value with i , write to SENSI-BUS
                            DATA=0; // else
                            SCK=1; //clk for SENSI-BUS
                            delay_us(5); //pulswith approx. 5 us
                            SCK=0;
                            }
                            DATA=1; //release DATA-line
                            SCK=1; //clk #9 for ack
                            error=DATA; //check ack (DATA will be pulled down by SHT11)
                            SCK=0;
                            return error; //error=1 in case of no acknowledge
                            }

                            //----------------------------------------------------------------------------------
                            char s_read_byte(unsigned char ack)
                            //----------------------------------------------------------------------------------
                            // reads a byte form the Sensibus and gives an acknowledge in case of "ack=1"
                            {
                            unsigned char i,val=0;
                            DATA=1; //release DATA-line
                            for (i=0x80;i>0;i/=2) //shift bit for masking
                            { SCK=1; //clk for SENSI-BUS
                            if (DATA) val=(val | i); //read bit
                            SCK=0;
                            }
                            DATA=!ack; //in case of "ack==1" pull down DATA-Line
                            SCK=1; //clk #9 for ack
                            delay_us(5); //pulswith approx. 5 us
                            SCK=0;
                            DATA=1; //release DATA-line
                            return val;
                            }

                            //----------------------------------------------------------------------------------
                            void s_transstart(void)
                            //----------------------------------------------------------------------------------
                            // generates a transmission start
                            // _____ ________
                            // DATA: |_______|
                            // ___ ___
                            // SCK : ___| |___| |______
                            {
                            DATA=1; SCK=0; //Initial state
                            #asm
                            nop
                            #endasm
                            SCK=1;
                            #asm
                            nop
                            #endasm
                            DATA=0;
                            #asm
                            nop
                            #endasm
                            SCK=0;
                            delay_us(5);
                            SCK=1;
                            #asm
                            nop
                            #endasm
                            DATA=1;
                            #asm
                            nop
                            #endasm
                            SCK=0;
                            }

                            //----------------------------------------------------------------------------------
                            void s_connectionreset(void)
                            //----------------------------------------------------------------------------------
                            // communication reset: DATA-line=1 and at least 9 SCK cycles followed by transstart
                            // __________________________________________________ ___ ________
                            // DATA: |_______|
                            // _ _ _ _ _ _ _ _ _ ___ ___
                            // SCK : __| |__| |__| |__| |__| |__| |__| |__| |__| |______| |___| |______
                            {
                            unsigned char i;
                            DATA=1; SCK=0; //Initial state
                            for(i=0;i<9;i++) //9 SCK cycles
                            { SCK=1;
                            SCK=0;
                            }
                            s_transstart(); //transmission start
                            }

                            //----------------------------------------------------------------------------------
                            char s_softreset(void)
                            //----------------------------------------------------------------------------------
                            // resets the sensor by a softreset
                            {
                            unsigned char error=0;
                            s_connectionreset(); //reset communication
                            error+=s_write_byte(RESET); //send RESET-command to sensor
                            return error; //error=1 in case of no response form the sensor
                            }

                            //----------------------------------------------------------------------------------
                            char s_read_statusreg(unsigned char *p_value, unsigned char *p_checksum)
                            //----------------------------------------------------------------------------------
                            // reads the status register with checksum (8-bit)
                            {
                            unsigned char error=0;
                            s_transstart(); //transmission start
                            error=s_write_byte(STATUS_REG_R); //send command to sensor
                            *p_value=s_read_byte(ACK); //read status register (8-bit)
                            *p_checksum=s_read_byte(noACK); //read checksum (8-bit)
                            return error; //error=1 in case of no response form the sensor
                            }

                            //----------------------------------------------------------------------------------
                            char s_write_statusreg(unsigned char *p_value)
                            //----------------------------------------------------------------------------------
                            // writes the status register with checksum (8-bit)
                            {
                            unsigned char error=0;
                            s_transstart(); //transmission start
                            error+=s_write_byte(STATUS_REG_W);//send command to sensor
                            error+=s_write_byte(*p_value); //send value of status register
                            return error; //error>=1 in case of no response form the sensor
                            }

                            //----------------------------------------------------------------------------------
                            char s_measure(unsigned char *p_value, unsigned char *p_checksum, unsigned char mode)
                            //----------------------------------------------------------------------------------
                            // makes a measurement (humidity/temperature) with checksum
                            {
                            unsigned error=0;
                            unsigned int i;

                            s_transstart(); //transmission start
                            switch(mode){ //send command to sensor
                            case TEMP : error+=s_write_byte(MEASURE_TEMP); break;
                            case HUMI : error+=s_write_byte(MEASURE_HUMI); break;
                            default : break;
                            }
                            for (i=0;i<65535;i++) if(DATA==0) break; //wait until sensor has finished the measurement
                            if(DATA) error+=1; // or timeout (~2 sec.) is reached
                            *(p_value) =s_read_byte(ACK); //read the first byte (MSB)
                            *(p_value+1)=s_read_byte(ACK); //read the second byte (LSB)
                            *p_checksum =s_read_byte(noACK); //read checksum
                            return error;
                            }
                            /*
                            void init_usart()
                            {
                            SCON = 0x52;
                            TMOD = 0x20;
                            TCON = 0x69;
                            TH1 = 0xfd;
                            }

                            */


                            //----------------------------------------------------------------------------------------
                            void calc_sth11(float *p_humidity ,float *p_temperature)
                            //----------------------------------------------------------------------------------------
                            // calculates temperature [°C] and humidity [%RH]
                            // input : humi [Ticks] (12 bit)
                            // temp [Ticks] (14 bit)
                            // output: humi [%RH]
                            // temp [°C]
                            { const float C1=-4.0; // for 12 Bit
                            const float C2=+0.0405; // for 12 Bit
                            const float C3=-0.0000028; // for 12 Bit
                            const float T1=+0.01; // for 14 Bit @ 5V
                            const float T2=+0.00008; // for 14 Bit @ 5V

                            float rh=*p_humidity; // rh: Humidity [Ticks] 12 Bit
                            float t=*p_temperature; // t: Temperature [Ticks] 14 Bit
                            float rh_lin; // rh_lin: Humidity linear
                            float rh_true; // rh_true: Temperature compensated humidity
                            float t_C; // t_C : Temperature [°C]

                            t_C=t*0.01 - 40; //calc. temperature from ticks to [°C]
                            rh_lin=C3*rh*rh + C2*rh + C1; //calc. humidity from ticks to [%RH]
                            rh_true=(t_C-25)*(T1+T2*rh)+rh_lin; //calc. temperature compensated humidity [%RH]
                            if(rh_true>100)rh_true=100; //cut if the value is outside of
                            if(rh_true<0.1)rh_true=0.1; //the physical possible range

                            *p_temperature=t_C; //return temperature [°C]
                            *p_humidity=rh_true; //return humidity[%RH]
                            }

                            //--------------------------------------------------------------------
                            float calc_dewpoint(float h,float t)
                            //--------------------------------------------------------------------
                            // calculates dew point
                            // input: humidity [%RH], temperature [°C]
                            // output: dew point [°C]
                            { float logEx,dew_point;
                            logEx=0.66077+7.5*t/(237.3+t)+(log10(h)-2);
                            dew_point = (logEx - 0.66077)*237.3/(0.66077+7.5-logEx);
                            return dew_point;
                            }

                            //----------------------------------------------------------------------------------
                            void main()
                            //----------------------------------------------------------------------------------
                            // sample program that shows how to use SHT11 functions
                            // 1. connection reset
                            // 2. measure humidity [ticks](12 bit) and temperature [ticks](14 bit)
                            // 3. calculate humidity [%RH] and temperature [°C]
                            // 4. calculate dew point [°C]
                            // 5. print temperature, humidity, dew point

                            {
                            value humi_val,temp_val;
                            float dew_point;
                            unsigned char error,checksum;
                            unsigned int i;


                            PORTA=0x00;
                            DDRA=0x00;
                            PORTB=0x00;
                            DDRB=0x00;

                            DDRC=0x0F;
                            PORTC=0xF0;

                            DDRD=0x0F;
                            PORTD=0xF0;

                            TCCR0=0x00;
                            TCNT0=0x00;
                            TCCR1A=0x00;
                            TCCR1B=0x00;
                            TCNT1H=0x00;
                            TCNT1L=0x00;
                            OCR1AH=0x00;
                            OCR1AL=0x00;
                            OCR1BH=0x00;
                            OCR1BL=0x00;
                            ASSR=0x08;
                            TCCR2=0x05;
                            TCNT2=0x00;
                            OCR2=0x00;
                            //GIMSK=0x00;
                            MCUCR=0x00;
                            TIMSK=0x40;
                            ACSR=0x80;

                            // Setup Sensibus Pins

                            PORTB.1 = 0; // ClockLow
                            DDRB.1 = 1; // SCK is an output

                            PORTB.0 = 0; // Always Zero
                            // Toggle DDRB.0 for Data

                            // LCD module initialization
                            lcd_init(16);

                            // init_usart();
                            s_connectionreset();
                            while(1)
                            { error=0;
                            error+=s_measure((unsigned char*) &humi_val.i,&checksum,HUMI); //measure humidity
                            error+=s_measure((unsigned char*) &temp_val.i,&checksum,TEMP); //measure temperature
                            if(error!=0) s_connectionreset(); //in case of an error: connection reset
                            else
                            { humi_val.f=(float)humi_val.i; //converts integer to float
                            temp_val.f=(float)temp_val.i; //converts integer to float
                            calc_sth11(&humi_val.f,&temp_val.f); //calculate humidity, temperature
                            dew_point=calc_dewpoint(humi_val.f,temp_val.f); //calculate dew point
                            printf("temp:%5.1fC humi:%5.1f%% dew point:%5.1fC\n",temp_val.f,humi_val.f,dew_poi nt);
                            }
                            //----------wait approx. 0.8s to avoid heating up SHTxx------------------------------
                            for (i=0;i<40000;i++); //(be sure that the compiler doesn't eliminate this line!)
                            //-----------------------------------------------------------------------------------
                            }
                            }



                            Warning: D:\micro\avr\project14\sht75.c(314): local variable 'humi_val' is used before it's value is set

                            Warning: D:\micro\avr\project14\sht75.c(314): local variable 'humi_val' is used before it's value is set
                            Error: D:\micro\avr\project14\sht75.c(46): invalid combination of type specifiers

                            دیدگاه


                              #15
                              پاسخ : SHT75 با AVR و C

                              ببخشید که این پست رو بعد از این همه مدت بالا آوردم ؛ من هم با این سنسور کار کردم و یه سری اشکالات تو برنامش داشت که برطرف کردم.
                              یکیش رو که دوستمون نوشتند، دیگریش هم عدم تطبیق با فرکانس های مختلف بود.

                              دانلود کد فایل به همراه شبیه سازی در پروتئوس ::» http://up.e89kntu.ir/do.php?filename=13482297361.zip
                              پسورد : www.e89kntu.ir

                              دیدگاه

                              لطفا صبر کنید...
                              X