3 pic16f877a’nın Özellİklerİ

36
PIC16F877A’nın ÖZELLİKLERİ PIC16F877A'nın GENEL ÖZELLİKLERİ PIC16F877A’nın ÇALIŞMASI BESLEME GERİLİMİ OSİLATÖR SEÇENEKLERİ SIFIRLAMA (RESET) DEVRESİ I/O (GİRİŞ/ÇIKIŞ) PORT’LARI PIC16F877A'NIN BELLEK ORGANİZASYONU PIC16F877A’NİN GENEL ÖZELLİKLERİ 40 pinli bir mikrodenetleyici olan PIC16F877A 33 Girişıkışa sahiptir. Geri kalan ayaklar besleme gerilimi, osilatör, reset (MCLR) gibi mikrodenetleyicinin çalışması için gerekli donanıma ayrılmıştır. 44-PIN QFN, 44-PIN PLCC, 44-PIN TQFP ve 40 PIN PDIP paketlerinde satılmaktadırlar. Şekil 3-1 : PIC16F877A PIC16F877A’nın bir çok değişik hızda çalışan tipleri vardır. Bu üretilen farklı tipleri arasında en yüksek hızlı olanı 20Mhz kristal ile çalışabilmektedir. Bu da bir program çevriminin en az 200ns olmasına olanak sağlamaktadır. Bunun dışında 4Mhz, 10Mhz gibi seçenekler de mevcuttur. 8k x 14 bit flash program belleğine sahiptir. PIC’in komutları goto, call gibi yönlendirme komutları dışında hep 1 byte olduğundan, yaklaşık 8000 satır program yazmamıza imkan tanır. Flash belleğe 100.000 kez üst üste yazma silme işlemi yapılabilir. RAM olarak tanımladığımız, değişkenlerin bulunduğu veri belleği 368 x 8 bit’tir. Bu, 368 adet değişken tanımlayabileceğimiz anlamına gelir. PIC16F877A’nın bir önceki versiyonu olan PIC16F877’nin EEPROM belleği 256 adet 8 bit’lik veriyi kaydetmemize izin verir, 256 x 8 bit EEPROM veri belleği vardır. EEPROM belleği, RAM veri belleğinden farklı olarak elektrik olmadan da kayıt ettiğiniz veriyi saklayabilir. Veri EEPROM belleğine 1.000.000 defa üst üste yazma silme işlemi uygulanabilir. Veri EEPROM’unda saklanan bilgiler en az 40 yıl boyunca silinmeden bellekte kalır. PIC16F877A’da 3 adet zamanlayıcı-sayıcı (timer) vardır. Bu zamanlayıcılardan TMR0 8 bit bir sayıcıdır. TMR1 uyuma (sleep) durumunda bile dışardan bağlanan bir kristalle arttırabilecek 16 bit’lik bir sayaçtır. TMR2 ise TMR0 gibi 8 bit’lik bir sayıcıdır. TMR2 mikrodenetleyicideki CCPM modülü için zamanlayıcı olarak kullanılır. İki adet Capture, Compare, PWM (CCPM) modülü ile 12,5 ns hassasiyetinde yakalama (capture), 200 ns hassasiyetinde karşılaştırma (compare), 10 bit’lik çözünürlükle PWM sinyali uygulama özelliklerine sahiptir. Senkron Seri iletişim portu ile SPI (master) ve I2C (master/slave) protokollerinde seri iletişim özelliğine sahiptir. (USART/SCI) portu ile Universal Senkron Asenkron Alıcı Verici özelliğine sahiptir. RD (okuma), WR(yazma), CS (kanal seçme) kontrol özellikleriyle birlikte paralel iletişim portuna sahiptir. 10 bit’lik, 8 kanallı Analog/Dijital çevirici’ye sahiptir. Referans değerleri olarak PIC’i besleyen Vdd ve Vcc dışında bir değer seçmek istediğimizde, RA2 ve RA3 portlarından farklı üst ve alt referans 3 3

Upload: others

Post on 25-Feb-2022

12 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: 3 PIC16F877A’nın ÖZELLİKLERİ

PIC16F877A’nın ÖZELLİKLERİ

PIC16F877A'nın GENEL ÖZELLİKLERİ PIC16F877A’nın ÇALIŞMASI BESLEME GERİLİMİ OSİLATÖR SEÇENEKLERİ SIFIRLAMA (RESET) DEVRESİ I/O (GİRİŞ/ÇIKIŞ) PORT’LARI PIC16F877A'NIN BELLEK ORGANİZASYONU

PIC16F877A’NİN GENEL ÖZELLİKLERİ 40 pinli bir mikrodenetleyici olan PIC16F877A 33 Giriş/Çıkışa sahiptir. Geri kalan ayaklar besleme

gerilimi, osilatör, reset (MCLR) gibi mikrodenetleyicinin çalışması için gerekli donanıma ayrılmıştır. 44-PIN QFN, 44-PIN PLCC, 44-PIN TQFP ve 40 PIN PDIP paketlerinde satılmaktadırlar.

Şekil 3-1 : PIC16F877A

PIC16F877A’nın bir çok değişik hızda çalışan tipleri vardır. Bu üretilen farklı tipleri arasında en

yüksek hızlı olanı 20Mhz kristal ile çalışabilmektedir. Bu da bir program çevriminin en az 200ns olmasına olanak sağlamaktadır. Bunun dışında 4Mhz, 10Mhz gibi seçenekler de mevcuttur. 8k x 14 bit flash program belleğine sahiptir. PIC’in komutları goto, call gibi yönlendirme komutları dışında hep 1 byte olduğundan, yaklaşık 8000 satır program yazmamıza imkan tanır. Flash belleğe 100.000 kez üst üste yazma silme işlemi yapılabilir. RAM olarak tanımladığımız, değişkenlerin bulunduğu veri belleği 368 x 8 bit’tir. Bu, 368 adet değişken tanımlayabileceğimiz anlamına gelir. PIC16F877A’nın bir önceki versiyonu olan PIC16F877’nin EEPROM belleği 256 adet 8 bit’lik veriyi kaydetmemize izin verir, 256 x 8 bit EEPROM veri belleği vardır. EEPROM belleği, RAM veri belleğinden farklı olarak elektrik olmadan da kayıt ettiğiniz veriyi saklayabilir. Veri EEPROM belleğine 1.000.000 defa üst üste yazma silme işlemi uygulanabilir. Veri EEPROM’unda saklanan bilgiler en az 40 yıl boyunca silinmeden bellekte kalır.

PIC16F877A’da 3 adet zamanlayıcı-sayıcı (timer) vardır. Bu zamanlayıcılardan TMR0 8 bit bir sayıcıdır. TMR1 uyuma (sleep) durumunda bile dışardan bağlanan bir kristalle arttırabilecek 16 bit’lik bir sayaçtır. TMR2 ise TMR0 gibi 8 bit’lik bir sayıcıdır. TMR2 mikrodenetleyicideki CCPM modülü için zamanlayıcı olarak kullanılır.

İki adet Capture, Compare, PWM (CCPM) modülü ile 12,5 ns hassasiyetinde yakalama (capture), 200 ns hassasiyetinde karşılaştırma (compare), 10 bit’lik çözünürlükle PWM sinyali uygulama özelliklerine sahiptir.

Senkron Seri iletişim portu ile SPI (master) ve I2C (master/slave) protokollerinde seri iletişim özelliğine sahiptir.

(USART/SCI) portu ile Universal Senkron Asenkron Alıcı Verici özelliğine sahiptir. RD (okuma), WR(yazma), CS (kanal seçme) kontrol özellikleriyle birlikte paralel iletişim portuna

sahiptir. 10 bit’lik, 8 kanallı Analog/Dijital çevirici’ye sahiptir. Referans değerleri olarak PIC’i besleyen

Vdd ve Vcc dışında bir değer seçmek istediğimizde, RA2 ve RA3 portlarından farklı üst ve alt referans

33

Page 2: 3 PIC16F877A’nın ÖZELLİKLERİ

26 PIC Programlama Bilgi ve Deney Kitabı

gerilimleri seçme imkanı vardır. Cihaz uyuma (sleep) durumunda olsa bile PIC’in içinde bulunan kendi A/D çevrim RC saati ile çevrime devam edebilir.

Bunların dışında PIC16F877A, PIC16F877’de bulunmayan iki adet karşılaştırıcıya sahiptir. Karşılaştırıcının referans gerilim değerleri, çıkış ve girişler portları yönlendirilebilir yapıdadır.

Yukarıda bahsedilen tüm uygulamalar için birer kesme (interrupt) özelliği bulunur. PIC16F877A’da kesme 15 farklı özel olaydan tetiklenebilir. Örneğin sayaçlar 255’den 0’a döndüğünde, seri iletişim modülü bir sinyal aldığında kesme üretebilir. Bunun dışında PORTB’nin 0. bit’i dışardan kesme özelliği eklemek istediğimizde kullanılır. B portunun RB4 RB7 girişleri de herhangi bir değişimde kesme yapacak şekilde programlanabilir. Bu kesmeler sırası geldikçe detaylı olarak anlatılacaktır.

PIC16F877A, 8 katlı bir yığın (stack) yapısına sahiptir. Bu iç içe sekiz alt program çağırabilmeniz anlamına gelir. Buna kesmeler de dahildir.

Şekil 3-2 : PIC16F877A’nın pin görünüş şeması.

Bunların dışında CPU’nun çalışmasında etkili bazı nitelikler vardır. ICSP (In Circuit Serial Programming) özelliği sayesinde sadece iki pini kullanarak PIC16F877A’yı uygulama devresi üzerindeyken programlanabilir. ICD (In Circuit Debugger) özelliği ile devre üzerindeyken hata ayıklama yapılabilir. LVP (Low Voltage Programming) ile sadece 5V uygulanarak programlanabilmektedir. Programlanabilir Code Protection özelliği sayesinde program belleğinin bir kısmını okunmaya karşı koruma altına alınabilir, diğer bir kısmını ise okunabilir kılınabilir. Düşük gerilimlerde kararsız durumlarla karşılaşmamak için BODEN (Brown Out Reset) adı verilen özellik ile belli bir gerilimin altında reset devresi çalıştırılır. Az enerji tüketmek amacıyla kullanılan Sleep (uyuma) özelliği vardır. Düşük enerji tüketir ve 2.0 V ile 5.5 V arasındaki gerilimlerde çalışabilir.

Microchip’in ürettiği ve 16F877A ile donanımsal olarak aynı özelliklere sahip, ancak I/O pin sayısı, flash belleği ve EEPROM belleği miktarı, A/D kanal sayısı farklı PIC’ler de mevcuttur. 16F877A da dahil olmak üzere farklı paket tiplerinde üretilmektedirler. Bu PIC’lerin özellikleri ve pin görünüşleri aşağıda verilmiştir.

Tablo 3-1 : PIC16F877A ile aynı donanımsal özelliklere sahip PIC’lerin özellikleri.

Page 3: 3 PIC16F877A’nın ÖZELLİKLERİ

PIC 16F877A’nın Özellikleri 27

Şekil 3-3 : PIC16F877A ile aynı donanımsal özelliklere sahip PIC’lerin paket tipleri ve pin görünüş şemaları.

Page 4: 3 PIC16F877A’nın ÖZELLİKLERİ

28 PIC Programlama Bilgi ve Deney Kitabı

Şekil 3-4 : PIC16F877A ve aynı donanımsal özelliklere sahip PIC’lerin paket tipleri ve pin görünüş şemaları.

Page 5: 3 PIC16F877A’nın ÖZELLİKLERİ

PIC 16F877A’nın Özellikleri 29

PIC16F877A’nın ÇALIŞMASI Harvard mimarisi ile üretilen PIC16F877A 8-bit’lik bir RISC işlemcidir. Program belleği ve veri

belleğine farklı adres/veri yolu ile ulaşılır. Mikroişlemcinin çalışmasını çizilebilecek en basit bir blok diyagram üzerinde görelim. Bu diyagram tüm PIC’lerin çalışması için geçerlidir.

Şekil 3–5 : PIC mikrodenetleyicilerin en basitleştirilmiş blok diyagramı. CPU: İçerisinde PC-program counter (Program sayıcısı), ALU (Aritmetic-Logic-Unit) bulunan ve

diğer bloklar arasındaki çalışmayı organize eden ve flash bellekteki kullanıcı programını çalıştıran kısımdır.

Program belleği (FLASH): Programların saklandığı ve defalarca yazılıp, silinebilen flash bellek. Veri belleği (EEPROM): PIC üzerindeki gerilim kesilse bile kaybolması istenmeyen verilerin

saklandığı bellek. Bu bellek üzerine de defalarca yazma/silme yapılabilir. Veri belleği (RAM) : Programın çalışması esnasında geçici olarak saklanması gereken veriler için

kullanılır. GPR (General Purpose Register- Genel amaçlı kaydedici) olarak ta adlandırılan bu bellekte programın yazılması esnasında değişkenler içerisine atanacak veriler bu alanda saklanır. Bu bellekte ayrıca SPR (Special Function Register- Özel amaçlı kaydedici) adı verilen kaydedicilerde vardır. Bunlara PIC’in çalışma biçimini yönlendiren veriler yazılır.

PORTA ve PORTB : Mikrodenetleyicinin dışarıya açılan elektronik kapısıdır. PIC’e girilecek ve PIC’ten dışarıya aktarılacak tüm veriler bu bloklar içerisindeki elektronik devreler aracılığı ile yapılır.

Zamanlayıcı (TIMER0/TIMER1/TIMER2) : Programın çalışmasından bağımsız olarak içerisindeki sayı binary olarak artan 8-bit’lik (Not: TIMER1 16-bit) bir kaydedicidir. Her 4 harici saat sinyalinde bir defa içerisindeki sayı bir defa artarak 255’e ulaştığında tekrar 0’dan başlayarak saymaya devam eder.

Bir mikroişlemcinin çalışması kısaca şöyledir: Program belleğinden CPU tarafından alınan komutun kodu çözülerek işlenir. Komutun yapacağı işleme göre diğer ünitelerden veri okunabilir ya da bu ünitelere veri gönderilebilir. Program komutları gerektiriyorsa zamanlayıcıdan da veri alabilir. Sonuç olarak dış ortama elektronik olarak bağlantısı bulunan PORTA/PORTB’den gönderilen lojik veri mikroişlemcinin kontrol ettiği üniteye veri girişi olur. Bu veri lojik “1” veya “0” olduğu gibi bazı mikroişlemcilerde analog bir gerilim değeri de olabilir. PIC’in dış ortama lojik “1” olarak verdiği 5V luk gerilim altında 25 mA lik akım birçok elektronik devreyi sürmek için yeterli olmayabilir. İhtiyaca göre gerekli yükselteç devreleri kullanılarak güç devreleri de sürülebilir.

