صفحه 2 از 2 نخستنخست 12
نمایش نتایج: از 11 به 20 از 20

موضوع: نحوه افزایش کانال میکرو از هشت خروجی به شانزده خروجی

  1. #11
    کاربر عادی hamed_avr آواتار ها
    تاریخ عضویت
    May 2014
    نوشته ها
    78
    تشکر
    15
    تشکر شده 25 بار در 20 پست
    سلام
    ببخشید بعد از مدتی دوباره مزاحم شدم
    میخواستم در مورد اون قضیه اند کردن که اول توضیح دادین بیشتر صحبت کنین چون روش دوم که راهنمایی کردین زیاد جالب نبود
    خیلی باهاش کار کردم ولی درست جواب نداد.

  2. #12
    مدیریت سایت LightIran آواتار ها
    تاریخ عضویت
    Apr 2014
    نوشته ها
    1,129
    تشکر
    225
    تشکر شده 1,456 بار در 643 پست
    سلام
    روشی که شما انتخاب کردین روی کاغذ و در ابتدای امر ساده بود ولی مشکلی که داشت این بود که در آن واحد باید روی دو تا جدول داده(Table) کار میکردین و این مشخصا مطلوب نبود و باعث ایجاد اذیت میشد.ولی روش اول شاید برای کسی که با مباحث منطقی و دیجیتال آشنا نباشه سخت بنظر بیاد ولی متعاقبش و در مرحله ایجاد جدول به نسبت راحت تر بوده و امکان تغییرات راحت تر وجود داره.
    همونطور که در پست های قبلی گفتم برای این روش باید به صورت زیر عمل کنید:
    1- یک متغیر 16 بیتی از نوع Word تعریف کنید. 16 بیت به دلیل اینکه قابلیت ذخیره داده های هر دو پورت B و D را داشته باشد.
    کد:
    Dim Port As Word
    2- این متغیر باید با مقادیر 16 بیتی که جهت خروجی مورد استفاده قرار می گیرد مقدار دهی شود لذا دوباره از یک Lookup استفاده کرده و داده را از جدول مربوطه خوانده و در این متغیر قرار می دهیم.
    کد:
    Port = Lookup(count , Table)
    3- حال باید داده ها روی پورت های خروجی قرار گیرد. ما در این مثال 8 بیت اول را برای پورت B و 8 بیت بعدی را برای پورت D در نظر می گیریم. یعنی کانال 1 تا 8 در پورت B قرار می گیرد و کانال 9 تا 16 نیز در پورت D.
    برای پورت B که 8 بیت اول را مورد نیاز دارد ما نیاز به 8 بیت اول داریم لذا باید از 8 بیت بعدی صرف نظر کنیم. برای این امر مقدار متغیر 16 بیتی خود را با 00FF باید AND نمائیم. بعد از اینکار 8 بیت دوم برابر صفر گشته و 8 بیت اول بدون تغییر باقی می مانند. لذا آنها را به پورت B منتقل می نمائیم.
    کد:
    Portb = Port And &H00FF
    برای پورت D باید 8 بیت دوم را در اختیار داشته باشیم لذا مقدار متغیر را با FF00 باید AND نمائیم تا 8 بیت اول صفر و 8 بیت دوم باقی بماند.
    کد:
    Port = Port And &HFF00
    حال باید مقدار را 8 بار به سمت راست شیفت دهیم تا مقادیر جهت انتقال به خروجی قابل استفاده باشد.
    کد:
    Shift Port , Right , 8
    بعد از این مرحله مقدار رو باید به خروجی بدیم.
    کد:
    Portd = Port
    برنامه نهایی به صورت زیر است:
    کد:
    Do For Count = 0 To 15 Port = Lookup(count , Table) Portb = Port And &H00FF Port = Port And &HFF00 Shift Port , Right , 8 Portd = Port Waitms Speed Next Count Loop :Table Data &B0000000000000001% , &B0000000000000010% , &B0000000000000100% , &B0000000000001000% , &B0000000000010000% , &B0000000000100000% , &B0000000001000000% , &B0000000010000000% Data &B0000000100000000% , &B0000001000000000% , &B0000010000000000% , &B0000100000000000% , &B0001000000000000% , &B0010000000000000% , &B0100000000000000% , &B1000000000000000%
    به موارد زیر توجه نمائید:
    1- در صورتی که یک مقدار 16 بیتی به پورت اعمال شود فقط 8 بیت اول استفاده می شود و 8 بیت بعدی نمی تواند در خروجی ظاهر شود. لذا در برنامه در مرحله 8 بیت دوم به محل 8 بیت اول شیفت داده شدند.
    2- برای مقادیر 16 بیتی در جدول داده باید بعد از مقدار علامت % قرار داده شود. در غیر اینصورت برنامه به درستی عمل نخواهد کرد.

    امیدوارم توضیحات کامل بوده باشه و بتونین به خوبی استفاده کنین. در ضمن فایل ضمیمه شامل کد بسکام و همینطور پروتئوس این برنامه است. برای تکمیل سازی، برنامه موجود رو به برنامه قبلی یعنی فلاشر 8 کاناله اضافه کنید.
    موفق باشید
    فايل هاي پيوست شده فايل هاي پيوست شده
    You can if you want!Trust Me
    تنها غیرممکن غیرممکن است پس تلاش کنید!

  3. کاربران زیر از این پست مفید LightIran تشکر کرده اند:

    agraphic (06-26-2014),hamed_avr (06-22-2014),ایمان داودی (06-22-2014)

  4. #13
    کاربر عادی hamed_avr آواتار ها
    تاریخ عضویت
    May 2014
    نوشته ها
    78
    تشکر
    15
    تشکر شده 25 بار در 20 پست
    ممنون از راهنماییتون.

  5. #14
    کاربر عادی hamed_avr آواتار ها
    تاریخ عضویت
    May 2014
    نوشته ها
    78
    تشکر
    15
    تشکر شده 25 بار در 20 پست
    سلام
    توضیحی که دادید واقعا مشکلم و حل کرد و کلی برنامه تونستم باهاش بنویسم
    الان فقط یک سوال دارم اگه بخوام با سه تا پورت این برنامه رو بنویسم باید چیکار کرد یعنی تا 24 کانال رو بشه ساپورت کنه . ممنون

  6. #15
    مدیریت سایت LightIran آواتار ها
    تاریخ عضویت
    Apr 2014
    نوشته ها
    1,129
    تشکر
    225
    تشکر شده 1,456 بار در 643 پست
    برای فلاشر فکر میکنم همین مقدار کافی باشه!فلاشرهای موجود در بازار معمولا زیر 16 خروجی دارن و لزومی نداره شما بیشتر ازین افزایش بدین!
    ولی برای این حالت شما باید از یک متغیر بزرگتر یعنی 32 بیتی استفاده کنید. روند هم عین همین دو پورت هست فقط باید 8 بیت سوم رو به پورت سوم منتقل کنید!
    You can if you want!Trust Me
    تنها غیرممکن غیرممکن است پس تلاش کنید!

  7. کاربران زیر از این پست مفید LightIran تشکر نموده اند:

    ایمان داودی (08-24-2014)

  8. #16
    کاربر عادی hamed_avr آواتار ها
    تاریخ عضویت
    May 2014
    نوشته ها
    78
    تشکر
    15
    تشکر شده 25 بار در 20 پست
    اقا سلام
    هر کاری کردم نتونستم جواب بگیرم
    منظورتون از این که هشت بیت سوم رو به پورت سوم منتقل کنم چیه؟
    برنامه رو اینجوری نوشتم ایرادش چیه؟
    کد:
    $regfile = "m16def.dat"
    $crystal = 8000000
    Ddrb = &HFF
    Ddrd = &HFF
    Ddrc = &HFF
    Const Speed = 400
    Dim Port As Long , Count As Byte
    Do
       For Count = 0 To 46
          Port = Lookup(count , Efect1)
    
          Portb = Port And &H0000FF
    
          Port = Port And &H00FF00
    
          Shift Port , Right , 8
          Portd = Port
    
          Portc = Port And &HFF0000
    
           Shift Port , Right , 8
          Portc = Port
          Waitms Speed
       Next Count
    Loop
    
    
    Efect1:
    Data &B000000000000000000000001%
    Data &B000000000000000000000010%
    Data &B000000000000000000000100%
    Data &B000000000000000000001000%
    Data &B000000000000000000010000%
    Data &B000000000000000000100000%
    Data &B000000000000000001000000%
    Data &B000000000000000010000000%
    Data &B000000000000000100000000%
    Data &B000000000000001000000000%
    Data &B000000000000010000000000%
    Data &B000000000000100000000000%
    Data &B000000000001000000000000%
    Data &B000000000010000000000000%
    Data &B000000000100000000000000%
    Data &B000000001000000000000000%
    Data &B000000010000000000000000%
    Data &B000000100000000000000000%
    Data &B000001000000000000000000%
    Data &B000010000000000000000000%
    Data &B000100000000000000000000%
    Data &B001000000000000000000000%
    Data &B010000000000000000000000%
    Data &B100000000000000000000000%
    Data &B010000000000000000000000%
    Data &B001000000000000000000000%
    Data &B000100000000000000000000%
    Data &B000010000000000000000000%
    Data &B000001000000000000000000%
    Data &B000000100000000000000000%
    Data &B000000010000000000000000%
    Data &B000000001000000000000000%
    Data &B000000000100000000000000%
    Data &B000000000010000000000000%
    Data &B000000000001000000000000%
    Data &B000000000000100000000000%
    Data &B000000000000010000000000%
    Data &B000000000000001000000000%
    Data &B000000000000000100000000%
    Data &B000000000000000010000000%
    Data &B000000000000000001000000%
    Data &B000000000000000000100000%
    Data &B000000000000000000010000%
    Data &B000000000000000000001000%
    Data &B000000000000000000000100%
    Data &B000000000000000000000010%
    Data &B000000000000000000000001%
    ویرایش توسط hamed_avr : 08-25-2014 در ساعت 12:50 AM

  9. #17
    مدیریت سایت LightIran آواتار ها
    تاریخ عضویت
    Apr 2014
    نوشته ها
    1,129
    تشکر
    225
    تشکر شده 1,456 بار در 643 پست
    تغییرات رو به صورت زیر اعمال کنید.

    کد:
    Port = Lookup(count , Efect1)
    Portb = Port And &H0000FF
    
    
    Port = Port And &HFFFF00
    Shift Port , Right , 8
    Portd = Port
    
    
    Shift Port , Right , 8
    Portc = Port
    
    
    Waitms Speed


    موفق باشید
    You can if you want!Trust Me
    تنها غیرممکن غیرممکن است پس تلاش کنید!

  10. #18
    کاربر عادی hamed_avr آواتار ها
    تاریخ عضویت
    May 2014
    نوشته ها
    78
    تشکر
    15
    تشکر شده 25 بار در 20 پست
    متغیر رو از نوع word قرار میدم روی پورت B و D درست انجام میده ولی روی پورت C اصلا هیچ تاثیری نداره . متغیر رو از نوع long قرار میدم شمارش جدول رو بصورت یک در میان انجام میده و بازم روی پورت C هیچ تاثیری نمیزاره.
    به نظر شما اشکال کار کجاست؟

  11. #19
    مدیریت سایت LightIran آواتار ها
    تاریخ عضویت
    Apr 2014
    نوشته ها
    1,129
    تشکر
    225
    تشکر شده 1,456 بار در 643 پست
    نقل قول نوشته اصلی توسط hamed_avr نمایش پست ها
    متغیر رو از نوع word قرار میدم روی پورت B و D درست انجام میده ولی روی پورت C اصلا هیچ تاثیری نداره . متغیر رو از نوع long قرار میدم شمارش جدول رو بصورت یک در میان انجام میده و بازم روی پورت C هیچ تاثیری نمیزاره.
    به نظر شما اشکال کار کجاست؟
    شما باید از نوع متغیر Long استفاده کنید. نوع Word فقط 16 بیته و مشخصا باید 32 بیتی باشه!
    در جدول داده به جای % از & استفاده کنید.
    You can if you want!Trust Me
    تنها غیرممکن غیرممکن است پس تلاش کنید!

  12. کاربران زیر از این پست مفید LightIran تشکر کرده اند:

    hamed_avr (08-25-2014),ایمان داودی (08-25-2014)

  13. #20
    کاربر عادی hamed_avr آواتار ها
    تاریخ عضویت
    May 2014
    نوشته ها
    78
    تشکر
    15
    تشکر شده 25 بار در 20 پست
    ممنوم . درست شد. تشکر

صفحه 2 از 2 نخستنخست 12

کلمات کلیدی این موضوع

باز و بسته کردن مجوز های ارسال و ویرایش

  • شما نمیتوانید موضوع جدیدی ارسال کنید
  • شما امکان ارسال پاسخ را ندارید
  • شما نمیتوانید فایل پیوست کنید.
  • شما نمیتوانید پست های خود را ویرایش کنید
  •  
با کلیک بر روی 1+ ما را در گوگل محبوب کنید