Bu uygulamada; program başladığında Arduino 13 nolu pine bağlı led sürekli yanıp söner. 5 nolu pine bağlı butona basıldığında pin sıfıra götürülür ve kesme çalışır. Kesme çalıştığında ana program durur. Kesmeye gidildiğinde butona basık olduğu süre içinde 8 nolu pine bağlı led yanar. Elimizi butondan çektiğimizde söner.
NOT: Bu uygulamadaki kesme işlemi Proteus'ta çalışmadı. Bu nedenle fiziksel Arduino kartında deneme yapıldı ve çalıştı.
Program Kodları:
int kesme_led = 8;
int surekli_led = 13;
int kesme_pin = 5;
void pciSetup(byte pin) //Pin Change Interrupt işleminde; belirlediğimiz pin için gerekli ayarları yapan ve bu pin için registerlardaki değerleri değiştiren fonksiyon
{
*digitalPinToPCMSK(pin) |= bit(digitalPinToPCMSKbit(pin)); // enable kesme_pin
PCIFR |= bit(digitalPinToPCICRbit(pin)); // clear any outstanding interrupt
PCICR |= bit(digitalPinToPCICRbit(pin)); // enable interrupt for the group
}
void setup()
{
pinMode(kesme_led, OUTPUT);
pinMode(kesme_pin, INPUT);
pinMode(surekli_led, OUTPUT);
pciSetup(kesme_pin); //kesme yapacağımız pin için gerekli ayarları yapan fonksiyonu çağırır.
}
void loop()
{
digitalWrite(surekli_led, HIGH);
delay(500);
digitalWrite(surekli_led, LOW);
delay(500);
}
ISR(PCINT2_vect) //PortD'den kesme geldiğinde bu kısım çalışır.
{
//butona basıkken led yanar elimizi çekince led söner.
digitalWrite(kesme_led, HIGH);
while (digitalRead(kesme_pin) == 0);
delay(50);
digitalWrite(kesme_led, LOW);
}
Devre Şeması:
_____________________________________________________________________________________________________________________________________________________
0 comments:
Yorum Gönder