Bir Komutun İşlenme Evreleri PIC içerisinde bir komutun ne şekilde çalıştığını adım adım açıklayabilmek için CPU içerisinde

bulunan ve işlevlerinin bilinmesi gereken birkaç ünite daha vardır. Şimdi bunlardan bahsedelim: Program Counter (Program sayıcısı) : CPU içerisinde bulunan 13-bit’lik bir kaydedicidir. Program

belleğinden okunacak bir sonraki komutun adresi saklanır. Genellikle her bir komut işlendikten sonra içerisindeki adres sayısı bir artar. Ancak bir atlama komutu çalıştığında bu defa komutun belirttiği adres PC içerisine yazılır.

Page 6: 3 PIC16F877A’nın ÖZELLİKLERİ

30 PIC Programlama Bilgi ve Deney Kitabı

Instruction Register (Komut kaydedicisi) : İşlenecek olan komutun işlenmeden önce belleğe çağrıldığı kaydedicidir.

Instruction Decoder (Komut kodu çözücüsü) : Komutun kodunun çözüldüğü, yani hangi işlemi yapacağının belirlendiği ünitedir.

Mikrodenetleyicilerde bir komutun işlenmesinde iki evre vardır: Fetch (Getir) : Program belleğinden alınan bir komut IR (Komut kaydedicisine) getirilir. Execute (Çalıştır) : Komutun yapacağı işlemin ne olduğuna bağlı olarak işlemin gerçekleştirilmesi.

Şekil 3–6 : Bir komutun işlenme evreleri.

Saat Sinyali ve Komut Evrelerinin Zamanlama Diyagramı OSC1 ucundan uygulanan saat girişi dahili olarak Q1, Q2, Q3, Q4 olarak adlandıracağımız 4 eşit

zaman aralıklı kare dalgaya bölünür. Bu dört saat çevrimi bir komut çevrimini (bir makine çevrimi de denilir) oluşturur. Bu süre içerisinde bir komut çalıştırılır.

Program sayıcı her Q1 evresinde bir arttırılır. Komutun program belleğinden getirilmesi (fetch) ve komut sayıcının (IR) içerisine yerleştirilmesi Q4 evresinden olur. Komutun kodunun çözülmesi ve çalıştırılması (execute) Q1 ile Q4 arasındaki evrede olur. Harici OSC1 saat sinyali ve ona bağlı olarak komutun akış evreleri tabloda gösterilmiştir.

Şekil 3–7 : Saat sinyali ve komut evrelerinin zamanlama diyagramı.

Mikrodenetleyicinin komut çözümleme birimi program belleğindeki komutları sırayla alır. Bu komutların ne anlama geldiği (ne işlem yapması gerektiği) komut çözümleme biriminde tanımlıdır. Bundan sonraki aşamada ise yapılması istenen işlem uygulanır. Bu işlem iki ikilik düzendeki sayı üzerine mantıksal bir işlem, aritmetik bir işlem veya herhangi bir veriyi başka bir yere aktarma olabilir.

Getir (Fetch)

Program belleği

CPU PC IR

Komut kodu çözücüsü

Çalıştır (Execute)

PORTA, PORTB, Veri belleği (RAM), EEPROM

bellek

Page 7: 3 PIC16F877A’nın ÖZELLİKLERİ

PIC 16F877A’nın Özellikleri 31

Şekil 3 - 8 : PIC16F877A blok diyagramı.

İki aşamalı komut işlenmesinde bir komut işlenirken, bir sonraki komut “komut çözümleme birimi” içerisine kaydedilir (okunur). Buna mikrodenetleyicinin “Pipelining” özelliği denilir. Komutlar sıra ile komut kaydedicisi içerisine yüklenir. Komut kaydedicisi içerisindeki komut çözümlenir. Eğer aritmetik veya mantıksal bir işlem uygulanacaksa, ALU olarak isimlendirilen Aritmetik Lojik Birim içerisinde işlem yapılır. Eğer bu işlemin yapılması sırasında bir kaydedici içeriğinin de akümülatör ile birlikte kullanılması gerekiyorsa bu kaydedici içeriği de aynı anda okunup ALU’da işleme alınır. Sonuç tekrar RAM’e veya akümülatöre kayıt edilir.

Akümülatör, mikrodenetleyiciye her türlü işlemi yaptırmak için kullandığımız bir ara bellek birimidir. 8 bit’lik tek bir kaydedicidir. Diğer kaydedicilerden farklı olarak RAM içerisinde adreslenmemiştir. W kaydedicisi olarak adlandırılmıştır. W İngilizce’deki “Working”, yani çalışma kaydedicisinin kısaltılmışıdır.

Page 8: 3 PIC16F877A’nın ÖZELLİKLERİ

32 PIC Programlama Bilgi ve Deney Kitabı

BESLEME GERİLİMİ PDIP tipinde bir PIC16F877A’nın çalışması için gerekli olan gerilim 11, 12, 31, 32 numaralı

pin’lerden uygulanır. 11, 32 numaralı Vdd uçlarından birisi +5 V'a, 12, 31 numaralı Vss uçlarından birisi de toprağa (GND) bağlanır. PIC'e gerilim uygulandığında devredeki fazla akım çeken elemanların devreye girmesiyle ya da şebekedeki gerilim dalgalanmaları nedeniyle PIC’in resetlenmesini önlemek amacıyla Vdd ile Vss arasına 0.1 μf lık bir dekuplaj kondansatörü bağlamak gerekir. Bu durumda kararlı bir gerilim değeri elde edilmiş olur.

Şekil 3 – 9 : PIC16F877’ye besleme geriliminin bağlanması

OSİLATÖR SEÇENEKLERİ PIC16F877A için dört farklı osilatör seçeneği bulunmaktadır. Mikrodenetleyici programlanırken

yapılan seçimle aşağıdaki osilatör tiplerinden biri seçilebilir.

LP (Düşük Güçlü Kristal) XT (Kristal/Resonatör) HS (Yüksek Hızlı Kristal/Resonatör) RC (Direnç/Kondansatör)

LP, XT ve HS Kristal Tipleri Bunların her birinin kendi özel kullanım alanı vardır. Sistemin hızı harcayacağı gücü, çalışabileceği

gerilimi doğrudan etkiler. Transistörlü sistemlerde işlemcinin harcadığı güç transistörlerin açma kapaması sırasında meydana gelir. Çalışma frekansının yüksek olması transistörlerin daha hızlı açma kapama yapması anlamına gelir. Bu sebeple hızın yüksek olduğu sistemlerde mikrodenetleyicinin harcayacağı güç daha fazla olacaktır. Bunun yanında transistorlu sistemlerde yüksek hızda çalışmak için çalışma geriliminin yüksek olması gerekir. Bu da yine transistor ün açma kapama hız karakteristiği ile ilgili bir özelliktir. Daha yüksek gerilimle transistör daha hızlı açılıp kapanır.

Ger

ilim

6.0V

5.5V

4.5V

4.0V

2.0V

20 MHz

5.0V

3.5V

3.0V

2.5V

PIC16F877A

Frekans

Ger

ilim

6.0V

5.5V

4.5V

4.0V

2.0V

5.0V

3.5V

3.0V

2.5V

4 MHz 10 MHz

PIC16LF877A

Şekil 3 - 10 : PIC16F877A ve PIC16LF877A frekans – gerilim grafikleri.

Page 9: 3 PIC16F877A’nın ÖZELLİKLERİ

PIC 16F877A’nın Özellikleri 33

Şekil 3.10’da PIC16F877A ve PIC16LF877A’nın çalışma bölgeleri gri renkle boyanmış olarak gözükmektedir. Görüldüğü gibi ikisinin de maksimum çalışabileceği gerilim 5.5 V’dur. PIC16F877A 20 Mhz ile 0 Hz arasında tüm frekanslarda 4 V - 5.5 V aralığında çalışabilmektedir. PIC16LF877A’nın izin verilen minimum çalışma gerilimi ise frekans ile birlikte azalmaktadır. Fakat 2 V’un altına düşmemektedir. 4 Mhz’den düşük tüm frekanslarda 2 V’da çalışılabilmektedir.

Şekil 3 - 11 : HS kristal ile çalışan PIC16F877A.

Osilatör tipi ve hız dışında mikrodenetleyicinin harcayacağı gücü etkileyen ikinci bir etken de çalışma gerilimidir. Çalışma gerilimi arttıkça tüketilen güç de artacaktır. Şekil 3.11’de PIC, HS kristal ile çalıştırıldığında farklı kristal hızları ve farklı gerilimler için mikrodenetleyicinin çektiği akım görüntülenmiştir.

PIC16F877A’nın datasheet’inden alınan şekil 3.11’de mikrodenetleyicinin çektiği akımın frekans ile arttığı gözlemlenebilir. Bunun yanında yüksek çalışma gerilimi de daha çok güç harcanmasına sebep olmaktadır.

Şekil 3.12’de HS kristale göre daha makul düzeylerde güç tüketimi sağlayan XT kristalin çektiği akım gösterilmiştir. HS bir kristal ile çekilen akım 1,5 mA - 6 mA arasında iken XT kristal kullanılırken çekilen akım 0,6 mA - 1,6 mA arasında akım çekmektedir. XT kristaller 4 Mhz’e kadar kullanılmaktadır. 4 Mhz’den hızlı kristaller ise HS olarak adlandırılır. Dikkat edilirse HS kristalin başlangıç noktası olan 4 Mhz’in, XT kristalin bitiş noktası olduğu grafiklerden görülebilir.

Şekil 3-12 : XT kristal ile çalışan PIC16F877A.

En az güç tüketimi ise LP tipi kristallerde olmaktadır. Fakat düşük güç tüketimi sağlayan LP tipi kristaller en fazla 200 Khz frekansla çalışabilmektedir. Kullanım alanı genelde 32.768 Khz kristal ile birlikte gerçek zamanlı saat uygulaması geliştirmektir. 32.768 Khz kristal ile saat darbesinin periyodu;

T=1/F ------ T=1/32768=0,000030517578125 olur.

Her (256x256=)”65536” çevrim;

Page 10: 3 PIC16F877A’nın ÖZELLİKLERİ

34 PIC Programlama Bilgi ve Deney Kitabı

Zaman = Periyod x Çevrim

T= 0,000030517578125 x 65536

T= 2 Sn.

olacaktır. Böylece kritik zamanlama ve düşük güç gerektiren pilli saat gibi uygulamalar için ideal bir ortam oluşturulacaktır. Fakat bu kitapta sistem saati olarak 32.768 Khz kullanılarak uygulama geliştirilmesi üzerinde durulmamıştır. Bunun yerine mikrodenetleyiciye iki kristal bağlama yolu seçilmiştir. Bu uygulamalarda sistemin genel saati XT, HS iken, TMR1 zamanlayıcısını artıran saat darbesi 32.768 Khz kristalden gelir. Böylece hem sistem oldukça hızlı çalışır, hem de TMR1 zamanlayıcısından çok kesin zamanlama sağlanır. Fakat bu sistem sürekli çalıştığında pek enerji tasarrufu sağlandığı söylenemez.

Şekil 3-13 : LP kristal ile çalışan PIC16F877A.

Şekil 3.13’de görüldüğü gibi LP kristal ile çalışma sırasında çekilen akım µA mertebesine düşmektedir. Bu XT kristal ile çalışırken çekilen akımın onda birinden daha düşüktür.

Yukarıda bahsedilen tüm akım değerleri tüm çevresel arabirimler kapalı iken yapılan ölçümlerin sonucudur. Kullanacağınız çevresel arabirimler, pinlerden yapacağınız giriş ve çıkışlar, zamanlayıcılar gibi bir çok etken bu değerlerin artmasına sebep olacaktır. Bu sebeple pilli bir uygulama geliştirirken sadece yukarıdaki grafiklere bakarak hareket etmek yanıltıcı olabilir. Ama en azından şundan emin olabilirsiniz; hiçbir pini dışarıya akım vermeyen ve işlem yapmayan bir HS kristalli bir PIC, aynı durumdaki LP kristalli bir PIC’e göre bir pili 100-200 kat daha hızlı bitirir. Bununla birlikte 32.768 Khz kristalle bir işlem yapacağınız sürede 20 Mhz kristal ile 610 işlem yapabilirsiniz. Yani her zaman harcanan güç ve hız arasında bir seçim yapmanız gerekir. İleride uyuma fonksiyonuyla bu ikisi arasında bir ara nokta bulunmaya çalışılacaktır.

Şekil 3.14’de kristal ile çalışma durumunda bağlantının nasıl yapıldığı gösterilmiştir. Şekilde RF direnci ile gösterilen direnç kullandığımız (konfigürasyon sigortalarında belirlenmiş) kristal tipine göre değişik değerler almaktadır. Eğer konfigürasyon sigortalarında XT veya LP seçeneği işaretli bir mikrodenetleyiciyi 20 Mhz kristalle çalıştırmayı denersek başarılı olamayız. 32.768 Khz veya 200 Khz bir kristalin HS seçeneği seçili iken çalışması mümkündür. Fakat kristal aşırı doyacak, hem enerji tasarrufu mümkün olmayacak hem de kristal aşırı doymadan dolayı bir süre sonra bozulacaktır.

Şekil 3-14 : PIC16F877A’yı kristal ile çalıştırma.

Page 11: 3 PIC16F877A’nın ÖZELLİKLERİ

PIC 16F877A’nın Özellikleri 35

Kristalin çalışmasına etki eden önemli bir faktör daha vardır. Bu da C1 ve C2 kondansatörleridir. Belirli kristal değerleri için belirli kondansatörlerin seçilmesi gerekir. Tablo 3.2’de seçilmesi gereken kondansatör değerleri tablo halinde verilmiştir.

Tablo 3-2 : Kondansatör seçim tablosu.

Belirli bir aralık içerisinde seçilebilen kondansatör değerlerinde eğer yüksek tutarlılık isteniyorsa üst değere yakın kondansatör seçilmelidir. Fakat yüksek değerli bir kondansatör de mikrodenetleyiciye ilk enerji verildiğinde osilatörün düzenli çalışmaya başlaması için geçen süreyi uzatır. Bu sınırların dışında seçilen kondansatörler de aşırı doymaya sebep olur, osilatör çalışmayabilir, kristal bozulabilir.

Kristal yerine kullanılabilecek diğer bir eleman ise resonatördür. Resonatör tablo 3.2’deki kristal osilatör devresinin tümleşik yapıda olanıdır. Orta ucu devrenin negatif ucuna bağlanır diğer iki ucu da OSC1 ve OSC2’ye bağlanır. Kristal osilatöre göre daha ucuz bir çözüm oluşturmasına karşın % ±0.5 hata payı olması sebebiyle çok kritik zamanlama isteyen uygulamalarda kullanılamamaktadır.

Harici Osilatör (Dışarıdan Uygulanan Saat Darbesi İle Çalışma) PIC mikrodenetleyicilerin tümü dışarıdan aldıkları saat darbesini kullanarak çalışabilirler. Bu şekilde

