Presentation is loading. Please wait.

Presentation is loading. Please wait.

Session 6.

Similar presentations


Presentation on theme: "Session 6."— Presentation transcript:

1 Session 6

2 مطالب این جلسه: راه اندازی صفحه کلید ماتریسی به روش وقفه ایی
وقفه چیست؟ منابع وقفه در میکرو کنترلر های AVR وقفه های خارجی و نحوه راه اندازی آنها در CODEVISION راه اندازی صفحه کلید ماتریسی به روش وقفه ایی

3 وقفه ها: وقفه ها اعمالی اند که ما را از مسیر عادی برنامه خارج می کنند، مانند: زنگ خوردن تلفن همراه هنگام پخش موسیقی: 1. پخش موسیقی قطع می شود 2. تلفن شروع به زنگ خوردن می کند 3. پس از تمام شدن مکالمه، پخش موسیقی ادامه پیدا می کند! میکروکنترلرها وقفه های مختلفی دارند و در زمانی که نیاز به توجه دارند ما را هشدار می دهند، مانند: 1. وقفه تایمرها 2. وقفه واحد سریال 3. وقفه های خارجی

4 روش های بررسی یک رویداد از جانب CPU
1-روش سرکشی (polling): در این روش کاربر توسط برنامه نویسی با فواصل زمانی دلخواه دائما رویداد مورد نظر را بررسی می کند تا به آن پاسخ داده شود. 2-روش وقفه (intrrupt): در این روش cpu بدون در نظر گرفتن رویداد به انجام سایر اعمال مشغول میشود و با وقوع اتفاق مورد نظر cpu انجام خط جاری برنامه را متوقف کرده و به بردار وقفه مربوطه پرش کرده و زیر روال سرویس وقفه (interrupt service routin) را اجرا میکند و سپس به خط ی که از انجا پرش صورت گرفته بود بر میگردد

5 منابع وقفه در AVR میکرو کنترلر ATMEGA 32 دارای 21منبع وقفه میباشد که 3مورد از آنها وقفه های خارجی می باشند

6

7 وقفه های خارجی: وقفه های خارجی این امکان را برای ما فراهم می سازد که پایه های INT0 و INT1 و INT2 را به وضعیت سیگنالِ اعمالی شان حساس کنند. این پایه ها جزو امکانات ثانویه بعضی از پورت های اصلی هستند. یعنی پایه ای که برای وقفه فعال شده است، دیگر امکان کار با واحد ورودی/خروجی متناظر با آن پین را به ما نمی دهد! وضعیت سیگنال: 1 . سطح منطقی 0 یا Low یک وقفه تولید می کند 2. هرگونه تغییری در سطح منطقی سیگنال (0 یا 1) یک وقفه تولید می کند 3. به ازای لبه پایین رونده سیگنال، وقفه تولید می کند 4. به ازای لبه بالا رونده سیگنال، وقفه تولید می کند پایه های INT0 و INT1 به هر چهار مورد بالا حساس اند، اما پایه INT2 فقط به موارد 3و4 حساس می باشد.

8 وقفه ها: وقفه ها باعث تغییر مسیر عادی برنامه می شوند. مانند goto در زبان c و jmp در assembly اما با این تفاوت که زمان وقوع آنها شرایط خاص سخت افزاری می باشد. می توان وقفه ها را مشابه Event ها در زبان های سطح بالا مانند C# و Java دانست. وقفه هایی که در این جلسه مورد بحث قرار می گیرند، وقفه های خارجی هستند.

9 مراحل اجرای یک وقفه میکرو کنترلر زمانی که وقفه داخلی یا خارجی دریافت میکند مراحل زیر را انجام میدهد: 1-دستوری که در حال اجرای آن میباشد را به پایان رسانده و آدرس دستور عمل بعدی را در حافظه پشته ذخیره می کند. 2-به بردار وقفه مورد نظر پرش کرده و isr مربوطه را اجرا میکند 3-پس از اتمام زیر روال وقفه توسط دستور اسمبلی RETIاز وقفه بر میگردد .البته در زبان C ما این دستور را به کار نمیگیریم اما کامپایلر بعد از تفسیر برنامه از آن استفاده می کند. 4-آدرس دستور العملی که در مرحله یک در حافظه پشته ذخیره کرده بود را بر می دارد و با قرار دادن آن آدرس در شمارنده برنامه(PC) به ادامه برنامه بر میگردد

