Arduino'daki shiftIn() ve shiftOut() komutları, bir pinden, her clock sinyalinin yükselen kenarında 1 bit olmak üzere toplam 8 bit(1 bayt) veri okur ya da veri gönderir. Okuma yönü, en sağdaki bitten(LSB) en soldaki bite(MSB) ya da en soldaki bitten(MSB) en sağdaki bite(LSB) doğru yapılır.

LSB      : “Least Significant Bit” demektir. Türkçe olarak en az anlamlı bit demektir.

MSB     : “Most Significant Bit” demektir. Türkçe olarak en anlamlı bit demektir.

 

 

 

Arduino'daki shiftIn() ve shiftOut() komutları, çok genel bir ifadeyle, SPI'nin yazılım uygulamalarıdır. Elbette, SPI çok daha hızlıdır, ancak SPI yalnızca Arduino'nun belirli bazı pinlerinde çalışabilir. shiftIn() ve shiftOut() , Arduino'nun herhangi iki pininde kullanabilir.

 

shiftIn: Bu komut, Arduino’nun herhangi bir data pininden gelen 8 bitlik bir veriyi, her saat darbesinde, en sağdaki bitten en soldaki bite yada en soldaki bitten en sağdaki bite doğru bir bit veri kaydırması yaparak okur ve kaydeder. Her saat darbesinin yükselen kenarında bitin transferi gerçekleşir.

Örnek kullanım:

byte veri;

veri = shiftIn(dataPin, clockPin, okumaYonu)

veri                    : İzin verilen veri türleri: byte.

dataPin            : Verilerin okunmasını sağlayan pin.

clockPin           : Gönderici ile alıcı cihaz arasında senkronizasyon sağlayan clock sinyali çıkış pini.

okumaYonu   : Verilerin hangi sıra ile okunması gerektiğini belirten pin. LSBFIRST (en sağdaki bitten en soldaki bite). MSBFIRST (en soldaki bitten en sağdaki bite).

 

shiftOut: Bu komut, Arduino’nun herhangi bir data pininden, 8 bitlik bir veriyi, her saat darbesinde, en sağdaki bitten en soldaki bite ya da en soldaki bitten en sağdaki bite doğru bir bit veri kaydırması yaparak çıkışa gönderir. Her saat darbesinin yükselen kenarında bitin transferi gerçekleşir.

Örnek kullanım:

byte veri;

shiftOut(dataPin, clockPin, yazmaYonu, veri);

dataPin           : Verinin gönderileceği pin.

clockPin          : Gönderici ile alıcı cihaz arasında senkronizasyon sağlayan clock sinyali çıkış pini.

yazmaYonu   : LSBFIRST (en sağdaki bitten en soldaki bite). MSBFIRST (en soldaki bitten en sağdaki bite).

Veri                  :Alıcı cihaza gönderilecek veri (byte). İzin verilen veri türleri: byte.

 

NOT: Yükselen kenarda tetikleme olduğu için shiftIn() ve shiftOut() komutundan önce clock sinyalini LOW konuma alınız. Örnek: digitalWrite(clockPin, LOW);

 

Yaptığımız Arduino uygulamalarında shiftIn() komutu ile 74HC/HCT165 entegresinden veri alacağız ve shiftOut() komutu ile de 74HC/HCT595 entegresine veri göndereceğiz. Öncelikle bu entegrelerin kullanımını öğrenelim.

 

74HC/HCT165 Entegresinin Özellikleri ve Kullanımı

Entegrenin Özellikleri:

74HC/HCT165 entegresi; bir shift register entegresidir. Türkçe karşılık olarak kaydırmalı yazmaç diyebiliriz. 74HC/HCT165;  D7…D0 pinlerinden paralel olarak giren 8 bit lojik bilgiyi Q7 pininden seri olarak çıkışa verir. Entegreden dışarıya veri gönderme clock sinyali ile yapılır ve clock sinyalinin yükselen kenarında gönderme olur.

 

 

 

 


  

Entegrenin Kullanımı:

Entegrenin giriş değerlerini (D0…D7), entegrenin 8 bitlik shift register’ına kaydetmek için;

PL (1 nolu bacak – Parallel Load Input ) pini LOW yapılarak giriş moduna alınır.

CE (15 nolu bacak – Clock Enable Input) bacağı da LOW yapılır.

CP (2 nolu pin - Clock) bacağından gelen sinyalin ilk yükselme anında, D0…D7 den gelen giriş değerleri shift register üzerine kaydolur.

Bundan sonra PL (1 nolu bacak – Parallel Load Input ) pini HIGH yapılarak giriş modu kapatılarak çıkış moduna alınır ve girişten değer okumaz.

İşte bu andan sonra, clock sinyalinin her yükselen kenarında, entegrenin shift register’ı içerisindeki data,  D7’den başlayarak D0’a kadar Q7 (9 nolu pin) çıkış pini üzerinden seri olarak dışarı aktarılır.

 

74HC/HCT595 Entegresinin Özellikleri ve Kullanımı

Entegrenin Özellikleri:

74HC/HCT595 entegresi; bir shift register entegresidir. Türkçe karşılık olarak kaydırmalı yazmaç diyebiliriz. 74HC/HCT595; DS pininden seri olarak giren 8 bit logic bilgiyi Q7…Q0 pinlerinden paralel olarak çıkışa veren bir entegredir. Entegrenin veri okuma işlemi clock sinyali ile yapılır ve clock sinyalinin yükselen kenarında okuma olur.  

 

 


 

 


  

Veri Okuma İşlemi

 


 

