سلام!
آموزش وقفه در AVR رو قبلا گفته بودیم!
اگه نمیدونید وقفه چیه تو یه کلام میشه گفت! = زمانی که یکی از پایه ها تحریک بشه CPU برنامه در حال انجام رو رها میکنه و میره توی وقفه تا کدهایی که قبلا نوشته بودیم رو انجام بده و بعدش دوباره برمیگرده و کار خودش رو انجام میده!
خوب بریم سراغ وقفه توی LPC1768
توی برد ECA که من دارم کلید های دوم و سوم به پایه اینتراپت (=وقفه) وصله!
برای همین با تحریک این دو کلید میتونیم وارد وقفه بشیم!
برای اینکار ما میام و یه LED رو چشمک زن میکنیم و توی وقفه هم یه LED دیگه رو چشمک زن میکنیم!
وقتی کلید رو میزنیم چراف LED اولی که درحال چشمک زدن بود ثابت میشه و اون چراغ دومی چشمک میزنه بعد از چند ثانیه دوباره اون اولیه شروع به چشمک زدن میکنه و دومی خاموش میشه!
دلیل اینکه لامپ اولی بعد از اینکه کلید رو زدیم ثابت میشه اینه که CPU دیگه از حلقه خارق میشه و میره و برنامه وقفه رو میخونه! برای همین اولی ثابت و دومی چشمک زن میشه! و....
اینم از کد برنامه!
#include <LPC17xx.h>
void delay(){ //ایجاد تابع زمان برای ایجاد فاصله زمانی
int i;
for (i=0;i<5000000;i++);
}
void EINT3_IRQHandler(){ // تابع وقفه
int j;
if ((LPC_GPIOINT->IO2IntStatF & 1<<11)) { //فعال کردن وقفه برای پین مورد نظر که به کلید وصله
for(j=0;j<4;j++){ //ساخت لامپ چشمک زن در وقفه
LPC_GPIO2->FIOSET = 3<<4 ;
delay();
LPC_GPIO2->FIOCLR = 3<<4 ;
delay();
}
LPC_GPIOINT->IO2IntClr = 1<<11 ; // پایان دادن به وقفه
//اگر کد بالا نباشد سی پی بو از وقفه خارج نمیشه
}
if (LPC_GPIOINT->IO2IntStatF & 1<<12) {
for(j=0;j<4;j++){
LPC_GPIO2->FIOSET = 3<<6 ;
delay();
LPC_GPIO2->FIOCLR = 3<<6 ;
delay();
}
LPC_GPIOINT->IO2IntClr = 1<<12 ;
}
}
int main(){
LPC_GPIO2->FIODIR1 = 0x00 ;
LPC_GPIO2->FIODIR0 = 0xFF ;
LPC_GPIO2->FIOCLR0 = 0xFF ;
LPC_GPIOINT->IO2IntEnF = (1<<11)|(1<<12); // شناساندن تابع وقفه
NVIC_EnableIRQ(EINT3_IRQn); //فعال کردن وقفه
while(1){
LPC_GPIO2->FIOSET=1; //چراغ چشمک زن
delay();
LPC_GPIO2->FIOCLR=1;
delay();
}
}