اطلاعیه

Collapse
No announcement yet.

سوال در مورد راه اندازی سنسور رطوبت و دمای SHT75

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

    #16
    پاسخ : سوال در مورد راه اندازی سنسور رطوبت و دمای SHT75

    سلام دوست عزیز من برنامه شما رو آی سی پروگرام کردم ولی روی lcd هیچی نشون نمیده .... با proteus هم همینطور

    proteus 7.2
    bascom 1.11.9.0
    sht75

    دیدگاه


      #17
      پاسخ : سوال در مورد راه اندازی سنسور رطوبت و دمای SHT75

      دوستان این برنامه رو امتحان کنید. من جواب گرفتم:

      http://www.azhardari.mihanblog.com/post/188

      دیدگاه


        #18
        پاسخ : سوال در مورد راه اندازی سنسور رطوبت و دمای SHT75

        واقعا ممنونم منم به نتیجه رسیدم فقط چطوری میشه خطاشو کم کرد؟؟؟؟

        دیدگاه


          #19
          پاسخ : سوال در مورد راه اندازی سنسور رطوبت و دمای SHT75

          سلام من با کدویژن این سنسور رو راه اندازی کردم و ساختم و جواب گرفتم هرکسی مشکلی داره میل بزنه tel9700@gmail.com

          دیدگاه


            #20
            تنظیم فرکانس کاری و محاسبه کد تشخیص خطا CRC در سنسور SHT75

            سلام دوستان من این سنسورو اخیرن راه انداختم. خیلی دقتش بالاست. درضمن میشه با استفاده از خودش، سلامتی خودشو تست کرد! :eek:
            اطلاعات موجود در اینترنت برای راه اندازی ساده این سنسور کافیه. مواردی که من تو اینترنت گشتم و فقط زبان انگلیسی شونو دیدم اینجا در موردشون توضیح میدم که دوستان استفاده کنن. :nerd:
            البته این رو اضافه کنم که زبان برنامه نویسی مورد استفاده Codvision AVR هستش.

            این رو هم اضافه کنم که لینک زیر سایت مربوط به شرکت سازنده سنسور های خانواده SHT هستش. اگر در هر صورت در راه اندازی و یا دستور دادن به این سنسور دوچار مشکل شدید میتونید از این سایت کمک بگیرید.

            http://www.sensirion.com/en/products/humidity-temperature/download-center/

            1. فرکانس خط ارتباطی(SCK):
            تو دیتا شیت این سنسور نوشته برای ولتاژ بالای 4.5 ولت فرکانس میتونه بین ( 100 کیلو هرتز تا 5 مگا هرتز ) باشه.
            برای ولتاژ کمتر از 4.5 ولت فرکانس میتونه بین ( 100 کیلو هرتز تا 1 مگا هرتز ) باشه.
            نظر من رو اگه بخواین، من خودم با فرکانس 500 کیلو هرتز راش انداختم. خیلی هم خوب جواب میده.

            تو خیلی از کتابخانه هایی که برای این سنسور نوشته شده، برای ایجاد وقفه در 0 و 1 کردن پین SCK از دستور nop استفاده شده. به نمونه کد زیر دقت کنید:
            کد:
            //----------------------------------------------------------------------------------
            void s_transstart(void)
            //----------------------------------------------------------------------------------
            // generates a transmission start
            // _____ ________
            // DATA: |_______|
            // ___ ___
            // SCK : ___| |___| |______
            {
            DATA=1; SCK=0; //Initial state
            _nop_();
            SCK=1;
            _nop_();
            DATA=0;
            _nop_();
            SCK=0;
            _nop_();_nop_();_nop_();
            SCK=1;
            _nop_();
            DATA=1;
            _nop_();
            SCK=0;
            }
            ******مشکل: مشکل این نوع برنامه نویسی در اینه که با افزایش فرکانس کاری میکروکنترلر استفاده شده، فرکانس خط SCK هم زیاد میشه و در بیشتر مواقع از 5 مگاهرتز میگذره، که خوب باعث ایجاد اختلال و عدم پاسخ دهی سنسور میشه.
            *****رفع مشکل: برای رفع این مشکل به جای دستور nop از دستور دیلی(delay) استفاده کنید، به این صورت که به جای هر nop یک دیلی به میزان یک میکرو ثانیه قرار بدین.
            این کار باعث میشه که وابستگی مربوط به فرکانس کاری میکرو از بین بره. به نمونه کد زیر دقت کنید:
            کد:
            /****************************************************************************
            // START TRANSMISSION
            //    _____     _________
            // DATA:   |_______|
            //      ___   ___
            // SCK : _1_| 2 |_3_| 4 |__5___
            *****************************************************************************/
            
            void sht_start_trans(void)
            {
            DATA_PORT=0;
            DATA_DDR=0; //DATA as output
            
            SCK_PORT=0; delay_us(1);              //step 1
            SCK_PORT=1; delay_us(1); DATA_DDR=1; delay_us(1); //step 2
            SCK_PORT=0; delay_us(5);              //step 3
            SCK_PORT=1; delay_us(1); DATA_DDR=0; delay_us(1); //step 4
            SCK_PORT=0;                     //step 5
            }
            در این حالت فرکانس کاری پین SCK بر روی فرکانس 500 کیلو هرتز ثابت میمونه.
            من با این روش فرکانس میکرو رو روی 8، 4، 2، 1 مگاهرتز گذاشتم و جواب هم گرفتم.
            ++++++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++
            2. تجزیه و تحلیل کد تشخیص خطای CRC یا همان checksum:
            همون طوری که i2c این سنسور یه i2c اختصاصی هست، CRC این سنسور هم یک CRC اختصاصی هست که با استاندارد های جهانی یه خورده فرق داره.
            این کد CRC درصد خطا کردن رو تا 0.002% کاهش میده. یعنی در هر 100000 ارتباطی که با خطا مواجه میشن، تنها 2 تاشون واسه شما قابل شناسایی نیست! oo: پس به این سنسور اعتماد کنید و خیالتون راحت که محاسبات درسته!
            برای اینکه متوجه بشین کد تشخیص خطای CRC چگونه محاسبه میشه به دو لینک زیر یه سر بزنید و چند دقیقه وقت بزارید برای مطالعه اونا. :read:

            https://www.google.com/url?sa=t&rct=...95039771,d.ZGU
            http://ali-farrokhi.blogfa.com/tag/%...8%A7%D8%A1-crc

            خوب اگه این دوتا لینک رو خوب مطالعه کرده باشین این سوال واستون پیش میاد که Gx یا مقسوم علیه برای محاسبه این CRC چیه؟
            Gx ی که برای ایجاد کد تشخیص خطای این سنسور استفاده شده به صورت زیر هست:
            کد:
            X8+X5+X4+1
            که اگه بخوایم به صورت باینری بنویسیم میشه: 100110001 یا به صورت هگزا دسیمال میشه: 131
            خوب برای اینکه با روش ایجاد کد CRC توسط این سنسور آشنا بشین یک مثال میزنیم:
            فرض کنید شما میخواید دما رو اندازه بگیرید، برای این کار باید کد 00000011 به سنسور بفرستید و بعد دمای اندازه گیری شده توسط سنسور رو بخونید (این رو اضافه کنم که دقت اندازه گیری برای دما روی دقت 14 بیت تنظیم شده). که به صورت 8 بیت 8 بیت به میکرو ارسال میشه. که در این مثال من کد باینری 0001000110101100 ( هگزا دسیمال 11AC ) رو دریافت کردم. و بعد از اون کد CRC یا همون checksum توسط سنسور ارسال میشه. که در این مثال من کد باینری 10001011 ( هگزا دسیمال D1 ) دریافت کردم.
            در مورد این CRC یه توضیح کوچیک بدم که: این 8 بیت کد تشخیص خطایی است که از زمان ارسال 8 بیت 00000011 تا دریافت کد 14 بیتی 0001000110101100 شروع به تولید شدن میکنه، و این یعنی شما بعد از دریافت این کد میتونید بفهمید که سنسور دستور شما رو به درستی متوجه شده یا نه؟! و اینکه کمیت اندازه گیری شده صحیح هست یا نه؟! :eek: :NO:
            خوب برگردیم به محاسباتمون.
            برای به دست آوردن کد تشخیص خطا به صورت زیر عمل میکنیم، سپس CRC به دست آمده را معکوس یا revers میکنیم و با CRC ارسال شده توسط سنسور مقایسه مکنیم، اگر یکی بودند پس یعنی همه چی حله! اما اگه یکی نبودن باید کد باینری 1e یا 00011110 به سنسور ارسال کنیم(جهت ریست نمودن سنسور) و اندازی گیری را از سر بگیریم.
            در زیر روش محاسبه کد CRC در این مثال رو میبینید:

            https://www.dropbox.com/s/nawlueojbl...20CRC.PNG?dl=0

            نمونه کد Codevision AVR برای این محاسبات هم به صورت زیره:

            کد:
            /****************************************************************************/
            // SHTxx_CRC_checker
            /****************************************************************************/
            
            unsigned sht_crc_check(unsigned char command, unsigned char MSB, unsigned char LSB, unsigned char checksum, unsigned bytes)
            {
            unsigned long int i, data, polynomial;
            unsigned CRC[8], Checksum[8];
            unsigned char j;
            int k;
            
            if(bytes) {data=command; data=(data<<8)|MSB; data=(data<<8)|LSB; data=data<<8;}
            else   {data=command; data=(data<<8)|MSB;           data=data<<8;}
            
            polynomial=SHT_POLYNOMIAL<<23;
            
            for(i=0x80000000; i>0x80; i>>=1)   //caculate CRC
              {
              if(data & i) data=data^polynomial; //data XOR polynomial
              polynomial >>=1;
              }
            
            i=0;
            for(j=0x80; j>0; j>>=1)        //revers CRC
              {  
              if(j & data)   CRC[i]=1;
              else       CRC[i]=0;
              i++;
              }
            
            i=7;
            for(j=0x80; j>0; j>>=1)        //convert checksum to araye ---- none revers
              {  
              if(j & checksum) Checksum[i]=1;
              else       Checksum[i]=0;
              i--;
              }
            
            /*************************************Monitoring checksum caculation
            lcd_putsf("DATA  :");
            for(i=0x80; i>0; i>>=1) 
              if(i & data)   lcd_putsf("1");
              else       lcd_putsf("0");
            lcd_putsf("\n");
            
            lcd_putsf("AVR CRC:");
            for(k=7; k>=0; k--) 
              if(CRC[k])   lcd_putsf("1");
              else      lcd_putsf("0");
            lcd_putsf("\n");
            
            lcd_putsf("Sen CRC:");
            for(k=7; k>=0; k--) 
              if(Checksum[k])   lcd_putsf("1");
              else        lcd_putsf("0");
            lcd_putsf("\n");
            */
            
            for(k=7; k>=0; k--) if(Checksum[k] != CRC[k]) return 1; //checksum is false
            
            return 0;                        //checksum is true
            }
            دوستان دقت کنید برای معکوس کردن CRC باید از آرایه استفاده کنیم، با دستورات شیفت نمیشه این کار رو انجام داد!
            به یه نکته بسیار مهم هم دقت داشته باشید که در شبیه سازی پروتوس کد CRC به صورت معکوس نشده نمایش داده میشه. پیشنهاد بنده اینه که برای محاسبات CRC از پروتوس استفاده نکنید. به صورت عملی اقدام کنید!

            موفق باشید. اگر سوالی بود بنده در خدمتم. :nerd: :job:
            تو را دانش و دين نمايد درست در رستگاري ببايدت جست
            وگر دل نخواهي كه باشي نژند نخواهي كه دائم بوي مستمند
            به گفتار پيغمبرت راه جوي دل از تيرگي ها بدين آب شوي

            دیدگاه

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