çalışma durumunda yine çalışma frekansına göre LP, XT, R/C veya HS’den biri seçilmelidir. Tablo 3.3’de uygulanacak saat darbesinin frekansına göre hangi tür osilatörün seçileceği gösterilmiştir.

Maksimum Çalışma Frekansı Osilatör Tipi

32Khz LP 1Mhz XT – R/C 20Mhz HS

Tablo 3-3 : Dışardan uygulanan saat darbesi frekansına göre seçilecek osilatör.

Burada dikkat edilmesi gereken nokta, LP osilatör seçeneği seçildiğinde 200 Khz kristal ile çalışabilme mümkün olduğu halde, dışarıdan uygulanan sinyal ile maksimum değer 32 Khz olmasıdır. XT için de aynı durum geçerlidir. 4 Mhz kristal ile çalışabilen XT osilatör seçeneği, dışarıdan saat darbesi aldığında en fazla 1Mhz ile çalışabilmektedir. Şekil 3.15’de dışarıdan uygulanan saat darbesinin bağlama şekli gösterilmiştir.

Şekil 3-15 : Dışarıdan uygulanan saat darbesinin prensip şeması.

Page 12: 3 PIC16F877A’nın ÖZELLİKLERİ

36 PIC Programlama Bilgi ve Deney Kitabı

Direnç-Kondansatör (RC) Osilatör Zamanlamanın çok kritik önem taşımadığı durumlarda çok ucuz bir çözüm olan direnç/kondansatör

osilatör devresi kullanılabilir. Asenkron seri haberleşme, PWM gibi uygulamalarda kullanışlı değildir. Isıdan etkilenebilir, kullanılan R ve C’nin toleransı, OSC1 ucunun parazitik kapasitesi önem taşır.

Şekil 3-16 : Direnç-Kondansatör osilatör devresi.

Bu tip osilatörlerde Vdd gerilimiyle REXT direnci üzerinden şarj olan CEXT kondansatörü belli bir gerilime ulaştığında schmitt-trigger kapı açılır. Kapının açılmasıyla sisteme 5 V’luk saat darbesi uygulanır. Aynı zamanda MOSFET’in kapısına sinyal uygulanır. CEXT kondansatörü MOSFET’in üzerinden ani bir şekilde boşalır. Böylece şekil 3.17’de görülen testere dişi dalga elde edilir.

Şekil 3-17 : R/C osilatör dalga şekli.

Bu dalganın frekansı giriş gerilimine, R direncine ve C kapasitesine bağlı olarak hesaplanabilir. Kapasitenin dolma zamanı;

t = RC/2 Eğer 5 ns aşma da dikkate alınırsa toplam period;

T = RC/2 + 5 nS Burada T=1/f olduğu için;

F = 1/ (RC/2+ 5 nS)

olur. Eğer bu frekans hesabında devrenin yapısına göre 3-6 pF civarında bir değer alacak olan parazitik kapasiteyi de katarsak;

f = 1/(RC/2 + 5 nS) olur. Şimdi 20 K bir direnç ile 100 nF kondansatör kullanıldığını varsayalım. Çalışma frekansımız;

Page 13: 3 PIC16F877A’nın ÖZELLİKLERİ

PIC 16F877A’nın Özellikleri 37

f = 1/((100x10-12) x (20000/2+5nS)) = 1/(1x10-5+5x10-9) f = 999995 Hz.

olur. R direnci 100 KΩ’dan büyük olmamalıdır. Örneğin 1 MΩ’dan büyük direnç değerlerinde osilatör artık dış etkenlerden oldukça fazla etkilenecektir. Çalan bir cep telefonu, radyo vericisi gibi manyetik alan yayıcı cihazların dışında parmağınızı yaklaştırmanız bile mikrodenetleyicinin çalışma frekansı kararlılığını bozacaktır. 3KΩ’dan küçük direnç değerleri ise kararsız çalışmaya veya osilatörün durmasına yol açacaktır. Osilatörün sorunsuz çalışabilmesi için kullanılan kondansatörün de belirli bir aralıkta olması gerekmektedir. RC osilatör hiçbir C kondansatörü bağlanmadan çalışabiliyor olsa bile datasheet’lerde 22 pF’dan küçük kondansatör değerlerinin seçilmesinin uygun olmadığı belirtilmiştir. 22 pF’ın altındaki kapasite değerleri çok küçük olduğu için mikrodenetleyicinin üzerinde çalıştığı PCB veya breadboard’ın kendi yapısından kaynaklanan kapasitesi 2-3 pF bile olsa önem kazanır. Bunun dışında parazitler de çalışma frekansına etki yapmaya başlar.

SIFIRLAMA (RESET) DEVRESİ İngilizcesi “reset” olan “sıfırlama” dediğimiz işlem, Türkçe’ye tam olarak “tekrar başa dönüp kurma”

şeklinde çevrilebilmektedir. Fakat her nasıl çevirirsek çevirelim bu kelime PIC mikrodenetleyicilerde yapılan “sıfırlamanın” tam karşılığı olmayacaktır. Çünkü PIC mikrodenetleyicilerde sıfırlama her şeyi başa döndürme anlamına gelmez. Sıfırlama işleminden sonra bazı kaydediciler eski durumlarında kalacak, bazılarının içeriği sıfırlanacak, geri kalanlarının içeriği ise rasgele bir değer alacaktır. Sıfırlamanın bir çok yolu vardır ve bu yolların her birinde kaydedicilerin durumları birbirinden farklı olacaktır. Bu sebeple mikrodenetleyici kaydedicilerinin farklı sıfırlanma durumlarında alacakları değerler veri sayfalarında (datasheet) tek tek listelenmiştir.

Sıfırlanma işlemi sırasında en kesin şekilde sıfırlanacağını bildiğimiz kaydedici, program sayacıdır. Program nerede olursa olsun, hangi sıfırlama kaynağından istek gelirse gelsin, sıfırlama işleminde program sayacı sıfırlanır. Program başlangıçtan tekrar çalışmaya başlar. Buna ihtiyaç duymamızın sebebi PIC’in çalışması sırasında bir şeylerin yanlış gitmesi durumunda, örneğin program kontrolden çıkarsa, tekrar düzenli bir çalışma sağlamaktır.

Aşağıdaki durumlarda sıfırlama gerçekleşir:

a) PIC’e elektrik verildiği anda sıfırlama (POR, Power On Reset).

b) Normal çalışma sırasında MCLR girişi ile uygulanan sıfırlama.

c) Uyuma durumunda iken uygulanan sıfırlama.

d) Normal çalışma sırasında WDT ile uygulanan sıfırlama.

e) Uyuma sırasında WDT ile uygulanan sıfırlama.

f) Gerilimin düşmesi durumunda uygulanan sıfırlama (BOR).

Bu sıfırlama yöntemlerinden en çok kullanacaklarınız a ve b şıkları olacaktır. Diğer tüm sıfırlama durumları bu iki sıfırlamadan türetilmiştir. Uyuma ve WDT ile ilgili sıfırlama durumları bu konular işlenirken anlatılacaktır.

MCLR ile Sıfırlama MCLR girişi ile uygulanan sıfırlama, program geliştirirken en çok kullanacağınız sıfırlama

yöntemidir. MCLR girişine 5 V uygulandığı sürece program normal akışına devam eder. MCLR’ye 0 V uygulandığı anda sıfırlama gerçekleşir. MCLR girişinde bulunan bir filtreleme ile parazit gerilimlerin programı sıfırlanması engellenmiştir. Fakat buna rağmen girişin bir kondansatör ile daha kararlı bir hale getirilmesi parazitlerin yoğun olduğu durumlarda gerekir (Ör: Güç kaynakları içerisinde kullanıldıklarında). Aşağıda MCLR girişine uygulamanız gereken devre gösterilmiştir.

Page 14: 3 PIC16F877A’nın ÖZELLİKLERİ

38 PIC Programlama Bilgi ve Deney Kitabı

Şekil 3-18 : MCLR sıfırlama devresi.

R1 direnci ve SW1 anahtarı ile tuşa basıldığında sıfırlama yapan bir anahtar elde edilmiştir. C1 kondansatörünün görevi ise parazitlerle oluşacak sıfırlamalara karşı PIC’i korumaktır. R2 direnci ise C1 kapasitesinin ani fazla dolması veya elektrostatik boşalma (ör: elimizde biriken yükün devreye temas etmemizle MCLR ucuna uygulanması) ile MCLR ucunda oluşturacağı yüksek gerilime karşı girişi koruma görevini üstlenmiştir. Microchip R1 direncinin 40 KΩ’dan küçük olmasını, R2’nin ise 1KΩ’ dan büyük olmasını önerir. C1 kapasitesi için ise en uygun değer 100 nF’dır. Kapasitenin girişle arasındaki hattın uzunluğu önem taşır. Girişten uzaklaştıkça kapasitenin parazitik etkileri söndürme kapasitesi düşer.

Enerji Verildiği Anda Sıfırlama (POR) PIC VDD gerilimi 1.2 V - 1.7 V arasında gerilim yükselmesi algıladığında kaydedicileri kullanıma

hazır hale getirmek için kendi kendisine sıfırlama yapar. Birazdan anlatılacak olan bir çok değişik sıfırlama devresi POR kullanarak sıfırlama yapmaktadır. Bu sebeple veri sayfalarında sadece kaydedicilerin her birinin sadece POR sıfırlaması ve MCLR sıfırlaması için alacağı değerler gösterilir. Şimdi bu özel durumlarda oluşan sıfırlamaları inceleyelim:

PWRT (Güç Zamanlayıcısı): Eğer PIC programlanırken IC-Prog seçeneklerinden PWRT seçilirse PIC, gerilim uygulandıktan sonra yaklaşık 72 ms sıfırlama devresini açık tutar. Böylece gerilim uygun bir seviyeye gelene kadar programın çalışmaya başlamasını engeller. Bu durum aynı zamanda, ilk anda oluşabilecek geçici durumlara karşı programın daha kararlı çalışmasına yardımcı olur.

OST (Osilatör Başlama Zamanlayıcısı): POR veya PWRT durumundan sonra program çalışmaya başlamadan önce mutlaka 1024 çevrim beklemesi gerekmektedir. Bunun amacı osilatörün kararlı duruma geçmesi için PIC’i reset durumunda bekletmektir. XT, LP ve HS osilatör seçenekleri için geçerlidir.

BOR (Gerilim Düşmesi Sıfırlaması): Ani gerilim düşmelerinde kaydedicilerin içerikleri, program sayacının değeri hatalı değerler alabilir. Bu gibi durumlarda programın kontrolden çıkmaması için sıfırlanması en iyi çözümdür. Eğer programlamadan önce BOR etkin hale getirilirse gerilim 1.2 V - 1.7 V seviyesine düştüğü anda sıfırlama uygulanır. Bu sıfırlama işleminin etkisi POR’un aynısıdır. Hem BOR, hem PWRT etkin ise, BOR için sıfırlama uygulandıktan sonra 72ms program çalışmaya başlamaz. Daha sonra PWRT devreden çıkar, program 0.satırdan tekrar çalışmaya başlar.

Eğer bu seçeneklerin hepsi aktif olarak PIC programlanırsa çalışması şöyle gerçekleşir; güç verildiği anda sıfırlama (POR) gerçekleştikten sonra 72 ms PWRT etkin durumda olacaktır. Bu sıfırlamanın 72 ms daha devam etmesi anlamına gelir. OST’de aktif olduğu için 1024 program çevrimi süresi daha PIC sıfırlama durumda kalır. Bu süre bittikten sonra program sıfırlama sona erer PIC içerisine yüklü program çalışmaya başlar.

Eğer BOR aktif durumda iken gerilim belirli bir düzeyin altına düşerse PIC yine sıfırlama sinyali alır. Bu sırada PWRT aktif değil ise aniden sıfırlanır. PWRT aktif ise PWRT zamanlayıcısı sıfırlamanın bitmesini 72 ms geciktirir. 1024 komut çevrimi osilatörün düzenli çalışmaya başlaması için bekleme süresidir (OST). Bu aşamadan sonra PIC’e yeni enerji verilmiş gibi program 0x000 adresinden akışına başlar.

Time-out Sequence: Devreye güç uygulandığında, time-out sıralı işlemler gerçekleşir. POR reset işlemi gerçekleştikten sonra PWRT eğer etkinleştirilmişse 72 ms gecikme sağlar. PWRT gecikmesi sona

R1

Page 15: 3 PIC16F877A’nın ÖZELLİKLERİ

PIC 16F877A’nın Özellikleri 39 erdiğinde 1024 çevrimlik OST gecikmesi gerçekleşir. Daha sonra ise sistem reset durumundan kurtularak çalışmaya başlar. Bu durum aşağıdaki tabloda görülmektedir.

Tablo 3-4 : Time-Out sıralı gerçekleşen işlemler.

Şimdi BOR reset durumunu bir zaman-gerilim eğrisiyle inceleyelim:

Şekil 3-19 : Besleme geriliminin 100 S’den fazla 4 V’un altına düşmesi ve BOR reset durumunu gösteren zaman - gerilim eğrisi.

Şekil 3.19’da VDD gerilimi TBOR=100 S den daha uzun süre VBOR=4 V gerilimin altına düşmektedir.

Reset durumu oluştuğu anda PWRT sayıcısı çalışarak PIC’i 72 mS süreyle reset durumunda tutmaktadır.

Şekil 3-20 : BOR reset durumunda 73 mS’lik süre bitmeden gerilimin tekrar 4 V’un altına düşmesi

durumu.

Şekil 3.20’de gerilim ilk VBOR gerilimin altına düşmesiyle PWRT çalışmaya başlar. Ancak 72 mS’lik süre bitmeden tekrar VBOR altına düşmektedir. Bu durumda PWRT tekrar çalışmaya başlar ve PIC’in resette kalma süresi daha da uzar. Sürenin bu şekilde uzatılması genellikle ani gerilim düşümleri yaşanan uygulama devreleri için çok uygundur. Örneğin bir bilgisayar yazıcısının motorunu çalıştıran PIC uygulamasını düşünelim. Kısa süreli gerilim dalgalanmalarında motorun çalışmaya başlayıp durması ve tekrar çalışıp durması daha büyük donanımsal arızalara neden olabilir.

PROGRAM DOĞRULAMA VE KOD KORUMA Kod koruma bit ya da bit’leri programlandığında programın yetkisiz kişilerce (programlayan kişide

dahil) mikrodenetleyici içerisinden okunmasını engeller. Koruma işlemi yapıldığında programın bir daha okunması mümkün olmaz. Ancak bu işlemcinin yeniden programlanmasına engel değildir. Kod koruma konmadığında ise program mikrodenetleyici içerisinden okunarak kontrol ve doğrulama işlemi yapılabilir.

