وقفه ها و سازمان وقفه در ۸۰۵۱

۱ مقدمه
وقفه ، حالتي است كه باعث متوقف شدن يك برنامه به صورت موقت مي شود ، كه خود توسط يك برنامه ديگر فعال مي گردد . وقفه ها نقش مهمي در طراحي و پياده سازي كاربردهاي ميكروكنترل دارند ; اما مي تواند اجراي يك برنامه به يك درخواست ديگر نيز پاسخ دهد . نبايد تصور كنيم كه سيستم داراي وقفه ، مي تواند بسياري از كارها را همزمان انجام دهد . البته ، CPU نمي تواند در هر لحظه بيش از يك دستور العمل را اجرا كند ; دستور العمل ديگر را اجرا كند و مجدداٌ به دستور

اول باز گردد .در هر صورت ، اين عمل شبيه يك زيروال است . CPU برنامه ديگر – زيروال – را اجرا كند و مجدداٌ به دستور اول باز گردد . در هر صورت ،‌اين عمل شبيه يك زيروال است . CPU برنامه ديگر – زيروال – را اجرا كرده و سپس به برنامه اصلي بر مي گردد . شبيه يك زيروال است .تفاوتي كه در يك سيستم راه اندازي شده با وقفه وجود دارد ، اين است كه وقفه پاسخي به يك [اتفاق] است كه به طور غير همزمان با برنامه اصلي به وقوع مي پيوندد و حالتي نيست ه برنامه اصلي مورد وقفه قرار ميگيرد .
برنامه اي كه مربوط به وقفه مي شود يك روال سرويس وقفه (ISR) يا گرداننده وقفه ناميده مي شود ISR در پاسخ به يكوقفه عمل كرده و معمولاٌ عمليات ورودي يا خروجي را براي يك دستگاه انجام مي دهد . هنگام وقوع وقفه، اجراي برنامة اصلي متوقف شده و به ISR انشعاب صورت مي گيرد ; ISR اجرامي شود و با دستورالعمل [برگشت از وقفه] پايان مي پذيرد و برنامه اصلي ادامه

مي يابد . معمولاٌ برنامه اصلي سطح پايه و ISR سطح وقفه ناميده مي شود . اصطلاحات اصلي (سطح پايه ) و فرعي (سطح وقفه) نيزمورد استفاده قرار مي گيند . در شكل ۱-۶ قسمت (الف) ، اجراي برنامه بدون وقفه ، و در قسمت (ب) اجراي سطح پاي ، در صورت وقوع وقفه اجراي ISR ها در سطح وقفه ، به نمايش در آمده است .
ورود اطلاعات توسط صفحه كليد ، نمونه اي از يك اجاق مايكروويو را در نظر بگيريد . برنامه

اوليه(اصلي) ممكن است عنصر تغذيه مايكروويو را براي پخت ، و كاهش يا افزايش زمان پخت راكنترل كند . هنگامي كه كاربر كليدي فشار دهد يك وقفه توليد مي شود ، (سيگنالي كه مي تواند از سطح پائين به بالا رود ) و برنامه اصلي مورد وقفه قرار مي گيرد ، ISR كدهاي صفحه كليد را مي خواند و شرايط پخت را مطابق با آن تغيير مي دهد و با برگشت به برنامه اصلي خاتمه مي يابد و اجراي برنامه اصلي ادامه پيدا مي كند . نكته مهم در اين مثال اين است كه ورودي توسط شخص بطور [ غير همزمان ] صورت مي گيرد ، يعني زمان وقوع آنتوسط نرم افزار راه انداز سيستم قابل كنترل و پيش بيني نيست . اين يك وقفه است .

۲- سازمان وقفه ۸۰۵۱
در ۸۰۵۱ ، پنج منبع وقفه وجود دارد : دو وقفه خارجي ، دو وقفه تابمر و يك وقفه درگاه سريال . در ۸۰۵۲ ، وقفه ديگير نيز براي تايمري ديگر ، پيش بيني شده است . هنگام راه اندازي مجدد سيستم همه وقفه ها غير فعال يشده و بطور جداگانه توسط نرم افزار فعال مي گردند .
در صورت وقوع همزمان دو وقفه ياوقوع وقفه در صورتي كه وقفه ديگري در حال اجراست ، دو سطح تقدم براي آنها در نظر گرفته مي شود . توالي اجرا ثابت ، اما تقدم وقفه ها قابل برنامه ريزي ي باشد. اكنون چگونگي فعال و غير فعال كردن وقفه ها را بررسي مي كنيم .

