سلام دوستان.
الوعده وفا.
اینم همون پروژه ای که قولشو داده بودم.
این پروژه برای کار با تمام وقفه های خارجی(هر 8 وقفه)تدارک دیده شده.
مشخصات پروژه:
میکرو کنترل به کار رفته:atmega128
کریستال:8.000.000
زبان برنامه:بیسیک و سی
توجه:تمامی فایل های بیسیک و سی و شبیه ساز رو پیوست کردم.
توجه:اگه این مطلب به دردتون خورد یا هرچیز دیگه ای تشکر کردن(البته با استفاده از گزبنه ی تشکر)رو فراموش نکنید.
توجه:از این به بعد هر برنامه ای رو که قرار میدیم دیگه توضحات اضافی و توضیحاتی رو که قبلا دادم رو نمیدم.(بدلیل اینکه وقت ندارم).
هر کی هر سوالی داشت میتونه همینجا مطرح کنه یا ایمیل بزنه یا زنگ بزنه یا .......
برنامه به زیان بیسیک:
کد:
$regfile = "m128def.dat"
$crystal = 8000000
Config Lcdpin = Pin , Db7 = Porta.7 , Db6 = Porta.6 , Db5 = Porta.5 , Db4 = Porta.4 , E = Porta.3 , Rs = Porta.1
Config Lcd = 20 * 4
Eicra = &HFF
Eicrb = &HFF
Eimsk = &HFF
Eifr = &HFF
Sreg = &H80
On Int0 Int0h
On Int1 Int1h
On Int2 Int2h
On Int3 Int3h
On Int4 Int4h
On Int5 Int5h
On Int6 Int6h
On Int7 Int7h
Dim A As Word
Dim S As String * 5
S = Space(5)
Cursor Off
Do
Locate 1 , 1 : Lcd "Www.IranLed.Com" ; S
Locate 2 , 1 : Lcd "h.unique" ; S
Locate 3 , 1 : Lcd A
Locate 4 , 1 : Lcd S
Incr A
Waitms 500
Loop
Int0h:
Locate 4 , 1 : Lcd "Int0" ; S ; S ; S : Waitms 500
Return
Int1h:
Locate 4 , 1 : Lcd "Int1" ; S ; S ; S : Waitms 500
Return
Int2h:
Locate 4 , 1 : Lcd "Int2" ; S ; S ; S : Waitms 500
Return
Int3h:
Locate 4 , 1 : Lcd "Int3" ; S ; S ; S : Waitms 500
Return
Int4h:
Locate 4 , 1 : Lcd "Int4" ; S ; S ; S : Waitms 500
Return
Int5h:
Locate 4 , 1 : Lcd "Int5" ; S ; S ; S : Waitms 500
Return
Int6h:
Locate 4 , 1 : Lcd "Int6" ; S ; S ; S : Waitms 500
Return
Int7h:
Locate 4 , 1 : Lcd "Int7" ; S ; S ; S : Waitms 500
Return
End
برنامه به زیان سی:
کد:
#include <mega128.h>
#include <alcd.h>
#include <stdio.h>
#include <delay.h>
unsigned int a;
char aa[20];
void main(){
EICRA=0xFF;
EICRB=0xFF;
EIMSK=0xFF;
EIFR=0xFF;
lcd_init(20);
do{
sprintf(aa,"%d",a);
lcd_gotoxy(0,0);lcd_putsf("Www.IranLed.Com");
lcd_gotoxy(0,1);lcd_putsf("h.unique");
lcd_gotoxy(0,2);lcd_puts(aa);
lcd_gotoxy(0,3);lcd_putsf(" ");
a++;
#asm("sei");
delay_ms(500);
}while(1);
}
interrupt [EXT_INT0] void ext_int0_isr(void){
lcd_gotoxy(0,3);
lcd_putsf("Int0");
delay_ms(500);
}
interrupt [EXT_INT1] void ext_int1_isr(void){
lcd_gotoxy(0,3);
lcd_putsf("Int1");
delay_ms(500);
}
interrupt [EXT_INT2] void ext_int2_isr(void){
lcd_gotoxy(0,3);
lcd_putsf("Int2");
delay_ms(500);
}
interrupt [EXT_INT3] void ext_int3_isr(void){
lcd_gotoxy(0,3);
lcd_putsf("Int3");
delay_ms(500);
}
interrupt [EXT_INT4] void ext_int4_isr(void){
lcd_gotoxy(0,3);
lcd_putsf("Int4");
delay_ms(500);
}
interrupt [EXT_INT5] void ext_int5_isr(void){
lcd_gotoxy(0,3);
lcd_putsf("Int5");
delay_ms(500);
}
interrupt [EXT_INT6] void ext_int6_isr(void){
lcd_gotoxy(0,3);
lcd_putsf("Int6");
delay_ms(500);
}
interrupt [EXT_INT7] void ext_int7_isr(void){
lcd_gotoxy(0,3);
lcd_putsf("Int7");
delay_ms(500);
}
شبیه ساز:
توضیحات کلی:
1.وقفه چیه:وقفه رو با یک مثال توضیح میدم.
شما فرض کنید که میکرو یک معلم هستش و در حال درس دادنه.ناگهان یکی از دانش آموزا یک سوال میپرسه.معلم هم درسشو قطع میکنه و به سوال دانش آموز پاسخ میده و ادامه درس از همون جایی که قطع کرده ادامه میده.
در میکرو وقتی وقفه رخ میده اجرای دستورات از اون خطی که وقفه رخ داده متوقف میشه و به لیبل وقفه پرش میکنه و بعد از انجام دستورات درون لیبل مربوط به موقفه به همون خطی که اجرای اونو متوقف کرده بر میگره و اجرای دستورات از همون خط ادامه میده.
توضیحات برنامه بیسیک:
1.برای فعال سازی وقفه های خارجی از دستور:
در این دستور بجای x میتوام با توجه به میکرو مورد نظر وقفه خارجی تعریف کنیم.
state هم میتواند یکی از گرینه های:
1.RISING (حساس به لبه بالا رونده)
2.FALLING (حساس به لبه پایین رونده)
3.CHANGE (تغییر حالت دادن)
4.Low Level (اینم یه چیزی تو مایه های Falling هستش

)
باشه.
مثال:
در این مثال وقفه خارجی int1 حساس به لبه بالا رونده کانفیگ شده است.
بعد از کانفیگ کردن وقفه ها باید وقفه سراری و تمامی وقفه های مربوط به وقفه های خارجی رو که کانفیگ کردیم رو فعال کنیم.
کد:
Enable Interrupts
Enable Intx
بجای x باید شماره اون وقفه هایی رو که فعال کردیم رو قرار بدیم.
بعد از فعال کردن وقفه های باید برای هر وقفه یک لیبل قرار بدیم که هنگامی که وقفه خارجی رخ داد به اون لیبل پرش کنه:
مثال:
کد:
Config Int1 = Rising
Enable Interrupts
Enable Int1
On Int1 IranLed
IranLed:
.....
Return
در این مثال وقفه خارجی 1 رو حساس به لبه بالا رونده کانفیگ کردیم.و وقفه ی سراسری و وقفه INT1 رو هم فعال کردیم.در صورتی که بروی پایه INT1 وضعیت State که در اینجا حساس به لبه بالا رونده هستش رخ بده به لیبل IranLed پرش میکنه و دستورات درون لیبل رو اجرا میکنه.
نکته:در پایان لیبل مربوط به وقفه های خارجی حتما از دستور Return برای خروج از لیبل اسفاده کنید.
تـــــوجـــــه:اگه به برنامه ای که من نوشتم دقت کنید میبینید که از این دستورات استفاده نکردم.دلیل این کارم اینبود که با استفاده از این دستورات میکرو هنگامی که روشن میشد بالافاصله به لیبل ها پرش میکرد و بعد از انجام دستورات لیبل ها به حالت عادی برمیگشت.بعد از کلی این ور اونور کردن دستورات فهمیدم که مشکل از خود کامپایلر بیسکام هستش و با مقدار دهی ریجستر ها بصورت دستی این مشکل حل شد!
توضیحات برنامه سی:
در این کامپایلر دستوراتی همانند دستورات بیسکام وجود نداره و باید ریجستر هارو دستی مقدار دهی کنیم که اگه من بخوام ریجیستر ها و مقدار دهی اونارو توضیح بدم خیلی خیلی حجم مطالب زیاد میشه لذا از توضیح دادن این مطالب خوداری میکنم و به شما عزیزان توصیه میکنم که حتما یک کتاب مانند مرجع کامل میکرو کنترل های AVR تهیه کنید.اگر بازم کسی سوالی در این مورد داشت حتما با من در میون بزاره.
فقط چند دستور رو توضیح میدم:
1.برای فعال کردن وقفه سراسری از دستور:
استفاده میشه و برای غیر فعال کردن وقفه سراسری از دستور:
استفاده میشه.
2.برای تعریف لیبل مربوط به وقفه های خارجی با فعال کردن ریجستر های مربوط به اونا از دستور:
کد:
interrupt [EXT_INTx] void ext_intx_isr(void){
....
}
که بجای x شماره قفه ای که ریجستر ان هم مقدار دهی کرده ایم قرار میدیم.
تــــــــــوجه:اگه این مطلب به دردتون خورد یا هرچیز دیگه ای تشکر کردن(البته با استفاده از گزبنه ی تشکر)رو فراموش نکنید.
توجه:تمامی فایل های بیسیک و سی و شبیه ساز رو پیوست کردم.
امید وارم که توضیحات من و این پروژه بهتون کمکی کرده باشه.
موفق باشید.....