DEVRE ÜZERİNDE PROGRAMLAMA (ICSP) PIC16F87X mikrodenetleyiciler uygulama devresi üzerinde iken seri olarak

programlanabilmektedirler. Bu işlem iki adet clock ve data hattı, üç adet de + besleme, toprak hattı ve programlama voltajı hattı olmak üzere toplam 5 giriş ile gerçekleşir. Devre üzerinde programlama özelliği kart üzerinde bulunan mikrodenetleyicilerin yazılım güncelleştirmelerinin kolayca yapılabilmesini sağlamaktadır. Günümüzde üretilen elektronik cihazların yazılım güncellemelerine internet üzerinde ulaşmak ve devre üzerinde güncellemeyi gerçekleştirmek oldukça önemlidir. ICSP (In-Circuit Serial Programming) kullanılacağı zaman besleme voltajının 4.5 V ile 5.5 V arasında olması gerekmektedir. Programlamanın her adımında entegre – kodun programlanması, code protect, user ID ve diğer konfigürasyon bit’lerinin yazılması gibi – normal işletim voltajında programlanmalıdır.

Page 16: 3 PIC16F877A’nın ÖZELLİKLERİ

40 PIC Programlama Bilgi ve Deney Kitabı

DÜŞÜK GERİLİMLE PROGRAMLAMA (LVP) LVP konfigürasyon bit’i etkinleştirilerek düşük voltaj ICSP programlama modu seçilebilir. Bu mod

mikrodenetleyicinin ICSP aracılığı çalışma voltaj sınırları içerisinde VDD voltajı ile programlanabilmesine olanak sağlar. VPP programlama voltajı normal besleme sınırları içerisinde kalmalı fakat karakteristik bilgilerinde yer alan Vıhh voltajına ulaşmamalıdır. Bu mod da RB3/PGM pini normal giriş/çıkış işlevinden ayrılarak programlama fonksiyonuna anahtarlanır. Programlama sırasında MCLR pinine VDD (5 V) voltajı uygulanır. Programlama moduna giriş için RB3/PGM pinine VDD uygulanır. LVP bit’inin varsayılan fabrika çıkış durumu settir. Eğer LVP kullanılmayacak ise LVP konfigürasyon bit’i sıfır olarak programlanmalıdır. Bu durumda RB3/PGM pini dijital giriş/çıkış olarak işlev görür. Bununla birlikte LVP bit’i MCLR pinine yüksek programlama voltajı verilerek konfigürasyon yeniden düzenlenerek set edilebilir. Mikrodenetleyici bu durumda yalnızca yüksek programlama voltajı (13 V) ile programlanabilir.

DEVRE ÜZERİNDE HATA AYIKLAMA (ICD) Devre üzerinde hata ayıklama fonksiyonu programın çalışması sırasında işlemci içerisinde

kaydedicilerin aldığı değerlerin izlenmesinde ve varsa program hatalarının tespitinde kullanılan bir fonksiyondur. Bu fonksiyonun kullanımı ek donanım gerektirmektedir. Ayrıca DEBUG (hata ayıklama) bit’i konfigürasyon bilgisinde sıfır “0” olarak programlanırsa ICD (In Circuit Debugger) fonksiyonu aktif hale getirilmesi gerekmektedir. Bu fonksiyon MPLAB® ICD kullanıldığında devre üzerinde sistem çalışırken basit hata ayıklama fonksiyonlarına izin verir. Bu fonksiyon kullanıldığında mikrodenetleyicinin bazı kaynakları genel kullanıma kapatılır. Hata ayıklayıcının kullandığı kaynaklar aşağıdadır.

I/O pinleri RB6, RB7 Stack 1 seviye Program belleği 0000h- 0100h

Veri belleği 0x070 (0x0F0, 0x170, 0x1F0) 0x1EB - 0x1EF

Tablo 3-5 : Hata ayıklamada kullanılan kaynaklar.

In-Circuit Debugger fonksiyonu kullanılırken devrede ICSP konnektörü bulunmalıdır. Konnektöre bağlanacak arabirim Microchip üretici firmadan temin edilebilir.

PCON (POWER CONTROL) DURUM KAYDEDİCİSİ Bir PIC’in çalışması esnasında oluşabilecek resetlemeleri birbirinden ayırabilmek amacıyla

kullanılan özel amaçlı bir kaydedicidir. PIC’te hangi resetleme olduysa kaydedici içerisindeki güç kontrol bayrak bit’i aşağıda açıklandığı şekilde değişerek kullanıcıya bildirir.

PCON Kaydedicisi (Güç Kontrol Kaydedicisi – Adres 8Eh)

U-0 U-0 U-0 U-0 U-0 U-0 R/W-0 R/W-1

- - - - - - POR’ BOR’ Bit 7 Bit 0

Bit 7-2 Kullanılamaz : “0” olarak okunur.

Bit 1 POR’ :

İlk güç verme (POR- Power On Reset) reetleme durum bit’i 1 = İlk güç vermeden kaynaklanan reset olmadı. 0 = İlk güç vermeden kaynaklanan reset oluştu.(POR reseti oluştuktan sonra yazılımsal olarak tekrar “1” yapılmalıdır.)

Bit 0 BOR’ :

Gerilim düşmesi (BOR – Brown Out Detect) resetleme durum bit’i 1 = BOR resetlemesi olmadı. 0 = BOR resetlemesi oluştu. (BOR reseti oluştuktan sonra yazılımsal olarak tekrar “1” yapılmalıdır.)

R : İlgili bit’in yalnızca okunabileceğini gösterir. W : İlgili bit’in yazılabilir bit olduğunu gösterir. U : Kullanılmayan bit’i gösterir.

Tablo 3-6 : PCON (Güç Kontrolü) kaydedicisi ve bit işlevleri.

Page 17: 3 PIC16F877A’nın ÖZELLİKLERİ

PIC 16F877A’nın Özellikleri 41

Güç kontrol ve durum bit’lerinin hangi resetlemede hangi değeri alacağı tablo 3.7’de gösterilmiştir.

U:değişmez, x:bilinmeyen, -:tanımlanmamış bit, “0” okunur.

Tablo 3-7 : Farklı resetleme durumlarında PCON ve STATUS kaydedici bit’lerinin alacağı değerler.

KİMLİK BİLGİSİ KONUMU (ID LOCATIONS) 2000h – 2003h bellek alanına ürün kodu, kontrol değeri ya da programlayanın isteğine bağlı olarak

bir değer yazılabilir. Bu bellek alanlarına normal yollar ile ulaşılamaz. Ancak programlama devresi ile okunabilir.

DÜŞÜK GÜÇ (SLEEP) MODU PIC16F877A uyuma durumuna sokulduğunda en düşük güç tüketimi sağlanır. Düşük güç tüketimi

gerektiren pilli uygulamalarda bu özellik kullanılmalıdır. Uyuma durumu enerji tüketimini düşürür fakat en yüksek enerji tasarrufunu sağlamak için mikrodenetleyicinin kullanılmayan uçları 5 V veya GND’den birine bağlanmalıdır. Giriş olarak belirlenen bir port girişin “0” ile “1” arasındaki değişimleri arasında anahtarlama akımı yüzünden güç harcayacaktır. Uyku durumunda mikrodenetleyici bu değişimlere algılayamadığı için (kesme durumu yaratan etkiler dışında) portların giriş olarak kalması zaten anlamlı değildir. Portlar çıkış yapılarak enerji tasarrufu sağlanır. Bu sebeple giriş olarak kullanılan portlar çıkış olarak değiştirilerek “1” veya “0” uygulanmalıdır.

Mikrodenetleyiciyi uyku durumuna sokmak için assembler kodunun içerisine uykuya girmesi istenilen satırda sleep komutu yazılmalıdır. Sleep komutu yazıldığı satırda programın çalışması durur. Güç tüketimi azalır. Mikrodenetleyiciyi bu durumdan kurtarıp tekrar çalışmaya başlatacak 3 farklı işaret kaynağı vardır:

1. MCLR ile sıfırlama yapılması durumunda, 2. WDT sayıcısı taştığında (Zamanlayıcılar ve Sayıcılar konusuna bkz.), 3. RB0/INT kesmesi, RB<4:7> değişiklik kesmesiyle ve çevresel kesmelerle, mikrodenetleyici

uykudan uyanır. Bu çevresel kesmeler:

1. Paralel port ile veri okuma veya yazma kesmesi, 2. TMR1 asenkron sayıcı olarak çalışırken TMR1 kesmesi, 3. CCP modülü yakalama modu kesmesi, 4. TMR1 asenkron sayıcı olarak dışarıdan uygulanan darbeleri sayma kesmesinde, 5. Seri haberleşme modülü başla veya bitir işareti kesmesi, 6. Seri haberleşme sırasında slave modunda gönder veya al haberi kesmesi, 7. USART modülü, RX veya TX işareti algılanma kesmesi 8. A/D çevirici için saat darbesi olarak kendi iç RC osilatörü kullanılırsa A/D çevirici kesmesi, 9. EEPROM’a yazma işlemi tamamlanma kesmesi, 10. Karşılaştırıcı çıkış durumları değişme kesmesidir.

Yukarıda sayılan kesmelerde hiçbir kesmenin sayaçlarla veya saat darbesiyle ilgili olmadığı dikkatinizi çekmiştir. Uyku sırasında enerji tasarrufu tüm osilatörlerin durdurulması ile sağlanır. TMR0, TMR2 sayaçlarına mikrodenetleyicinin kendi iç saat darbesi devresi sinyal sağlar ve bu saat uyku modunda kapatılır. Programlarınızı yazarken bu noktaya dikkat ederseniz mikrodenetleyiciyi uykudan uyandıramama sorununu yaşamazsınız. Uyku sırasında tüm genel amaçlı ve özel amaçlı kaydediciler uykudan önceki değerlerini korurlar.

Uykudan uyanma sırasında ilginç bir durum ile karşılaşılır. Mikrodenetleyici mimarisini anlatırken “Pipelining” özelliği sayesinde bir komut işletilirken diğerinin okunduğundan bahsetmiştik. Sleep komutu işletildiği anda “pipeline” içerisinde okunma durumunda kalan sleep komutundan bir sonraki komut call

Page 18: 3 PIC16F877A’nın ÖZELLİKLERİ

42 PIC Programlama Bilgi ve Deney Kitabı

veya goto işleminde olduğu gibi boşa gitmez. Bu komut, sleep komutunun işlenmesi esnasında komut çözümleme birimi içerisinde saklanır. Bir işaret uygulanarak mikrodenetleyici uyandırıldığında ilk önce halihazırda okunmuş olan bu komut işletilir. Eğer sleep modundan çıkıldığı anda herhangi bir komut çalıştırılmak istenmiyorsa, sleep komutundan hemen sonra bir NOP komutu yazılmalıdır.

Bu özellik uyku durumunu daha avantajlı hale getirmek için kullanılabilir. Eğer uykuya girmeden önce enerji tüketimini azaltmak için gerekli değişikler yapılır ve üzerinde değişiklik yapılan özel amaçlı kaydediciler, genel amaçlı kaydedicilerin içerisine kayıt edilirse, uykudan uyanıldığı anda call komutu ile bir alt programa gidilerek kayıt edilen değerler tekrar özel amaçlı kaydedicilerin içerisine kayıt edilirler, böylece; hem enerji tasarrufu sağlanmış, hem de ayarlar bozulmamış olur.

I/O (GİRİŞ/ÇIKIŞ) PORT’LARI Bu port’lardan girilen dijital sinyaller vasıtasıyla PIC içerisinde çalışan programa veri girilmiş olur.

Program verileri değerlendirerek port’ları kullanmak suretiyle dış ortama dijital sinyaller gönderir. Dijital sinyallerin gerilim değeri ya 5V ya da 0V’tur. PIC 16F877A’nın dış ortama verilebileceği maksimum akım 25 mA dir. Bazı PIC’ler de (örneğin PIC16F84) bu akım 20 mA olabilir. Dış ortamdan PIC16F877A’ya doğru akabilecek maksimum akım da 25 mA dir. 25 mA lik akım motor, güçlü lamba gibi fazla akım çekmesi gereken alıcıları çalıştırmak için yeterli değildir. Ancak aşağıda sıralanan bazı alıcıları direk olarak çalıştırmak mümkündür.

1. LED : Tam parlaklık verebilmesi için 25 mA lik akım yeterlidir. 2. BUZZER : Çok küçük akım çektikleri için direk olarak sürülebilir. 3. RÖLE : Düşük akımla çalışan bazı röleler. 5V’ta 25 mA bobin akımı yeterli olanlar. 4. LCD display : Hiçbir yükseltme devresi gerektirmeden sürülebilirler. 5. 7 SEGMENT Display : Her segment’e bir port ucu bağlanarak sürülür.

Dış ortama gönderilen bu sinyallerin akımı yeterli olmadığı durumda yükselteç devreleri, transistörler vasıtasıyla yükseltilerek kumanda edilecek cihaza uygulanır.

Hatırlatma amacıyla sink ve source akımlarının ne olduğundan bahsedelim. Sink akımı, gerilim kaynağından çıkış port’una doğru akan akıma, source akımı ise I/O pin’inden GND’ye doğru akan akıma denir.

Şekil 3–21 : Sink ve source akımları.

Mikrodenetleyici uygulamalarında yazılım kadar önem taşıyan bir nokta da donanımın doğru bir şekilde hazırlanmasıdır. Bir programınızda hatayla karşılaştığınızda, sizi en çok meşgul edecek konulardan biri de hatanın donanımdan mı? yazılımdan mı? olduğunu bulmak olacaktır. Bozuk veya yanlış seçilmiş kondansatör değerli bir osilatör, sürme akımı yetmeyen bir röle saatlerce kaynak kodunuzla boğuşmanıza sebep olabilir. Bu sebeple donanımı iyi tanımanız gerekmektedir. Bu bölümde PIC16F877A portlarını ve bu portların elektriksel özelliklerini tanıyacağız.

PORTA PORTA 6 bit’lik hem giriş hem çıkış özelliğine sahip bir porttur. Hangi bit’in giriş hangi bit’in çıkış

olacağı TRISA kaydedicisi tarafından belirlenir. TRISA kaydedicisinde “1” olarak belirlenen bit’lerin karşılığındaki PORTA pinleri giriş, “0” olarak belirlenen bit’lerin karşılığındaki PORTA bit’leri çıkış olarak belirlenir. PORTA tamponlanmıştır, yani bir veri gönderilene kadar eski veri PORTA kaydedicisinde tutulur.

Birkaç amaç için kullanılan mikrodenetleyici portlarının tümünde hangi amaç için kullanılacaksa pini oraya yönlendiren multiplexer (seçici) bulunmaktadır. RA4 pini TMR0 sayacına giriş olabilecek şekilde seçilebilmektedir. Bu porttan diğerlerinden farklı olarak analog giriş yapılmamaktadır. Ayrıca open-drain

Page 19: 3 PIC16F877A’nın ÖZELLİKLERİ

