اطلاعیه

Collapse
No announcement yet.

نوشتن برنامه lm35 با وقفه ADC ؟

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

    #16
    پاسخ : نوشتن برنامه lm35 با وقفه ADC ؟

    نوشته اصلی توسط fmicro نمایش پست ها
    جناب باباتبار شکل رو قرار دادم مجدد روی برنامه کار کردم اما جواب نداد !
    طبق دیتاشیت تو مد free running وقفه نداریم،فقط اولین بار وقفه میده.
    بنابراین اگر میخواید از وقفه استفاده کنید یا باید از منابع تحریک استفاده کنید یا هر دفعه تو روال وقفه دوباره بیت ADSC رو یک کنید.
    من برنامتون رو اصلاح کردم و از لینک زیر میتونید ببینیدش.درضمن sprintf هم مشکل داشت.

    [آموزشی] کنترل رله با پیامک توسط sim800l
    [آموزشی] راه اندازی سنسورهای DHT11 و DHT22 با کدویژن
    [آموزشی] مدار عملی اتصال میکروفن خازنی به میکروکنترلر
    [آموزشی] آموزش نحوه راه اندازی میکروهای fmd
    صفحه اینستاگرام : ecdco_ir

    دیدگاه


      #17
      پاسخ : نوشتن برنامه lm35 با وقفه ADC ؟

      آقای مهندس الان مشکل نمایش حل شد اما دما رو صحیح نشون نمیده !!!!
      خدایا یکی بزرگترین آرزویهایم در این دنیا این است که همه مردم حالشان خوب باشد و احساس خوشبختی داشته باشند....

      دیدگاه


        #18
        پاسخ : نوشتن برنامه lm35 با وقفه ADC ؟

        نوشته اصلی توسط fmicro نمایش پست ها
        آقای مهندس الان مشکل نمایش حل شد اما دما رو صحیح نشون نمیده !!!!
        چون شما تبدیلات رو انجام ندادید.نمونه کدش زیاده،یه سرچ کنید پیدا میکنید.
        [آموزشی] کنترل رله با پیامک توسط sim800l
        [آموزشی] راه اندازی سنسورهای DHT11 و DHT22 با کدویژن
        [آموزشی] مدار عملی اتصال میکروفن خازنی به میکروکنترلر
        [آموزشی] آموزش نحوه راه اندازی میکروهای fmd
        صفحه اینستاگرام : ecdco_ir

        دیدگاه


          #19
          پاسخ : نوشتن برنامه lm35 با وقفه ADC ؟

          آقای مهندس تبدیلات رو انجام دادم اما مثلا دمای 16 رو نشون میده اما 17 نه بعد 18 رو نشون میده 19 نه !!!!!!
          #include <mega16.h>
          #include <stdio.h>
          #include <delay.h>

          // Alphanumeric LCD functions
          #include <alcd.h>

          // Declare your global variables here

          unsigned char adcdata[17];
          float temp;




          // Voltage Reference: AVCC pin
          #define ADC_VREF_TYPE ((0<<REFS1) | (1<<REFS0) | (1<<ADLAR))

          // ADC interrupt service routine
          interrupt [ADC_INT] void adc_isr(void)
          {
          // Read the 8 most significant bits
          // of the AD conversion result
          temp=ADCH*1.999999;
          sprintf(adcdata,"Temp=%f C",temp);
          lcd_gotoxy(0,0);
          lcd_puts(adcdata);
          ADCSRA |=(1<<ADSC);

          }

          void main(void)
          {

          // ADC initialization
          // ADC Clock frequency: 15/625 kHz
          // ADC Voltage Reference: AVCC pin
          // ADC Auto Trigger Source: Free Running
          // Only the 8 most significant bits of
          // the AD conversion result are used
          ADMUX=ADC_VREF_TYPE;
          ADCSRA=(1<<ADEN) | (1<<ADSC) | (0<<ADATE) | (0<<ADIF) | (1<<ADIE) | (1<<ADPS2) | (1<<ADPS1) | (0<<ADPS0);
          SFIOR=(0<<ADTS2) | (0<<ADTS1) | (0<<ADTS0);

          // SPI initialization
          // SPI disabled
          SPCR=(0<<SPIE) | (0<<SPE) | (0<<DORD) | (0<<MSTR) | (0<<CPOL) | (0<<CPHA) | (0<<SPR1) | (0<<SPR0);

          // TWI initialization
          // TWI disabled
          TWCR=(0<<TWEA) | (0<<TWSTA) | (0<<TWSTO) | (0<<TWEN) | (0<<TWIE);

          // Alphanumeric LCD initialization
          // Connections are specified in the
          // Project|Configure|C Compiler|Libraries|Alphanumeric LCD menu:
          // RS - PORTB Bit 0
          // RD - PORTB Bit 1
          // EN - PORTB Bit 2
          // D4 - PORTB Bit 4
          // D5 - PORTB Bit 5
          // D6 - PORTB Bit 6
          // D7 - PORTB Bit 7
          // Characters/line: 16
          lcd_init(16);

          // Global enable interrupts
          #asm ("sei")

          while (1);

          }
          خدایا یکی بزرگترین آرزویهایم در این دنیا این است که همه مردم حالشان خوب باشد و احساس خوشبختی داشته باشند....

          دیدگاه


            #20
            پاسخ : نوشتن برنامه lm35 با وقفه ADC ؟

            نوشته اصلی توسط fmicro نمایش پست ها
            آقای مهندس تبدیلات رو انجام دادم اما مثلا دمای 16 رو نشون میده اما 17 نه بعد 18 رو نشون میده 19 نه !!!!!!
            #include <mega16.h>
            #include <stdio.h>
            #include <delay.h>

            // Alphanumeric LCD functions
            #include <alcd.h>

            // Declare your global variables here

            unsigned char adcdata[17];
            float temp;




            // Voltage Reference: AVCC pin
            #define ADC_VREF_TYPE ((0<<REFS1) | (1<<REFS0) | (1<<ADLAR))

            // ADC interrupt service routine
            interrupt [ADC_INT] void adc_isr(void)
            {
            // Read the 8 most significant bits
            // of the AD conversion result
            temp=ADCH*1.999999;
            sprintf(adcdata,"Temp=%f C",temp);
            lcd_gotoxy(0,0);
            lcd_puts(adcdata);
            ADCSRA |=(1<<ADSC);

            }

            void main(void)
            {

            // ADC initialization
            // ADC Clock frequency: 15/625 kHz
            // ADC Voltage Reference: AVCC pin
            // ADC Auto Trigger Source: Free Running
            // Only the 8 most significant bits of
            // the AD conversion result are used
            ADMUX=ADC_VREF_TYPE;
            ADCSRA=(1<<ADEN) | (1<<ADSC) | (0<<ADATE) | (0<<ADIF) | (1<<ADIE) | (1<<ADPS2) | (1<<ADPS1) | (0<<ADPS0);
            SFIOR=(0<<ADTS2) | (0<<ADTS1) | (0<<ADTS0);

            // SPI initialization
            // SPI disabled
            SPCR=(0<<SPIE) | (0<<SPE) | (0<<DORD) | (0<<MSTR) | (0<<CPOL) | (0<<CPHA) | (0<<SPR1) | (0<<SPR0);

            // TWI initialization
            // TWI disabled
            TWCR=(0<<TWEA) | (0<<TWSTA) | (0<<TWSTO) | (0<<TWEN) | (0<<TWIE);

            // Alphanumeric LCD initialization
            // Connections are specified in the
            // Project|Configure|C Compiler|Libraries|Alphanumeric LCD menu:
            // RS - PORTB Bit 0
            // RD - PORTB Bit 1
            // EN - PORTB Bit 2
            // D4 - PORTB Bit 4
            // D5 - PORTB Bit 5
            // D6 - PORTB Bit 6
            // D7 - PORTB Bit 7
            // Characters/line: 16
            lcd_init(16);

            // Global enable interrupts
            #asm ("sei")

            while (1);

            }
            شما باید از فرمول زیر برای تبدیل استفاده کنید
            کد:
            temp=((5*100*temp)/255);
            که البته باز هم مشکلتون حل نمیشه چون lm35 به ازای هر درجه افزایش دما 10 میلی ولت خروجیش افزایش پیدا میکنه اما دقتadc 19 میلی ولته(5/256).این یعنی تا 1 درجه خطا داری که تو مدار واقعی ممکنه حتی بیشتر هم بشه.

            دلیل: ادغام دو پست برای جلوگیری از اسپم

            این مشکل رو میتونید با 10 بیتی کردن adc تا حد زیادی حل کنید.
            [آموزشی] کنترل رله با پیامک توسط sim800l
            [آموزشی] راه اندازی سنسورهای DHT11 و DHT22 با کدویژن
            [آموزشی] مدار عملی اتصال میکروفن خازنی به میکروکنترلر
            [آموزشی] آموزش نحوه راه اندازی میکروهای fmd
            صفحه اینستاگرام : ecdco_ir

            دیدگاه


              #21
              پاسخ : نوشتن برنامه lm35 با وقفه ADC ؟

              بله آقای مهندس باید ADC رو 10 بیتی بکنم یعنی ADCW . اما سوال آخر در این بحث این هست که الان فقط پایه ADC.0 یعنی پایه 40 سنسور رو میخونه خب الان اگر بخوام با این روش پایه ADC.1 یا بقیه رو بخونه چی باید بنویسم ؟
              temp=ADCW ؟؟
              خدایا یکی بزرگترین آرزویهایم در این دنیا این است که همه مردم حالشان خوب باشد و احساس خوشبختی داشته باشند....

              دیدگاه


                #22
                پاسخ : نوشتن برنامه lm35 با وقفه ADC ؟

                نوشته اصلی توسط fmicro نمایش پست ها
                بله آقای مهندس باید ADC رو 10 بیتی بکنم یعنی ADCW . اما سوال آخر در این بحث این هست که الان فقط پایه ADC.0 یعنی پایه 40 سنسور رو میخونه خب الان اگر بخوام با این روش پایه ADC.1 یا بقیه رو بخونه چی باید بنویسم ؟
                temp=ADCW ؟؟
                برای اینکه تو مد بیشتر از 8 بیت بخونید علاوه بر اینکه باید ADCW رو بخونید باید حتماً بیت ADLAR از رجیستر ADMUX رو صفر کنید تا چینش از راست باشه،واگرنه مقدار درست نشون نمیده.
                خود ADMUX هم برابر ADC_VREF_TYPE میباشد که به صورت #define تعریف شده:
                کد:
                [URL="https://www.eca.ir/forums/usertag.php?do=list&action=hash&hash=define"]#define[/URL]  ADC_VREF_TYPE ((0<<REFS1) | (1<<REFS0) | (0<<ADLAR)
                و برای اینکه بخواید از کانال های دیگه بخونید و یا به صورت دیفرانسیلی بخونید(اختلاف ولتاژ بین دو ورودی) باید بیت های MUX4..0 رو از رجیستر ADMUX تغییر بدید.
                اگر هم براتون سوال پیش اومده چرا تو بعضی مد های دیفرانسیلی دو تا کانال یکیه،برا به دست آوردن آفسته که میتونید در موردش تحقیق کنید.
                gain هم بهره تقویت هستش که میتونه اختلاف ولتاژ رو در اون عدد ضرب کرد.مثلاً اگر gain برابر 200x باشه و اختلاف ولتاژ دو ورودی 10 میلی ولت، خروجی برابر 2 ولت میشه.مواقعی که اختلاف ولتاژ خیلی کمه استفاده از بهره مناسبه.
                [آموزشی] کنترل رله با پیامک توسط sim800l
                [آموزشی] راه اندازی سنسورهای DHT11 و DHT22 با کدویژن
                [آموزشی] مدار عملی اتصال میکروفن خازنی به میکروکنترلر
                [آموزشی] آموزش نحوه راه اندازی میکروهای fmd
                صفحه اینستاگرام : ecdco_ir

                دیدگاه


                  #23
                  پاسخ : نوشتن برنامه lm35 با وقفه ADC ؟

                  درضمن تو فرمول temp هم به جای ۲۵۵ باید ۱۰۲۳ قرار بدید
                  [آموزشی] کنترل رله با پیامک توسط sim800l
                  [آموزشی] راه اندازی سنسورهای DHT11 و DHT22 با کدویژن
                  [آموزشی] مدار عملی اتصال میکروفن خازنی به میکروکنترلر
                  [آموزشی] آموزش نحوه راه اندازی میکروهای fmd
                  صفحه اینستاگرام : ecdco_ir

                  دیدگاه


                    #24
                    پاسخ : نوشتن برنامه lm35 با وقفه ADC ؟

                    خیر آقای مهندس منظورم اینه مثلا در حالات بدون وقفه ما با دستور read_adc(0) کانال صفر رو میخونیم و با با دستور read_adc(1) کانال یک رو میخونه حالا اگر بخوایم از وقفه استفاده کنیم (یعنی در این برنامه ) چطوری من کانال یک رو بخونم ؟
                    خدایا یکی بزرگترین آرزویهایم در این دنیا این است که همه مردم حالشان خوب باشد و احساس خوشبختی داشته باشند....

                    دیدگاه


                      #25
                      پاسخ : نوشتن برنامه lm35 با وقفه ADC ؟

                      نوشته اصلی توسط fmicro نمایش پست ها
                      خیر آقای مهندس منظورم اینه مثلا در حالات بدون وقفه ما با دستور read_adc(0) کانال صفر رو میخونیم و با با دستور read_adc(1) کانال یک رو میخونه حالا اگر بخوایم از وقفه استفاده کنیم (یعنی در این برنامه ) چطوری من کانال یک رو بخونم ؟
                      خب این یه تابع آمادست و همون کاری که من گفتمو براتون پیاده سازی میکنه.
                      فکر کنم میتونید از همین تابع هم تو وقفه استفاده کنید.در غیر اینصورت تو تابع وقفه کانال رو مشخص میکنید و وقفه بعدی مقدار اون کانال رو نمایش میده.
                      میتونید از دستورات شرطی استفاده کنید و هر دفعه یه کانال رو مشخص کنید.
                      حتی میتونید تو همون وقفه یه کانال دیگه رو بخونید(بدون ایجاد وقفه جدید)
                      [آموزشی] کنترل رله با پیامک توسط sim800l
                      [آموزشی] راه اندازی سنسورهای DHT11 و DHT22 با کدویژن
                      [آموزشی] مدار عملی اتصال میکروفن خازنی به میکروکنترلر
                      [آموزشی] آموزش نحوه راه اندازی میکروهای fmd
                      صفحه اینستاگرام : ecdco_ir

                      دیدگاه


                        #26
                        پاسخ : نوشتن برنامه lm35 با وقفه ADC ؟

                        چطوری اسم یک کانال دیگه رو بخونم ؟!! اسم یک کانال دیگه اینجا چیه ؟ ADCW.1 ؟؟؟
                        خدایا یکی بزرگترین آرزویهایم در این دنیا این است که همه مردم حالشان خوب باشد و احساس خوشبختی داشته باشند....

                        دیدگاه


                          #27
                          پاسخ : نوشتن برنامه lm35 با وقفه ADC ؟

                          نوشته اصلی توسط fmicro نمایش پست ها
                          چطوری اسم یک کانال دیگه رو بخونم ؟!! اسم یک کانال دیگه اینجا چیه ؟ ADCW.1 ؟؟؟


                          اینهمه بالا توضیح دادم پس چی بود؟؟؟
                          با تغییر بیت های mux0:4 از رجیستر ADMUX میتونید کانال رو تغییر بدید.
                          و بعد با خوندن ADCW اون کانال خونده میشه.
                          به نظرم شما از همون تابع read_adc(channel) استفاده کن.
                          [آموزشی] کنترل رله با پیامک توسط sim800l
                          [آموزشی] راه اندازی سنسورهای DHT11 و DHT22 با کدویژن
                          [آموزشی] مدار عملی اتصال میکروفن خازنی به میکروکنترلر
                          [آموزشی] آموزش نحوه راه اندازی میکروهای fmd
                          صفحه اینستاگرام : ecdco_ir

                          دیدگاه

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