Upload
others
View
5
Download
0
Embed Size (px)
Citation preview
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 II
İÇİNDEKİLER III
ÖZET V
SEMBOLLER VE KISALTMALAR 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, fax-
modem 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ı 25 mA
Source akımı 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 Frekans sınırı
RC 0 – 4 MHz
LP 5 – 200 KHz
XT 100 KHz – 4 MHz
HS (-04) 4 MHz
HS (-10) 4 – 10 MHz
HS (-20) 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.
16
Şekil 11. W Register’ini kullanarak bilgi aktarılmasına bir örnek
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 0x00
goto basla ; Ana program
org 0x04
goto interrupt ; Kesme programı (1 sn)
basla;
clrwdt
call initial ; Portları kur
call clear ; Register içeriklerini sıfırla
tekrar call display ; Display’lere yaz
goto tekrar
initial;
bsf STATUS,RP0 ; Bank1’e geç
movlw 0xF0
movwf TRISB ; PortB’nin ilk 4 biti giriş,son 4 biti çıkış
movlw 0x00
movwf TRISA ; PortA çıkış
movlw b'10001000' ; GIE ve RBIE aktif
movwf INTCON ; INTCON Register’i kur
movlw b'10000100' ; Prescaler değeri 32,dahili komut saykılı seçili
movwf OPTION_REG
bcf STATUS,RP0 ; Bank0’a dön
clrf PORTA
return
25
clear;
movlw sayi
movwf FSR ; İlk register adresini tut
movlw 0x0F ; 15 adet değişken
movwf i
sifir clrf INDF ; Sıfırla
incf FSR
decfsz i
goto sifir
return
display;
movlw 4 ; Sayı dizisinin boyutu
movwf i ; i < 4
movlw sayi ; Sayı dizisinin başlangıç adresini
movwf FSR ; FSR’ye yaz
movlw b'11111110' ; 1.Dijiti seç
movwf PORTB
tara movf INDF,W ; Dizinin elemanını W’ye yaz
iorwf RA4,W ; W ve F register içeriklerini OR yap
movwf PORTA ; PortA’dan gönder.
call timer_low ; Bir süre bekle
incf FSR ; Dizinin bir sonraki elemanının adresine ulaş
bsf STATUS,C ; Caryy set
rlf PORTB,F ; Aktif olan dijiti bir sola kaydır
decfsz i ; Dizinin son elemanına ulaşıldı mı?
goto tara ; Hayır. Taramaya devam et.
Return , Evet. Alt programdan çık.
timer_low;
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
return ; Evet. Alt programdan çık.
İnterrupt;
movwf _w ; _w < w
movf STATUS,W
movwf _status ; _status < STATUS
btfss INTCON,RBIF ; Buton kesmesi var mı?
goto $+3 ; Hayır. Timer interrupt satırına git.
call klavye_interrupt ; Klavye interrupt alt programını çağır.
goto int_son ; İnterrup son işlemlerini yap.
btfsc INTCON,T0IF ; Timer interrupt’ı var mı?
call timer_interrupt ; Evet. Timer interrupt alt programına git
int_son movf _status,W ; STATUS değerini geri yükle
movwf STATUS
movf _w,W ; W değerini geri yükle
retfie ; İnterrupt programından çık
timer_interrupt;
bcf INTCON,T0IF ; T0IF bayrağını temizle
incf sn ; sn bir arttır.
movlw .125
subwf sn,W ; 1 sn ayarı
btfss STATUS,Z
goto int_son ; Hayır.
clrf sn ; Evet. Sn=0
decf sayi ; Sayi’yı bir eksilt
call test_FF ; Sonuç FF mi?
call test_0000 ; Displaydeki sayılar 0000 oldu mu?
27
return
klavye_interrupt;
bcf INTCON,RBIF ; RBIF sıfırla
bcf INTCON,T0IF ; T0IF sıfırla
bcf RA4,4 ;
incf int2,F ; int2 bir arttır
btfsc int2,1 ; Tuş serbest bırakıldı mı?
goto kly_cik ; Evet. Klavye alt programından çık.
swapf PORTB,W ; PortB’nin üst 4 biti ile alt 4 bitini yer değiştir.
andlw 0x0F ; Üst 4 biti sıfırla
sublw 0x0F ; Sonuç F mi?
btfsc STATUS,Z ; Evet
goto kly_son ; Tuş serbest.Alt programdan çık
bcf INTCON,T0IE ; Rakamlar girilirken sayıcıyı durdur.T0IE pasif.
swapf PORTB,w ; PortB’nin üst 4 biti ile alt 4 bitini yer değiştir.
andlw 0x0F ; Üst 4 biti sıfırla
movwf tus ; sonucu PortA’ya gönder
sublw 0x0A ; Basılan tuş Enter mı?
btfss STATUS,Z
goto rakam
clrf sn
bsf INTCON,T0IE ; Rakam girildiğinde sayıcıyı yeniden başlat
goto kly_son ;
rakam movf sayi+2,W ; Dijitleri sola kaydır
movwf sayi+3 ; Yeni tuş değerini
movf sayi+1,W ; En sağdaki
movwf sayi+2 ; Dijite yaz
movf sayi,W
movwf sayi+1
28
movf tus,W
movwf sayi
goto $+2 ; kly_son’a git
kly_cik clrf int2
kly_son return ; Klavye interrupt alt programından çık
test_FF;
movlw 0xFF
subwf sayi,W
btfss STATUS,Z ; Sayi[0]=255 mi?
goto a_son ; Hayır. Alt programdan çık.
movlw 9
movwf sayi ; Evet. Sayı[0]=9
decf sayi+1 ; Sayı[1] = Sayı[1] - 1
movlw 0xFF
subwf sayi+1,W
btfss STATUS,Z ; Sayi[1]=255 mi?
goto 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 0xFF
subwf sayi+2,W
btfss STATUS,Z ; Sayi[2]=255 mi?
goto 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 STATUS,Z ; Sayi[3]=255 mi?
goto 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 sayi,W
btfss STATUS,Z
goto t_end
movf sayi+1,W
btfss STATUS,Z
goto t_end
movf sayi+2,W
btfss STATUS,Z
goto t_end
movf sayi+3,W
btfss STATUS,Z
goto t_end
bsf RA4,4
bcf 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.