PIC 16F877A’nın Özellikleri 43 adı verilen bir yapıya sahip olmasından dolayı dışarıya akım verememektedir. Şekil 3.22’den de görüleceği gibi diğer pinlerde çıkış “1” ise yukarıdaki kapı iletime alttaki kapı kesime gider ve dışarıya VDD gerilimi uygulanır. RA4 pinini çıkış olarak kullanabilmemiz için 5-10 K arasında bir direnç ile 5 V’a pull-up (5 V’a çekme) yapılmalıdır.

Şekil 3-22 : RA4 ve diğer pinlerin girişlerinin karşılaştırılması.

PORTA’da bulunan analog multiplexer (seçici) A/D çevrim yapılacak pinleri seçer. Ayrıca analog dijital çevrim sırasında referans alınacak gerilimler de RA2, RA3 pinlerinden girilebilmektedir.

PIC16F877A’nın diğer bir özelliği de comparator (karşılaştırıcı)’ya sahip olmasıdır. Bu sayede sadece gerilimin belli bir seviyenin altında kalmasını veya üstünde kalmasını istediğimiz durumlarda, analog dijital çeviriciye oranla çok daha hızlı çalışan karşılaştırıcı daha etkili bir çözüm sunar.

Mikrodenetleyiciye gerilim uygulanıp çalışmaya başlattığımızda yani POR (Power-On-Reset) durumunda PORTA analog giriş olarak kuruludur, okunmak istendiğinde “0” değerini verir. Dijital giriş olarak kullanılmak istendiğinde ADCON1 kaydedicisinde gerekli değişikliğin yapılması gerekir. Bu konu A/D Çevrim konusunda detaylarıyla işlenecektir fakat bu konuya gelmeden önce yapacağımız uygulamalarda PORTA’yı dijital giriş olarak kullanmak için aşağıdaki satırları programımızın başına eklememiz gerekmektedir. Örnek 3.1 : PORTA’yı Dijital Giriş Olarak Kurmak.

bsf STATUS, RP0 ; ADCON1 1.bankda olduğu için bank1’e ; geçmemiz gerekmektedir. movlw 0x06 ; PORTA’nın dijital olması için içine 0x06 movwf ADCON1 ; yüklüyoruz. movlw 0xCF ; PORTA register’ının tüm pinlerini movwf TRISA ; giriş olarak tanımlıyoruz. bcf STATUS, RP0 ; Tekrar 0.bank’a geçiyoruz.

Analog giriş durumunda bile TRISA kaydedicisi PORTA’nın giriş mi çıkış mı olacağını belirler. Analog giriş yapılacağı pinin mutlaka TRISA kaydedicisiden giriş olarak seçildiğinden emin olmak gereklidir.

PORTA çıkış olarak seçildiğinde dışarıya 20 mA akım verebilmekte (source) veya 25mA akımın içeriye akmasına (sink) olanak sağlamaktadır. Giriş durumunda schmitt-trigger olan RA4 dışındaki TTL girişlerde 0.8V - 2V arasında olan bölge kararsızdır. Yani 0.8V - 0V arasının mikrodenetleyici tarafından “0” olarak okunacağı garanti edilmiştir. 2V-5V arasındaki değerlerde “1” olarak okunacaktır. 0.8V - 2V arasında ise herhangi bir değerde “0” dan “1” e geçiş olabilir. TTL’e göre çok daha hızlı ve kararlı olan schmitt-trigger yapıdaki RA4’de ise kararsız durum söz konusu değildir. RA4, 1V’dan düşük gerilimleri “0”, 1V’dan yüksek gerilimleri de “1” kabul eder. PORTA’nın pinleri giriş olarak yönlendirildiğinde her bir pin 1µA akım çekerken, RA4 5µA akım çeker. Bu değerler ilk planda dikkate almaya değer gelmese de, pil ile çalışan uygulamalar geliştirmek istediğinizde µA’lerin bile ne kadar önem kazandığını göreceksiniz. NOT: Yukarıdaki değerler giriş geriliminin tam 5V olması durumda geçerlidir. Giriş geriliminin daha düşük olduğu durumlarda bu gerilim seviyeleri değişecektir. Schmitt trigger yapı ile TTL (Transistor-Transistor-Logic) yapı arasındaki farklar şunlardır:

1. ST yapılı uçlarda “0” dan “1” e veya “1” den “0” a geçiş süresi daha kısadır. Bu nedenle daha yüksek frekanslı veri girişi/çıkışı yapılmasına uygundur.

Page 20: 3 PIC16F877A’nın ÖZELLİKLERİ

44 PIC Programlama Bilgi ve Deney Kitabı

2. ST yapılı uçlarda “0” ve “1” i belirleyen gerilim aralıkları birbirinde uzaktır. Bir uçtan girilen 0 - 1V arasındaki gerilimler “0” V, 4 - 5.5 V arasındaki gerilimler “1” olarak algılanır.

3. TTL yapılı uçlarda “0” dan “1” e veya “1” den “0” a geçiş süresi daha uzundur.

4. TTL yapılı uçlarda “0” ve “1” i belirleyen gerilim aralıkları birbirine daha yakındır. Bir uçtan girilen 0 - 2V arasındaki gerilimler “0” , 2 - 5.5 V arasındaki gerilimler “1” olarak algılanır.

Pin no Pin adı Buffer tipi Açıklama

2 RA0 / AN0 TTL Dijital I/O port’u veya analog giriş 3 RA1 / AN1 TTL Dijital I/O port’u veya analog giriş 4 RA2 / AN2 / VREF- / CVREF TTL Dijital I/O port’u veya analog giriş veya VREF- veya /CVREF+ 5 RA3 / AN3 / VREF+ TTL Dijital I/O port’u veya analog giriş veya VREF+ 6 RA4 / T0CKI / C1OUT ST Dijital I/O port’u veya TMR0 harici clock girişi veya karşılaştırıcı-1

çıkışı 7 RA5 / AN4 / SS / C2OUT TTL Dijital I/O port’u veya Senkron seri iletişim Slave seçme girişi veya

karşılaştırıcı-2 çıkışı Tablo 3-8 : PIC16F877A’nın A portunun pinleri ve işlevleri.

PORTB PORTB hem giriş hem çıkış özelliğine sahip 8 bit’lik bir porttur. RB3/PGM, RB6/PGC ve RB7/PGD

pinleri programlayıcı veya devre üzerinde hata ayıklayıcı (In Circuit Debugger) uçları olarak da seçilebilmektedir.

PORTB’nin en göze çarpan özelliği RB0 kesme girişi ve RB4-RB7 arasında pinlerin değişikliğinde oluşan kesme durumudur. RB0 kesme girişi olarak kurulduğunda isteğe göre, yükselen kenarda veya düşen kenarda bir kesme üretebilmektedir. RB4-RB7 arasındaki pinlerden girilen değerlerden biri değiştiğinde de kesme oluşabilmektedir.

Diğer bir özelliği ise giriş sırasında seçeneğe bağlı olarak entegre içerisinden pull-up direnci kullanılabilmesidir. Böylece pinin ucu açıkta olduğu durumda giriş “1” olacaktır. Şekil 3.23’den de görüldüğü gibi iç pull-up direnci sayesinde tuşa basılmadığı zaman girişin “1” olması sağlanmış, dışarıdan direnç bağlamaya gerek kalmamıştır. PORTB çıkış olarak yönlendirildiğinde bu dirençler kendiliğinden iptal olur. Bu özellikleriyle PORTB’nin tuş girişi için uygun olduğunu söyleyebiliriz.

Şekil 3-23 : PORTB’nin yapısı ve zayıf pull-up direnci.

B port’unun çıkışında FET kullanılmayıp normal dijital kapı devreleriyle sürülmüştür. Bu nedenle PORTB dijital giriş/çıkış port’u olarak kullanıldığında TTL yapıya sahip olmasıyla PORTA’dan farklıdır. PORTB’nin tüm çıkışları bir FET ile pull-up yapılmıştır. Pull-up, giriş ucunu Vdd potansiyeline çekmek demektir. Normal olarak bir giriş ucunu Vdd seviyesine çekmek için bir direnç kullanılır. Aynı görevi PIC16F877A içerisinde port uçlarına bağlı bir FET yapmaktadır. FET iletimde değilken yüksek drain-source direnci vasıtasıyla port uçlarını zayıf pull-up (week pull-up) yapmaktadır.

RB I/O ucu

TLL giriş tamponu

Vdd P-kanal

Zayıf pull-up direnci

Page 21: 3 PIC16F877A’nın ÖZELLİKLERİ

PIC 16F877A’nın Özellikleri 45

PORTB uçları programlama ve hata ayıklama dışındaki amaçlarda kullanıldıkları sürece PORTA’da olduğu gibi TTL gerilim seviyelerinde çalışır. Giriş olduğunda çektiği akım, çıkış olduğunda verebileceği akım PORTA ile aynıdır.

Pin no Pin adı Buffer

tipi Açıklama

33 RB0 / INT TTL/ST(1) Dijital I/O port’u veya harici kesme girişi. Yazılımla zayıf pull-up yapılabilir. 34 RB1 TTL Dijital I/O port’u. Yazılımla zayıf pull-up yapılabilir. 35 RB2 TTL Dijital I/O port’u. Yazılımla zayıf pull-up yapılabilir. 36 RB3 / PGM(3) TTL Dijital I/O port’u veya LVP modunda (düşük gerilimle programlama) programlama girişi.

Yazılımla zayıf pull-up yapılabilir.

37 RB4 TTL Dijital I/O port’u. Pin’deki seviye değişikliğinde kesme oluşturur. Yazılımla zayıf pull-up yapılabilir.

37 RB5 TTL Dijital I/O port’u . Pin’deki seviye değişikliğinde kesme oluşturur. Yazılımla zayıf pull-up yapılabilir.

39 RB6 / PGC TTL/ST(2) Dijital I/O port’u. Pin’deki seviye değişikliğinde kesme oluşturur. Yazılımla zayıf pull-up yapılabilir. Seri programlama clock pini. In-Circuit-Debugger pini.

40 RB7 / PGD TTL/ST(2) Dijital I/O port’u. Pin’deki seviye değişikliğinde kesme oluşturur. Yazılımla zayıf pull-up yapılabilir. Seri programlama data pini. In-Circuit-Debugger pini.

Not: 1: Harici kesme girişi olarak kurulduğunda Schmitt Trigger tamponlu giriştir. 2: Seri programlama ve In-Circuit-Debugger olarak kurulduğunda Schmitt Trigger tamponlu giriştir. 3: Düşük gerilimle programlamada (LVP) RB3 pininin dijital I/O fonksiyonu otomatik olarak iptal edilir.

Tablo 3-9 : PIC16F877A’nın B portunun pinleri ve işlevleri.

PORTC PORTC, PIC16F877A’nın en çok özelliğe sahip olan portudur. Tüm girişler schmitt-trigger tampona

sahiptir. Bunun sebebi tüm pinlerin değişik seri haberleşme fonksiyonlarına sahip olmasıdır. Seri haberleşme eğer TTL devrelerle yapılırsa kararsız bölge oldukça geniş bir bölgeyi işgal ettiği için yanlış veri aktarımı daha olasıdır.

Mikrodenetleyicinin PORTC çevresel birim özelliklerini kullanırken en çok dikkat etmeniz gereken noktalardan biri de TRISC kaydedicisinde doğru değişiklikleri yapmış olmaktır. Bu özelliklerin her birini kullanabilmek için TRISC kaydedicisinde farklı ayarlar yapmak gerekmektedir. Bunların bir çoğu çevresel özellik açıldığında kendiliğinden yapılsa bile bizim sonradan TRISC üzerinde yapacağımız yanlış bir değişiklik karışıklığa yol açabilir. Pin no Pin adı Buffer tipi Açıklama 15 RC0 / T1OSO / T1CKI ST Dijital I/O port’u veya TMR1 osilatör çıkışı / TMR1 clock girişi. 16 RC1 / T1OSI / CCP2 ST Dijital I/O port’u veya TMR1 osilatör girişi veya capture-2 girişi / compare-2 çıkışı /

PWM2 çıkışı 17 RC2 / CCP1 ST Dijital I/O port’u. Capture-1 girişi / Compare-1 çıkışı / PWM1 çıkışı. 18 RC3 / SCK / SCL ST Dijital I/O port’u. SPI ve I2C modunda senkron seri clock girişi. 23 RC4 / SDI / SDA ST Dijital I/O port’u. SPI modunda SPI data girişi veya I2C modunda data I/O pini

olarak kullanılabilir. 24 RC5 / SDO ST Dijital I/O port’u. Senkron seri iletişimde data çıkışı.

25 RC6 / TX / CK ST Dijital I/O port’u. USART asenkron seri iletişimde data çıkışı (Transmit - data gönderme pini) / USART senkron seri iletişimde clock pini.

26 RC7 / RX / DT ST Dijital I/O port’u. USART asenkron seri iletişimde data girişi (Receive - data alma pini) / USART senkron seri iletişimde data pini.

Tablo 3-10 : PIC16F877A’nın C portunun pinleri ve işlevleri.

Page 22: 3 PIC16F877A’nın ÖZELLİKLERİ

46 PIC Programlama Bilgi ve Deney Kitabı

PORTD ve PORTE PORTD ve PORTE genelde birlikte kullanılan iki porttur. Mikro bilgisayar veri yollarıyla 8 bit’lik

paralel iletişim için kullanılır. PORTD, sekiz bit’lik veri ve adres yolunu oluştururken, PORTE kontrol uçları olarak ayrılmıştır. Tüm girişler paralel iletişim sırasında TTL seviyelerde, giriş çıkış olarak kullanıldığında Schmitt-Trigger seviyelerde çalışır.

PORTE aynı zamanda PORTA gibi analog giriş olarak da seçilebilmektedir. Şu anda analog girişlerle program yazmayacağımız için PORTA anlatılırken verilen örnek 3.1’de yazılan kodlarla PORTE’nin analog özelliği de kapatılmış oldu.

Pin no Pin adı Buffer tipi Açıklama 19 RD0 / PSP0 ST/TTL(1) Dijital I/O port’u veya Paralel Slave portu (bit 0). 20 RD1 / PSP1 ST/TTL(1) Dijital I/O port’u veya Paralel Slave portu (bit 1). 21 RD2 / PSP2 ST/TTL(1) Dijital I/O port’u veya Paralel Slave portu (bit 2). 22 RD3 / PSP3 ST/TTL(1) Dijital I/O port’u veya Paralel Slave portu (bit 3). 27 RD4 / PSP4 ST/TTL(1) Dijital I/O port’u veya Paralel Slave portu (bit 4). 28 RD5 / PSP5 ST/TTL(1) Dijital I/O port’u veya Paralel Slave portu (bit 5). 29 RD6 / PSP6 ST/TTL(1) Dijital I/O port’u veya Paralel Slave portu (bit 6). 30 RD7 / PSP7 ST/TTL(1) Dijital I/O port’u veya Paralel Slave portu (bit 7).

