Program Kodları
//AÇIKLAMA
//Bu uygulamada AIN0 ve AIN1 pinlerindeki karşılaştırma sonucu kesmeye gidilerek LED'in
//yakılması ve söndürülmesi sağlandı. Kesme modu yükselen kenar olarak ayarlandı. Ancak;
//fiziksel Arduino'da deneme yapılırken kullanılan potansiyometrede dalgalanmalar yada
//lineer olmayan voltaj değişimleri olması nedeniyle LED'de yanıp sönme ve düşen
//kenarda da kesmeye gidilme durumu oluştu. Proteus'ta yapılan simülasyon doğru bir biçimde
//çalıştı.
#define LED 2
bool ACO_biti;
void setup()
{
Serial.begin(9600);
pinMode(6, INPUT); //AIN0 pini. Karşılaştırıcının + ucu.
pinMode(7, INPUT); //AIN1 pini. Karşılaştırıcının - ucu. Referans giriş ucu.
pinMode(LED, OUTPUT);
digitalWrite(LED, LOW);
cli(); //Tüm kesmeleri kapat
ACSR |= (1 << ACIE); //karşılaştırıcı kesmesi açıldı.
ACSR |= (1 << ACIS1) | (1 << ACIS0); //Çıkışın yükselen kenarında karşılaştırma kesmesi olsun
ACSR |= (1 << ACI); //kesme bayrak biti sıfırlandı
ACSR |= (0 << ACBG); //Bandgap Referance Voltajı kapatıldı.
ACSR |= (0 << ACD); //Analog Karşılaştırıcıya güç verildi.
ACSR |= (0 << ACIC); //Timer1'deki giriş yakalama işlevi kapatıldı.
DIDR1 |= (1 << AIN1D) | (1 << AIN0D); //AIN1 ve AIN0 pinleri digital girişe kapatıldı
ADCSRB |= (0 << ACME); //ADC açıldı
ADCSRA |= (1 << ADEN); //Multiplex Input kapatıldı
sei(); //Tüm kesmeleri aç
}
void loop()
{
ACO_biti = bitRead(ACSR, 5); //ACSR kayıtçısının 5. biti olan ACO bitinin durumu(1 yada 0) değişkene atandı
if (ACO_biti == 1)
{
Serial.println("ACO Biti = 1");
delay(1000);
}
else if (ACO_biti == 0)
{
Serial.println("ACO Biti = 0");
Serial.println(ACSR, BIN);
delay(1000);
}
}
ISR(ANALOG_COMP_vect)
{
digitalWrite(LED, !digitalRead(LED)); //2 nolu pine bağlı ledin durumunu değiştir. Yanıyorsa söndür, sönükse yak.
Serial.println("Kesme oluştu.");
}
Devre Şeması
0 comments:
Yorum Gönder