PIC M KROKONTROLÖR TABANLI M N
Transkript
PIC M KROKONTROLÖR TABANLI M N
PIC MİKROKONTROLÖR TABANLI MİNİ-KLAVYE TASARIMI Prof. Dr. Doğan İbrahim Yakın Doğu Üniversitesi, Bilgisayar Mühendisliği Bölümü, Lefkoşa, KKTC E-mail: [email protected], Tel: (90) 392 2236464 ÖZET Bilgisayarlara veri girişinde en yaygın olarak kullanılan bir cihaz olan klavyelerin çok çeşitleri bulunmaktadır. PC uygulamalarında ve diğer birçok bilgisayar işlemlerinde çok tuşlu, tam boy klavye kullanılmaktadır. Mikroişlemci ve mikrokontrolör destekli birçok kontrol uygulamalarında ise 12-16 tuşlu miniklavyeler kullanılmaktadır. Bu makalede 12 tuşlu bir klavyenin PIC mikrokontrolöre bağlanması ve programlanması incelenmektedir. 1. GİRİŞ Herhangibir bilgisayara veri girmek için birçok metod kullanılabilir. Klavye, optik okuyucu, tarayıcı, fare, sayısal kamera, magnetik kart ve benzeri cihazlar en yaygın olarak kullanılan giriş cihazları arasındadırlar. Genel amaçlı PC uygulamalarında giriş tam boy klavye ve fare kullanılarak yapılmaktadır. Masa üstü yayıncılık gibi daha geniş uygulamalarda ise tarayıcı ve sayısal kamera gibi girişler de kullanılmaktadır. Birçok mikroişlemci ve mikrokontrolör tabanlı kontrol uygulamalarında ise genellikle 12 veya 16 tuşlu olan ve belirli bir uygulama için geliştirilen mini-klavyeler kullanılmaktadır3,4,5. Örneğin, evlerimizde bulunan televizyon uzaktan kontrol cihazlarında mini-klavye kullanılmaktadır. Bunun gibi, giriş gerektiren hemen her türlü mikroişlemci uygulamalarında klavye kullanılmaktadır. Mikroişlemci ve mikrokontrolör devrelerinde mini-klavye kullanımı için birçok değişik metodlar bulunmaktadır. Örneğin, 16 tuşa kadar olan herhangibir mini-klavyeyi bir mikroişlemciye bağlamak için 74C9221 gibi özel klavye entegre devreleri kullanılabilir. Böyle bir uygulamada klavyenin bacakları direk olarak entegre devreye bağlanır ve entegre devrenin çıkışları ise mikrokontrolöre giriş olarak bağlanır. Böylece, klavye üzerinde herhangibir tuşa basılınca, o tuşun kodu mikroişlemciye aktarılmış olur. Klavye entegre devresinin kullanımı kolay olmasına rağman fiyatının yüksek oluşu nedeniyle birçok uygulamalarda kendi klavye kontrol devremizi kurmamız daha uygun olmaktadır. Bu yazımızda, PIC16F842,6,7,8 modeli bir mikrokontrolör kullanarak bir mini-klavyeden nasıl veri okunacağı açıklanmaktadır. Projenin en büyük avantajı ucuz oluşu ve kolaylıkla kurulabilmesidir. 2. DONANIM Sadece birkaç tane giriş gerektiren projelerde bu girişler normal olarak buton kullanılarak yapılmaktadır. Daha çok giriş gerektiren projelerde klavye kullanmak daha uygun olmaktadır. Klavyelerin çok çeşitleri bulunmaktadır, örneğin, 4 satır ve 4 sütünu olan ve 4x4 diye bilinen 16 tuşlu klavyeler, 4 satır ve 3 sütunu olan ve 4x3 diye bilinen 12 tuşlu klavyeler ve bunlar gibi daha birçok çeşit klavyeler. Bu projede PIC16F847 modeli bir mikrokontrolöre 4x3 bir klavye bağlanmıştır. Klavyenin 12 tane tuşu bulunmakta ve herhangibir tuşa basılınca o tuşun kodu (0 dan 11 e kadar) 4 bit çıkış olarak mikrokontrolörden verilmektedir. Buna ilaveten, herhangibir tuşa basılınca mikrokontrolörün VH (veri hazır) diye adlandırılan bir çıkış bacağı 25ms kadar bir zaman için lojik 0 olmaktadır. Bu bacak hem bir tuşa basıldığını belirtiyor ve hem de kontak parazitlerini önlemiş oluyor. Şekil 1 de tipik 4x3 bir klavyenin yapısı gösterilmiştir. Bu klavyenin 4 tane satırı ve 3 tane de sütunu olmak üzere 12 tane tuşu bulunmaktadır. Klavye devrelerinin çalışması oldukça basittir. Bu projede sütunlar çıkış ve satırlar ise giriş olarak kullanılmışlar ve Şekil 2 de gösterildiği gibi girişler dirençler ile yukarı çekilmiştirler. Klavyeyi kontrol etmek için sadece bir sütun lojik 0 ve diğer sütunlar lojik 1 yapılır. Daha sonra satırlar birer birer kontrol edilir ve bir satırda herhangibir tuş basılmışsa o satırın değeri lojik 0 olarak okunur. Bu şekilde bütun sütunlar için ayni işlem süreki olarak yapılır. Örneğin, Şekil 2 yi göz önünde bulunduralım. İlk olarak sütun 1 lojik 0 yapılır. Daha sonra satır 1, satır 2, satır 3 ve satır 4 ün değerleri okunur. Örneğin, 1 nolu tuş basılmışsa satır 2 lojik 0 olur ve mikrokontrolöre 1011 kodu gönderilir. 1 0 4 8 1 5 9 2 6 A 3 7 B 2 Satırlar 3 Şekil 3 Bazı klavye çeşitleri 4 1 2 3 Sütunlar Şekil 1 4x3 klavye bağlantıları PIC 16F84 +V Veri hazır (VH) KLAVYE 0 4 8 1 Basılan tuşun kodu Şekil 4 Projenin blok şeması 1 5 9 2 6 A 3 7 B 2 3 4 1 2 3 Şekil 2 4x3 klavyenin çalışması Şekil 3 de bazı 4x4, 4x3 (projede kullanılan) ve 4x1 klavyelerin resimleri gösterilmiştir. Projenin blok şeması Şekil 4 de gösterilmiştir. Klavyenin sütun ve satırları mikrokontrolöre bağlanmış ve basılan tuşun değeri ise mikrokontrolörden çıkış olarak verilmiştir. Projenin devresi Şekil 5 de verilmiştir. Klayenin satırları mikrokontrolörün RB0-RB3 giriş bacaklarına, sütunları ise RB4RB6 çıkış bacaklarına bağlanmıştırlar. RB7 bacağı ise herhangibir tuşun basıldığını belirten VH (veri hazır) bacağı olarak kullanılmıştır. Projede mikrokontrolör RC osilatörü kullanılarak 400kHz saat frekansı ile çalıştırılmıştır. Şekil 5 Projenin devresi Şekil 2 ve Şekil 5 göz önünde bulundurulursa, basılan herhangibir tuş, ve klavyenin sütun ve satırları arasında Tablo 1 de verilen bağıntı bulunmaktadır. Yazılımda bu bağıntıyı kullanarak hangi tuşun basıldığını kolaylıkla bulabiliriz. Hangi tuşun basıldığını bulmanın bir diğer yolu da sütunları birer birer lojik 0 yapmak ve hangi satırın lojik 0 olduğunu kontrol etmektir. Bu projede ikinci çözüm yolu kullanılmıştır. Tablo 1. Sütunlar, satırlar ve basılan tuş Sütun Satır 1 2 3 1 2 3 4 0 1 1 0 1 1 1 0 1 1 1 0 1 1 0 1 1 1 1 0 1 0 1 1 1 1 1 0 1 0 1 0 1 1 1 1 0 1 1 0 1 1 1 0 1 1 1 0 1 1 0 1 1 1 1 0 1 1 0 0 1 1 1 1 1 0 1 0 1 1 1 1 0 1 1 0 1 1 1 0 1 1 1 0 3. Tuş 0 1 2 3 4 5 6 7 8 9 A B YAZILIM Projenin yazılım listesi Şekil 6 da verilmiştir. İlk olarak PORT A ve PORT B yönleri tanımlanır ve Veri Hazır çıkışı lojik 1 yapılır (veri hazır değil). Daha sonra sütunlar lojik 0 yapılarak satırların lojik 0 olup olmadıkları kontrol edilir. Herhangibir satır lojik 0 ise o satırda bulunan 3 tuştan birinin basılmış olması gerekir. Hangi sütunu lojik 0 yapmışsak basılan tuş o sütundadır. Böylece, basılan tuş bulununca PORT A dan 4 bitlik bir sayı olarak gönderilir. Ayni zamanda VH çıkışı 25ms kadar bir zaman için lojik 0 yapılır. Yazılımda, Tablo 1 i kullanarak ve satırları okuyarak basılan tuşu bulmamız da mümkündür. 4. mikroişlemci sadece klavyeden okuma işlemini yapmaktadır. Bunun sebebi ise yazılımın çokgörevli (multi-tasking) olmayışıdır. Yazılımda kesme (interrupt) kullanarak ve klavye okumasını kesme rutini içine alarak çok görevli bir ortam yaratmak mümkündür. Böylece, ayni mikrokontrolör hem klavye okuma işlemini ve hem de projenin diğer işlemlerini yapabilir. 5. KAYNAKÇA [1] web sitesi: www.fairchildsemi.com [2] Ibrahim, D. (2003). PIC C İle PIC Programlama, ERA Bilgi Sistemleri, INFOGATE yayınları. [3] Ibrahim, D. (2000). Microcontroller Projects in C For the 8051. ButterworthHeinemann, Oxford. [4] Ibrahim, D. (2001). PIC Basic: Programming and Projects. ButterworthHeinemann, Oxford. [5] Ibrahim, D. (2002). Microcontroller Based Temperature Monitoring and Control Butterworth- Heinemann, Oxford. [6] Ibrahim, D. (2003). PIC C İle Ses Projeleri Bileşim Yayıncılık, Fuarcılık A.Ş., http://www.bilesim.com.tr [7] Microchip web sitesi: www.microchip.com [8] Adım Adım PICmicro Programlama, Era Bilgi Sistemleri, INFOGATE yayınları. SONUÇ Bu yazımızda, 4x3 bir mini-klavyenin bir PIC mikrokontrolöre nasıl bağlandığı ve nasıl programlandığı açıklanmıştır. Tasarımı yapılmış olan klavye sistemi oldukça ucuza mal olmakta ve mikroişlemci ve mikrokontrolör tabanlı sistemlerde mini-klavye kullanımı olanağını sağlamaktadır. Bu makalede örnek olarak 4x3 mini-klavye ele alınmıştır. Fakat makalede açıklanan metodları kullanarak, herhangibir boyutta bir klavye kullanmak mümkündür. Bu tip uygulamalarda genellikle ;********************************************************************************* ; MİKROKONTROLÖR KLAVYE PROJESİ ; ; Bu projede 4x3 bir klavye kullanılmıştır. Klavyenin herhangibir tuşuna basılınca o tuşun kodu (0 ve 11 ; arası) mikrokontrolden çıkış olarak verilir. Klavyenin satırları RB0-RB3 bacaklarına ve sütunları ise ; RB4-RB6 bacaklarına bağlanmıştır. Klavyenin satırları giriş ve sütunları ise çıkış olarak ; tanımlanmıştır. Giriş bacakları ayni zamanda 100K dirençlerle yukarı çekilmiştirler. ; ; Mikrokontrolör RC kullanılarak 400kHz ile çalışmaktadır, bunun için ise 10K direnç ve 33pF kapasitör ; kullanılmıştır. Herhangibir tuşa basınca o tuşun kodu PORT A dan 4 bitlik çıkış olarak verilmektedir. ; Mikrokontrolörün RB7 bacağı Veri Hazır (VH) bacağı olarak isimlendirilmiştir. Herhangibir tuşa ; basınca bu bacak da lojik 0 a gier ve 25ms kadar lojik 0 da kalır. Bu şekilde kontak parazitleri de ; önlenmiş olur. ; ; ;Pb0, Pin 6 ->------------0 ----- 4 ----- 8 ;Pb1, Pin 7 ->------------1 ----- 5 ----- 9 ;Pb2, Pin 8 ->------------2 ----- 6 ----- A ;Pb3, Pin 9 ->------------3 ----- 7 ----- B ; | | | ;Pb4, Pin 10 ->-----------| | | ;Pb5, Pin 11 ->-------------------| | ;Pb6, Pin 12 ->-------------------------- | ;******************************************************************************* ; Title “KLAVYE PROJESİ” LIST p = 16F84 #include "p16f84.inc" __CONFIG _WDT_OFF & _RC_OSC & _PWRTE_ON & _CP_OFF ; ; TANIMLAR ; #define VH PORTB,7 ;Veri Hazır ; ; YAZMAÇLAR ; sayac equ 0x20 ORG 0x00 goto basla ;Programın başı ;Alt-program ;-----------------------------------------------------------------------------------------------init bsf STATUS,RP0 ;BANK 1 i seç clrf TRISA ;Port A hep çıkış movlw b'00001111' ;Port RB0-3 in, RB4-7 out movwf TRISB bcf STATUS,RP0 ;Bank 0 seç bsf VH ;Veri Hazır=1 retlw 0 ;******************************************************************************* ; ANA PROGRAM ;Herhangibir tuşun basıldığını kontrol etmek için her sütunu lojik 0 yap ve lojik 0 olan satırı bul. ; ;******************************************************************************* basla call init ;Giriş çıkışları tanımla tara bcf PORTB,4 ;RB4 ü 0 yap bsf PORTB,5 ;Diğer sütunları 1 yap bsf PORTB,6 btfss goto PORTB,0 basildi_0 btfss goto PORTB,1 basildi_1 btfss goto PORTB,2 basildi_2 btfss goto PORTB,3 basildi_3 bcf bsf bsf PORTB,5 PORTB,4 PORTB,6 btfss goto PORTB,0 basildi_4 btfss goto PORTB,1 basildi_5 btfss goto PORTB,2 basildi_6 btfss goto PORTB,3 basildi_7 bcf bsf bsf PORTB,6 PORTB,4 PORTB,5 btfss goto PORTB,0 basildi_8 btfss goto PORTB,1 basildi_9 btfss goto PORTB,2 basildi_A btfss goto PORTB,3 basildi_B ;1 ise sonrakine bak ;RB5 i 0 yap ;Diğerlerini 1 yap ;RB6 yı 0 yap ;Diğerlerini 1 yap ;Herhangibir tuşa basılmadı bsf VH ;VH=1 goto tara ;Tuşlara bakmayı tekrarla ;---------------------------------------------------------------------------------------------------------------;Bir tuşa basıldı… ; basildi_0 movlw 0 goto parazit basildi_1 movlw 1 goto parazit basildi_2 movlw 2 goto parazit basildi_3 movlw goto basildi_4 movlw goto basildi_5 movlw goto basildi_6 movlw goto basildi_7 movlw goto basildi_8 movlw goto basildi_9 movlw goto basildi_A movlw goto basildi_B movlw 3 parazit 4 parazit 5 parazit 6 parazit 7 parazit 8 parazit 9 parazit 0x0A parazit 0x0B ;---------------------------------------------------------------------------------------------------------------; Aşağıdaki gecikme sayesinde, VH bacağı en az 25ms lojik 0 da kalır. 400KHz saat ile yaklaşık ; gecikme şu kadardır: 10uS*10saykıl*256 uS = 25mS ;---------------------------------------------------------------------------------------------------------------parazit movwf PORTA ;Port A ya tuşun kodunu gönder bcf VH ;VH = 0 yap clrf sayac ;256 sayım için bekle nop nop nop nop nop nop nop decfsz sayac, 1 goto bekle goto tara end Şekil 6 Projenin yazılım listesi ;Tekrar başına git