T.C. KARADENİZ TEKNİK ÜNİVERSİTESİ MÜHENDİSLİK FAKÜLTESİ ELEKTRİK-ELEKTRONİK MÜHENDİSLİĞİ BÖLÜMÜ PROGRAMLANABİLİR ZAMANLAYICI BİTİRME ÇALIŞMASI SULTAN ÜÇOK 203786 HAZİRAN,2011 TRABZON
T.C. KARADENİZ TEKNİK ÜNİVERSİTESİ MÜHENDİSLİK FAKÜLTESİ ELEKTRİK-ELEKTRONİK MÜHENDİSLİĞİ BÖLÜMÜ PROGRAMLANABİLİR ZAMANLAYICI BİTİRME ÇALIŞMASI SULTAN ÜÇOK 203786 Öğr. Gör. Cahit ALTAN HAZİRAN, 2011 TRABZON
II ÖNSÖZ Büyük sabır ve fedakârlıklar göstererek bugünlere gelmemde büyük emeği olan değerli aileme, çalışmalarım boyunca yardımını esirgemeyen sayın Oğuzhan Çakır a ve sayın Tez Hocam Cahit ALTAN a teşekkürlerimi sunarım.
III İÇİNDEKİLER Sayfa No ÖNSÖZ İÇİNDEKİLER ÖZET SEMBOLLER VE KISALTMALAR II III V VI 1. GİRİŞ 1 1.1. MİKRODENETLEYİCİLER 1 1.1.1. PIC16F84A Mikrodenetleyicisi 2 1.2. PIC16F84 Ü PROGRAMLAMAK İÇİN GEREKENLER 2 1.2.1. Metin Editörü 2 1.2.2. Assembler Programı 3 1.2.3. PIC Programlama Devre Kartı 3 1.2.4. Program Yükleme Yazılımı 3 1.3. PIC DONANIM ÖZELLİKLERİ 3 1.3.1. PIC Bellek Çeşitleri 3 1.3.2. PIC lerin Dış Görünüşü 5 1.4. PIC16F84A NIN ÖZELLİKLERİ 5 1.4.1. PIC16F84A nın Yapısı 5 1.4.2. PIC16F84A nın Pin Görünüşü 6 1.4.3. Besleme Gerilimi 8
IV 1.4.4. CLOCK Uçları ve CLOCK Osilatörü Çeşitleri 9 1.4.5. Program Belleği 13 1.4.5.1.RAM Bellek 14 1.4.5.2 Yığın Hafıza 15 1.4.5.3 W Register 15 2. PIC PROGRAMLAMA 17 2.1. Pic Assembly Dilini Kullanarak Pic Programlama 17 2.2. Girintiler ve Program Bölümleri 17 2.3. Kesmeler 18 3. PROGRAMLANABİLİR TİMER 22 3.1. PIC16F84A İle Programlanabilir Timer 22 3.1.1. Butonlar 22 3.1.2. Display 23 3.2. Programlanabilir Zamanlayıcı Devre Şeması 31 3.3. P. Zamanlayıcı Devresinin Delikli Pertinanks Üzerinde Gerçeklemesi 32 3.4. Devrenin Karta Baskı Devresi 33 3.5. Devrenin Gerçeklenmesi 34 4. SONUÇLAR 5. KAYNAKLAR
V ÖZET Programlanabilir Zamanlayıcıyı 74C92 buton sürücüsü, 7447 display sürücüsü ve 16F84A ile oluşturarak gerçekledim. Programda assembly dilini kullandım. Sırasıyla programın editörde yazımı, Proteus da simülasyonu, board üzerinde denemesi ve son olarak plaket üzerine yerleştirilerek hazır hale getirilmesi gerçekleştirme aşamalarını oluşturdu. Zaman insan hayatın da önemli yer teşkil eden bir kavramdır. Bundan dolayıdır ki günümüzdeki çoğu cihazda artık bir zamanlayıcı mevcuttur. Programlanabilir zamanlayıcı devresi günümüzde çoğu teknolojide kullanılır hale gelmiştir. Örneğin tıbbi cihazlardan Buharlı Otoklav, okul saat sistemlerinde, skorbordlarda ve günlük hayatımızda mikrodalga fırınlarda çalar saatlerde kullanımı oldukça yaygın olan cihazlardan birkaçıdır.
VI SEMBOLLER VE KISALTMALAR
VII
VIII
IX
X
1. GİRİŞ Çalışmamın konusu programlanabilen bir zamanlayıcı amaçlamaktadır. Zamanlayıcılar FF lerin arka arkaya sırayla bağlanması ile oluşturulmuş devrelerdir. Girişlerine uygulanan saat darbelerini ikili tabana göre sayma işlemi yapar. Sayıcılar, dijital ölçü, kumanda ve kontrol tesislerinin önemli elemanlarındandır. 1.1. MİKRODENETLEYİCİLER Bir bilgisayar içerisinde bulunması gereken temel bileşenlerden RAM, I/O ünitesinin tek bir chip içerisinde üretilmiş biçimine mikrodenetleyici (Microcontroller) denir. Günümüz mikro denetleyicileri otomobillerde, kameralarda, cep telefonlarında, faxmodem cihazlarında, fotokopi, radyo, TV, bazı oyuncaklar gibi sayılamayacak kadar pek çok alanda kullanılmaktadır. Günümüz mikro denetleyicileri birçok chip üreticisi tarafından üretilmektedir. Her firma ürettiği chip'e farklı isimler vermektedir [1]. Örneğin Microchip firması ürettiklerine PIC adını verir. Şekil 1. de bir mikrodenetleyici sistemin temel bileşenlerinin blok diyagramı gösterilmiştir. Şekil1. Bir mikro denetleyici sistemin temel bileşenlerinin blok diyagramı
2 1.1.1. PIC16F84A Mikrodenetleyisici PIC açılım olarak Peripheral Interface Controller anlamına gelir [1]. Bu, lamba, motor, role, ısı ve ışık sensörü gibi elemanların kontrolünü yapabilmesi anlamına gelmektedir. PIC'ler, piyasada çok kolaylıkla ve ucuz olarak elde edilebilebilir. PIC16F84A microdenetleyicisi toplam 35 komut kullanılarak programlanabilmektedir. PIC16F84A mikrodenetleyicisinin program belleği flash teknolojisi ile üretilmiştir. Flash memory teknolojisi ile üretilen bir belleğe yüklenen program, PIC'e uygulanan enerji kesilse bile silinmez. PIC16F84'i programlayıp tekrar silinebilir ve yeniden program yazılabilir. 1.2. PIC16F84 Ü PROGRAMLAMAK İÇİN GEREKENLER PIC 16F84A mikrodenetleyicisinin programlamasıda ve uygulamalarda gereksinim duyulanlar: 1. Bir metin editörünü 2. Bir assembler programı 3. PIC programlayıcı donanımı 4. PIC programlayıcı yazılımı. 5. PIC 6. Programlanmış PIC'i denemek için breadboard, güç kaynağı ve elektronik elemanlar. 7. Programlanmış bir PIC'i deneme kartı. 1.2.1. Metin Editörü Assembly dili komutlarını yazıp bir metin dosyası oluşturmak için NotPad editörünü kullandım. Programı yazarken programa uygun olarak komut ve adresler arasında bir tablık boşluk bırakarak yazdım.
3 1.2.2. Assembler Programı PIC Assembly dili adı verilen ve toplam 35 komuttan oluşan bir programlama dilidir. Bu komutları basit bir editörde yazabiliyoruz. Ancak, ingilizce'deki bazı kelimelerin kısaltmasından oluşan bu dilin komutlarını PIC'in anlayabileceği makine diline çeviren bir programa ihtiyacımız vardır. Bu programa assembler adını veriyoruz. 1.2.3. PIC Programlama Devre Kartı Programlanan PIC'i breadboard üzerinde kurulabileceği gibi devre de denenebilir. Özel bir deneme kartı üzerinde de deneyemeye çalıştım fakat bu deneme kartları eski bilgisayarlarda çalıştığı için PIC i programlayamadı. Bunun yerine USB li başka bir programlama kartı kullandım yardım alarak. 1.2.4. Program Yükleme Yazılımı MPASM tarafından derlenerek makine diline dönüştürülmüş assembly programı kodlarının PIC'e yazdırılmasında kullanılan bir programa gereksinim vardır. Programlayıcı yazılımları, PIC'i programlamak için kullanılan elektronik karta bağımlıdır. Her programlayıcı yazılımı ile elimizde bulunan karta kod gönderemeyebiliriz. Genellikle programlama kartı üreticileri, ürettikleri karta uygun yazılımı da birlikte sunarlar. 1.3. PIC Donanım Özellikleri 1.3.1 PIC Bellek Çeşitleri Farklı özellikte program belleği bulunan PIC'ler microchip firması tarafından piyasaya sürülmektedir. Bunlar: 1. Silinebilir ve programlanabilir bellek (Erasable PROgrammable Memory- EPROM).
4 2. Elektriksel olarak silinebilir ve programlanabilir bellek (Electrically Erasable PROgrammable Memory-EEPROM). FLASH bellek olarak da adlandırılır. 3. Sadece okunabilir bellek (Read-Only Memory-ROM). Her bir bellek tipinin kullanılacağı uygulamaya göre avantajları ve dezavantajları vardır. Bu avantajlar; fiyat, hız, defalarca kullanmaya yatkınlık gibi faktörlerdir. EPROM bellek hücrelerine elektrik sinyali uygulayarak kayıt yapılır. EPROM üzerindeki enerji kesilse bile bu program bellekte kalır. Ancak silip yeniden başka bir program yazmak için ultra-viole ışını altında belirli bir süre tutmak gerekir. Bu işlemler EPROM silici denilen özel aygıtlarla yapılır. EPROM bellekli PIC'ler iki farklı ambalajlı olarak bulunmaktadır: Seramik ambalajlı ve cam pencereli olan tip, silinebilir olan tiptir. Plastik ambalajlı ve penceresiz olan tipler ise silinemez (OTP) tiptir. EEPROM, belleği bulunan bir PIC içerisine program yazmak için PIC programlayıcı vasıtasıyla elektriksel sinyal gönderilir. EEPROM üzerindeki enerji kesilse bile bu program bellekte kalır. Programı silmek veya farklı yeni bir program yazmak istendiğinde PIC programlayıcıdan elektriksel sinyal gönderilir. Bu tip belleğe sahip olan PIC'ler genellikle uygulama geliştirme amacıyla kullanılırlar. Microchip bu tip belleğe çoğu zaman FLASH bellek olarak da adlandırmaktadır. Fiyatları silinemeyen tiplere göre biraz pahalıdır. Bellek erişim hızları ise EPROM ve ROM'lara göre daha yavaştır. PIC 16F84'ler bu tip program belleğine sahiptir. ROM, program belleğine sahip PIC'lerin programları fabrikasyon olarak yazılırlar. EPROM ve EEPROM eşdeğerlerine nazaran fiyatları oldukça düşüktür. Ancak fiyatının düşüklüğünden dolayı gelen avantaj bazen çok pahalıya da mal olabilir. ROM bellekli PIC programlarının fabrikasyon olarak yazılması nedeniyle PIC'in elde edilme süresi uzundur. Bu tip PIC'ler çok miktarda üretilecek bir ürünün maliyetini düşürmek amacıyla seçilir. Program hataları giderilemediği için uygulama geliştirmek için uygun değildir.
5 1.3.2. PIC lerin Dış Görünüşü PIC'ler çok farklı ambalajlarla piyasaya sunulmaktadırlar.bunlardan bir tanesi şekil 2. de gösterilmiştir. Şekil 2. PIC16F84A dış görünüşü 1.4. PIC16F84A nın Özellikleri 1.4.1. PIC16F84A nın Yapısı PIC RISC ( Reduced Intruction Set Computer ) denilen azaltılmış komut sistemini kullanmaktadır [2]. Bu sistem sayesinde komutlar daha sade ve daha azdır. Bir PIC i programlamak için 35 komut kullanılır. PIC de bir komutun işletimi, genellikle dışarıdan uygulanan clocklar ile gerçekleştirilmektedir. Program belleği ( memory ) ( ROM ) ve data belleği ( memory ) birbirinden bağımsızdır. PIC16F84A nın yapısı şekil 3. de gösterildiği gibidir. Bu hafıza yapısı ile her iki hafızada aynı anda çalıştırılabilmekte ve böylece işletim çok daha hızlı olmaktadır. Data belleğinin genişliği yapıya göre değişiklik gösterir. ( Program belleği 14
6 bit, data belleği 8 bit genişliğe sahiptir.) Çünkü 1 kelimenin makineye tanıtımı 14 bit ile gerçekleştirilir. Şekil 3. PIC16F84A nın yapısı 1.4.2. PIC16F84A nın Pin Görünüşü Şekil 4. PIC16F84A nın pin görünüşü
7 Şekil 4. de PIC in pin numaraları verilmiştir.bu sayede bağlantıları kolaylıkla yapabilmekteyiz. CMOS teknolojisi ile üretilmiş olan PIC16F84 çok az enerji harcar [1]. Flash belleğe sahip olması nedeniyle clock girişine uygulanan sinyal kesildiğinde registerleri içerisindeki veri aynen kalır. Clock sinyali tekrar verildiğinde PIC içerisindeki program kaldığı yerden itibaren çalışmaya başlar. RA0-RA3 pinleri ve RB0-RB7 pinleri I/O portlandır. Bu portlardan girilen dijital sinyaller vasıtasıyla PIC içerisinde çalışan programa veri girilmiş olur. Program verileri değerlendirerek portları kullanmak suretiyle dış ortama dijital sinyaller gönderir. Dış ortama gönderilen bu sinyallerin akımı yeterli olmadığı durumda yükselteç devreleri (röle, transistör v.s) ile yükseltilerek kumanda edilecek cihaza uygulanır. Portların maksimum sink ve source akımları tablo 1. deki gibi aşağıda verilmiştir. Bu akımlar genellikle bir LED sürmek için yeterlidir. Tablo 1. Sink ve Source akımı değerleri I/O pini Sink akımı Source akımı 25 ma 20 ma Sink akımı, gerilim kaynağından çıkış potuna doğru akan akıma, source akımı ise 1/0 pininden GND ucuna doğru akan akıma denir.
8 Şekil 5. PIC16F84A için besleme ve toprak bağlantısı PIC16F84 ün çektiği akım, şekil 5. de görüldüğü gibi besleme gerilimine, clock girişine uygulanan sinyalin frekansına ve l/o pinlerindeki yüke bağlı olarak değişir. Tipik olarak 4 MHz lik clock frekansında çektiği akım 2 ma kadardır. Bu akım uyuma modunda (Sleep mode) yaklaşık olarak 40 mikroa e düşer. Bilindiği gibi CMOS entegrelerdeki giriş uçları muhakkak bir yere bağlanır. Bu nedenle kullanılmayan tüm girişler besleme geriliminin +5V luk ucuna bağlanmalıdır. 1.4.3. Besleme Gerilimi PIC'in besleme gerilimi şekil 6. de gösterildiği gibi 5 ve 14 numaralı pinlerden uygulanır. 5 numaralı Vdd ucu +5 V'a, 14 numaralı Vss ucu da toprağa bağlanır. PIC'e ilk defa enerji verildiği anda meydana gelebilecek gerilim dalgalanmaları nedeniyle istenmeyen arızaları önlemek amacıyla Vdd ile Vss arasına 0.1 F lık bir dekuplaj kondansatörü bağlamak gerekir.
9 Şekil 6. PIC16F84A ya besleme geriliminin bağlanması 1.4.4. CLOCK Uçları ve CLOCK Osilatörü Çeşitleri PIC belleğinde bulunan program komutlarının çalıştırılması için bir kare dalga sinyale ihtiyaç vardır [1]. Bu sinyale clock sinyali denilir. PlC16F84'ün clock sinyal girişi için kullanılan iki ucu vardır. Bunlar 15. Ve 16. bacaklardır. Bu uçlara farklı tipte osilatörlerden elde edilen clock sinyalleri uygulanabilir. Clock osilatör tipleri tablo 2. deki gibi şöyledir: Tablo 2. Clock osilatör tipleri 1. RC - Direnç/kondansatör (Resistor/Capacitor). 2. XT - Kristal veya seramik resonatör (Xtal). 3. HS - Yüksek hızlı kristal veya seramik resonatör (High Speed ). 4. LP - Düşük frekanslı kristal (Low Power).
10 Seçilecek olan osilatör tipi PIC'in kontrol ettiği devrenin hız gereksinimine bağlı olarak seçilir. Aşağıdaki tablo 3. de hangi osilatör tipinin hangi frekans sınırları içerisinde kullanılabileceğini gösterir. Tablo 3. Osilatör tiplerinin frekans aralıkları Osilatör tipi RC LP XT HS (-04) HS (-10) HS (-20) Frekans sınırı 0 4 MHz 5 200 KHz 100 KHz 4 MHz 4 MHz 4 10 MHz 4 20 MHz PIC'e bağlanan clock osilatörünün tipi CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC şeklinde programlama esnasında PIC içerisinde bulunan konfigürasyon bitlerine yazılır. RC clock osilatörü, PIC'in kontrol ettiği elektronik devredeki zamanlamanın çok hassas olması gerekmediği durumda kullanılır. Belirlenen değerden yaklaşık %20 sapma gösterebilirler. Bir direnç ve kondansatörden oluşan bu osilatörün maliyeti oldukça düşüktür. OSC1 ucundan uygulanan clock frekansı R ve C değerlerine bağlıdır. Şekil 7. de RC osilatörün clock girişine bağlanışı ve tablo 4. de de çeşitli R, C değerlerinde elde edilen osilatör frekansları örnek olarak verilmiştir.
11 Tablo 4. Çeşitli R, C değerlerinde elde edilen osilatör frekansları Şekil 7. RC osilatörünün PIC e bağlantısı OSC1 ucundan uygulanan harici clock frekansının 1/4'ü OSC2 ucunda görülür. Bu clock frekansı istenirse devrede kullanılan diğer bir elemanı sürmek için kullanılabilir. Kristal ve kondansatör kullanılarak yapılan osilatörler de zamanlamanın önemli olduğu yerlerde kullanılır. Kristal osilatörlerin kullanıldığı devrelerde kristale bağlanacak kondansatörün seçimine özen göstermek gerekır. Aşağıdaki tablo 5. de hangi
12 frekansta kaç ( F lık kondansatör kullanılacağını gösteren tablo görülmektedir. Bu proje de 4MHZ için 22pF kullandım. Tablo 5. Kondansatör değerlerinin osilatör tiplerine bağlı olarak belirlenmesi Seçilen kondansatör değerlerinin tablo 5. deki değerlerden yüksek olması, elde edilen kare dalgaların bozuk olmasına ve PIC'in çalışmamasına neden olur. C1 ve C2 kondansatörlerin değerleri birbirine eşit olmalıdır. Şekil 8. Kristal ve kondansatörlerin PIC e bağlantısı
13 1.4.5. Program Belleği Assembly de kullanılan komutlarla yazılmış programın yüklendiği alandır [2]. Bu alan PIC16F84 de EEPROM şeklindedir. Program yazıcısı kullanarak ROM a programımızı yazabiliriz. Çünkü elektrik sinyali ile yazılıp silinebilme özelliği vardır. Mikrodenetleyici uygulayacağı komutları ve işlem sırasını bunun ilgili adreslerine bakarak uygular. İlgili adresler ise PC ( Program Counter ) program sayıcında saklanır. Bir PIC te ROM belleğe yaklaşık 1 milyon defa program yazılabilir. Şekil 9. da verilen program belleğinin genişliği 14 bittir. PIC16F84 program belleğinin 1024 ( 1K ) alanı, 000 dan 3FF kadar olan adrestedir. Şekil 9. Pic16F84A nın program belleği 1.4.5.1 RAM Bellek (Veri Belleği)
14 Veri belleği iki tip alandan oluşur. Birincisi özel fonksiyon ( Special Function Register ) ( SFR ) yazmaç alanı(ki programda kullandığım özel bir registerdır ), ikincisi ise genel amaçlı ( General Purpose Register) ( GPR ) yazmaçtır. SFR yazmacı işletim kontrolü yapar. Veri belleği banklar halinde bölümlenmiştir. Şekil 10. da da görüldüğü gibi Bank 0 ve Bank 1 olarak iki bank vardır. Her iki bankta da SFR ve GPR alanları bulunur. SFR çevresel fonksiyonları kontrol eden registerlar için kullanılır. Bank bölümlemesinden dolayı, bank seçimi için kontrol bitlerinin kullanımını gerektirir. Bu kontrol bitleri STATUS registerinde bulunur. Bank0 ı seçmek için RP0 bitini ( ki bu STATUS un 5. biti oluyor ) temizlemek gerekir. Aynı bitin kurulması ( set ) ile de BANK1 seçilmiş olur. Her iki bankın ilk on ikisinin yerleşimi özel fonksiyon kaydı için ayrılmıştır. Kalanı ise statik RAM olarak genel amaçlı kayıtları yürütmektedir Şekil 10. RAM belleği yapısı(file Register haritası)
15 1.4.5.2. Yığın Hafıza PIC16F84, 8 derinliğinde ve 13 bit genişliğinde yığına (stack) sahiptir [2]. Bu yığın alanı, program veya bilgi (data) yeri değildir ve direkt olarak okunamaz veya yazılamazlar. Temel amacı program içerisinde bir alt programa geçiş olduğunda program sayacının değerini saklamaktır. CALL komutu işletildiğinde veya kesme uygulandığı zaman, 13 bitlik ( PC ) program sayıcının tamamı, stack üzerine kopyalanır, bu işleme pushed denir. Yığındaki bu adres alt programlar çalışıp bittikten sonra en sonunda bulunan RETLW, RETFIE veya RETURN komutları ile stack dan program sayasına aktarılır, bu işlemede popped denir. Dolayısıyla program kaldığı yerden devam eder. Burada dikkat edilmesi gereken bir programda iç içe en fazla 8 altprogram veya kesme kullanabiliriz. Fazla kullandığımız takdirde yığın taşması dediğimiz ( stack overflow ) hatası belirir. 1.4.5.3. W Register W ( working ) yazmacı bilgilerin geçici olarak depolandığı ve bilgilerin aktarılmasında kullanılan bir kısımdır [2]. PIC te yapılan tüm işlemler ve atamalar bunun üzerinden yapılmak zorundadır. Direk olarak aktarılamayan yerlerde geçici bir register olarak kullanılır. Aşağıdaki şekil 11. de bir örneği verilmiştir.
Şekil 11. W Register ini kullanarak bilgi aktarılmasına bir örnek 16
2. PIC PROGRAMLAMA 2.1. Pic Assembly Dilini Kullanarak Pic Programlama Assembly dili, bir PIC'e yaptırılması istenen işlerin belirli kurallara göre yazılmış komutlar dizisidir [1]. Assembly dili komutları ingilizce dilindeki bazı kısaltmalardan meydana gelir. Bu kısaltmalar genellikle bir komutun çalışmasını ifade eden cümlenin baş harflerinden oluşur. 2.2. Girintiler ve Program Bölümleri Bir assembly programı temel olarak dört bölüme ayrılır. Bunlar şekil 12. deki görüldüğü gibi başlık, atama, program ve sonuç bölümleridir. Şekil 12. Assembly dilinde programın yazılış şekli
18 2.3 Kesmeler PIC16F84A için 4 değişik kaynaktan kesme sinyali elde edilebilir. Bunlar: 1-RB0/INT harici interrupt pini 2-Port B high level change.rb4,rb5,rb6,rb7 pinlerinin herhangibirinde meydana gelen değişillikler 3-TMR0, 0xFF'den 0x00'a geçerkenoluşturduğu kesme 4-EEPROM yazma işlemi tamamlandığında oluşan kesme Kesme sinyalinin aktif olabilmesi için GIE bitinin lojik-1 yapılması ve kesme şeklinin seçilmesi gerekir. Kesmeleri anlatabilmek için önce PIC16F84A da bulunan register ları tanıtmak gerekiyor. Öncelikle STATUS Register ı, banklar arası geçiş yapmakta kullanmaktayız. Şekil 13.de de görüldüğü gibi bu register içeriğinde aritmetik lojik ünitesi(alu) durumu, reset durumu ve bank seçme bilgileri bulunur. 6.bit ve 5.bitler bank seçme bitleridir. Sıklıkla Bank0 ve Bank1 kullanılır ve bunun içinde bu bitler; Bank0 için 00, Bank1 için ise 01 olur. Şekil 13. Status Register yapısı
19 Option Register, 8 bitlik bir registerdir [2]. Şekil 14. de de görüldüğü gibi bu register ile TMR0/WDT ye ait frekans bölme sayısı, B portu bitlerinin pull-up yapılma kontrolleri ve harici kesmelerin ayarlanması gibi işlemler yapılır. Şekil 14. Option Register yapısı Bit7: RBPU 0: PortB Pull-Up disable 1: PortB Pull-Up enable Bit6: INTEDG 0:PB0 düşen kenarda interrupt kabul eder. 1:PB0 yükselen kenarda interrupt kabul eder. Bit5: T0CS 0:T0CKI den gelen darbeler Clock kabul edilir 1:Clock kaynagı XTAL in ürettigi dahili darbeler olur. Bit4: T0SE (T0CS=1 ise) 0:T0CKI den gelen darbeler yükselen kenarda clock u arttırır. 1: T0CKI den gelen darbeler düşen kenarda clock u arttırır.
20 Bit3: PSA 0:Prescaler TMR0 için ayarlı 1:Prescaler WDT için ayarlı Bit2,1,0: Prescaler set etme INTCON Register, intcon registeri yazılabilir ve okunabilir özel bir registerdir, ismini INTerrupt CONtrol kelimelerinin kısaltılmış halinden alır. Bu register ile INTERRUPT(Kesme) ayarlarını yaparız. Bu register ile her bir kesme ile ilgili bir bayrak (flag) bulunur ve kesme ile ilgili ayarları bu bayraklar sayesinde yaparız. Şekil 15. de INTCON Register görülmektedir Şekil 15. INTCON Register yapısı GIE Tüm kesme işlemlerini etkin/iptal etme bayrağı 0: Tüm kesmeler iptal 1: Aktif yapılmış olan tüm kesmeler etkin EEIE EEPROM belleğe yazma işlemi tamamlama kesmes 0: Geçersiz 1: Geçerli TOIE TMR0 sayıcı kesmesini aktif yapma bayrağı 0: Geçersiz 1: Geçerli
21 INTE Harici kesmeyi aktif yapma bayrağı 0: Geçersiz 1: Geçerli RBIE PORTB (4, 5, 6, 7) deki değişiklik kesmesini aktif yapma bayrağı 0: Geçersiz 1: Geçerli TOIF TMR0 sayıcısı zaman aşımı bayrağı 0: Zaman aşımı yok 1: Zaman aşımı var INTF Harici kesme bayrağı 0: Harici kesme oluşmadı 0: Harici kesme oluştu RBIF PORTB değişiklik bayrağı 0: RB4-RB7 uçlarının hiç birinde değişiklik yok 1: RB4-RB7 uçlarından en az birisinde değişiklik var.
3. PROGRAMLANABİLİR ZAMANLAYICI 3.1. PIC16F84A İle Programlanabilir Zamanlayıcı Programlanabilir Zamanlayıcı 3 kısımdan oluşur. Bunlar: Butonlar (Sayı Girişleri), İşleme ve Display de gösterme. 3.1.1. Butonlar Kullandığım tuş sayısı 16 olduğu için bir buton entegresi olan 74C922 kullanarak daha çok tuş kullanarak daha az portu işgal etmiş oldum. 74C922 Entegresi, 4 satır ve 4 sütun taramalı,16 tuşu kontrol eden CMOS yapılı buton entegresidir [3]. 3V yada 15V gerilim altında çalışır. Çıkış bilgilerini tutan registeri vardır. Yx hatları satırlar, Xx hatları sütunlardır. OE chip Enable ucudur ve Low aktiftir. OE low olduğunda çıkış uçları, çıkış registerindaki bilgiyi gösterir. Herhangi bir tuş basılı ise DA(Data Avaible) ucu lojik-1 olur. OE aktif olana kadar tuşun değeri veri çıkış uçlarında görünmez. Herhangi bir tuşa basıldığında 74C922'nin DA ucu lojik-0'dan lojik-1'e konum değiştirir. RB0'a bağlı bu uç sayesinde PIC16F84A kesme sinyalini alır ve PC(Program Counter) 0x04 adres değerini alır. Buradan goto klavye komutuna geçer ve böylece program 'klavye' adlı kesme alt programından itibaren devam eder. Klavye alt programında önce PortB'nin değeri okunur. Örneğin 3 tuşuna basılmış ise PortB'nin değeri '0011 0001' olarak okunur. Üst dört bitte tuş bilgisi, alt dört bitte ise RB0 aktif vardır. Önemli olan tuş bilgisidir. Üst dört bitin önemi yoktur. Bu yüzden SWAPF komutu ile üst dört bit ile alt dört bit yer değiştirilir. Ve '0001 0011' halini alır. Son olarak üst dört bit, (0F)h ile AND işlemi yapılır ve sıfırlanır. Sonuçta '0000 0011' yani 3 desimal değeri elde edilir ve bu değer PortA'ya gönderilir. RETFIE komutu ile kesme alt programından çıkılır.
23 Kesme alt programında iken PIC16F84A, otomatik olarak GIE bitini RETFIE komutuna gelene kadar lojik-0 yapar. Böylece kesme alt programı işlenirken meydana gelecek ikinci bir kesmeye izin verilmez. 3.1.2 Display Burada kullanılan display ler ortak anotludur.display leri sürmek için biir 7447 entegresi kullanılır. Bu entegrenin kullanılmasının sebebi, rakamlardan sonraki veriler (9 dan sonraki semboller) için de çıkış verebilmesidir. Böylece 4x4 klavyedeki her tuşa (F hariç) ait bir sembol display lerde görülebilir. 4x4 klavye devresindeki gibi tarama yöntemi kullanan program ile 4 display i tek sürücü ile kontrol edilebilir. Bunun için display lerin ortak anod uçları hariç diğer segment uçları kısa devre edilerek 100 ohm luk direnç üzerinden 7447 ye bağlanır [3]. Bu durumda 7447 den gelen bilgi hangi display in ortak anodunda gerilim varsa o display de görülecektir. 1 rakamını 7447 den gönderirken sadece MSB (en yüksek değerlikli, en soldaki) display in ortak anodunda gerilim olacak, diğerlerinde gerilim olmayacaktır. 2 rakamı ise onun sağındaki display de gözükmesi gerektiğinden bu display akif olurken diğerleri aktif olmayacaktır. Bu şekilde Display de rakamlar belirir. PIC16F84A nın tanıtımı ve komutlarının açıklanmasının ardından assembly dili kullanarak Programlanabilir Zamanlayıcı programı aşağıdaki gibidir [3]. list p=16f84 #include <p16f84.inc> CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC ; konfigurasyon satırı i equ 0x0C ; Dizi boyutu _status equ 0x0D ; Status Register in kopyası _w equ 0x0E ; W Register in kopyası sayi equ 0x10 ; Display içeriği
24 sn equ 0x1C ; 1 sn lik sayaç count equ 0x1D ; Display ler için döngü int2 equ 0x1E ; 2. Defa kesme tus equ 0x1F ; Tuş değeri RA4 equ 0x1B org goto org goto 0x00 basla ; Ana program 0x04 interrupt ; Kesme programı (1 sn) basla; clrwdt call call tekrar call goto initial ; Portları kur clear ; Register içeriklerini sıfırla display ; Display lere yaz tekrar initial; bsf movlw movwf movlw movwf movlw movwf movlw movwf bcf clrf STATUS,RP0 ; Bank1 e geç 0xF0 TRISB ; PortB nin ilk 4 biti giriş,son 4 biti çıkış 0x00 TRISA ; PortA çıkış b'10001000' ; GIE ve RBIE aktif INTCON ; INTCON Register i kur b'10000100' ; Prescaler değeri 32,dahili komut saykılı seçili OPTION_REG STATUS,RP0 ; Bank0 a dön PORTA return
25 clear; movlw movwf movlw movwf sayi FSR ; İlk register adresini tut 0x0F ; 15 adet değişken i sifir clrf INDF ; Sıfırla incf decfsz goto FSR i sifir display; return movlw 4 ; Sayı dizisinin boyutu movwf i ; i < 4 movlw movwf movlw movwf sayi ; Sayı dizisinin başlangıç adresini FSR ; FSR ye yaz b'11111110' ; 1.Dijiti seç PORTB tara movf INDF,W ; Dizinin elemanını W ye yaz iorwf movwf call incf bsf RA4,W ; W ve F register içeriklerini OR yap PORTA ; PortA dan gönder. timer_low ; Bir süre bekle FSR ; Dizinin bir sonraki elemanının adresine ulaş STATUS,C ; Caryy set rlf decfsz goto PORTB,F ; Aktif olan dijiti bir sola kaydır i ; Dizinin son elemanına ulaşıldı mı? tara ; Hayır. Taramaya devam et. timer_low; Return, Evet. Alt programdan çık. movlw 0xFF
26 movwf count ; 0xFF i, count a yükle next decfsz count,f ; Sonuç sıfır mı? goto next ; Hayır. Next e git İnterrupt; return ; Evet. Alt programdan çık. movwf movf movwf btfss goto call goto btfsc call _w ; _w < w STATUS,W _status ; _status < STATUS INTCON,RBIF ; Buton kesmesi var mı? $+3 ; Hayır. Timer interrupt satırına git. klavye_interrupt ; Klavye interrupt alt programını çağır. int_son ; İnterrup son işlemlerini yap. INTCON,T0IF ; Timer interrupt ı var mı? timer_interrupt ; Evet. Timer interrupt alt programına git int_son movf _status,w ; STATUS değerini geri yükle movwf movf STATUS _w,w ; W değerini geri yükle retfie ; İnterrupt programından çık timer_interrupt; bcf incf INTCON,T0IF ; T0IF bayrağını temizle sn ; sn bir arttır. movlw.125 subwf btfss goto clrf decf call call sn,w ; 1 sn ayarı STATUS,Z int_son ; Hayır. sn ; Evet. Sn=0 sayi ; Sayi yı bir eksilt test_ff ; Sonuç FF mi? test_0000 ; Displaydeki sayılar 0000 oldu mu?
27 return klavye_interrupt; bcf bcf INTCON,RBIF ; RBIF sıfırla INTCON,T0IF ; T0IF sıfırla bcf RA4,4 ; incf btfsc goto swapf andlw sublw btfsc goto bcf swapf andlw movwf sublw btfss goto clrf bsf int2,f ; int2 bir arttır int2,1 ; Tuş serbest bırakıldı mı? kly_cik ; Evet. Klavye alt programından çık. PORTB,W ; PortB nin üst 4 biti ile alt 4 bitini yer değiştir. 0x0F ; Üst 4 biti sıfırla 0x0F ; Sonuç F mi? STATUS,Z ; Evet kly_son ; Tuş serbest.alt programdan çık INTCON,T0IE ; Rakamlar girilirken sayıcıyı durdur.t0ie pasif. PORTB,w ; PortB nin üst 4 biti ile alt 4 bitini yer değiştir. 0x0F ; Üst 4 biti sıfırla tus ; sonucu PortA ya gönder 0x0A ; Basılan tuş Enter mı? STATUS,Z rakam sn INTCON,T0IE ; Rakam girildiğinde sayıcıyı yeniden başlat goto kly_son ; rakam movf sayi+2,w ; Dijitleri sola kaydır movwf movf movwf movf movwf sayi+3 ; Yeni tuş değerini sayi+1,w ; En sağdaki sayi+2 ; Dijite yaz sayi,w sayi+1
28 movf movwf goto tus,w sayi $+2 ; kly_son a git kly_cik clrf int2 kly_son return ; Klavye interrupt alt programından çık test_ff; movlw subwf btfss goto 0xFF sayi,w STATUS,Z ; Sayi[0]=255 mi? a_son ; Hayır. Alt programdan çık. movlw 9 movwf sayi ; Evet. Sayı[0]=9 decf sayi+1 ; Sayı[1] = Sayı[1] - 1 movlw subwf btfss goto 0xFF sayi+1,w STATUS,Z ; Sayi[1]=255 mi? a_son ; Hayır. Alt programdan çık. movlw 9 movwf sayi+1 ; Evet. Sayı[1]=9 decf sayi+2 ; Sayı[2] = Sayı[2] - 1 movlw subwf btfss goto 0xFF sayi+2,w STATUS,Z ; Sayi[2]=255 mi? a_son ; Hayır. Alt programdan çık. movlw 9 movwf sayi+2 ; Evet. Sayı[2]=9 decf sayi+3 ; Sayı[3] = Sayı[3] - 1 movlw 0xFF subwf sayi+3,w ;
29 btfss goto STATUS,Z ; Sayi[3]=255 mi? a_son ; Hayır. Alt programdan çık. movlw 9 movwf sayi+3 ; Evet. Sayı[3]=9 a_son return test_0000; Tüm Displayler 0 mı? movf btfss goto movf btfss goto movf btfss goto movf btfss goto bsf bcf sayi,w STATUS,Z t_end sayi+1,w STATUS,Z t_end sayi+2,w STATUS,Z t_end sayi+3,w STATUS,Z t_end RA4,4 INTCON,T0IE ; Saymayı durdur. t_end return end Programda değinilmesi gereken bir kısım vardır ki o da INDF ve FSR komutlarıdır. İndirekt Adresleme: Dolaylı adresleme diğer adresleme türlerine göre biraz daha karışık ve hata oranı daha fazladır. Bu adresleme türünde veri yazmak istediğimiz adresi başka bir registerın içine yazıyoruz, bu exra registera yazdığımız adrese de başka bir register yardımıyla veri yazabiliyoruz. İşte bu eksra registerlar; FSR ve INDF register leridir. FSR register: Veri aktarmak istediğimiz adresin taşındığı registerdır. INDF register: FSR nin adreslediği yere karşılık geliyor, RAM bellekte adresi bulunan
30 fiziksel bir register değildir. INDF registerını kullanan bir komut geldiğinde FSR nin gösterdiği registerın içindeki veriye ulaşmak için kullanılır.
31 3.2. Programlanabilir Zamanlayıcı Devre Şeması Aşağıda şekil 16. da da görüldüğü gibi devrenin simülasyonunu Proteus un ISIS programı ile yaptım. Şekil 16. Programlanabilir Zamanlayıcı nın simülasyonu
32 3.3. Programlanabilir Zamanlatıcı Devresinin Delikli Pertinanks Üzerinde Gerçeklemesi Şekil 17. de de görüldüğü gibi devreyi öncelikle delikli perdinaksta gerçekleştirdim. Şekil 17. Programlanabilir zamanlayıcı devresinin delikli pertinanks üzerinde gerçeklemesi
33 3.4. Devrenin Karta Baskı Devresi Devrenin şekil 18. de olduğu gibi baskı devresini gerçekleştirdim. Şekil 18. Programlanabilir Zamanlayıcı nın devre baskısı
34 3.5. Devrenin Gerçeklenmesi Bütün aşamaları bitirdikten sonra şekil 19. daki gibi devrenin baskı devresini plakete ütü yöndemi ile geçirdim ve elemanları yerrleştirerek devreyi çalıştırdım. Şekil 19. Devrenin son hali
4. SONUÇLAR Programlama aşamasında bir takım sonuçlarla karşılaştım. Devreyi gerçekleştirme sürecinde 74C922 entegresini bulmak için çok zaman harcadım ve sonuç olarak projeyi delikli pertinaks üzerinde gerçekledim. Daha sonra ISIS de çizilmiş devreyi Ares de çizerek karta baskı devresini yaptım. 74C922 entegresi zor bulunan bir entegre olduğundan onu devreye daha sonra ekleyeceğim. Devre bu şekilde de gerçek hayatta çalışır vaziyette fakat buton sürücüsü olmadığından değişik simgelerle karşılaştım. Devrenin son halini gerçekleştirdim. Devre istenildiği gibi çalışmaktadır.
5. KAYNAKLAR [1] ALTINBAŞAK Orhan, Mikrodenetleyiciler ve PIC Programlama, Altaş Yayıncılık ve Elektronik,2006. [2] BEREKET Metin,TEKİN Engin, Mikroişlemciler PIC16F84 Uygulamaları, MEB Yayınları, 2005. [3] KARAKAŞ, Hakan, İleri PIC16F84 Uygulamaları, Altaş Yayıncılık ve Elektronik, 2002.