10 External Interrupts: میکروATmega 32 دارای سه منبع وقفه خارجی می باشد:
1-External interrupt 0 (INT0) 2-External interrupt 1 (INT1) 3-External interrupt 2 (INT2)

11 مراحل برنامه نویسی با وقفه:
1-تعریف تابع وقفه در codevision 2- تنظیم رجیستر های مرتبط با وقفه مربوطه

12 تعریف تابع وقفه در codevision
شماره بردار وقفه بر اساس جدول بردار وقفه بدست می آید و می توان به جای ان از اسم بردار وقفه نیز استفاده کرد . مثال :شماره بردار وقفه صفر 2 است یا می توان آنرا بصورت EXT_INT0 نوشت.

13 تنظیم رجیستر های مرتبط با وقفه
1-رجیستر وضعیت(status register): CPU در عملکرد عادی خود و به صورت پیش فرض به وقفه ها توجهی ندارد .بنابر این باید وقفه سراسری را با یک نمودن بیت هفتم رجیستر وضعیت فعال نمود. فعال ساز و غیرفعال ساز عمومی وقفه یا Global Interrupt Enable/Disable Flag AVR SREG Register با رویداد هر وقفه خارجی این بیت پاک شده و در نتیجه تمام وقفه های دیگر غیر فعال می شوند در این حالت نرم افزار میتواند با نوشتن یک بر روی این بیت آن را مجداد فعال کرده و باعث ایجاد وقفه های تودر تو شود.با بازگشت از بردار وقفه مورد نظربه حالت اولیه این بیت مجداد یک می شود #asm(“sei”)//فعال کردن وقفه سراسری #asm(“cli”)//غیر فعال کردن وقفه سراسری

14 تنظیم رجیستر های مرتبط با وقفه
2-رجیستر GICR(general interrupt control register): برای فعال سازی وقفه مورد نظر در این رجیستر مقدار یک باید نوشته شود با یک کردن هر بیت وقفه خارجی مورد نظر فعال شده و پایه مورد نظر از حالت عادی خارج شده و به عنوان یک پایه وقفه سخت افزاری به کار میرود مثال فعال سازی وقفه خارجی صفر GICR=0b √

15 تنظیم رجیستر های مرتبط با وقفه
3-رجیستر GIFR(general interrupt flag register): اگر یکی از وقفه های خارجی را توسط ریجستر GICRفعال کرده باشیم و وقفه همگانی را نیز فعال کرده باشیم در هنگام تحریک وقفه خارجی مورد نظر از طریق پایه بیرونی ، پرچم متناظر با آن در این رجیستر فعال شده و در خواست اجرای زیر روال وقفه را میدهد و برنامه به تابع وقفه مورد نظر پرش کرده و بعد از اجرای آن به طور اتوماتیک این پرچم پاک میگردد نکته: از این رجیستر بیشتر در روش POLLING استفاده می شود.به این صورت که با یک دستور شرطی منتظر میمانیم تا فلگ مرتبط با وقفه خارجی مورد نظر برای انجام زیر روال خاصی تحریک گردد

16 تنظیم رجیستر های مرتبط با وقفه
4-رجیستر MCUCR (MCU Control Register): نوع تریگر شدن هریک از وقفه های خارجی صفر و یک بوسیله این رجیستر تعیین می شود. (Interrupt sense control 1) توسط این دو بیت میتوان نحوه تحریک شدن وقفه خارجی یک را تعیین نمود (Interrupt sense control 0) توسط این دو بیت میتوان نحوه تحریک شدن وقفه خارجی صفر را تعیین نمود ISC11 ISC10 نوع تریگر شدن وقفه یک سطح منطقی صفر 1 تغییر در سطح منطقی پین لبه پایین رونده لبه بالا رونده ISC01 ISC00 نوع تریگر شدن وقفه صفر سطح منطقی صفر 1 تغییر در سطح منطقی پین لبه پایین رونده لبه بالا رونده

