اطلاعیه

Collapse
No announcement yet.

سوال در مورد adc ده بیتی در atmega8

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

    سوال در مورد adc ده بیتی در atmega8

    با سلام و خسته نباشید خدمت دوستان
    من یک سوال در مورد نحوه استفاده از adc در میکرو Atmega8 داشتم
    من تا الان از 8 بیت این مبدل استفاده میکردم و موقع انتقال دیتا adc اون رو در یکی از پورت های 8 بیتی میکرو قرار میدادم
    ولی الان مجبورم از adc ده بیتی اون استفاده کنم و این مشکل رو دارم که چون تعداد پین های مورد نیازم ده عدد هست در حالی که هر پورت میکرو هشت پین بیشتر نداره چطور مقدار ده بیتی خروجی از adc رو به یکی از پورت های هشت بیتی میکرو بدم
    هدف کلیم اینه که مقدار Adc میکرو رو به یک dac ده بیتی بدم
    ممنون میشم راهنماییم کنین

    #2
    پاسخ : سوال در مورد adc ده بیتی در atmega8

    سلام
    ببین دوست عزیز مقدار ده بیتی adc تو دو رجیستر 8 بیتی به نام های ADCL و ADCH ذخیره میشن. حالا شما باید ببنینی که بیت های خروجی ADC رو راست چین کردی (Right Adjusted) یا چپ چین (Left Adjusted). برای فهمیدن باید بیت ADLAR که بیت شماره پنجم در رجیستر ADMUX هست رو چک کنی اگه صفر بود که راست چینه و اگه یک بود چپ چین. حالا این راست چین و چپ چین چه جورین به این صورتن که:
    اگه ADLAR=0:
    ADCL شامل بیت صفر تا هفت و ADCH شامل بیت 8 و 9 میشه.
    اگه ADLAR=1:
    ADCL شامل بیت صفر و یک و ADCH شامل بیت های 2 تا 9 میشه.

    پس کافیه مقدار این دو رجیستر رو بخونی و با توجه به مطالب بالا مقدار ده بیتی رو حساب کنی که برای هر حالت به صورت زیره.


    کد:
    ADLAR=0
    ADC=ADCH*256+ADCL
    و اگه
    کد:
    ADLAR=1
    ADC=ADCH*4+ADCL/64
    در ضمن میتونی از متغیر پیشفرض ADCW هم استفاده کنی که تو زبان C که من دارم استفاده میکنم مقدار adc ده بیتی رو به راحتی بهت میده. البته توجه کن که باید مقدار نهایی یعنی ADC یه مقدار 16 بیتی باشه.
    امیدوارم متوجه شده باشی
    موفق باشی
    در ضمن حواستون باشه که باید اول ADCL رو بخونین و بعد ADCH چون تا زمانی که ADCH رو نخوندین رجیستر پدیت نمیشه و مشکلی ندارین ولی اگه برعکس عمل کنین مممکنه رجیستر حین خوندن پدیت بشه و نتیجه اشتباهی رو بخونین. تو دیتاشیت اتمل به طور کامل این مقوله رو توضیح داده حتما بخونش

    دیدگاه


      #3
      پاسخ : سوال در مورد adc ده بیتی در atmega8

      شما دوست عزیز از این کد استفاده کن :bye
      PORTD=ADCW;
      PORTB=(ADCW>>8)
      ;
      خط اول 8 بیت اول رو روی پایه های PORTD نمایش میده
      خط دوم 8 بیت بالایی ADCW خروجی قرار میده

      دیدگاه


        #4
        پاسخ : سوال در مورد adc ده بیتی در atmega8

        الان مشکلی که هست اینه که من همونطور که گفتین بیت های adcl و adch رو دریافت کردم و با فرمول ADC=ADCH*256+ADCL تبدیل به یک رقم دیجیتال بین 0 الی 1024 اما بعد از عملیاتی که روی این مقدار دیجیتال انجام دادم میخوام اون رو تو پورت خروجی میکرو برای اعمال به یک dac ده بیتی قرار بدم ولی پورتهای میکرو هشت بیتی هست و این مقدار ده بیتی رو با دستور ساده مثلا PORTD=ADC نمیتونم قرار بدم
        الان سوال من اینه این مقدار ده بیتی رو چطور و به چه ترتیبی میتونم تو پورت های خروجی میکرو قرار بدم که از اونور به DAC ده بیتی بدمشون

        با تشکر فراوان

        دیدگاه


          #5
          پاسخ : سوال در مورد adc ده بیتی در atmega8

          سلام
          ببین دوست عزیز شما یه مقدار 10 بیتی داری و پورت های 8 بیتی پس اصولا باید ازدو پورت (یا بهتر بگم از ده پین) برای خروجی استفاده کنی.
          اول از همه سعی کن که خروجی رو روی پورتی که کانال های ADC روش تعریف شدن قرار ندی ، دلیلش اینکه موقع عملیات تبدیل نباید تغییرات دیجیتال روی پین های ADC صورت بگیره و من این رو گفتم چون نمیدونم کانفیگ ADC شما چطوره
          حالا پس شما باید بیای و 10 پین از میکرو رو که آزاد هستند به صورت خروجی تعریف کنی و مقدار این 10 بیت رو روی اون ها بریزی
          فرض که میخوای مقادیر رو روی پورت B و A بریزی به این صورت که دو بیت انتهایی یعنی 8 و9 (با فرض شمارش از صفر) رو بریزی روی B0 و B1
          فقط توجه کن که متغیر ADC به صورت INT یعنی 16 بیتی تعریف شده
          کد به این صورت میشه:
          کد:
          DDRA=0xff;
          DDRB=DDRB|0x03;
          PORTA=ADC;
          PORTB=PORTB|((ADC>>8)&0x03);
          تو خط اول اومدم A رو خروجی تعریف کردم
          تو خط بعدی دو پین ابتدایی B رو خروجی کردم ولی به کمک OR کاری کردم که کانفیگ بقیه پین ها تغییر نکنه.
          تو خط بعدی 8 بیت کم ارزش ADC رو روی A انداختم
          در انتها هم دو بیت پر ارزش ADC رو ابتدا 8 واحد شیفت دادم و سپس یه ماسکینگ زدم تا مشکلی برای سایر پین ها پیش نیاد.
          موفق باشی

          پ.ن: اگه فقط میخوای که مقدارADC تو خروجی بره و با مقدارش دیگه کاری نداری همون اول به جای اینکه مقدار رو ذخیره کنی دو رجیستر ADCHو ADCL رو بنداز تو خروجی
          این رو فکر کنم بتونی با نگاه به کد بالا و یه خورده تغییر انجام بدی

          دیدگاه


            #6
            پاسخ : سوال در مورد adc ده بیتی در atmega8

            نوشته اصلی توسط فرید الدین میرزایی
            سلام
            ببین دوست عزیز شما یه مقدار 10 بیتی داری و پورت های 8 بیتی پس اصولا باید ازدو پورت (یا بهتر بگم از ده پین) برای خروجی استفاده کنی.
            اول از همه سعی کن که خروجی رو روی پورتی که کانال های ADC روش تعریف شدن قرار ندی ، دلیلش اینکه موقع عملیات تبدیل نباید تغییرات دیجیتال روی پین های ADC صورت بگیره و من این رو گفتم چون نمیدونم کانفیگ ADC شما چطوره
            حالا پس شما باید بیای و 10 پین از میکرو رو که آزاد هستند به صورت خروجی تعریف کنی و مقدار این 10 بیت رو روی اون ها بریزی
            فرض که میخوای مقادیر رو روی پورت B و A بریزی به این صورت که دو بیت انتهایی یعنی 8 و9 (با فرض شمارش از صفر) رو بریزی روی B0 و B1
            فقط توجه کن که متغیر ADC به صورت INT یعنی 16 بیتی تعریف شده
            کد به این صورت میشه:
            کد:
            DDRA=0xff;
            DDRB=DDRB|0x03;
            PORTA=ADC;
            PORTB=PORTB|((ADC>>8)&0x03);
            تو خط اول اومدم A رو خروجی تعریف کردم
            تو خط بعدی دو پین ابتدایی B رو خروجی کردم ولی به کمک OR کاری کردم که کانفیگ بقیه پین ها تغییر نکنه.
            تو خط بعدی 8 بیت کم ارزش ADC رو روی A انداختم
            در انتها هم دو بیت پر ارزش ADC رو ابتدا 8 واحد شیفت دادم و سپس یه ماسکینگ زدم تا مشکلی برای سایر پین ها پیش نیاد.
            موفق باشی

            پ.ن: اگه فقط میخوای که مقدارADC تو خروجی بره و با مقدارش دیگه کاری نداری همون اول به جای اینکه مقدار رو ذخیره کنی دو رجیستر ADCHو ADCL رو بنداز تو خروجی
            این رو فکر کنم بتونی با نگاه به کد بالا و یه خورده تغییر انجام بدی
            خیلی ممنونم کمک خیلی بزرگی به من کردین

            دیدگاه

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