Not: 1: Dijital I/O portu olarak kullanıldığında buffer tipi schmitt trigger, paralel slave portu olarak kullanıldığında buffer tipi TTL’dir.

Tablo 3-11 : PIC16F877A’nın D portunun pinleri ve işlevleri. Pin no Pin adı Buffer tipi Açıklama

8 RE0 / RD / AN5 ST/TTL(1)

Dijital I/O port’u veya Paralel Slave portu modunda okuma (RD) kontrol pini girişi veya analog giriş pini. RD 1 = boş 0 = Okuma işlemi. PORTD registeri’nın içeriği PORTD pinlerine gönderilir. (Gönderilen chip seçilmişse).

9 RE1 / WR / AN6 ST/TTL(1)

Dijital I/O port’u veya Paralel Slave portu modunda yazma (WR) kontrol pini girişi veya analog giriş pini. WR 1 = boş 0 = Yazma işlemi. PORTD pinlerinin değeri PORTD registerine gönderilir. (Gönderilen chip seçilmişse).

10 RE2 / CS / AN7 ST/TTL(1)

Dijital I/O port’u veya Paralel Slave portu modunda chip seçme (CS) kontrol pini girişi veya analog giriş pini. CS 1 = Chip seçilmedi 0 = Chip seçildi.

Not: 1: Dijital I/O portu olarak kullanıldığında buffer tipi schmitt trigger, paralel slave portu olarak kullanıldığında buffer tipi TTL’dir.

Tablo 3-12 : PIC16F877A’nın E portunun pinleri ve işlevleri.

TRIS KAYDEDİCİLERİ Tüm programlarımızda kullanacağımız ikinci en önemli kaydedici ise TRIS kaydedicisidir. Her

portun kendine ait bir TRIS kaydedicisi vardır (PORTA => TRISA, PORTB => TRISB gibi). Bir portun TRIS kaydedicisi o portun hangi pininin giriş, hangi pininin çıkış olarak kullanılacağını belirler. Bir pini, örneğin RA5’i çıkış yapmak istiyorsak, TRISA’nın 5. bit’ini “0” yapmamız gerekir. Çünkü TRIS

Page 23: 3 PIC16F877A’nın ÖZELLİKLERİ

PIC 16F877A’nın Özellikleri 47

TRISA PORTA

TRISB PORTB RB7 RB6 RB5

RB2

RB4 RB3

RB1 RB0

RA7 RA6 RA5 RA4 RA3 RA2 RA1 RA0

kaydeddicileri üzerinde çıkış yapılacak pinler “0”, giriş yapılacaklar “1” yapılmalıdır. TRIS kaydedicisi içerisine sayıları ikilik tabanda yüklemek oldukça kolaylık sağlar. Çünkü;

movlw b’11010011’

movwf TRISB

satırlarında görüldüğü gibi “1” ler İngilizce’deki “Input”, yani giriş sözcüğünün baş harfi olan “I”, “0”lar ise İngilizce’deki “Output”, yani çıkış sözcüğünün baş harfi olan “O” gibi gözükmektedir. Böylece çok basit bir mantıkla hiç karıştırmadan bu gerekli ayarı yapabiliriz. Şekil 3.24’de PORTA ve PORTB’nin yönlendirmeleri şematik olarak gösterilmiştir.

Şekil 3-24 : A ve B port’larının TRISA ve TRISB kaydedicileri ile yönlendirilmesi.

PIC16F877A BELLEK ORGANİZASYONU PIC16F877A’nın belleği üç bloktan oluşmaktadır. Bu üç bloğun her birinin işlevi diğerinden ayrıdır.

Uzun ömürlü olan fakat içerisine veri girilmesi için 13 V gibi yüksek bir gerilime ve uzun bir süreye ihtiyacı olan FLASH bellek programımızı kayıt edeceğimiz bölümdür. Programlarımızın kullandığı değişkenler FLASH belleğe göre çok daha hızlı bir bellek olan statik RAM’i kullanır. Böylece sık sık tekrarlanan yazma ve okumalar oldukça hızlı gerçekleştirilir. Elektrik kesintilerinde silinmesini istemediğimiz verileri ise FLASH belleğe oldukça benzeyen fakat daha düşük gerilimle çalışabilen ve daha uzun ömürlü olan E²PROM belleğine yazarız. Bunların dışında herhangi bir şekilde veri depolama amacıyla değil sadece işlemlerde ara eleman olarak kullanılan bir de W kaydedicisi bulunmaktadır. Yazılması ayrıca programlama tekniği gerektiren Veri EEPROM bölümünü sona bırakıp, bu bölümde W kaydedicisi, FLASH program belleği ve RAM veri belleğini ele alacağız.

FLASH Program Belleği Seksenli yılların başından bu yana gelişim gösteren mikrodenetleyici endüstrisinde çok popüler

olan ucuz ve tek sefer programlanabilen OTP (EPROM) bellekli entegreler kullanılmıştır. Şimdilerde ise tüm bilgisayar ve mikrodenetleyici endüstrisinde FLASH bellekler bütün diğer depolama birimlerinin yerini almaktadır. Hareketli parçasının olmaması, hem enerji tüketimini hem de hızını artırmaktadır.

Daha önce de bahsettiğimiz gibi PIC16 serisi mikrodenetleyiciler 14 bit kelime boyuna sahip komutları kullanırlar. Hepsi birleşerek programlarımızı oluşturacak bu komutları depo etmek için her bir bellek adresindeki bölmenin 14 bit uzunluğunda olması gerekir. Her biri bir komutu ifade eden bu bellek

Bit 7 1 6 0 5 1 4 1 3 0 2 0 1 0 Bit 0 1

Bit 7 1 6 0 5 1 4 1 3 0 2 1 1 1 Bit 0 0

Page 24: 3 PIC16F877A’nın ÖZELLİKLERİ

48 PIC Programlama Bilgi ve Deney Kitabı

kutucuklarını adresleyen birim ise “Program Sayacı” dır (Program Counter veya Instruction Pointer). PIC16FXXX serisi PIC’ler 13 bit’lik Program Sayacına (Program Counter) sahip olduğu için en fazla “213 = 8192” program belleği adreslenebilmektedir. PIC16F877A’da bu adresleme kapasitesinin tamamı kullanılmıştır. Yani PIC16F877A, 8192 adet 14 bit’lik program verisi alabilecek FLASH belleğe sahiptir. Microchip’in hazırladığı datasheet’lerde bu durum 8k x 14 bit olarak ifade edilmiştir.

Şekil 3-25 : PIC16F877A’nın program belleği.

Program Sayacı Program sayacı, RAM veri belleği (File Register) içinde adreslenmiştir. RAM veri belleği 8 bit’lik

verileri depolayabildiği için 13 bit’lik program sayacı iki parçaya ayrılmıştır. Bunlardan birincisi, PCL (Program Counter Low - Program Sayacı Alt) program sayacının düşük değerlikli 8 bit’i, PCH ise üst 5 bit’idir. PCL ye doğrudan adresleme ile erişmek mümkün olduğu halde, üst 5 bit’e doğrudan ulaşmak mümkün değildir. Bu bit’lere ulaşmak için PCLATH kaydedicisi kullanılır. PCL’ye doğrudan erişilmesi demek, MOVWF, ADDWF, SUBWF gibi komutlarda sadece 8 bit’lik RAM adresi kullanılabileceği anlamına gelir. Buradan da anlaşılacağı gibi bu komutlar PCLATH’a uygulanamaz.

Bu durum tablodan okuma işleminde büyük önem kazanır. Tablodan okuma işlemi yapılırken “addwf PCL” (W kaydedicisinin içeriğini PCL’ye ekle) komutu uygulandığında PCL’nin 8. bit’ini aşmamak büyük önem taşır. Şekil 3.26’da görüldüğü gibi ALU’dan ADDWF, MOVWF gibi komutlarla PCL’nin sadece alt 8 bit’ine ulaşılabilir. PCL herhangi bir işlem sonucunda 0xFF (255)’i aştığında 0x00’a geri döner ve PCH’yı değiştirmez. PCL’nin her komut çevrimindeki doğal artışında bu konu söz konusu değildir. PCL 0xFF’de iken bir sonraki komut çevriminde 0x00 olur ve PCLATH’ı kendiliğinden bir arttırır.

Şekil 3-26 : Addwf ile ileri bir program belleği adresine atlarken PC’nin değişimi.

Şekil 3-27 : Call ve goto ile bir program belleği adresine atlarken PC’nin değişimi.

Page 25: 3 PIC16F877A’nın ÖZELLİKLERİ

PIC 16F877A’nın Özellikleri 49

2Kb’dan Uzak Adreslere Goto ve Call ile Ulaşmak Şekil 3.27’de goto ve call fonksiyonlarının program sayacının 11 bit’ine erişebildiği görülmektedir.

Bu sebeple 2 Kbyte’lık dilimler içindeki adreslere dallanma yaptıklarında PCLATH üzerinde değişiklik yapılmasına gerek yoktur. 0x00-0x7FF arasında bir goto işlemi uyguladığımızda, eğer programın gitmesini istediğimiz yer de 0x00-0x7FF’lik dilim içerisindeyse, herhangi bir ön işleme gerek kalmadan sadece goto komutunun yazılması yeterlidir. Fakat 0x00-0x7FF’lik bölümden 0x800-0xFFF arasında bir bölüme goto işlemiyle gidilmek istendiğinde PCLATH içerisinde sayfa değiştirme işlemi yapıldıktan sonra goto işlemi uygulanmalıdır. Şekil 3.28’de PIC16F877A’nın program belleğini dört parçaya ayrılmış şekilde görüyorsunuz. Bellek fiziksel olarak dört parçadan oluşmadığı halde burada anlaşılmasının kolay olması için dört parça (sayfa) halinde gösterilmiştir. Her parçaya ulaşmak için PCLATH de yapılması gereken değişiklik o parçanın altında verilmiştir.

Şekil 3-28 : GOTO veya CALL komutu ile 2 Kbyte’dan uzak belleğe gitmek için PCLATH’a yapılan işlem.

Örnek 3.2’de yukarıdaki değişikliklerin program içerisinde nasıl yapıldığı incelenebilir.

NOT: Sayfa değiştirmenin daha kolay bir yolu da PAGESEL derleyici bildirisini kullanmaktır. Assembly derleyici, pagesel ile belirtilen etiketin olduğu adresi otomatik olarak bulacak ve o sayfaya geçecektir. Örneğin, örnek 3.2’de goto UZAK komutundan önce PAGESEL UZAK yazılırsa org 0x900 yazmaya gerek kalmaz. Otomatik olarak 1. sayfaya geçilecektir.

Örnek 3.2 : 2 Kb’dan Uzak Adrese Goto İle Gitmek.

..........

.......... org 0x500 ; 0-7FF arası 0.sayfadadır bcf PCLATH, 4 ; goto ile gitmek istediğimiz yer”900” bsf PCLATH, 3 ; 800-FFF arasında kalmaktadır ve birinci ; sayfadadır bu sebeple goto goto UZAK ; işlemini uygulamadan önce ; PCLATH’da gerekli değişikliği yaparız org 0x900

UZAK .......... ..........

Örnek program parçasından anlaşılacağı gibi 4 sayfaya ayrılmış 8 Kbyte’lık 16F877A’nın program belleğinin 1. sayfasına bir programı dallandırmak için PCLATH kaydedicisinin 4. bit’i “0”, 3. bit’i “1” yapılmalıdır. Daha kolay anlaşılması için aşağıdaki tabloyu çıkarabiliriz.

Blok Adres Aralığı PCLATH <4> <3> 0. sayfa 0001 – 07FF 0 0 1. sayfa 0800 – 0FFF 0 1 2. sayfa 1000 – 17FF 1 0 3. sayfa 1800 – 1FFF 1 1

Tablo 3-13 : PIC16F877A sayfa adresleri ve seçimi.

Yukarıdaki bahsedilen durum Call komutu için de geçerlidir. Call da goto gibi 2 Kbyte’lık dilimler içinde PCLATH’de değişiklik yapılmadan kullanılabilir. Ancak Call ile başka bir 2 Kbyte’lık dilimde bulunan bir alt programı çağırıldığında PCLATH’da gerekli değişikliğin yapılması gerekir. Alt programın

0.sayfa 1.sayfa 2.sayfa 3.sayfa

Page 26: 3 PIC16F877A’nın ÖZELLİKLERİ

50 PIC Programlama Bilgi ve Deney Kitabı

çağrıldığı adresten bir sonraki adrese return ile dönerken PCLATH’ı tekrar eski haline getirmeye gerek yoktur. Şekil 3.29’da görüldüğü üzere Return komutu ile bir alt programdan dönerken sayfa değiştirmeye ihtiyaç duymamamızın sebebi PIC16F877A’nın 13 bit’lik STACK (yığın) kaydedicisinin oluşudur. Herhangi bir alt programı call ile çağırdığımızda veya bir kesme oluştuğunda alt programın çağırıldığı adres STACK içerisine kayıt edilir. Return komutu STACK içerisinde kayıtlı son adrese geri dönmemizi sağlar. PIC16F877A’nın 8 seviyeli STACK kaydedicisi olduğundan STACK’a kayıt edilebilecek maksimum adres sayısının 8 olduğu unutulmamalıdır. Bu alt alta çağırabileceğimiz alt program sayısını ifade eder. Eğer 8. alt programdayken bir kez daha alt program çağrılırsa 9. STACK olmadığı için adres kayıt edilemez. Return ile dönüldüğünde STACK’ın 8. seviyesindeki adrese dönülür ve bu programın kontrolden çıkmasına sebep olur.

Şekil 3-29 : Call komutu ve Kesme ile Program Sayacını Stack içerisine kayıt etmek ve return ve retfie

komutlarıyla tekrar Stack’dan program sayacı içine yüklemek.

Eğer bulunulan sayfadan farklı bir sayfadaki bir alt programa call ile gidiliyorsa, her ana programdan alt program çağırıldığında PCLATH’da gerekli değişikliklerin yapılması gerekir. Çünkü call komutu o an bulunulan adresin tamamını (13 bit’ini) stack içerisine kayıt eder. Return ile geri dönüşte PCL ve PCH tamamen eski haline döner.

Kesme durumunda ise bu gibi kaygılar yoktur. Çünkü kesme sırasında gidilecek adres bellidir (0x0004) ve kesme oluştuğunda program o anda bulunulan adresi STACK içine kaydedip 0x0004’e gider. Retfie komutuyla dönerken de 13 bit’lik STACK içerisinde kayıtlı dönüş adresi kullanıldığı için PCLATH içerisinde herhangi bir değişikliğe gerek yoktur. Zaten bunun aksi bir durum düşünülemez. Kesmenin ne zaman geleceği bilinemediği için kesmeyi gelmeden önce sayfa değiştirme gibi bir şansımız da yoktur.

