PIC ve Bilgisayar Klavyesi Uygulamaları
Uzun bir aradan sonra tekrar merhaba. Bu ayki yazımda sizlere bilgisayar klavyesinin çalışma prensibini ve bilgisayar klavyesi ile yaptığım iki uygulamadan bahsedeceğim.
Klavye, bilgisayara bilgileri data ve clock ismi verilen iki terminalden gönderir. Seri haberleşmede clock ucu kullanıldığı için bu haberleşme türüne senkron haberleşme denir.
Senkron haberleşmede bir clock hattı gönderilen verinin seri veri hattında bulunduğunu bildirir. Senkron kelimesinin Türkçe karşılığı “eş zamanlı” anlamına gelir. Vericiden bir byte’ lık bir verinin bir biti gönderilip, hemen arkasından bu bitin veri hattında olduğunu belirten clock sinyali gönderildiği anda alıcı veri bitini aynı anda alır. Arkasından yeni bir bit daha gönderildiğinde aynı işlem tekrarlanır. Böylece verici bir byte’ lık veriyi gönderdiği anda alıcıda aynı anda alma işlemini tamamlamış olur. Yani burada eş zamanlılık söz konusudur.
Bilgisayar klavyesi, yukarıda kısaca açıklmaya çalıştığım senkron seri iletişim protokolünü kullanır. Klavyenin herhangi bir tuşuna bastığınızda 1 byte’ lık hex kodu, aynı tuşu bıraktığınızda 2 byte’ lık bir hex kodu üretir. Böylece bilgisayar hangi tuşa basıldığını veya hangi tuşun bırakıldığını kendisine gönderilen kodlardan anlamaktadır. Örneğin klavyede “A” tuşuna basıldığında “1C” hex kodu üretilirken aynı tuşa basma işlemi sona erdiğinde önce”F0″ sonrada “1C” hex kodları klavyeden bilgisayara gönderilir. Klavyede bazı özel tuşlar bulunmakta ve bu tuşlar standart kodlardan farklı kodlar üretirler. Örneğin “INSERT” tuşuna basıldığında 2 byte’lık “E0,70” hex kodu üretilirken, tuşun bırakılmasıyla birlikte 3 byte’ lık “E0,F0,70” hex kodu gönderilir.
Aşağıdaki resimde 101,102 ve 104 tuşlu standart bir klavyenin tuşlara basılmasıyla ürettiği kodlar görülmektedir.
Burada verilen kodlar, yapılan picli bir devre yardımıyla her tuş denenerek elde edilmiştir. Klavye üzerinde aynı tuştan birden fazla bulunmakla birlikte ürettikleri kodlar aynı değildir. Örneğin NumLock bölümündeki “ENTER” tuşu “E0,5A” kodu üretirken diğer tuş “5A” kodu üretir.
Bilgisayar ile klavye arasındaki haberleşem çift yönlüdür. Klavyeden PC’ye bilgi akışı olduğu gibi, PC’den klavyeyi ayarlamaya yönelik komutlar da gönderilir. PC’den gönderilen komutlar, klavye ledlerini (NumLock, CapsLock ve Scroll Lock ledleri) ve tuş tekrarlama özelliklerini ayarlamak için kullanılır.
KLAVYE TARAMA KODLARI (101, 102 ve 104 tuşlu klavyeler için)
(*Bütün değerler hexadecimal’dir.)
ACPI Tarama Kodları
TUŞ | BASMA | BIRAKMA |
Power | E0, 37 | E0, F0, 37 |
Sleep | E0, 3F | E0, F0, 3F |
Wake | E0, 5E | E0, F0, 5E |
*ACPI, anakart aygıtlarının özelliklerini yönetmek için işletim sistemi tarafından kullanılan donanım ve yazılım arabirimlerini tanımlar.
Windows Multimedia Tarama Kodları
TUŞ | BASMA | BIRAKMA |
Next Track | E0, 4D | E0, F0, 4D |
Previous Track | E0, 15 | E0, F0, 15 |
Stop | E0, 3B | E0, F0, 3B |
Play/Pause | E0, 34 | E0, F0, 34 |
Mute | E0, 23 | E0, F0, 23 |
Volume Up | E0, 32 | E0, F0, 32 |
Volume Down | E0, 21 | E0, F0, 21 |
Media Select | E0, 50 | E0, F0, 50 |
E0, 48 | E0, F0, 48 | |
Calculator | E0, 2B | E0, F0, 2B |
My Computer | E0, 40 | E0, F0, 40 |
WWW Search | E0, 10 | E0, F0, 10 |
WWW Home | E0, 3A | E0, F0, 3A |
WWW Back | E0, 38 | E0, F0, 38 |
WWW Forward | E0, 30 | E0, F0, 30 |
WWW Stop | E0, 28 | E0, F0, 28 |
WWW Refresh | E0, 20 | E0, F0, 20 |
WWW Favorites | E0, 18 | E0, F0, 18 |
Aşağıdaki resimde AT ve PS/2 tipi klavye konnektörlerinin pin yapısı görülmektedir.
Klavye devresi bazı durumlarda 300mA kadar akım çekebilmektedir. Yapacağımız uygulamalarda bu akımı verebilecek regüleli güç kaynağımızın olması gerekir. Bu iş için 7805 regüle entegresi kullanılabilir. Klavyenin data ve clock uçları açık kollektör (Open Collector ) özelliği gösterir. Data ve clock uçları 4K7 lik veya 10K lık pull-up dirençleriyle lojik-1 (+5V) seviyesine bağlanmalıdır. Herhangi bir sinyal alış-verişi olmazsa data ve clcok uçlarında lojik-1 potansiyeli gözlenmelidir.
Klavye her veri byte için 11 bit gönderir. 1 bit start biti, 8 bit data biti, 1 bit parity biti ve son bit olarakta stop biti gönderir. 8 data biti gönderilirken daima LSB (Least Significant Bit) öncelikli yani en değerliksiz bit gönderilir.
Gelen verinin lojik-1 mi lojik-0 mı olduğuna, clock palsin düşen kenarında data bitine bakılarak karar verilir. Yukarıdaki şekilde clock palsin düşen kenarı oklarla gösterilmiştir. Klavyenin ürettiği clock sinyalinin frekansı 20 KHz hatta 30 KHz’ e kadar çıkabilmektedir. P parity bitini 0-7 rakkamlarıda data bitlerini göstermektedir.
Bir örnek vermek gerekirse, klavyenin Q harfi için ürettiği kod 1516 dir. Bu kodun decimal karşılığı 1516 = 3110 ve binary karşılığı 1516 = (00010101)2 dir. Aşağıdaki diyagramda hexadecimal 15 kodunun nasıl gönderildiği osilaskop ekranında görülmektedir.
Diyagramda start bitinden sonra gönderilen ilk data bitinin “1” olduğu görülmektedir. Yani yukarıda da bahsettiğim gibi gönderilen ilk bit LSB bitidir.
-UYGULAMALAR-
Pic16F877-PS/2 Klavye-LCD Uygulaması
Yapacağımız bu devrede PS/2 tipi klavyemiz Pic16F877 ye bağlanmaktadır. 2×16 Hitachi 44780 LCD ekranımız picin PortD ve PortE terminaline, clock ucu PortA0’a data ucu ise PortA1′ e bağlanmıştır. Devremizin beslemesi DC 8V veya AC 6V tur. Belirlenen besleme değerlerinden fazla besleme voltajı verilirse 7805 regüle entegremiz gereksiz yere ısınır. Aşağıda devremizin açık şeması, malzeme yerleşimi ve üstten görüntüsü verilmiştir.
Açık şema
Malzeme Yerleşimi
Üstten Görünüm
Açık şemadan da görüldüğü gibi klavyenin data ve clock uçlarına 470R luk seri direnç atılmıştır. Bu dirençler klavye devresini korumak için kullanılmıştır. Pull-up direnci olarak 4K7 seçilmiştir.
Bu uygulamada klavyede bulunan tüm karakterler (1. 2. ve 3. Karakterler) LCD ekranda yazdırılmaktadır. Yani pice atılan yazılım sayesinde klavyedeki CapsLock (Harfleri büyük veya küçük yazdırabiliyorsunuz), Shift ve AltGr tuşlarını kullanabiliyorsunuz. Ayrıca yazılan karakterleri BackSpace tuşunu kullanarak silebiliyorsunuz. Arkadaşlar LCD miz Türkçe karakterleri ve bazı 3. karakterleri desteklemediğinden bu karakterleri yazdıramıyoruz. Özel yazılım yöntemleriyle Türkçe karakterler yazdırılabiliyor. O yöntemleri bu uygulamaya dahil etmedim.
Baskı devre Proteus 6.2 de hazırlanmıştır. Bu uygulamaya ait dosyalar için tıklayınız.
Devremizin Bitmiş Hali
Kayan Yazı Uygulaması
Bu uygulamamız, yukarıdaki uygulamanın bir türevi niteliğindedir. Aynı şekilde Pic16F877 ye PS/2 klavye girişi uygulamaktayız. LCD yerine shfit register (sağa kaymalı kaydedici) entegreleri ile yapılan 7 satırlı (sütun sayısı size kalmış) ledli ekranı bağlıyoruz. Aşağıdaki resmi dijital fotoğraf makinesi ile birkaç deneme sonunda arkadaşım Erdem Bitirgen ‘ in yardımlarıyla çekmeyi başardık. Yazı sürekli sağdan sola doğru kaydığı için net bir resim yakalamak zor oldu.
Bu uygulamamızda klavyeden girilen karakterler picde yorumlanmakta ve hangi karaktere ait kodun geldiği tesbit edilmektedir. Girilen karakter picin karakter tanımlama tablosunda varsa, bu kod picin eeprom’ una kaydedilmektedir. Eeproma en fazla 255 karakter kaydedilmektedir. Yani siz bilgisayar bağlantısı olmadan resimdeki panodan boşluk karakterleri dahil olmak üzere en fazla 255 karakteri kaydırabiliyorsunuz.
Hemen akla şu soru gelebilir. 255 sayısı artırılamaz mı? Evet artırılabilir. Seri eeprom entegreleri kullanılarak bu yapılabilir. Örnek olarak 24CXX serisi eeprom entegreleri işinizi rahatlıkla görür. 16F877 yi kodlayıp devremize taktığımızda başlangıçta hiçbir karakter panoda görüntülenmeyecektir. Bunun nedeni yazılımın bu şekilde ayarlanmasıdır. Siz klavyeden tuşlara bastıkça her basılan tuşun ifade ettiği karakter sırasıyla ekranda görüntülenecektir. Pic çalışırken kesme alt yordamı aktiftir. Çalışma anında interupt yani kesma algıladığında pic yaptığı işi bırakarak basılan tuşun hangi karaktere ait olduğunu araştırır. Gelen kod geçerli bir tuş koduysa, bu kodu hemen eepromdaki sıradaki adrese kaydeder ve işleme kaldığı yerden devam eder. Belki yeni bir karakter girişinden sonraki ilk kaydırma işlemi esnasında karaketrlerde bozulma olabilir ama sonraki kaydırmalarda bu durum düzelecektir.
Aşağıda devremizin malzeme yerleşimi ve üstten görünümü verilmiştir. Açık şema verilmemiştir. Yukarıdaki açık şemanın hemen hemen aynısıdır. Farklılıklarda üstten görünümde rahatlıkla görülmektedir.
Malzeme Yerleşimi
Üstten Görünüm
Led panosu bağlantısı için devremizin çıkışına PCB tipi paralel port konnektörü konmuştur.
Shift regsiterlar ile yapılan panoda, her satıra ait shift register entegresi girişine bir data ve hemen bir de clock sinyali veriyoruz. Entegre kendi özelliğinden bu datayı çıkışlara sırasıyla kaydırıyor. Her satırda yapılan işlemler bu şekilde. Panoda kullanılan her entegrenin clock uçları birbiriyle birleştirilmelidir. Ayrıca her satırdaki entegrelerin data uçları kendinden önceki entegrenin çıkış ucuna bağlanmalıdır. Ledli pano için Metin Gündüz’ ün Ekim 2002 tarihinde antrak gazetesinde yayınlanan 74164 ile yaptığı shift register devresini kullanabilirsiniz.
Aşağıdaki şemada herbir satırda kullanılacak yapı görülmektedir. Her satırdaki sütun sayısını artırmak için 74164 leri ardarda bağlamanız yeterli. Bunun için Q7 pinini bir sonraki entegrenin AB data girişine bağlamalısınız. Led diyotları için akım sınırlama direnci olarak 220 ohm kullanılabilir.
Arkadaşlar shift register mantığına dayalı ledli pano yapmak oldukça masraflı ve yorucu bir iş. Yukarıda “ELEKTRONIK” yazısının yazdığı pano 1 metreden biraz fazla. Öyle bir pano yapmak için çok fazla shift register entegresi kullanmanız gerekecek. Elimde hazır bir pano olduğu için ben bunu kullandım. Size önerim az maliyet gerektiren satır sütun taramalı bir pano kullanmanızdır. Satır sütun taramalı bir pano kullanmanız durumunda, bu uygulama için verdiğim pic programını değiştirmeniz gerekecektir. Çünkü size verdiğim program shift register mantığına göre çalışmaktadır.
Sonuç olarak panodan, satırlara ait 7 adet data ucu, 1 adet clock ucu ve bir adette şase ucu çıkacaktır. Bu uçlar devremizdeki paralel porta takılmalıdır. Şaseler mutlaka birleştirilmelidir.
Bu uygulamada klavyede bulunan 0…9 ar
ası rakkamlar, büyük harfler (Q WX dahil, Türkçe karakterler hariç), boşluk ve nokta karakteri yazdırılabilir. 16F877 deki yazıyı silip yeni bir yazı yazmak için nümerik tuş takımındaki “Del” tuşu ile silme yapılmalıdır.
Baskı devre Proteus 6.2 de hazırlanmıştır. Bu uygulamaya ait dosyalar için tıklayınız. proteus-dosyalari-1 proteus-dosyalari-2
Devremizin Bitmiş Hali
Not: Arkadaşlar, gazeteye gönderdiğim çalışmalar kendi tasarımlarım olup kesinlikle çalışmaktadır. Dikkat ederseniz yaptığım çalışmalara ait fotoğrafları da yayınlamaktayım. Bazı kişilerin yaptığı şekilde kasıtlı olarak hatalı devre veya hatalı hex dosyaları göndermiyorum. Sizlerden gelen bazı e-mail lerden dolayı bu açıklamayı yapma gereği duydum.
Kolay gelsin.
Şerafetdin BALOĞLU
serefbal@hotmail.com