سلام
ببخشید بعد از مدتی دوباره مزاحم شدم
میخواستم در مورد اون قضیه اند کردن که اول توضیح دادین بیشتر صحبت کنین چون روش دوم که راهنمایی کردین زیاد جالب نبود
خیلی باهاش کار کردم ولی درست جواب نداد.
سلام
ببخشید بعد از مدتی دوباره مزاحم شدم
میخواستم در مورد اون قضیه اند کردن که اول توضیح دادین بیشتر صحبت کنین چون روش دوم که راهنمایی کردین زیاد جالب نبود
خیلی باهاش کار کردم ولی درست جواب نداد.
سلام
روشی که شما انتخاب کردین روی کاغذ و در ابتدای امر ساده بود ولی مشکلی که داشت این بود که در آن واحد باید روی دو تا جدول داده(Table) کار میکردین و این مشخصا مطلوب نبود و باعث ایجاد اذیت میشد.ولی روش اول شاید برای کسی که با مباحث منطقی و دیجیتال آشنا نباشه سخت بنظر بیاد ولی متعاقبش و در مرحله ایجاد جدول به نسبت راحت تر بوده و امکان تغییرات راحت تر وجود داره.
همونطور که در پست های قبلی گفتم برای این روش باید به صورت زیر عمل کنید:
1- یک متغیر 16 بیتی از نوع Word تعریف کنید. 16 بیت به دلیل اینکه قابلیت ذخیره داده های هر دو پورت B و D را داشته باشد.
2- این متغیر باید با مقادیر 16 بیتی که جهت خروجی مورد استفاده قرار می گیرد مقدار دهی شود لذا دوباره از یک Lookup استفاده کرده و داده را از جدول مربوطه خوانده و در این متغیر قرار می دهیم.کد:Dim Port As Word
3- حال باید داده ها روی پورت های خروجی قرار گیرد. ما در این مثال 8 بیت اول را برای پورت B و 8 بیت بعدی را برای پورت D در نظر می گیریم. یعنی کانال 1 تا 8 در پورت B قرار می گیرد و کانال 9 تا 16 نیز در پورت D.کد:Port = Lookup(count , Table)
برای پورت B که 8 بیت اول را مورد نیاز دارد ما نیاز به 8 بیت اول داریم لذا باید از 8 بیت بعدی صرف نظر کنیم. برای این امر مقدار متغیر 16 بیتی خود را با 00FF باید AND نمائیم. بعد از اینکار 8 بیت دوم برابر صفر گشته و 8 بیت اول بدون تغییر باقی می مانند. لذا آنها را به پورت B منتقل می نمائیم.
برای پورت D باید 8 بیت دوم را در اختیار داشته باشیم لذا مقدار متغیر را با FF00 باید AND نمائیم تا 8 بیت اول صفر و 8 بیت دوم باقی بماند.کد:Portb = Port And &H00FF
حال باید مقدار را 8 بار به سمت راست شیفت دهیم تا مقادیر جهت انتقال به خروجی قابل استفاده باشد.کد:Port = Port And &HFF00
بعد از این مرحله مقدار رو باید به خروجی بدیم.کد: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
تنها غیرممکن غیرممکن است پس تلاش کنید!
agraphic (06-26-2014),hamed_avr (06-22-2014),ایمان داودی (06-22-2014)
سلام
توضیحی که دادید واقعا مشکلم و حل کرد و کلی برنامه تونستم باهاش بنویسم
الان فقط یک سوال دارم اگه بخوام با سه تا پورت این برنامه رو بنویسم باید چیکار کرد یعنی تا 24 کانال رو بشه ساپورت کنه . ممنون
برای فلاشر فکر میکنم همین مقدار کافی باشه!فلاشرهای موجود در بازار معمولا زیر 16 خروجی دارن و لزومی نداره شما بیشتر ازین افزایش بدین!
ولی برای این حالت شما باید از یک متغیر بزرگتر یعنی 32 بیتی استفاده کنید. روند هم عین همین دو پورت هست فقط باید 8 بیت سوم رو به پورت سوم منتقل کنید!
You can if you want!Trust Me
تنها غیرممکن غیرممکن است پس تلاش کنید!
ایمان داودی (08-24-2014)
اقا سلام
هر کاری کردم نتونستم جواب بگیرم
منظورتون از این که هشت بیت سوم رو به پورت سوم منتقل کنم چیه؟
برنامه رو اینجوری نوشتم ایرادش چیه؟
کد:$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
تغییرات رو به صورت زیر اعمال کنید.
کد: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
تنها غیرممکن غیرممکن است پس تلاش کنید!
متغیر رو از نوع word قرار میدم روی پورت B و D درست انجام میده ولی روی پورت C اصلا هیچ تاثیری نداره . متغیر رو از نوع long قرار میدم شمارش جدول رو بصورت یک در میان انجام میده و بازم روی پورت C هیچ تاثیری نمیزاره.
به نظر شما اشکال کار کجاست؟
hamed_avr (08-25-2014),ایمان داودی (08-25-2014)