اطلاعیه

Collapse
No announcement yet.

اشکال در برنامه

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

    اشکال در برنامه

    با سلام
    من برنامه LM35
    پایین رو تو کدویژن نوشتم ولی تو پروتئوس که اجرا میکنم فقط عبارت TEMP= رو رو ال سی دی نمایش میده و دمای سنسور رو نشون نمیده
    اگه میشه راهنماییم کنیید
    #include <mega16.h>
    #include <delay.h>
    #include <stdio.h>
    #define xtal 1000000
    #include <lcd.h>

    #asm
    .equ __lcd_port=0x12 ;PORTD
    #endasm

    float t;

    unsigned int read_adc(unsigned char adc_input)
    {
    ADMUX=adc_input|c0;

    // Start the AD conversion
    ADCSRA|=0x40;

    // Wait for the AD conversion to complete
    while ((ADCSRA & 0x10)==0);
    ADCSRA|=0x10;
    return (ADCW/4);
    }

    void main(void)
    {
    char buffer[20];
    PORTA=0x00;
    DDRA=0x00;

    ADMUX=c0;
    ADCSRA=0x86;

    lcd_init(16);
    //lcd_clear();
    while (1)
    {
    t=read_adc(0);
    lcd_clear();
    sprintf(buffer,"TEMP=%f ",t);
    lcd_gotoxy(0,0);
    lcd_puts(buffer);
    delay_ms(1000);
    }
    }
    خرما نتوان خرد از این خار که کشتیم دیبا نتوان بافت از این پشم که رشتیم
    ما کشته نفسیم و بسی آه بر آید زما به قیامت که چرا نفس نکشتیم
    پیری و جوانی پی هم چون شبو روزاند چون شب شد و روز آمد و بیدار نگشتیم

    #2
    پاسخ : اشکال در برنامه

    با سلام
    خروجی ADC یک مقدار اعشاری نیست که شما از F برای نمایش مقادیر بر روی LCD استفاده کردید به نظرم جای F ، حرف d رو بنویسید و متغیر رو هم از نوع int تعریف کنید !

    دیدگاه


      #3
      پاسخ : اشکال در برنامه

      با سلام
      ما خروجی ADC رو تقسم بر چهار کردیم درنتیجه جواب اعشاری میشه همچنین %f برای برای نمایش عدد اعشاری به صورت ممیز با 6 رقم اعشار است.

      .
      .
      .
      ADCSRA|=0x10;
      return (ADCW/4);}

      void main(void)
      .
      .
      .
      خرما نتوان خرد از این خار که کشتیم دیبا نتوان بافت از این پشم که رشتیم
      ما کشته نفسیم و بسی آه بر آید زما به قیامت که چرا نفس نکشتیم
      پیری و جوانی پی هم چون شبو روزاند چون شب شد و روز آمد و بیدار نگشتیم

      دیدگاه


        #4
        پاسخ : اشکال در برنامه

        نوشته اصلی توسط qom86
        با سلام
        ما خروجی ADC رو تقسم بر چهار کردیم درنتیجه جواب اعشاری میشه همچنین %f برای برای نمایش عدد اعشاری به صورت ممیز با 6 رقم اعشار است.

        .
        .
        .
        ADCSRA|=0x10;
        return (ADCW/4);}

        void main(void)
        .
        .
        .
        حاصل اون تقسیم برابر با یک عدد Integer هست، برای تقسیم اعشاری هم صورت و هم مخرج باید عدد اعشاری یا Cast شده به حالت اعشاری باشند تا حاصل به صورت اعشاری به دست بیاد، حتی اگر حاصلش رو در یک متغییر اعشاری بریزید.
        مثلا:
        4.2/2 = 2 اما 4.2/2.0 = 2.1
        اسمایل، تومورو ویل بی وُرس

        دیدگاه


          #5
          پاسخ : اشکال در برنامه

          با سلام
          صحبتهای شما درست ولی تو برنامه زیر که دمای دو تا LM35 رو میخونه مقدار ADC رو بعد از تقسیم تو یه متغییر float میریزه بعد هم اونو رو LCD نمایش میده.

          #include <mega16.h>
          #include <lcd.h>
          #include <stdio.h>
          #include <delay.h>
          #define xtal 8000000

          #asm
          .equ __lcd_port=0x15 ;PORTC
          #endasm
          #define ADC_VREF_TYPE 0xC0

          float t0,t1;

          unsigned int read_adc(unsigned char adc_input){
          float t;
          ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
          delay_us(10);
          ADCSRA|=0x40;
          while ((ADCSRA & 0x10)==0);
          ADCSRA|=0x10;
          t=((ADCW*2.56)/10.23);
          return t;
          }

          void main(void){
          char buffer[32];
          lcd_init(16);
          SFIOR=0x00;
          ADMUX=ADC_VREF_TYPE & 0xff;
          ADCSRA=0x86;

          while (1){
          t0=read_adc(0);
          t1=read_adc(1);
          lcd_clear();
          sprintf(buffer,"T0=%f\nT1=%f",t0,t1);
          lcd_puts(buffer);
          delay_ms(100);
          }
          }
          خرما نتوان خرد از این خار که کشتیم دیبا نتوان بافت از این پشم که رشتیم
          ما کشته نفسیم و بسی آه بر آید زما به قیامت که چرا نفس نکشتیم
          پیری و جوانی پی هم چون شبو روزاند چون شب شد و روز آمد و بیدار نگشتیم

          دیدگاه


            #6
            پاسخ : اشکال در برنامه

            نوشته اصلی توسط qom86
            با سلام
            صحبتهای شما درست ولی تو برنامه زیر که دمای دو تا LM35 رو میخونه مقدار ADC رو بعد از تقسیم تو یه متغییر float میریزه بعد هم اونو رو LCD نمایش میده.

            #include <mega16.h>
            #include <lcd.h>
            #include <stdio.h>
            #include <delay.h>
            #define xtal 8000000

            #asm
            .equ __lcd_port=0x15 ;PORTC
            #endasm
            #define ADC_VREF_TYPE 0xC0

            float t0,t1;

            unsigned int read_adc(unsigned char adc_input){
            float t;
            ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
            delay_us(10);
            ADCSRA|=0x40;
            while ((ADCSRA & 0x10)==0);
            ADCSRA|=0x10;
            t=((ADCW*2.56)/10.23);
            return t;
            }

            void main(void){
            char buffer[32];
            lcd_init(16);
            SFIOR=0x00;
            ADMUX=ADC_VREF_TYPE & 0xff;
            ADCSRA=0x86;

            while (1){
            t0=read_adc(0);
            t1=read_adc(1);
            lcd_clear();
            sprintf(buffer,"T0=%f\nT1=%f",t0,t1);
            lcd_puts(buffer);
            delay_ms(100);
            }
            }
            اینجا 2 تا مشکل هست:

            اول اینکه مستقیما از متغییر ADCW در رابطه ضرب و تقسیم استفاده کردید که خودش float نیست. باید یک متغییر float تعریف کنید و ابتدا مقدار ADCW رو در اون بریزید و بعد در رابطه ضرب و تقسیم float به کار ببرید یا اینکه خود ADCW رو Cast به float کنید.
            دوم اینکه مقدار بازگشتی تابع read_adc رو از نوع float تعریف نکردید ولی متغییر t رو که از جنس float هست رو برگردوندید. :eek:
            اسمایل، تومورو ویل بی وُرس

            دیدگاه


              #7
              پاسخ : اشکال در برنامه

              نوشته اصلی توسط ژوپیتر
              اینجا 2 تا مشکل هست:

              اول اینکه مستقیما از متغییر ADCW در رابطه ضرب و تقسیم استفاده کردید که خودش float نیست. باید یک متغییر float تعریف کنید و ابتدا مقدار ADCW رو در اون بریزید و بعد در رابطه ضرب و تقسیم float به کار ببرید یا اینکه خود ADCW رو Cast به float کنید.
              دوم اینکه مقدار بازگشتی تابع read_adc رو از نوع float تعریف نکردید ولی متغییر t رو که از جنس float هست رو برگردوندید. :eek:
              با سلام
              ممنون از راهنمایتان
              در برنامه اول اگه متغییر و int تعریف کنم برنامه درست کار میکنه
              ولی با این وجود برنامه دوم هم درست کار میکنه میخوام ببینم چرا برنامه ی اول با همین دستورات درست کار نمیکرد.در هر دو برنامه متغییر ها از نوع float هستند و ADCW در هر دو برنامه در ضرب و تقسیم مستقیم استفاده شده.
              خرما نتوان خرد از این خار که کشتیم دیبا نتوان بافت از این پشم که رشتیم
              ما کشته نفسیم و بسی آه بر آید زما به قیامت که چرا نفس نکشتیم
              پیری و جوانی پی هم چون شبو روزاند چون شب شد و روز آمد و بیدار نگشتیم

              دیدگاه


                #8
                پاسخ : اشکال در برنامه

                ببینید دوست عزیز
                در زبان c انواع مختلف داده ها می تونند به هم تبدیل بشوند که این تبدیل از دو جهت قابل برسی هست :
                1-تبدیل انواع متغیرها در قالب عبارات محاسباتی
                2-تبدیل انواع متغیرها در قالب احکام انتسابی
                که در مورد تبدیل انواع در عبارات محاسباتی ایتن قانون حاکم هست که انواع کوچکتر به انواع بزرگتر تبدیل می شوند :
                اگر یکی از عملوند ها long double باشد، عملوند دیگر به long double تبدیل می شود.
                اگر یکی از عملوند ها double باشد، عملوند دیگر به double تبدیل می شود.
                اگر یکی از عملوند ها float باشد، عملوند دیگر به float تبدیل می شود.
                اگر یکی از عملوند هاunsigned long باشد، عملوند دیگر بهunsigned long تبدیل می شود.
                اگر یکی از عملوند ها long باشد، عملوند دیگر به long تبدیل می شود.
                اگر یکی از عملوند ها unsigned int باشد، عملوند دیگر به usigned int تبدیل می شود.
                توچه داشته باشید که اگر یکی از عملوندها مثلا از نوع long باشد و دیگری از نوع unsigned int باشد، ولی مقدار
                unsigned int نتواند توسط long نمایش داده شود ، هر دو عملوند به unsigned long تبدیل می شوند .
                اتفاقی که اینجا می افته به این ترتیب که :
                در برنامه اول : return (ADCW/4);
                adcw یک مقدار صحیح بوده که حداکثر مقدار اون برابر هست با 1024 که می تونه اشاره کنه به یک متغیر از نوع int
                و 4 هم یک عدد صحیح هست و می تونه اشاره کنه به یک متغیر از نوع char
                بنابراین طبق آنچه گفته شد حاصل عملیات فوق در یک متغیر از جنس int یا unsigned int قرار می گیرد و اگر باز این مقدار رو در یک متغیر از جنس float بریزیم فرقی در نوع جواب حاصل نمی شود چرا که جوا یک مقدار صحیح خواهد بود
                اما
                در برنامه دوم : t=((ADCW*2.56)/10.23);
                ADCWیک مقدار صحیح بوده که حداکثر مقدار اون برابر هست با 1024 که می تونه اشاره کنه به یک متغیر از نوع int
                ولی 2.56 به یک متغیر از نوع float اشاره می کنه پس نتیجه عبارت اول یک مقدار float خواهد بود و که با تقسیم بر 10.23 باز هم چون بزگرترین متغیر از نوع float هست مقدار عملیات یک مقدار float خواهد بود از طرفی t هم از نوع float بوده پس تابع همواره یک مقدار از نوع float رو برمی گردونه !



                دیدگاه

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