Bölüm-4 Kütükler (Registers) ve Kesme Yordamları | ||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Durum Kütüğü (Status Register)Mikrodenetleyicinin çalışma durumunu kontrol etmek için kullanılan özel veri belleği alanlarına kütük veya kaydedici denir. Her mikrodenetleyicide çeşitli kütükler bulunur. PIC mikrodenetleyicilerinde de Genel Amaçlı Kütükler (General Purpose Registers) ve Özel İşlev Kütükleri (Special Function Registers) bulunur. Mikrodenetleyicinin kesme işlemlerini, matematiksel işlemlerini, zaman işlemlerini, veri yazma ve okuma işlemlerini kontrol etmek için kullanılan kütüklere Özel İşlev Kütükleri denir. Bunlardan başlıca en önemlileri şunlardır:
PIC mikrodenetleyicilerinde bu kütükler dört banktan oluşan veri belleğinde (Data Memory) yer alır.
Bank0: 00h-7Fh Durum kütüğü Bank0’da 03h, Bank1’de 83h, Bank2’de 103h ve Bank3’te 183h adreslerinde yer alır. Tercih kütüğü Bank1’de 81h ve Bank3’te 181h adreslerinde yer alır. Kesme kontrol kütüğü ise 0Bh, 8Bh, 10Bh ve 18Bh adresleri olmak üzere 4 bankta da yer alır. Kullanılacak mikrodenetleyicinin veri yapraklarından (datasheet) bellek adresleriyle ilgili ayrıntılı bilgi alınabilir. Durum kütüğü ALU’nun aritmetik işlem durumunu, RESET durumunu ve banklardan oluşan veri belleğinin banklarını seçmek için kullanılan 8 bitlik bir SFR kütüğüdür. (TO) ve (PD)bitleri yazılamaz bitlerdir. Mikrodenetleyicilerde önemli bir konu olan uyku modunda çalışma durumunu izlemek için kullanılırlar.
bit 7: IRP: Kaydedici Bank seçim biti (dolaylı adresleme için kullanılır) NOT: borrow için, polarite ters çevrilir. Çıkartma işlemi, ikinci operandın 2’ye göre tümleyeni alınmış hali toplanarak yapılır. RRF, RLF döndürme komutları için kaynak kütüğünün düşük ya da yüksek düzeyli bitinden biriyle yüklenir.
Kısaltmaların Anlamları Tercih Kütüğü (Option Register)Tercih kütüğü çeşitli kontrol bitlerini konfigüre etmek için kullanılan okunabilir ve yazılabilir 8 bitlik bir SFR kütüğüdür. Timer0 zaman sayacı kesmesi (TMR0) ve vardiya zamanlayıcısı (WDT-Watchdog Timer) için önölçekleyici (prescaler), harici INT kesmesi, Timer0 kesmesi ve PORTB için pull-up ayarlarını içerir.
bit 7 RBPU: PORTB Pull-up aktifleştirme biti
Kesme Kontrol KütüğüThe INTCON kütüğü okunabilir ve yazılabilir 8 bitlik bir SFR kütüğüdür. Kesme kaynaklarını kontrol etmek için kullanılır. PIC16F628A mikrodenetleyicisinin veri belleğinin Bank 0 bölgesinin 0Bh, Bank 1 bölgesinin 8Bh, Bank2 bölgesinin 10Bh ve Bank3 bölgesinin 18Bh adreslerinde yer alır.
bit 7: GIE: Evrensel kesme etkinleştirme biti Mikrodenetleyicide Temel KesmelerKesmeler bir programın daha önemli başka bir görevin yerine getirilmesi için kesilmesine izin veren bir mekanizmadır. Bu görevler mikrodenetleyicinin ilgili portuna bağlı bir butonun tetiklenmesi, portlarından birine bağlı bir sensörün aktif olması veya dâhili zaman sayacının önceden tanımlı bir değere ulaşması gibi işlemler olabilir. Kesmeler tarafından idare edilecek olaylar sadece donanım tasarımcılarının hayal gücüyle sınırlıdır. mikroC programında kesme işlemlerinin yürütülmesi için “void interrupt()” kesme hizmet programı yer alır. Mikrodenetleyicinin özelliğine bağlı olarak kullanılacak kesme işlemleri bu rutin içine yazılan kodlarla gerçekleştirilir. Kesme hizmet programı kendisini tetikleyen kesme tarafından belirtilmiş olan uygun işlemleri gerçekleştiren bir prosedürdür. Kesme Hizmet Programı aynı zamanda kesme işleyici veya kesme programı diye de adlandırılabilir. PIC 16F628A serisi mikrodenetleyicilerde 10 adet kesme kaynağı vardır. Başlıca kesmeler şunlardır:
PIC 16F628A’da kesmeler INTCON, PIE1 ve PIR1 kütükleriyle kontrol edilir ve izlenir. Bu bölümde Harici kesme, port değişim algılama kesmesi ve TMR0 kesmeleri açıklanacaktır. Diğer kesmeler bir sonraki bölümde açıklanacaktır. Şekil 4.1’de PIC16F628A mikrodenetleyicisi için kesmelerin nasıl işlediğini gösteren lojik şema resmedilmiştir.
Şekil-4.1 PIC16F628A'da kesme lojiği
Harici Kesme (RB0/INT)Harici kesme girişi B portunun 0'ıncı pinidir. B portunun 0'ıncı pini normal giriş çıkış olarak kullanılabileceği gibi kesme girişi olarak da kullanılır. Harici kesmenin çalışma ilkesi kısaca şu şekildedir: Bu girişde bir durum değişimi algılanırsa, yani eğer giriş 0 seviyesinde olup 1 seviyesine çıkarsa ya da tersi durumda, o an çalışan program durdurulur, harici kesme işlemiyle birlikte yürütülecek prosedür (program, hizmet, uygulama, işlem, vb.) gerçekleştirilir. İşlem gerçekleştirildikten sonra program kaldığı yerden devam ettirilir. PIC16F628A'da B portu için aşağıdaki komut yazılırsa, TRISB = 0x00; B portunun tüm pinleri (RB0 - RB7 numaralı toplam 8 pini) çıkış olarak ayarlanmış olur. Harici kesmenin kullanılabilmesi için öncelikle B0 pininin giriş olarak ayarlanması gerekir. Bunun için, TRISB = 0x01; Komutu verilir. Böylece B portunun RB0 pini giriş olarak ayarlanmış olur. Artık bundan sonra bu pine bağlanacak bir buton ya da algılayıcı yardımıyla, denetleyicinin çalıştırdığı program dışarıdan gelecek bir tetiklemeyle kesilebilir. Ancak harici kesmeyi aktif hale getirmek için bu işlem yeterli değildir. Bunun için aşağıdaki kodun da yazılması gerekir. INTCON.INTE = 1; //Harici kesme aktifleştirme biti 1 yapılarak harici kesme aktifleştirilir. Harici kesme aktif olduğunda INTCON kaydedicisinin INTF bayrağı 1 olur. Böylece harici kesme oluştuğu mikrodenetleyiciye bildirilir. TMR0 Zaman KesmesiTMR0 8 bitlik bir zaman sayacıdır. Sayaç değeri yazılabilir ya da okunabilir. Tüm mikrodenetleyicilerde bu özellik vardır. Daha önceden kurulan bir değer mikrodenetleyicinin çalışma frekansı hızıyla orantılı bir hızda 255 değerine kadar sayar. 255 değeri her aşıldığında INTCON kaydedicisinin T0IF bayrağı 1 olur. Ardından sayaç tekrar daha önce kurulmuş değerden başlayarak 255'e kadar sayar. Bu işlem sürekli olarak devam eder. Sayma işlemi her bittiğinde zaman sayacının yeniden kurulması ve T0IF bayrağının 0 yapılması gerekir. Zaman sayacının T0IF bayrağının 1 olduğu ana kadar geçen süre kontrol edilerek birbirinden bağımsız olarak çalışan zamana bağlı uygulamalar yapılabilir. Bu sayacın en güzel yanlarından biri de dâhili saat darbesinin yanında harici darbe girişiyle de kontrol edilebilmesidir. Böylece başka bir kaynağın hızına göre çalışan bir zaman sayacı tasarlayabilirsiniz. Zaman kesmesini kullanabilmek için; INTCON.T0IE = 1; kodu kullanılmalıdır. Ardından, TMR0 = 125; gibi TMR0 kaydedicisine 0-255 arası bir değer ataması yapılır. Program içinde INCON.T0IF bayrağının 1 olup olmadığı kontrol edilir. Eğer 1 ise ilgili işlem gerçekleştirilir ve T0IF bayrağı tekrar 0 yapılır. TMR0 kaydedicisine yeniden değer ataması yapılmalıdır. Aksi taktirde sayma işlemi 0'dan başlar. Sayma hızı mikrodenetleyicinin frekansına ya da harici tetikleme girişinin hızına bağlıdır. Vardiya Zamanlayıcısı (WDT-WatchDog Timer ve Uyku Modu)Tüm PIC mikrodenetleyicilerinin en önemli özelliklerinden biri de vardiya zamanlayıcısıdır. PIC mikrodenetleyicisi vardiya zamanlayıcısı (watchdog timer - WDT) olarak ayarlandığında dâhili bir RC osilatörü devreye girer. Bu osilatörün periyodik darbelerinin süresine göre mikrodenetleyiciye reset işlemi uygulanır ve program kodu baştan başlar. Genel olarak bu süre minimum 18 msn kadardır. WDT’nin kullanım amaçlarından birisi mikrodenetleyicinin çalışıp çalışmadığından emin olmak ve kilitlenme problemlerinin önüne geçmektir. Timer0 modülünün önölçekleyicisi kullanılarak bu süre uzatılabilir. 8 bitlik Timer0 modülüne sahip MCU’larda bu süre 128 katı kadar uzatılarak yaklaşık 2,3 sn’ye kadar çıkılabilir. Bu süre PIC16F887’de 268 sn ve PIC18F2550’de 131 sn olabilmektedir. Bu süreler, MCU’nun VDD beslemesindeki kararsızlıklar ya da değişimler ve dâhili RC osilatörünün (bazılarında 31 kHz LFINTOSC) ortam sıcaklığına bağlı kararsızlığı nedeniyle değişiklik gösterebilmektedir. Olumsuz koşullar altında genellikle hesap edilen sürenin üstüne çıkılmaktadır. Ana programın WDT reset süresinden daha uzun sürdüğü durumlarda vardiya zamanlayıcısının program içinde belli aralıklarla sıfırlanması istenebilir. WDT’nin sıfırlanması ya da resetlenmesi sonrası vardiya zamanlayıcısı süresi yeniden başlar. Toplam program süresinin hesaplanması için mikroC program editöründe hata ayıklayıcı (Debugger) kullanılabilir (Bkz. Şekil 2.10). Program kodu adım adım işletilerek programın nerelerinde WDT’nin sıfırlanacağı belirlenir. WDT’nin normal çalışma modundayken sıfırlanma işlemi CLRWDT Assembly komutuyla yapılır. MikroC program editöründe WDT’yi resetleyecek Assembly kodu yazmak için aşağıda gösterilen yazım tekniği kullanılabilir. asm CLRWDT; PIC mikrodenetleyicileri batarya ve pil gibi zamanla enerjisi biten kaynaklardan beslendiklerinde enerji tasarrufu büyük önem arz eder. PIC mikrodenetleyicileri sınıfına ve modeline bağlı olarak çok geniş bir güç yönetim ve osilatör tercihlerine sahiptir. İlgili kaydedicileri doğru ayarlamak suretiyle 10’larca hatta 100’lerce misle varan enerji tasarrufu sağlanabilir. PIC mikrodenetleyicileri sürekli olarak aktif durumda olmalarını gerektirmeyen ve enerji tasarrufunun önemli olduğu durumlarda uyku moduna (sleep mode) alınır. Uyku modunda mikrodenetleyicinin osilatör girişleri/çıkışları (OSI/OSO), harici saat darbesi girişi (T0CKI) ve eğer etkinse dâhili osilatörü kapatılır. Timer0 modülünün mikrodenetleyiciyi uyku modundan çıkartma özelliği yoktur. Bu nedenle, sistemin periyodik olarak uyanması istenen uyku modu uygulamalarında, Timer0 önölçekleyicisi WDT için tahsis edilir. Bunun için mikroC program editöründe Project→Edit Project penceresinde ilgili mikrodenetleyicinin vardiya zamanlayıcısı etkinleştirilir. Bu pencerede, mikrodenetleyicilerin çeşitli donanımsal özelliklerini ayarlamayı sağlayan ve CONFIGURATION WORD olarak adlandırılan CONFIG sözcüklerinin bitleri ayarlanır (Bkz. Ek-D3, Ek-E3 ve Ek-F3). Açılan pencerede Watchdog Timer yazılı alanda “Enabled” seçeneği seçildiğinde ve derleyici tekrar çalıştırıldığında WDT etkinleştirilmiş olur. Konfigürasyon sözcüğünde ilgili ayar yapıldıktan sonra OPTION ya da OPTION_REG kaydedicisinin PSA biti kurulur ve önölçekleyici WDT için ayarlanmış olur. Kısaca WDT;
Normal çalışma modunda reset işlemi sonrası mikrodenetleyicinin program sayıcısı (PC) 0000h adresine, diğer bir ifadeyle başlangıç adresine gider. Eğer uyku modunda çalışma durumu söz konusu ise PC+1 program adresine gidilir ve uyku modu komutunun verildiği adresten hemen sonraki program adımı işletilir. Uyku komutu da WDT zaman sayacını sıfırlar, ancak söylendiği gibi sistem bu durumda resetlenmez. Eğer WDT etkinken mikrodenetleyicinin uyku moduna alınması ve WDT’nin zaman aşımı sonrası uyanması isteniyorsa aşağıdaki Assembly kod bloğu kullanılabilir.
Dikkat edileceği gibi SLEEP komutunun ardından NOP (1 çevrim süresi kadar bekleme) komutu kullanılmıştır. SLEEP komutunun ardından NOP kullanımı tavsiye edilir. Böylece programın kaldığı adrese geri dönmesi öncesinde MCU’nun hazır hale gelmesi için bir bekleme yapılmış olur. Tablo 4.1’de vardiya zamanlayıcısının uyku modunda kullanımına örnek gösterilmiştir. Uygulamada PIC16F628A mikrodenetleyicisi kullanılmıştır. MCU’nun RA0 pinine bir LED bağlanmış ve LED’in vardiya zamanlayıcısı kullanılarak fasılalı yanıp sönmesi gerçekleştirilmiştir. Öncelikle proje editörü penceresinden WDT etkinleştirilmiştir. Program ilk başlatıldığında, OPTION kaydedicisi 0Fh değeriyle yüklenmiş ve böylece önölçekleyici WDT için tahsis edilmiştir. Ön ölçekleme değeri olarak 128 ayarlanmış ve 2,3 sn’lik reset süresi elde edilmiştir. Tablo 4.1 WDT'nin uyku modunda kullanımı
İlgili kaydedici ayarları yapıldıktan sonra RA0 pini lojik-1 yapılmakta ardından 250 msn’lik bir bekleme sonrası lojik-0 seviyesine çekilmektedir. Daha sonra Assembly kod bloğu açılarak “SLEEP” komutuyla mikrodenetleyici uyku moduna sokulmaktadır. Bu uygulama PROTEUS-ISIS®’te kuracağınız devrede çalıştırıldığı zaman “Simulation Log” penceresinde vardiya zamanlayıcısının 4,86 saniye aralıklarla zaman aşımına gittiği görülecektir. Eğer programınızdan, uyku moduna almayı sağlayan kod bloğunu çıkartıp yeni baştan derleyerek devrenizi çalıştırırsanız 2,30 sn’lik aralıklarla zaman aşımının gerçekleştiği görülür. SLEEP komutunun yerine CLRWDT komutunu yazacak olursanız zaman aşımları arasındaki sürenin 2,55 saniye olacağı görülecektir (program içindeki 250 msn’lik bekleme nedeniyle). Uyku modu ve normal çalışma modlarında mikrodenetleyicinin 4 MHz dâhili çalışma frekansı altında çektiği akım değerleri ölçülmüş ve aşağıdaki değerler gözlemlenmiştir:
Dikkat edileceği üzere uyku modunda çok daha az akım tüketimi vardır. Ancak mikrodenetleyicinin uyanma sırasındaki çektiği akım çok farklılık göstermektedir. Bu durum, iç donanımların besleme dengesine oturmasına kadar geçen süreyle ilgilidir. Bu gibi elektriksel özellikler ilgili mikrodenetleyicilerin “Elektriksel Özellikleri” başlığı altında açıklanmıştır. Ayrıca kullanılan ölçü aletinin hassasiyet kalitesi (yüksek hassasiyet gerektiren işlemlerde Fluke kullanımı tavsiye edilir) gibi durumlar da ölçüm değerlerinin farklı çıkmasına yol açabilir. Kesin tespit için nanoamper seviyesinde akım ölçümü yapabilen cihazlar kullanılmalıdır. Yeni nesil 8-bit mikrodenetleyicileriyle birlikte WWDT (Windowed Watch Dog Timer) denilen bir tasarım tanıtılmıştır. Bu tasarıma göre CLRWDT komutu yalnızca zaman-aşımı sırasında belli bir pencere içinde gerçekleşirse kabul edilir. PIC16(L)F18424-44 mikrodenetleyicisinde WWDT zaman aşımı süresi 1 msn – 256 sn arasında ayarlanabilmektedir. Bunun yanında klasik mikrodenetleyicilerden farklı olarak %12.5 - %100 arasında ayarlanabilen bir pencere genişliği vardır. Pencereli modda, CLRWDT komutu WDT periyodunun izin verilen penceresi içinde gerçekleşmelidir. Aksi durumda, bu pencere aralığı dışında gerçekleşen bir CLRWDT komutu pencere ihlâli durumunu tetikler ve aynı WWDT zaman aşımı resetinde olduğu gibi WWDT reseti gerçekleşmesine neden olur. Bu durum Şekil 4.2’de gösterilmiştir. Kısacası, WWDT resetinin kapatılması için CLRWDT komutunun şekilde gösterilen “Pencere Açık” yazılı süre içinde verilmesi gerekir.
Şekil-4.2 WWDT Resetinin gerçekleşmesi
PORTB <7-4> Değişim Algılama KesmesiPIC16F628A'nın B portunun 7,6,5 ve 4'üncü pinlerinin durum değişimini kontrol etmek için kullanılan bir kesmedir. Bu pinlerden herhangi birinde durum değişimi algılanırsa INTCON.RBIF bayrağı 1 olur. Bu kesmeyi kullanmak için; INTCON.RBIE = 1; kodu yazılmalıdır. Harici Kesme İle Kontrol Edilen Elektronik Rulet DevresiŞekil 4.3'teki devrede PIC16F628A ile yapılmış bir yürüyen ışık ve buzer devresi gösterilmiştir. Devrenin 5V düzgün DC ile çalışmasının sağlanması için 9V'luk pil beslemesi 5V'luk regülatör üzerinden yapılmıştır. Devrede 2 adet buton bulunmaktadır. Butonlardan biri devrenin resetlenmesi için diğeri ise INTCON kesme kütüğünün harici kesme izleyicisi INTE bitini kontrol etmek için kullanılan butondur. Böylece mikrodenetleyiciye harici kesme gönderilerek program nerede olursa olsun yarıda kesilerek kesme işlemi için tanımlanmış görevi yerine getirir. Görev tamamlandığında yarıda kesilen programa kaldığı yerden devam edilir.
Şekil-4.3 Harici kesme kontrollü Elektronik Rulet devresi
Dikkat edilirse LED denetleyici portlarına sıralı şekilde bağlanmamıştır. Bunun nedeni baskı devre uygulamasında çakışmaların en aza indirgenmesi ve devre boyutunun olabildiğince küçük bir alana sığmasını sağlamaktır. Şekil 4.4’te devrenin baskı devresi görülmektedir.
Şekil-4.4 Devrenin baskı yolları
Şekilden görüleceği üzere bu haliyle yalnızca iki yerden atlama yapılmıştır. Şekil 4.5’te aynı devrenin 3 boyutlu görüntüsü görülmektedir.
Şekil-4.5 Devrenin üç boyutlu görüntüsü
Tablo 4.2’de ve Tablo 4.3’te devre için yazılmış iki ayrı program kodu örneği gösterilmiştir. Belli bir tarama hızıyla A ve B portunun ilgili pinlerine bağlanmış LED'ler sırayla sürülür ve 6 numaralı RB0/INT harici kesme giriş bitine bağlı buton ile tarama durdurulur. Kesme butonuna basıldığında kesme rutini çalıştırılır. Kesme rutininde program belli bir süre bekletilir, bekleme süresi dolunca tarama işlemi kaldığı yerden devam eder. Programda mikroC’nin Ses (Sound) kütüphanesinden de yararlanılmıştır. Böylece istenilen frekansta ve belli bir süre aralığında ses sinyali uygulanabilmektedir. Tablo 4.2 Elektronik Rulet devresinde LED'lerin sıralı yanmasını sağlayan mikroC kodu
Programın rastgele çıkışlar üretmesi istendiğinde mikroC’nin Math kütüphanesinin rastgele sayı üreteci kullanılır. Bunun için bir sayı değişkeni (n) ayarlanır. Bu değişkenin değerine göre tohum değeri üreten ‘srand(n)’ fonksiyonu kullanılır. Bu fonksiyonun ürettiği tohum değerini kullanan ‘rand()’ fonksiyonu ile 0 – 32767 arasında rastgele bir sayı üretilir. Bu sayının 10’a göre modu alınırsa devremizde kullanılan 10 çıkış için 10 farklı değer elde edilmiş olur. Bu uygulamanın kodu Tablo 4.3’te gösterilmiştir. Ayrıca bu uygulamada harici kesme butonuna her basıldığında tarama süresi kademeli olarak azaltılmakta ve ses frekansı değiştirilmektedir. Bu işlemin kontrolü kesme rutini içinden yapılmaktadır. Bekleme süresinin tamsayı değişken değeriyle değiştirilmesi için MikcoC’nin ‘VDelay_ms()’ fonksiyonu kullanılmıştır. Tablo 4.3 Elektronik Rulet devresinde LED'lerin rastgele yanmasını sağlayan mikroC kodu
Zaman Ayarlı 4 Kanal Kontrol DevresiBu devrede 4 ayrı kanalın tek bir zaman kesmesi üzerinden bağımsız olarak kontrol edilmesi gösterilmiştir. Bu uygulamada Timer0, EXINT ve RB7:4 kesmeleri kullanılmıştır. RB7:4 pinlerinin her birine buton bağlanmıştır. Hangi kanalın butonu aktif olursa o kanala karşılık gelen çıkış hattı aktif yapılmaktadır. Çıkışın aktif olma durumu LED’ler ile izlenmektedir. Butonlar yerine hareket algılayıcısı takılarak kontrol işlemi harekete bağlı olarak yapılabilir. Her çıkış için birbirinden bağımsız zaman değeri tutulmaktadır. Bu işlem için TMR0 kaydedicisi kullanılmaktadır. Acil durumlar için, örneğin aynı anda tüm ışıkların yanması istendiği zaman harici kesme butonuna basılarak tüm kanallar aktif ya da pasif yapılabilmektedir. Dolayısıyla bu uygulamada mikrodenetleyicinin 3 önemli kesmesi de kullanılmıştır. Şekil 4.6’da PIC16F628A kullanılarak yapılmış bir uygulama devresi görülmektedir.
Şekil-4.6 Zaman ayarlı 4 kanallı kontrol devresi
Tablo 4.4’te yer alan program kodunda yine farklı bir teknik kullanılmıştır. “#define” tanımlamasıyla denetleyicinin portlarına isimler verilmiştir. Böylece program içinde bu isimler çağrılarak işlem yapılmaktadır. Port ve kesme ayarları “ayar()” prosedürü içinde yapılmaktadır. Kontrol edilecek her bir çıkışın ne kadar süreyle aktif kalacağı şu şekilde hesaplanmaktadır:
Öncelikle TMR0 kütüğü için osilatör kaynağı olarak neyin kullanıldığı belirlenir. Varsayılan olarak PIC’e bağlı dâhili osilatör kullanılır ve devremiz için bu 4 MHz’dir. PIC bu frekansın ¼’ünü kullanır. Dolayısıyla, OPTION_REG = 0X03; komutuyla Timer0 için önölçekleyici değeri 16 olarak ayarlanır. Bu Timer0 kesmesinin 16 kat yavaşlatılması anlamına gelir. Timer0’a 156 değeri yüklenir. Böylece başlangıç değeri 156 yapılmış olduğundan 256-156 = 100 saydıktan sonra kesme bayrağı 1 olur. Kısaca 1sn’lik bekleme süresini elde etmek için şu formülü kullanabiliriz:
Denklem 4.1
Burada ‘sayac’ değeri arzu ettiğimiz süreyi bulmak için kullanacağımız bir çarpan değeridir. Bu değer kadar sayan bir sayaç döngüsü yaparsak istenilen süreyi hesaplayabiliriz. 1sn’yi elde etmek için ‘sayac’ değeri 625 olarak hesaplanır. Süre = 100 x 16 x 625/1.000.000 = 1 sn olarak elde edilir. Her bir kat için ‘saniye’ isimli değişkenler vardır. Kaç saniye beklenmesi isteniyorsa ilgili değişkenler o değer kadar artırılır. İstenen değere ulaşıldığında sıfırlanırlar. Tablo 4.4 Zaman ayarlı 4 kanallı kontrol devresi mikroC kodu
Uygulamada kontrol işlemi LED’ler ile gösterilmiş olup, çıkışlara transistör ve röle bağlayarak zayıf akımla yüksek akımlı sistemlerin kumandası sağlanabilir (Bkz. Ek C-2). Harici Timer0 Saat Darbesi Girişiyle (T0CKI) Tetiklenen 7 Segment Göstergeli SaatTercih kütüğü olan OPTION_REG kaydedicisinin 5.biti aktif yapıldığında PIC mikrodenetleyicilerinin T0CKI girişi ile harici zaman tetiklemesi sağlanır. Kitapta kullanılan PIC mikrodenetleyicileri için T0CKI girişleri sırasıyla şu şekildedir:
Bazı durumlarda mikrodenetleyici için harici zaman kaynağının kullanılması istenir. Örneğin bir trafik sinyalizasyon sisteminde birden fazla mikrodenetleyicinin eşzamanlı olarak aynı frekansta çalışması istendiğinde, mikrodenetleyicilerden birinin OSCOUT hattından elde edilen frekans diğer MCU’lara beslenebilir. Ya da gerçek zaman frekansına dayalı uygulamalarda MCU’nun çekirdek frekansının kullanılması istenmeyebilir. MCU’nun yükünü hafifletmek ve doğru değeri sağlamak için iyi kalibre edilmiş harici saat darbesine ihtiyaç olunabilir. Bu bölümde 4 adet 7 segment gösterge kullanılarak bir saat devresi tasarlanmıştır. Bunun için çıkışı değil (NOT Gate) olan 7447 BCD-7segment sürücü entegresi ve 4 adet ortak anotlu gösterge kullanılmıştır. Mikrodenetleyici için gerekli saat darbesi RA4/T0CKI pini üzerinden harici olarak uygulanmıştır. Bu uygulamada 555 osilatör entegresi kullanılarak 2Hz frekansında kare dalga üreteci yapılmıştır. Frekansın 2Hz olarak seçilmesinin nedeni, Timer0 için süre hesabının yapıldığı Denklem 4.1’de 1 sn’lik zamanın elde edilmesidir. MCU’ya düşük frekanslı sinyal uygulandığı için 4 çarpan değeri uygulanmaz. Ayrıca düşük frekanslı zaman kesmesi sağlandığı için program içinde “sayac” isimli bir değişken yardımıyla ek bir geciktirmeye gerek olmamıştır. 1sn’lik değerin elde edilmesi için OPTION_REG kaydedicisinde önölçekleyici (prescaler) değeri 1:2 olacak şekilde ayarlanmıştır. Uygulama devresi Şekil 4.7’de gösterildiği gibidir.
Şekil-4.7 Harici saat darbeli 4 adet 7 segment göstergeli saat devresi
Kare dalga sinyalin çıkışı PROTEUS-ISIS® programının sunduğu dijital osiloskop ile izlenebilir. 555 kare dalga saat darbesi üreteci devresinde yer alan trimpot ile frekans ayarı yapılabilir. Böylece saat devresi için hassas zaman kalibrasyonu elle sağlanabilir. Devrede dakika ve saat değerlerini ayarlamak için RB4:7 portunun sahip olduğu durum değişim kesmesi kullanılmıştır. Böylece saat çalışırken istenildiği anda saat değeri ayarlanabilmektedir. Bu uygulama elektronik olarak 9 mm’lik 7 segment göstergeler için tasarlanmıştır. Eğer devrenizi uzak mesafeden de görülebilecek şekilde 100 mm’lik göstergelere göre tasarlamak isterseniz Şekil 4.8’de gösterilene benzer bir dönüşüm yapabilirsiniz. 100 mm’lik göstergeler 8-15 V aralığında çalışır ve dolayısıyla daha yüksek bir beslemeye ihtiyaç duyarlar. 5 V ile çalışan MCU devre kartına ikinci bir besleme kaynağı bağlamanız gerekir. Bu yüksek DC kaynağını 5 V’luk beslemeden ayrı olarak göstergelere sürmek için UDN2981 sürücü entegresi kullanılabilir. Örnek dönüşüm, ortak katot sürücüsü olan 7448 ve ortak katot göstergesi kullanılarak yapılmıştır. Ayrıca dikkat edildiği üzere, BC serisi TO-92 kılıflı transistör yerine TO-220 kılıflı daha yüksek akım sürme özelliğine sahip BDX53 transistörü kullanılmıştır.
Şekil-4.8 Yüksek güçlü 7 segment göstergenin sürülmesi
Tablo 4.5 Harici saat darbeli 4 adet 7 segment göstergeli saat devresinin mikroC kodu
Timer0 Kesmesiyle Servo Motor KumandasıMikrodenetleyiciler ile motor kumandasının anlatıldığı 3. Bölümde “Servo Motor Kumandası” başlığı altında servo motorun kumandasının nasıl yapıldığı anlatılmıştı. Bu kısımda Timer0 kesmesi kullanılarak daha kararlı çalışan bir uygulama gösterilmiştir. Uygulamada harici kesme girişine bağlı bir buton yardımıyla, butona her basışta servo motor sırasıyla CCW (Counter-Clock Wise) ve CW (Clock Wise) yönlerinde döndürülmektedir. Şekil 4.9’da örnek uygulama devresi gösterilmiştir.
Şekil-4.9 Servo motorun Timer0 kaydedicisi ile kontrol edilmesi
Tablo 4.6 Servo motorun Timer0 kaydedicisi ile kontrolünü sağlayan mikroC kodu
Yazılan kodun ilgili devrede çalıştırılması için dâhili OSC 4 MHz olarak ayarlanır. Bunun için mikroC program menüsünde Project --> Edit Project penceresinden INTOSC değeri seçilir ve mikrodenetleyicinin program belleğinin 2007h adresinde yer alan konfigürasyon sözcüğü (CONFIG) 2178h değerine ayarlanır. Böylece OSC saat darbesi çıkış (Clock Out) hattı RA6 pini ve OSC saat darbesi giriş (Clock In) hattı RA7 pini normal I/O portu olarak ayarlanmış olur (Ayrıntılı bilgi için bkz. Ek-D3). DİKKAT: PROTEUS-ISIS® ortamı ile gerçek uygulama ortamında OSC frekansları farklı çalışabilir. Ayrıca ayarladığınız konfigürasyon seçenekleri simülasyon ortamında gerçeklenmeyebilir. Simülasyon programında osilatör bağlamasanız ve OSC tercihi yapmasanız bile MCU “Edit Properties” üzerinden yaptığınız çalışma frekansını kabul eder. Dolayısıyla simülasyon ortamında yapılan zaman temelli uygulamalarda gerçek sonuç alınamaz. Zaman temelli uygulamalarınızı gerçek hayatta çalıştırmak istediğinizde bu durumu göz önünde bulundurmanız tavsiye edilir. Program kodunda “Delay_Cyc(x)” isimli mikroC fonksiyonu kullanılmıştır. Bu fonksiyonun içine yazılan “x” değeri 3-255 arasında olmalıdır. Fonksiyonun içine yazılan değer 10 ile çarpılır ve MCU’nun çevrim hızının bu değer kadar katı alınarak bekleme elde edilir. Örnekte dâhili OSC 4 MHz olarak ayarlandığından bir çevrim hızı 1 MHz (1 us)’dir. Bu uygulamada temel ilke, servo motoru kontrol etmek için kullanılan 20 msn’lik bekleme süresinin yaklaşık olarak elde edilmesidir. Timer0 kaydedicisi kullanılarak 20 msn’lik bekleme şu şekilde hesaplanır: Zaman = (256 – T0) * prescaler * 4 /FOSC Burada T0 değeri kurma değeridir ve bu uygulama için 178 olarak hesaplanmıştır. Önölçekleyici (prescaler) değeri OPTION_REG kaydedicisi yardımıyla 256 olarak ayarlanmıştır. Böylece, Zaman = (256 – 178) * 256 * 1*10-6 = 19.968x10-6s = 19,968 ms olarak yaklaşık 20 ms hesaplanır. Bundan sonra yapılması gereken servo motoru CW ve CCW yönlerinde döndürmeyi sağlayacak darbe genişliklerinin elde edilmesidir. Gerçek uygulamada kullanılan RS tip servo motor için CW değeri 2,4 ms, CCW değeri 0,7 ms olarak tespit edilmiştir. Bu nedenle program için ‘i’ ve ‘delay’ isimli değişkenlerle bu değerler ayarlanmaktadır. Timer0 zaman kesmesi “interrupt()” rutini ile izlenmektedir. Zaman kesmesi gerçekleştiğinde motorun döneceği yöne göre ‘i’ değişkeni 24 ya da 7 değerini almaktadır. Ardından bu değer 10 ile çarpılmakta ve “delay” değeri elde edilmektedir. Delay_Cyc fonksiyonuyla, elde edilen bu değerin 10 katı alınır. Sonuç olarak 2400 çevrimlik (cycle) ya da 700 çevrimlik darbe genişlikleri elde edilir. MCU’nun bir çevrimi 1us olduğundan 2,4 ms ya da 0,7 ms değerleri elde edilir. Harici kesme girişine bağlı butona basıldığında kesme rutini içinde harici kesme bayrağı kontrol edilir ve ‘start’ isimli değişkenin değeri terslenir. Böylece, servo motor tek butonla CW ve CCW yönlerinde hareket ettirilir. Timer0 Kesmesiyle PWM Üretimi ve AC Yük KumandasıDaha önce de kısaca bahsedilen Pulse Width Modulation kelimelerinin kısaltması olan PWM bir çeşit darbe modülasyonudur. Mikrodenetleyicili sistemlerde 5V’luk DC genliğin belli bir frekansta lojik-1 ve lojik-0 seviyelerinde değiştirilmesiyle elde edilir. Lojik-1 seviyesinin bir periyotluk sinyale oranı “duty cycle” olarak adlandırılır ve % oranıyla ifade edilir. Mikrodenetleyicilerde yaygın olarak bu yüzdelik oranı elde etmemizi sağlayan 8 bitlik bir kaydedici vardır ve 0-255 aralığında değeri değiştirilerek %0 - %100 arasında istenilen bir görev çevrimi elde edilir. Şekil 4.10’da farklı “duty cycle-görev çevrimi” oranları için kaydedicinin aldığı değerler gösterilmiştir.
Şekil-4.10 Farklı oranlarda PWM sinyalleri
AC Motor, solenoid yüklü AC aydınlatma elemanları ya da diğer solenoid yüklerin (DC motor, vb.) devirli kotrolü endüstriyel uygulamalarda sıkça karşılaşılan bir durumdur. Bu tür yüklerin mikrodenetleyiciler tarafından kumandasında çeşitli yazılımsal ve elektronik uygulama teknikleri mevcuttur. Bu uygulamada örnek olarak, 220V ACrms/50Hz şehir şebekesinde çalışan solenoid yüklü bir AC aydınlatma sisteminin Timer0 ile üretilen PWM tekniğiyle devirli kumandası gerçekleştirilmiştir. Bunun için BT012 triyak, MOC3021 optokuplör ile MCU üzerinden sürülmüştür. DİKKAT: AC yüklerin MCU’lar ile kumandasında karşılaşılacak riskler ve devre şemasının kurulumunda dikkat edilmesi gerekenler ile ilgili olarak Ek C-2 (Mikrodenetleyicilerde Anahtarlama Elemanlarının Kullanımı) başlığını mutlaka incelemeniz tavsiye edilir. Uygulama AC şebekenin trafo kullanılmadan doğrudan direnç ve köprü diyot grubu üzerinden çalıştırılmasını içermektedir. Dolayısıyla çalışma sırasında çok dikkatli olunmalıdır. Kullanıcı kaynaklı zararlar karşısında sorumluluk kullanıcıya aittir.
Şekil-4.11 Timer0 kesmesiyle PWM üretimi ve AC yük kumandası
AC yüklerin mikrodenetleyiciler ile kontrolünde sinüsoydal şebeke frekansından dolayı senkronizasyon işlemi yapılması gerekir. Şekil 4.11’deki uygulama devresine dikkat edileceği üzere iki adet optokuplör kullanılmıştır. MOC3021 optik triyaklı tetikleme bileşenidir ve triyak gibi AC yük sürme elemanlarını dijital devreler (MCU, vb.) üzerinden tetiklemek için kullanılır. 4N25 ise transistör çıkışlı optokuplördür ve dijital sistemleri tetiklemek için kullanılır. Senkronize AC yük kontrolünde “zero crossing – sıfır kesimi” denilen bir teknikten yararlanılır. Bilindiği üzere triyaklar “gate” ayaklarından tetiklendiklerinde AC gerilimin bir sonraki sıfıra gidişine kadar iletimde kalır. Yeniden iletime sokulması için kesime gittikten sonra tekrar tetiklenmesi gerekir. Selenoid yüklü AC lambalarda titreşim (flickering) olayının oluşmaması için mikrodenetleyicinin AC sinyalin sıfır noktalarını referans alarak tetikleme işlemini yapması gerekir. Bunun için AC şebeke gerilimi dirençler üzerinden düşürülmüş ve 1N4007 diyot grubuyla yapılmış bir köprü doğrultma devresine uygulanmıştır. Doğrultulan gerilim 4N25 optokuplöre uygulanır ve optokuplör çıkışı PIC16F628A’nın harici kesme girişi RB0/INT pinine yükselen kenar tetiklemesi modunda verilir. Sonuçta Şekil 4.12’deki gibi bir kontrol diyagramı elde edilmiştir.
Şekil-4.12 0o ve 180o'lerde zero crossing darbesi
Yazılımsal olarak harici kesmenin oluştuğu anlar kontrol edilir. Triyakın ne kadar süre sonra tetiklenmesi Timer0 kesmesiyle elde edilen zaman diyagramına bağlı olarak gerçekleştirilir. Bunun için tetiklemesi yapılacak AC şebekenin frekansının ve buna bağlı periyodunun da hesaba katılması gerekir. 50 Hz şehir şebekesinin tam bir periyodu = 1/50 = 20 ms’dir. Tam dalga doğrultma yapılmış olup her bir alternansın periyodu 10ms kadardır. Yazılımsal olarak öncelikle PWM skalası 0-100 aralığında olacak şekilde belirlenmiştir. Ardından 0.1 msn’lik zaman kesmesi periyodunda PWM genişliğinin 0-100 aralığında artırılıp azaltılmasıyla 0-10 ms arasında değişen genişlikte bir tetikleme sinyali elde edilmiş olur. Skalayı genişletmek suretiyle daha yüksek çözünürlükte bir PWM aralığı elde etmeniz mümkündür. Ancak bu durumda Timer0 kesmesinin kesme periyodunu yeniden ayarlamanız gerekir. Dikkat edileceği üzere bu uygulamada PWM darbesi, triyakın iletime geçirilmek istenen süre sonrasında üretilmektedir. Gerçekte istenen süre sonrası PWM darbesi üretildiğinde artık darbenin birsonraki zero-crossing noktasına kadar lojik-1 seviyesinde tutulmasına gerek yoktur. Ancak bu şekilde yapılmasının sebebi aynı anda LED üzerinden de PWM durumunu görebilmektir. Ayrıca üretilen PWM darbesinin kesilmesi için tam 10 msn’lik sürenin tamamlanması beklenmemektedir. %10’luk bir koruma payı bırakılarak triyakın kontrolümüz dışında iletime girmesi engellenmektedir. Tablo 4.7 Timer0 kesmesiyle PWM üretimi ve AC yük kumandası devresi mikroC kodu
Bu uygulamada görüldüğü üzere AC sinyalin kesim noktalarının tespit edilebilmesi için harici olarak iki farklı optokuplör kullanılması gerekmiştir. Yeni nesil PIC16(L)F18424-44 ve PIC18F24-25Q10 8-bitlik mikrodenetleyicilerde bu özelliğe dâhili olarak yer verilmiştir (DS40002000A veri kılavuzu sayfa 395 ve DS40001945B veri kılavuzu sayfa 374). Para Okuyucu Kullanarak Otomat TasarımıBu uygulamada, piyasada çeşitli tiplerde bozuk paralarla çalışan otomatların kontrol devresinin nasıl tasarlandığı gösterilecektir. Piyasada MCU kullanılarak tasarlanan bu cihazların pek çoğunda 8 bacaklı PIC12F675 giriş seviyesi mikrodenetleyicisi kullanılmaktadır. Bu MCU’da aktif olarak kullanılabilen 6 I/O hattı bulunmaktadır. A, B, C, vb. isimlendirmelerle gösterilecek sayıda portu olmadığından portların kumandası için kullanılan kaydedicileri de diğer MCU’lardan farklı olarak isimlendirilmiştir. Portun I/O hatlarının giriş/çıkış kontrolü TRISIO kaydedicisiyle, porta bilgi gönderilmesi ise GPIO kaydedicisiyle yapılmaktadır. Şekil 4.13’te PIC12F675 kullanılarak tasarlanmış bir OTOMAT cihazı kumanda devresi gösterilmiştir. Para okuyucuya bozuk para atıldığında sistem çalışmaya başlar. Haznenin içinde yer alan topları düşürmeyi sağlayan mekanizma, DC motor sürücü devresiyle kumanda edilen motor ile çalıştırılır. Bu sırada bir adet top QRD1114 optik sensörünün yer aldığı hazneye düşer ve motor durdurulur. Para okuyucunun sinyal çıkış hattı 7400 VEDEĞİL entegresinin kapı girişlerinden birine bağlanır. Devrede bu durum SWITCH elemanıyla gösterilmiştir. PROTEUS-ISIS® programında durumu canlandırmak için QRD1114 sensörünün 220 Ω direnç hattına anahtar bağlanmıştır. Gerçek uygulamada 220 Ω direnç doğrudan 5 V besleme hattına bağlanacaktır. Uygulama programında Timer0 kaydedicisi ile zaman sayacı da bulunmaktadır. Haznede top bitmiş olması durumunda motorun boş yere dönmemesi için yaklaşık 10sn’lik bir zaman beklemesi yapılmıştır. Süre dolunca motor durdurulmaktadır. Ayrıca, sensörün bulunduğu alanda top olması durumunda da motor yeniden çalıştırılmamaktadır. Bir diğer ifadeyle eğer daha önceden herhangi bir sebepten dolayı sensörün algılama yapmasına neden olan bir cisim varsa sistem çalışmaz. Tablo 4.8’de uygulama programı gösterilmiştir.
Şekil-4.13 Para okuyuculu OTOMAT cihazı kumanda devresi
PIC12F675 mikrodenetleyicisinde tüm port hatlarının “Interrupt-On-Change” özelliği bulunmaktadır. Bu özellik yardımıyla girişlerde oluşan değişim durumu algılanabilmektedir. Bu durum PIC16F628A’nın RB4:7 kesmesine benzemektedir. Topun algılanması durumu bu değişim algılama kesmesiyle denetlenmektedir. Bu işlemin aktif olabilmesi için IOC isimli kaydedicinin ilgili port hattının lojik-1 yapılması gerekir. Para okuyucuya para atılması durumu ise harici kesme girişi özelliğine sahip olan GP2 piniyle izlenmektedir. Bu MCU analog/dijital dönüştürme özelliğine sahip olduğundan program içinde ANSEL kaydedicisi ile analog modülünün kapatılması ve giriş/çıkışların dijital I/O olarak ayarlanması gerekir. Analog işlemlerle ilgili ayrıntılı bilgi için 7.bölüme bakınız. Para okuyucu donanımı internet üzerinden satın alabileceğiniz bir donanımdır (Bkz. Şekil 4.14). Farklı modelleri mevcuttur ve genellikle 12 V besleme altında çalışırlar. Para haznesinden içindeki örnek paraya eş para atıldığında kısa süreli kısa devre durumu oluşturanlar olduğu gibi voltaj çıkışı veren modelleri de vardır. Örnek uygulamada algılama sırasında çıkışı kısa devre olan bir model kullanılmıştır.
Şekil-4.14 Örnek bir bozuk para algılayıcısı
Tablo 4.8 Para okuyuculu OTOMAT cihazı kumanda devresi için mikroC kodu
Bu uygulamayla birlikte ilk kez görülen bazı kaydediciler bulunmaktadır. Bu bölüm kapsamına giren kaydediciler şunlardır:
GPIO KAYDEDİCİSİ (ADRES: 05h) – Genel amaçlı giriş/çıkış port kaydedicisidir. Bu kaydedici 6 bit genişliğinde, çift yönlü bir porttur. Portların giriş ya da çıkış olması TRISIO kaydedicisi ile belirlenir. İlgili TRISIO biti lojik-1 yapıldığında karşılık gelen pin giriş, lojik-0 yapıldığında çıkış olur. GP3 pini yalnızca giriş olarak kullanılabilir. Bu nedenle GP3 pininin TRISIO biti her zaman ‘1’ olarak okunur. Portlara veri yazılması karşılık gelen portun tutma belleğine (LATCH) yazma işlemi gerçekleşmesi demektir. Dolayısıyla porta veri yazılması işlemi aynı zamanda bir okuma işlemidir. Master Clear hattının da olduğu GP3 pininde MCLREN = 1 olduğunda lojik-0 değeri okunur. Proje editörü penceresinde (Edit Project) “GP3/MCLR pin function select” tercihi “Enabled” yapılırsa GP3 pini reset olarak kullanılmış olur.
TRISIO KAYDEDİCİSİ (ADRES: 85h) – Giriş/çıkış portlarının yönünü belirlemekte kullanılan kaydedicidir. Dijital elektronikte Tri-State deyiminden gelmektedir. Bir giriş/çıkış hattını yüksek empedans durumuna sokma kabiliyeti olan lojik sistemler için kullanılan bir deyimdir. TRISIO ile giriş yapılan bir portun devrenin diğer katlarına etkisi yüksek empedans durumu sayesinde azaltılır.
WPU KAYDEDİCİSİ (ADRES: 95h) – Weak Pull-Up kaydedicisidir. Bireysel olarak GP3 pini hariç diğer pinler için dâhili pull-up’lar etkinleştirilebilir ya da pasifleştirilebilir. OPTION kaydedicisindeki pull-up etkinleştirme bitinden farklı olarak, bu kaydedici ile her bir port tek tek kontrol edilebilir. Bu kaydediciyi kullanabilmek için OPTION kaydedicisindeki (GPPU) ̅ bitinin etkinleştirilmesi gerekir. Kaydedicideki ilgili bit lojik-1 yapıldığında pull-up etkin, lojik-0 yapıldığında pull-up pasif olur. Eğer bir pin TRISIO kaydedicisi ile çıkış olarak ayarlanmışsa (lojik-0), pull-up’lar otomatik olarak pasifleştirilir.
IOC KAYDEDİCİSİ (ADRES: 96h) – Interrupt-On-Change kaydedicisidir. Portun pinlerindeki durum değişimlerini algılamayı sağlayan bir kesme kaydedicisidir. PIC12F675 için tüm portların durum değişim kesmesi vardır. Bağımsız olarak her bir pin için IOC kesmesinin etkinleştirilmesi için öncelikle INTCON kaydedicisindeki GPIE bitinin kurulması (set edilmesi) gerekir. IOC kesmesi aktif edildiğinde portun bir önceki kaydedilen değeri güncel olanla karşılaştırılır. Fark varsa (mismatch) INTCON kaydedicisindeki GPIF bayrağı lojik-1 olur. İlgili GPIO pininden okuma yapıldığında ya da ilgili pine bilgi yazıldığında, eşleşmeme durumu ortadan kalkar ve GPIF bayrağı temizlenir. Ancak her ihtimale karşın, kesme oluştuktan sonra yazılım içinde bayrak bitinin temizlenmesinde fayda vardır. Bu kesme de harici kesme gibi cihazı uyku modundan çıkartma özelliğine sahiptir.
|