İlk clock sinyalinde DS(14 nolu pin) pininden veri okunur ve 74HC/HCT595’in register’ındaki en soldaki hanesine kaydedilir. İkinci clock sinyali geldiğinde ise register’ın en solundaki hanesinde bulunan veri bir sağa kaydırılır ve yeni okunan veri yine en soldaki haneye kaydedilir. Okuma işlemi bu şekilde devam eder.

 

Entegrenin Kullanımı:

MR(10 nolu pin) pini register resetleme pinidir. Bu pin HIGH konumunda olmalıdır. LOW yapıldığında register içindeki bilgiler silinir.

SH_CP(11 nolu pin) pini clock sinyali giriş pinidir. Clock sinyali LOW’dan HIGH’a değiştiğinde veriler kaydırılarak shift register’a kaydedilir.

ST_CP(12 nolu pin) pini storage register pinidir. Bu pin LOW’dan HIGH’a değiştiğinde veriler stroge register’a kopyalanır.

OE(13 nolu pin) pini çıkışa izin verme bitidir. LOW yapıldığında verinin çıkışına izin verilir. Bu pin toprağa bağlanarak çıkışa sürekli izin verilip, çıkışa gönderilecek verinin ST_CP pini ile kontrol edilmesi de sağlanabilir.

Q7’(9 nolu pin) pini Birden fazla 74HC595 seri bağlanmak istendiğinde bu pine ihtiyaç var. Yani bir tane daha bu entegreden kullanarak 16-bit, 3 tane ile 24- bit,.. gibi çıkış alabiliyoruz. 16-bit çıkış için ikinci entegrenin DATA girişi birinci entegrenin Q7′ çıkışına bağlanıyor. CLOCK ve ST_CP pinleri birbirlerine direk bağlanabiliyor.

Arduino'da veya herhangi bir mikrodenetleyicide, I/O pinlerinin sayısını arttırmada en çok tercih edilen shift register 74HC/HCT595 entegresidir.




shiftIn() Örnek Program Kodları:

74HC165 entegresinin girişinden (D7...D0) gelen logic bilginin Q7 çıkış pininden Arduino'ya seri olarak gönderilmesi ve bu lojik bilginin Arduino D portuna bağlı ledlerden görülmesi işlemidir.

const int dataPin = 8;    // data pini - (74HC165'nin 9 nolu pinine bağlı)

const int clockPin = 9;   // clock pini - (74HC165'nin 2 nolu pinine bağlı)

const int enable = 10;    // clock enable pini - (74HC165'nin 15 nolu pinine bağlı)

const int load = 11;         // 74HC165'in D7...D0 pin bilgilerinin girişini aktif/pasif etme pini - (74HC165'nin 1 nolu pinine bağlı)

byte data;                       // 74HC165 entegresinden okunan veriyi bu değişkende tutacağız

void setup() 

{

      DDRD = 0b11111111;                           //Port D çıkış yapıldı

      pinMode(dataPin, INPUT);          // dataPin giriş olacak

      pinMode(clockPin, OUTPUT);     // clockPin çıkış olacak

      pinMode(enable, OUTPUT);       // enable pini çıkış olacak

      pinMode(load, OUTPUT);           // load pini çıkış olacak

}


void loop() 

{

      PORTD = girisOku();

      delay(50);

}

    byte girisOku() 

      digitalWrite(load, LOW);           //74HC165 entegresinin giriş pin değerlerini 74HC165'in shift register'ına yüklemeye izin ver.

      digitalWrite(enable, LOW);      //clock enable yap. 

      digitalWrite(clockPin, HIGH);   //ilk clock darbesinde 74HC165'in giriş pin değerleri 74HC165'in shift register'ına yüklenir.

      digitalWrite(load, HIGH);          //74HC165 giriş pin değerlerini shift register'a yükleme izni kaldırıldı.

      data = shiftIn(dataPin, clockPin, MSBFIRST);    // pin değerlerini sıra ile oku ve data değişkenine ata.

      delay(50);

      return data;

}


shiftIn() Proteus Uygulaması:



shiftOut() Örnek Program Kodları:

Arduino'dan 8 bitlik bir veriyi 74HC595 entegresine seri olarak gönderip, verinin yine bu entegrenin Q0...Q7 pinlerinden paralel hale dönüştürme işlemidir.

const int enable = 2;               //Storage register kontrol pini. Verileri çıkışa yönlendirmek için. (74HC595'nin 12 nolu pinine bağlı)

const int dataPin = 3;              //data pini. (74HC595'nin 14 nolu pinine bağlı)

const int clockPin = 4;            //clock pini. (74HC595'nin 11 nolu pinine bağlı)

byte data;

void setup()

{

      pinMode(enable, OUTPUT);

      pinMode(clockPin, OUTPUT);

      pinMode(dataPin, OUTPUT);


      for (data = 0; data < 33; data++)

      {

        digitalWrite(enable, LOW);            //Verilerin çıkışa yönlendirilmesi pasif edildi.

        shiftOut(dataPin, clockPin, MSBFIRST, data);         //veriler 74HC595'e gönderildi.

        digitalWrite(enable, HIGH);           //Verilerin çıkışa yönlendirilmesi aktif edildi.

        delay(500);

      }


}


void loop()

{


}


shiftOut() Proteus Uygulaması:







________________________________________________________________________________________________________________________________________________________________


0 comments:

Yorum Gönder

Toplam Sayfa Görüntüleme Sayısı

Seri İletişim Protokolleri

Sensörlerin Arduino İle Kullanımı

Popular Posts

Yararlanılan Kaynaklar

İletişim

gokdag17@gmail.com