اطلاعیه

Collapse
No announcement yet.

دو بار خواندن از ADC !!!

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

    دو بار خواندن از ADC !!!

    سلام دوستان
    اولا بابت موضوع ببخشید نمدونستم چه چیزی از این بهتر بنویسم ! :biggrin:
    من یه سوالی داشتم که مربوط به adc هست ممنون میشم پاسخ بدید.
    من میخوام عددی رو که الان اینتراپت adc اتفاق میفته و برمیگردونه رو با دفعه بعدی که اینتراپت میشه رو با هم مقایسه کنم.چیکار باید بکنم .

    #2
    پاسخ : دو بار خواندن از ADC !!!

    دوتا متغیر تعریف میکنی مثلا متغیر هایی به اسم adc1وadc2
    adcرو بخون بعد بریز تو متغیر adc1 بعد دوباره همین کارو برا متغیر adc2میکنی...
    بعدش با یه دستور شرطی میای به میکرو میگی اگر مغییر adc1 کوچکتر از adc2هست (مثلا) رو السیدی بنویسه adc1 کوچکتره...
    بعد با یه دستور شرطی دیگه میای میکرو میگی که اگر adc2کوچک تر ازadc1 است مثلا رو السیدی بنویسه که adc2کوچکتره
    بعد بازم یه دستور شرطی مینویسی که اگر adc1و adc2برابرند روالسیدی بنویسه مساویند
    1 در دنیا 100 در آخرت (درس و مشق فعالیتمو تو انجمن کم کرده)
    من آنچه شرط بلاغست با تو میآ‌گویم. تو خواه از سخنم پند گیر و خواه ملال. سعدی
    !Electronic On! Programming On
    هوشمندانه سوال بپرسیم!
    http://ir02x6.persiangig.com/logo/eca/tanks_01.png

    دیدگاه


      #3
      پاسخ : دو بار خواندن از ADC !!!

      نوشته اصلی توسط mahan.rafiee
      دوتا متغیر تعریف میکنی مثلا متغیر هایی به اسم adc1وadc2
      adcرو بخون بعد بریز تو متغیر adc1 بعد دوباره همین کارو برا متغیر adc2میکنی...
      متغییر ها رو کجا باید بزارم ؟تو While ؟
      adc رو تو حالت اینتراپت چه جوری باید بخونم ؟
      هرچی فکر میکنم جایگیری متغییر ها چه جوری باشه نمیفهمم !
      من خروجی مادون قرمز رو به adc3 وصله وکردم و عدد تبدیل شده رو روی lcd نشون میده .
      برنامه ی قسمت مربوط به adc :
      interrupt [ADC_INT] void adc_isr(void)
      {

      a=ADCW;
      delay_ms(250);
      ADCSRA=0xCD;
      itoa(a,s);
      lcd_gotoxy(0,0);
      lcd_puts(s);
      lcd_putsf(" "

      }

      دیدگاه


        #4
        پاسخ : دو بار خواندن از ADC !!!

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

        در مورد کاری که می خواهید انجام بدید اول باید قبل از while بیت ADSC را در رجیستر ADCSRA یک کنید. وقتی تبدیل تمام شد برنامه وارد وقفه adc میشه . در اون جا شما باید یک متغیر که قبل از اینتراپت تعریف شده را برابر مقدار ADCW قرار بدید. بعد دوباره بیت ADSC را یک میکنید و در دفعه بعدی دوباره مقدار متغیر دیگری را برابر مقدار ADCW قرار بدید و در اینجا وقفه ADC را غیر فعال کنید. و داخل حلقه اصلی این دو متغیر را با هم دیگر مقایسه کنید.

        اگر واضح نیست بفرمایید تا کد بذارم.

        اگر هم می خواهید فقط یک مقدار را بخوانید فقط کافی است در وقفه ADC مقدار ADCW را داخل متغیر بریزید.همین!البته قبل از آن باید ADSC یک شده باشد.

        دیدگاه


          #5
          پاسخ : دو بار خواندن از ADC !!!

          اولا بابت پاسختون ممنونم . :-bd
          نوشته اصلی توسط sadeghmojtabaei
          اولا داخل اینتراپت هرگز چیزایی مثل نوشتن روی lcd ، delay واینجور چیزا استفاده نکنید. همه اینها را داخل حلقه اصلی برنامه بنویسید.
          نمیدونم چرا وقتی دستور های چاپ lcd رو تو while مینویسم جواب نمیده(البته یه خورده ور برم درستش میکنم)
          نوشته اصلی توسط sadeghmojtabaei
          در مورد کاری که می خواهید انجام بدید اول باید قبل از while بیت ADSC را در رجیستر ADCSRA یک کنید. وقتی تبدیل تمام شد برنامه وارد وقفه adc میشه . در اون جا شما باید یک متغیر که قبل از اینتراپت تعریف شده را برابر مقدار ADCW قرار بدید. بعد دوباره بیت ADSC را یک میکنید و در دفعه بعدی دوباره مقدار متغیر دیگری را برابر مقدار ADCW قرار بدید و در اینجا وقفه ADC را غیر فعال کنید. و داخل حلقه اصلی این دو متغیر را با هم دیگر مقایسه کنید.
          1-وقتی من ADCSRA رو برابر 0xc0 قرار میدم بیت ADSC هم یک میشود ،درسته؟با این وجود لازمه دوباره این بیت رو فعال کنم؟
          2-بیشتر اون قسمتی که زیرخط دار کردم رو متوجه نمیشم ، چه جوری تو یدونه وقفه یه بار ADCW رو تو یه متغییر و دفعه بعد تو یه متغییر دیگه بریزم؟
          3-اگه کد رو بزارید که شرمنده میکنید. #:S

          دیدگاه


            #6
            پاسخ : دو بار خواندن از ADC !!!

            1- بله این اتفاق می افته ولی ممکنه تنظیمات دیگه ADC تغییر کنه . اگر از کدویزارد استفاده می کنید بعد از تنظیمات اصلی یعنی دقیقا قبل از while(1) این کد را بنویسید:
            کد:
            ADCSRA|=0x40;
            2- اگر فقط دو مقدار است با یک متغیر کمکی این کار انجام میشه ولی اگر بیش از 2 مقدار است باید از آرایه استفاده کنید.
            3- کد وقفه به این صورت میشه:
            کد:
            unsigned char stat=0;
            unsigned int a=0,b=0;
            
            
            
            
            کد وقفه:
            
            if(stat==0)
            {
            a=ADCW;
            stat=1;
            ADCSRA|=0x40;
            }
            else if(stat==1)
            {
            b=ADCW;
            }

            دیدگاه

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