۱-۲- فعال و غير فعال كردن وقفه
هر يك از منابع مقفه به طور مجزا ، از طريق بيت آدرس پذير مخصوص ، توسط ثبات IE (فعال كننده وقفه ) و آدرس ۰A8H فعال يا غير فعال مي شوند . علاوه بر بيتهاي فعال كننده خاص براي هر منبع وقفه ، يك بيت فعال كننده / غير فعال كننده كلي نيز وجود دارد كه پاك شدن آن كلية وقفه ها غير فعال شده و مي توانند با ۱ شدن آن ، مجدداٌ فعال شوند . (جدول ۱) را ببينيد )

براي فعال كردن هر وقفه ، دو بيت بايد ۱ شوند : بيت فعال كنندهخاص و بيت كلي . بطور مثال تايمر ۱ وقفه ها ، به صورت زير فعال مي شود :
SETB ET 1 ;ENABLE Timer 1 INTERRUPT
SETB EA ; SET GLOBAL ENABLE BIT
اين عمل را مي توان با دستور زير نيز انجام داد :
MOV IE,#10001000B

جدول ۱ خلاص ثبات IE (فعال كنندة وقفه)

بيت نماد آدرس بيت شرح (غير فعال = ۰ ،، فعال = ۱)
IE.7 EA AFH فعال / غير فعال كلي
IE.6 – AEH نامعين
IE.5 ET2 ADH فعال كردن وقفه تايمر۲(۸۰۵۲)
IE.4 ES ACH فعال كردن وقفه درگه سريال
IE.3 ET1 ABH فعل كردن وقفه تايمر ۱

IE.2 EX1 AAH فعال كردن وقفه ۱ خارجي
IE.1 ET0 A9H فعال كردن وقفه تايمر ۰
IE.0 EX0 A8H فعال كردن وقفه ۰ خارجي

