وقفه (interrupt)

در وقفه کار cpu متوقف می شود کاری انجام می شود و سپس به کار قبلی بر می گردد.

دو نوع وقفه داریم:

1-داخلی (internal)،نرم افزاری ، سنکرون ،واحدی درون سیستم میکروپروسسور از cpu  درخواست وقفه کند.

2-خارجی (external) ،سخت افزاری، آسنکرون،اگر به واسطه پالسی خارج از میکرو کنترلر بتوانیم از cpu درخواست وقفه کنیم ، وقفه خارجی رخ داده است که به هیچ عنوان به واحدهای داخلی وابسته نیست.

وفه های خارجی اولویت بالاتری نسبت به وقفه های داخلی دارند اگر در سیستمی بیش از یک وقفه وجود داشته باشد امکان همزمانی وقفه ها وجود دارد.

به لحاظ اولویت بندی ، وقفه ها به دسته تقسیم می شوند:

1-تک سطحه(single stage):اولویت وقفه ها ثابت و توسط کاخانه یکبار تعیین می شود.(av,pink)

2-چند سطحه(multi stage):اولویت وقفه ها می تواند در هر پروژه ای تعین وتغییر یابد.(ARM)

 

3                                      external

Mega16 و Mega32

17                                    internal

 

منظور از بردارهای وقفه (vector number) محل هایی از حافظه SRAM است که به وقه ها اختصاص یافته است.

هرچی عدد بردارهای وقفه کمتر باشد اولویت وقفه بالاتر است.

Mega16 و Me4ga32 در اولویت بندی وقفه ها متفاوت هستند.که در Datasheet آنها می توان این تفاوت را فهمید.

نحوه  فعال کردن وقفه ها:

وقفه ها به صورت default  غیر فعال هستند.

1-فعال کردن سراسری وفه ها از رجیستر status

I

 

 

 

 

 

 

 

برای فعال کردن سراسری ، بیت 7 را باید یک کرد.چون این بیت خیلی مهم است یک دستور اسمبلی برای آن تعریف کرده اند:

#asm(“sei”)                                       فعال کردن            

#asm(“cli”)                                                  غیر فعال کردن

 

2-فعال نمودن وقفه مورد نظر

هر منبع وقفه دارای یک پرچمFLAG)) است.پرچم همیشه پایین است.اگر پرچمی بالا برود یعنی وقفه رخ داده اس در غیر اینصورت یعنی وقفه ای رخ نداده است.

کاری که می خواهیم در حین رخ دادن وقفه انجام گیرد را تابعی خارج از تاع اصلی تعریف می کنیم که این تبع بدون خروجی و ورودی می باشد.فرق این تابع با تابع های فرعی این است که دیگر در تابع main فراخوانی نمیشود تنها interrupt را فعال می کنیم.

Interrupt [vector number] void نام تابع (void)

{

}

برای INT0 ، vector number=2 ، برای INT1  ، vector number=3 و برای INT2  ، vector number=19 می باشد

کارهای لازم به هنگام خروج از ISR

کارهای لازم به هنگام ورود به ISR

1-بیت سراسری را فعال می کنیم

1-پایین آودن پرچم وقفه(به صورت سخ افزاری انجام می گیرد و لازم نیست ما این کار را انجام دهیم)

 

2-بیت سراسری وقفه را غیر فعل می کنیم(معمولی)

چون در حالت default وقفه ها به صورت تودرتو انجام میشوند یعنی وقتی در حین یک وقفه وفه دیگری رخ دهد وقفه دوم اجرا می شود و وقتی وفه دوم تمام شد وقفه اول از ابتدا شروع به کار میکند.این کار را میکنیم که وقفه دومی اجرا نشود.

در واقع می خواهیم اگر در حین یک وفه ، وقفه دیگری رخ دهد وقفه اول تمام شود سپس وقفه دیگر شروع به کار کند.

حتما برای استفاده از وقفه های خارجی باید پایه ها را ورودی کنیم و PULL-UP هم اید فعال شود.

وقفه های خارجی (External Int):

PD2

INT0

PD3

INT1

PB3

INT2

 

رجیسترهای مربوط:

0

0

0

0

0

INT

2

INT

0

INT

1

بیت هایی که صفر کردیم مربوط به وقفه ها نیست.

برای فعال کردن INT مورد نظر آن بیت را یک می کنیم.

GICR

0

0

0

0

0

INTF

2

INTF

0

INTF

1

مربوط به پرچم وقفه ها که اگر یک باشد یعنی بالا رفته اگر 0 باشد یعنی پایین است.

GIFR

ISC 00

ISC 01

ISC 10

ISC 11

 

0

0

0

0

بیت 0 و 1 مربوط به INT 0 و بیت 2 و 3 مربوط به INT 1 است.

00

سطح صفر

01

ANY LOGICAL CHANGE

10

لبه پایین رونده

11

لبه بالاونده

سطح یک نداریم چون PULL-UP است و به صورت default یک است.

MCUCR

0

0

0

0

0

0

ISC

2

0

این رجیستر مربوط به INT 2  می باشد.

گر بیت 6 صفر باشد لبه پایین رونده و اگر یک باشد لبه بالارونده است.

MCUCSR

 برای استفاده از وقفه های خارجی باید همانند زیر عمل کنیم:

1-ابتدا پایه مربوط به وقفه را ورودی کرده و pull-up می کنیم.

2-وقفه مورد نظر را فعال می کنی.

3-مشخص می کنیم نسبت به چی حساس است.

4-وقفه سراسری را فعال می کنیم.