RAM Veri Belleği PIC16F877A veri belleği özel amaçlı kaydediciler ve genel amaçlı kaydedicileri kapsar. Microchip

bunların hepsini Dosya Kaydedicisi (File Register) olarak tanımlamıştır. Özel amaçlı kaydediciler, mikrodenetleyicinin çalışmasını kontrol etmek amacıyla kullanılırlar. Hangi portun giriş, hangi portun çıkış olacağı, hangi porttan ne çıkış verileceği, E²PROM’a yazılacak veriler, zamanlayıcılar ve birçok başka özellik, bu kaydedicier ile kontrol edilir. Genel amaçlı kaydediciler ise programcı tarafından yazılım amacıyla kullanılan geçici belleklerdir.

Şekil 3.30’’da görüldüğü gibi RAM belleği 4 parçadan oluşmaktadır. İlk bakışta 0x00 dan 0x1FF’e kadar tam 512 adet kaydedici bulunduğu görülür. Haritadan da görüldüğü gibi bazı özel amaçlı kaydedilerin kopyaları diğer banklarda da bulunmaktadır. Bu özellik çok kullanılan kaydedicilere ulaşmak için bank değiştirme işlemini ortadan kaldırmak için kullanılmıştır. Bu sayede hem birkaç satır daha fazla

Page 27: 3 PIC16F877A’nın ÖZELLİKLERİ

PIC 16F877A’nın Özellikleri 51 yazmaktan, hata yapma olasılığından ve mikrodenetleyicinin işlem hızından kazanç elde ederiz. Kaydedicilerin kopyaları sadece özel amaçlı olanlarda değil genel amaçlı olanlarda da mevcuttur. Bir bankın son 16 byte’ına yazdığımız veri diğer bankların son 16 byte’ında da görünür. Bu 0x070 ile 0x07F arasında herhangi bir bellek adresine yazılan bir verinin 0x0F0 ile 0x0FF, 0x0170 ile 0x17F, 0x1F0 ile 0x1FF arasına kopyalanacağı anlamına gelir. Bu özellik genel amaçlı kaydedicilere de bank değiştirmeden erişebilmeyi sağlar. Örneğin tablo 3.14’de 74h adresine yazılan bir veri F4h, 174h ve 1F4h bellek adreslerine de yazılır. Buna gölgelenmiş (shadowed) bellek adı da verilir.

70h F0h 170h 1F0h

74h F4h 174h 1F4h

7Fh FFh 17Fh 1FFh

Tablo 3-14 : 74h RAM adresine yazılan bir verinin gölgelenmesi (shadowed).

Özel amaçlı kaydedicilerin bazılarının arasında, gri renkli olarak işaretlenmiş, boş adresler gözükmektedir. Bunlar her ne kadar kullanıma uygun gözükse de aslında mikrodenetleyici tarafından algılanamaz, kullanıma uygun değildir. Sonuç olarak bu 512 kaydediciden sadece 368 tanesi aktif olarak genel amaçlı kaydedici olarak kullanılabilir.

Şekil 3-30 : 16F877A’nın RAM kaydedicilerinin bellek adresleri.

Page 28: 3 PIC16F877A’nın ÖZELLİKLERİ

52 PIC Programlama Bilgi ve Deney Kitabı

PIC16FXXX RAM Adresleme Metodları Mikrodenetleyicilerde RAM üzerindeki kaydedicileri okumak veya bu kaydedicilere yazmak için,

okunmak ve yazılmak istenen adresin RAM’a yollanması işlemine adresleme denilir. RAM verilen komuta göre ya veriyi alıp yazar, ya da okuyup yollar. PIC16 serisi mikrodenetleyiciler adresleme için üç değişik metot kullanırlar:

1. İvedi Adresleme. 2. Doğrudan Adresleme. 3. Dolaylı Adresleme.

Bu adresleme metodlarının üçü ile de aynı işleri yapabilmek mümkündür. Fakat her birinin özel kullanım yeri vardır. Bunları doğru yerlerde kullanmak programımızı yazarken birçok avantaj sağlar.

İvedi Adresleme

İvedi adresleme ile “W” kaydedicisi içine doğrudan değişken atanabilir veya içeriğinde değişiklik yapılabilir. Aşağıda W kaydedicisi içeriğinde doğrudan değişiklik yapılmış bir program örneği görüyorsunuz.

Örnek 3-3 : İvedi Adresleme.

........

.......... movlw b’00001001’ ;W register’ına ivedi adresleme metoduyla sublw b’00010111’ ;00001001 değerini yükledik ve 00010111 .......... ;sayısını çıkarttık ........

Yukarıdaki program parçasında “ivedi” olarak W kaydedicisine 8 bit’lik “00001001” sayısını doğrudan yükledik. İkinci program satırında ise W kaydedicisinin içindeki “00001001” sayısından “00010111” sayısını ivedi adresleme metoduyla çıkartmış olduk. Çıkartma sonucu W kaydedicisi içine yazıldı. Çıkartılan değer, W kaydedicisinin içindeki ilk değerden büyük olduğu için çıkartma işleminin sonucu STATUS kaydedicisini etkiledi. STATUS kaydedicisinin C bayrağı “1” oldu.

Şekil 3.31’de bu işlem gerçekleşirken mikrodenetleyicinin içinde tam olarak gerçekleşen olay incelenebilir. Program sayacının artışıyla birlikte program belleğinde “movlw b’00001001’” yazılı satır, komut kaydedicisine yüklenmiş olur. Komut kaydedicisi yüklenen bu komutun ilk altı bit’ini çözümler (bu altı bit yapılmak istenen işlemin kodudur). Çözümleme sonucunda b’00001001’ sayısının W kaydedicisine yüklenmesi gerektiği anlaşılmıştır. Şekildeki ok işareti takip edilirse, 8 bit’lik bu değer MUX (çoklayıcı) ve ALU’da (Aritmetik Lojik Birim) herhangi bir değişikliğe uğramadan W kaydedicisine kaydedildiği görülmektedir.

Şekil 3-31 : İvedi adresleme metoduyla W kaydedicisine değer yüklemek.

İkinci program satırı işlenirken program sayacının artışıyla bir sonraki satır komut kaydedicisi içerisine yüklenmiştir. 14 bit’lik verinin ilk 6 bit’inden yapılmak istenen işlemin W kaydedicisinden bir

Page 29: 3 PIC16F877A’nın ÖZELLİKLERİ

PIC 16F877A’nın Özellikleri 53 sayının çıkartılması olduğu anlaşılmıştır. Çıkartılmak istenen 8 bit’lik değer MUX tarafından seçilir ve ALU’ya gönderilir. Bu sırada W kaydedicisinin değeri de ALU’ya girer. Bu demek oluyor ki, ALU’ya W kaydedicisinin eski değeri ve çıkartmak istediğimiz 8 bit’lik değer beraber girer. Sonuç tekrar W kaydedicisine yazılır. Böyle bir çıkartma işlemi sonucunda STATUS kaydedicisinde DC, C ve Z bayrakları etkilenebilir. Bizim programımızda DC ve C bayrakları çıkartma işleminden etkilenmiştir. Şekil 3.32’de bu etkilenmenin olduğu ALU’dan status kaydedicisine doğru çizilen ok ile belirtilmiştir.

Şekil 3-32 : İvedi adresleme metoduyla W kaydedicisinden bir sayıyı çıkartmak.

İvedi adresleme kullanarak bellekte yer işgal etmeden bir çok işlemi yapabilirsiniz. Örneğin amatör bir programcı bir kaydedici içeriğini bozmadan üzerinde birkaç işlem uygulayıp son halini bu kaydedici içerisine yazma işlemi için en az 1 ara değişken kaydedici kullanır. Çünkü bellek kullanarak program yazma insan beyninin çalışma şekline benzeyen program yazma anlamına gelmektedir. İlk programlarımızı yazarken biz nasıl hesap yapıyorsak veya nasıl karar veriyorsak mikrodenetleyiciye o şekilde hesap yaptırmak veya karar verdirmek daha kolay gelecektir. Fakat profesyonelleştikçe, mikrodenetleyici gibi düşünmeyi öğrenecek, ara değişkenler yerine W kaydedicisini kullanarak çok daha kısa ve etkili programlar yapabileceksiniz.

Doğrudan Adresleme

İkinci adresleme yöntemi ise doğrudan adreslemedir. Bu adresleme metodu programlarınızı yazarken en sık olarak kullanacağınız adresleme metodudur. Bu tip adreslemede komut kaydedicisinin içine yapılmak istenen işlem ve işlemin uygulanacağı RAM adresi yüklenir. Gördüğünüz gibi RAM’de artık işin içine girmiştir. Şimdi doğrudan adresleme kullanılan bir program örneği inceleyelim:

Örnek 3-4 : Doğrudan Adresleme.

include “PIC16F877A.INC” ;gerekli include dosyasını yükledik. ILKDEGER EQU 0x021 ;RAM adresleri için birer isim atadık SONDEGER EQU 0x022

...........

............ movf PORTB, W ;PORTB’yi okuyup W ye attık. movwf ILKDEGER ;Bunu ILKDEGER’in içine kaydettik movf SONDEGER, W ;SONDEGER ile belirtilen adresin içindeki subwf ILKDEGER, W ;degeri W’ye aldık ve bu degeri ILKDEGER’ movwf SONDEGER ;den çıkarttık ve SONDEGER’in içine

;tekrar kaydettik. Bu işlemlerin hepsini ;yaparken doğrudan adresleme kullandık.

...........

..........

Page 30: 3 PIC16F877A’nın ÖZELLİKLERİ

54 PIC Programlama Bilgi ve Deney Kitabı

Yukarıdaki programa bakıldığında RAM adresleri yerine “ILKDEGER” ve “SONDEGER” gibi değişken isimleri görülmektedir. Bu isimler programcı tarafından programın başında, yazım kolaylığı için atanır. Örneğin bizim programımızda 0x021 RAM adresi ILKDEGER olarak tanımlanmıştır. Derleyicimiz ILKDEGER gördüğü her yerde 0x021 adresini kullanacaktır. Kullandığımız mikrodenetleycinin “INC” uzantılı dosyasını include “*.INC” formatında yazdığımız sürece PORTB, STATUS gibi özel amaçlı kaydedicilerin adreslerini tanımlamamıza gerek yoktur. Bu kaydedici adresleri “INC” dosyasının içinde tanımlanmıştır. Bizim sadece o dosyayı referans göstermemiz yeterlidir (inanmayanlar bu “inc” dosyalarını metin editörü ile açıp satır satır inceleyebilirler). Şimdi bu programı inceleyelim:

Program sayacı “movf PORTB, W” satırını işaret ettiğinde 14 bit’lik bu program belleği verisi komut kaydedici içerisine yüklenir. Komut çözümleyici bir RAM adresini (PORTB) doğrudan adresleyerek içeriğinin W kaydedicisi içine atanacağını çözümler. 7 bit’lik doğrudan adres veri yolu üzerinden içeriği alınmak istenen kaydedici adresi RAM’e gönderilir. RAM üzerinde bir kaydedici gibi gözüken PORTB’nin içeriği o anda giriş/çıkış pinlerindeki veridir. Bu veri MUX üzerinden ALU’ya geçer. ALU’da herhangi bir işlem görmeden W kaydedicisine yüklenir. (Şekil 3.33)

Şekil 3-33 : Doğrudan adresleme metodu ile RAM deki veriyi W’ye yüklemek.

Bir sonraki program çevriminde, komut kaydedicisine yüklenen komut (movwf ILKDEGER) ile, W kaydedicisi ILKDEGER ile işaret edilen 0x021 adresine kayıt edilmek istenmektedir. Komut çözümleyici bunu çözümler. RAM veri adres yolu üzerinden ILKDEGER ismi verilen 0x021 kaydedicisini işaret eder. Bu satırda bir önceki satırdan farklı olarak RAM’e yazma işlemi yaptığımız için RAM içerisindeki veri, veri yoluna aktarılmaz. Yeni verinin veri yolundan gelmesi beklenir. W kaydedici içeriği veri yolu üzerinden RAM’e aktarılır. O anda aktif olan RAM adresi 0x021 olduğu için bu adrese yazma işlemi gerçekleştirilir. Şekil 3.34’deki blok diyagramda W kaydedicisi içeriğinin izlediği yol taralı çizgileri izleyerek, RAM adres verisinin izlediği yol ise koyu renk ile işaretlenmiş yol takip edilerek izlenebilir.

PIC16 serisi işlemcilerde RAM’e ulaşmanın tek yolu W kaydedicisidir. Blok diyagramlarda her ne kadar STATUS veya bazı başka kaydediciler veri yoluna açık gözükse de bunlardan birinden diğerine doğrudan veri aktarımı gerçekleştirilemez. Kaydedici içeriğinin ilk önce W kaydedicisine aktarılması oradan yeni kaydediciye kayıt edilmesi gerekir. Bu sebeple bir kaydediciden diğer bir kaydediciye veri aktarırken yukarıda gördüğümüz iki satırın uygulanması gerekir.

“movf SONDEGER,W” komutunun işleyiş biçimi ”movf STATUS,W” komutuyla aynıdır. SONDEGER’in genel amaçlı bir kaydedici olması, STATUS kaydedicisinin özel amaçlı bir kaydedici olması işlemin uygulanma şekline etki etmez.

Page 31: 3 PIC16F877A’nın ÖZELLİKLERİ

PIC 16F877A’nın Özellikleri 55

Şekil 3-34 : Doğrudan adresleme metodu ile W’yi RAM’e kayıt etmek.

Program sayacının artışıyla birlikte bir sonraki satırdaki komut verisi (subwf IKDEGER), komut kaydedicisi içerisine yüklenir. Komut çözümleyici ILKDEGER ile isimlendirilmiş 0x021 adresindeki veriden W kaydedicisindeki verinin çıkarılacağını, sonucun W kaydedicisine yükleneceğini çözümler. RAM’de içeriğine ulaşmak istediğimiz kaydedicinin adresi, RAM’e 7 bit’lik doğrudan adresleme yolu ile gönderilir. Addr MUX adresi okunmak istenen veri hücresini seçer ve RAM 0x021 adresinde bulunan veriyi, veri yolu üzerinden ALU’ya girecek verileri seçen MUX’a gönderir. Veri yolundan gelen RAM içeriği, W kaydedici içerisindeki değerle birlikte ALU’ya girer. ALU içerisinde çıkartma işlemi yapılır. Sonuç W kaydedici içerisine kayıt edilir. Çıkartma sonucuna göre STATUS kaydedicisindeki Z, C ve DC bayrakları etkilenir.

Şekil 3-35 : Doğrudan adresleme ile bir kaydedici içeriğinden W Reg’i çıkartmak.