17 تنظیم ریجستر های مرتبط با وقفه
5-ریجستر MCUCSR(MCU control and status register): نوع تریگر شدن وقفه 2 با استفاده از ست کردن بیت 6 این رجیستر تعیین میشود.

18 تنظیم ریجستر های مرتبط با وقفه
6-رجیستر TIMSK(timer/counter interrupt mask register): این رجیستر مربوط به فعال کردن وقفه های تایمر ها و کانتر ها می باشد که در جلسات اینده به آن میپردازیم TICIE1 – Timer/Counter1 Input Capture Interrupt Enable (active high). OCIE1A – Timer/Counter1 Output Compare A Match Interrupt Enable (active high). OCIE1B – Timer/Counter1 Output Compare B Match Interrupt Enable (active high). TOIE1 – Timer/Counter1 Overflow Interrupt Enable (active high). 7-رجیسترTIFR (Timer/Counter Interrupt Flag Register):

19 Example-11 مثال: برنامه ای بنویسد که یک LED متصل به پورت B را در هر ثانیه یک بار روشن و خاموش کند و در صورت فعال شدن وقفه صفر با لبه پایین رونده همین کار را برای LED متصل به پورت A یک بار انجام دهد .

20 Example-11 مراحل حل این مثال:
پین صفرم پورت A و B با ید خروجی تعریف شود. بیت فعال ساز عمومی وقفه ها باید یک شود. بیت فعال ساز وقفه صفر باید یک شود. وقفه صفر باید حساس به لبه ی پایین رونده تنظیم شود. تابع اجرای وقفه صفر باید نوشته شود. برنامه اصلی در حلقه بی نهایت نوشته شود برنامه مربوط به وقفه در تابع وقفه نوشته شود

21 Example-11 #include <mega16.h> #include <delay.h> interrupt[2]void isr_int0() { PORTA.0=1; delay_ms(1000); PORTA.0=0; } void main(void) DDRA.0=1; DDRB.0=1; PORTD.2=1; #asm ("SEI") GICR= 0b ; //Int0 enable MCUCR=0b ; //falling sense while(1) PORTB.0=1; delay_ms(500); PORTB.0=0;

22 وقفه ها در کدویژن: همانطور که می دانیم کُد بصورت خط به خط اجرا می شود. زمانی که یک وقفه ایجاد شود، طبق جدول صفحه قبل، مسیر برنامه (دستور بعدی که اجرا خواهد شد) به آدرسِ متناظر با آن وقفه منتقل می شود و برنامه از آن نقطه، ادامه به اجرا شدن می کند. در نرم افزار CodeVision به ازای هر یک از این وقفه ها، مسیر برنامه به تابع مخصوص آن وقفه تغییر داده می شود (مانند این که تابع در زمان وقوع وقفه صدا زده شود) و تمامیِ دستوراتی را که درون بدنه ی تابع وقفه نوشته ایم را اجرا می کند!

23 راه اندازی وقفه های خارجی در codewizard:
انتخاب پایه های حساس به وقفه خارجی انتخاب نوع حساسیت برای هر یک از این پایه ها نوشتن کد مورد نظر درون محل در نظر گرفته شده برای هر وقفه که در زمان وقوع وقفه قرار است اجرا شود

