PIC Mikrokontrolörleri c programlama dili pic-c lite ve bir çok konuda detaylı bilgiler ve örnek ışık projesi Emeği geçen Kişilere Teşekkürler
Bu projede 4 MHz ile çalışan PIC 16F84 mikrokontrolörü kullanılmıştır. Her segmenti 5 adet ledden yapılan 2 haneli ortak katot bir yedi segment display vardır (yedi segment display konusu ilerde ayrıntısıyla anlatılacaktır.). bu gösterge mikrokontrolörün PORTB bacaklarına bağlanmıştır (RB1 den RB7 ye kadar). Göstergenin her hanesi ilk iki PORTA bitleri tarafından kontrol edilecektir. Gösterge içinde toplam 70 tane led vardır. Bunlardan 35 i birinci hane 35 i ikinci hane içindir. Her segmentte 5 tane led paralel bağlıdır.
7 segment göstergenin a b c d e f g bacakları (11-16, 10-15, 3-8, 2-6, 1-5, 18-12, 17-7) ortak olarak bağlanmıştır. 14 nolu bacak birinci göstergenin ortak anot bacağı, 13 nolu bacak ise ikinci göstergenin ortak anot bacağı olarak bağlanmıştır. Bu durumda istenilen göstergenin ortak anot bacağı kullanılarak o gösterge çalıştırılabilir. Burada transistör ler switch olarak kullanılmıştır ve herhangi bir NPN modeli transistör kullanılabilir. Ben yaptığım projede BD135 modeli NPN transistör kullandım. Transistörün beys bacağına lojik 1 verilince kollektörün bağlanmış olduğu hane çalışacaktır.
Bizim projemizde 2 haneli 7 segment display kullanılmıştır. Birden fazla 7SD yi çalıştırmak için her gösterge hanesi kısa bir zaman için çalıştırılır ve bu şekilde göstergeler sürekli çalışıyor gibi görünürler. Normal olarak insan gözü saniyede 16 defa tekrar eden bir cismi durgunmuş gibi görmektedir. Bu gibi uygulamalarda her gösterge hanesi 5-10 milisaniye kadar kısa bir süre yakılır ve göz haneleri sürekli yanıyormuş gibi algılar. Bu projede her hane 5 saniye yakılmaktadır.
Bu projede göstergelerin 60 a kadar sayması sonra 60 tan 0 a kadar sayması tasarlanmıştır.
Projenin devre şeması,baskı devre şekli, projede kullanılan PICC Lite derleyicisi, PIC16F84 mikrokontrolörü ve bunun yanında projenin daha iyi anlaşılabilmesi için ışık kavramı ilerleyen bölümlerde ayrıntılı şekilde anlatılmış ve gerekli çizimler verilmiştir.
Işık Prensipleri
Bu proje esas olarak 16F84 PIC mikrokontrolörü kullanılarak tasarımı yapılmış olan bir ışık projesidir. Amacımız ışıklı bir proje olduğuna göre ışıkla ilgili temel kavramları bilmemizde fayda vardır. Böylece ışık üzerine yapılan bu projeyi anlamamız daha kolay olacaktır. Bu bölümde ışık, ışık fiziği ve aydınlatma hakkında kısa genel bilgiler verilmektedir.
Işık Nedir? : Işık çok geniş olan ve etrafımızı saran elektromanyetik dalgaların sadece gözle görülebilen kısmına verilen isimdir. Elektromanyetik dalgalar genel olarak dalga boyu ile ölçülür. Şekil 1.1 de elektromanyetik dalgaların sadece optikle ilgili olan kısmı özetlenmiştir ve bu bölümde dalga boyu nanometre (10E–9 metre, nm) cinsinden ölçülmektedir.
Şekil 1.1 Elektromanyetik dalgaların optik bölümü
Gözle görülebilen dalga boyu 380 nm ve 770 nm arasındadır. Burada en alt dalga boyunda mor ışık ve en üst dalga boyunda kırmızı ışık olmak üzere şu ışıklar yer alır: mor, lacivert, mavi, yeşil, sarı, turuncu, kırmızı. İnsan gözü değişik dalga boyundaki ışıkları değişik oranda algılamaktadır. Gözün en hassas olduğu dalga boyu 555 nm olup bu dalga boyu açık yeşil ve sarı karışımı bir renktir.
Mor ötesi (ultraviyolet) 100 nm ve 400 nm arasında yer almaktadır. Mor ötesi ışık üç ölüme ayrılır: UV-A, UV-B ve UV-C. 315 nm ve 400 nm arasında yer alan ve görünen ışığa oldukça yakın olan UV-A aynı zamanda yakın mor ötesi diye de bilinir. UV-A ışınları az enerji taşımalarından dolayı göze en az zararı olan ışınlardır.
UV-B ışınları 280 nm ve 315 nm arasında yer alırlar. Bu ışınlar yüksek enerji taşımalarından dolayı göze ve deriye en fazla zararı verebilen ışınlardır.
UV-C ışınları 100 nm ve 280 nm dalga boyu arasında yer alırlar. Hemen hemen bütün UV-C ışınları atmosferde emilirler ve bu ışınları tabiatta bulmak mümkün değildir.
Kızıl ötesi (infrared) ışınlar 770 nm ve 1.000.000 nm dalga boyu arasında yer alırlar. 770 nm ve 1400 nm arasındaki ışınlar yakın kızıl ötesi diye bilinirler. Aynı şekilde, 1400 nm ve üzerindeki ışınlar uzak kızıl ötesi ışık diye bilinirler. Kızıl ötesi ışınlar diğer ışınlara oranla oldukça az enerji ihtiva ederler. Kızıl ötesi ışınları mercekle odaklamak veya süzgeçten geçirmek oldukça zordur. Bu ışınlar daha çok deri ısı tedavisinde, gece görüntü sistemlerinde ve uzaktan komuta sistemlerinde yaygın olarak kullanılırlar.
Işık Kuantum Teorisi : Kuantum teorisine göre ışık foton diye adlandırılan parçalardan meydana gelmektedir. Her foton belirli bir enerji taşımaktadır ve bu enerji Planck denklemi ile şu şekilde gösterilmektedir.
Q=hc/?
Burada, Q foton enerjisi (joules), h, Planck sabiti (6.623 x 10E-34), c, ışık hızı ( 2.998 x 10E8 metre/saniye) ve lamda dalga boyudur (metre). Dalga boyu arttıkça enerjide o oranda düşmektedir (mor ötesi ışınlar kızıl ötesi ışınlardan çok daha fazla enerji taşımaktadır. )
Bazı Işık Terimleri
Lümen: WATT’ın ışıksal eşitidir. Işık akışı diye adlandırılan bu birimde 683 lümen, 555 nm dalga boyu ışıkta bir WATT’a eşittir. Veya 555 nm dalga boyunda 1 lümen=1.464 x 10E-3 WATT’ tır.
Lüx (lx): Aydınlık düzeyi diye de bilinen bu birimde, 1 lümen değerinde ışık akışının 1 mE2 yüzeye eşit yayılmış şekilde düştüğü durumda 1 lux değerindedir. Bazı cisimlerin aydınlık düzeyi aşağıda verilmiştir:
Candela (cd): bu birim ışık şiddeti olarak ta bilinir. 1 Candela ışık her katı küresel açıya her yönde 1 lümen ışık yayan birimdir. Burada katı küresel açı bir küreden kesilen ve ucu kürenin merkezinde bulunan ve alanı yarı çapının karesine eşit olan açıdır. Bazı cisimlerin tipik ışık şiddetleri ağıda verilmiştir:
PIC Mikrokontrolör
PIC Microchip Teknology Inc. Firması tarafından üretilmektedir. Halen çok yaygın olarak kullanılan bu Mikrokontrolör yılda 120 milyonun üzerinde satış yapmaktadır. PIC ailesi çok geniş olup bu ailede çeşitli özelliklere sahip mikrokontrolörler bulunur.
Bütün PIC mikrokontrolörler en az aşağıdaki özelliklere sahiptirler:
- RISC (azaltılmış komut takımı) temelli ve sadece 35 makine dili komutu.
- Sayısal giriş-çıkış portları.
- Zamanlama devresi.
- RAM veri belleği.
- EPROM veya Flash veri belleği.
Buna ilaveten , bazı PIC mikrokontrolörlerde aşağıdaki ek özellikleri de görebiliriz:
- Analog-sayısal çevirici.
- EEPROM bellek.
- Analog karşılaştırıcı devresi.
- Ek zamanlama devreleri.
- PWM devresi.
- Dış ve iç kesme (interrupt) devreleri.
- USART seri iletişim protokolü.
- I2C ve SPI bağlantıları.
Bu projede çok yaygın olarak kullanılan PIC16F84 mikrokontrolörü kullanılmıştır. Şimdi bu mikrokontrolörlerin özelliklerine bir göz atalım.
PIC 16F84 mikrokontrolör:
Mikroişlemci : Ön belleğine yazılan programı işleterek istenilen çıkışlara yönlendiren birimdir. Mikroişlemci veya sayısal bilgisayarlar üç temel kısımdan (CPU-Merkezi işlem ünitesi, I/O ve bellek) ve bunlara ek olarak bazı destek devrelerden oluşur. Her bir temel kısım en basitten en karmaşığa kadar çeşitlilik gösterir.
I/O (Giriş/Çıkış-Girdi/çıktı): Sayısal anolog ve özel fonksiyonlardan oluşur. Mikroişlemcinin dış dünya ile ilişkisini sağlar. Mikroişlemciye verilen ve işlemlerden alınan veriler bu hat üzerinden sağlanır.
CPU (Central Proccesing Unit-Merkezi işlem birimi): Sistemin kalbidir. Birim hesapları yapmak ve verileri idare etmek için 4.8 veya 16 bitlik veri formatında çalışır.
Bir mikroişlemcide temelde kullanılan üç yol vardır.
1-) Veri yolu : Bu yol ; işlemci, bellek ve çevre birimleri arasında veri iletmek için kullanılır.
2-) Adres yolu : Bu yol, işlemcinin program komutlarına ve veri saklama alanlarına erişimi
sağlayan bellek adreslerini, ROM ve RAM belleklerine göndermek için kullanılır.
3-) Denetim yolu: Bu yol Ram belleğine veri yazıldığı veya ondan veri okunduğuna dair bilgi vermek gibi, denetim amaçları için kullanılır. Bu yol aynı zamanda kesmelerin kullanımına olanak tanıyan bağlantıları da içerir. Tipik bir mikroişlemci komutunun yürütülmesi her üç yolunda kullanımını gerektirebilir.
Böylelikle kullanılan ek devreler artarak maliyet yükselir ve tasarım çok karmaşık hal alır. İşlemci ilk olarak komuta, komut adresini adres yoluna koyarak erişir. İkili kodlardan oluşan bu adres, buna karşılık gelen bellek konumu tarafından tanınır ve bu konum istenen komutu veri yolundan işlemciye gönderir.
Örneğin eğer bu komut , verinin işlemciden gönderilmesini ve bir RAMkonumunda saklanmasını gerektiriyorsa işlemci, adres yolunu istenen konumu belirtmek, veri yoluna veriyi iletmek ve denetim yoluna da RAM a yazıyor olduğunu belirtmek için kullanılır.
Mikrokontrolörler
Mikrokontrolcü : Bir yazılım olmadan hiçbir işe yaramayan bir plastik metal ve temizlenmiş kum yığınıdır. Mikrokontrolcüyü kontrol eden bir yazılım olduğundaysa neredeyse sınırsız bir uygulamaya sahiptir.
Mikrokontrolcünün Avantajları : Mikrokontrolörler’ in mikroişlemcilere olan üstünlükleri oldukça fazladır. Örneğin mikroişlemcili bir sistem yapıldığında mikroişlemcinin yanısıra hafızalar (RAM, ROM veya EPROM) , I/O giriş çıkış birimi ve buna benzer birçok sistem kullanılmaktadır.
Bu karışık sistemin hem tasarlanması ve yapımı zordur hem de maliyeti oldukça yüksektir. Mikrokontrolcüler de bir sistemin çalıştırılabilmesi için yalnızca bir mikrokontroller ve osilatör devresi kafi gelmektedir. Sistemde gerekli olan ön bellek ve I/O birimi mikrokontroller içinde bir yonga halindedir.
PIC mikrokontrolörlerine giriş
PIC’ in kelime anlamı PERIPHERAL INTERFACE CONTROLLER giriş-çıkış işlemcisidir. İlk olarak 1994 yılında 16 bitlik ve 32 bitlik büyük işlemcilerin , giriş ve çıkışlarındaki yükü azaltmak ve denetlemek amacıyla çok hızlı ve ucuz bir çözüme ihtiyaç duyulduğu için geliştirilmiştir.
PIC mikrokontrolerlerinin tercih sebebepleri :
a) Lojik uygulamalarının hızlı olması
b) Fiyatının oldukça ucuz olması
c) 8 bitlik mikrokontroller olması ve bellek ve veri için ayrı yerleşik bus’ ların kullanılması
d) Veri ve belleğe hızlı olarak erişimin sağlanması
e) PIC’ e göre diğer mikrokontrolcülerde veri ve programı taşıyan bir tek bus bulunması, dolayısıyla PIC’ in bu özelliği ile diğer mikrokontrolörlerden iki kat daha hızlı olması.
f) Herhangi bir ek bellek veya giriş/çıkış elemanı gerektirmeden sadece 2 kondansatör ve bir direnç ile çalışabilmeleri.
g) Yüksek frekanslarda çalışabilme özelliği
h) Standby durumunda çok düşük akım çekmesi.
i) İntterrupt kapasitesi ve 14 bit komut işleme hafızası.
j) Kod sıkıştırma özelliği ile aynı anda birçok işlem gerçekleştirebilmesi PIC mikrokontrolörlleri çeşitli özelliklerine göre PIC16C6X, 16C7X, 16C5X gibi gruplara ayrılırlar.
PIC’ in kullanımı için gerekli aşamalar :
I/O (Giriş / Çıkış) :Mikrokontrolcünün dış dünya ile ilişkisini sağlayan, girdi ve çıktı şeklinde ayarlanabilen bir bağlantı pinidir. I/O çoğunlukla mikrokontrolcünün iletişim kurmasına, kontrol etmesine veya bilgi okumasına izin verir.
Yazılım :Mikrokontrolcünün çalışmasını ve işletilmesini sağlayan bilgidir. Başarılı bir uygulama için yazılım hatasız (bug) olmalıdır. Yazılım C, Pascal veya Assembler gibi çeşitli dillerde veya ikilik(binary) olarak yazılabilir.
Donanım : Mikrokontrolcü, bellek, arabirim bileşenleri, güç kaynakları, sinyal düzenleyici devreler ve bunları çalıştırmak ve arabirim görevini üstlenmek için bu cihazlara bağlanan tüm bileşenlerdir.
Simülatör :PC üzerinde çalışan ve mikrokontrolcünün içindeki işlemleri simüle eden MPSIM gibi bir yazılım paketidir. Hangi olayların ne zaman meydana geldiği biliniyorsa bir simülatör kullanmak tasarımları test etmek için kolay bir yol olacaktır. Öte yandan simülatör, programları tümüyle veya adım adım izleyerek bug’lardan arındırma fırsatı sunar. Şu anda en gelişmiş simülatör programı Microchip firmasının geliştirdiği MPLAB programıdır.
ICE : PIC MASTER olarak da adlandırılır. (In- Circuit Emulator / İç devre takipçisi) PC ve Mikrokontrolcünün yer alacağı soket arasına bağlanmış yararlı bir gereçtir. Bu gereç yazılım, PC de çalışırken devre kartı üzerinde bir mikrokontrolcü gibi davranır. ICE, bir programa girilmesini, mikro içinde neler olduğunu ve dış dünyayla nasıl iletişim kurulduğunun izlenilmesini mümkün kılar.
Programcı :Yazılımın mikrokontrolcü belleğinde programlamasını ve böylece ICE’ nin yardımı olmadan çalışmasını sağlayan bir birimdir. Çoğunlukla seri port ’a (örneğin PICSTART, PROMASTER) bağlanan bu birimler çok çeşitli biçim, ebat ve fiyatlara sahiptir.
Kaynak Dosyası :Hem asembler’ in hem de tasarımcının anlayabileceği dilde yazılmış bir programdır. Kaynak dosya mikrokontrolör’ ün anlayabilmesi için önceden assemble edilmiş olmalıdır.
Assembler : Kaynak dosyayı bir nesne dosyaya dönüştüren yazılım paketidir . Hata araştırma bu paketin yerleşik bir özelliğidir. Bu özellik assemble edilme sürecinde hatalar çıktıkça programı bug’lardan arındırırken kullanılır. MPASM, tüm PIC ailesini elinde tutan Microchip’ in son assemble edicisidir.
Nesne dosyası (object file) : Assembler tarafından üretilen bu dosya; programcı, similatör veya ICE’ nin anlayabilecekleri ve böylelikle dosyanın işlevlerinin çalışmasını sağlayabilecekleri bir dosyadır. Dosya uzantısı assemble edicinin emirlerine bağlı olarak , .OBJ veya .HEX olur.
PIC mikrokontrolörlerinin özellikleri
Güvenirlik: PIC komutları bellekte çok az yer kaplarlar. Dolayısıyla bu komutlar 12 veya 14 bitlik bir program bellek sözcüğüne sığarlar. Harward mimarisi teknolojisi kullanılmayan mikrokontrollörler de yazılım programının veri kısmına atlama yaparak bu verilerin komut gibi çalıştırılmasını sağlamaktadır. Bu da büyük hatalara yol açmaktadır. PIC’ ler de bu durum engellenmiştir.
Hız : PIC oldukça hızlı bir mikrokontrolör’ dür. Her bir komut döngüsü 1µsn’ dir. Örneğin 5 milyon komutluk bir programın 20Mhz’ lik bir kristalle işletilmesi yalnız 1sn sürer. Bu süre 386SX33 hızının yaklaşık 2 katıdır. Ayrıca RISC mimarisi işlemcisi olmasının hıza etkisi oldukça büyüktür. Ü
Komut seti : PIC’ in 16C5X ailesinde bir yazılım yapmak için 33 komuta ihtiyaç duyarken 16CXX araçları için bu sayı 35’ tir. PIC tarafından kullanılan komutların hepsi yazmaç (register) temellidir. Komutlar 16C5X ailesinde 12 bit, 16CXX ailesindeyse 14 bit uzunluğundadır. PIC’ te CALL, GOTO ve bit test eden BTFSS ve INCFSZ gibi komutlar dışında diğer komutlar 1 saykıl çeker. Belirtilen komutlar ise 2 saykıl çeker.
Statik İşlem : PIC tamamıyla statik bir işlemcidir. Yani saat durdurulduğunda da tüm yazmaç içeriği korunur. Pratikte bunu tam olarak gerçekleştirebilmek mümkün değildir. PICmikrosu programı işletilmediği zaman uyuma (sleep) moduna geçirilerek micronun çok düşük akım çekmesi sağlanır. PIC uyuma moduna geçirildiğinde , saat durur ve PIC uyuma işleminden önce hangi durumda olduğunu çeşitli bayraklarla ifade eder. (elde bayrağı, 0 (zero) bayrağı … vb.) PIC uyuma modunda 1µA’den küçük değerlerde akım çeker. (Standby akımı).
Sürme özelliği (Sürücü kapasitesi): PIC yüksek bir çıktı kapasitesine sahiptir. Tek bacaktan 40mA akım çekebilmekte ve entegre toplamı olarak 150mA akım akıtma kapasitesine sahiptir. Entegrenin 4mHz osilatör frekansında çektiği akım çalışırken 2mA, stand-by durumunda ise 2µA kadardır.
Seçenekler : PIC ailesinde her türlü ihtiyaçların karşılanacağı çeşitli hız, sıcaklık, kılıf, I/O hatları, zamanlama (Timer) fonksiyonları, seri iletişim portları, A/D ve bellek kapasite seçenekleri bulunur.
Çok yönlülük : PIC çok yönlü bir mikrodur ve ürünün içinde, yer darlığı durumunda birkaç mantık kapısının yerini değiştirmek için düşük maliyetli bir çözüm bulunur.
Güvenlik :PIC endüstride en üstünler arasında yer alan bir kod koruma özelliğine sahiptir. Koruma bitinin proglamlanmasından itibaren, program belleğinin içeriği,program kodunun yeniden yapılandırılmasına olanak verecek şekilde okunmaz.
Geliştirme:PIC program geliştirme amacıyla proglamlanabilip tekrar silinebilme özelliğine sahiptir. (EPROM, EEPROM) Aynı zamanda seri üretim amacıyla bir kere programlanabilir (OTP) özelliğine sahiptir.
Liste dosyası : Assembler tarafından yaratılan ve kaynak dosyadaki tüm komutları hexadecimal sistemdeki değerleri ve tasarımcının yazmış olduğu yorumlarıyla birlikte içeren bir dosyadır. Bir programı bug’lar dan arındırırken araştırılacak en yararlı dosya budur. Çünkü bu dosyayı izleyerek yazılımlarda neler oldu bittiğini anlama şansı kaynak dosyasından daha fazladır. Dosya uzantısı .LST dir.
Diğer dosyalar :Hata dosyası( Error file:uzantısı .ERR)hataların bir listesini içerir ancak bunların kaynağı hakkında hiç bir bilgi vermez. Uzantısı .COD olan dosyalar emülatör tarafından kullanılırlar.
Bug ‘lar : Tasarımcının farkında olmadan yaptığı hatalardır. Bu hatalar, basit yazılım hatalarından, yazılım dilinin yanlış kullanımına kadar uzanır. Hataların çoğu derleyici tarafından bulunur ve bir .LST dosyasında görüntülenir. Kalan hataları bulmak ve düzeltmek te geliştiriciye düşer.
PIC mikrokontrolörlerinin içyapısı
CPU bölgesinin kalbi ALU dur. (Aritmetic Logic Unit-Aritmetik mantık birimi) ALU, W (Working-Çalışan) adında bir yazmaç içerir. PIC, diğer mikroişlemcilerden, aritmetik ve mantık işlemleri için bir tek ana yazmaca sahip oluşuyla farklılaşır. W yazmacı 8 bit genişliğindedir ve CPU’da ki herhangi bir veriyi transfer etmek üzere kullanılır.CPU alanında ayrıca iki katagoriye ayırabileceğimiz Veri Yazmaç dosyaları (Data Regıster Files) bulunur. Bu veri yazmaç dosyalarından biri, I/O ve kontrol işlemlerinde kullanılırken, diğeri RAM olarak kullanılır.
PIC’ ler de Harward Mimarisi kullanılır. Harward mimarisi mikrokontrolcülerde veri akış miktarını hızlandırmak ve yazılım güvenliğini arttırmak amacıyla kullanılır. Ayrı bus’ ların kullanımıyla veri ve program belleğinde hızlı bir şekilde erişim sağlanır.
Şekil 3.1: Temel PIC blok diyagramı
PIC mikrokontrolör’ lerini donanımsal olarak incelerken PIC 16C84 veya yeni adıyla PIC 16F84 üzerinde durarak bu PIC’ i temel alıp donanım incelenecektir. Bellek ve bazı küçük farklılıklar dışında burada anlatılanlar bütün PIC’ ler için geçerlidir.
Genel tanımlama :PIC 16C84 veya F84 düşük maliyetli, yüksek performanslı, CMOS, full-statik, 8 bit mikrodenetleyicidir.
Tüm PIC 16/17 mikrodenetleyiciler RISC mimarisini kullanmaktadır. PIC16CXX mikroları birçok esas özelliklere sahiptir. 8 seviyeli, derin küme ve çoklu iç ve dış kesme kaynaklarına sahiptir. Harward Mimarisinin ayrı komut ve veri taşıyıcısıyla ayrı 8 bitlik geniş veri taşıyıcılı, 14 bitlik geniş komut kelimesine imkan vermektedir.
2 aşamalı komut hattı tüm komutların tek bir saykıl’ la (çevrimle) işlenmesini sağlamaktadır. Yalnızca bazı özel komutlar 2 saykıl çekerler. Bu komutlar dallanma komutlarıdır.
PIC16CXX mikrodenetleyicileri tipik olarak 2:1 oranında kod sıkıştırmasına erişmektedir ve sınıflarındaki 8 bit mikrodenetleyicilerden 2:1 oranında hız arttırılmasına olanak sağlanmaktadır. (10MHZ)
PIC16C84 microchip’ i 36 bitlik RAM belleğine, 64 bayt EEPROM belleğine ve 13 I/O pin’ ine sahiptir. Bunun yanı sıra, timer ve sayaç ta mevcuttur.
PIC16CXX ailesi dış elemanları azaltacak spesifik özelliklere sahiptir ve böylece maliyet minimuma inmekte, sistemin güvenirliği artmakta, enerji sarfiyatı azalmaktadır. Bunun yanı sıra tüm PIC ler de 4 adet osilatör seçeneği mevcuttur. Bunlarda tek pin li RC osilatör, düşük maliyet çözümünü sağlamakta (4 MHZ) , LP osilatör (Kristal veya seramik rezonatör) , enerji sarfiyatını minimize etmekte (asgari akım) (40 KHZ), XT kristal veya seramik rezonatör osilatörü standart hızlı ve HS kristal veya seramik rezonatörlü osilatör çok yüksek hıza sahiptir (20 MHZ).
PIC mikrokontrolörlerinin en büyüközelliği sleep modu özelliğidir.. Bu mod ile PIC işlem yapılmadığı durumlarda uyuma moduna geçerek çok düşük akım çeker. (5m A). Kullanıcı bir kaç iç ve dış kesmelerle PIC’ i uyuma modundan çıkarabilmektedir. Yüksek güvenilirlikli Watchdog Timer kendi bünyesindeki chip üstü RC osilatörü ile yazılımı kilitlemeye karşı korumaktadır.
PIC16C84 (16F84) EEPROM program belleği , aynı aygıt paketinin orjinali ve üretimi için kullanılmasına olanak vermektedir. Yeniden programlanabilirliği mikroyu uygulamanın sonundan kaldırmadan kodu güncelleştirmeye izin vermektedir.
Bu aygıtın kolayca erişilemediği, fakat prototipinin kod güncelleştirmesi gerekli olduğu durumlarda, bir çok uygulamanın geliştirilmesinde yararlıdır. Bunun yanı sıra bu kodun güncelleştirilmesi diğer ayrı uygulamalarda da yararlıdır.
Aşağıda tablo 2.1 de PIC16C8X’ ailesinin özellikleri ve şekil 2.1’ de de basitleştirilmiş iç yapısı gösterilmektedir.
Tablo 3.1 : PIC16C8X ailesi özellikleri
Şekil 3.2 : PIC 16C84’ ün basitleştirilmiş iç yapısı
PIC’ ler özellikle de PIC16C84 yüksek hızlı otomobillerden, motor kontrolü uygulamaları, düşük enerji sarfiyatlı uzaktan çalışan sensörler, elektronik kilitler, güvenlik aygıtları ve akıllı kartlara kadar bir çok uygulamalarda kullanılırlar. EEPROM teknolojisi uygulama programların (Transmitter kodları, motor hızları, alıcı frekansları, güvenlik kodları vb.) uygulamasını son derece hızlı ve uygun hale getirmektedir.
Küçük boyutlarıyla bu mikrodenetleyiciler alan sınırlaması bulunan uygulamalarda kusursuzdur. Düşük maliyet, düşük enerji sarfiyatı, yüksek performans, kullanım kolaylığı ve I/O esnekliği özellikle de PIC 16C84 mikrosunun daha önce kullanılması hiç düşünülmeyen alanlarda kullanılmasını sağlamaktadır. (Bunlar ; timer fonksiyonları, seri kominikasyon, PWM fonksiyonları ve birlikte işlemci uygulamaları)
Seri sistem içi programlama özelliği (iki pinin üzerinden) ürünün tamamen toplanması ve test edilmesinden sonra ürünün alıştırılmasının esnekliğine olanak vermektedir. Bu özellik sayesinde ürün serileştirilebilmekte ve veriler saklanabilmektedir.
Gelişme desteği:PIC16CXX sınıfı tam özellikli mikrobirleştirici, yazılım simülatörü, devre içi emülatör, düşük maliyetli program geliştirme ve tam özellikli programlayıcı ile desteklenmiştir. PIC 16F84 PIC16C5X mikrokontrolerlerinin geliştirilmiş halidir. PIC16C5X için yapılan devrelerde kolaylıkla PIC16C84 (16F84) kullanılabilir.
Elektrikle silinebilen mikrokontrolörler : Bu mikrolar, programının silinip yeniden yazılabilme özelliğine sahiptir ve oldukça düşük maliyetli plastik ambalajlar halinde bulunmaktadır. Aynı zamanda bu tip mikroların üretimi kadar prototipinin geliştirilmesi ve pilot programlar için kullanılmasına olanak sağlamaktadır. Bunun daha ötesindeki avantajlarından biri, bunların devre içi veya Microchip’s PICSTARTÒ plus veya PROMATE II programlayıcıları tarafından silinebilmesi ve yeniden programlanabilmesidir.
Mimari olarak incelenmesi :PIC16CXX sınıfının üstün performansı genellikle RISC mikroçiplerinde bulunan birçok mimari özelliklere sahiptir. Başlangıç olarak PIC16CXX Harward mimarisini kullanmaktadır. Bu mimari ayrı belleklerden erişilen program ve verilere sahiptir. Böylece PIC mikrosu program belleği ve veri belleği taşıyıcılarına sahipken programların ve verilerin aynı bellekten getirilen geleneksel Von Neuman mimarisi üzerinde bant genişliği iyileştirilmektedir.
Programların ve veri belleklerinin ayrılması komutların 8 bitlik geniş veri kelimesinden farklı boyutlandırılmasına olanak vermektedir. PIC16CXX mikroları tekli kelimeye imkan veren 14 bit taşıyıcı üzerinden 14 bit komutu tek bir süreçte uygulamaktadır. İki aşamalı hat komut sürecini ve yürütülmesini biraraya getirmektir. (örnek 3-1). Bunun sonucu olarak, program bölünmeleri dışında tüm komutlar tek bir süreçle yürütülmektedir (400ns @ 10MHZ).
PIC 16CXX aygıtları,kayıt dosyalarına ve veri belleğine doğrudan veya dolaylı olarak yönlenebilmektedir. Program Sayacı dahil bütün özel fonksiyon kayıtları veri belleğine yerleştirilmiştir. Adres modunu kullanarak herhangi bir kaydın üstüne herhangi bir işlemin
gerçekleşmesini mümkün kılan Ortogonal (simetrik) komutlarda kurulmuştur. Simetrik özelliği ve “özel optimal durumların”eksikliği PIC 16CXX ile programlamayı daha da etkin kılmaktadır. İlaveten enformasyon eğrisi önemli ölçüde azaltılmıştır.
PIC16CXX mikroları 8 bitlik ALU ya ve W(working) registerine sahiptir.W registerindeki veri ile herhangi bir kayıt dosyası arasında aritmetik ve boolean fonksiyonları uygulanmaktadır.
ALU 8 bit enindedir ve toplama, çıkarma , değiştirme ve çeşitli lojik işlemleri içerir. İki bilgili komutlarda bir bilgi tipik olarak W registeridir diğer bilgi ise dosya kaydı veya hazır sabit değerdir. Tekli komutlarda bilgi ya W kaydı ya da dosya kaydıdır.
Yürütülen komutlara dayanarak ALU, STATUS kaydındaki Caryy(C), Digit Caryy(DC) ve Zero(Z) bitlerini etkileyebilmektedir. C ve DC bitleri, çıkarmalarda, nispeten çıkarma işleminde ödünç alan ve sayısal ödünç alan bit olarak işlemektedir.
Saat ölçüm şeması / komut süreci :Saat girişi (OSC1 den) içten dörde bölünmüştür ve Q1, Q2, Q3 ve Q4 olarak gelmeyen 4 kare dalga sinyali ortaya çıkar. İçten olarak, program sayacı (PC) her Q1 de bir arttırılmakta ve komutlar program belliğinde sürece sokularak Q4 sürecinde komut kaydına katılmaktadır. Komutlar Q1 ve Q4 aralığı boyunca decode edilir ve yürütülür. Saat palsi ve komut yürütme akımı şekil 2.3 de görülmektedir.
Şekil 2.3: Saat palsi ve komut yürütme akımı
Komut akımı / bilgi iletimi : ‘Komut süreci’ dört Q sürecinden oluşmaktadır. (Q1, Q2, Q3 ve Q4). Komut devri ve yürütülmesi şöyle iletilmektedir. Devir bir komut sürecini üstlenirken decode ve yürütme diğer komut sürecini üstlenmektedir. Bununla birlikte bilgi iletim nedeniyle , her bir komut etkin olarak bir süreçte yürütülür. Eğer komut program sayacının değişmesine neden olmuşsa ( örn. GOTO komutu) o zaman komutun tamamlanması için iki süreç gereklidir.
Devir süreci her Q1 de değeri bir artan program sayacı (PC) ile başlar. Yürütme sürecinde işleyen komut Q1 sürecindeki ‘Komut kaydı’na gönderilir. Daha sonra bu komut Q2, Q3 ve Q4 süreçleri boyunca decode edilir ve yürütülür. Veri belleği Q2 boyunca okunur (Bilgi okunması) ve Q4 boyunca yazılır ( Yazım hedefi).
Bellek organizasyonu :PIC16C84` de 2 bellek bloğu mevcuttur. Bunlar program belleği ve veri belleğidir. Her bir bellek kendi taşıyıcısına sahiptir; böylece her bir bloğa erişim aynı osilatör süreci boyunca meydana gelebilmektedir.
Bunun ötesinde, veri belleği genel amaçlı RAM ve özel fonksiyon kayıtları (SFRS) olmak üzere ikiye bölünür. . SFR`ler her bir bireysel özelleşmiş modülü ele alan bölümde açıklanan özel modülleri kontrol etmek için kullanılmaktadır.
Veri belleği EEPROM veri belleğini de içermektedir. Bu bellek, direkt veri belleğine planlanmamış, fakat indirekt olarak planlanmıştır; ve indirekt adres göstergeleri okumak/yazmak için EEPROM belleğinin adresini belirlemektedir. EEPROM belleği 64 bayt ve 10h-3Fh. adres enine sahiptir.
Şekil 3.4: Program hafızası ve küme(Yığın)
Veri bellek organizasyonu
Veri belleği ikiye ayrılır. Birincisi özel fonksiyon kayıt alanı (SFR), diğeri ise genel amaçlı kayıt alanıdır. SFR’ ler aygıtın işlemini kontrol eder.
Veri belleğinin bölümleri kümelenmiştir. Bu kümeler BANK adını alırlar. Bu hem SFR alanı hem de GPR alanı içinde geçerlidir. GPR alanı genel amaçlı RAM`in 16 bayt` ından daha fazlasına olanak sağlanabilmesi için kümelenmiştir. SFR` nin kümelenmiş alanı özel fonksiyonları kontrol eden kayıtlara aittir. Kümeleme küme seçimi için kontrol bitleri gerektirmektedir. Bu kontrol bitleri STATUS kaydında yer almaktadır. Şekil 2.4 veri belleği haritası organizasyonunu göstermektedir.
Veri belleğin tümüne ya direkt her kayıt dosyasının mutlak adreslerini kullanarak, yada, dolaylı yoldan dosya seçim kaydı (FSR) üzerinden erişilebilir. Dolaylı adresleme, veri belleğinin kümelenmiş alanına erişmek için RP1: RPO` un şimdiki değerlerini kullanmaktadır.
Veri belleği genel amaçlı kayıt ve özel fonksiyon kaydını içeren iki kümeye bölünmektedir. RPO bitinin (STATUS <5>) (Yani 5. Bit RPO bitidir.) silinmesiyle BANK 0 seçilir. RPO` in kurulması BANK 1`i seçer. Her bir BANK (küme) 7Fh (128 bytes) kadar uzanır (genişler). Her bir kümenin ilk on iki yerleşimi özel fonksiyon kaydı için rezerve edilmiştir. Kalanı ise statik RAM olarak genel amaçlı kayıt yürütebilmektedir.
Genel amaçlı kayıt dosyası
Bütün aygıtlar belirli bir miktarda genel amaçlı kayıt (GPR) alanına sahiptir. Her bir GPR 8 bit enindedir ve dolaylı yada doğrudan FSR üzerinden erişilmektedir. adresleri BANK 0`daki adreslere planlanır. Örnek olarak, 0Ch veya 8Ch adresleme yerleşimi aynı GPR` ye erişecektir
Özel fonksiyon kayıtları
Özel fonksiyon (Şek 2.5 ve Tablo2.1) kayıtları, aygıtın işlemini kontrol etmek için CPU ve özel fonksiyonlar tarafından kullanılmaktadır. Bu kayıtlar statik RAM`lerdir.
Şekil 3.5 : Kayıt Dosyası Haritası
PORTB ve TRISB Kayıtları
PortB 8 bit eninde iki yönlü porttur. Buna uygun veri yönlendirici kaydı TRISB`dir. TRISB kaydındaki herhangi bir bit “1” ise, buna uygun çıkış sürücüsü yüksek direnç moduna getirilecektir. TRISB kaydındaki herhangi bir bitin “0” olması, çıkış mandalının içeriğini seçilen pinin üzerine getirir.
Her bir PORTB pini iç direnç düşürücü engellere sahiptir. Tekli kontrol biti tüm engelleri devreye sokabilir. Bu RBPU(OPTION – REG<7) bitinin silinmesiyle yapılır. Düşürücü engeller, port pini çıkış olarak konfigüre edildiği zaman otomatik olarak kapanmaktadır. Engeller güç reset üzerinde etkinsizleştirilmektedir.
Dört PORTB pini, RB7: RB4 değişim özelliklerinde kesmelere sahiptir. Yalnızca giriş olarak konfigüre edilen pinler kesmenin meydana gelmesine sebep olabilirler. (yani, herhangi bir çıkış olarak şekillendirilen RB7:RB4 pini değişim ilişkisi üzerindeki kesmeden hariç tutulmuştur. ) Giriş modundaki pinlerin değeri PORTB` nin önceki okunmasındaki eski değeri ile karşılaştırılır . Pinlerin “uyuşmayan” kısımları RB port değişim kesmesini üretmek için birlikte OR’lanır.
Şekil 3.10: RB7: RB4 Pinlerinin Blok Diyagramı
Not: 1: TRISB=”1” düşürücü engelleri aktifleştirilir (OPTINN-REG kaydındaki RBPU “0” ise)
2: I/O pinlerinde VDD ve VSS yi koruma diyodları mevcuttur
Bu kesme aygıtı SLEEP` ten çıkarabilir. Kullanıcı, kesme servis programında, kesmeyi aşağıdaki metotlarla temizleyebilir.
a PORTB`yi okuma (veya yazma). Bu uyuşmazlık durumuna son verir. b RBIF bayrak bitini temizler.
Uyuşmazlık durumu RBIF bitini kurmaya devam edecektir. PORTB’nin okunması bu uyuşmazlık durumuna son verecek ve RBIF bitinin temizlenmesine olanak verecektir.
Bu uyuşmazlık özelliğindeki kesme bu pindeki şekillendirilebilir yazılı engelleri ile birlikte anahtar depresyonundan çıkmaya olanak sağlamaktadır.
Not 1: Eğer I/O pininde, PORT B` nin okuma işlemi yürütüldükten sonra (Q2 sürecinin başlaması ile) değişme meydana geliyorsa, RBIF kesme bayrak biti kurulmayabilir.
Şekil 3.11 : RB3:RBO Pinlerinin Blok Diyagramı
Not: 1: TRISB=”1” düşürücü engelleri aktifleştirilir (OPTINN-REG kaydındaki RBPU “0” ise)
2: I/O pinlerinde VDD ve VSS yi koruma diyodları mevcuttur
Değişme özelliklerindeki kesmeler anahtar depresyon işlemlerinde kalkma ve PROTB` nin yalnızca değişim özelliklerinde kesmeler için kullanıldığında tavsiye edilmektedir. Değişimözelliklerinde kesmeler kullanılırken, PORTB` nin ayrılması tavsiye edilmemektedir.
Tablo 3.4 : PortB kaydedicileri
I/O Programlama değerleri
Herhangi bir okuduğu gibi yazan ve içten çalışan komutun arkasından yazma işlemi gelmektedir. Örneğin BCF ve BSF komutları CPU için kayıtları okumakta, bit işlemini yürütmekte ve sonuçları tekrar kayda yazmaktadır. Bu önlem, komutların hem girişi hem de çıkışı tanımlanan portlara uygulandığından kullanılmalıdır. Örneğin, PORTB` nin 5. bitindeki BSF işlemi PORTB’nin tüm sekiz bitinin CPU içine yönelik okunmasına neden olur. Daha sonra, BSF işlemi bit 5 üzerinde yer alır ve PORT B çıkış mandallarına yazılır. Eğer diğer bir PORT B` nin biti iki yönlü I/O pini olarak kullanıldıysa ve bu zamanda giriş olarak tanımlandıysa, pindeki giriş sinyali CPU` yu okuyacaktır ve daha önceki içeriğin üzerine yazılmak suretiyle belirli pinlerin veri mandallarına yeniden yazacaktır. Pin, giriş modunda olduğu sürece hiçbir problem çıkmayacaktır. Bununla birlikte eğer o pin çıkış modunda açıldıysa, veri mandalının içeriği bilinmeyen olacaktır.
Port kaydının okunmasıyla port pinlerinin değerleride okunur. Port kaydına yazmada ise port mandalına yazılır. Eğer portla bu düzenle yaz komutu kullanıldıysa (yani BCF, BSF) port pinlerinin değerleri okunur, istenen işlem port pinlerinin değerine kadar yerine getirilecek ve ondan sonra bu değer port mandalına yazılacaktır.Aktif olarak yüksek ve düşük çıkış yapılan pinler aynı zamanda dış aygıtlarından çıkarılmamalıdır. Sonuçta yüksek çıkış akımı çipe zarar verebilir.
I/O Portlarındaki ardışıl işlemler
I/O portuna fiili yazımı, komut sürecinin sonunda geçerli olurken, okuma da komut sürecinin başında geçerli olması gerekmektedir. (şek 2.12) Böylelikle, okuma tarafından takip edilen yazma aynı I/O portunda yürütüldüyse, tedbirleri mutlaka alınmalıdır. Komutların ardışıklığı öyle olmalıdır ki, pin voltajları, sıradaki komuttan daha erken stabilize olmalıdır.(yükleme bağımlılığı) Bunun yanı sıra bu pinin daha önceki hali, yeni haline nispeten CPU’ya okunabilir.
Şekil 3.12 : Ardışıl I/O işlemleri
Not : Bu örnek (Şekil 3.12) PORTB den okuma tarafından takip edilen PORT yazılmasını göstermektedir. Dikkat edilmelidir ki veri okuma zamanı =(025Tcy-Tpd) burada Tcy= komut sürecidir Tpd= yayılma sürecidir Böylece yüksek saat frekanslarında okuma tarafından takip edilen yazımın durumu problematiktir
TİMER0 Modulü ve TMR0 kaydı
Timer0 modül, timer/sayaç aşağıdaki özelliklere sahiptir.
- 8 bitlik timer/sayaç
- Okunabilir ve yazılabilir
- 8 bitlik programlanabilir prescaler.
- İçten veya dıştan saat ayarı
- FFh` tan 00h` ye taşma üzeri kesme
- Dış saatin sınır seçimi
Timer modu, TOCS bitinin (OPTION<5>) temizlenmesiyle seçilir. Timer modunda Timer0 modülü her bir komut sürecini uzatır. (Prescaler olmaksızın) (Şek 2.11) Eğer TMR0 kaydı yazılıysa, uzama takip eden 2 süreci engeller. (şek 2.12 ) Kullanıcı ayarlanan değeri TMR0 kaydına yazarak, bunun etrafından çalışabilir.
Sayaç modu TOCS bitinin (OPTION<5>) ayarlanmasıyla seçilir. Bu modda, TMR0, RA4/TOCK1 pininin sınırlarının herbir artışında ya da düşüşünde artacaktır. Genişleyen sınır, TO kaynak sınır seçim biti tarafından, TOSE (OPTION<4>) tarafından belirlenmektedir. TOSE bitinin temizlenmesi artan sınırları seçecektir.
Prescaler, Timer0 modülü ile Watchdog Timer arasında paylaşmaktadır. Prescaler ataması, yazılımda PSA biti kontrolü tarafından denetlenmektedir. (OPTION<3>) PSA bitinin temizlenmesi, prescaler’ ı Timer0 modülüne atayacaktır. Prescaler okunabilir veya yazılabilir değildir. Prescaler Timer0 modülüne atandığında prescaler değeri (1:2, 1:4 …; 1:256) yazılım tarafından seçilebilirdir.
Şekil 3.13 :TMR0 blok diyagramı
Not1: T0CS, T0SE, PS2, PS1, PS0 ve PSA bitleriOPTIONregisterineyerlestirilmistir.
2: Önölçücü (prescaler) Watchdog Timer ile paylastırılmıstır.
TMR0 kesmesi, TMR0 kaydı FFH`dan 00h`ye akışında üretilmektedir. Bu fazla akım TOIF bitini ( INTCON<2>) kurar (ayarlar). Kesme, aktif TOIE bitinin (INTCON<5>) temizlenmesi ile gizlenebilir. (INTCON<5>) TOIF biti, Timer0 modülü tarafından, bu kesmenin yeniden aktifleştirilmesinden önce yazılımdan silinmelidir. TMR0 kesmesi (şek.2.13) işlemciyi SLEEP` ten çıkaramaz, çünkü, SLEEP boyunca timer kapalıdır.
Şekil 3.13.1 : TMR0 zamanlaması: Prescaler’ siz içten clock
TMR0’ nun dıştan saat ile kullanımı: Dıştan saat girişleri TMR0 için kullanıldığında, bazı ön şartların gerçekleştirilmesi gerekir. Dıştan saat gereksinimi , içten faz saati senkronizasyonundan kaynaklanmaktadır. Bunun yanısıra, TMR0 kaydının senkronize edilmesinden sonra, fiili artmada gecikme mevcuttur.
Dıştan saat senkronizasyonu :Hiç bir prescaler kullanılmadığı taktirde , dıştan saat girişi prescaler çıkışındaki gibidir. RA4/TOCKI pininin içten faz saati ile senkronize edilmesi iç faz saatlerinin Q2 ve Q4 süreçlerindeki prescaler çıkışını örneklemek yoluyla yerine getirilir. (Şekil 2.13) . Bunun için , TOCKI’ nin düşük değerinin en azından 2TOSC (artı ufak RC gecikmesi) olması gerekir.
Prescaler kullanıldığında, dış saat girişi asenkron sayıcı tipi prescaler’ a bölünür ve böylece prescaler çıkışı simetrik olur. Dış saatin örnekleme gereksinmelerini karşılamak için sayaç(counter) dikkate alınmalıdır. Böylece prescaler değerine bölünen en azından 4 TOSC peryot uzunluğuna sahip olmalıdır.
TMR0 gecikme uzatılması :Prescaler çıkışı , iç saat ile senkronize edildiği için, dış saat sınırlarının meydana gelmesindeki zamandan TMR0 modülünün fiili olarak uzatılması zamanına kadar küçük bir gecikme vardır.
Prescaler( bölücü):8 Bitlik sayaç Timer0 modülünde veya Watchdog timer’ında bulunur. Prescaler dışarıdan verilen sinyali 256 ya kadar bölmeye yarar. Timer0 modülü ile Watchdog timer’ı arasında karşılıklı istisna tutulan yalnızca birtek prescaler mevcuttur. Böylece Timer0 modülüne prescaler ataması, watchdog timer’ın prescaleri olmadığı anlamına gelmektedir.
PSA ve PS2 : PSO bitleri (option <3:0>) prescaler atamasını ve prescaler oranını belirlemektedir.
Şekil 3.14 : Dış saatli TIMER0 zamanlayıcısı
Not:
1 : Saat giriş değişiminden TMR0 uzamasına kadar gecikme 3 TOS`tan 7 TOSC`a kadardır
2: Eğer hiçbir prescaler seçilmediyse dış saat aksine prescaler çıkışıdır
3 : OK işareti örneklerinin meydana geldiği yeri gösterir. Küçük saat palsi örnekleme tarafından elde edilir
Timer0 modülüne yazılan bütün komutlar, timer0 modülüne atandığında prescaler’i ölçecektir. WDT ye atandığında , CLRWDT komutu Watchdog Timer boyunca prescaler’ i temizleyecektir. Prescaler yazılabilir veya okunabilir değildir.
Tablo 3.5 : Timer0 ve diğer kaydediciler
EEPROM veri belleği
EEPROM veri belleği normal işlem boyunca okunabilir ve yazılabilirdir. Bu bellek direkt olarak kayıt dosya boşluğuna planlanmamıştır. Bunun yerine bu bellek, özel fonksiyon kaydı üzerinden dolaylı olarak adreslenir. Burada bu belleği okuyan ve yazan 4 özel kaydedici (SFR) mevcuttur.
Bu kayıtlar : EECON1 EECON2 EEDATA EEADR
EEDATA yazma/okuma için 8 bitlik veri tutar ve EEADR erişilen EEPROM adreslerini saklar. PIC16C84 aygıtı 0H ile 3FH genişliğindeki adresli EEPROM belleğinin 64 bitine sahiptir.
EEPROM veri belleği byte’ ları okuma ve yazmaya olanak verir. Byte’lar otomatik olarak veri siler ve yeni veri yazar. (yazmadan önce siler). EEPROM veri belleği yüksek silme/yazma süreçlerine oranlanmıştır. Yazma zamanı chip üzeri timer tarafından denetlenmektedir. Yazma zamanı chipten chipe göre değiştiği gibi, voltaj ve ısı değerlerine görede değişebilir.
Aygıt kod korumalı olduğu zaman , CPU EEPROM belleğini okumaya ve yazmaya devam edebilir. PIC programlayıcısı artık bu belleğe erişemeyebilir.
EEADR :EEADR kaydı EEPROM verisinin maximum 256 byte’ ını adresleyebilir. Üstteki iki bit adresi decode edilmiştir. Bu şu anlama gelmektedir ki , 64 bitin bellek boşluğunda olduğundan emin olmak için bu iki bit her zaman 0 olmalıdır.
Şekil 3.15 : EECON1 Registeri (88h adresleri)
R = Okunabilir. W = Yazılabilir. S = Kurulabilir bit
U = Kullanılmayan bit, ‘0’ olarak okunur. ^n = POR resetindeki değer.
Bit 7 : 5 : Kullanılmayan : ‘0’ olarak okunur.
Bit 4 EEIF : EEPROM Yazma işlemi kesme bayrak biti.
1 = Yazma işlemi tamamlanmıştır.
0 = Yazma işlemi tamamlanmamıştır veya başlamamıştır.
Bit 3 WRERR : EEPROM hata bayrak biti
1 : Yazma işlemi erkenden sona ermiştir. (MCLR veya WDT normal işlem boyunca resetlenir.)
0 : Yazma işlemi tamamlanmıştır.
Bit 2 WREN : EEPROM yazma aktifleştirme biti
1 : Yazma sürecine olanak verir.
0 : EEPROM verisine yazmayı engeller.
Bit 1 WR : Yazım kontrol biti
1 : Yazım sürecini başlatır. (Yazım bitirildikten sonra bit donanım tarafından silinir. WR biti yalnızca yazılıma kurulabilir.(silinmez) )
0 : EEPROM a veri yazım süreci tamamlanmıştır.
Bit 0 RD : Okuma kontrol biti.
1 : EEPROM’ un okunmasını başlatır. (okuma yalnızca bir devirde yer alır. RD donanımda silinir. RD biti yalnızca yazılıma kurulabilir. ( silinmez) )
0 : EEPROM okumasını başlatmaz.
EECON1 ve EECON2 kayıtları (registerleri)
EECON1 , fiziksel olarak yerine getirilen 5 düşük sıralı bitli kontrol kaydıdır. Üst üç biti mevcut değildir ve ‘ 0 ‘ olarak okunur.
RD ve WR kontrol bitleri okuma ve yazmayı başlatırlar. Bu bitler silinemezler, yalnızca yazılıma kurulabilirler. Bu bitler, okuma ve yazım işlemlerinin tamamlanması olarak donanımdan silinirler. WR’nin yazılımdan silinmesinin olanaksızlığı , yazım işleminin
tesadüfi vaktinden evvel sona erdirilmesini önler.
WREN biti, kurulduğunda yazım işlemine başlamaya izin verilir. Yüksek güçte, WREN biti temizlenir. Yazım işlemi normal işlem süresinde MCLR, RESET veya WDT- zaman aralığı reset tarafından kesildiğinde WRERR biti kurulur. Bu durumlarda, resetin ardından kullanıcı WRERR bitini kontrol edebilir ve yerleşimi yeniden yazabilir. EEDATA ve EEADR kayıtlarındaki veri ve adresler değişmeyecektir. Yazım tamamlandığında EEIF bayrak biti kesmesi kurulur. Bu kesme yazılımdan silinmelidir.
EECON2 fiziksel kayıt değildir. EECON2 okuması tüm ‘0’ ları okuyacaktır. EECON2 kaydı harici olarak data EEPROM yaz serisinde kullanılır.
EEPROM veri belleğinin okunması
Veri bellek yerleşimini okumak için , kullanıcı, adresi EEADR kaydına yazmalıdır ve RD kontrol bitini kurmalıdır. (EECON1<0>). Veri sıradaki devirde, EEDATA kaydında mevcuttur , bunun için bu sıradaki komutta okunabilmektedir. EEDATA bu değerleri diğerleri okununcaya kadar veya kullanıcı tarafından yazılıncaya kadar tutmaktadır. (yazım işlemi boyunca)
EEPROM veri belleğine yazım
EEPROM veri yerleşimini yazmak için kullanıcı ilkin adresleri EEADR kaydına, verileri EEDATA kaydına yazmalıdır. Daha sonra kullanıcı her bit’ e yazımın başlatması için spesifik ardışıkları takip etmelidir.
Yukarıdaki seri her bir bit için tam tamına takip edilmediği sürece (55h yi EECON2 ye yaz, Aah yi EECON2 ye yaz ve WR bitini kur) yazım başlatılmayacaktır. Bu kod segmenti boyunca kesmelerin etkinsizleştirilmesi yerinde olur.
İlaveten EECON1 deki WREN biti aktif yazıma kurulmalıdır. Bu mekanizma beklenmeyen kod yürütülmesinden kaynaklanan tesadüfi EEPROM verilerin üzerine yazımı önler. Kullanıcı, EEPROM un güncelleştirilmesi hariç her zaman WREN bitini temiz tutmalıdır. WREN biti donanım tarafından silinmektedir.
Yazım serisi başlatıldıktan,WREN bitinin temizlenmesi bu yazım şeklini etkilemektedir. WREN biti kurulmadıkça, WR bitinin kurulması engellenir.
Yazım şeklinin tamamlanmasından sonra, donanımdaki WR biti temizlenir ve EE yazım bitini bayrak biti (EEIF) kurulur. Kullanıcı bu kesmeyi aktifleştirebilir yada etkinleştirebilir.
EEIF yazılım tarafından silinmelidir.
NOT: EEPROM veri bellek E/W cycle zamanı 10ms aşabilmektedir. (tipik) Yazım şeklinin bitiminden emin olmak için EE kesmesi kullanılmalı veya WR biti seçilmelidir. (EECON<1>). Her iki durum şeklinin tamamlandığını ifade eder.
Yazım doğrulanması
EEPROM verisine yazılan değerlerin yazılması istenen değerlerle doğrulanması gerekmektedir. Bu EEPROM birirnin spesifikasyon limitine yakın uygulamalarda kullanılmalıdır. Toplam kaldırma diski , uygunluk (rahatlık) derecesini belirlemeye yardımcı olacaktır.
Genel olarak EEPROM yazım başarısızlığı ”1” olarak yazılan, fakat geriye “0” olarak okunan bitten kaynaklanmaktadır.
Taklit yazılımlara karşı koruma
Şöyle durumlar olabilir ki , aygıt EEPROM veri belleğine yazmak istemeyebilir. Taklit yazılımlara karşı korunmak için, değişik mekanizmalar monte edilmiş, kurulmuştur. Yüksek güçte WREN temizlenir. Bunun yanı sıra , yüksek güç timer’ i (72 msn süreli) EEPROM yazımını önler.
Yazılımı başlatan ardışık ve WREN biti ikisi birlikte ‘Brown-Out’, güç arızası veya yazılım aksamasında tesadüfi yazılımları önlemeye devam eder.
Kod koruma süresince eeprom veri işlemi
Micro, kod korumalı durumdayken düzene sokulan verileri okuyabilir ve EEPROM verisine yazabilir.ROM aygıtlarında iki koruma biti mevcuttur. Birisi ROM program belleği diğeri ise EEPROM veri belleği içindir.
C PROGRAMLAMA DİLİ
C programlama dili günümüzde en yaygın kullanılan programlama dillerinden biridir. Bir PC ve bir mikrokontrolör için yazılmış olan C derleyicileri her ne kadar birbirine benzeseler de aralarında bazı önemli farklar vardır. PC için yazılmış olan bir C derleyicisi genellikle oldukça daha büyük olup programcıya çok çeşitli fonksiyonlar sunmaktadır. (Örneğin dosya açıp kapama, dosya okuma v.s.).
Bunun yanında mikrokontrolör için yazılmış olan bir C derleyicisi daha küçük olup programcıya sunulan fonksiyon sayısı oldukça sınırlıdır. Bununla birlikte standart C dilini öğrenmiş olan bir programcı, kullanmış olduğu mikrokontrolörün mimarisini de bildiği takdirde çok kolaylıkla C dilinde program geliştirebilir.
PIC mikrokontrolörler için yazılmış çok sayıda C derleyicileri bulunmaktadır. Örneğin Forest Electronics in sunduğu FED C, Hi-Tech firmasının ürünü olan PICC ve yine aynı firmanın ürünü olan ve ücretsiz olarak verilen PICC Lite, CCS firmasının PCM ve PCW derleyicileri ve bunun gibi daha birçokları vardır.
Bu projede PICC Lite derleyicisi kullanılmıştır. Bu derleyiciyi ücretsiz olarak internetten yüklemek mümkündür.
PICC Lite Derleyici : Hi-Tech firması tarafından geliştirilmiş olan ANSI C standardını izleyen bu C derleyicisi pek çok özelliklere sahip bir çok endüstriyel uygulamalarda, öğrenim- öğretim amaçlı ve aynı zamanda elektronik hobi olarak kullanılmaktadır.
PICC Lite derleyicisi, yine aynı firmanın ürettiği ve pazarladığı PICC derleyicisine çok benzemekte olup, ücretsiz olduğu için bazı kısıtlamaları bulunur. Örneğin PICC Lite ile sadece 16C84, 16F84, 16F84A, 16F627, 12F629, 16F877 ve 16F877A PIC mikrokontrolörleri için kullanılabilir.
Bunun yanında sadece iki tane RAM bankı desteklemektedir. (2 bank PIC16F84 için yeterli olduğu halde PIC16F877 için yeterli değildir.) ve 16 F877 ile 16F877A mikrokontrolörleri kullanıldığında ROM kapasitesi 2K olarak sınırlandırılmıştır.ayrıca PICC Lite derleyicisinde printf fonksiyonu, long ve float veri çeşitleri kullanılamaz. Bu kısıtlamalar dışında PICC Lite ve PICC derleyicileri aynı olup her iki derleyiciyi de kullanarak çok kompleks PIC uygulamaları geliştirmek mümkündür.
Bu bölümde, PICC Lite derleyicisinin özelliklerini ve bu derleyiciyle C programı geliştirmeyi inceleyeceğiz.
PICC Lite Veri Çeşitleri: PICC Lite C derleyicisi aşağıda belirtilen veri çeşitlerini desteklemektedir. Burada küçük harf kullanıldığına dikkat edilmelidir.
bit
unsigned char
unsigned int
signed int
long
unsigned long
float
double
Değişkenlere Tanım Esnasında Değer Vermek: C programlama dilinde değişkenlere tanım esnasında değer vermek mümkündür. Örneğin aşağıda değişken temp’e tanım esnasında 10 değeri ve değişken x’e ise karakter A değeri verilmiştir.
unsigned int temp =10;
unsigned char x =’A’;
Programda Açıklayıcı Yazılar: İki tane öne eğik çizgiden (“//”) sonra yazılanlar derleyici tarafından öneme alınmamakta ve programın çalışmasını kolay anlamak için bu tip açıklayıcı yazılar tavsiye edilmektedir.
İ=0; //i değişkenini 0 yap
J=j+2 //j değişkenine 2 ilave et
//şimdi iki sayıyı çarp
//ve neticeyi sakla
Açıklamaları bir diğer şekilde yazma formatı ise, açıklamayı “/*” karakterleri ile başlatmak ve “*/” karakterleri ile bitirmektir. Aşağıdaki örnekte bu açıklama şekli gösterilmiştir:
/* Bu program iki tane sayıyı toplar.
Sayılardan biri x, diğeri ise y dir.
Netice z de saklanir.
*/
z = x + y;
Herhangi bir programda her iki tanım şeklini de kullanmak mümkündür.
Değişkenlerin Bellekte Saklanması : PICC Lite C derleyicisinde değişkenler normal olarak RAM bellekte (genel maksatlı yazmaçlarda) saklanmaktadır. Eğer bir değişkenin değeri sabitse ve program boyunca değişmeyecekse, o değişkeni program belleğinde (EPROM veya Flash) saklamak mümkündür. Bu şekilde, kapasitesi sınırlı olan RAM belleği çok kullanılmamış olur.
Sabit bir değişkeni program belleğinde saklamak için önüne const komutu ilave edilmeli ve değişkenin değeri tanım esnasında belirtilmelidir. Aşağıdaki örnekte temp1 değişkeni RAM belleğinde saklanır, temp2 değişkeni ise 12 değerini alır ve program belleğinde bir sabit olarak saklanır. Burada temp değişkeninin değeri program boyunca sabit olup program içerisinde değiştirilemez. temp 1 değişkeni ise istenildiği gibi ve istenilen an değiştirilebilir:
int temp1 ;
const int temp = 12;
Diziler : Diziler (arrays) benzeri bir takım değişkenleri bir grup altında toplamak için kullanılırlar. Örneğin,
int sonuc[6];
Komutu 6 tane tam say ı tanımlar ve bu tam sayıların ilki sonuc[0], ikincisi sonuc[1], ve sonuncusu ise sonuc[5] olmaktadır.
Örneğin, sonuc[3] = 18 komutu sonuc dizisinin 4üncü elemanını 18 sayısına eşitler. Aynı şekilde, sonuc[2] = sonuc[1] komutu sonuc dizisinin 2inci elemanını 3üncü elemanına eşitler.
Bir dizinin elemanları RAM bellekte veya program belleğinde saklanabilirler. Eğer elemanların değerleri sabitse ve program boyunca değişmeyecekse, const komutu kullanarak bu elemanlar program bellekte saklanabilirler. Bu şekilde, kapasitesi kısıtlı olan RAM bellek de kullanılmamış olur. Aşağıdaki örnekte 5 elemanlı temp dizisinin elemanları program bellekte saklanırlar. Bu dizi bellekte 10 bayt tutar (her integer 2 bayt yer tutar):
const int temp[] = {1, 5, 9, 12, 45};
Aşağıdaki örnekte ise temp dizisi RAM bellekte 10 bayt tutar:
int temp[] = {1, 5, 9, 12, 45};
C programlama dilinde string değişkenleri ASCII 0 ile sonlandırılan ve bir takım karakterler ihtiva eden dizilerdir. Bu durumda,
char name[ ] = “Suzan”;
Komutunda derleyici otomatik olarak name stringi için sonuncu karakteri ASCII 0 olan 6 karakter ayırır. Bu örnekte dizi RAM bellekte saklanmıştır. Aynı dizinin başına const komutu koyarak diziyi program bellekte saklayabiliriz.
Diziler birden çok boyutlu olabilirler. Aşağıdaki örnekte ve Şekil 1.2 de 2 boyutlu bir dizi tanımlanmıştır:
int temp[3][5];
Burada temp, 3 sırası ve 5 sütunu olan bir dizi olarak düşünülebilir. Dizinin ilk elemanı temp[0][0], ikinci elemanı temp[0][1], üçüncü elemanı temp[0][2] vs dir.
Örneğin, temp[0][1] = 10 komutu dizinin ikinci elemanını 10 sayısına eşitler.
Dizi elemanlarını tanım esnasında belirtmek mümkündür. Aşağıdaki örnekte test dizisi RAM bellekte saklanmış ve elemanları test[0]=2, test[1]=5, ve test[2]=8 olarak belirlenmiştir:
int temp[3] = {2,5,8};
Daha önce bahsedildiği gibi, const komutunu kullanarak dizi elemanlarını program bellekte sabit olarak saklayabiliriz.
Program Değişken isimleri : Program değişkenleri bir karakter veya alt çizgi (“_”) ile başlamalı ve bunu takiben istenilen miktarda karakter veya 0¬-9 arasında sayı kullanılmalıdır. Aşağıdakiler geçerli olan bazı program değişken isimleridir:
size
toplam_miktar
max5
_ortalama
j
ge2ci23ci
a_b_c_d
Static değişkenler : Genel olarak bir fonksiyonda bulunan ve fonksiyonu her kullanışta değerleri değişmeyen değişkenlerdir. Bu değişkenleri tanımlarken isimleri başına static yazılır. Örneğin, bir fonksiyona girişte, fonksiyonda daha önce kullanılan bir değişkenin değeri belirsizdir. Fakat değişkeni static yapmakla değerini muhafaza etmiş oluruz.
Volatile değişkenler : Bir değişkenin her kullanıldığında eski değerini muhafaza edemeyeceği durumlarda kullanılır. Bütün giriş-çıkış portları ve kesme rutinlerinin değiştirdiği değişkenler volatile yapılmalıdır.
Persistent Değişkenler : Genel olarak PIC mikrokontrolör reset yapıldığında programda kullanılan bütün değişkenler ilk olarak sıfır değerini alırlar. Yalnız bazı durumlarda, birtakım değişkenlerin reset esnasında değerlerini kaybetmelerini istemeyebiliriz. Herhangi bir değişkenin ismi önüne persistent kelimesini yazmakla o değişkenin reset esnasında sıfırlanmasını istemediğimizi belirtiriz.
Mutlak Adres Değişkenleri : Bir değişkenin ismi sonuna “@” karakteri konarak o değişkene bir mutlak adres değeri verilebilir. Örneğin,
unsigned char Portbit @ 0x06;
Yukarıdaki satırda belleğin 6 ncı adresinde Portbit diye bir değişken tanımlanmıştır. Burada derleyici Portbit değişkeni için bir yer ayırmaz, fakat sadece Portbit ismini mutlak adres 6 ya eşitler. Bu tanımın assembler eşiti şudur:
Portbit EQU 06h
Bit veri çeşidi ve mutlak adres birleştirilip istenilen bir adresteki herhangi bir bit okunup değiştirilebilir. Örneğin, STATUS yazmacı bellekte adres 3 tedir. Bu yazmacın 3 üncü bitini istiyorsak, STATUS yazmacını adres 3 de tanımlayıp 3×8 + 3 = 27 nci biti şu şekilde tanımlayabiliriz:
static unsigned char STATUS @ 0x03;
static bit PD @ (unsigned)&STATUS*8+3;
Operatörler : Herhangi bir programlama dilinde operatörler son derece önem taşımaktadırlar. Bütün aritmetik ve lojik işlemler bu operatörler sayesinde yapılmaktadır. PICC Lite derleyicisi aşağıdaki operatörleri desteklemektedir:
Program Akış Kontrolü : Program akışını değiştiren komutlar assembler dili de olmak üzere her programlama dilinde son derece önemlidirler. Bu komutlar sayesinde döngü yapabiliriz veya bir değişkenin değerine bağlı olarak değişik işlemler yapabiliriz. PICC Lite aşağıdaki program akış kontrol komutlarını destekler:
if-else
for
while
do
goto
break
switch – case
Şimdi bu komutların kullanımlarını daha yakından inceleyelim.
4.13.1. if – else
Koşula bağlı olarak program akışını değiştiren bu komut genel olarak şu şekillerde kullanılabilir:
if(koşul)komut;
veya,
if(koşul)
{
komut;
komut;
……….
……….
komut;
}
veya,
if(koşul)
{
komut;
komut;
……….
}
else
{
komut;
komut;
……….
}
sadece bir komut içeren durumlarda şu şekilde de kullanılabilir:
if(koşul)
komut;
else
komut;
Burada, komutlar sonunda noktalı-virgül işaretlerine dikkat ediniz.
Aşağıdaki örnekte, p değişkeni 0 ise b değişkeni 1 olarak artırılır, aksi halde b değişkenine 2 ilave edilir:
if(p = = 0)
b=b+1;
else
b=b+2;
Yukarıdaki örnekte eşittir operatörü olan “= =” karakterlerinin kullanıldığına dikkat ediniz.
for : for komutu program içerisinde döngü yapmak için kullanılır. Döngü bir veya birtakım komutu birden fazla tekrarlamak maksadıyla kullanılır. Bu komut şu şekillerde olabilir:
for(başla; koşul; artış)komut;
veya,
for(başla; koşul; artış)
{
komut;
komut;
……….
}
burada, başla döngü değişkeninin ilk değerini, artış ise son değerini belirtmektedirler.
Aşağıdaki örnekte döngü değişkeni i, 1 den 10 a kadar gitmekte ve sayac değişkeni 10 defa artırılmaktadır.
for(i = 1 ; k = 10; i + + )sayac+ +;
for komutunu kullanarak iç içe döngü yapmak mümkündür. Aşağıdaki örnekte iç döngü 5 defa ve dış döngü ise 10 defa tekrarlanmaktadırlar:
for(i=0; i<10; i+ +) { for(j=0; j<5; j+ +) { komut; ......... } }
4.13.3. while
Döngü yapmak için kullanılan bir başka komut da while komutu olup bu komutun genel kullanım şekli şu şekildedir:
while(koşul)komut;
veya,
while(koşul)
{
komut;
komut;
………
}
Belirtilen koşul doğru olduğu müddetçe döngü devam etmektedir. Eğer döngü başında seçenek doğru değilse döngü içerisindeki komutlar işlem görmezler. Aşağıdaki örnekte döngü 10 defa tekrarlanmaktadır:
i=0;
while(i < 10)
{
komut;
komut;
i++;
}
while komutunu kullanırken döngü içerisinde koşulun sağlanmasına dikkat etmemiz gerekir, aksi halde sonsuz bir döngü elde etmiş oluruz.
do : Döngü yapmak için kullanılan bir diğer komut ise do komutudur. Burada seçenek döngünün sonunda kontrol edilir ve bundan dolayı koşul doğru olmasa bile döngü en az bir defa çalışmış olur. Bu komutun genel kullanımı şu şekildedir:
do
{
komut;
komut;
……..
}while(koşul);
Aşağıdaki örnekte döngü değişkeni j, 0 dan 5 e kadar gitmekte ve döngü 5 defa tekrarlanmaktadır:
j = 0;
do
{
komut;
komut;
j++;
}while < 5);
while komutunu kullanırken döngü içerisinde koşulun sağlanmasına dikkat etmemiz gerekir, aksi halde sonsuz bir döngü elde etmiş oluruz. Ayni zamanda, koşul sağlansa bile döngü en az bir defa yapılmaktadır.
break komutu : Bir döngü içerisinde ve döngü bitmeden, döngü dışına çıkmak için kullanılmaktadır. Aşağıdaki örnekte j değişkeni 10 olunca döngü durur ve döngü sonrasındaki komutlar işlem görürler. Bu komut bir sonra göreceğimiz switch-case komutunda çok kullanılmaktadır:
while(i < 100) { komut; komut; if(j = = 10)break; }
switch – case : Bu komut, çoklu if-else komutu gibi görev yapmaktadır. Bir değişken alınır ve bu değişkenin değerine bağlı olarak çeşitli komutlar işlem görürler.
Aşağıdaki örnekte, sec değişkeninde bulunan ve ‘A’ ve ‘F’ arasında olan 1-digit bir hexadecimal sayının decimal sayıya dönüştürülmesi gösterilmiştir. Dönüştürülen sayı hex gibi bir değişkende saklanmıştır:
Switch(sec)
{
Case’A’: hex = 65;
break;
Case’B’: hex = 66;
break;
Case’C’: hex = 67;
break;
Case’D’: hex = 68;
break;
Case’E’: hex = 69;
break;
Case’F’: hex = 70;
break;
default: hex = 0;
break;
}
Burada, sec değişkeninin değeri ‘A’ ise hex değişkeni 65 olur, ‘B’’ ise hex değişkeni 66 olur, ‘C’ ise hex değişkeni 67 olur v.s. Eğer sec değişkeni ‘A’ ve ‘F’ arasında değilse default komutu çalıştırılır ve bu örnekte hex değişkeni 0 a eşitlenir. switch-case komutunda break komutunun çok sık olarak kullanıldığına dikkat ediniz (eğer break kullanılmazsa program bir sonraki koşula devam etmektedir).
Kullanıcı Fonksiyonları : Fonksiyonlar genel olarak bir program içerisinde kullanılan ve ana programdan bağımsız programdırlar. Her fonksiyonun bir ismi olup istenilirse bir fonksiyon ana programa bilgi aktarabilir. Başında void komutu ile başlayan fonksiyonlar ana programa bilgi aktaramazlar . Örneğin, aşağıdaki fonksiyonun ismi ledon olup bu fonksiyon ana programa bilgi aktarmaz.
void ledon()
{
led = 1;
}
Aşağıdaki ledon fonksiyonu ise ana programa integer bir bilgi aktarır:
int ledon()
{
komut;
komut;
return(değişken);
}
Fonksiyonlar ana programdan bilgi alıp bu bilgiyi işler ve tekrar ana programa bilgi aktarabilirler. Aşağıdaki örnekte kare fonksiyonu ana programdan bir integer değer alır (parameter) ve bunun karesini alıp ana programa aktarır:
int kare(int y)
{
int w;
w = y*y;
return (w) ;
}
Bu fonksiyon ana program tarafından şu şekilde kullanılabilir:
s = kare(p);
Kare fonksiyonu ana programdan p değişkeninin değerini alır ve bu sayının karesini alıp geri ana programa aktarır. Fonksiyon başındaki int tanımı fonksiyonun ana programa integer (tam sayı) aktaracağını gösterir. Bu durumda, ana programdaki s değişkeni p nin karesine eşitlenmiş olur. Burada önemli olan bir nokta, fonksiyonda kullanılan w ve y değişkenleri sadece fonksiyona ait olup ana programda olan bir w veya y değişkeni ile hiçbir ilgileri yoktur. Ayni zamanda, ana programda kullanılan bir değişken ile fonksiyonda kullanılan ve aynı ismi taşıyan herhangi bir değişken arasında bir bağıntı yoktur.
Ön-işlemci Direktifleri : PICC Lite derleyici, diğer standart C derleyicilerde bulunan çeşitli ön-işlemci direktiflerini destekler. Yaygın olarak kullanılan ön-işlemci direktifleri aşağıda açıklanmıştır.
#define : Bu direktif program başında kullanılır ve bir makro gibi çalışıp semboller yerine tanımlanan eşitlerini koyar.
Örneğin;
#define size 10
#define max 100
#define min 0
program içerisinde bu semboller kullanıldığı zaman yerlerine otomatik olarak değerleri konur:
a = 1; // a değişkenini 1 yap
a = a + size; // a değişkeni 11 değerini alır
define direktifi çok kompleks de olabilmektedir. Aşağıdaki makro tanımında 2*(a+b) işlemi mult(a,b) olarak tanımlanmıştır:
#define mult(a,b) 2*(a + b)
Şimdi bu makronun bir program içerisinde kullanımına bakalım.
a = 2; // a değişkenini 2 yap
b = 5; // b değişkenini 5 yap
c = mult(a,b); // c değişkeni 2*(2+5)=14 olur
#asm ve #endasm : Bu direktifler sayesinde bir assembler programı, veya bir veya birkaç assembler komutları C programımıza ilave edilebilir:
……….
……….
a=2;
#asm
movlw 10h
#endasm
………….
………….
Yukarıdaki programda görüleceği gibi assembler komutları #asm ve #endasm direktifleri arasına yerleştirilmelidir.
#include : Bu direktifi kullanarak başka bir text dosyasını programımız içerisine alabiliriz. Örneğin, “myproject.h” dosyası programımıza şu şekilde ilave edilebilir:
#include “myproject.h”
veya,
#include
PIC yazılımı geliştirirken dosyası programımıza ilave edilmelidir. Bu dosya içerik olarak PIC mikrokontrolöre ait çeşitli değişkenleri tanımlamaktadır.
Programda Değişik Sayı Tabanı Kullanımı : PICC Lite derleyicisinin normal sayı tabanı 10 (desimal) olup birçok mikroişlemci ve mikrokontrolör uygulamalarında kullanılan sayı tabanının zaman zaman değiştirilmesi gerekmektedir. Örneğin, mikrokontrolör tabanlı kontrol uygulamalarında genellikle 16 tabanı (hexadecimal) veya 8 tabanı (octal) kullanılmaktadır.
Bir sayıyı hexadecimal olarak yazmak için önüne %x (veya %0X), octal olarak yazmak için önüne %o ve ikili tabanda yazmak için ise önüne 0b koymak gerekir. Aşağıda değişik tabanlarda bazı örnekler verilmiştir:
toplam = %0x1f; // toplam = 0001 1111
sum = %o37; // sum = 011 111
a = 0b00001111 // a = 00001111
Yapılar (Structures) : Birbirleriyle ilgili olan çeşitli değişkenleri yeni bir değişken altında toplamak için kullanılır. Örneğin, bir şahıs hakkındaki, bir takım bilgiler normal olarak şu şekilde tanımlanabilir:
unsigned char adi[80];
unsigned char soyadi[80];
unsigned int yasi;
unsigned char adresi[80];
Bir yapı (structure) kullanarak yukarıdaki tanımları şu şekilde yazabiliriz:
struct sahsi
{
unsigned char adi[80];
unsigned char soyadi[80];
unsigned int yasi;
unsigned char adresi[80];
}
Bu durumda, sahsi yapısı bir şahıs hakkında olan bütün tanımları bir çatı altında toplamış olur. Bir yapı yukarıdaki gibi tanımlandığı zaman bellekte hiçbir yer tutmaz. Ancak bu yapı bir sonraki örnekte gösterildiği zaman kullanıldığı zaman bellekte yer tutar.
Şimdi, aşağıdaki yeni tanımı yapabiliriz:
struct sahsi benim_bilgiler;
Yukarıdaki tanım ile benim_ bilgiler yeni bir değişken olup bu değişkenin çeşidi sahsi’dir ve bu değişken bellekte yer tutar. Şimdi, bu yeni değişkeni kullanarak şu komutu yazabiliriz:
Benim_bilgiler.yasi = 25;
Yapıları kullanarak bir değişkene istenilen sayıda bit ayırabiliriz. Aşağıdaki örnekte x ve y 1 bitlik değişkendirler ve z ise 6 bitlik bir değişkendir. Değişken temp flags çeşidi bir yapıya sahip olup bellekte toplam 1 bayt tutmaktadır:
struct flags
{
unsigned char x:1;
unsigned char y:1;
unsigned char z:6;
}
struct flags temp;
İşaretçiler (Pointers) : C programlama dilinde işaretçi kavramı çok geniş olarak kullanılmaktadır. Genel olarak bir işaretçi bir değişkenin bellekteki adresini gösterir. Örneğin, x bir değişken ise, x’i gösteren bir işaretçi x’in bellekteki adresini tutar. İşaretçiler, değişken ismi önüne “*” karakteri koyarak tanımlanırlar. Değişken çeşidine göre işaretçi çeşidi de değişmektedir. Örneğin, bir karakter işaretçisi bir integer için kullanılamaz. Aşağıdaki örnekte, p bir karakter işaretçisi olarak tanımlanmıştır:
char *p;
Burada p bir karakter işaretçisi olarak tanımlandığı halde şu an herhangi bir yerde kullanılmış değildir. Herhangi bir değişken önüne “&” karakterini koyarak o değişkenin adresini elde edebiliriz. Daha sonra da işaretçi değişkenini kullanabiliriz. Örneğin, işaretçi p’ye, z değişkeninin adresini şu şekilde yükleyebiliriz:
p = &z;
p işaretçisi şimdi z değişkeninin adresini tutmaktadır. “*” operatörünü kullanarak, adresi bilinen bir değişkenin asıl değerini okuyabiliriz. Aşağıdaki örnekte, daha önce tanımlanan z değişkeninin değeri 3 yapılmıştır:
*p = 3;
Herhangi bir değişkenin adresine erişebilme birçok uygulamalarda çok kullanışlı olmaktadır. Bu şekilde daha verimli ve daha kısa programlar geliştirmek, mümkün olabilmektedir.
İşaretçiler dizilerde çok kullanışlı olmaktadırlar. Bir dizinin ismi o dizinin adresini tutmaktadır. Bu durumda, bir işaretçi kullanarak dizi işlemlerini kolaylıkla yapabiliriz. Bir örnek aşağıda verilmiştir:
char buffer[10]; // 10 elemanı olan bir buffer tanımlama
char *p; // p bir karakter işaretçisidir
p = buffer; // p işaretçiye buffer adresi yüklendi
*p = 0; // buffer dizisinin ilk elemanını 0 yap
p++; // p’yi artır (sonraki elemanı adresle)
*p = 1; // buffer’in ikinci elemanını 1 yap
Yukarıda da görüleceği gibi işaretçiler ile çeşitli aritmetik işlemler yapmak ve değişik adreslere gitmek mümkündür.
EEPROM Belleğe Yazıp Okuma : Bazı PIC mikrokontrolörlerde (örneğin PIC16F84) EEPROM bellek bulunmaktadır. Bu belleğe yazıp okumak için PICC Lite derleyicinin EEPROM_WRITE ve EEPROM_READ diye iki tane fonksiyonu bulunmaktadır.
EEPROM_WRITE (adres, veri) fonksiyonu belleğin adresine veriyi yazar.
Örneğin,
EEPROM_WRITE (5, 12) komutu belleğin 5 inci adresine 12 sayısını yazar.
EEPROM_READ (adres) fonksiyonu belleğin adresinden veri okur.
Örneğin,
z = EEPROM_READ(14) komutu belleğin 14 üncü adresindeki veriyi okur ve değişken z yi bu veriye eşitler.
Konfigürasyon Bitleri : PIC mikrokontrolörün konfigürasyon bitleri “_CONFIG(x)” komutunu kullanarak istenildiği gibi seçilebilir. Burada x istenilen konfigürasyondur. Aşağıdaki örnekte Bekçi Köpek devreden çıkarılır, XT kristal modu seçilir ve kod koruması yapılmaz:
_CONFIG(WDTDIS & XT & UNPROTECT);
PIC konfigürasyon bitlerini yonganın programlanması esnasında programlayıcı yazılımızla da istediğimiz gibi seçebiliriz.
Baskı Devre Alt Görünüş
Baskı Devre Üstten Görünüş
Deneyde Kullanılan Malzeme Tablosu
PIC16F84 Mikrokontrolörünün Sembolü
Ledlerden İki Haneli 7 SD oluşturma
Kaynaklar
[1] İBRAHİM, Doğan “PICC İle Işık Projeleri”, Bileşim Yayıncılık A.Ş., İstanbul,2003
[2] GARDNER, N. “PIC Programlama El Kitabı”,Bileşim Yayıncılık A.Ş.,İstanbul,1989.
[3] AYTEMÜR,Z. “PIC Microcontroller Uygulama Devreleri”,Bileşim Yayıncılık
A.Ş.,İstanbul,1989.
Yayım tarihi: 2009/01/23 Etiketler: c derleyici, c dili, c programlama, display, ışık, led uygulamaları, mikrokontrolor, PICC Lite
Çook teşekkürler emeklerinize sağlık. Ne demişler -bir mum başka bir mumu yakmakla ışığından birşey kaybetmez- 😉