Program örneğimizin son satırında ise ikinci satırında olduğu gibi “movwf” W kaydedici içeriği bir RAM kaydedicisine (SONDEGER) kayıt edilir.

İşte programımızın sonuna geldik. Bu program ne işe yarar? Şu haliyle hiçbir işe yaramaz. Buradaki tek amacımız doğrudan adreslemeyi göstermekti. Sadece doğrudan adresleme veya sadece ivedi adresleme tek başına işimize yarayacak adresleme metotları değildir. Genelde kullanırken hangi komutun dolaylı hangisinin ivedi olduğunu fark etmeyeceksiniz bile, sadece işinize yarayacak komutları sıralayacaksınız.

Page 32: 3 PIC16F877A’nın ÖZELLİKLERİ

56 PIC Programlama Bilgi ve Deney Kitabı

Dolaylı Adresleme

PIC mikrodenetleyicilerde kullanılan diğer bir adresleme metodu ise dolaylı adreslemedir. Dolaylı adresleme diğer adresleme metotlarına göre biraz daha karışık ve hatta daha az gerekli gözükebilir. Bilgisayar programlama dillerinde deneyimli programcılar bu metodun ne kadar da gerekli olduğunu daha iyi kavrayacaklardır. Yüksek ve orta seviyeli dillerde dizi (array) olarak bilinen değişken tipi mikrodenetleyicilerde dolaylı adresleme ile mümkün olur. Dolaylı adresleme için kaynak kodunun genelde baş tarafında bulunan tanımlamalar kısmında daha sonra dolaylı adresleme ile kullanılmak üzere belirli miktarda kaydedici ayrılır. Bu kaydediciler daha sonra programın içerisinde kullanılırlar.

C dilinde; Char dizi[4]; // 4 basamaklı bir dizi.

PIC assembly ile; dizi EQU 0x20 ; Dizinin başladığı adresi tanımladık.

şeklinde yapılmaktadır.

Görüldüğü gibi C dilinde dizinin kaç değer içereceği belli iken assembly ile yazılan programda sadece başlangıç adresi gösterilmiştir. İleride C programlama dilinde olduğu gibi tanımlamalar yaparak, adreslerin çakışmaması için harcadığımız zamanı nasıl kısaltabileceğimizi inceleyeceğiz. C dilinde yapılmış tanımlama ile dizi[1], dizi[2], dizi[3], ve dizi[4] değişkenleri tanımlanmış oldu. Eğer bu tanımlamanın yapıldığı C programında dizi[5] değişkeni kullanılırsa hata oluşur. Assembly ile yapılan tanımlamada ise bir sınır olmadığı için dizi başlangıç adresinden sonra 4 adet değişken kullanmaya kaynak kodu oluşturulurken çok dikkat edilmelidir. Yoksa istemediğimiz adreslere yazabilir veya bu adresleri okuyabiliriz.

INDF ve FSR Kaydedicileri

Dolaylı adreslemede kullanılan iki önemli kaydedici vardır. INDF bunlardan birisidir ve RAM bellekte adresi bulunan fiziksel bir kaydedici değildir. Sadece dolaylı adresleme yapmak amacıyla kullanılır. INDF kaydedicisini kullanan bir komut kullanıldığında FSR adındaki başka bir kaydedicinin gösterdiği kaydedicinin içindeki veriye ulaşılır. FSR kaydedicisi RAM belleğin 0x04 adresinde bulunur. Kısaca, FSR’ye daima bir adres verisi yüklenir. FSR’nin gösterdiği bu adresteki veriye ulaşmak için de INDF kaydedicisi kullanılır.

Şimdi C diliyle dizi[4] değişkenine değer atayalım; dizi[4] =‘a’ ; // a değerini dizi[4] değişkenine yükle.

PIC assembly ile; movlw dizi+3 ; Dizinin başlangıç adresinden 4 sonraki

; adresi yani 0x23 adresini W register’ına ; yükledik.

movwf FSR ; Bu adresi FSR’nin içerisine yazdık. movlw ‘a’ ; W register’ına bu adrese yazmak

; istediğimiz a değerini yükledik. movwf INDF ; W’yi INDF içerisine kayıt ederek yazma

; işlemini bitirdik.

şeklinde yapılmaktadır.

Dolaylı adresleme genellikle sıralı verileri çok çabuk olarak işlemek amacıyla kullanılır. Bu tip değişkenleri en çok kullanacağımız yerler yüksek hız isteyen veri transferleri ve matematiksel işlemlerdir. Borsa verilerini kayan yazı olarak gösteren display’ler görmüşsünüzdür. Bizim mikrodenetleyicimiz de PC’mizden seri olarak aldığı borsa verisini kayar yazı olarak bir display’de göstermek için atanmış olsun. Bu durumda mikrodenetleyicinin PC’den gelen veriyi oldukça hızlı kayıt etmesi gerekir. Eğer yazılar geldiği sıra ile gösterilecekse işimiz oldukça kolaylaşır. Yapmamız gereken, verileri arka arkaya kayıt etmektir. Bunun için dolaylı adresleme en kolay yoldur. Her gelen karakter bir birinin ardı sıra kaydedicilere yazılır. Sıra ekranda gösterilecek karaktere geldiğinde yine dolaylı adresleme ile veri okunur, gerekli işlem uygulanır ve display’e gönderilir. Bu işlemi doğrudan adresleme ile de yapmak mümkündür. Ancak dolaylı adresleme yolu ile okuma yazma işlemi yaparken ard arda sıralanmış verileri okumak için döngü yazarak okunacak adresi arttırabilme kolaylığı bu gibi işlerde bize yardımcı olur. Şimdi

Page 33: 3 PIC16F877A’nın ÖZELLİKLERİ

PIC 16F877A’nın Özellikleri 57 buna benzer fakat çok daha basit ve anlaşılır bir program inceleyelim. Aşağıdaki program 0x020 ile 0x02F RAM adresleri arasındaki kaydedicilerin içeriğini dolaylı adresleme metodu ile siler.

Örnek 3-5 : Dolaylı Adresleme

........

.......... movlw 0x20 ; FSR register’ına PIC16F877A’da genel amaçlı movwf FSR ; register’ların başlangıç adresi olan 20

DONGU clrf INDF ; yükledik ve bu adresin içeriği sildik. incf FSR,F ; FSR arttırılarak bir sonraki adrese işaret btfss FSR,4 ; ettik. FSR 0100 adresine gelene kadar bu goto DONGU ; işlemi tekrarladık.

DEVAM ........... .........

Şekil 3.36’da FSR’nin belleğin 0x20 adresini göstermesi için yapılması gerekenler gösterilmiştir. Tüm komutlarda olduğu gibi komut çözümlenmiş ve FSR kaydedicisine yazılmak istendiği anlaşılmıştır. Daha sonra W kaydedicisi içerisindeki veri MUX ve ALU’da hiç değişikliğe uğramadan FSR üzerinden RAM’e gönderilmiştir. Şekilden de görüldüğü gibi FSR kaydedicisine veri yüklenirken tüm geçilen veri yolları 8 bit’tir. Bu da demek oluyor ki FSR ile 8 bit’lik adresleme yapılabilir. Doğrudan adresleme yapan komutlarla ilgili şemaları inceleyiniz. Doğrudan adreslemede 7 bit’lik veri yolu üzerinden adres çözümleyiciye ulaştığımıza dikkat ediniz.

Yukarıdaki paragrafta anlatılan FSR içerisine yazma durumunda gönderilecek veriden hiç bahsedilmemiştir. Çünkü FSR sadece adresi seçmek içindir. FSR kullanarak RAM adreslerine ulaşabilmek için yukarıdaki programda görüldüğü gibi en az iki satırlık programa ihtiyaç vardır. İkinci satırda göndereceğimiz veriyi INDF kaydedici içerisine yazmalıyız. Bu durum ise doğrudan adresleme ile gerçekleşir. Tek yapmamız gereken W kaydedici içeriğini INDF içerisine göndermektir. Yukarıdaki program RAM içerikleri silinmek için yazılmış olduğundan “clrf INDF” komutu kullanılmıştır. Eğer INDF kaydedici içeriğini okumuş olsaydık FSR kaydedicisinin işaret ettiği adresteki kaydedicisinin içerisindeki değeri okuyacaktık.

Şekil 3-36 : FSR kaydedicisine değer yüklemek.

Page 34: 3 PIC16F877A’nın ÖZELLİKLERİ

58 PIC Programlama Bilgi ve Deney Kitabı

Şekil 3-37 : INDF kaydedicisine değer yüklemek.

RAM Adreslerine Bank Değiştirerek Ulaşma İşlemi

İlk olarak bank değiştirmeye neden ihtiyaç duyduğumuzu inceleyelim. PIC assembly komutları makine diline çevrildiklerinde kaydediciler üzerinde yapılan işlemlerde RAM adreslerinin sadece 7 bit’lik kısımlarının 14 bit’lik komut içinde yer aldıkları görülür. Geri kalan 7 bit’in 1 bit’i sonucun kaydedileceği konumun W kaydedicisi mi yoksa F olarak da bilinen Dosya Kaydedicisi mi (File register veya RAM) olacağını belirler. Şekil 3.38’de komut kodu (Opcode) olarak gösterilmiş en yüksek değerlikli 6 bit’i komutun makine dilindeki karşılığıdır.

Şekil 3-38 : Byte üzerinde uygulanan komutlar.

Komut setinde RAM adresleri için 7 bit’lik yer bırakıldığı için program başlangıcında RAM adresleri tanımlanırken her ne kadar 8 bit’lik adres verilse de derleyici bunun sadece 7 bit’ini makine diline çevirecektir. Bu demek oluyor ki 7 bit ile en fazla 128 kaydediciyi adresleyebiliriz. Bank değiştirme işlemine ihtiyaç duymamızın sebebi budur. 128 bit’lik banklar halinde adreslenen RAM içerisinde bank değiştirme işlemi uygulamak için STATUS kaydedicisinin 5. ve 6. bit’i olan RP0 ve RP1 kullanılır. RP0 ve RP1, 512 bellek hücresini adresleyebilmemiz için gerekli diğer 2 bit’i bize sağlamaktadır.

Page 35: 3 PIC16F877A’nın ÖZELLİKLERİ

PIC 16F877A’nın Özellikleri 59

Şekil 3-39 : Doğrudan adresleme ile RAM adreslerine ulaşmak.

Örnek 3-6 : Bank Değiştirme.

........

.......... bcf STATUS,RP1 ; STATUS registerin RP1 bit’ini 0 yaparak bsf STATUS,RP0 ; STATUS register’inin RP0 bit’ini 1 yaparak ; Bank1’e geçtik. movlw b’11100111’ ; Önce W register’ına yüklediğimiz veriyi movwf TRISB ; TRISB içerisine kayıt edip bcf STATUS,RP1 ; STATUS registerin RP1 bit’ini 0 yaparak bcf STATUS,RP0 ; STATUS registerin RP1 bit’ini 0 yaparak ; tekrar Bank0’a döndük. ......... ........

RAM adreslerine ulaşmanın diğer bir yolu olan dolaylı adreslemede ise RAM kaydedicisinin tamamı 9 bit’le adreslenen hücrelerine ulaşmak için, FSR kaydedicisinin 8 bit’i dışında fazladan sadece 1 bit’e ihtiyacımız vardır. Bu bit ise yine STATUS kaydedicisinin içerisinde bulunan IRP bit’idir. Şekil 3.40’da görüldüğü gibi dolaylı adresleme ile Bank1’e ulaşmak için herhangi bir işlem yapmamıza gerek yoktur. Bank2 ve Bank3’e ulaşmak için ise sadece IRP bit’ini “1” yapmak yeterlidir.

Şekil 3-40 : Dolaylı adresleme ile RAM adreslerine ulaşmak.

Page 36: 3 PIC16F877A’nın ÖZELLİKLERİ

60 PIC Programlama Bilgi ve Deney Kitabı

W TRISB PORTB PORTA

L H

H

H

NOT: Pogram içerisinde daha kolay anlaşılır kodlar yazarak bank değiştirmenin kolay bir yolu da BANKSEL derleyici bildirisini kullanmaktır. Assembly derleyicisi banksel ile belirlenen portun bulunduğu bank’ı otomatik olarak bulacak ve o bank’a geçilmesini sağlayacaktır. Örneğin, örnek 3.6’da yazılan kodlar yerine örnek 3.7’de görüldüğü gibi TRISB’nin bulunduğu bank1’e geçmek için “BANKSEL TRISB” yazmak yeterli olacaktır. Aynı şekilde PORTB’nin bulunduğu bank0’a geçmek için de “BANKSEL PORTB” yazmak yeterli olacaktır.

Örnek 3-7 : BANKSEL Derleyici Bildirisi Kullanarak Bank Değiştirme.

........

.......... BANKSEL TRISB ; TRISB’nin bulunduğu bank1’e geç. movlw b’11010010’ ; Önce W register’ına yüklediğimiz veriyi movwf TRISB ; TRISB içerisine kayıt edip, PORTB’yi yönlendir. BANKSEL PORTB ; PORTB’nin bulunduğu Bank0’a dön. movf PORTA,W ; PORTA’yı oku ve W registere kaydet movwf PORTB ; W register içeriğini PORTB’den gönder. .......... ........

W kaydedicisi PIC16F877A’nın veri belleği alanında görülmeyen bir de 8-bit’lik W kaydedicisi vardır. W

kaydedicisi bir akümülatör veya geçici depolama alanı olarak düşünülebilir. W kaydedicisine diğer kaydedicilerde olduğu gibi hücre adresini kullanılarak direkt olarak ulaşmak mümkün değildir. Aslında W kaydedicisinin bir bellek adresi de yoktur. Komutun işlevi W kaydedicisi üzerindeyse adresi belirtilmeden ulaşılabilir. PIC'te gerçekleşen tüm aritmetik işlemler ve atama işlemleri için W kaydedicisi kullanılmak zorunluluğu vardır.

Şekil 3–41 : A) Sabit bir veriyi W kaydedicisine yazıp, portB’ye aktarmak. B) PortA’nın içeriğini W’ye yazıp, portB’ye aktarmak.

Örneğin, PORTA’dan okunan veriler PORTB’ye aktarılmak isteniyorsa PORTA’nın içeriği önce W

kaydedicisine aktarılır. Daha sonra da W’nin içeriği PORTB’ye aktarılır. Verdiğimiz bu örneği şekil 3.42’deki gibi şematik olarak gösterebiliriz.

Şekil 3–42 : TRISB ile yönlendirilmiş PORTB’ye, PORTA’dan alınan verilerin aktarılması.

0 Bit 7 1 0 0 1 6 1 1 1 1 5 0 1 1 0 4 1 0 0 1 3 0 1 1 0 2 0 0 0 1 1 1 1 1 1 Bit 0 0 1 1

W

PortA PortB

Oku Yaz

B8 bitlik sabit veri

PortB

Oku Yaz

A

W