24 Example-12 طراحی یک شمارنده دیجیتال: فرض کنیم یک کلید مانند شکل زیر را به پایه 16 میکروکنترلر وصل کرده باشیم. با وصل کردن کلید سطح ولتاژ این پایه از صفر به پنج ولت افزایش پیدا می کند. به دلیل فعال بودن وقفه خارجی INT0 و حساس بودن آن به لبه بالا رونده، هر زمان که کلید وصل شود، یک وقفه برای ما ایجاد می شود. قرار است شمارنده ای طراحی کنیم که تعداد کلیدهایی که زدیم را بر روی LCD نمایش دهد. interrupt [EXT_INT0] void ext_int0_isr(void) { static int counter = 0; //Using static cause’s variable “counter” to be declared only once //and has its value saved whenever we are out of this function! char str[16]; //Declaring a string variable (in RAM of course) counter++; //Increment’s variable counter sprintf(str , ”Pressed %d Times” , counter); //Fills variable str with: “Pressed Counter Times” lcd_clear(); //Clears the LCD for each new value of counter lcd_init(16); //Initializes the LCD and sets the cursor to (0,0) lcd_puts(str); //Prints str on the LCD }

25 Practice -4 1-برنامه ای بنویسید که هر پالس یایین رونده که به پایه وقفه صفر اعمال می شود را بشمارد و تعداد شمارش ها را بر روی سه 7segment نمایش دهد. 2- یک اشکار ساز عبور از صفر برای یک ولتاژ ورودی آنالوگ طراحی کنید . زمانی که سیگنال ورودی از صفر عبور میکند وقفه ای فعال شود و در آن وقفه پین صفر از پورت A به مدت چند ثانیه یک شود. 3-مطابق شکل زیر دو کلید فشاری به وقفه های صفر و یک میکرو کنترلر atmega16 متصل نموده ایم.می خواهیم برنامه ایی بنوسیم که زدن کلید up یک واحد به نمایشگر تک رقمی کاتد مشتر ک افزوده شود و با زدن کلید down یک واحد کاهش یابد ؟

26 صفحه کیبورد ماتریسی:

27 اسکن صفحه کلید نکته: در روي ورودي ها باید چهار عدد مقاومت pull upقرار
براي خواندن صفحه کلید چندین روش وجود دارد که ما در این جا از ساده ترین روش استفاده خواهیم کرد.در این روش چهار بیت از پورتهاي میکرو به صورت ورودي وچهار پورت دیگر به صورت خروجی تعریف می کنیم وپایه هاي کی پد (4*4)را به آن متصل میکنیم پس چهار بیت کم ارزش یکی از پورتهاي میکرو را به عنوان خروجی تعریف کرده، سطر هاي کی پد را به آن متصل میکنیم بعد چهار پین باقیمانده از پورت را به عنوان ورودي تعریف و به ترتیب به چهار ستون از کی پد متصل می کنیم نکته: در روي ورودي ها باید چهار عدد مقاومت pull upقرار داده شود

28 Example-13 PORTB.2=0;// سطر سوم را صفر ميکنيم سپس ستونها راچک مي کنيم
#include <mega16.h> PORTB.2=0;// سطر سوم را صفر ميکنيم سپس ستونها راچک مي کنيم #include <stdlib.h> // استفاده شده itoa(key_pressed,str_key_pressed); براي while (1) DDRB=0x0F; //چهار بيت کم ارزش پورت اي خروجي که به سطرها متصل هستند if(PINB.4==0)key_pressed=7; if(PINB.5==0)key_pressed=8; #include <delay.h> if(PINB.6==0)key_pressed=9; //چهار بيت پر ارزش پورت اي ورودي که به ستونها متصل هستند if(PINB.7==0)key_pressed=14; #asm .equ __lcd_port=0x1B ;PORTA //********************************* PORTB.3=0;// سطر چهارم را صفر ميکنيم سپس ستونها راچک مي کنيم #endasm #include <lcd.h> PORTB=0xFF; /*******متغيير هاي سراسري *********/ PORTB.0=0;// سطر اول را صفر ميکنيم سپس ستونها راچک مي کنيم if(PINB.4==0)key_pressed=10; int key_pressed=16; //براي ذخيره عدد فشرده شده key_pressed , if(PINB.5==0)key_pressed=0; delay_ms(5); if(PINB.6==0)key_pressed=11; if(PINB.4==0)key_pressed=1; if(PINB.7==0)key_pressed=15; char str_key_pressed[2]; //برا? ذخ?ره کد اسک? کل?د فشرده شده if(PINB.5==0)key_pressed=2; PORTB=0xF0; if(PINB.6==0)key_pressed=3; lcd_clear(); //ال سي دي رو پاک کن if(PINB.7==0)key_pressed=12; void main(void) lcd_putsf(" KEY PRESSED"); //lcd نوشتن پيغام مورد نظر بر روي { PORTB.1=0;// سطر دوم را صفر ميکنيم سپس ستونها راچک مي کنيم delay_ms(30); PORTA=0x00; itoa(key_pressed,str_key_pressed); DDRA=0x00; if(PINB.4==0)key_pressed=4; PORTB=0x00; if(PINB.5==0)key_pressed=5; lcd_gotoxy(8,1); DDRB=0x0F; if(PINB.6==0)key_pressed=6; lcd_puts(str_key_pressed); if(PINB.7==0)key_pressed=13; delay_ms(500); // LCD module initialization }; lcd_init(16); }

29 اسکن صفحه کلید به روش وقفه:
دلایل استفاده از 4 دیود در شکل زیر چیست؟

30 Example-14 #include <mega16.h>
#include <stdlib.h> // استفاده شده itoa(key_pressed,str_key_pressed); براي lcd_clear(); //ال سي دي رو پاک کن PORTB.2=0;// سطر سوم را صفر ميکنيم سپس ستونها راچک مي کنيم lcd_putsf(" KEY PRESSED"); //lcd نوشتن پيغام مورد نظر بر روي #include <delay.h> delay_ms(30); if(PINB.4==0)key_pressed=7; if(PINB.5==0)key_pressed=8; #asm itoa(key_pressed,str_key_pressed); if(PINB.6==0)key_pressed=9; .equ __lcd_port=0x1B ;PORTA if(PINB.7==0)key_pressed=14; #endasm lcd_gotoxy(8,1); #include <lcd.h> lcd_puts(str_key_pressed); PORTB.3=0;// سطر چهارم را صفر ميکنيم سپس ستونها راچک مي کنيم delay_ms(1000); /*******متغيير هاي سراسري *********/ } int key_pressed=16; //براي ذخيره عدد فشرده شده key_pressed , if(PINB.4==0)key_pressed=10; if(PINB.5==0)key_pressed=0; void refresh_key(void) //برنامه خواندن از صفحه کليد (تعریف تابع) if(PINB.6==0)key_pressed=11; char str_key_pressed[2]; if(PINB.7==0)key_pressed=15; PORTB=0xf0; void main(void) { interrupt [EXT_INT0] void ext_int0_isr(void)////انتراپت صفر با لبه پايين رونده فعال مي باشد PORTA=0x00; //********************************* DDRA=0x00; PORTB=0xF0; PORTB=0xFF; DDRB=0x0F; PORTB.0=0;// سطر اول را صفر ميکنيم سپس ستونها راچک مي کنيم char i; #asm("cli") // غير فعال کردن وقفه تا درصورتي که برنامه مشغول اسکن صفحه کليد مي باشدوقفه اي صورت نگيرد // External Interrupt(s) initialization delay_ms(5); // INT0: On if(PINB.4==0)key_pressed=1; // INT0 Mode: Falling Edge if(PINB.5==0)key_pressed=2; // INT1: Off if(PINB.6==0)key_pressed=3; // با اعمال لبه پايين رونده چهار بار صفحه کليد رفرش (چک) مي شود // INT2: Off if(PINB.7==0)key_pressed=12; GICR|=0x40; for(i=0;i<4;i++) MCUCR=0x02; MCUCSR=0x00; PORTB.1=0;// سطر دوم را صفر ميکنيم سپس ستونها راچک مي کنيم refresh_key(); GIFR=0x40; #asm("sei") // بعد از اجراي برنامه مورد نظر بايد دوباره وقفه ها فعال شوند که با اين دستور صورت مي گيرد // LCD module initialization if(PINB.4==0)key_pressed=4; lcd_init(16); if(PINB.5==0)key_pressed=5; if(PINB.6==0)key_pressed=6; #asm("sei") if(PINB.7==0)key_pressed=13; while (1)

31 Practice -5 1-برنامه مثال 13را به صورت نمایش عدد زده شده توسط صفحه کلید بر روی سون سگمنت تغییر دهید 2-مطابق شماتیک مثال 14 یک ماشین حساب ساده طراحی کنید که 4 عمل اصلی را انجام داده و با زدن کلید =حاصل را بر روی lcd نمایش دهد 3-برنامه مثال 14 را به گونه ایی اصلاح کنید که یک اضافه تر به نام کلید num lock داشته باشد و با زدن آن صفحه کلید ماتریسی فعال یا غیر فعال گردد 4-تحقیق کنید چگونه میتوان تابع نوشته شده در مثال 14 را به صورت یک فایل کتابخانه ایی برای استفاده در برنامه های مختلف به کار گرفت؟


Download ppt "Session 6."

Similar presentations


Ads by Google