اطلاعیه

Collapse
No announcement yet.

مشکل در راه اندازی ds1820 با سون سگمنت

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

    مشکل در راه اندازی ds1820 با سون سگمنت

    با سلام من سنسور ds1820 رو با pic و سون سگمنت راه اندازی کرد
    دما رو درست نشون می ده ولی هر ثانیه چشمک می زنه باید چی کار کنم که چشمکش درست بشه
    این پروژه دانشگاهمه گیر کردم توش بدجور

    #2
    پاسخ : مشکل در راه اندازی ds1820 با سون سگمنت

    نوشته اصلی توسط Mojtababm66 نمایش پست ها
    با سلام من سنسور ds1820 رو با pic و سون سگمنت راه اندازی کرد
    دما رو درست نشون می ده ولی هر ثانیه چشمک می زنه باید چی کار کنم که چشمکش درست بشه
    این پروژه دانشگاهمه گیر کردم توش بدجور
    سلام
    سون سگمنت ها چشمک میزنن؟

    دیدگاه


      #3
      پاسخ : مشکل در راه اندازی ds1820 با سون سگمنت

      نوشته اصلی توسط hossein.m98 نمایش پست ها
      سلام
      سون سگمنت ها چشمک میزنن؟
      بله سون سگمنت ها چشمک می زنه با ccs برنامه رو نوشتم
      اعداد ثابت رو نشون می ده ولی مقدار دما رو به صورت چشمک زن نشون می ده

      دیدگاه


        #4
        پاسخ : مشکل در راه اندازی ds1820 با سون سگمنت

        نوشته اصلی توسط Mojtababm66 نمایش پست ها
        بله سون سگمنت ها چشمک می زنه با ccs برنامه رو نوشتم
        اعداد ثابت رو نشون می ده ولی مقدار دما رو به صورت چشمک زن نشون می ده
        سون سگمنت مالتی پلکس و داخل حلقه while راه اندازی شده دیگه؟
        اگر کد برنامه رو قرار بدید خیلی خوبه. هرچند من PIC کار نکردم ولی خوب برنامه رو ببینم شاید مشکل رو بفهمم. ضمنا اگر خواستید کدی قرار بدید، از تگ CPP استفاده کنید که در نوار بالایی ویرایگشر متن انجمن میبینیدش.

        دیدگاه


          #5
          پاسخ : مشکل در راه اندازی ds1820 با سون سگمنت

          نوشته اصلی توسط hossein.m98 نمایش پست ها
          سون سگمنت مالتی پلکس و داخل حلقه while راه اندازی شده دیگه؟
          اگر کد برنامه رو قرار بدید خیلی خوبه. هرچند من PIC کار نکردم ولی خوب برنامه رو ببینم شاید مشکل رو بفهمم. ضمنا اگر خواستید کدی قرار بدید، از تگ CPP استفاده کنید که در نوار بالایی ویرایگشر متن انجمن میبینیدش.
          #include <ds18b20.h>
          #include<1wire.c>
          #include <lcd.c>
          #include<DS1820.c>

          void main()
          {
          set_tris_a(0xff);
          set_tris_c(0xff);
          long int a,b,c,d,m,n,o;
          float e;
          //lcd_init();
          while(TRUE)
          {
          //long int h[]={ 0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F};
          int h[]={0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x83, 0xf8, 0x80, 0x98};
          output_high(pin_a2);
          m=ds1820_read();
          // m=126;
          a=m/100;
          b=m%100;
          c=b/10;
          d=b%10;
          //for(o=0;o<20;o++){
          for(n=0;n<10;n++)
          {
          output_low(pin_a0);
          output_high(pin_a2);
          output_high(pin_a1);
          //output_low(pin_a4);
          output_c(h[c]);
          delay_ms(1);
          }
          for(n=0;n<10;n++)
          {
          output_low(pin_a1);
          output_high(pin_a2);
          output_high(pin_a0);
          //output_low(pin_a4);
          output_c(h[a]);
          delay_ms(1);
          }
          for(n=0;n<10;n++)
          {
          output_low(pin_a2);
          output_high(pin_a1);
          output_high(pin_a0);
          //output_low(pin_a3);
          output_c(h[d]);
          delay_ms(1);
          }
          //}
          }



          }



          #ifndef ONE_WIRE_C
          #define ONE_WIRE_C

          /*
          * One wire (1-wire) driver for CCS C compiler. Suitable for use with devices
          * such as the DS18B20 1-wire digital temperature sensor.
          */

          #define ONE_WIRE_PIN PIN_A3

          /*
          * onewire_reset()
          * Description: Initiates the one wire bus.
          */
          // OK if just using a single permanently connected device
          void onewire_reset() {
          output_low(ONE_WIRE_PIN); // pull the bus low for reset
          delay_us(500);
          output_float(ONE_WIRE_PIN); // float the bus high
          delay_us(500); // wait-out remaining initialisation window
          output_float(ONE_WIRE_PIN);
          }


          /*
          * onewire_write(int8 data)
          * Arguments: a byte of data.
          * Description: writes a byte of data to the device.
          */
          void onewire_write(int8 data) {
          int8 count;

          for(count = 0; count < 8; ++count) {
          output_low(ONE_WIRE_PIN);
          delay_us(2); // pull 1-wire low to initiate write time-slot.
          output_bit(ONE_WIRE_PIN, shift_right(&data, 1, 0)); // set output bit on 1-wire
          delay_us(60); // wait until end of write slot.
          output_float(ONE_WIRE_PIN); // set 1-wire high again,
          delay_us(2); // for more than 1us minimum.
          }
          }

          /*
          * onewire_read()
          * Description: reads and returns a byte of data from the device.
          */
          int onewire_read() {
          int count, data;

          for(count = 0; count < 8; ++count) {
          output_low(ONE_WIRE_PIN);
          delay_us(2); // pull 1-wire low to initiate read time-slot.
          output_float(ONE_WIRE_PIN); // now let 1-wire float high,
          delay_us(8); // let device state stabilise,
          shift_right(&data, 1, input(ONE_WIRE_PIN)); // and load result.
          delay_us(120); // wait until end of read slot.
          }
          return data;
          }

          #endif /*ONE_WIRE_C*/


          #ifndef DS1820_C
          #define DS1820_C

          #include "1wire.c"

          float ds1820_read();
          void ds1820_configure(int8 TH, int8 TL, int8 config);

          /*
          * ds1820_read()
          * Description: reads the ds18x20 device on the 1-wire bus and returns
          * the temperature
          */

          float ds1820_read() {
          int8 busy=0, temp1, temp2;
          signed int16 temp3;
          float result;

          //ds1820_configure(0x00, 0x00, 0x00); //9 bit resolution

          onewire_reset();
          onewire_write(0xCC); //Skip ROM, address all devices
          onewire_write(0x44); //Start temperature conversion

          while(busy == 0) //Wait while busy (bus is low)
          busy = onewire_read();

          onewire_reset();
          onewire_write(0xCC); //Skip ROM, address all devices
          onewire_write(0xBE); //Read scratchpad
          temp1 = onewire_read();
          temp2 = onewire_read();
          temp3 = make16(temp2, temp1);

          //result = (float) temp3 / 2.0; //Calculation for DS18S20 with 0.5 deg C resolution
          result = (float) temp3 / 16.0; //Calculation for DS18B20

          delay_ms(200);
          return(result);
          }

          /*
          * ds1820_configure(int8 TH, int8 LH, int8 config)
          * Description: writes configuration data to the DS18x20 device
          * Arguments: alarm trigger high, alarm trigger low, configuration
          */

          void ds1820_configure(int8 TH, int8 TL, int8 config) {
          onewire_reset();
          onewire_write(0xCC); //Skip ROM, address all devices
          onewire_write(0x4E); //Write to scratchpad
          onewire_write(TH);
          onewire_write(TL);
          onewire_write(config);
          }

          #endif /*DS1820_C*/

          اینم برنامه با دو تا کتابخونه همراهش
          من اینو با lcd راه انداختم و جواب داد ولی با سگمنت چشمک می زنه

          دیدگاه


            #6
            پاسخ : مشکل در راه اندازی ds1820 با سون سگمنت

            نوشته اصلی توسط Mojtababm66 نمایش پست ها
            #include <ds18b20.h>
            #include<1wire.c>
            #include <lcd.c>
            #include<DS1820.c>

            void main()
            {
            set_tris_a(0xff);
            set_tris_c(0xff);
            long int a,b,c,d,m,n,o;
            float e;
            //lcd_init();
            while(TRUE)
            {
            //long int h[]={ 0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F};
            int h[]={0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x83, 0xf8, 0x80, 0x98};
            output_high(pin_a2);
            m=ds1820_read();
            // m=126;
            a=m/100;
            b=m%100;
            c=b/10;
            d=b%10;
            //for(o=0;o<20;o++){
            for(n=0;n<10;n++)
            {
            output_low(pin_a0);
            output_high(pin_a2);
            output_high(pin_a1);
            //output_low(pin_a4);
            output_c(h[c]);
            delay_ms(1);
            }
            for(n=0;n<10;n++)
            {
            output_low(pin_a1);
            output_high(pin_a2);
            output_high(pin_a0);
            //output_low(pin_a4);
            output_c(h[a]);
            delay_ms(1);
            }
            for(n=0;n<10;n++)
            {
            output_low(pin_a2);
            output_high(pin_a1);
            output_high(pin_a0);
            //output_low(pin_a3);
            output_c(h[d]);
            delay_ms(1);
            }
            //}
            }



            }



            #ifndef ONE_WIRE_C
            #define ONE_WIRE_C

            /*
            * One wire (1-wire) driver for CCS C compiler. Suitable for use with devices
            * such as the DS18B20 1-wire digital temperature sensor.
            */

            #define ONE_WIRE_PIN PIN_A3

            /*
            * onewire_reset()
            * Description: Initiates the one wire bus.
            */
            // OK if just using a single permanently connected device
            void onewire_reset() {
            output_low(ONE_WIRE_PIN); // pull the bus low for reset
            delay_us(500);
            output_float(ONE_WIRE_PIN); // float the bus high
            delay_us(500); // wait-out remaining initialisation window
            output_float(ONE_WIRE_PIN);
            }


            /*
            * onewire_write(int8 data)
            * Arguments: a byte of data.
            * Description: writes a byte of data to the device.
            */
            void onewire_write(int8 data) {
            int8 count;

            for(count = 0; count < 8; ++count) {
            output_low(ONE_WIRE_PIN);
            delay_us(2); // pull 1-wire low to initiate write time-slot.
            output_bit(ONE_WIRE_PIN, shift_right(&data, 1, 0)); // set output bit on 1-wire
            delay_us(60); // wait until end of write slot.
            output_float(ONE_WIRE_PIN); // set 1-wire high again,
            delay_us(2); // for more than 1us minimum.
            }
            }

            /*
            * onewire_read()
            * Description: reads and returns a byte of data from the device.
            */
            int onewire_read() {
            int count, data;

            for(count = 0; count < 8; ++count) {
            output_low(ONE_WIRE_PIN);
            delay_us(2); // pull 1-wire low to initiate read time-slot.
            output_float(ONE_WIRE_PIN); // now let 1-wire float high,
            delay_us(8); // let device state stabilise,
            shift_right(&data, 1, input(ONE_WIRE_PIN)); // and load result.
            delay_us(120); // wait until end of read slot.
            }
            return data;
            }

            #endif /*ONE_WIRE_C*/


            #ifndef DS1820_C
            #define DS1820_C

            #include "1wire.c"

            float ds1820_read();
            void ds1820_configure(int8 TH, int8 TL, int8 config);

            /*
            * ds1820_read()
            * Description: reads the ds18x20 device on the 1-wire bus and returns
            * the temperature
            */

            float ds1820_read() {
            int8 busy=0, temp1, temp2;
            signed int16 temp3;
            float result;

            //ds1820_configure(0x00, 0x00, 0x00); //9 bit resolution

            onewire_reset();
            onewire_write(0xCC); //Skip ROM, address all devices
            onewire_write(0x44); //Start temperature conversion

            while(busy == 0) //Wait while busy (bus is low)
            busy = onewire_read();

            onewire_reset();
            onewire_write(0xCC); //Skip ROM, address all devices
            onewire_write(0xBE); //Read scratchpad
            temp1 = onewire_read();
            temp2 = onewire_read();
            temp3 = make16(temp2, temp1);

            //result = (float) temp3 / 2.0; //Calculation for DS18S20 with 0.5 deg C resolution
            result = (float) temp3 / 16.0; //Calculation for DS18B20

            delay_ms(200);
            return(result);
            }

            /*
            * ds1820_configure(int8 TH, int8 LH, int8 config)
            * Description: writes configuration data to the DS18x20 device
            * Arguments: alarm trigger high, alarm trigger low, configuration
            */

            void ds1820_configure(int8 TH, int8 TL, int8 config) {
            onewire_reset();
            onewire_write(0xCC); //Skip ROM, address all devices
            onewire_write(0x4E); //Write to scratchpad
            onewire_write(TH);
            onewire_write(TL);
            onewire_write(config);
            }

            #endif /*DS1820_C*/

            اینم برنامه با دو تا کتابخونه همراهش
            من اینو با lcd راه انداختم و جواب داد ولی با سگمنت چشمک می زنه
            خوب یکمی تاخیر رقم ها رو زیاد انتخاب کردید. اون حلقه های for رو حذف کنید، احتمالا درست میشه. فکر کنم همون 1 میلی ثانیه کافی باشه.

            دیدگاه


              #7
              پاسخ : مشکل در راه اندازی ds1820 با سون سگمنت

              احتمالا موقع قرائت مقدار دما از سنسور تاخیر ایجاد میشه و سون سگمنت رفرش نمیشه. منم همچین مشکلی در بسکام داشتم و نتونستم تاخیر ۷۵۰ میلی ثانیه ای رو کم کنم.اگه کم کنیم مقدار خطا میخونه. اگه کسی راهکاری میدونه لطفا راهنمایی کنین.

              دیدگاه


                #8
                پاسخ : مشکل در راه اندازی ds1820 با سون سگمنت

                نوشته اصلی توسط kamal kasebi نمایش پست ها
                احتمالا موقع قرائت مقدار دما از سنسور تاخیر ایجاد میشه و سون سگمنت رفرش نمیشه. منم همچین مشکلی در بسکام داشتم و نتونستم تاخیر ۷۵۰ میلی ثانیه ای رو کم کنم.اگه کم کنیم مقدار خطا میخونه. اگه کسی راهکاری میدونه لطفا راهنمایی کنین.
                ببینید برای اطمینان از چشمک نزدن سون سگمنت ها، بهتره اسکن اون ها رو به عهده سرویس وقفه یک تایمر بذارید. به این صورت که برای هر سگمنت یک متغیر گلوبال در نظر میگیریم و داخل برنامه اصلی اون متغیر رو مقدار دهی میکنیم. توی سرویس وقفه تایمر، برنامه مقدار اون متغیر ها رو خونده و در زمان مناسب به سون سگمنت ها میده.

                دیدگاه


                  #9
                  پاسخ : مشکل در راه اندازی ds1820 با سون سگمنت

                  سلام دوستان
                  من مشکلم تا حدودی مرتفع شد ولی یه مشکل جدید دارم
                  اینکه مثلا زمانی که سنسور رو با یخ سرد می کنم تا زمانی که دمای یخ رو نشون بده حدودا 1 دقیقه طول میکشه که مدت زیادیه اینو باید چی کار کنم که تو چند ثانیه دمای یخ رو نشون بده؟
                  با lcd هم تست کردم زمانش حدودا 1 دقیقه بود فکر کنم کلا مشکل از سنسوره نه ؟
                  به نظرتون با تغییر کریستال درست میشه یا نه؟

                  دیدگاه


                    #10
                    پاسخ : مشکل در راه اندازی ds1820 با سون سگمنت

                    نوشته اصلی توسط Mojtababm66 نمایش پست ها
                    سلام دوستان
                    من مشکلم تا حدودی مرتفع شد ولی یه مشکل جدید دارم
                    اینکه مثلا زمانی که سنسور رو با یخ سرد می کنم تا زمانی که دمای یخ رو نشون بده حدودا 1 دقیقه طول میکشه که مدت زیادیه اینو باید چی کار کنم که تو چند ثانیه دمای یخ رو نشون بده؟
                    با lcd هم تست کردم زمانش حدودا 1 دقیقه بود فکر کنم کلا مشکل از سنسوره نه ؟
                    به نظرتون با تغییر کریستال درست میشه یا نه؟
                    توی برنامه که سنسور مدام در حال چک شدنه، پس مشکل نمیتونه نرم افزاری باشه. احتمالا خود سنسوره که مشکل داره.
                    تغییر کریستال (یا کلاک میکروکنترلر) هم تاثیری توی این مورد نخواهد داشت؛ چون سرعت ارتباط با سنسور وابسته به کلاک میکروکنترلر نیست.

                    دیدگاه

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