Kumandadan gönderilen bitler alıcı göz tarafından terslendiğini için bitlerin nasıl ters çevrildiğini öğrenmemiz gerekir. Bu nedenle öncelikle bitlerin nasıl ters çevrildiğine bakalım.
Bit Kaydırma İşlemi:
for (int i = 0; i < 8; i++)
{
if (bin[i] == 1)
addr += 1 << i;
}

i=0 için; 1 sayısı 0 kez sola kaydırılıp addr ile VEYA işlemine tabi tutulduğunda, addr=00000001 olur.
i=1 için; 1 sayısı 1 kez sola kaydırılıp addr ile VEYA işlemine tabi tutulduğunda, addr=00000011 olur.
i=2 için; bin[2]=0 olduğu için işlem olmaz.
i=3 için; bin[2]=0 olduğu için işlem olmaz.
i=4 için; 1 sayısı 4 kez sola kaydırılıp addr ile VEYA işlemine tabi tutulduğunda, addr=00010011 olur.
i=5 için; 1 sayısı 5 kez sola kaydırılıp addr ile VEYA işlemine tabi tutulduğunda, addr=00110011 olur.
i=6 için; bin[6]=0 olduğu için işlem olmaz.
i=7 için; bin[7]=0 olduğu için işlem olmaz.
Programlama Kodları
//Bu uygulamada NEC protokolü kullanan kumandadan gönderilen IR sinyalin Adres ve DATA'sı alınır.
//NOT: Kumandadan gönderilen bitlerin alıcı göz tarafından terslendiğini unutmayın.
// Bilgiler ters olarak alındıktan sonra bit kaydırma ile gerçek verilere dönüştürülür.
uint16_t basla = 0;
int RECV_PIN = 11;
void setup()
{
Serial.begin(9600);
Serial.println("Enabled IRin");
}
void loop() {
again: //aynı düğmeye iki kez basıldığında bu programın tekrarlanması için
boolean bin[32];
int addr = 0, data = 0;
int sayy;
sayy = 0;
basla = 0;
//_______8 ms'den daha kısa LOW durumu varsa bekle______
while (pulseIn(RECV_PIN, LOW) < 8000); // wait until start bit is received.
{
}
//________3 ms ile 5 ms arasında HIGH durumu varsa devam et. Yoksa bekle_____
while (basla == 0)
{
sayy = (pulseIn(RECV_PIN, HIGH));
// Serial.println(sayy);
if (sayy > 3000 && sayy <= 5000) {
//Serial.println(sayy);
basla = 1;
}
}
//____________bitler okunup diziye kaydediliyor___________
for (int i = 0; i < 32; i++)
{
if (pulseIn(RECV_PIN, HIGH) > 1000)
bin[i] = 1;
else
bin[i] = 0;
}
//____________diziye kaydedilen bitler ekrana yazdırılıyor___________
//____bitler LSB'den başlayarak, yani ters olarak geldiği için ekranda
//gerçek değerlerin tersi gözükür______________
Serial.print("Bit Stream = ");
for (int i = 0; i < 32; i++)
{
Serial.print(bin[i]);
}
Serial.println();
//_______Adres bitleri LSB'den başlayarak, yani ters olarak geldiği için kaydırma yaparak
//gerçek adres değeri belirleniyor._____________
Serial.print("Address = ");
for (int i = 0; i < 8; i++)
{
if (bin[i] == 1)
addr += 1 << i; //1 değerini i kadar sola kaydır ve sonucu addr değişkenine ekle.
//Yani; addr değişkeninde i. biti 1 ile VEYA işlemine tabi tut demektir.
}
Serial.print(" ");
Serial.println(addr);
//_______Data bitleri LSB'den başlayarak, yani ters olarak geldiği için kaydırma yaparak
//gerçek adres değeri belirleniyor__________
Serial.print("Data = ");
for (int i = 0; i < 8; i++)
{
if (bin[i + 16] == 1)
data += 1 << i; //1 değerini i kadar sola kaydır ve sonucu addr değişkenine ekle.
//Yani; addr değişkeninde i. biti 1 ile VEYA işlemine tabi tut demektir.
}
Serial.print(" ");
Serial.println(data);
Serial.println();
}
Devre Şeması
Seri Port Ekran Görüntüsü

0 comments:
Yorum Gönder