Bu uygulamada Timer1 kesmesi kullanıldı. Kesme işlemi için harici clock sinyali söyle oluşturuldu:
Arduino'nun 3 nolu pininden PWM sinyali gönderildi. Sonra bu pin 220ohm direnç ile 5 nolu pine bağlandı. 5 nolu pin Timer1'in harici clock girişidir. Yani Arduino'nun kendi ürettiği PWM sinyali alınıp tekrar kendine harici clock sinyali olarak verildi. Arduino'nun 3 nolu pininden PWM çıkışının frekansı 490 hz'dir. Timer1 çözünürlüğü de 1469 yapıldı. Bu değerler kesme süresin 3 sn olmasını sağladı. Böylece program her 3 sn'de bir kesme alt programına giderek buradaki ledi yaktı. Ana programa dönünce led söndürüldü.
NOT: Bu uygulamadaki kesme işlemi Proteus'ta çalışmadı. Bu nedenle fiziksel Arduino kartında deneme yapıldı ve çalıştı.
void setup()
{
pinMode(13, OUTPUT);
pinMode(3, OUTPUT);
cli(); //tüm kesmeler durduruldu
TCCR1A = 0; // TCCR1A register 0'lanıyor
TCCR1B = 0; // TCCR1B register 0'lanıyor
TCNT1 = 0; //sayaç değeri sıfırlandı
OCR1A = 1469; //timer1 çözünürlüğü
TCCR1B |= (1 << WGM12); //CTC(Clear Timer on Compare Match) mod açıldı
TCCR1B |= (1 << CS12) | (1 << CS11) | (1 << CS10); //external clock yapıldı. yükselen kenarda tetikleme olacak
TIMSK1 |= (1 << OCIE1A); //timer1 karşılaştırma kesmesi aktif edildi
sei(); //tüm kesmelere izin verildi
}
void loop()
{
digitalWrite(13, LOW);
analogWrite(3, 127); //3 nolu pine %50 görev döngüsünde PWM sinyali gönderildi.
}
ISR(TIMER1_COMPA_vect)
{
digitalWrite(13, HIGH);
delay(2000);
}
_______________________________________________________________________________________________________________________________________________________
0 comments:
Yorum Gönder