اطلاعیه

Collapse
No announcement yet.

چگونه با ولوم Rotary Encoders کار کنیم؟ [آموزشی]

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

  • نو رسیده
    replied
    پاسخ : چگونه با ولوم Rotary Encoders کار کنیم؟ [آموزشی]

    با سلام
    بله. معمولا دارن.

    یک دیدگاه بنویسید:


  • dellfogostar
    replied
    پاسخ : چگونه با ولوم Rotary Encoders کار کنیم؟ [آموزشی]

    سلام این رو تاری های تو بازار کلید وسط فشاری داره؟

    یک دیدگاه بنویسید:


  • SAMAN.ASADI
    replied
    پاسخ : چگونه با ولوم Rotary Encoders کار کنیم؟ [آموزشی]

    نوشته اصلی توسط masoud_l66
    حالا چطوری از ظاهر بتونیم تشخیص بدیم که نوع اول یا دوم ؟؟؟؟ فروشنده ها هم که معمولا نمیشناسن قطعاتو
    درود
    اون رو دیگه باید از فرشنده سوال کنید ...
    اگر هم نمیدونست خودتون باید به فروشنده بگید که همونجا یه مالتی متر دیجیتالی بهتون بده و همون جا امتحانش کنید ...
    روش امتحان کردنش هم ساده است ...
    اگر پایه وسط به پایه 1 و 3 وصل نبود و در دندانه بعدی هم به همین شکل بود بدانید که نوع اول هست (دوره کامل در هر دندانه)
    اگر پایه وسط به هردو پایه دیگر وصل یا قطع بود و در دندانه بعدی مخالف این بود بدانید که نوع دوم است (نیم دوره در هر دندانه)
    نوع سوم هم بستگی داره به کدوم طرف بچرخونید ... ولی در کل این مراحل را دارا هستند:
    00 - 10 - 11 - 01 - 00
    حالا اگر به راست چرخش کنید اول 01 بعدش 11 و 10 و 00 ولی به چپ بروید برعکس این میشه ...

    موفق باشید

    یک دیدگاه بنویسید:


  • masoud_l66
    replied
    پاسخ : چگونه با ولوم Rotary Encoders کار کنیم؟ [آموزشی]

    حالا چطوری از ظاهر بتونیم تشخیص بدیم که نوع اول یا دوم ؟؟؟؟ فروشنده ها هم که معمولا نمیشناسن قطعاتو


    یک دیدگاه بنویسید:


  • ameen.kh
    replied
    پاسخ : چگونه با ولوم Rotary Encoders کار کنیم؟ [آموزشی]

    آقا خیلی شرمنده کردی، اینقد توجه لازم نبود به خدا راضی به زحمت نبودیم :biggrin: :biggrin: :biggrin:
    خیلی اطلاعات خوبی بود ،اون 3تا شکل از سه نوع روتاری خیلی خوب بود من نمیدونستم اینطوریه
    تاپیکم رو کامل بخونید متوجه می شوید که من در هیچ جای این تاپیک نگفته ام که این قطعات پالس درست میکنه ...
    من نگفتم پالس تولید میشه گفتم شکل مربعی نمیدن فقط تغییر لول دارن! :biggrin:
    اون مداری هم که میبینید به خاطر این هست که چون در پروتئوس این قطعه نداشتیم ، خواستم به صورت عملی تر شبیه سازی کنم ...
    تو پروتئوس libraryش رو گذاشتن بچه ها ولی از نوع 1 هست و باگ هم داره
    نه بابا ... این چه حرفیه ... اتفاقا" حال میکنم با این موج های منفی ... چون بادبادک وقتی بالا میره که با باد مخالف روبرو بشه !!!
    من اصلا قصد این کار رو نداشتم!!! موج منفی چرا؟؟؟
    دمت هم گرم میدونم کار پر زحمتی انجام دادی من قبلش هم تشکر کردم هم گفتم قصد جسارت ندارم :rolleyes:
    به هر حال مرسی از این توجه و مطالب مفیدی که گذاشتی :icon_razz:

    یک دیدگاه بنویسید:


  • SAMAN.ASADI
    replied
    پاسخ : چگونه با Rotary Encoders کار کنیم؟ [آموزشی]

    خیلی ممنون از اینکه نظرتون رو اعلام میکنید ...
    نوشته اصلی توسط ameen.kh
    فقط یه مساله ای هست ، اینکه روتاری هایی که توی بازار هستندطرز کارشون به این صورت نیست
    نمیدونم حالا اینایی که ما داریم اینطوریه یا همش :biggrin:
    ولی من چند مدل امتحان کردم و همش مثل هم بود
    :redface: پناه بر خدا ... مگه روتاری اینکدر شما چطوریه؟
    فقط قبل از اینکه بحثی صورت بگیره این رو لازم میدونم بگم ...
    سه نوع ولوم روتاری انکودر وجود داره که من خودم شخصا دو نمونه اول رو دیدم
    نوع اول که در این تاپیک کاملا بحث شده و بیشتر عمومی هست ...
    نوع دوم که همین دو هفته پیش رفتم تهران خریدم (برنامه آن ساده تره)
    و نوع سوم که ندیدم تا حالا ....
    دلیل این که میگید همه مثل هم بوده به خاطر اینه که با اهم متر فقط تستش کردید ...
    دوستان برای اینکه بهتر متوجه بشوید که شکل موج به چه صورتی هست و بهتر آن را درک کنید مدار زیر را ببندید و مشاهده کنید .
    مدار خیلی ساده ...
    خوب حالا خیلی آروم آروم ولوم رو بچرخونید و هر دفعه روی هر دندانه صبر کنید ...
    میبینید و مشاهده میکنید که شکل موج به چه صورتی است ... و از همه مهمتر بهتر درک میکنید ...
    حالا من خودم از نوع اول و دوم استفاده کردم و دیدم که با هم تفاوت دارند ...
    بگذریم ...
    نوشته اصلی توسط ameen.kh
    نمیدونم شما هم به صورت عملی تست کردی یا نه!
    بله ... جواب هم گرفتم ...
    نوشته اصلی توسط ameen.kh
    تو عمل ،روتاری پالسی نمیده! بلکه با هر تیک چرخش، هر دو خروجیش تغییر لول پیدا میکنن و این تغییر لول با یه اختلاف زمانی کوچکی انجام میشه.
    تاپیکم رو کامل بخونید متوجه می شوید که من در هیچ جای این تاپیک نگفته ام که این قطعات پالس درست میکنه ...
    اون مداری هم که میبینید به خاطر این هست که چون در پروتئوس این قطعه نداشتیم ، خواستم به صورت عملی تر شبیه سازی کنم ...
    نوشته اصلی توسط ameen.kh
    ولی تا یه تیک دیگه نچرخه، سطح ولتاژ خروجی به حالت قبلی بر نمیگرده!
    اون ولومی هم که شما خریدید از نوع دوم هست ...
    نوشته اصلی توسط ameen.kh
    برنامش هم اصلا پیچیده نیست، نه نیازی به هدر فایل داره نه به این همه روش های مختلف واسه دیبانس!
    من فقط روش سخت افزاری رو پیشنهاد دادم ... که دلیل اون هم همونطور که میدونید اگر مدار دیبانس گذاشته نشه برنامه چندبار به روتین وقفه رفته واین باعث میشود که پردازش بیشتر صورت گیرد ... ولی اگر مدار دیبانس بگذاریم فقط یکبار به روتین مربوطه می رود ...
    نوشته اصلی توسط ameen.kh
    البته من چون خودم تو عمل ازش به خوبی جواب گرفتم اینو میگم وگرنه اصلا قصد جسارت ندارم :biggrin: :biggrin: :biggrin:
    نه بابا ... این چه حرفیه ... اتفاقا" حال میکنم با این موج های منفی ... چون بادبادک وقتی بالا میره که با باد مخالف روبرو بشه !!!
    نوشته اصلی توسط ameen.kh
    میخواستم با اجازتون کد خودمو بذارم واسه اونایی که قصد دارن تو عمل استفادش کنن ولی درست جواب نگرفتن!
    فقط کافیه این یه تیکه رو با یه سری معرفی ها (در حد 3-4 خط) تو برنامه اضافه کنن.همین!
    خواهش میکنم ... صاحب اجازه هستید عزیز ...
    نوشته اصلی توسط ameen.kh
    توضیح برنامه :
    من با یه مگا128 کار میکنم که واسه انکودر وقفه خارجیش رو تو حالت anychange فعال کردم و یکی از خروجی های انکودر رو به این وقفه وصل کردم و خروجی دیگش رو به یه پایه دلخواه( اینجا من وقفه رو روی PE.4 و پایه دلخواهمو PE.7 در نظر گرفتم)
    هر تیک چرخش و تغییر سطح در خروجی انکودر(که به وقفه خارجی وصله) وقفه رو فعال میکنه.
    به خاطر اختلاف زمانی که دو خروجی با هم دارن، بسته به اینکه روتاری از کدوم طرف چرخیده باشه اون دوتا پایه مقادیر مختلفی نسبت به هم میتونن داشته باشن
    تو لحظه ای که وقفه اتفاق می افته PORTE رو روی یه متغیر save میکنم که اون حالت اولیه رو از دست ندم
    بعد اون دوتا بیت که مربوط به پایه های خروجی انکودر هست رو جدا میکنم
    بعد چک میکنم که از کدوم طرف چرخیده و بنا به نتیجش متغیر rotary رو کم یا زیاد میکنم
    کد:
    interrupt [EXT_INT4] void ext_int4_isr(void){
        pe_save=PINE;
        pe_save&=0x90;
        if(pe_save==0x80 || pe_save==0x10) {
          ++rotary;
          return;
          }
        if(pe_save==0x90 || pe_save==0x00){
          --rotary;
          return;
          }
        }
    تنها تغییری که شما باید تو برنامه بدین اینه :
    1- دوتا متغیر pe_save و rotary رو تعریف کنین
    2- تنظیمات رجیسترهای مربوط به وقفه خارجی رو روی حالت anychange انجام بدین (فقط یک وقفه کافیه)
    3- اگه از میکروی دیگه ای استفاده میکنین اسم پورت و شماره پایه وقفه عوض میشه

    اگه متوجه توضیحاتم نشدین بگین تا بیشتر توضیح بدم :biggrin:
    البته من هنوز این تاپیک رو کامل نکرده بودم ... ولوم نوع دوم رو از بازار خریدم و میخواستم برنامه اون رو بگذارم که شما دیگه پیش دستی کردید ...
    انشالله وقت کردم کاملترش هم میکنم ...
    ممنون

    موفق و پاینده باشید

    یک دیدگاه بنویسید:


  • ameen.kh
    replied
    پاسخ : چگونه با Rotary Encoders کار کنیم؟ [آموزشی]

    آقای اسدی عزیز سلام و دستت درد نکنه بابت مطالب مفیدی که گذاشتی
    فقط یه مساله ای هست ، اینکه روتاری هایی که توی بازار هستندطرز کارشون به این صورت نیست
    نمیدونم حالا اینایی که ما داریم اینطوریه یا همش :biggrin:
    ولی من چند مدل امتحان کردم و همش مثل هم بود
    نمیدونم شما هم به صورت عملی تست کردی یا نه!
    تو عمل ،روتاری پالسی نمیده! بلکه با هر تیک چرخش، هر دو خروجیش تغییر لول پیدا میکنن و این تغییر لول با یه اختلاف زمانی کوچکی انجام میشه.
    ولی تا یه تیک دیگه نچرخه، سطح ولتاژ خروجی به حالت قبلی بر نمیگرده!
    برنامش هم اصلا پیچیده نیست، نه نیازی به هدر فایل داره نه به این همه روش های مختلف واسه دیبانس!
    البته من چون خودم تو عمل ازش به خوبی جواب گرفتم اینو میگم وگرنه اصلا قصد جسارت ندارم :biggrin: :biggrin: :biggrin:

    میخواستم با اجازتون کد خودمو بذارم واسه اونایی که قصد دارن تو عمل استفادش کنن ولی درست جواب نگرفتن!
    فقط کافیه این یه تیکه رو با یه سری معرفی ها (در حد 3-4 خط) تو برنامه اضافه کنن.همین!
    توضیح برنامه :
    من با یه مگا128 کار میکنم که واسه انکودر وقفه خارجیش رو تو حالت anychange فعال کردم و یکی از خروجی های انکودر رو به این وقفه وصل کردم و خروجی دیگش رو به یه پایه دلخواه( اینجا من وقفه رو روی PE.4 و پایه دلخواهمو PE.7 در نظر گرفتم)
    هر تیک چرخش و تغییر سطح در خروجی انکودر(که به وقفه خارجی وصله) وقفه رو فعال میکنه.
    به خاطر اختلاف زمانی که دو خروجی با هم دارن، بسته به اینکه روتاری از کدوم طرف چرخیده باشه اون دوتا پایه مقادیر مختلفی نسبت به هم میتونن داشته باشن
    تو لحظه ای که وقفه اتفاق می افته PORTE رو روی یه متغیر save میکنم که اون حالت اولیه رو از دست ندم
    بعد اون دوتا بیت که مربوط به پایه های خروجی انکودر هست رو جدا میکنم
    بعد چک میکنم که از کدوم طرف چرخیده و بنا به نتیجش متغیر rotary رو کم یا زیاد میکنم
    کد:
    interrupt [EXT_INT4] void ext_int4_isr(void){
        pe_save=PINE;
        pe_save&=0x90;
        if(pe_save==0x80 || pe_save==0x10) {
          ++rotary;
          return;
          }
        if(pe_save==0x90 || pe_save==0x00){
          --rotary;
          return;
          }
        }
    تنها تغییری که شما باید تو برنامه بدین اینه :
    1- دوتا متغیر pe_save و rotary رو تعریف کنین
    2- تنظیمات رجیسترهای مربوط به وقفه خارجی رو روی حالت anychange انجام بدین (فقط یک وقفه کافیه)
    3- اگه از میکروی دیگه ای استفاده میکنین اسم پورت و شماره پایه وقفه عوض میشه

    اگه متوجه توضیحاتم نشدین بگین تا بیشتر توضیح بدم :biggrin:

    یک دیدگاه بنویسید:


  • شاهرخ مستقیمی
    replied
    پاسخ : چگونه با Rotary Encoders کار کنیم؟ [آموزشی]

    فکر کنم روتاری انکدر یا روتاری سوئیچ (ولوم هرزگرد قدیم!! :mrgreen: ) خوب باشه!

    یک دیدگاه بنویسید:


  • SAMAN.ASADI
    replied
    پاسخ : چگونه با Rotary Encoders کار کنیم؟ [آموزشی]

    نوشته اصلی توسط شاهرخ مستقیمی
    سلام.
    یه خرده دیره واسه جواب دادن، ولی خواستم بگم نسخه ی راه اندازی روتاری سوئیچ با میکرو PIC هم داریم واسه متقاضیان! :nerd:

    راه اندازی روتاری سوئیچ(ولوم هرزگرد) با PIC16F628A

    منم اسم تاپیک رو عوض کنم یا همین خوبه؟
    سلام
    ممنون که لینک دادید
    والا همونطور که مشاهده کردید عنوان تاپیک تقریبا مثل شما بود ولی به دلیل پیشنهاد دوستان اون رو عوض کردم ...
    فکر کنم این اسم مناسبتر باشه
    Volume Rotary Encoder
    نظر شما چیه؟

    یک دیدگاه بنویسید:


  • شاهرخ مستقیمی
    replied
    پاسخ : چگونه با Rotary Encoders کار کنیم؟ [آموزشی]

    سلام.
    یه خرده دیره واسه جواب دادن، ولی خواستم بگم نسخه ی راه اندازی روتاری سوئیچ با میکرو PIC هم داریم واسه متقاضیان! :nerd:

    راه اندازی روتاری سوئیچ(ولوم هرزگرد) با PIC16F628A

    منم اسم تاپیک رو عوض کنم یا همین خوبه؟

    یک دیدگاه بنویسید:


  • SAMAN.ASADI
    replied
    پاسخ : چگونه با ولومهای هرزگرد(Rotary Encoders)کار کنیم؟ [آموزشی] "کافیه یکبار بخوانید"

    ممنون دوستان
    نمیدونم چرا هر آموزشی که میخوام بدم همیشه خوب که میگردم اون مطالبی هم که تو انجمن هست تو تورم نمیخوره ؟؟؟
    مثلا همین تاپیک که میخواستم باز کنم خیلی تو انجمن گشتم ولی چیز خوبی پیدا نکردم ...
    یه بنده خدایی همون اوایل یه پیام خصوصی داد ولی من زیاد توجه نکردم ... البته اینو بگم که اون لینک مربوط میشد به یک تاپیکی که توی اون زیاد محتوایی نداشت ولی توی اون تاپیک یک لینک رو گذاشته بودن که آقای شهرام نوربخش راد درباره همین مطالب یه توضیح داده بودند و حتی یک کتابخونه هم نوشته بودند!! ، ولی من قبلش ندیده بودم ...
    http://www.eca.ir/forum2/index.php?topic=64260.msg367962#msg367962
    http://www.eca.ir/forum2/index.php?topic=64260.msg368165#msg368165
    http://www.eca.ir/forum2/index.php?topic=64260.msg371452#msg371452
    جا داره همینجا از استاد بزرگ آقای شهرام نوربخش راد تشکر کنم ... :applause:

    نوشته اصلی توسط داود رهایی
    خب دلیلی که چیزی پیدا نکردید شاید این باشه که اسمش رو اشتباه دارید میگید
    بله ... دقیقا همه رو سرچ کردم ...
    این رو هم بگم که بیشتر موقع ها سایت یا بالا نمیاد یا نمیشه جستجو کنیم یا پستی میخوایم جواب بدیم اصلا بالا نمیاد و ...
    خلاصه اینکه اعصابم میشه
    نوشته اصلی توسط داود رهایی
    اسم اینها ولوم نیست بلکه روتاری انکودر هست
    اسمهای مختلفی هست
    Rotary encoder switch
    Volume Rotary Encoder
    Rotary Encoder
    خیلی خوشحال میشم که برای این قطعه یک واژه فارسی پیدا کنیم ... :applause:
    ---------------------------------------------------------------------------------------------------------------
    نوشته اصلی توسط voyager2020
    من چندین بار تو انجمن دیدم به روتاری انکودر ها به اشتباه میگن ولوم هرزگرد! اقای رهایی هم درست ایراد گرفتند-ولوم هرزگرد جریانش کاملا با روتاری انکودر متفاوت هست و قیمت ولوم هرزگرد هم خیلی خیلی بالاتره! از 100 تومن شروع میشه تا چند میلیون!!! بهتر هست عنوان تاپیک اصلاح و روتاری انکودر باقی بمونه!
    به روی چشم ... اصلاح کردم

    یک دیدگاه بنویسید:


  • voyager2020
    replied
    پاسخ : چگونه با ولومهای هرزگرد(Rotary Encoders)کار کنیم؟ [آموزشی] "کافیه یکبار بخوانید"

    نوشته اصلی توسط ناصر منتظری
    oo: oo: oo:
    عنوان تاپیک رو ببین لطفا و یه بار بخون لطفا و پست بی مورد نده لطفا :angry: !!

    با تشکر فراوان از سامان اسدی عزیز به خاطر مطالب فوق العادش :applause: :applause: :applause:
    با تشکر از دوست گرامی و مطلب اموزشیشون در سایت
    من چندین بار تو انجمن دیدم به روتاری انکودر ها به اشتباه میگن ولوم هرزگرد! اقای رهایی هم درست ایراد گرفتند-ولوم هرزگرد جریانش کاملا با روتاری انکودر متفاوت هست و قیمت ولوم هرزگرد هم خیلی خیلی بالاتره! از 100 تومن شروع میشه تا چند میلیون!!! بهتر هست عنوان تاپیک اصلاح و روتاری انکودر باقی بمونه!

    یک دیدگاه بنویسید:


  • داود رها&ی&ی
    replied
    پاسخ : چگونه با ولومهای هرزگرد(Rotary Encoders)کار کنیم؟ [آموزشی] "کافیه یکبار بخوانید"

    ---

    یک دیدگاه بنویسید:


  • sahel2013
    replied
    پاسخ : چگونه با ولومهای هرزگرد(Rotary Encoders)کار کنیم؟ [آموزشی] "کافیه یکبار بخوانید"

    با تشکر از دوست گرامی

    یک اموزش مفید و کامل بود
    امیدوارم باز هم شاهد اموزش های شما دوست گرامی باشیم

    یک دیدگاه بنویسید:


  • SAMAN.ASADI
    replied
    چگونه با Rotary Encoders کار کنیم؟؟ (ادامه بخش چهارم)

    ادامه بخش چهارم :
    استفاده از وقفه های PIN Change:
    همونطور که تو شبیه سازی ملاحظه می کنید پایه های 4 و 5 میکروی ATmega48 پایه های وقفه PIN Change است که با نامهای PCINT18 و PCINT19 مشخص شده است . بنابراین ما باید وقفه های PCINT18 و PCINT19 را فعال کنیم . برای اینکار باید رجیستر های مربوطه را تغییر دهیم .
    برنامه برای Atmel Studio 6.1 :
    کد:
    #include <avr/io.h>
    #include <avr/iom48.h>
    #include <util/delay.h>
    #include <avr/interrupt.h>
    
    uint8_t RE=0 , Status , Counter;
    
    void USART_Transmit( uint8_t data )
    {
    	while ( !( UCSR0A & (1<<UDRE0)) );
    	UDR0 = data;
    }
    void USART_puts(char *str)
    {
    	uint8_t i=0;
    	while(str[i])
    	{
    		USART_Transmit(str[i]);
    		i++;
    	}
    }
    void USART_put_uint8(uint8_t data)
    {
    	uint8_t a,b=0,c;
    	c=data;
    	for(a=0;a<100;a++)
    	{
    		if(c==0)break;
    		c/=10;
    		if(b==0)b++;
    		else b*=10;
    	}
    	if(b==0)USART_Transmit('0');
    	for(a=b;a>0;a/=10)
    	{
    		c = data/a;
    		data = data - (c*a);
    		USART_Transmit(c+48);
    	}
    }
    #define Enter	\
    {\
    	USART_Transmit(0x0D);\
    	USART_Transmit(0x0A);\
    }
    void Rotary_Encoder(uint8_t Input_PhaseA_PhaseB,uint8_t PIN,uint8_t *Var,uint8_t *Status,uint8_t *Counter)
    {
    	uint8_t bit_Right=0 , x ;
    	x = PIN & Input_PhaseA_PhaseB;
    	for(uint8_t q = 1;q<200;q <<= 1)
    	if(Input_PhaseA_PhaseB & q)
    	{
    		bit_Right = q;
    		break;
    	}
    	if(x < Input_PhaseA_PhaseB)
    	{
    		if(!(x & bit_Right))*Counter += 1;
    		*Status = x;
    	}
    	else if((x == Input_PhaseA_PhaseB) && (*Counter == 2))
    	{
    		if	(*Status == bit_Right)	*Var += 1; // راستگرد
    		else						*Var -= 1; // چپگرد
    		*Status = 0;
    		*Counter= 0;
    	}
    	else
    	{
    		*Status = 0;
    		*Counter = 0;
    	}
    }
    
    ISR(PCINT2_vect)
    {
    	Rotary_Encoder(0x0C,PIND,&RE,&Status,&Counter);
    }
    
    int main(void)
    {
    	// USART initialization // Communication Parameters: 8 Data, 1 Stop, No Parity
    	// USART Receiver: Off
    	// USART Transmitter: On
    	// USART0 Mode: Asynchronous
    	// USART Baud Rate: 9600
    	UCSR0A=0x00;
    	UCSR0B=0x08;
    	UCSR0C=0x06;
    	UBRR0H=0x00;
    	UBRR0L=0x33;
    	// External Interrupt(s) initialization
    	// PCINT18 : on
    	// PCINT19 : on
    	EICRA=0x00;
    	EIMSK=0x00;
    	PCICR=0x04;
    	PCMSK2=0x0C;
    	PCIFR=0x04;
    	sei();
    	uint8_t x=10;
    	while(1)
    	{
    		if(RE!=x)
    		{
    			USART_puts("RE=");
    			USART_put_uint8(RE);
    			Enter;
    			x=RE;
    		}
    		_delay_ms(50);
    	}
    }
    برنامه برایCodeVision :
    کد:
    /*****************************************************
    Project : Rotary Encoder
    Version : 1.0
    Date  : 4/19/2014
    Author : Saman.Asadi
    
    Chip type        : ATmega48
    AVR Core Clock frequency: 8.000000 MHz
    Memory model      : Small
    External RAM size    : 0
    Data Stack size     : 128
    *****************************************************/
    
    #include <mega48.h>
    #include <stdio.h>
    #include <delay.h>
    
    unsigned char RE=0 , Status , Counter;
    #define Enter \
    {\
      putchar(0x0D);\
      putchar(0x0A);\
    }
    void Rotary_Encoder(unsigned char Input_PhaseA_PhaseB,
              unsigned char PIN,
              unsigned char *Var,
              unsigned char *Status,
              unsigned char *Counter)
    {
      unsigned char bit_Right=0 ,x ,q ;
      x = PIN & Input_PhaseA_PhaseB;
      for(q = 1;q<200;q <<= 1)
      if(Input_PhaseA_PhaseB & q)
      {
        bit_Right = q;
        break;
      }
      if(x < Input_PhaseA_PhaseB)
      {
        if(!(x & bit_Right))*Counter += 1;
        *Status = x;
      }
      else if((x == Input_PhaseA_PhaseB) && (*Counter == 2))
      {
        if  (*Status == bit_Right)*Var += 1; // راستگرد
        else            *Var -= 1; // چپگرد
        *Status = 0;
        *Counter= 0;
      }
      else
      {
        *Status = 0;
        *Counter = 0;
      }
    }
    interrupt [PC_INT2] void pin_change_isr2(void)
    {
      Rotary_Encoder(0x0C,PIND,&RE,&Status,&Counter);  
    }
    void main(void)
    {
      unsigned char x=10;
      CLKPR=0x80;
      CLKPR=0x00;
      // USART initialization // Communication Parameters: 8 Data, 1 Stop, No Parity
      // USART Receiver: Off
      // USART Transmitter: On
      // USART0 Mode: Asynchronous
      // USART Baud Rate: 9600
      UCSR0A=0x00;
      UCSR0B=0x08;
      UCSR0C=0x06;
      UBRR0H=0x00;
      UBRR0L=0x33;
      // External Interrupt(s) initialization
      //PCINT18 : on
      //PCINT19 : on
      EICRA=0x00;
      EIMSK=0x00;
      PCICR=0x04;
      PCMSK2=0x0C;
      PCIFR=0x04;
      #asm("sei")
    	while(1)
      {
    		if(RE!=x)
    		{
    			printf("RE=%u",RE);
    			Enter;
    			x=RE;
    		}
    		delay_ms(50);
      }
    }
    این هم مثل برنامه قبل امتحانش کنید و با آن کار کنید ...
    --------------------------------------------------------------------
    خوب عزیزان این بخش هم به پایان رسید :wow:
    امیدوارم که خوب توضیح داده باشم ... :redface:
    موفق و کامیاب باشید

    یک دیدگاه بنویسید:

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