اطلاعیه

Collapse
No announcement yet.

مشکل بخش ADC میکرو...!

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

    مشکل بخش ADC میکرو...!

    سلام به همه دوستان گـــــــل oo:
    امیدوارم حال همه خوب باشه...!
    یه سوال داشتم ممنون میشم کسی جواب بده...!
    راستش من با کدویژن یه برنامه ای رو برای میکرو نوشتم که پایه A.3 میکرو رو بخونه و به 0 تا 1023 تبدیل کنه....!
    این برنامه توی پرتئوس بخوبی کار میکنه ولی توی واقعیت همش صفر رو نشون میده....!
    مشکلش چیه؟؟؟

    کد:
    #include <mega16.h>
    #include <delay.h>
    #include <alcd.h>
    #include <stdio.h>
    interrupt [EXT_INT0] void ext_int0_isr(void)
    {
    
    }
    
    
    unsigned int read_adc(void)
    {
    ADMUX=(1<<REFS0)|(0<<REFS1);
    ADCSRA=0B111;// فرکانس
    ADCSRA|=(1<<ADEN);
    ADMUX|= 0b011;
    ADCSRA|=(1<<ADSC);
    while(ADCSRA & (1<<ADIF));
    ADCSRA=(0<<ADIF);
    return ADCW;
    
    }
    
    
    void main(void)
    {
    
    char b[16];
    DDRD.5=0;
    PORTD.5=1;
    
    // وقفه
    GICR|=0x40;
    MCUCR=0x02;
    MCUCSR=0x00;
    GIFR=0x40;
    #asm("sei")
    
    lcd_init(16);
    lcd_putsf("THE NAME OF GOD");
    delay_ms(1000);
    lcd_clear();
    
    
    lcd_putsf("start");
    delay_ms(1000);
    
    alio:
        lcd_clear(); 
    
        read_adc();
        delay_ms(1000);
        sprintf(b,"ADC= %d  ",ADCW);
        lcd_puts(b);
        lcd_gotoxy(0,0);
        delay_ms(1000);
    
    while (1)
       {
     if (PIND.5==0) goto alio;   
       
     }
    }
    وقفه هم الکی گذاشتم که بعدا ازش استفاده کنم....!
    فعلا کاری بهش نداریم....!
    توی وایل هم خواستم بیکار نباشه گفتم اگه فلان کلید رو زدم کد رو دوباره اجرا کن...!
    حالا بزرگان بگید مشکلش چیه؟؟؟!
    ممنون

    #2
    پاسخ : مشکل بخش ADC میکرو...!

    سلام
    شما توی خوندن ADC شماره مببدل رو مشخص نمیکنی.
    به این صورت بنویس
    sprintf (b,"ADC= %d ",read_adc(3));
    و فکر کنم به جای "d%" باید از "i%" استفاده کنی.
    ولی بهتره اینطوری بنویسی

    #include <mega16.h>
    #include <delay.h>
    #include <alcd.h>
    #include <stdio.h>


    unsigned int read_adc(void)
    {
    ADMUX = (1<<REFS0) | (0<<REFS1);
    ADCSRA = 0B111;
    ADCSRA |= (1<<ADEN);
    ADMUX |= 0b011;
    ADCSRA |= (1<<ADSC);
    while (ADCSRA & (1<<ADIF));
    ADCSRA = (0<<ADIF);


    return ADCW;
    }


    void main(void)
    {
    char b[16];


    DDRD.5 = 0;
    PORTD.5 = 1;


    GICR |= 0x40;
    MCUCR = 0x02;
    MCUCSR = 0x00;
    GIFR = 0x40;


    lcd_init (16);


    lcd_putsf ("THE NAME OF GOD"
    delay_ms (1000);
    lcd_clear();


    lcd_putsf ("start"
    delay_ms (1000);


    while (1)
    if (!PIND.5)
    {
    lcd_clear();
    read_adc();
    delay_ms (1000);
    sprintf (b, "ADC= %d ", read_adc(3));
    lcd_puts (b);
    lcd_gotoxy (0, 0);
    delay_ms (1000);
    }
    }موفق باشی
    شبنم از سعی به سرچشمه خورشید رسید صائب تبریزی

    دیدگاه


      #3
      پاسخ : مشکل بخش ADC میکرو...!

      ممنون از راهنماییت ولی من اینو void قرار داده بودم...!
      یعنی از قبل پایه اش رو انتخاب کرده بودم...!
      اما بازم اینی که گفتی رو انجام دادم ولی تو واقعیت جواب نمیگیرم.... همش صفر رو نشون میده
      یه کد دیگه هست که توی این سایته آموزش داده
      http://agd.ir/%D8%A2%D9%85%D9%88%D8%...87-%D8%AF.html
      من وقتی کدی که این سایت داده رو میریزم....
      توی پرتئوس خوب نشون میده اما تو واقعیت مثلا میزنه 500 بعدش میزنه 980 بعدش 20 کلا الکی انگار میزنه اختلافش خیلی زیاده... مثلا من وصل میکنم به 0 ولت میزنه 75 وصل میکنم به 5 ولت میزنه 900 این مشکلش چیه؟؟؟
      تورو خدا کمکم کنید!!
      مشکل از میکرو هست؟؟؟! کدویزاد مشکل داره؟؟؟
      قبلا کار میکرد ها....! :cry: :cry2:

      دیدگاه


        #4
        پاسخ : مشکل بخش ADC میکرو...!

        خواهش میکنم. لطفا اول کد پیشفرض کدویژن رو امتحان کنید و در صورت صحیح بودن تغییر کد بدید.
        مقادیر رجسترهای ADC رو هم به صورت پیشفرض بنویسید البته با توجه ولتاژ مرجعتون. که من در اینجا ننوشتم.
        تابع ADC در کدویژن به صورت زیره:

        unsigned int read_adc(unsigned char adc_input)
        {
        ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
        // Delay needed for the stabilization of the ADC input voltage
        delay_us(10);
        // Start the AD conversion
        ADCSRA|=0x40;
        // Wait for the AD conversion to complete
        while ((ADCSRA & 0x10)==0);
        ADCSRA|=0x10;
        return ADCW;
        }
        شبنم از سعی به سرچشمه خورشید رسید صائب تبریزی

        دیدگاه


          #5
          پاسخ : مشکل بخش ADC میکرو...!

          ممنون....!
          به صورت پیشفرض گذاشتم کـار کرد :applause:
          خیلی ممنون خوشحال شدم.... خیلی وقت بود داشتم بهش ور میرفتم..... :biggrin:
          تشکر....!

          یه مشکل دیگه

          آقا این مادون قرمز رو چطوری وصل کنم...؟

          از من اینجوریه دقیقا!!! دوتا پایه داره کلا هرکدومش!!

          کسی میدونه پایه ها چطوری وصل میشن به میکرو؟؟؟!

          کلا چطوری با زبون C یه برنامه بنویسم که گیرنده مادون قرمز رو فعال کنم؟؟!
          کسی کمک کنه ممنون میشم :redface: :rolleyes:

          دیدگاه


            #6
            پاسخ : مشکل بخش ADC میکرو...!

            سلام. خواهش میکنم. خوشحالم که حل شد. حالا تکه تکه برنامه رو تغییر بده تا به خط مشکل دار برسی.
            مادون قرمز فرستنده رو اول به صورت دائم وصل کن البته با یه مقاومت 1 کیلو. گیرنده رو هم همینطور البته با مقاومت 10 کیلو و فقط سراتصال مقاومت و دیود رو با یه مقاومت 100 اهم بده به بیس ترانزیستور NPN و امیتر به زمین و کلکتور
            مستقیم به پینی از میکرو که به صورت Pull-Up داخلی تنظیم شده و فرستنده رو بطور دستی خاموش و روشن کن و نتیجه رو با میکرو بخون و یه LED مستقیم به میکرو وصل کن تا هر موقع که میکرو فهمید روشنش کنه.
            مرحله بعد اینکه فرستنده رو با یه میکرو دیگه روشن خاموش کن و با میکرو گیرنده داده دریافت کن.
            اصول کار ریموت کنترل که خیلی سادست و میتونی کنترل تلویزیون رو هم باهاش آشکار کنی.
            موفق باشی.
            شبنم از سعی به سرچشمه خورشید رسید صائب تبریزی

            دیدگاه


              #7
              پاسخ : مشکل بخش ADC میکرو...!

              خیلی ممنون از جوابت...! oo:
              خوب پس من اول مادون قرمز فرستنده رو به صورت معمولی (مثل یه LED ساده) وصل مکینم به میکرو؟ درسته؟؟؟!
              خوب بعدش گیرنده،! کدوم پایه رو وصل کنم به میکرو (پایه منفی و یا مثبت)؟ آخه پایه اش باید خروجی باشه و پایه میکرو ورودی دیگه؟ نه؟؟؟؟
              فوقش من پایه منفی رو وصل میکنم به میکرو و پایه مثبت رو با یه مقاومت 10 کیلو اهم به 5 ولت میزنم!.... اونوقت من ترانزیستور رو خوب متوجه نشدم...! اصلا ترانزیستور نه دارم نه میدونم چیه؟ کلا دوسش ندارم :nerd: بدون ترانزیستور هم میشه؟!؟
              اصلا به چه کاریی میاد؟؟ اگه میشه توی سایت www.roboeq.ir همون ترانزیستور مورد نیاز رو آدرس بدید تا اگه لازمه بخرمش...!
              لطفا اگه زحمتی نیست یه نمونه کد با زبان C برای گیرنده و فرستنده مادون قرمز برام بنویس تا ببینم چطوریه!؟
              مــــــــمنــــون.....!
              پس من منتظرم...!

              دیدگاه


                #8
                پاسخ : مشکل بخش ADC میکرو...!

                خواهش میکنم.
                در مورد ترانزیستور توضیح کامل بدم: ترانزیستور قطعه خوبیه و خلاصه "تمام روشهای انسانی نظیر زرشک یخی ساخته تصور راوی" هست یا به انگلیسی ترانس رزیستور.
                برای تقویت جریان و سوییچ و ... استفاده میشه و به شدت کاربردی هست. مثلا وقتی یه رله رو میخواید با میکرو روشن کنید به صورت مستقیم میکرو نمیتونه اینکارو انجام بده چون
                جریاندهی پایینی داره. میکرو ترانزیستور رو راه اندازی میکنه و ترانزیستور رله رو.
                void main(void)
                {
                // input
                PORTD.6 = 1;
                DDRD.6 = 0;

                // output
                PORTD.0 = 0;
                DDRD.0 = 1;

                while (1)
                {
                if (!PIND.6)
                PORTD.0 = 0;
                else
                PORTD.0 = 1;
                }
                }

                شبنم از سعی به سرچشمه خورشید رسید صائب تبریزی

                دیدگاه

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