Bölüm-5 İleri Kesme Uygulamaları ve Diğer Zamanlayıcı Modülleri | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
PIE1 ve PIR1 KaydedicileriBu başlık altında temel kesme uygulamaları kapsamında anlatılmış olan Timer0 modülünden farklı olarak diğer zamanlayıcı modülleri (Timer1, Timer2 ve Timer3) ve kesme uygulamalarından bahsedilecektir. Bu zamanlayıcı modülleri çevresel aygıt arayüzü (peripheral interface) olarak değerlendirildiklerinden onların kontrolü için ayrı kaydediciler vardır. Genel olarak Timer1 ve Timer2 modülleri PIE1 kaydedicisi ile etkinleştirilip, kesme kontrolü de PIR1 kaydedicisi ile yapılırken, Timer3 modülü PIE2 ve kesme kontrolü de PIR2 kaydedicisi üzerinden sağlanır. Hafıza elemanları, seri haberleşme aygıtları, analog/dijital-dijital/analog dönüştürücüler, harici osilatör ve darbe üreteçleri, vb. çeşitli çevresel aygıtlardan oluşacak kesme işlemlerinin etkinleştirilmesi ve izlenmesi için bu kaydedicilerden faydalanılır. PIC12F675, PIC16F628A, PIC16F887, PIC18F2550 gibi pek çok PIC ailesi MCU’da PIE1 ve PIR1 kaydedicileri bulunmaktadır. Bu kaydediciler MCU’nun yapısına bağlı olarak farklı özelliklere sahip olmakla birlikte, genel olarak çevresel aygıtlarla ilgili işlevleri yerine getirmek için kullanılmaktadır. PIC16F887 ve PIC18F2550 gibi çok işlevli mikrodenetleyicilerde bu kaydedicilerden ikişer adet bulunmaktadır. Bu bölümde temel olarak PIC16F628A MCU’sunun PIE1 ve PIR1 kaydedicileri açıklanacaktır. Timer3 modülü ise PIC18F2550 mikrodenetleyicisi referans alınarak açıklanacaktır. Kaydedicilerde yer alan bitlerin sıralamaları değişmekle birlikte, diğer MCU’larda da aynı işlevlere sahiptirler. PIE1 KAYDEDİCİSİ (ADRES: 8Ch) – Çeşitli çevresel aygıt kesmelerinin etkinleştirilmesini sağlayan bitlerin tutulduğu kaydedicidir.
bit 7 EEIE: EEPROM yazma işlemi tamamlandı kesmesi etkinleştirme biti Görüldüğü üzere PIE1 kaydedicisi, INTCON kaydedicisinin dışında kalan kesme işlemlerinin etkinleştirilmesi için kullanılır. PIR1 KAYDEDİCİSİ (ADRES: 0Ch) – Çeşitli çevresel aygıt kesmelerinin aktif hale gelip gelmediğini bildiren bayrak bitlerinin tutulduğu kaydedicidir.
bit 7 EEIF: EEPROM yazma işlemi tamamlandı kesmesi bayrak biti Görüldüğü üzere PIR1 kaydedicisi, INTCON kaydedicisinin dışında kalan kesme işlemlerinin durumunun izlenmesi için kullanılır. Timer1 Modülü ve Timer1 KesmesiPek çok 8 bit mikrodenetleyicide 16 bit değerinde bir Timer1 modülü bulunur. 16 bitlik Timer1 modülü PIC mikrodenetleyicilerde zamanlayıcı/sayıcı olarak kullanılmaktadır. TMR1H ve TMR1L olarak adlandırılan 8 bitlik iki ayrı kaydediciden oluşur. Timer1 modülünün Timer0 modülünden en önemli farkı yalnızca 16 bitlik olması değildir. Timer1 modülü yardımıyla gerçek zaman saati uygulamaları yapılabilir. Ayrıca MCU’nun düşük güç tüketimi sağlayan uyku modunda (SLEEP) çalışması istenen durumlarda, Timer1 kesmesi MCU’yu uyku modundan uyandırma özelliğine sahiptir. Bunun yanında Timer1 gibi zamanlayıcıların en önemli özelliği, mikrodenetleyicinin çevresel aygıtlardan gelen sinyalleri izlemesini sağlamaktır. Şekil 5.1’de gösterilen kaydediciler yardımıyla 216-1 = 65535 değerine kadar sayma işlemi gerçekleştirilebilir. MCU’yu uyku modundan uyandırma özelliğine sahip kesmelerden biri de Timer1 kesmesidir. Program içinde 0-65535 arasında bir değere kurulan TMR1 değeri maksimum değere ulaştığında PIR1 kaydedicisinin TMR1IF bayrağı ‘1’ olur. Bu durumda, eğer mikrodenetleyici düşük güç tüketimi için uyku moduna sokulmuşsa uyku modundan çıkar ve normal güç tüketimi gerçekleşir.
Şekil-5.1 16-bit Timer1 modülünün 8 bitlik kaydedicileri
T1CON: TIMER1 KONTROL KAYDEDİCİSİ (ADRES: 10h – PIC16F628A)
bit 7-6 Kullanılmıyor: '0' olarak okunur. Timer1 osilatör modunda çalıştırılacağı zaman T1OSI (giriş) ve T1OSO (aplifikatör çıkışı) pinleri arasına kristal osilatör bağlanabilir. Bu şekilde çalıştırılacak osilatörün en büyük avantajı MCU’nun uyku modunda olması durumunda da çalışmaya devam edecek olmasıdır. Bu pinlere bağlanacak düşük güç (Low Power-LP) ve düşük frekans (maks. 200kHz) bir kristal osilatör ile gerçek zaman saati uygulamaları yapılabilir. Şekil 5.2’de Timer1 harici OSC bağlantısına sahip bir PIC mikrodenetleyicisi için 32,768 kHz kol saati kristalinin bağlantısı gösterilmiştir.
Şekil-5.2 Timer1 modülünün harici düşük güç kristal ile osilatör modunda çalıştırılması
Mikrodenetleyici uyku modunda çalışıyorken uyku modundan çıkartılması istenen durumlarda osilatör modundan faydalanılır. T1OSO ve T1OSI girişlerine bağlanacak ikinci bir osilatör ile ya da harici saat darbesi kaynağı ile MCU’yu uyandıracak kesme elde edilebilir. Tablo 5.1 Timer1 modülünün osilatör modu için düşük güç kristallerin seçimi
bit 2 T1SYNC: Timer1 harici saat darbesi girişi senkronizasyon kontrol bitidir. TMR1CS = 1 olması durumunda, 1 = Harici saat darbesi girişi senkronize edilmez. MCU’nun uyku modunda çalıştırılması ve harici osilatör kaynağı yardımıyla uyku modundan çıkartılması isteniyorsa bu bit ‘1’ yapılmalıdır. Böylece MCU’nun kendi osilatörüyle bir bağ kurulmamış olur. 0 = Harici saat darbesi girişi senkronize edilir.TMR1CS = 0 olması durumunda bu bitin değeri dikkate alınmaz. Bu bit ‘0’ yapıldığında harici saat darbesi girişi MCU dâhili saat darbesiyle senkronize edilir. Bu durumda zamanlayıcının TMR1 kaydedicisi MCU uyku modundayken artış göstermez. bit 1 TMR1CS: Timer1 saat darbesi kaynağı seçim bitidir.1 = RB6/T1OSO/T1CKI pini üzerinden harici saat darbesidir (yükselen kenar tetiklemeli). Sayıcı (counter) modunda çalışma yapılacaksa bu bit ‘1’ yapılır. Eğer T1OSCEN biti ‘1’ ise bu durumda Timer1 kaydedicisinin değeri, RB7/T1OSI girişine bağlı harici osilatörün her yükselen saat darbesinde artar. T1OSCEN biti ‘0’ ise bu durumda Timer1 kaydedicisinin değeri, RB6/T1OSO/T1CKI pinine dışarıdan uygulanan bir osilatör frekasının yükselen saat darbelerine göre artar. Giriş sinyalinin yükselen kenarında sayma işleminin başlaması için, öncesinde en az bir düşen kenar değişiminin sağlanmış olması gerekir (Bkz. Şekil 5.3). Sayıcı modu örnek olarak, yüksek devirli motorların devrinin tespit eidlmesinde oldukça sağlıklı sonuç verir.
Şekil-5.3 Timer1'in sayıcı modunda sayma işleminin başlaması (harici kaynaklı ve dâhili işlemci frekanslı çalışma)
0 = Dâhili saat darbesidir (FOSC/4).bit 0 TMR1ON: Timer1 etkinleştirme bitidir. 1 = Timer1 etkinleştirilir. 0 = Timer1 durdurulur. Timer1 kaydedicisi ile süre hesabı şu şekilde gerçekleştirilir: Eğer MCU’nun kendi çalışma osilatörü kullanılıyorsa;
Denklem 5.1
eğer düşük frekanslı harici bir kristal osilatör ya da saat darbesi kaynağı kullanılıyorsa;
Denklem 5.2
şeklinde hesaplanır. Dikkat edileceği üzere ikincil düşük frekans osilatör girişi kullanıldığında frekans değeri 4’e bölünmemektedir. Bu durumda düşük frekans osilatör olarak 32,768 kHz kol saati kristali kullanıldığında, ön ölçekleme değeri 1:1 olarak ayarlandığında ve TMR1H = 0x80 (128), TMR1L = 0x00 olarak kurulduğunda;
olarak gerçek zaman gecikmesi elde edilir. 2’li ve 16’lı sayı sistemleri hakkında bilgi almak için Ek-A8’e bakınız.
Tablo 5.2 TMR1 kaydedicisine yüklenen değerin desimal karşılığı
Şekil 5.4’te TMR1 kaydedicisini ve TMR1 kesmesini kullanan bir alarm-ikaz devresi gösterilmiştir. Devre okullarda bulunan acil durum kapılarının amacı dışında kullanımını önlemeye yönelik olarak geliştirilmiş bir alarm devresidir. Mikrodenetleyici dâhili 4 MHz osilatörüyle çalıştırılmaktadır. Timer1 kesmesi kullanılarak, mikrodenetleyicinin harici zamanlayıcı girişine bağlanmış 32768 Hz’lik kristal yardımıyla gerçek zamanlı olarak çalışması sağlanmaktadır. Gerçek zaman sayacı (Real Time Counter-RTC) özellikle hassas saat ve zamana dayalı uygulamalarda tercih edilen bir donanımdır. Pek çok MCU’nun sahip olduğu Timer1 ClockIn girişiyle bu tür uygulamalar yapılabilmektedir. Kol saatlerinin içinde de kullanılan 32,768 KHz’lik kristal yardımıyla bu işlem sağlanır. Şekildeki devrede iki adet besleme kaynağı kullanılmıştır. MCU’nun stabil çalışması için 3V’luk bir lityum ion pil (CR2032 saat pil) ve alarm devresinin sürülmesi için de 9V’luk bir kaynak kullanılmıştır. Devre tamamen pille çalışmakta olup, MCU’nun kesme algılaması gerçekleşmediği sürede minimum enerji tüketimiyle çalışması için assembly koduyla uyku moduna sokulması sağlanmıştır. MCU’nun program kodunun düşük voltajlarda da düzgün çalışmasını sağlamak için Voltaj düşmesi kesmesi (Brown-out Reset) devre dışı bırakılmıştır (Project-->Edit Project – Brown-out Detect Disabled).
Şekil-5.4 Alarm-ikaz devresi açık şeması
Düşük güç tüketimi sağlanması için MCU uyku modunda çalıştırılmaktadır. Bu işlem bir assembly komutu olan “sleep” komutuyla yapılır. MikroC’de assembly kodu yazmak için “asm{ }” komutu kullanılır. Reed röle’nin karşısına denk gelen mıknatıs alarm devresinden ayrıldığında (kapı açıldığında), harici kesme algılanmakta ve alarm devresi çalışmaktadır. Bu durumda MCU uyku modundan çıkar. Alarm devreye girdiğinde belli bir süre çalışır ve MCU tekrar uyku moduna girer. Alarmın ne kadar süre çalacağı 2’li dip anahtarı (DIP SWITCH) ile ayarlanmaktadır. 22 = 4 farklı zaman kurma değerimiz vardır. Harici kesme dışında Timer1 kesmesi ile de MCU uyku modundan uyandırılmakta ve mavi LED kısa süreli olarak yakılıp söndürülmektedir. Ardından MCU tekrar uyku moduna girer. Böylece alarm-ikaz devresinin çalıştığı fasılalı olarak dış ortama gösterilmiş olur. Tablo 5.3 Timer1 kesmesini kullanan alarm-ikaz devresi mikroC kodu
Program kodu incelendiğinde TMR1 kaydedicisinin 0 olarak yüklendiği görülür. Ön ölçekleme değeri 8 olarak ayarlandığından TMR1IF bayrağının ‘1’ olması için geçecek minimum süre 16 sn olarak ayarlanmış olur. Bu durumda MCU uyku modundan çıkar ve Mavi LED ile fasılalı olarak sinyal verilir. Harici kesme girişinden tetikleme gerçekleştiğinde MCU tekrar uyku modundan çıkar ve ‘ikaz_biti’ değişkeni Lojik-1 yapılır ve ikili dip anahtarının konumuna göre ilgili alarm prosedürü çağrılır. Bu süre zarfında TMR1IF kesmesi her gerçekleştiğinde ‘zaman’ isimli değişken birer artırılır. İstenilen frekansta ve fasıla süresinde sesli ikaz verdirmek için mikroC programının “Sound” kütüphanesi kullanılır. “Sound_Init(&PORTB, 3)” komutuyla B portunun 3 numaralı pini ses çıkışı olarak kullanılır. “Sound_Play(1000, 50)” komutuyla da 1 kHz’lik ve 50 ms fasılalı sinyal üretilir. Şekil 5.5’te PROTEUS ARES yazılımında tasarlanmış baskı devre şeması ve malzeme yerleşim görüntüsü gösterilmiştir.
Şekil-5.5 Alarm-ikaz devresinin malzeme yerleşim ve PCB yol görüntüsü
ÖNEMLİ: Kitap içinde anlatılan PIC12F675, PIC16F628A ve PIC18F2550/4550 mikrodenetleyicilerinin Timer1 modülü ile ilgili düzeltmenin yayınlandığı bir Errata dökümanı bulunur (DS80329B). Üretici firma tarafından bu tür düzeltmeler ayrıca ilgili mikrodenetleyicinin veri kılavuzunda ayrı bir “Silicon Errata” başlığı altında yayınlanır. Timer1 başlatıldığında ya da güncellendiğinde, zamanlayıcının harici saat darbesi kaynağından, bir yükselen kenarın sayıcının değerini artırmasından önce bir düşen kenar görmesi gerektiği söylenmişti. Eğer harici saat darbesi kaynağı hâla yüksek seviyedeyken TMR1H ve TMR1L kaydedicilerine yazma işlemi tamamlanmamışsa, Timer1 güncellemeden sonraki ilk darbeyi saymayı kaçırır. Harici bir krital kullanılırken, yükselen kenardan düşen kenara kadar geçen darbe genişliği sıcaklığa bağlı olarak değişebiliir. Sonuç olarak, zamanlayıcı taşma için ek bir süre gerektirebilir. Tablo 5.3’teki kod örneğinin kesme yordamı altında assembly komutuyla, Timer1 alçak baytının 0 olana kadar döndürülmesi gösterilmiştir. Ardından Timer1 modülü kapatılıp tekrar açılarak güncellenmiştir. Böylece Timer1 modülünün doğru zamanlamayla sayabilmesi garanti edilmiştir. Tablo 5.4’te Errata verikılavuzu doğrultusunda yapılan düzeltmeyle birlikte Timer1 RTC kristal osilatörünün kullanılmasıyla 1 sn’nin elde edilmesi ve saat uygulamasının gerçekleştirilmesi PIC18F2550 üzerinden gösterilmiştir. Tablo 5.4 Errata kılavuzu kapsamında yapılan düzeltme
Timer2 Modülü ve Timer2 KesmesiTimer2 modülü de diğer zamanlayıcılar gibi zamanlayıcı/sayıcı olarak çalışan bir modüldür. 8-bit uzunluğunda TMR2 ve PR2 adında iki kaydedicisi vardır. Diğer zamanlayıcı/sayıcı modüllerinden farklı olarak önölçekleyici yanında son ölçekleyicisi (postscaler) vardır. Timer2 modülünün sahip olduğu özellikler şu şekilde maddelenebilir:
İlk ve son ölçekleyicileri en yüksek değerlerine ayarlandığında, taşma süresi 16-bit bir zamanlayıcının ki gibi olur. TMR2 ve PR2 kaydedicilerinin her ikisi de program içinde yazılabilir ve okunabilir kaydedicilerdir. TMR2 kaydedicisi cihaz resetlendiğinde (WDT, POR, (MCLR) ̅ ya da BOR reseti durumunda) 0x00 değeriyle, PR2 kaydedicisi ise 0xFF değeriyle yüklenir. TMR2 kaydedicisi “ilk sayma değerini” (saymaya başlanan ilk değer) tutan, PR2 kaydedicisi ise “son sayma değerini” (ulaşmak istediğimiz en yüksek değer) tutan kaydedicidir. TMR2 kaydedicisinin içeriği Timer2 kaydedicisinin çalışmasıyla birlikte, mikrodenetleyicinin çalışma frekansının her yükselen kenarında artmaya başlar. Her artışta PR2 kaydedicisinin içeriğiyle karşılaştırılır. İki değer eşleştiğinde, karşılaştırıcı bir eşleşme sinyali üretir. Bir sonraki çevrimde TMR2 kaydedicisinin içeriği 0x00 değerine resetlenir. Karşılaştırıcının çıkışından elde edilen eşleşme sinyali son ölçekleyicinin girişi olur. Son ölçekleyici ile Timer2 kesmesini tetikleyecek eşleşme sinyali geciktirilir, böylece MCU’nun üzerindeki kesme yükü hafifletilmiş olur. Timer2 modülünün çalışma ilkesi kısaca Şekil 5.6’da gösterilmiştir.
Şekil-5.6 Timer2 modülünün çalışma ilkesi
Timer2 modülünün bir diğer özelliği, diğer çevresel aygıtlarla MCU’nun iletişim kurmasında kullanılan SSP (Synchronous Serial Port) modülü için gerekli baud hızını sağlamasıdır. Bu işlem karşılaştırıcının ürettiği sinyal ile sağlanır. Böylece MSSP’nin SPI modunda çalışması Timer2 modülü sayesinde gerçekleşir. Timer2 modülünün en önemli özelliklerinden birisi de CCP (Capture/Compare/PWM) modülünün PWM modunda çalışması durumunda gerekli olan PWM zamanını sağlamasıdır. Dolayısıyla, MSSP ve CCP modüllerine sahip tüm PIC mikrodenetleyicileri Timer2 modülüne de sahiptir.
T2CON: TIMER2 KONTROL KAYDEDİCİSİ (ADRES: 12h – PIC16F628A)
bit 7 Kullanılmıyor: ‘0’ olarak okunur. Timer2 modülünün Prescaler ve Postscaler sayıcıları aşağıdaki durumlar gerçekleştiğinde sıfırlanır. Bir diğer ifadeyle sistem içinde bir değişiklik meydana geldiğinde sayma işlemi kaldığı yerden devam etmez ve başa döner.
Uyku modundayken TMR2 artmaz. Önölçekleyici en sonki ön ölçekleme sayma değerini tutar. MCU uyku modundan çıkınca kaldığı yerden artmaya devam eder. Timer2 modülünü kullanarak periyot hesabını aşağıdaki gibi yapabiliriz:
Denklem 5.3
Burada “Sayac” isimli değişken program içinde isteğe bağlı olarak kullanabileceğimiz bir geciktirme döngü değişkenidir. Örnek olarak Timer2 kesmesinin 1sn’lik periyotlarla aktif olmasını istiyorsak hesabımızı şu şekilde yapabiliriz: İlk önce MCU’nun osilatör frekansının 4 MHz olduğunu varsayalım. Ardından prescaler ve postscaler her ikisi de 1:16 değerlerine kurulu olsun. TMR2 ve PR2 kaydedicilerinin değerleri sırasıyla 0x00 ve 0xFF olsun. Bu durumda;
“Sayac” değişkenini çekersek,
Bu değerlere göre programlanarak çıkışta 1sn süreyle artan ya da azalan tek basamaklı 7 segment gösterge devresi Şekil 5.7’de gösterilmiştir. Devrede tek basamaklı sayma değerini durdurma; ileri ve geri saydırma butonları bulunmaktadır.
Şekil-5.7 Timer2 modülüyle çalışan tek basamaklı 7 segment gösterge devresi
Şekilde görülen devrede 3 adet buton için B portunun port değişim kesmesine sahip olan son dört pini kullanılmıştır. Bu nedenle 7 segment gösterge A portuna çıkış bileşeni olarak bağlanmıştır. A portunun reset haricinde geriye kalan 7 pinini aktif olarak kullanabilmek için PIC16F628A’nın dâhili 4 MHz osilatörü aktif kılınmıştır ve konfigürasyon sözcüğü RA6 ve RA7 pinleri I/O olacak şekilde ayarlanmıştır (Bkz.Ek-D3). Burada dikkat edileceği üzere açık akar (Open Drain-OD) yapısında olan RA4 pinini çıkış olarak kullanabilmek için NPN ve PNP transistör ikilisiyle push-pull bir bağlantı yapılmıştır. Devrenin mikroC kodu Tablo 5.5’te gösterildiği gibidir. Tablo 5.5 Timer2 modülüyle çalışan tek basamaklı 7 segment gösterge devresi mikroC kodu
Timer3 Modülü ve Timer3 KesmesiKitapta açıklanan mikrodenetleyiciler içinde yalnızca PIC18F2455/25550/4455/4550 serisinde Timer3 modülü bulunmaktadır. Bu nedenle Timer3 modülü PIC18F2550 için açıklanacaktır. Timer3 modülü:
T3CON: TIMER3 KONTROL KAYDEDİCİSİ (ADRES: FB1h – PIC18F2550)
bit 7 RD16: 16-bir Okuma/Yazma etkinleştirme bitidir. Timer3 için saat kaynağı olarak işlemcinin çekirdek frekansının seçilmesi durumunda süre hesabı Denklem 5.4’te olduğu gibi yapılır.
Denklem 5.4
Şekil-5.8 Timer3 modülü basitleştirilmiş diyagramı
Timer3 modülü, diğer zamanlayıcı modülleri gibi kullanıcıya ek bir bağımsız zamanlama donanımı kazandırmış olur. Çalışma ilkesi görüldüğü üzere Timer1 modülüne benzemektedir. İsteğe bağlı olarak mikrodenetleyicinin çekirdek frekansını saat kaynağı olarak kullanabildiği gibi, Timer1 modülünün harici osilatör (T1OSC) ya da saat darbesi girişini (T1CKI) de kullanabilir. Timer3 modülünün PIC18F2550 mikrodenetleyicisi ile kullanımını daha iyi anlamak için örnek bir zamanlayıcı uygulaması geliştirilmiştir. Şekil 5.9’da gösterilen uygulamada, mikrodenetleyicinin 3 farklı harici kesme girişinden gelen tetiklemeye göre 3 farklı bekleme süresince bir LED’i yakacak devre şeması gösterilmiştir. Devrenin uygulama kodu Tablo 5.6’da verilmiştir. Harici kesme girişlerine bağlı butonlardan hangisi aktif olursa ‘buton’ isimli değişkenin değeri değiştirilmektedir. Değişkenin aldığı değere göre ilgili bekleme rutini çağrılmaktadır. Uygulamada 100ms, 250ms ve 500 msn’lik beklemeleri elde edecek şekilde 3 farklı rutin hazırlanmıştır. Timer3 modülünün zaman sayacı kaydedicileri olan TMR3H ve TMR3L kaydedicilerine yüklenen değere göre bu süreler hesaplanmaktadır. Bu kaydedicilerin toplam değeri 65535 sayısını aştığında taşma meydana gelir ve TMR3IF kesme bayrağı lojik-1 olur.
Şekil-5.9 Timer3 modülüyle bekleme süresi uygulama devresi
Tablo 5.6 Timer3 modülüyle bekleme süresi uygulama devresi mikroC kodu
Program incelendiğinde kullanıcı tanımlı 3 farklı bekleme rutini tasarlanmış olduğu görülmektedir. PIC18F2550’nin dâhili osilatörü (CONFIG1H-300001h:0X0008 değeri) ve OSCCON kaydedicisi kullanılarak (ayrıntılı bilgi için Ek-F’ye bakınız) 4 MHz’lik FOSC değeri elde edilmiştir. Bu frekans değeri referans alınarak 100 ms, 250 ms ve 500 ms için TMR3L ve TMR3H kaydedicilerine yüklenmesi gereken değerler hesaplanmıştır. Bu işlemi 100 ms için yapacak olursak; Program kodunda görüleceği üzere T3CON kaydedicisinin T3CKPS1 ve T3CKPS0 bitleri lojik-1 olarak ayarlandığından 1:8’lik önölçekleme değeri elde edilmiştir. Denklem 5.4’te görüldüğü üzere FOSC değerinin 4’te 1’inin alındığı dolayısıyla paydada 1.000.000 değerinin kaldığı görülür. Bu durumda pay sayısının 100 bin olması gerektiği ortaya çıkar (100.000/1.000.000 = 100m = 0,1). 100.000 / 8(prescaler) = 12.500 Bu değer 65536 sayısından TMR3 kaydedicisinin farkı alındığında çıkan sayıdır. Bu durumda TMR3 değerini bulmak için; TMR3=65536-12500=53036=CF2C Aritmetik işlemini gerçekleştiririz. Bu durumda, 4 MHz’lik çalışma frekansı altında 100 msn’lik bekleme süresinin elde edilmesi için; TMR3H kaydedicisinin ‘CF’, TMR3L kaydedicisinin ise ‘2C’ onaltılı değeriyle yüklenmesi gerektiği ortaya çıkar. Timer3 modülü ile ilişkili kaydediciler Tablo 5.7’de listelenmiştir. Tablo 5.7 Timer3 kaydedicisi ile ilişkili kaydediciler
Uygulama incelendiğinde Timer3 INTCON kaydedicisi ile çevresel aygıt kesmesinin ve PIE2 kaydedicisi ile Timer3 kesmesinin aktif edilmesine gerek kalmadığı görülmektedir. Normal çalışma durumunda Timer3 kesmesinin aktif kılınmasına gerek yoktur. Varsayılan kaydedici ayarlarıyla Timer3 taşma kesmesi oluşmakta ve program içinde kesme bayrağı kaydedicisi PIR2 ile kontrol işlemi yapılmaktadır. Ancak mikrodenetleyicinin uyku modunda çalışması istendiğinde kesme etkinleştirmesinin yapılması gerekir. Ayrıca her bir kesme için öncelik (priority) tanımlaması yapan kaydedicilerden olan IPR2 kaydedicisiyle de öncelik tanımlamasına gerek duyulmamıştır. 16X serisi mikrodenetleyicilerde bulunmayan öncelik tanımlamasıyla ilgili daha ayrıntılı bilgi bir sonraki başlıkta sunulmuştur. PIC18F serisi mikrodenetleyicilerde iki tane kesme vektörü bulunmaktadır ve bu sayede kesme yordamını mikroC program editöründe farklı isimlerle adlandırmak mümkündür. Bir sonraki uygulamada bu gösterimin de kullanıldığı bir örnek sunulmuştur. Şekil 5.10’da saat kaynağı olarak Timer1 harici saat darbesi girişini (RC0/T1OSO/T1CKI) kullanan ve uyku modunda çalışan bir devre uygulaması gösterilmiştir. Bir üretim bandında geçen ürünleri algılamak üzere kızılötesi (infrared) tx/rx çiftinden oluşan bir algılayıcı kullanıldığı düşünülsün. Sensörün mikrodenetleyicinin T1CKI girişine bağlandığını düşünelim. Timer3 modülünün TMR3 kaydedicisi T1CKI girişiyle ilişkilendirilmiş olsun ve oradan gelen algılayıcı bilgisine bağlı olarak değeri artsın. TMR3 kaydedicisinde taşma meydana geldiğinde Timer3 kesmesi ile mikrodenetleyici uyku modundan çıksın ve tanımlanmış bir pinden ikaz versin.
Şekil-5.10 Kızılötesi algılayıcı ile sayma işlemi yapan Timer1 ve Timer3 kesme uygulaması
Piyasada farklı tipte IR algılayıcılar bulunur. Uygulamada verici ve alıcısı aynı devre sistemi üzerinde bulunan bir IR sensörü kullanılmıştır. Sensörlerin algılama yaptığı durumda çıkışta lojik-0 ya da lojik 1 değerinden hangisini verdiği de önemlidir. Örneğin MZ-80 IR nesne algılayıcısı boştayken lojik-1 verirken, algılama yaptığında lojik-0 değerini verir. PROTEUS-ISIS® uygulamasında harici olarak “Infrared Sensor” kütüphanesi kullanılmıştır. Bu kütüphanede kullanılan algılayıcı algılama yaptığında lojik-1 değerini vermektedir. Ayrıca bu tür tx/rx çiftinden oluşan IR sensörlerinin pek çoğu içinde bulunan TTL dönüştürücüleri sayesinde doğrudan MCU’nun dijital I/O pinine bağlanabilir. Proteus® İçin Infrared Modülü Kütüphane Dosyalarının Yüklenmesi (Windows 10 İşletim Sistemi için)
Tablo 5.8 Kızılötesi algılayıcı ile sayma işlemi yapan Timer1 ve Timer3 kesme uygulaması mikroC kodu
Uygulamada hem Timer1 hem de Timer3 kesmesi bağımsız olarak birlikte kullanılmıştır. Sayma işleminin çabuk bitmesi istendiğinden her iki kaydedicinin zaman sayacı başlangıç değerleri FFFE-65534 olarak yüklenmiştir. Aynı saat darbesi kaynağını kullanarak farklı zamanlamada kesme üretimini göstermek amacıyla Timer1 ve Timer3 zamanlayıcılarının ön ölçekleme değerleri farklı programlanmıştır. Arzu edilen değer kadar sayma işlemi gerçekleştiğinde ve kesme üretildiğinde her bir zamanlayıcı için ayrı bir çıkış hattından sinyal alınmakta ve Timer0 kaydedicisiyle ayarlanmış süre kadar (8 MHz dâhili OSC için 2 sn) ilgili çıkış aktif olmaktadır. Kısaca uygulamada Timer0, Timer1 ve Timer3 zamanlayıcıları birlikte kullanılmıştır. ÖNEMLİ: PROTEUS-ISIS® programında gelişmiş güç yönetimine ve osilatör seçeneklerine sahip mikrodenetleyicilerin bu özellikleri canlandırılamaz. PIC18F2550 mikrodenetleyicisi uyku modunda (SLEEP mode) ve çalışmayan modunda (IDLE mode) gibi çeşitli güç tasarrufu modlarına sahiptir. Ek F’de anlatıldığı üzere OSCCON kaydedicisi güç yönetimi ve osilatör tercihleri için kullanılan kaydedicilerdendir. OSCCON kaydedicisinin tüm özellikleri devre simülasyon programında canlandırılamamaktadır. Bu nedenle uyku modunda yapacağınız çalışmalarınızı izlemek ve sonuçlarını görmek için uygulamanızı gerçek devre üzerinde kurmanız önemle rica olunur. Şekil 5.10’daki uygulama 8 MHz dâhili çalışma frekansında hem uyku modu hem de normal modda gerçekleştirilmiş ve akım değerleri ölçülmüştür. Söz konusu devrenin uyku modunda 40uA-50uA arasında akım çektiği, normal modda ise 5,6mA (5600uA) akım çektiği gözlemlenmiştir. Dolayısıyla uyku modu ile normal çalışma modu arasında 8 MHz FOSC altında 100 kattan fazla akım tüketimi farkı olduğu görülmektedir. PIC mikrodenetleyicilerinin büyük çoğunluğu nanoWatt teknolojisine sahiptir. Ayrıca 2V – 5,5V gibi geniş bir çalışma aralığına sahiptirler. PIC18F2550 mikrodenetleyicisinin akım tüketimi 2 V besleme ve 32 kHz osilatör ile uyku modunda 100 nA seviyesine kadar düşürülebilir. Bu kadar düşük akım değerlerinin piyasada satılan standart ölçü aletleriyle ölçülmesi mümkün değildir. Bunun için çok yüksek kalibrasyon ve ölçme hassasiyetine sahip pahalı ölçü aletleri kullanmak gerekir. Yüksek ve Düşük Öncelikli Kesme KavramıPIC18F2455/2550/4455/4550 mikrodenetleyici ailesi çok sayıda kesme kaynağına sahiptir. Ayrıca 10F/12F/16F serisi mikrodenetleyicilerde olmayan öncelik kesmesi özelliğine sahiptir. Yüksek-öncelik kesmesi vektörü 000008h adresinde, alçak-öncelik kesmesi vektörü 000018h adresinde yer alır. Yüksek öncelikli kesmeler işlem sürecinde olan düşük öncelikli kesmeleri keser ve onların önüne geçer. Bu mikrodenetleyici ailesinde kesme işlemlerinin kontrol edilmesi için 10 adet kaydedici vardır. Bunlar:
RCON: RESET KONTROL KAYDEDİCİSİ (ADRES: FD0h – PIC18F2550)
bit 7 IPEN: Kesme önceliğini etkinleştirme bitidir. Tablo 5.9’da tüm bu kesmelerin bayrak, etkinleştirme ve öncelik bitleriyle birlikte kaydedici isimleri özet olarak sunulmuştur. Tüm bu kesme önceliklerinin kullanılabilmesi için öncelikle RCON kaydedicisinin IPEN biti etkinleştirilmelidir. Tablo 5.9 Tüm kesme kontrol kaydedicileri için kesme bitleri özet tablosu
Kesme sırasında dönüş PC adres değerinin yığına kaydedildiği daha önceden söylenmişti. Ayrıca, STATUS, BSR (Bank Select Register) ve WREG (Akümülatör) kaydedicilerinin değerleri de hızlı kaydedici yığınına (Fast Register Stack-FRS) gönderilir. Ancak yüksek ve düşük öncelikli kesmelerin her ikisinin de kullanılması durumunda, düşük öncelikli kesmelerden dönüşte bu kaydedicilerin değerlerinin doğruluğundan emin olunamaz. Çünkü düşük öncelikli kesmeler işlerken, yüksek öncelikli bir kesme oluşması durumunda düşük öncelikli kesme tarafından yığına alınmış olan bu değerlerin üzerine yazılır. Kesme önceliği kullanılmadığı durumda, tüm kesmeler kesmeden dönüşte FRS’yi kullanır. Kesme kullanılmadığında ise, STATUS, BSR ve WREG kaydedicilerinin değerlerinin kullanıcı tarafından program içinde geçici olarak belleğin bir bölgesine kaydedilmesi gerekebilir. Bu işleme durum kaydı Context Saving denir. Ardından kesme işleminden dönüşte geçici belleğe kaydedilen bu veriler geri yüklenir. Bu işleme ilişkin örnek Tablo 5.10’da gösterilmiştir. Program kodunun tamamı verilmemiş olup, böyle bir uygulamayı yapmak istediğiniz bir programda kodlamayı nasıl yapacağınıza açıklık getirilmiştir. Örnek uygulamada yüksek ve düşük öncelik kesmelerinin her ikisinin de kullanıldığı düşünülmüştür. Böylece hangi kesmeye girilmiş olursa olunsun bu durum kaydedicilerinin değerleri ana program işleyişi sırasında kullanıcı RAM’ine alınır ve kesme oluştuğunda tekrar geri yüklenir. Tablo 5.10 Durum kaydedicileri değerlerinin geri yüklenmesi örneği
USB KesmesiDiğer çevresel aygıtlardan farklı olarak USB modülü çeşitli olay türlerine bağlı olarak çok geniş bir aralıkta kesme üretme özelliğine sahiptir. Bu olayları idare edebilmek için, USB modülü mevcut kesme kontrol kaydedicilerinden farklı olarak kendisine ait bir kesme lojiği ile donatılmıştır. Bu lojik sistemin basitleştirilmiş blok yapısı Şekil 5.11’de gösterilmiştir. Ancak davranış olarak normal kesme yönetimine benzer. Her kesme kaynağının ayrı bir bayrak ve etkinleştirme biti bulunur.
Şekil-5.11 USB kesmesi lojiği
Tüm bu olay kesmeleri nihayetinde tek bir kesme bayrağına çıkar. Bu kesme PIR2 kaydedicisinin 5.biti olan USBIF bayrağıdır. Tek başına bu bayrak bitine bakıldığında hangi olayın meydana geldiği tespit edilemediğinden USB modülü için hazırlanmış ilgili kaydedicilere bakmak gerekir. Ayrıca USB kesmelerinin kendi içinde öncelik seviyelendirmesi yoktur. Öncelik durumu yalnızca tüm USB kesmeleri için USBIP bitiyle belirlenir. Tablo 5.11’de USB kesmelerini kontrol etmeyi sağlayan kaydedicilerin özeti sunulmuştur. Tablo 5.11 USB kesmeleri özet tablosu
Veri hattında bir hareketlilik olup olmadığını izlememizi sağlayan ACTVIF biti USB modülü askı (suspend) modundan uyanmasının ya da askı moduna girmesinin hemen ardından temizlenemez. Yazılım tarafından ACTVIF bayrağı temizlenmeden önce, dahili donanım durum makinesini senkronize etmek için birkaç saat darbesi çevrimine ihtiyaç duyulur. Dahili donanımın senkronize edilmesinden önce ACTVIF’i temizlemenin ACTVIF bayrağı üzerinde bir etkisi olmayabilir. Ayrıca, USB modülü 96 MHz PLL kaynağından saat darbesi kaynağını kullanırsa, ardından USB kontrol kaydedicisinin (UCON) SUSPND biti temizlendikten sonra, USB modülü 96 MHz PLL için beklemesi sırasında hemen çalışmaya başlayamayabilir. Bunun için, ACTVIF bayrağının temizlenmesini garanti etmek için yazılımınız içinde aşağıdaki ufak kod parçasını kullanmanız tavsiye edilir.
USB donanımının kullanımıyla ilgili ayrıntılı bilgiye 9.5. bölümden ve EK-I6’dan ulaşabilirsiniz. |