اگر چه اين دو روش ، دقيقاٌ همان اثر راه اندازي مجدد سيستم را دارند ، اگر IE را در وسط برنامه ، به صورت متعلق [معلق] برنامه ريزي كنيم ، اثر متفاوتي در برخواهد داشت . روش اول تأثيري بر پنج بيت ديگر ثبات IE ندارد ، در حالي كه روش دوم بوضوح بيتهاي ديگر را پاك مي كند . بهتر است كه در شروع برنامه IE را با دستور “MOVE BYTE” مقدار دهي كنيم ، ( يعني به دنيال تغذيه يا reset( كردن سيستم ) اما براي فعال و غير فعال كردن وقفه هاي به ثورت معلق داخل برنامه ، بايد از دستورهاي Set bit و Clear bit استفاده كرد تا روي بيتهاي ديگر ثبات IE تأثيري نداشته باشد .

 

۲-۲- تقديم وقفه
هر منبع وقفه در يكي از دو طريق بيت آدرس پذير مخصوصي در ثبات IP (تقديم وقفه) در آدرس ۰b8h برنامه ريزي مي شود ( جدول ۲ را ببينيد )
پس از راه اندازي مجدد سيستم IP پاك شده و همة وقفه ها در سطح تقدم پايين به صورت پيش فرض قرار مي يگرند . نظريه تقديم اين امكان را مي دهد كه وقفه ها بر اساس تقدم بالاتر ، توسط ISR سرويس شوند . در ۸۰۵۱ اين امر به آساني انجام مي شود ، چون تنها دو سطح تقديم وجو

د دارد . چنانچه هنگام سرويس دهي به يك وقفه يا تقدم پائين ، وقفه اي با تقدم بالاترروي دهد ، توسط ISR مورد پذيرش قرار مي يگرد ، ولي يك وقفه با تقدم بالاتر مورد وقفه قرار نمي گيرد .
برنامه اصلي ، در سطح پايه اجرا شده و با هيچ وقفه اي همراه نيست ، و همواره مي تواند بدون توجه به تقدم وقفه ها مرد وقفه واقه شود . در صورت روي دادن همزمان دووقفه با تقدمهاي

متفاوت ، ابتدا وقفة با تقدم بالاتر سرويس دهي مي شود .
جدول ۲ خلاصه ثبات IP (تقدم وقفه )
بيت نماد آدرس بيت شرح (غير فعال = ۰ ،، فعال = ۱)
IP.7 نا معين

IP.6 نامعين
IP.5 PT2 0BDH تقدم وقفه تايمر ۲(۸۰۵۲)
IP.4 PS 0BCH تقدم وقفه درگاه سريال
IP.3 PT1 0BBH تقدي موقفة تايمر ۱
IP.2 PX1 0BAH تقدي موقفة ۱ خارجي
IP.1 PT0 0B9H تقديم وقفة تامير ۰
IE.0 EX0 0B8H تقديم وقفة ۰ خارجي
۳-۲ ترتيب اجرا
اگر دو وقفه با يك تقدم ، هممان اتفاق بيفتند ، يك ترتيب اجراي ثابت نوبت سرويس دهي هركدام از آنها تعيين مي كد . ترتيب اجرا : ۰ خارجي ، تايمر ۰;۱ خارجي ، تايمر۱; درگاه سريال ، و تايمر ۲ مي باشد .

شكل ۲ ، پنج منبع وقه ، فرايند فعال كرد كلي و خاص ، ترتيب اجرا ، و سطوحتقديم را شرح مي دهد . حالت همه منابعوقفه از طريق بيتهاي پرچم در SFR ها قابل دستيابي است . البته اگر وقفه اي غير فعال شده باشد ، اتفاق نخواهد افتاد ، اما نرم افزار باز هم پرچم وقفه را تست مي كند . مثالهايدرگاه سريال و تايمر در دو فصل اخير بدون استفاده واقعي از وقفه ها ، بطوروسيع از پرچمهاي وقفه بهره بردند .

يك وقفه درگا سريال ناشي از OR منطقي دريافت وقفه (RI) يا ارسل وقفه (TI) مي باشد همچنين وقفه هاي تايمر۲ با سرريز تايمر (TF2) يا پرچم ورودي خارجي (EXF2) تويد مي شوند . بيتهاي پرچم كه مقفه ها را توليد مي كنند ، در جدول ۳-۶ خلاصه شده اند .
۳-۶ وقفه هاي پردازنده
هنگام وقوع يك وقفه و پذيرش آن توسط CPU ، برنامه اصلي مورد وقفه قرار مي يگرد واعمال زير انجام مي شوند :
اجراي دستورالعمل فعالي كامل مي شود .
PC در پشته ذخيره مي شود .
وضعيت وقفه جاري بطور داخلي ذخيره مي شود .
وقفه هاي. مسطح با اين وقفه متوقف ميشوند .
PCبا آدرس برداري ISR بار مي شود .
ISR اجرا مي شود .
جدول ۳ بيتهاي پرچم وقفه
وقفه پرچم ثبات SFR و موقعيت بيت

۰ خارجي IE0 TCON.1
1 خارجي IE1 TCON.3
تايمر ۱ TF1 TCON.7

تايمر ۰ TF0 TCON.5
درگاه سريال TI SCON.1
درگاه سريال RI SCON.0

تايمر ۲ TF2 T2CON.7(8052)
تايمر ۲ EXF2 T2CON.6(8052)

اجراي ISR ، پاسخگويي به وقفه است ، و با دستورالعمل RETI (برگشت از وقفه) خاتمه مي يابد. با انجام اين عمل مقدار قبلي PC از پشته بازيابي شده و وضعيت قبلي نيز ذخيره مي گردد . اجراي برنامه اصلي پس از وقفه ادامه مي‌يابد .

۱-۳ بردارهاي وقفه

هنگامي كه يك وقفه مورد پذيرش قرار مي گيرد ، عدد بار شده در PC بردار وقفه ناميده مي شود ; كه در واقع آدرس شروع ISR براي منبع وقفه است . بردارهاي وقفه در جدول ۴-۶ ارائه شده اند .
بردار reset سيستم (RST در آدرس ۰۰۰۰H ) نير در جدول آمده است . از آن جا كه اين حالت

مانند يك وقفه است ، برنامه اصلي رامورد وقفه قرار داده و PC را با مقدار بار مي كند .
هنگام ” بردار كردن يك وقفه ” پرچميكه باعث وقه مي شود ، بطور خودكار توسط سخت افزار پرك مي گردد . RI و TI براي وقفه هاي درگاه سريال و TF2 و EXF2 براي وقفه هاي تايمر۲ ، از اين امر مستثنا هستند . چون براي هر يك از يوقفه ها دو منبع وجود دارد ، پاك كردن پرچم وقفه توسط CPU عملي نيست . اين بيتها بايد در ISR براي تعيين منبع وقفه ، آزمايش شوند ؛ و سپس پرچم

وقفه دهند توسط نرم افزار پاك مي شود . معمولاٌ با توجه به مبنع وقفه انشعابي به عملياتي مناسب صورت مي گيرد .
چون بردارهاي وقفه در انتهاي حافظه كد هستند ، اولين دستورالعمل بر نامه اصلي غالباٌ يك پرش از رويناحية حافظه ، مانند LJMP 0030H مي باشد .

جدول ۴ بردارهاي وقفه
وقفه پرچم ثبات SFR و موقعيت بيت
Reset سيستم RST 0000H

۰ خارجي IE0 0003H
0 تايمر TF0 000BH
1 خارجي IE1 0013H
تايمر ۱ TFI 001BH
درگاه سريال TIياRI 000023
تايمر ۲ EXF2 يا TF2 002BH

۴- طراحي برنامه با استفاده از وقفه ها
در مثالهاي فصل ۳و ۴ از وقفه ها استفاده نشد ، حلقه هاي انتظاربراي تست پرچمهاي سرريژ تايمر (TF0 ، TF1 يا TF2 ) يا پرچمهاي دريافت و ارسال درگاه سريال (T1 يا RI ) ، ب

ه طور گسترده اي بكار رفتند . مشكل اين روش اسن است كه تمامي وقت CPU صرف تست پرچمهايي كه بايد ۱ شوند ، مي گردد . اين امر هنگامي كه در مقاصد كنترلي ، ميكروكنترل بايد دستگاههاي ورودي وخروجي زيادي را بطور همزمان كنترل كند ، مناسب نيست .

در اين بخش ، مثالهايي براي تشريح عمليروشهاي پياده سازي نرم افزار براي مقاصد كمترلي ، ارائه مي شوند . نكته اصلي ، وقفه است . اگرچه مثالها لزوماٌ بزرگ نيستند ، اما پيچيده مي باشند و براي شرح انها قدم به قدم حركت خواهيم كرد . به خواننده توصيه مي كنيم كه مثالها را به آرامي مطالعه كرده و نرم افزار را بادقت زياد بررسي كند . پيچيده ترين خطاها در طراحي سيستم غالباٌبا وقفه ها در ارتباط مي باشند و جزئيات بايد بدرستي درك شوند .
چون ما از وقفه ها استفاده مي كنيم ، مثالها كامل و خود كفا خواهند بود . هر برنامه ، با اين فرض كه پس از reset شدن سيستم اجراي آن شروع مي شود ، از آدرس ۰۰۰۰H آغاز مي شود . اين برنامه ها براي مقاصد كاملاٌ جديد و تاز در ROM يا EPROM ذخيره مي شوند .
قالب پيشنهادي براي يك برنامه خد كفا با استفاده از وقفه ها ، در زير نشان داده شده است :
ORG 0000ا ;RESET ENTRY POINT
LJMP MAIN
. ;ISR ENTRY POINTS
.
ORG 0030H ;MAIN PROGRAM ENTY POINT
MAIN : . ; MAIN PROGRAM BEGINS

.
.
اوليت دستور ، مطابق جدول ۴-۶ به آدرس ۰۰۳۰H ، درست بالاي محل برداري كه ISR ها مي شوند ، پرش مي كند . چنانچه در شكل ۳-۶ نشان داده شده است ، برنامه اصلي از آدرس ۰۰۳۰H شروع مي شود .

 

۱-۴- رولهاي سرويس وقفه كوچك
روالهاي سرويس وقفه بايد از انتهاي حافظه در آدرسهاي نشان داده شده در جدول ۴-۶ شروع شوند اگرچه بين نقطه ورود هر يك از وقفه ها ، فقط هشت ياب وجوددارد ، اين مقدا

ر حافظه غالباٌ براي انجام عمليات مناسب و بازگشت از از ISR به برنامه اصلي ، كافي است .
اگر تنهااز يك منبع وقفه استفاده شود ، مثلاٌ تايمر ۰ ، بايدقالب زير را به كار برد :
ORG 0000H ;RESET
LJMP MAIN
ORG 000BH ;Timer 0 ENTRY POINT
TOTSR . ;Timer 0 ISR BEGINS
.
RETI ;RETURN TO MAIN PROGRAM

MAIN .
.
.
اگر وقفه ها بيشتر باشند ، بايد از شروع شدن آنها از محل صحيح ( جدول ۴-۶را ملاحظه كنيد ) كه باعث راه اندازي مجدد ISR بعدي نشود ، اطمينان حصل كرد، چون در مثال بالا از يك

 

۲-۴ روالهاي سرويس وقفه بزرگ
اگر يك ISR از هشت بايت بيشتر باشد ، بايد آن را ب حافظه كد انتقال داد يا نقطه ورود آن را براي وقفه بعدي تغيير داد . براي مثال ، ISR با يم پرش به ناحيه اي ازحافظه كد كه بتوان آن را وسعت داد ، آغاز مي شود . با در نظر گرفتن تايمر ۰ در حال حاضر بتنهايي ، مي توان از قالب زير استفاده كرد .
ORG 000H ;RESET ENTRY POINT
LJMP MAIN
ORG 000BH ;TIMER 0 ENTRY POINT
LJMP TOIGR
ORG 0030H ;ABOVE INTERRUPT VETORS
MAIN .
.
.

TOISR: .
. ;TIMER 0 ISR
RET ;RETURN TO MAIN PROGRM
براي سهولت ، برنامه ها تنها يك كار را در يك زمان انجام خواهندداد . برنامه اصلي ، تايمر ، درگاه سريال ، و ثباتهاي وقفه را بطور مناسب مقدار دهي مي كند و سپس يچ كاري انجام نمي دهد . تمامي كار توسط IS انجام مي شود . پس از دستور العمل مقدار دهي ، برنامه اصل

ي شامل دستور العمل زير است :
HERE : SJMP HERE
هنگام وقوع يك وقفه ، برنامه اصلي موقتاٌمتوقف شده و ISR اجرا مي شود ، دستور RETI در پايان ISR كنترل را به برنامه اصلي برگردانده و پس از آن كاري انجام نميدهد . اين عمل چندان سهم دور از ذهن نيست . در بسياري ازمابردهاي كنترلي قسمت عمده كار در حقيقت توسط روال سرويس وقفه انجام مي شود .
وقفه هاي تايمر هنگامي روي مي دهند كه ثباتهاي تايمر (TLx/THx) سرريز كرده و پرچم سرريز (TFx) را ۱ كنند . اين مثال در فصل ۴ بدون استفاده از وقفه ها آمده است (مثال راملاحظه كنيد ) . بدنه برنامه ، همان است اما در اين جا از وقفه ها استفاده خواهيم كرد . برنامه مزبور عبارت است از :
۰۰۰۰ ۵ ORG 0 ; RESET ENTRY POINT
0000 020030 6 LJMP MAIN ;Jump above interrpt vectors
000B 7 ORG 000BH ;Timer 0 interrupt vector

۰۰۰B B290 8 TOISER; CPL P1.0 ;Toggle port bit
اين يك برنامه كامل است ، كه مي تواند درون EPROM ريخته شده و در كامپيوتر تك بورد ۸۰۵۱ نصب شود . بلافاصله پس از راه اندازي مجدد شمارنده برنامه با عدد ۰۰۰۰H بار مي شود ،‌اولين دستورالعمليكه اجرا مي شود ، ljmp main است ، كه isr تابمر را به آدرس ۰۰۳۰h در حافظه كد انشعاب مي دهد . سه دستور العمل بعدي (خط هاي ۱۱ تا ۱۳ ) تايمر ۰ را در حالت بار شدن سخودكار ۸ بيتي ، با سرريزه ها در هر ۵ يكبار ، مقدار دهي مي كنند . دستورالعل IE MOV ,

#۸۲H وقفه هاي تايمر ۰را فعال مي كند ، بگونه اي كه سرريز تايمر توليد يك وقفه مي نمايد . البته اولين سرريز پس از اتفاق مي افتد ، برنامه اصلي متوقف شده و ISR تايمر ۰اجرا مي گردد . ISR بسادگي بيت درگاه را متمم كرده و پس از حلقه انجام ندادن كار به مدت ، به برنامه اصلي باز مي گردد .
توجه كنيد كه پرچم ايمر TF0 بوضوح توسط نرم افزار پاك نمي شود . هنگامي كه وقفه ها فعال شوند ، TFO هنگام پاسخ CPU به وقفه بطور خودكار توسط سخت افزار پاك مي شود .

آدرس بازگشت در برنامه اصلي ، لزوماٌ در محل دستورالعمل SJMP مي باشد . اين آدرس در پشته داخلي ۸۰۵۱ ، پوش مي شود تا هر يك از وقفه ها را جهت دهي كند و در پايان ISR و اجراي دستورالعمل RETI از پشته ، پاپ مي شود . چون به SP مقداري داده نشده است ، مقدار ۰۷H

به صورت پيش فرض براي آن درنظر گرفته مي شود . عمليات پوش آدرس بازگشت به RAM داخلي را در محل و قرار مي دهد .

آرايش سخت افزاري و زمان بندي هاي لازم براي شكل موجها در شكل ۴ نشان داده شده است . اين تركيب خروجي ها براي توليد در يك سيستم بدون وقفه ،