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