سلام دوستان و اساتید بزرگوار.
خواستم در راه خدا راه اندازی روتاری سوئیچ با کد و سخت افزار و فوت کوزه گری مربوطه! در اختیارتون قرار بدم.خودم تازه انجامش دادم.
تشکر هم یادتون نره! :rolleyes:
خب....و اما....
توضیح روتاری سوئیچ یا ولوم هرزگرد تو این تاپیک هست و استاد گرامی جناب آقای نوربخش توضیح کامل و جامع براش دادن:
http://www.eca.ir/forum2/index.php?topic=64260.0
همونطور که جناب نوربخش توضیح فرمودن، بهتره یکی از پایه ها اینتراپتی باشه، و اون یکی پایه ورودی معمولی هم باشه میشه، که اگه اینتراپتی باشه بهتره.
میکرویی که من دم دست داشتم واسه تست، PIC16F628A بود. کریستال داخلی 4MHz رو استفاده کردم.ریست هم داخلی یا خارجی دلخواه خودتون هست.
کل کد برنامه رو میذارم واستون(با کامپایلر میکروسی) و بعد توضیح بخشهای مهم برنامه و آخر سر هم نکته ی بسیار مهم و فوت کوزه گری سخت افزاری که در صورت عدم استفاده، روتاری خیلی بد جواب میده یا اصلا جوای نمیده.طوری که خودم داشتم از خیرش میگذشتم!
برنامه این کار رو میکنه که اگه روتاری رو به سمت چپ یا راست بچرخونین، مقدار PWM تولیدی رو 10 تا 10 تا زیاد یا کم میکنه و هر وقت هم که کلید وسط روتاری رو فشار بدین،PWM تولیدی رو تو خونه ی صفر از EEPROM میکرو ذخیره میکنه و موقع روشن شدن هم اول میره EEPROM رو میخونه.
زیربرنامه ی اینتراپت:
تو عکسی که گذاشتم به جای روتاری از دوتا کلید معمولی استفاده کردم. کار اصلی رو ورودی اینتراپت انجام میده. اینتراپت با لبه ی پایین رونده تحریک میشه.لذا ورودی مشترک روتاری رو به زمین وصل کردم.روتاری وقتی مثلا چپ گرد هست، اول پایه اینتراپت صفر میشه(وقوع وقفه) بعد پایه دیگه ش صفر میشه.تو زیربرنامه ی وقفه اول بیت وقفه ی عمومی رو غیرفعال میکنیم(INTCON.GIE=0 تا احیانا وسط انجام دستورات مربوطه، وقفه ی دیگه ای کار رو خراب نکنه!
بعد پایه ی دیگه ی روتاری رو چک میکنیم.اگه یک بود، یعنی چپ گرد هست(فرض کردیم) که حدود دهم یا صدم ثانیه بعد چک کردن اینتراپت ، اون یکی پایه هم صفر میشه و این وسط ما فهمیدیم که روتاری داره کدوم طرف میچرخه و برعکسش هم صادق هست.وقتی اینتراپت رخ میده و ورودی بعدی رو چک میکنیم و میبینیم که صفر هست، معلوم میشه که اول اون پایه صفر شده و بعد پایه ی اینتراپت صفر شده که باعث وقوع وقفه شده....امیدوارم توضیحاتم پیچیده نشده باشه! :redface:
این میشه همین دوخط:
اون اضافه کردن و کم کردن متغیر هم برای تغییر PWM هست که نهایتا متغیر i رو به PWM تولیدی اختصاص میدیم.
بعدش میایم و پرچم وقوع وقفه رو پاک میکنیم(همیشه اینکار رو باید انجام بدیم-تو همه ی وقفه ها )
INTCON.INTF=0;
و نهایتا وقفه رو فعال میکنیم:
INTCON.GIE=1;
بعد تنظیمات رجیسترهای مربوط به وقفه هست که تو main برنامه میاد:
دستور TRISB=7 باعث میشه که پایه های B0-B1-B2 ورودی بشن.
درنتیجه سه تا ورودی داریم.اینتراپت خارجی(B0)-پایه دوم روتاری که باهاش جهت چرخش رو تشخیص میدیم(B1).پایه سوم هم که همون کلید وسط روتاری هست (B2) که با عمودی فشار دادن روتاری ، دوتا کنتاکت رو به هم وصل میکنه و تو اینجا از این کلید برای ذخیره ی PWM تولیدی استفاده کردیم.
(اصطلاحا بهش میگن جینگول بازی!! :mrgreen: )
----------------------------------
راه اندازی PWM
---------------------------------
فکر نکنم توضیحی بخواد!
--------------------------------
تاخیر برای گرفتن لرزشهای احتمالی که فکر کنم نباشه هم کار بکنه! بسوزه پدر سخت افزار!
خط آخر و اون خطی که گفتم توضیح نمیخواد هم برای همون جینگول بازی هست! :mrgreen:
-------------------------
و اما فوت کوزه گری : هردوتا پایه ی روتاری که برای تشخیص جهت چرخش هست و یکی به پایه وقفه میکرو وصله و دیگری به پایه ای دلخواه، علاوه بر پول پ بودن، باید با خازن حدود1 میکرو به زمین وصل بشن تا کار دیبانس گیری اصلی توسط اون خازن انجام بشه.بدون اون خازن هرقدر هم تأخیر بذارین و با نرم افزار الکی سر و کله بزنین، همش آب در هاون کوفتن است و بس! که من بسی کوبیدم و مفت بهتون گفتم تا شماها نکوبین! :nerd:
سوالی بود در خدمت هستم....
موفق باشین.
خواستم در راه خدا راه اندازی روتاری سوئیچ با کد و سخت افزار و فوت کوزه گری مربوطه! در اختیارتون قرار بدم.خودم تازه انجامش دادم.
تشکر هم یادتون نره! :rolleyes:
خب....و اما....
توضیح روتاری سوئیچ یا ولوم هرزگرد تو این تاپیک هست و استاد گرامی جناب آقای نوربخش توضیح کامل و جامع براش دادن:
http://www.eca.ir/forum2/index.php?topic=64260.0
همونطور که جناب نوربخش توضیح فرمودن، بهتره یکی از پایه ها اینتراپتی باشه، و اون یکی پایه ورودی معمولی هم باشه میشه، که اگه اینتراپتی باشه بهتره.
میکرویی که من دم دست داشتم واسه تست، PIC16F628A بود. کریستال داخلی 4MHz رو استفاده کردم.ریست هم داخلی یا خارجی دلخواه خودتون هست.
کل کد برنامه رو میذارم واستون(با کامپایلر میکروسی) و بعد توضیح بخشهای مهم برنامه و آخر سر هم نکته ی بسیار مهم و فوت کوزه گری سخت افزاری که در صورت عدم استفاده، روتاری خیلی بد جواب میده یا اصلا جوای نمیده.طوری که خودم داشتم از خیرش میگذشتم!
کد:
char i; void Interrupt() { INTCON.GIE=0; if (PORTB.b1==1) i=i+10; if (PORTB.b1==0) i=i-10; INTCON.INTF=0; INTCON.GIE=1; } void main() { OPTION_REG=0; // EX-INT=Falling edge INTCON=0b10010000; //EX-INT=ON-other Interrupt=OFF PIE1=0; PIR1=0; TRISB=0; PORTB=0; TRISB=7; PWM1_Init(5000); PWM1_Start(); i=EEPROM_read(0); while(1) { delay_ms(10); PWM1_Set_Duty(i); if (PORTB.B2==0) EEPROM_write(0,i); } }
زیربرنامه ی اینتراپت:
کد:
void Interrupt() { INTCON.GIE=0; if (PORTB.b1==1) i=i+10; if (PORTB.b1==0) i=i-10; INTCON.INTF=0; INTCON.GIE=1; }
بعد پایه ی دیگه ی روتاری رو چک میکنیم.اگه یک بود، یعنی چپ گرد هست(فرض کردیم) که حدود دهم یا صدم ثانیه بعد چک کردن اینتراپت ، اون یکی پایه هم صفر میشه و این وسط ما فهمیدیم که روتاری داره کدوم طرف میچرخه و برعکسش هم صادق هست.وقتی اینتراپت رخ میده و ورودی بعدی رو چک میکنیم و میبینیم که صفر هست، معلوم میشه که اول اون پایه صفر شده و بعد پایه ی اینتراپت صفر شده که باعث وقوع وقفه شده....امیدوارم توضیحاتم پیچیده نشده باشه! :redface:
این میشه همین دوخط:
کد:
if (PORTB.b1==1) i=i+10; if (PORTB.b1==0) i=i-10;
بعدش میایم و پرچم وقوع وقفه رو پاک میکنیم(همیشه اینکار رو باید انجام بدیم-تو همه ی وقفه ها )
INTCON.INTF=0;
و نهایتا وقفه رو فعال میکنیم:
INTCON.GIE=1;
بعد تنظیمات رجیسترهای مربوط به وقفه هست که تو main برنامه میاد:
کد:
OPTION_REG=0; // EX-INT=Falling edge INTCON=0b10010000; //EX-INT=ON-other Interrupt=OFF PIE1=0; PIR1=0; TRISB=0; PORTB=0; TRISB=7;
درنتیجه سه تا ورودی داریم.اینتراپت خارجی(B0)-پایه دوم روتاری که باهاش جهت چرخش رو تشخیص میدیم(B1).پایه سوم هم که همون کلید وسط روتاری هست (B2) که با عمودی فشار دادن روتاری ، دوتا کنتاکت رو به هم وصل میکنه و تو اینجا از این کلید برای ذخیره ی PWM تولیدی استفاده کردیم.
(اصطلاحا بهش میگن جینگول بازی!! :mrgreen: )
----------------------------------
کد:
PWM1_Init(5000); PWM1_Start();
---------------------------------
کد:
i=EEPROM_read(0);
--------------------------------
کد:
while(1) { delay_ms(10); PWM1_Set_Duty(i); if (PORTB.B2==0) EEPROM_write(0,i); }
خط آخر و اون خطی که گفتم توضیح نمیخواد هم برای همون جینگول بازی هست! :mrgreen:
-------------------------
و اما فوت کوزه گری : هردوتا پایه ی روتاری که برای تشخیص جهت چرخش هست و یکی به پایه وقفه میکرو وصله و دیگری به پایه ای دلخواه، علاوه بر پول پ بودن، باید با خازن حدود1 میکرو به زمین وصل بشن تا کار دیبانس گیری اصلی توسط اون خازن انجام بشه.بدون اون خازن هرقدر هم تأخیر بذارین و با نرم افزار الکی سر و کله بزنین، همش آب در هاون کوفتن است و بس! که من بسی کوبیدم و مفت بهتون گفتم تا شماها نکوبین! :nerd:
سوالی بود در خدمت هستم....
موفق باشین.
دیدگاه