369 Görüldüğü üzere mikroC editöründe bazı kodlar harf duyarlıyken, bazıları değildir. Bu konuya alışkanlık kazanmanız çok sayıda kod yazarak gerçekleşecektir. Genel olarak, değişken ve fonksiyon tanımlama‐larında küçük harf, program tanımlı “PORTB, TRISB, ANSEL, CMCON, vb.” değişkenlerde ve kaydedici‐lerin yazımında BÜYÜK harf kullanmanız ayırt edici ve anlaşılır bir kod yazımı açısından faydalı olacaktır. A‐2AçıklamaSatırıEklemekDaha önceden belirtildiği gibi mikroC programı kod yazım ilkeleri açısından pek çok özelliği C dilinden almıştır. Bunlardan biride program kodlarına etkisi olmayan açıklama satırlarıdır. Açıklama satırları uzun kodlamada son derece faydalı bir özelliktir. Açıklama satırı eklemenin iki yolu vardır. ”//” çift eğik çizgi (çift slaş) ile tek satırlı açıklama bilgisi yazılır. Örnek: “ /* … */ “ ile birden fazla açıklama satırı eklenebilir. /* işareti konduktan sonra yazılan ve */ işaretinin başladığı yere kadar olan bütün satırlar açıklama satırı olarak yorumlanır. Bu nedenle açıldıktan sonra kapatılması gerekir. Örnek: TRISA = 0x00; TRISB = 0x00; PORTA = 0; PORTB = 0; /* Tüm portlar çıkış olarak ayarlanıyor. Portlar başlangıç olarak sıfırlanıyor */ ANSEL = 0B00000000; /* Analog girişler kapatılıyor */ CMCON = 0x07; //Karşılaştırıcı devre dışı bırakılıyorProfesyonel programcılar da programlarının kritik yerlerine açıklama satırları ekler. Bunu alışkanlık ha‐line getirmeniz, çalışmaya ara verdiğiniz projelere döndüğünüzde ya da ihtiyaç duyduğunuzda size bü‐yük fayda sağlayacaktır. A‐3ProgramlamaSentaksımikroC program satırları “;” ile sonlandırılır. Fonksiyonlar ve döngüler gibi “{“ küme paranteziyle baş‐lanan satırlarda “;” kullanılmaz. Ayrıca ‘goto’ komutu kullanılarak yapılan dallanmalarda, dallanmanın yapıldığı etiketin kullanıldığı satırda “:” kullanılır. Aynı tür değişkenler aralarına virgül konularak tanım‐lanabilir ve tümüne ya da bir kısmına ilk değer atanabilir. Örnek: int a, i, bekle=50; //Aynı satırda birden fazla değişken tanımlanmıştırvoid bekleme(){ //bu değişkenlerden bazılarına değer atanmıştırVdelay_ms(bekle); } test: //goto komutuyla dallanma yapılan etiketfor(i=0;i<50;i++){ PORTB=0X02; int bekle=50; // Bekleme süresini ayarlayacak değişken 370 bekleme(); PORTB=0X00; bekleme(); } a++; if (a<100) goto test:Örnek kod parçasında a değişkeni 1 artırılır ve 100’den küçük olduğu sürece ‘for’ döngüsünün üstünde yer alan “test:” etiketine dallanılır. Böylece ‘for’ döngüsü 100 defa işletilir. Program kodunda görüldüğü üzere her açılan küme parantezi için kapatma parantezi kullanılır. Kural olarak açılan parantez kadar kapatma parantezi kullanılmalıdır. mikroC editöründe açılan küme parantezi için otomatik olarak kapatma parantezi açılmaz. Ayrıca oto‐matik olarak iç içe (nested) bir yapı da oluşturulmaz. Özellikle uzun kod yazımında iç içe geçmiş kodları seviyelerine göre girintili olarak yazmak program yazımının okunurluğunu artıracaktır. Örnek: void main() { ayarlar(); uzunluk_msj01 = strlen(msj01); uzunluk_msj02 = strlen(msj02); konum = (16-uzunluk_msj02)/2; for(;;){ //sonsuz döngü pointer_msj01 = &msj01; pointer_msj02 = &msj02; for(i=0;i<16;i++){ Lcd_Out(1,16-i,msj01); Lcd_Out(2,konum,pointer_msj02); delay_ms(100); } for(i=0;i<uzunluk_msj01;i++){ Lcd_Out(1,1,pointer_msj01); Lcd_Out(2,konum,pointer_msj02); delay_ms(100); Lcd_Cmd(_LCD_CLEAR); pointer_msj01++; } //Görüldüğü üzere açılan her küme parantezi kadar } //kapatma parantezi kullanılmıştır.} Yapısal programcılık ilkeleri açısından ‘goto’ deyimiyle dallanma yapmamaya çalışılmalıdır. Özellikle döngülerin içinde ‘goto’ deyiminin kullanımı tavsiye edilmeyen bir uygulamadır. Döngünün kırılarak terk edilmesi iyi bir programlama uygulaması değildir. Dallanmalar olabildiğince “do…while” ya da “while” döngü yapıları kullanılarak yapılmalıdır. Ayrıca başlangıç koşulları tanımlanmış ve ona göre iş‐leyen bir kod bloğunun içine ‘goto’ deyimiyle dallanma yapılamaz. Örnek: Bir fabrika otomasyon sisteminde girişlerden gelen bilgilerin belli bir döngü süresince taranarak mikro‐denetleyicinin EEPROM veri hafızasına yazıldığını düşünelim. Bu verilerin zaman içinde EEPROM hafı‐zasından silinip silinmediğini kontrol etmek istediğimizi varsayalım. Hafızadan okunan bilginin dizi de‐ğişkende tutulan bilgiyle aynı olmaması durumunda çıkışları hızlıca çakarlı şekilde yakarak uyarı verdik‐ten sonra son okunan port bilgisini çıkışa aktaran bir programımız olsun ve bu durumda sistem tekrar başa dönsün. Programı ilk önce ‘goto’ deyimini kullanarak yapalım: 371 Tablo A.1 GOTO deyiminin örnek uygulaması unsigned char i,k, oku; unsigned char port[10]; void main() { TRISB = 0xFF; // B portu tüm pinleriyle giriş yapılıyor TRISA = 0x00; // A portu tüm pinleriyle çıkış yapılıyor PORTB = 0x00; PORTA = 0x00; CMCON = 0x07; INTCON.GIE=0; //Evrensel kesme devre dışı bırakılıyor port_cikis: //GOTO komutuyla dallanılacak etiket for(i=0;i<10;i++){ port[i] = PORTB; //EEPROM hafızasına 10 turda veri yazılıyor EEPROM_Write(0x00+i, port[i]); delay_ms(500); } for(i=0;i<10;i++){ oku = EEPROM_Read(0x00+i);//EEPROM hafızasından okunan veri if(oku == port[i]){ //dizi değişkenin içeriğiyle karşılaştırılıyor delay_ms(250); PORTA = port[i]; } else{ for(k=0;k<5;k++){ PORTA=0xFF; //Hafızadaki veri eşleşmiyorsa A portu çıkışlarına delay_ms(100); //çakarlışekilde uyarı verdirilir. PORTA=0x00; delay_ms(100); } PORTA=oku; //Ardından eşleşmeyen veri A portuna gönderilir. goto port_cikis; } } }Bu uygulamayı ‘goto’ deyimi kullanmadan ‘do…while’ döngüsü kullanarak yapmak istersek takip eden düzenlemeyi yapabiliriz: Tablo A.2 GOTO deyiminin yerine "do...while" döngüsünün kullanılması unsigned char i,k, oku, hata=0; //yeni bir değişken eklendiunsigned char port[10]; void main() { TRISB = 0xFF; // B portu tüm pinleriyle giriş yapılıyor TRISA = 0x00; // A portu tüm pinleriyle çıkış yapılıyor PORTB = 0x00; PORTA = 0x00; CMCON = 0x07; INTCON.GIE=0; //Evrensel kesme devre dışı bırakılıyor do{ //GOTO etiketinin yerine konan do...while döngüsü for(i=0;i<10;i++){ port[i] = PORTB; //EEPROM hafızasına 10 turda veri yazılıyor EEPROM_Write(0x00+i, port[i]); delay_ms(500); } i=0; hata=0; do{ oku = EEPROM_Read(0x00+i+1); //EEPROM hafızasından okunan veri if(oku == port[i]){ //dizi değişkenin içeriğiyle karşılaştırılıyor delay_ms(250); PORTA = port[i]; 372 } else{ for(k=0;k<5;k++){ PORTA=0xFF; //Hafızadaki veri eşleşmiyorsa A portu çıkışlarına delay_ms(100); //çakarlışekilde uyarı verdirilir. PORTA=0x00; delay_ms(100); } PORTA=oku; hata=1; //hata değişkeni 1 olur } i++; }while(!hata && i<10); //hata yoksa (0 ise) ve 10 olmamışsa }while(hata); //hata varsa (1 ise) başa döner}Şekil A.1’de Tablo A.1 ve A.2’deki kodların örnek uygulama devresi gösterilmiştir. Devre canlandırma‐sında B portu girişlerine bağlı olduğu varsayılan sensörler butonlarla temsil edilmiştir. Şekil A.1 GOTO deyimi uygulama örneği A‐4Matematiksel İşlemlermikroC dili matematiksel işlemlerin yapılabilmesi için bir dizi aritmetik operatör sunar. Bunlar, nümerik olarak işlem gören değişkenlerden ve işlem sonucunda işleme ve değişken türüne uygun sayı döndüren operatörlerdir. Tüm operatörler solda sağa doğru işlem görür ve her birinin işlem önceliği vardır. İşlem önceliği yüksek değere sahip olan operatörler önce işlem görür. Uzun hesaplamalarda ilgili operatörün işlem gördüğü sayıları diğer işlemlerden ayırmak için parantez kullanılması tavsiye olunur. 373 Tablo A.3 Aritmetik operatörler Operatörİşlem Öncelikİki Sayılı İşlemler+Toplama12‐Çıkartma12*Çarpma13/Bölme13%Mod alma operatörüdür. Tam sayılarla kullanılır. Bölme işlemi sonucunda kalan kısmı döndürür. Kayan nokta sayılarda kul‐lanılmaz (double ve float). 13Çift Sayılı İşlemler+Önüne geldiği sayının işaretini etkilemez14‐Önüne geldiği sayının işaretini değiştirir.14++İşlem gördüğü sayının değerini bir artırır. Sayının önünde ya da sayıdan sonra kullanılabilir. Sayının önünde kullanıldığında hesaplamadan önce sayının değeri artırılır. Sonra kullanıldı‐ğında ise hesaplama işlemi yapıldıktan sonra sayının değeri ar‐tırılır.14‐‐İşlem gördüğü sayının değerini bir azaltır. Sayının önünde ya da sayıdan sonra kullanılabilir. Sayının önünde kullanıldığında hesaplamadan önce sayının değeri azaltılır. Sonra kullanıldı‐ğında ise hesaplama işlemi yapıldıktan sonra sayının değeri azaltılır.14NOT: ‘*’ operatörü ‘pointer’ tipinde değişken tanımlamasında da kullanılır. A‐4.1 İki Sayılı Aritmetik İşlemler İki tamsayının bölümünden bir tamsayı döndürülür. Eğer işlem sonucunda kalan varsa kalanlı kısım atı‐lır: /* örnek */ 7/4; /* 1’e eşittir */7*3/4 /* 5’e eşittir *//* fakat */ 7. *3./4.; /* 5.25’e eşittir. Çünkü float sayı işlemi yapılmıştır */ */ 374 % Mod operatörü yalnızca tamsayı türünde sayı değişkenlerinde kullanılabilir: /* örneğin: */ 9 % 3; /* 0’a eşittir */7 % 3; /* 1’e eşittir */‐7 % 3; /* ‐1’e eşittir */ Aritmetik operatörler karakter işlemlerinde de kullanılabilir: 'A' + 32; /* 'a' karakterine eşittir (yalnızca ASCII kodu için) */ 'G' ‐ 'A' + 'a'; /* 'g' karakterine eşittir (hem ASCII hem EBCDIC kodu için) */ Tablo A.4’te çift sayı operatörleriyle yapılan bazı aritmetik işlemlerin LCD ekranda nasıl gösterileceği üzerine uygulama kodu gösterilmiştir. Bu kodun PROTEUS‐ISIS® ortamında hazırlayacağınız bir devrede izlenmesi için Şekil 3.7’deki devreyi kullanabilirsiniz. Tablo 3.11’deki programın LCD bağlantı ayarları ve mikrodenetleyici ayarlarıyla ilgili kodlarını bu koda eklemeyi unutmayınız. Tablo A.4 Çift sayı operatörleriyle yapılan aritmetik işlemlerin LCD ekranda gösterilmesi char i=0; unsigned int j=0; float k=0; char str1[16], str2[16], str3[16], str4[16]; void main() { ayarlar();/* Tablo3.11’deki LCD ve mikrodenetleyici ayarları kodunu programınıza ekleyin */ i=9/7; BytetoStr(i,str1); //1 byte’lık (maks 255) tam sayıdan stringe dönüşüm Lcd_Out(1,1,strcat("1.ISLEM= ",str1)); delay_ms(1000); Lcd_Cmd(_LCD_CLEAR); j=8*4/7; InttoStr(j,str2); //2 byte’lık (maks 65535) tam sayıdan stringe dönüşüm Lcd_Out(1,1,strcat("2.ISLEM= ",str2)); delay_ms(1000); Lcd_Cmd(_LCD_CLEAR); k=9.5*4/0.7; FloattoStr(k,str3); //4 byte’lık kayan nokta sayıdan stringe dönüşüm Lcd_Out(1,1,strcat("3.ISLEM= ",str3)); delay_ms(1000); Lcd_Cmd(_LCD_CLEAR); i=9%4; //9 sayısının 4’e göre modu alınıyor BytetoStr(i,str4); //1 byte’lık tam sayıdan stringe dönüşüm Lcd_Out(1,1,strcat("4.ISLEM= ",str4)); }Tablo A.4’deki program kodunda çeşitli sayı değişkenlerini metin değişkenine (string) dönüşüm için mikroC’nin “Conversions ‐ Dönüşümler” kütüphanesi kullanılmıştır. Ayrıca iki string ifadenin birbirine eklenmesini sağlayan “strcat” fonksiyonu kullanılmıştır. Bu işlemlerin yapılabilmesi için “View Lib‐rary Manager” penceresinden “Conversions” ve “C_String” kütüphanelerini seçiniz. Farklı aritmetik iş‐lemleri deneyerek farklı sonuçlar elde etmeye çalışınız. 375 A‐4.2 Tek Sayılı Aritmetik İşlemler Tek sayı operatörleri ‘++’ ve ‘‐‐’, C dilindeki hem önden hem sondan eklemeli tek operatör türüdür. Ön ek olarak (++k, ‐‐k) ya da son ek olarak ( k++, k‐‐) şeklinde kullanılır. /* örneğin */ int j = 5; k = ++j; /* k = k + 1, j = k, bize j = 6, k = 6 sonucunu verir *//* fakat */ int j = 5; k = j++; /* j = k, k = k + 1, bize j = 5, k = 6 sonucunu verir */ Bu operatörler daha çok yukarıdaki kullanımdan farklı olarak tek başına bir değişkenin değerini artır‐mada ya da eksiltmede kullanılır. Özellikle “for”, “while” ve “do..while” döngülerinde tam sayı değiş‐keni olarak döngü adedinin ayarlanmasında sayaç olarak kullanılırlar. /* örneğin */ int i; for(i=0;i<5;i++){ PORTB = i; /* i değişkeni B portuna gönderilir */ Delay_ms(100); /* ve 1 artırılır */} /* ya da */ int i; fori=4;i>=0;i‐‐){ PORTB = i; /* i değişkeni B portuna gönderilir */ Delay_ms(100); // ve 1 azaltılır } /* örneğin */ int i =0; /* i değişkeni için başlangıç koşulu */while(i<5){ PORTB = i; /* i değişkeni B portuna gönderilir */ i++; // ve 1 artırılır Delay_ms(100); } /* ya da */ int i =4; /* i değişkeni için başlangıç koşulu */while(i>=0){ PORTB = i; /* i değişkeni B portuna gönderilir */ i‐‐; // ve 1 azaltılır Delay_ms(100); } DİKKAT: Sayı eksiltme operatörünün (‐‐) döngülerde kullanımına dikkat edilmelidir. Eğer değişken tü‐rünüz pozitif tanımlanmış bir tam sayı değişkeni ise (Ör: ‘char’ veya ‘unsigned int’) eksiltilen sayı 0’ın altına indiğinde ilgili değişkenin pozitif olarak en yüksek değerinden itibaren geriye gelmeye devam eder. Örneğin değişkeniniz ‘char’ türündeyse ve değeri 0’ın altına düştüyse değişkeninizin içeriği 255’e ayarlanır. Bu nedenle eksiltme işlemlerinde değişken türünüzün işaretli olarak tanımlanmış olması ge‐rekir (Ör: ‘signed char’ veya ‘int’). A‐5BitDuyarlı(Bitwise)Operatörlerİşlem gören sayının bitlerinde bit ağırlıklı çalışma yapmayı sağlayan operatörlerdir. Özellikle mikrode‐netleyicilerin portlarından okunan ya da portalara gönderilen bilgilerde bit ağırlıklı olarak işlem yap‐mada sıklıkla kullanılırlar. 376 Tablo A.5 Bit duyarlı operatörler OperatörİşlemÖncelik &Bitler üzerinde Mantıksal VE (AND) işlemi uygular. Karşılaştırılan bitlerin hepsi ‘1’ ise ‘1’ döndürür. Aksi taktirde ‘0’ döndürür.8|Bitler üzerinde Mantıksal VEYA (OR) işlemi uygular. Karşılaştırı‐lan bitlerden en az birinin ‘1’ olması durumunda ‘1’ döndürür. Tüm bitler ‘0’ ise ‘0’ döndürür.6^Bitler üzerinde Özel VEYA (XOR) işlemi uygular. Bit çiftlerini kar‐şılaştırır ve eğer birbirlerinin tümleyeniyseler ‘1’ değilse ‘0’ dön‐dürür.7~Bit duyarlı tümleç operatörüdür ve tek sayılı işlem görür. İşlem yaptığı sayının her bir bitinin tersini alır.14<<Bit duyarlı sola kaydırma operatörüdür. İşlem gördüğü sayının bitlerini sola kaydırır. Sayının MSB biti atılır, LSB bitine ‘0’ atanır.11>>Bit duyarlı sağa kaydırma operatörüdür. İşlem gördüğü sayının bitlerini sağa kaydırır. Sayının LSB biti atılır, MSB bitine ‘0’ ata‐nır.11NOT: ‘&’ operatörü bir ‘pointer’ değişkeninin adres referansı olarak da kullanılır. Bit ağırlıklı operatörler soldan sağa doğru işlem görür. Yalnızca ‘~’ operatörü sağdan sola işlem görür. A‐5.1 Bit Duyarlı Mantıksal İşlemler Bit duyarlı operatörlerden ‘&’, ’|’ ve ‘^’ işlem gören sayıların karşılık gelen bit çiftleri arasında mantıksal işlemler gerçekleştirir. ‘~’ operatörü işlem yaptığı sayının her bitinin tümleyenini alır. Tablo A.6 Bit duyarlı mantıksal işlem operatörleri & 0 1 | 0 1 ^ 0 1 ~ 0 1 0 0 0 0 0 1 0 0 1 1 0 1 0 1 1 1 1 1 1 0 Örnekler 0x1234 & 0x5678 // 0x1230’a eşittir/* çünkü .. 0x1234 : 0001 0010 0011 0100 0x5678 : 0101 0110 0111 1000 ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ & : 0001 0010 0011 0000 .. buda 0x1230’ denk gelir *//* Benzer olarak: */0x1234 | 0x5678;// 0x567C’a eşittir0x1234 ^ 0x5678;// 0x444C’a eşittir~ 0x1234; // 0xEDCB’a eşittir 377 A‐5.2 Bit Duyarlı Kaydırma Operatörleri ‘<<’ ve ‘>>’ İkili sayı sistemi (binary) operatörleri sol taraftaki sayının bitlerini sağ taraftaki sayının değeri kadar kaydırır. Sağ taraftaki sayının pozitif olması gerekir. İşaretsiz bir sayının n değeri kadar sola kaydırılması, eğer atılan tüm bitler sıfıra eşitse o sayının 2n ile çarpımına denktir. Bu durum atılan tüm bitlerin bir işaret bitine eşit olması durumunda işaretli sayılar için de geçerlidir. Aşağıdaki örnekte onlu ve onaltılık iki sayının 4’er defa sola kaydırılması sonucu elde edilen değerler gösterilmiştir. 3 sayısı 4 defa sola kaydırıldığında sonuç 24 x 3 = 48 olmuştur. 3 << 4; /* 48’e eşittir */ 0x3801 << 4; /* 0x8010’a eşittir ve taşma vardır! */ 4 basamaklı hekzadesimal sayının değişimi ise adım adım Tablo A.7’de gösterilmiştir. Tablo A.7 Hekzadesimal bir sayıda bitlerin kaydırılması Bitler 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 Hekzadesimal İlk durum 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0x3801 1. adım taşma yok 0 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0x7002 2. adım taşma yok 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0xE004 3. adım taşma var 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0xC008 4. adım taşma var 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0x8010 Sağa kaydırma ‘>>’ operatörü ile en sağdaki bitler atılır ve soldan boşalan bitler sıfırla (işaretsiz sayı olması durumunda) ya da işaret bitiyle doldurulur (işaretli sayı olması durumunda). Sayının n kadar sağa kaydırılması onun 2n ile çarpımına denktir. Aşağıdaki örnekte biri işaretli diğeri işaretsiz iki hekzadesimal sayının 4’er adım sağa kaydırılması gös‐terilmiştir. İşaretli sayıda boşalan yerlere işaret biti ‘1’ gelmekte ve bu işlem 4 adım yürütüldüğü için sayının başında ‘F’ değeri oluşmaktadır. İşaretsiz sayıda ise boşalan bitlerin yerleri ‘0’ ile doldurulmak‐tadır. 0xFF56 >> 4; /* 0xFFF5’e eşit olur */ 0xFF56u >> 4; /* 0x0FF5’e eşit olur */ Tablo A.8’de bit kaydırma operatörlerinin işaretli ve işaretsiz tamsayılarda kullanımı ve sonucun LCD ekrandan izlenmesi uygulaması gösterilmiştir. Bu program kodunun çalışması için Tablo 3.11’deki ge‐rekli LCD ayarlamalarını yapmayı unutmayınız. Sonucu izlemek için Şekil 3.7’deki devreyi kullanabilirsi‐niz. Tablo A.8 Bit kaydırma operatörlerinin kullanımı ve LCD ekrandan izlenmesi char sayac; signed char i=-1; char ii=128; char str1[16], str2[16]; void main() { ayarlar(); for(sayac=0;sayac<8;sayac++){ i=i<<1; InttoStr(i,str1); 378 Lcd_Out(1,1,str1); ii=ii>>1; InttoStr(ii,str2); Lcd_Out(2,1,str2); delay_ms(1000); }Tablo A.8’deki örnekte ‐1 ve 128 sayıları iki farklı başlangıç değeri olarak ayarlanmıştır. ‘for’ Döngüsü 8 defa işletilmekte ve her bir adımda ilgili sayıların değeri 1 basamak kaydırılmaktadır. Bu durumda 8. döngü adımının sonunda i değişkeni 27 x (‐1) = ‐128, ii değişkeni 128/27 = 1 değerini almış olur. A‐6AtamaOperatörleriDiğer pek çok programlama dillerinden farklı olarak C dili değer atamasını bir komuttan ziyade bir işlem olarak görür (bir operatör ile temsil edilen). ifade1 = ifade2 mikroC’de değer atama işlemi eşittir (‘=’) simgesiyle gerçekleştirilir. Bu kullanımda mikrodenetleyicinin veri belleğinde “ifade1” olarak yer tutan değişkenin içeriğine “ifade2” olarak yer tutan değişkenin içe‐riği yüklenmektedir. Bu tür bir atamada veri türleri farklıysa, “ifade2”’nin veri türü “ifade1”’in türüne çevrilir. Bu kullanımın yanında ‘=’ operatörü, +, ‐, *, /, %, &, |, ^, <<, ya da >> operatörleriyle birlikte arada boşluk bırakılmadan kullanılır. Böylece +=, ‐=, *=, /=, %=, &=, |=, ^=, <<= ve >>= olmak üzere 10 farklı birleşik kullanım elde edilir. Kullanımı; ifade1 op= ifade2 Ör: ifade1 += ifade2 veya ifade1 <<= ifade2 gibi şeklindedir ve burada op ifadesinin yerine diğer operatörler yazılır. Bu kullanım, ifade1 = ifade1 op ifade2 Ör: ifade1 = ifade1 + ifade2 veya ifade1 = ifade1 << ifade2 yazımına eş değerdir. A‐7Mantıksal(Logical)OperatörlerMantıksal işlemlerin işlem görenleri (operand) doğru (true) ya da yanlış (false) olarak düşünülür. Man‐tıksal operatörler her zaman lojik‐1 ya da lojik‐0 döndürür. Mantıksal bir ifadede İşlem görenler sayı‐larla ifade edilebilir (skalar) olmalıdır. Mantıksal operatörler ‘&&’ ve ‘||’ soldan sağa doğrudur. Man‐tıksal değil ‘!’ operatörü ise sağdan sola doğrudur. Mantıksal operatörler yaygın olarak ‘if’ ifadeleri ile yapılan karşılaştırma işlemlerinde ya da ‘while’ döngülerinde sayacın son bulması için gerekli koşulun sağlanıp sağlanmadığının testinde kullanılır. 379 Tablo A.9 Mantıksal operatörler Operatör İşlem Öncelik && Mantıksal VE 5 || Mantıksal VEYA 4 ! Mantıksal DEĞİL 14 Mantıksal, ilişkisel ve aritmetik operatörlerin önceliği karmaşık ifadelerin parantez kullanmaksızın ger‐çekleştirilmesini sağlayacak şekilde tasarlanmıştır. mikroC’de 15 dereceli öncelik durumu vardır. c >= '0' && c <= '9'; /* (c >= '0') && (c <= '9') olarak okunur */ a + 1 == b || ! f(x); /* ((a + 1) == b) || (! (f(x))) olarak okunur */ Mantıksal VE ‘&&’ yalnızca her iki ifade de sıfırdan farklıysa ‘1’, aksi durumda ‘0’ lojik değerini döndü‐rür. Eğer ilk ifade ‘false’ üretirse, ikinci ifade hesaplanmaz. Örneğin: a > b && c < d; /* (a > b) && (c < d) olarak okunur *//* Eğer (a > b) yanlış‐false (0) ise, (c < d) hesaplanmaz */ Mantıksal VEYA ‘||’ her iki ifadeden biri de sıfırdan farklıysa 1 döndürür. Eğer ilk ifade ‘true’ üretirse, ikinci ifade hesaplanmaz. Örneğin: a && b || c && d; /* (a && b) || (c && d) olarak okunur *//* Eğer (a && b) is doğru‐true (1) ise, (c && d) hesaplanmaz */ A‐8 İlişkiselOperatörlerİlişkisel operatörler eşitlik ya da eşitsizlik durumlarının testi için kullanılır. Eğer bir ifade doğru (true) değeri üretiyorsa, ‘1’, aksi takdirde ‘0’ lojik değerini döndürür. Tüm ilişkisel operatörler soldan sağa doğrudur. Tablo A.10 İlişkisel operatörler Operatör İşlem Öncelik == Eşit 9 != Eşit değil 9 > …’dan daha büyük 10 < …’dan daha küçük 10 >= …’dan daha büyük ya da eşit 10 <= …’dan daha küçük ya da eşit 10 Aritmetik işlemlerle ilişkisel operatörlerin parantez kullanmadan kullanılmasını sağlayan öncelik katsa‐yısı aşağıdaki gibi bir kullanım sunar: a + 5 >= c ‐ 1.0 / e /* → (a + 5) >= (c ‐ (1.0 / e)) */ İlişkisel operatörler ‘1’ ya da ‘0’ değeri döndürür. Dolayısıyla aşağıdaki kullanımlarda: /* doğruda karşılaştırma */5 > 7 /* 0 döndürür */10 <= 20 /* 1 döndürür *//* bu yanıltıcı olabilir: */8 == 13 > 5 /* 0 döndürür, 8 == (13 > 5) → 8 == 1 → 0 */ 380 14 > 5 < 3 /* 1 döndürür, (14 > 5) < 3 → 1 < 3 → 1 */a < b < 5 /* 1 döndürür, (a < b) < 5 → (0 ya da 1) < 5 → 1 */ A‐8 İkili(Binary)veOnaltılık(Hexadecimal)SayıSistemiMikrodenetleyicilerin portlarının kontrolünde ikili ve onaltılık sayı sisteminden çok yararlanılır. Ayrıca bilindiği gibi mikrodenetleyicinin program belleğine ve veri belleğine bilgiler onaltılık sayı sistemiyle gönderilmektedir. mikroC’de ikili bilgi ‘0B’ tanımlayıcısıyla belirtilir. İkili bilgiyle ilgili portun her bir bacağını açık şekilde kontrol etmek mümkündür. Örnek olarak, TRISB = 0B00000000; // B portunun tüm pinleri çıkış yapılıyor PORTB = 0B00000000; // B portunun tüm pinleri temizleniyor şeklinde yazılır. mikroC’de onaltılı bilgi ‘0x’ tanımlayıcısıyla belirtilir. Örnek olarak, TRISB = 0x01; // B portunun RB0‐INT girişi hariç diğer tüm pinleri çıkış yapılıyor PORTB = 0x00; // B portunun tüm pinleri temizleniyor Verilen örneklerde 8 basamak ikili ve 2 basamak onaltılı sayıların olması, kullanılan mikrodenetleyicinin 8 bitlik olmasından dolayıdır. 8 bitlik bir mikrodenetleyicide veriler 8 bitlik paketler halinde işlenir. Ve‐rilen örneklerde ve yapılan uygulamalarda ağırlıklı olarak 8 bitlik mikrodenetleyiciler kullanıldığı için sayı işlemleri de 8 bit üzerinden yapılmaktadır. 8 bitlik bir veri ilk dört bit ve ikinci dört bit olarak iki grupta değerlendirilir. Tablo A.11’de 5 adet sayının bit ağırlıkları, bunların ikili gösterimi, onaltılık ve onlu karşılıkları verilmiştir. Tablo A.11 8 bitlik bir bilginin ikili, onaltılık ve onlu karşılıkları Bitler İkinci Dört Bit İlk Dört Bit Karşılıklar 7 6 5 4 3 2 1 0 İkili (Binary) Onaltılık (Hexadecimal) Onlu (Deci‐mal) İki taba‐nında kuvvetleri 2726252423222120Değerleri 128 64 32 16 8 4 2 1 Örnekler 0 1 1 0 0 1 0 1 0B01100101 0x65 101 0 0 0 0 0 0 1 0 0B00000010 0x02 2 0 0 1 1 0 1 0 0 0B00110100 0x34 52 1 0 0 0 1 0 0 0 0B10001000 0x88 136 1 1 0 1 0 0 1 1 0B11010011 0xD3 211 İkili bir sayının onlu karşılığı her bite karşılık gelen bit ağırlığının toplanmasıyla bulunur. Bilgi 4’er bitlik paketler halinde bölündüğü zaman hızlı şekilde onaltılık karşılığı da elde edilir. Tablo A.12’de 0‐15 arası sayıların ikili ve onaltılık karşılıkları verilmiştir. 381 Tablo A.12 0‐15 arası sayıların ikili ve onaltılık karşılıkları Onlu İkili Onaltılık 0 0000 0 1 0001 1 2 0010 2 3 0011 3 4 0100 4 5 0101 5 6 0110 6 7 0111 7 8 1000 8 9 1001 9 10 1010 A 11 1011 B 12 1100 C 13 1101 D 14 1110 E 15 1111 F Tablodan görüldüğü üzere 4 bitlik bir sayı dizisi için 16 farklı durum söz konusudur. 8 bitlik bir sayı sistemi için 16 x 16 = 256 (0 – 255) farklı durum ortaya çıkar. Bu mantıkla bit ağırlığına göre üretilebile‐cek en üst sayı değerini hesaplayabilirsiniz. Örneğin ‘int’ tamsayı değişken tipi hafızada 2 Byte’lık yer tutar. Bir Byte 256 sayı değeri tuttuğuna göre; 256 x 256 = 65536 farklı sayı değerine karşılık gelir. Dolayısıyla işaretsiz bir tamsayı değişkeni için en yüksek sayı değerinin 65535 olacağı ortaya çıkar. A‐9mikroC’deAritmetikVeriTürlerimikroC’de de diğer tüm programlama dillerinde olduğu üzere çeşitli aritmetik veri türleri vardır. void, char, int, float ve double, aritmetik veri türleridir. Bunların yanında short, long, signed ve unsigned öntakısı kullanılarak farklı değer aralığında değişkenler elde edilebilir. Aritmetik veri türleri “tamsayı‐integral” ve “kayan nokta – floating point” olmak üzere iki türdür. Tablo A.13’te tamsayı aritmetik veri türleri gösterilmiştir. Aritmetik veri türleri tuttukları sayı değerinin nega‐tif ve pozitif değer aralığında ya da yalnızca pozitif olması durumuna göre signed ya da unsignedöntakısı alır. Tabloda veri türlerinin önlerinde yer alan parantez içindeki öntakıların kullanımı zorunlu değildir. Örneğin char veri türü zaten işaretsiz olduğundan ayrıca önüne unsigned öntakısını koymaya gerek yoktur. Ancak negatif değer de tutacak char veri türünde bir değişken oluşturmak istiyorsanız bu durumda signed öntakısını da yazmanız gerekir. Tablo A.13 Tamsayı aritmetik veri türleriTür Byte cinsinden boyutu Sayı aralığıbit 1–bit 0 or 1 sbit 1–bit 0 or 1 (unsigned) char 1 0 .. 255 signed char 1 - 128 .. 127 382 Tür Byte cinsinden boyutu Sayı aralığı(signed) short (int) 1 - 128 .. 127 unsigned short (int) 1 0 .. 255 (signed) int 2 -32768 .. 32767 unsigned (int) 2 0 .. 65535 (signed) long (int) 4 -2147483648 .. 2147483647 unsigned long (int) 4 0 .. 4294967295 short ve long veri tanımlayıcıları yalnızca int veri türüne uygulanabilir. Bu durumda int veri türü‐nün yazımı zorunlu değildir. short ile 1 byte uzunluğunda, long ile 4 byte uzunluğunda tamsayı de‐ğişkenler üretilir. Küsüratlı sayı değerleriyle çalışılmak istendiğinde kayan nokta aritmetik veri türlerinin kullanımı gere‐kir. Bu durumda float, double ve longdouble olarak üç tür kayan nokta veri türü vardır. Ancak ANSI standartlarının “mikroC PRO for PIC” kullanımında bu üç veri türü de aynıdır. Tablo A.14’te de görüleceği üzere her üçünün de boyutları ve sayı aralıkları aynıdır. Tablo A.14 Kayan nokta aritmetik veri türleriTür Byte cinsinden boyutu Sayı aralığıfloat 4 -1.5 * 1045 .. +3.4 * 1038double 4 -1.5 * 1045 .. +3.4 * 1038long double 4 -1.5 * 1045 .. +3.4 * 1038A‐10mikroC’deFonksiyonlarmikroC’de fonksiyonlar bir dizi işlemin program içinden sık sık çağrılması istendiğinde ya da belli işlem‐lerin bir grup altında yazılması istendiğinde kullanılan program öbekleridir. Fonksiyonlar değer döndü‐ren ya da döndürmeyen olarak iki ana gruba ayrılır. Değer döndürmeyen fonksiyonlar için “void” ta‐nımlayıcısı kullanılır. mikroC’de “main()” ana fonksiyonu değer döndürmediği için başında “void” ta‐nımlayıcısı kullanılır. Tablo A.15’te kitap içindeki çeşitli uygulamalarda sık sık kullandığımız “ayarlar()” fonksiyonunun PIC16F887 için yazımına örnek verilmiştir. Tablo A.15Değer döndürmeyen fonksiyon örneğivoid ayarlar(){ Keypad_Init(); // Tuş takımı başlatılıyor Lcd_Init(); // LCD başlatılıyor Lcd_Cmd(_LCD_CLEAR); Lcd_Cmd(_LCD_CURSOR_OFF); INTCON=0; OPTION_REG = 0X87; TRISA=0X00; // Portaların giriş-çıkış tanımlamaları yapılıyor PORTA=0; // Portlara başlangıç değerleri atanıyor TRISC = 0x00; PORTC = 0; TRISE=0X00; PORTE=0; ANSEL = 0; // AN pinlerini dijital I/O olarak ayarla ANSELH = 0; 383 CM1CON0.C1ON=0; // Karşılaştırıcıları kapat CM2CON0.C2ON=0; } “ayarlar()” isimli bu fonksiyonun “main()” ana fonksiyonu içinden çağrılması için “main()” kod satırının üstünde yazılmış olması gerekir. Aksi durumda, derleşem işlemi yaptığınızda “Undeclared identifier ‘ayarlar’ expression” hata mesajı alırsınız. Değer döndüren fonksiyonlara genellikle çeşitli değer ya da değerler de gönderilir. Ayrıca döndürülen değer türü neyse “void” yerine o değer türü yazılır. Tablo A.16’da kendisine gönderilen iki tamsayıyı alıp toplama işlemi yapan ve sonucu tamsayı olarak döndüren bir fonksiyon örneği gösterilmiştir. Bu‐nun yanında aynı örnek içinde kendisine gönderilen iki sayının büyük olanını döndüren fonksiyon da vardır. Her iki fonksiyonun döndürdüğü değerler LCD ekrana yazdırılmaktadır. Tablo A.16 Değer döndüren fonksiyon örneği int toplam, maksimum; char top[7], mak[7]; int topla(int a, int b){ int sonuc; sonuc = a+b; return sonuc; } int maks(int x, int y) { return (x>=y) ? x : y; /* karşılaştırma sonucunda x büyükse x’i, de-ğilse y’i döndüren ? ... : yapısı */ } void main(){ toplam=topla(123,25); maksimum=maks(-21,15); IntToStr(toplam,top); IntToStr(maks, mak); Lcd_Out(1,1,top); Lcd_Out(2,1,mak); } Örnekleri inceleyecek olursak, ana program içinden iki fonksiyonun da çağrıldığı görülmektedir. Fonk‐siyonların içinde tanımlanmış değişkenler yerel (local) değişkendir. O değişken isimleri yalnızca kulla‐nıldığı fonksiyonun kendi içinde çağrılabilir. Başka bir fonksiyon içinden çağrılmaları söz konusu değil‐dir. Tanımlanan değişkenlerin her yerden çağrılabilmesi için evrensel tanımlama yapılmalıdır. Progra‐mın en başında “toplam” ve “maksimum” isimli iki evrensel değişken tanımlanmıştır. Bu değişkenlere, fonksiyonların döndürdüğü değerler atanmaktadır. Ardından tamsayı değerlerinin LCD ekranda yazdı‐rılması için Integer‐String dönüşümü yapılmaktadır. Tamsayı değişkenlerinin dönüşümü için kullanılan 7 karakterli metin değişkenlerine dönüştürülen değerler atanmaktadır. Böylece LCD ekrana yazdırma işlemi yapılabilir. 384 EK‐BMIKROCPROGRAMEDİTÖRÜNÜNARAÇLARIVEKULLANIMImikroC program editöründe çeşitli işlemleri kolay ve pratik şekilde gerçekleştirmemizi sağlayan bir dizi kısayol tuşu vardır. Program araçlarından bahsetmeden önce bu kısayol tuşlarını bilmeniz mikroC prog‐ram editörünü daha verimli kullanmanızı sağlayacaktır. Tablo B.1 mikroC Program Editörü Kısayolları IDE Kısayolları İleri Düzey Editör KısayollarıF1 Yardım Ctrl+Space Kos Asistanı Ctrl+N Yeni Kod Sayfası Açar Ctrl+Shift+Space Parametre Asistanı Ctrl+O Aç Ctrl+D Bildirim Bul Ctrl+Shift+O Proje Aç Ctrl+E Artımlı Arama Ctrl+Shift+N Yeni Proje Ctrl+L Rutin (Fonksiyon) Listesi Ctrl+K Projeyi Kapat Ctrl+G Satıra Git Ctrl+F4 Kod Sayfasını Kapatır Ctrl+J Kod Sihirbazı Ekle Ctrl+Shift+E Proje Düzenleme Penceresi Ctrl+Shift+. Yorum Kodu Ctrl+F9 Derleme Yapar Ctrl+Shift+, Yorum Kodunu Kaldır Shift+F9 Tümünü Derler Ctrl+number Yer İmine Git Ctrl+F11 Derler ve Programlar Ctrl+Shift+number Yer İmi Ayarla Shift+F4 Kesme Noktalarını İzler Ctrl+Shift+I Satırbaşı Sekmesi Ctrl+Shift+F5 Kesme Noktalarını Temizler Ctrl+Shift+U Sekme Kaldırma F11 Programlayıcıyı Başlatır TAB Satırbaşı Sekmesi Ctrl+Shift+F1 Proje Yöneticisi Shift+TAB Sekme Kaldırma F12 Seçenekler Alt+Select Sütun Olarak Seçim Alt+X Programı Kapatır Ctrl+Alt+Select Sütun Olarak Seçim Ctrl+Alt+L Seçileni Küçük Harf Yap 385 Temel Editör KısayollarıHata Ayıklayıcı ve Yazılım Simülatörü Kısayol‐larıF3 Bul, Sonrakini Bul F2 Kesmeye Atlar Shift+F3 Öncekini Bul F4 Kursörü Çalıştırır Alt+F3 Arama Penceresini Açar F5 Kesme Noktasını Değiştirir Ctrl+A Tümünü Seç F6 Hata Ayıklayıcıyı Çalış‐tır/Durdur Ctrl+C Kopyala F7 İçine Adım Ctrl+F Bul F8 Üstüne Adım Ctrl+R Yerdeğiştir F9 Hata Ayıklayıcıyı Başlat Ctrl+P Yazdır Ctrl+F2 Hata Ayıklayıcıyı Durdur Ctrl+S Kod Sayfasını Kaydet Ctrl+F5 İzleme Listesine Ekle Ctrl+Shift+S Tümünü Kaydet Ctrl+F8 Dışarı Adım Ctrl+V Yapıştır Alt+D Assembly Kod İzleme Ctrl+X Kes Shift+F5 İzleme Penceresini Aç Ctrl+Y Tüm Satırı Sil Ctrl+Shift+A İleri Düzey Kesme Nokta‐larını Göster Ctrl+Z Geri Al Ctrl+Shift+Z Yinele Ctrl+Alt+U Seçileni Büyük Harf Yap Ctrl+Alt+T İlk Harfleri Büyütür mikroC programının en önemli özelliği kullanıcıya işini kolaylaştırıcı çok sayıda araç sunmasıdır. mik‐roC’de program yazımı bu araçlar sayesinde daha keyifli ve hızlı gerçekleştirilebilir. mikroC’de kullanılan araçlara erişim menü çubuğundaki “Tools” menüsüden gerçekleştirilir. Şekil B.1’de “ToolsOptions (Tercihler)” ya da F12 ile açılan “Editor Settings – Editör Ayarları” penceresi görülmektedir. 386 Şekil B.1 Editör ayarları penceresi Bu pencereden program editörünüzün açılıştaki varsayılan ayarlarını değiştirebilirsiniz. Kodlamada kul‐lanılan renklerden, otomatik yorum satırına çevirmede kullanılacak yorum satırı tipi, otomatik kay‐detme, kesme noktaları, sekmeler ve yer imleriyle ilgili ayarlar gibi pek çok ayarlamayı bu pencereden yapabilirsiniz. Editör ayarları penceresi üzerinden yapabileceğiniz en önemli ayar, kod yazımınızı hızlandıracak olan “Auto Correct – Otomatik Düzelt” ve “Auto Complete – Otomatik Tamamla” seçenekleridir. Yoğun kod yazımlarında bazen çok temel ve çok sık kullanılan kodları yazarken harf hataları yapabilirsiniz. Bildiğiniz üzere programlamada tek bir karakter hatası bile derleme hatasına neden olabilir ya da programınızın öngördüğünüz şekilde çalışmasını engelleyebilir. Programlamada çok sık kullandığınız ‘while’, ‘if’, ‘for’, ‘void’, ‘double’, ‘float’, ‘int’, ‘signed’, ‘unsigned’, ‘PORTA’, ‘PORTB’, ‘PORTC’, ‘PORTD’, ‘Lcd_Out’, ‘Lcd_Cmd’ gibi daha pek çok kod öğesinin yanlış yazılma durumunda otomatik olarak düzeltilmesi için “Auto Correct” menüsünü kullanabilirsiniz. Şekil B.2’de otomatik düzeltme penceresinden bir kesit ve uygulama sonucunun bir kod parçasından kesiti gösterilmiştir. 387 Şekil B.2 Otomatik Düzeltme penceresi ve örnek düzeltme uygulaması Şekildeki örnekte ‘Lcd_Out’ komutunun ‘Ldc_Out’, ‘Ldc_Uot’, ‘LcdOut’ gibi yanlış yazımlarda düzeltil‐mesini sağlamak için “Original” ve “Replacement” metin alanlarına veri girdisi yapılmıştır. “Original” yazan metin kutusuna düzeltilecek hatalı sözcük girilir. “Replacement” yazan metin kutusuna ise doğru olan sözcük girilir. Her bir düzeltme alternatifi için ayrı ayrı giriş yapılır ve “Add” butonuna tıklanır. Şekilde görüldüğü üzere Lcd_out komutu kasıtlı olarak Ldc_Out olarak yazılmış ve parantez açıldığı anda otomatik düzeltme uyarısı gelmiştir. Bu özelliği kullanarak kendi otomatik düzeltme kütüphane‐nizi oluşturabilirsiniz. Kod yazımınızı hızlandıracak bir diğer uygulama “Options” penceresinden erişilebilen otomatik tamam‐lama özelliğidir. Program yazımında çok kullandığınız kodları “Ctrl+J” tuş ikilisiyle hızlıca kod yazım ala‐nına ekleyebilirsiniz. Şekil B.3’te böyle bir komut sonrası açılan pencerede seçebileceğiniz otomatik tamamlama kodları listelenmiştir. “Auto Complete” penceresini kullanarak listeye yeni kodlar ekleyebilirsiniz. Ya da yazdığınız kodların başında her zaman olmasını istediğiniz “header‐başlık” denilen ve genellikle programı yazanın künye‐sinin olduğu bir sabit metin eklemek istiyorsanız bu özelliği kullanabilirsiniz. Şekilde örnek olarak “for statement” yapısının nasıl eklendiği görülmektedir. Eklemek istediğiniz ifadenin içeriğini pencerenin alt bölmesinde yer alan metin yazım alanına yazıp “Add” butonuna tıklayarak eklersiniz. Bu pencereler açıkken yapmış olduğunuz değişikliklerin kalıcı olabilmesi için, pencereleri kapattığınızda karşınıza çıkan “Apply Changes? – Değişiklikler Uygulansın mı?” penceresinde “Do you want to apply changes? – Değişiklikleri uygulamak istiyor musunuz?” sorusuna Evet cevabını tıklamanız gerekmekte‐dir. 388 Şekil B.3 Otomatik tamamlama özelliği örnek uygulaması mikroC’nin araçlar menüsünden ulaşılabilen bazı araçları şu şekilde listeleyebiliriz: ‐mE Programmer (F11): mikroC programının kurulumu sırasında yüklemek isteyip isteme‐diğinizin sorulduğu “mikroProg Suite For PIC” programının başlatıcısıdır. Microchip® firma‐sının yüzlerce farklı PIC mikrodenetleyicisine HEX kodunu yazmak için kullanılan program‐layıcıyı kontrol eder. mikroElektronika® firmasınca hangi model cihaz için hangi mikrode‐netleyicilerin programlanabileceği belirtilmiştir. Ayrıntılı ve güncel bilgi için http://www.mikroe.com/mikroprog/pic‐dspic‐pic32/ adresini ziyaret edebilirsiniz. Bu say‐fada PIC®, dsPIC®, PIC24® ve PIC32® ailesi mikrodenetleyiciler için tek donanımda prog‐ramlama olanağı sunan cihazla ilgili ayrıntılı bilgi bulunmaktadır. ‐MikroProg Power Options (Ctrl+Alt+P): Mikrodenetleyicinin programlanması sırasında kullanılacak voltaj değerini ayarladığınız araçtır. ‐Active Comment Editor: Programın ilgili yerine dikkat çekici bir yazı formatında yorum yazmanızı ve yorumu çeşitli şekillerde düzenleme fırsatı sunan araçtır. Yorumun eklendiği yerin başına otomatik olarak açıklama satırı “//” karakteri eklenir. ‐Ascii Chart: ASCII karakter tablosu aracıdır. Bilindiği üzere ASCII karakter tablosu 8 bitlik ve dolayısıyla 0‐255 arası toplam 256 karakterin desimal ve hekzadesimal olarak kodlandığı bir karakter tablosudur. Programlarınızda desimal ya da hekzadesimal olarak yazdırmak is‐tediğiniz karakterlerin kodlarını bu tablodan yararlanarak öğrenebilirsiniz. ‐EEPROM Editor: Bu araç yardımıyla üzerinde çalıştığınız mikrodenetleyicinin EEPROM veri belleğinde düzenleme yapabilirsiniz. ASCII karakter tablosundan yararlanarak veri belleği‐nin istediğiniz bölgesine 8 bitlik bir karakter yazabilirsiniz. Yaptığınız değişikliklerin mikro‐ 389 denetleyicinin veri belleğine yazılabilmesi için mikroElektronika®’nın programlayıcı cihazı‐nın çalışır durumda olması gerekmektedir. EEPROM düzenleyicisinde istediğiniz düzenle‐meyi yaptıktan sonra “Save” butonuyla kaydetme işlemi yaptığınızda intel hex dosyası (.ihex) oluşturulur. Programlama cihazı tarafından bu dosyanın manüel olarak yüklenmesi gerekmektedir. ‐Export Code to HTML: Bu araç yardımıyla kodunuzu web sayfalarınız için yayına hazır hale getirebilirsiniz. Program kodunuzun yer aldığı dosya klasöründe .html uzantılı bir dosya olu‐şur. ‐GLCD Bitmap Editor: KS0108, T6963 ve Nokia® 3310 Grafik LCD’leri için Bitmap formatında monokrom (tekrenk) desen düzenlemesi yapmanızı sağlayan araçtır. Dilerseniz standart‐lara uygun hazır bir dosya ya da bir Bitmap programında sizin hazırlayacağınız bir dosyayı seçip yükleyebileceğiniz gibi, çizmek istediğiniz deseni program arayüzünü kullanarak da hazırlayabilirsiniz. Pencerenin “Generate Code” alanında kodunuzda kullanabileceğiniz ko‐dun üretildiğini görürsünüz. Bu kodu kopyalamak suretiyle üzerinde çalıştığınız .c dosyasına yapıştırabilirsiniz. ‐HID Terminal: USB haberleşmesi için bir haberleşme terminalidir. USB arabirimi ile bilgisa‐yarınıza bağlanan PIC mikrodenetleyicili bir cihaza veri yollamak için kullanılır. Doğrudan USB desteği sunan 18F4550 gibi bir mikrodenetleyici ile yapacağınız HID donanımına bilgi‐sayarınızdan mesaj yollayabilirsiniz. ‐Interrupt Assistant: Program içinde kendi kesme rutinlerinizi düzenlemek için kullanacağı‐nız bir yardımcı araçtır. mikroC ile kesmelerle çalışırken normalde “interrupt()” rutini kul‐lanılır. Ancak yeni rutin isimleriyle kesmelerinizi farklı rutinlerde işletmeniz mümkündür. ‐LCD Custom Character: LCD ekran için 5x7 ya da 5x10 karakter boyutlarında nokta bazında istediğiniz karakteri oluşturmak için kullanabileceğiniz bir araçtır. Özellikle Türkçe karak‐terleri yazdırma olanağımızın olmadığı metin tabanlı LCD ekranlarda, dilediğimiz karakteri yazdırabilmek için çok iyi bir araçtır. Ancak 2x16 formatında karakter LCD ekranda 5x7 for‐matını kullanmamız gerekir. Deseni fare ile tıklamak suretiyle oluşturduktan sonra “Gene‐rate Code” butonu ile karakter kodu üretilir. “Copy to Clpboard” ile üretilen karakter kodu panoya kopyalanır. Kopyalama işleminden sonra karakter kodunu kendi programınızda kul‐lanabilirsiniz. Örnek:Tablo B.2 2x16 Satır LCD için özel karakter üretilmesi sbit LCD_RS at RB2_bit; //LCD bağlantıları ayarlanıyorsbit LCD_EN at RB3_bit; sbit LCD_D4 at RB4_bit; sbit LCD_D5 at RB5_bit; sbit LCD_D6 at RB6_bit; sbit LCD_D7 at RB7_bit; sbit LCD_RS_Direction at TRISB2_bit; sbit LCD_EN_Direction at TRISB3_bit; sbit LCD_D4_Direction at TRISB4_bit; sbit LCD_D5_Direction at TRISB5_bit; sbit LCD_D6_Direction at TRISB6_bit; sbit LCD_D7_Direction at TRISB7_bit; const char character[] = {10,0,14,17,17,17,14,0}; void CustomChar(char pos_row, char pos_char) { char i; 390 Lcd_Cmd(64); for (i = 0; i<=7; i++) Lcd_Chr_CP(character[i]); Lcd_Cmd(_LCD_RETURN_HOME); Lcd_Chr(pos_row, pos_char, 0); } void main() { Lcd_Init(); // Lcd_Init PORTB LCD için hazırlandı Lcd_Cmd(_LCD_CURSOR_OFF); // LCD kursör kapatıldı Lcd_Cmd(_LCD_CLEAR); /* LCD'de rastgele karekter oluşmamasıiçin silindi */CustomChar(1,1); }Tablo B.2’de LCD karakter üretme aracı kullanılarak elde edilen ‘ö’ harfinin kullanımını gösteren bir program örneği görülmektedir. CustomChar(1,1) rutini ana rutin içinde kullanılarak 1.satır 1.sütuna ta‐sarlanan karakter yazdırılmaktadır. Burada pos_row ve pos_char değişkenlerine yolladığınız sayı değer‐lerini değiştirerek LCD ekranın farklı noktalarına yazabilirsiniz. ‐mikroBootloader: PIC16F87X ailesi mikrodenetleyiciler kendi program hafızalarına yaza‐bilme kabiliyetine sahiptir. Bu özellik hafızaya yeni bir firmware yazabilen küçük bir önyük‐leyiciye (bootloader) imkân sağlar. En basit formunda, yeni bir firmware indirilmesi gerek‐tiğini görmüyorsa önyükleyici kullanıcı kodunu çalıştırmaya başlar. Eğer indirilecek yeni bir firmware varsa veriyi alır ve onu program hafızasına yazar. Bir önyükleyicinin daha yaygın özellikleri şu şekilde sıralanabilir: Mikrodenetleyicinin Reset konumuna kod yazabilme (Böylece kesme rutinlerini kullanmak zorunda kalmadan, Resetleme işlemiyle birlikte mikrodenetleyicinin Re‐set vektör adresini kullanan bir program yükleyebilirsiniz). Küçük bir bellek alanında başka yerlere kod yazabilme. Kullanıcının yeni kullanıcı kodu yüklemek isteyip istemediğini kontrol eder. Yeni kullanıcı kodu yüklenmeyecekse kullanıcı kodunun yürütülmesini başlatır. Kod yüklenecekse yeni bir iletişim kanalıyla yeni kullanıcı kodunu alır. Yeni kullanıcı kodunu belleğe programlar. Önyükleme kodu çoğunlukla Reset konumunu ve bir miktarda ek program belleğini kulla‐nır. Kesmeleri kullanmaya ihtiyaç duymayan basit bir kod parçasıdır. Bu nedenle, kullanıcı kodu normal kesme vektörü 0x0004’ü kullanabilir. Önyükleme kodunun kesme vektörünü kullanmaması gerekir. Bu nedenle 0x0000 ile 0x0003 adresleri arasında bir program dal‐lanmasına sahip olmalıdır. Önyükleme programı klasik programlama teknikleriyle belleğe programlanmalıdır ve konfigürasyon bitleri bu sırada programlanmalıdır. Konfigürasyon bitleri program belleği alanında adreslenmediğinden önyükleme kodu konfigürasyon bitle‐rine erişemez. ‐Seven Segment Editor: 7 Segmentli göstergede görmek istediğiniz karakterleri desimal ve hekzadesimal değerlerde elde etmenizi sağlar. ‐UDP Terminal: Verileri bağlantı kurmadan yollamak için kullanılan ve IP protokolü üzerin‐den çalışan bir veri aktarım katmanı olan UDP’yi açmayı ve kullanmayı sağlayan araçtır. ‐USART Terminal: Senkron ya da Asenkron olarak seri iletişim protokolü üzerinden iletişim kurmayı sağlayan seri iletişim portlarını kullanan araçtır. ‐USB HID Bootloader: Önyükleme programının yaptığı işi USB arabirimi üzerinden gerçek‐leştiren araçtır. 391 EK‐CPICMİKRODENETLEYİCİLERİNDEPORTLARAYÜKBAĞLANTISIVEPORTKONTROLÜMikrodenetleyicilerin ilgili portlarına yük bağlantısı gerçek devre tasarımlarında çok dikkat edilmesi ge‐reken bir konudur. Mikrodenetleyicinin her bir portunun pinlerinden geçebilecek en yüksek akım de‐ğeri üretici tarafından belirtilmiştir. PIC mikrodenetleyici portlarının sürebileceği akım değeri LED gibi doğrudan yük bağlantılarında hesaba katılmalıdır. C‐1MikrodenetleyicilerdeSinkveSourceAkımlarıMikrodenetleyici portlarına yük bağlantısında kullanılacak iki yöntem vardır. Bu yöntemlerden biri çıkış portu ile GND (devre şasesi) arasına yük bağlanmasıdır (Bkz. Şekil C.1‐a). Bu şekilde porttan çekilen akıma “Kaynak (Source) Akımı” denir. Kaynak akımı MCU modeline bağlı olarak 20mA ya da 25mA ka‐dardır. Diğer yöntemde ise yük, çıkış portu ile VCC (genellikle +5V) arasına bağlanır (Bkz. Şekil C.1‐b). Bu du‐rumda kaynaktan porta ve oradan devre şasesine akım geçişi olur. Besleme kaynağından çekilen bu akıma “Batarya (Sink) Akımı” denir ve 25mA kadardır. Her bir pin için çekilebilecek en yüksek akım değeri 25mA kadarken, o pinin ait olduğu porttan toplu halde aynı anda çekilebilecek akım genellikle 200mA kadardır. Şekil C.1 Mikrodenetleyici portlarında sink ve source akımları Yaygın olarak Şekil C.1‐a’da gösterilen bağlantı yöntemi kullanılmaktadır. Bu durumda yükün aktif edil‐mesi için ilgili portun çıkışı lojik‐1 yapılmalıdır. Diğer durumda ise lojik‐0 ile çıkış aktif yapılır. Şekil C.1‐a’da gösterilen uygulama devresinde çıkışı aktif yapmak için aşağıdaki yöntemlerden istenilen kullanılabilir. Tablo C.1 Kaynak akımı yöntemiyle port kontrolü void main() { CMCON = 0X07; //Karşılaştırıcılar kapatılıyor TRISA = 0; (a) (b) Source Akımı Sink Akımı 392 PORTA.B0 = 1; //Doğrudan RA0 pininin yüklenmesi //PORTA = 1; //PORTA'nın Desimal olarak yüklenmesi //PORTA = 0B00000001; //PORTA'nın Binary olarak yüklenmesi //PORTA = 0X01; //PORTA'nın Hekzadesimal olarak yüklenmesi //PORTA.F0 = 1; }Şekil C.1‐b’de gösterilen uygulama devresinde çıkışı aktif yapmak için aşağıdaki yöntemlerden istenilen kullanılabilir. Tablo C.2 Batarya akımı yöntemiyle port kontrolü void main() { CMCON = 0X07; //Karşılaştırıcılar kapatılıyor TRISB = 0; PORTB.B7 = 0; //Doğrudan RB7 pininin yüklenmesi //PORTB = 0; //PORTB'nin Desimal olarak yüklenmesi //PORTB = 0B00000000; //PORTB'nin Binary olarak yüklenmesi //PORTB = 0X00; //PORTB'nin Hekzadesimal olarak yüklenmesi }C‐2MikrodenetleyicilerdeAnahtarlamaElemanlarınınKullanımıMikrodenetleyiciler profesyonel ve endüstriyel tip uygulamalarda elektronik tetikleme elemanlarıyla kullanılırlar. Portların daha yüksek akım çeken yükleri kontrol etmesinin istendiği yerlerde transistör ya da mosfet kullanılır. Tristör ve triyak gibi AC akım kontrolü gerçekleştirebilen elemanların sürülmesi için de optokuplör kullanılarak voltaj yalıtımı sağlanmalıdır. Şekil 3.5’te uygulaması gösterilen flaşör devresinin mosfet ile gerçekleştirilmiş hali Şekil C.2’de gösterilmiştir. Şekil C.2 PIC ile MOSFET üzerinden yük sürülmesi Şekildeki devrede IRF840 MOSFET’i kullanılmıştır ve MOSFET 1kΩ’luk direnç üzerinden tetiklenmiştir. MOSFET’in giriş ucunun boşta bırakılması durumunda kararsız çalışmasını önlemek için Gate ile şase arasına 100kΩ’luk direnç bağlanmıştır. Bu devrede kullanılan MOSFET’in kanal (drain) akımı 8A kadardır ve çok sayıda LED’den oluşan bir aydınlatma grubunu rahatlıkla kontrol edebilir. Power LEDler kullanı‐larak yapılacak bir uygulama için çok uygundur. 393 Şekil C.3’te Mikrodenetleyici ile triyak üzerinden bir yükün sürülmesi gösterilmiştir. Örnek uygulamada MOC3021 optokuplör elemanı kullanılmıştır. Tristör ve triyak gibi anahtarlama elemanlarının kontro‐lünde optokuplör kullanılarak mikrodenetleyicinin kontrol edilecek yüksek akım devresinden yalıtımı yapılmış olur. PIC16F628A’nın RB3 portunda yer alan CCP1 modülü kullanılarak PWM sinyali elde edil‐miştir. Bunun için mikroC’nin PWM kütüphanesi kullanılmıştır. Şekil C.3 Mikrodenetleyici ile triyak üzerinden bir yükün sürülmesi Tablo C.3’te triyak ile AC akımda lambanın kontrolü için kullanılacak kod gösterilmiştir. Gerçekte AC yükün bu şekilde kontrolü kıpraşma (flickering) dediğimiz bir sorunun ortaya çıkmasına neden olur. Kıpraşma etkisinin en aza indirgenmesi amacıyla Şekil 4.10’da uygulaması gösterilmiş devre örneği kul‐lanılmalıdır. Söz konusu uygulamada ikinci bir optokuplör yardımıyla sıfır nokta tespiti (zero‐crossing) tekniği gerçekleştirilmiştir. Böylece, AC şebeke geriliminin ekseni sıfıra yakın noktalarda kesmesi anında PWM sinyalinin kesilerek triyakın kesime gitmesi sağlanmıştır. Tablo C.3 Mikrodenetleyicide PWM tekniği unsigned short current_duty; /*PWM darbe sinyalinin aktif ve pasif olma süresini tutacak olan değişken */ void main() { CMCON = 0X07; //Karşılaştırıcılar kapatılıyor. TRISA = 0; // A portu çıkış TRISB = 0; // B portu çıkış PORTA=0; // A portu temizleniyor PWM1_Init(1000); //1KHz’lik PWM sinyali current_duty = 16; //Darbe sinyalinin aktiflik oranı (16/255)*100 PWM1_Start(); //PWM sinyali B portunun B3 pininden uygulanıyor PWM1_Set_Duty(current_duty);/*PWM sinyalinin aktiflik oranı kurulu-yor */ while(1){ //parlaklık kontrolü sürekli olarak yapılıyor do{ // İlk önce aktiflik oranı yükseltilerek kontrol edilen current_duty++; //lambanın parlaklığı yükseltiliyor delay_ms(100); }while(current_duty<256); do{ // ardından ikinci döngüyle kontrol edilen current_duty--;// lambanın parlaklığı azaltılıyor delay_ms(100); }while(current_duty>0); 394 } }DİKKAT: Yüksek akım kontrolü yapılan uygulamalarda son derece dikkatli olunmalıdır. Elektrik‐elektro‐nik konusunda tecrübe eksikliği olanların bu uygulamaları yapmadan önce güvenilir kaynaklardan ye‐terli bilgiye sahip olmaları gerekmektedir. ÇOK ÖNEMLİ: PROTEUS‐ISIS® ortamında yapılan simülasyonlarda varsayılan olarak tek şase (ground) kullanılır. AC hattın ve DC besleme hattının şasesi ayrılmalıdır. Bilindiği üzere AC beslemeli sistemlerde giriş yönü farkı yoktur ve DC hattınızın şasesine Faz (L) hattının denk gelecek olması ciddi yaralanmalara ve hasarlara yol açabilir. Baskı devresi çıkartılması düşünülen uygulamalarda hatların birbirinden ayrı‐larak yol bağlantıları oluşturulmalıdır. Bu işlem için: Öncelikle her hattın şasesi farklı isimlendirilir. Şekil C.3’te DC hattın şasesi ‘VSS’, AC hattın şa‐sesi ‘GND’ olarak isimlendirilmiştir. Bu yapıldıktan sonra PROTEUS‐ISIS® 8 sürümünde DesignConfigure Power Rails menüsün‐den VSS adında yeni bir POWER hattı eklenmelidir. PROTEUS’un varsayılan güç bağlantıları (Use default power rail connections?) seçeneği seçi‐liyse kaldırılmalıdır. “Power Supplies” seçeneğinin “Names” alanında GND seçiliyken, sağ tarafta “Nets connected to GND” yazan alanda yalnızca GND olmalıdır. Eğer bu alanda “VSS” hattı da gözüküyorsa üzerine tıklanmalı ve “<‐Remove” butonuyla liste‐den kaldırılmalıdır. Ardından ikinci adımda oluşturduğunuz VSS hattı aynı pencerenin “Power Supplies” alanından seçilmeli ve “Unconnected power nets:” alanında yer alan VSS değerine tıklanarak “Nets con‐nected to GND” yazan alana “Add‐>” butonuyla eklenmelidir. Mikrodenetleyicilerin endüstriyel ya da pratik uygulamalarından biride röle kumandasıdır. Yaygın ola‐rak mikrodenetleyicilerle röle kumandasında elektronik anahtarlama elemanı olan transistör tercih edilmektedir. Şekil 4.4’te uygulaması yapılan devrede LED elemanlarının yerine daha yüksek akım çeken ve 220VAC ile çalışan aydınlatma elemanları takılabilir. Böylece devre günlük yaşamda kullanılabilecek bir yapıya kavuşturulmuş olur. Bunun için DC 5V tetiklemeyle çalışan ve 7‐8 Amper akıma kadar yük kontrol ede‐bilen rölelerden faydalanabiliriz. Şekil C.4’te böyle bir uygulama devresi gösterilmiştir. 395 Şekil C.4 Mikrodenetleyici ile röle üzerinden AC şebekeye bağlı yükün kontrol edilmesi Transistörler 1 mA’in altında akımlarla tetiklenebilen devre elemanlarıdır. Baz ayağı ile mikrodenetle‐yicinin portu arasına bağlanacak 10K’lık bir direnç ile tetikleme anında 0,4‐,0,5 mA dolaylarında bir akım elde edilir (VCC’nin 5V olması durumunda). Yeterli tetikleme akımı oluştuğunda transistorün ko‐lektör‐emetör arası kısa devre gibi davranır. VCC ve kolektör arasına 5V’luk bir rölenin besleme sargısı bağlandığında röle kontakları NC (Normal Close – Normalde Kapalı) ucundan NA (Normal Open – Nor‐malde Açık) ucuna geçer. Bobin sargısının bağlandığı hatta direnç bağlanmasına gerek yoktur. Bobin iç direnci 200‐300 ohm kadardır ve tetikleme sırasında transistör kolektöründen 20 mA dolaylarında bir akım geçer. Bu değer transistörün en yüksek yük akımı sınırının çok altındadır. Transistörün röleyi tetiklemesinde VCC beslemesi ile transistorün kolektörü arasına (rölenin sargılarına paralel) ters diyot bağlanır. DC akımda rölenin bobin görevi gören sargısı hemen akım geçirmez. Bobin sargılarında zıt EMK’dan kaynaklı ters polarizeli voltaj yüklemesi olur ve bu ilk anda doğrudan transistör kolektöründe belirir. Bu durum transistorün aşırı akım geçirmesine ve arızalanmasına neden olur. Bu nedenle yalnızca tek yönde akım ileten diyot devre elemanının kullanılması şiddetle tavsiye edilir. Rö‐lenin NA ucuna yükün bir ayağı bağlanır ve röle tetiklendiğinde enerjilenmiş olur. Rölelerin C (Common‐Ortak) ayakları AC beslemenin diğer girişine ortak bağlanmıştır. Bu devrede de DC ve AC hattın şaseleri birbirinden ayrılmıştır. AC yüklerin röle üzerinden mikrodenetleyici ile sürülmesi sırasında hatta oluşan manyetik parazit MCU’nun resetlenmesine neden olabilir. Bu nedenle rölenin bobin sargısı uçları arasına “stubber‐fren‐leme” denilen ve kondansatör‐direnç ikilisinden oluşan bir ek yapılır. Frenleme devresinin uygulama örneği Şekil C.5’te gösterilmiştir. 396 Şekil C.5 47nF ve 100Ω kullanılarak yapılan bir frenleme devresi uygulaması Resimde K1 girişi MCU’nun dijital I/O pininden gelen kontrol bağlantısıdır. Röle gibi selonoid yüklerin sağlıklı şekilde tetiklenmesinde kullanılan ve kondansatör‐direnç ikilisi kullanılarak yapılan frenleme devrelerinin tasarımı kitap kapsamı dışındadır. Ancak, piyasada yaygın olarak kullanılan rölelerin selo‐noid sargıları için kullanılacak uygun frenleme devresi değerleri Şekil C.5’te gösterildiği gibi yeterli ola‐caktır. Frenleme devresiyle birlikte daha dengeli çalışan bu rölelerden farklı olarak “solidstate‐katıhal” rölesi olarak adlandırılan röleler bulunmaktadır. Şekil C.6’da gösterilen benzeri solidstate rölelerden yararlanarak daha kararlı çalışan anahtarlama uygulamaları yapabilirsiniz. Şekil C.6 Çeşitli tipte solidstate röleler C‐3MikrodenetleyicilerdeButonlarınKullanımıMikrodenetleyicilerde buton bağlantısı iki yöntemle gerçekleştirilir: Birinci yöntemde butona basıldığında giriş Lojik‐0 (Low‐Düşük) olur. Bu uygulamada butonun bir ucu genelde direnç üzerinden VCC’ye (kaynak), diğer ucu ise şaseye bağlıdır (Bkz. Şekil C.7). Direnç değeri genellikle 4.7KΩ‐10KΩ arasında seçilir. Bu dirence pull‐up direnci denir. 397 Şekil C.7 Pull‐up buton bağlantısı Pull‐up bağlantılı buton ile devre kontrolünde girişin Lojik‐0 olma durumu izlenir. Diğer yöntemde ise butona basıldığında giriş Lojik‐1 (High‐Yüksek) olur. Bu uygulamada butonun bir ucu direnç üzerinden şaseye, diğer ucu ise VCC’ye bağlanır (Bkz. Şekil C.8). Bu bağlantı yöntemine pull‐down denir. Pull‐down bağlantılı buton ile devre kontrolünde girişin Lojik‐1 olma durumu izlenir. Şekil C.8 Pull‐down buton bağlantısı Tüm mikrodenetleyicilerde buton kullanımı sırasında ilgili port girişinde sıçrama etkisi (bouncing) dedi‐ğimiz istenmeyen bir olay meydana gelir. Bu olay buton, anahtar (switch) ve sınır anahtarı gibi mekanik bileşenlerin fiziki özelliğinden kaynaklanan bir durumdur. Şekilde C.9’da sıçama etkisinin olmadığı ideal durum ve sıçrama etkisinin yaşandığı tetikleme anı resmedilmiştir. 398 Şekil C.9Mekanik tetikleme bileşenlerinde sıçrama etkisi Bu etkiyi ortadan kaldırmak için çeşitli yöntemler vardır. MikroC programınca kullanılan Buton ve Key‐pad kütüphanelerinde bu etki ortadan kaldırılacak şekilde kodlama yapılmıştır. Ancak kütüphane kul‐lanmadan bu etkiyi pas geçmek istiyorsanız Tablo C.4’te gösterildiği gibi sık kullanılan ufak bir yazılım hilesi yapabilirsiniz. Tablo C.4Sıçrama (bouncing) etkisini ortadan kaldıran kodlama örneğiif(PORTB.F0 == 0) //PORTB.0’a bağlı butona basıldı mı kontrol ediliyor{ Delay_ms(100); //100ms kadar bekle if(PORTB.F0 == 0) //butona hala basılı mı kontrol et { /* Butona gerçekten basılmış olduğuna karar verilir. Butona basıldıktan sonraki işlemler bu blokta gerçekleştirilir. */ } }Bir butona ideal basma ya da mekanik bir anahtarı ideal olarak tam kapalı hale getirme süresinin mini‐mum 100 ms kadar olduğu ölçülmüştür. Dolayısıyla hazırlanan kodlamada bu ilkeden yola çıkılarak ge‐çici bir bekleme süresi oluşturulmuş ve bu sürenin sonunda hala mevcut durumun korunup korunma‐dığına bakılmıştır. Yapay gecikmenin kullanılmasının istenmediği durumlarda Timer kesmesi kullanıla‐rak da benzer işlem gerçekleştirilebilir. C‐4MikrodenetleyicilerdeDâhiliPull‐UpDirençleriPIC mikrodenetleyicilerin genellikle B portları dâhili pull‐up direnci (Weak Pull‐ups) içerir. Bu özellik harici bir direnç kullanmayı gerektirmeden girişlerin doğrudan bir buton ya da sensör kontrolü için kul‐lanılabilecek bir Lojik kapı devresine bağlanmasını sağlar. Bu dâhili pull‐up dirençleri gerçek bir direnç yerine MOSFET kullanılarak tasarlanmış ve direnç değeri 10’larca KΩ (Ör: 50 KΩ) olabilen devre ele‐manlarıdır. Giriş tetiklendiğinde mikroamperler seviyesinde (yaklaşık 200 µA) akım çekerler. Genellikle SRAM’de yer alan kütüklerden birinin yazılımsal olarak programlanması suretiyle aktif ya da pasif kılı‐nabilirler. Pull‐up dirençlerinin bağlı olduğu port çıkış yapıldığında diğer portlar gibi çalışır ve pull‐up dirençleri devre dışı bırakılır. Şekil C.10’da dâhili pull‐up dirençlerinin portun giriş ya da çıkış yapılması durumundaki etkisi gösterilmiştir. 399 Şekil C.10 Dâhili pull‐up dirençlerinin etkin ve pasif kılınması Şekilden görüldüğü üzere dâhili pull‐up dirençleri port giriş yapıldığında anlam kazanmaktadır. Bu özel‐lik sayesinde ilgili port (PORTB) hızlı şekilde giriş değişimlerine tepki gösterebilir. Aşağıda bazı PIC mo‐delleri için dâhili pull‐up dirençlerini etkin kılmayı sağlayan ilgili kütük ve bitleri gösterilmiştir: PIC16F628A için Tercih Kütüğünün (OPTION REGISTER – 80h, 81h) 7.biti (RPBUതതതതതതതത) kullanılır. Bit değeri 1 yapılırsa PORTB dâhili pull‐up dirençleri devre dışı bırakılır. B portu çıkış yapıldığında ya da Power‐on Reset durumunda otomatik olarak bu dirençler devre dışı bırakılır. Bit değeri 0 yapılırsa, pull‐up direnç‐leri tek tek port ‘latch’ değerleriyle etkinleştirilir. PIC18F2450/4450 için Kesme Kontrol Kütüğü‐2 (Interrupt Control Register 2 – FF1h) 7.biti (RPBUതതതതതതതത) kul‐lanılır. Bit değeri 1 yapılırsa PORTB dâhili pull‐up dirençleri devre dışı bırakılır. B portu çıkış yapıldığında ya da Power‐on Reset durumunda otomatik olarak bu dirençler devre dışı bırakılır. Bit değeri 0 yapılırsa, pull‐up dirençleri tek tek port ‘latch’ değerleriyle etkinleştirilir. PIC16F882/883/884/886/887 için Tercih Kütüğünün (OPTION REGISTER – 81h, 181h) 7.biti (RPBUതതതതതതതത) kul‐lanılır. Bit değeri 1 yapılırsa PORTB dâhili pull‐up dirençleri devre dışı bırakılır. B portu çıkış yapıldığında ya da Power‐on Reset durumunda otomatik olarak bu dirençler devre dışı bırakılır. Bit değeri 0 yapılırsa, pull‐up dirençleri tek tek port ‘latch’ değerleriyle etkinleştirilir. Bu mikrodenetleyicide farklı olarak B portu pinlerini tek tek kontrol etmeyi sağlayan bir kütük daha vardır. Zayıf pull‐up PORTB kütüğü olan WPUB ile B portunun her bir pull‐up girişi birbirlerinden bağımsız olarak programlanabilir. WPUB (WEAK PULL‐UP PORTB REGISTER – 95h) R/W‐1 R/W‐1 R/W‐1 R/W‐1 R/W‐1 R/W‐1 R/W‐1 R/W‐1 WPUB7 WPUB6 WPUB5 WPUB4 WPUB3 WPUB5 WPUB4 WPUB3 bit 7 bit 0 WPUB<7:0> : Weak Pull‐up Kütüğü bitleri 400 1 = Pull‐up etkin 0 = Pull‐up devre dışı NOT 1: Bu kütüğün kullanılabilmesi için Tercih Kütüğü (OPTION) Evrensel RPBUതതതതതതതത biti temizlenmelidir. 2: İlgili port pini çıkış yapılırsa weak pull‐up devre dışı kalır. C‐5MikrodenetleyicilerdeOpenDrainveOpenCollectorÇıkışlarÖzellikle sayısal entegre devrelerde (mikrodenetleyiciler, kapı entegreleri, dijital sinyal entegreleri, vb.) sıkça karşımıza çıkan bir deyimdir. Açık akar (Open Drain) özellikli IC pinleri OD, açık kollektör (Open Collector) özellikli IC pinleri OC olarak gösterilirler. “Drain”, FET transistörlerde, “Collector” ise BJT tran‐sistörlerde olan bir bacak ismidir. Mikrodenetleyicilerin I/O hatlarında yaygın olarak bir FET türevi olan MOSFET kullanıldığından, “OD” pinleri mikrodenetleyicilerde sıklıkla karşımıza çıkar. 74 serisi sayısal entegre devre bileşenlerinin I/O hatlarında ise yaygın olarak BJT kullanıldığından, “OC” özellikli pinler bu IC bileşenlerinde karşımıza çıkar. Şekil C.11’de örnek bir mikrodenetleyicinin OD özellikli pini, ve 74 serisi bir entegrenin de OC özellikli pini gösterilmiştir. Şekil C.11 Sayısal entegre devre bileşenlerinde Open Drain ve Open Collector çıkış pinleriOD ve OC özellikli pinler için karşımıza çıkacak bir yabancı terimde “current sink” deyimidir. Bu deyim akımın içeri doğru aktığını ifade eder (Bkz. Şekil C.1‐b). Kısacası OD ve OC özellikli pinlerde akım içeri doğru akmaktadır. Şekilden de görüleceği üzere MOSFET’in drain ayağı ve BJT’nin kolektör ayağı açık‐tadır ve doğrudan entgre paketinin dışına bağlantı pini olarak çıkmaktadır. Dolayısıyla OD ve OC özellikli pinlerin sayısal I/O olarak kullanılması istendiğinde pinlere harici pull‐up direnci bağlanmalıdır. Direnç bağlantısının haricinde Şekil 5.7’de gösterilen uygulamada olduğu gibi NPN ve PNP transistör ikilisi kul‐ 401 lanılarak yapılan push‐pull bağlantı tekniği de kullanılabilir. Mikrodenetleyicilerin OD pinlerini çıkış ola‐rak kullanmak istediğinizde push‐pull bağlantılı devre düzenlemesi uygun lojik seviyenin sağlanması noktasında daha doğru bir yaklaşım olacaktır. 402 EK‐DD1‐16F628AMİKRODENETLEYİCİSİNİNTEKNİKÖZELLİKLERİ PIC16F628A, 18‐pinli orta ölçekli (Mid‐Range) 8 bitlik Flash ROM özellikli bir Microchip® mikrodenetle‐yicisidir. 627A ve 648A serisiyle aynı sınıftandır. Teknik özellikleri genel olarak kısaca aşağıdaki gibidir: Yüksek Performans RISC mimarili CMOS CPU: ‐Çalışma frekansı 0 Hz (DC) – 20 MHz arasındadır. ‐Kesme kabiliyetlidir. ‐8‐seviye derinliğinde donanım yığınına sahiptir. ‐Doğrudan, dolaylı ve bağıl adresleme modları mevcuttur. ‐35 adet tek kelimelik komut kümesine sahiptir. Dallanma komutları hariç tüm komutlar tek çevrim süresinde işletilir. Özel Mikrodenetleyici Özellikleri: ‐Dâhili ve harici osilatör seçenekleri vardır. ‐Dâhili 4 MHz osilatör frekansı hassasiyeti +%1 fabrika ayarlıdır. ‐37 kHz’de dâhili düşük güç osilatörüne sahiptir. ‐Harici osilatör için kristal ve rezonatör seçenekleri mevcuttur. ‐SLEEP (Uyku) modunda güç tasarrufu sağlar. ‐PORTB için programlanabilir zayıf pull‐up girişleri vardır. ‐Çoktan seçmeli MCLRതതതതതതതത (Master Clear) girişi: Ana donanım resetlemesi pini aynı zamanda dijital I/O olarak kullanılabilir. ‐Güvenilir çalışma için bağımsız osilatörlü bekçi zamanlayıcısı (WDT – WatchDog Timer) ‐Düşük güç programlama ‐Devre üzerinde seri programlama (ICSP™) ile programlanabilir. ‐Programlanabilir kod koruma özelliği ile yazılan programlar kopyalamaya karşın korunabi‐lir. ‐Voltaj düşmesinde resetlenme özelliği (BOR‐Brown‐out Reset): Besleme geriliminde azalma ya da güç kaybı yaşandığında MCU yanlış ve kararsız çalışmaya karşın kendini reset‐ler. ‐İlk besleme ile resetlenme özelliği (POR‐Power‐on Reset): MCU’ya ilk enerji verildiğinde başlangıç adresine gidilir ve program kodu yeni baştan işletilir. ‐İlk besleme gecikmesi zamanlayıcısı (PWRT‐Power‐up Timer): MCU’ya ilk enerji verildi‐ğinde besleme dengesi sağlanana kadar 72 ms’lik bir gecikme sağlayan zamanlayıcıdır. ‐Osilatör başlangıç zamanlayıcısı (OST‐Oscillator Start‐up Timer): MCU’ya ilk enerji verildi‐ğinde kristal osilatörü dengesi sağlanana kadar MCU’yu reset modunda tutan zamanlayıcı‐dır. ‐Geniş çalışma voltajı aralığı (2.0 – 5.5V) vardır. ‐Endüstriyel ve geniş çalışma sıcaklığı aralığına (‐40 – 125 oC) sahiptir. ‐Yüksek dayanıklı FLASH/EEPROM hücresi vardır. FLASH için 100.000 yazma dayanıklılığına EEPROM için 1.000.000 yazma dayanıklılığına ve 403 100 yıl veri saklama süresine sahiptir. Düşük Güç Özellikleri: ‐Bekleme (Standby) akımı: 2.0V’ta 100nA‐Çalışma akımı: 32 kHz 2.0V’ta 12uA, 1 MHz 2.0V’ta 120uA‐ Bekçi zamanlayıcısı (WDT) akımı: 2.0V’ta 1uA‐Timer1 osilatör akımı: 32 kHz 2.0V’ta 1,2uA‐Çift hızlı dâhili osilatör: 4 MHz ve 37 kHz çalışma frekansaları arasında tercih 3.0V’ta 4 us içinde uyku (SLEEP) modundan çıkabilme Çevresel Aygıt Özellikleri: ‐Bağımsız yön kontrollü 16 I/O pini ‐Doğrudan LED sürmek için yüksek sink/source akımı desteği vardır. ‐Aşağıdaki özelliklere sahip analog karşılaştırıcı modülü: İki analog karşılaştırıcı Programlanabilir on‐chip voltaj referansı modülü (VREF) Seçilebilir dâhili ya da harici referans Karşılaştırıcı çıkışları harici olarak erişilebilir ‐Timer0: 8‐bit ön ölçekleyicili 8‐bitlik zamanlayıcı/sayıcı ‐Timer1: Harici kristal/saat darbesi özellikli 16‐bitlik zamanlayıcı/sayıcı ‐Timer2: 8‐bit periyot kaydedicili, ön ölçekleyicili ve son ölçekleyicili 8‐bitlik zamanlayıcı/sa‐yıcı ‐Yakalama, Karşılaştırma, PWM modülü 16‐bit Yakalama/Karşılaştırma 10‐bit PWM ‐Adreslenebilir USART/SPI Gerçek zamanlı uygulamaları gerçekleştirmeyi sağlayan özel amaçlı devreler mikrodenetleyicileri diğer işlemcilerden ayıran en önemli özelliklerdendir. PIC16F627A/628A/648A ailesi sistem güvenirliğini ar‐tırmayı ve harici devre bileşeni kullanımını ortadan kaldırarak maliyetleri düşürmeyi amaçlayan böylesi bir dizi özellikle donatılmıştır. Bu özellikleri şu şekilde sıralayabiliriz: 1‐OSC seçimi 2‐RESET 3‐İlk güç uygulandığında MCU’nun resetlenmesi (Power‐on Reset – POR) 4‐İlk besleme gecikmesi zamanlayıcısı (Power‐up Timer – PWRT) 5‐Osilatör açılış zamanlayıcısı (Oscillator Start‐up Timer – OST) 6‐Voltaj düşmesi resetlemesi (Brown‐out Reset – BOR) 7‐Kesmeler (Interrupts) 8‐Vardiya zamanlayıcısı (Watchdog Timer – WDT) 9‐Uyku modu (SLEEP) 10‐Kod koruma (Code protection) 11‐ID lokasyonları 12‐Devre üzerindeyken programlanabilme (In‐Circuit Programming – ICSP) 404 PIC16F627A/628A/648A konfigürasyon bitlerince kontrol edilebilen vardiya zamanlayıcısına sahiptir. İlave güvenlik için kendi RC osilatörünü kapatır. İlk besleme verilmesi anında gerekli gecikmeyi sağlayan iki zamanlayıcısı daha vardır. Biri, kristal osilatör dengeli çalışmaya başlayana kadar çipi RESET mo‐dunda tutan OST zamanlayıcısı, diğeri ise besleme gerilimi dengeye oturana kadar çipi RESET modunda tutan ve yalnızca ilk açılış sırasında sabit 72msn’lik gecikme sağlayan PWRT zamanlyıcısıdır. Ayrıca voltaj düşmesi meydana geldiğinde cihazı resetleyen bir güvenlik devresi de vardır. Çipin sahip olduğu bu üç özellik sayesinde, çoğu uygulamada harici bir RESET devresine ihtiyaç yoktur. Uyku modu (SLEEP) çok düşük akım sunan bir düşük güç modudur. Kullanıcı mikrodenetleyiciyi, harici reset, vardiya zamanlayıcısı ya da bir kesme yoluyla uyku modundan çıkartabilir. Mikrodenetleyici için uygulamaya göre çeşitli osilatör seçenekleri de mevcuttur. RC osilatör seçeneği sistem maliyetini dü‐şürürken LP kristal seçeneği güç tasarrufu sağlar. Konfigürasyon bitleri ayarlanarak farklı tercihler ya‐pılabilir. Şekil D.1’de PIC16F628A’nın farklı kılıf türleri gösterilmiştir. SSOP ve QFN paketleri yüzey temaslı bir paket türü olup, PDIP ise DIP soket türündedir. 405 Şekil D.1 16F628A'nın farklı kılıf türleri D2‐PIC16F628A’NINBACAK(PİN)AÇIKLAMALARITablo D.1 PIC16F628A'nın bacak açıklamaları İsim İşlev Giriş Türü Çıkış Türü Açıklama RA0/AN0 RA0 ST CMOS Genel amaçlı çift yönlü I/O portu AN0 AN ‐ Analog karşılaştırıcı girişi RA1/AN1 RA1 ST CMOS Genel amaçlı çift yönlü I/O portu AN1 AN ‐ Analog karşılaştırıcı girişi RA2/AN2/VREFRA2 ST CMOS Genel amaçlı çift yönlü I/O portu AN2 AN ‐ Analog karşılaştırıcı girişi VREF ‐ AN VREF çıkışı RA3/AN3/CMP1 RA3 ST CMOS Genel amaçlı çift yönlü I/O portu AN3 AN ‐ Analog karşılaştırıcı girişi CMP1 ‐ CMOS Karşılaştırıcı 1 çıkışı 406 RA4/T0CKI/CMP2 RA4 ST OD Genel amaçlı çift yönlü I/O portu T0CKI ST ‐ Timer0 saat darbesi girişi CMP2 ‐ OD Karşılaştırıcı 2 çıkışı RA5/MCLRതതതതതതതത/VPPRA5 ST ‐ Giriş portu MCLRതതതതതതതതST ‐ Ana reset girişi. MCLR olarak ayarlandığında denetleyicinin RESET edilmesi için aktif 0 ya‐pılır. Normal çalışma anında MCLR/VPP üzerindeki voltaj değeri VDD’yi aşmamalıdır. VPP ‐ ‐ Programlama voltajı girişi RA6/OSC2/CLKOUT RA6 ST CMOS Genel amaçlı çift yönlü I/O portu OSC2 ‐ XTAL Osilatör kristal çıkışı. Kristal osilatör modunda rezonatör ya da kristale bağlanır. CLKOUT ‐ CMOS RC/INTOSC modunda, OSC2 pini OSC1 frekansının 4’te 1’i frekansında çıkış olabilir. RA7/OSC1/CLKIN RA7 ST CMOS Genel amaçlı çift yönlü I/O portu OSC1 XTAL ‐ Osilatör kristal girişi CLKIN ST ‐ Harici saat darbesi girişi. RC kutuplama pini. RB0/INT RB0 TTL CMOS Genel amaçlı çift yönlü I/O portu. Dâhili pull‐up’lar için yazılımsal olarak programlana‐bilir. INT ST ‐ Harici kesme RB1/RX/DT RB1 TTL CMOS Genel amaçlı çift yönlü I/O portu. Dâhili pull‐up’lar için yazılımsal olarak programlana‐bilir. RX ST ‐ USART alma pini DT ST CMOS Eşzamanlı I/O veri portu 407 RB2/TX/CK RB2 TTL CMOS Genel amaçlı çift yönlü I/O portu. Dâhili pull‐up’lar için yazılımsal olarak programlana‐bilir. TX ‐ CMOS USART gönderme pini CK ST CMOS Eşzamanlı I/O saat darbesi portu RB3/CPP1 RB3 TTL CMOS Genel amaçlı çift yönlü I/O portu. Dâhili pull‐up’lar için yazılımsal olarak programlana‐bilir. CPP1 ST CMOS Yakalama/Karşılaştırma/PWM I/O portu RB4/PGM RB4 TTL CMOS Genel amaçlı çift yönlü I/O portu. Dâhili pull‐up’lar için yazılımsal olarak programlana‐bilir. PGM ST ‐ Düşük voltaj programlama pini. Düşük voltaj programla‐ması aktif kılındığında pin de‐ğişimi kesmesi ve dâhili pull‐up devre dışı bırakılır. RB5 RB5 TTL CMOS Genel amaçlı çift yönlü I/O portu. Dâhili pull‐up’lar için yazılımsal olarak programlana‐bilir. RB6/T1OSO/T1CKI/PGC RB6 TTL CMOS Genel amaçlı çift yönlü I/O portu. Dâhili pull‐up’lar için yazılımsal olarak programlana‐bilir. T1OSO ‐ XTAL Timer1 osilatör çıkışı T1CKI ST ‐ Timer1 saat darbesi girişi PGC ST ‐ ICSP programlama girişi RB7/T1OSI/PGD RB7 TTL CMOS Genel amaçlı çift yönlü I/O portu. Dâhili pull‐up’lar için yazılımsal olarak programlana‐bilir. T1OSI XTAL ‐ Timer1 osilatör girişi RB7/T1OSI/PGD PGD ST CMOS ICSP I/O verisi 408 VSSVSS Besleme ‐ Lojik ve I/O pinleri için şase re‐feransı VDDVDD Besleme ‐ Lojik ve I/O pinleri için pozitif besleme Açıklama: O = Çıkış CMOS = CMOS çıkış P = Besleme ‐ = Kullanılmaz I = Giriş ST = Schmitt Triggerli giriş TTL = TTL girişi OD = Open Drain Çıkış AN = Analog D3‐PIC16F628AMİKRODENETLEYİCİSİ İÇİN“mikroCPROforPIC”PROJEEDİTÖRÜPIC16F628A mikrodenetleyicisinin yapılandırma bitleri program belleğinin 2007h adresinde yer alır. Bu bölge kullanıcının kodlama yaptığı adres alanının dışındadır. Yapılandırma bitleri özel ayar belleği böl‐gesi (Special Configuration Memory Space – 2000h‐3FFFh) içinde yer alır. Yapılandırma bitleri ilk fabrika ayarlarında kurulu olmadan gelir. Diğer bir ifadeyle mikrodenetleyicilerde yapılandırma bitleri kurulu değilse lojik‐1’dir. Programlayıcıyı çalıştırdığınızda 14 bitlik bellek alanının tüm adreslerinde 3FFF gö‐rülmesinin nedeni bundandır. Bu bitleri kurmak için lojik‐0 yapılması gerekir. mikroC programı kullanıcıya yapılandırma bitlerini kullanıcı arayüzü üzerinden ayarlama olanağı sağlar. mikroC programında menü çubuğundan ProjectEdit Project komutunu verdiğinizde çıkan pencerede mikrodenetleyicinin modeline bağlı olarak farklı başlıklar altından ayarlamalar yapabileceğiniz bir pen‐cere karşınıza gelir. Şekil D.2’de 16F628A için osilatör ayarlarının yapılması gösterilmiştir. Örnek pencere ekranında osilatör tercihi (Oscillator Selection) başlıklı kısımdan, mikrodenetleyicinin RA6 ve RA7 pinlerinin I/O portu olarak kullanılabilmesini sağlayan “INTOSC oscillator” tercihi seçilmiş‐tir. Böylece kristal ve kondansatörler kullanılarak yapılan harici osilatör ihtiyacı ortadan kalkmış ve bu portlar boşa çıkmıştır. Bu tercihin seçilmesi sonrası “Configuration Registers” başlıklı yapılandırma kütüğü alanında, CONFIG: $2007: 0x2178 hex değeri oluşur. Farklı bir değer seçilmesi durumunda yapılandırma sözcüğünün (CONFIGURATION WORD) onaltılı de‐ğerinin değiştiği görülecektir. Devre tasarımınıza uygun ayarlamayı yaptıktan sonra OK butonuyla pen‐cereyi kapatın. Ardından değişikliklerin derlenmiş hex dosyasında yer alması için, Ctrl+F9 tuşlarıyla ya da menü başlığından Build komutuyla derleme işlemini yeniden yapmanız gerekir. Dâhili osilatör terci‐hinin seçimi durumunda yalnızca 4 MHz ve 37kHz’lik iki frekans seçimi yapılabileceği unutulmamalıdır. Bu durumda “MCU Clock Frequency [MHz]” alanına uygun değer yazılmalıdır. Ancak mikroC proje edi‐töründe osilatör frekansı olarak 1 MHz’in altında bir değer girişi yapılamamaktadır. MCU’yu 37kHz fre‐kansında çalıştırmak istiyorsanız program kodunuzda “PCON.OSCF = 0;” kodunu yazmalısınız. Burada PCON kaydedicisinin dâhili osilatör frekansı tercihi OSCF pinini ayarlamış olursunuz. 409 Şekil D.2 16F628A'da Yapılandırma bitlerinin ayarlanması 16F628A için karşınıza gelecek pencerede yer alan ayar başlıkları şunlardır: ‐Osilatör tercihi (Oscillator Selection)= 8 farklı osilatör tercihi yapılabilir. RC oscillator: CLKOUT function on RA6/OSC2/CLKOUT pin, Resistor and Capacitor on RA7/OSC1/CLKIN = Osilatör frekansının kararlı çalışması önemli değilse, RA7 pinine 3K – 100K arasında bir direnç ve 20pF’dan büyük bir kondansatör şekildeki gibi bağlanır. Şekil D.3 RC osilatör bağlantısı OSC2 pininden üretilen frekansın 4’te 1’i çıkış olarak alınabilir. 410 RC oscillator: I/O function on RA6/OSC2/CLKOUT pin, Resistor and Capacitor on RA7/OSC1/CLKIN = İlk osilatör tercihinde olduğu gibi RC bağlantısı yapılır. Ancak bu durumda RA6 pini I/O portu olarak kullanılabilir. Frekans çıkışı alınmaz. INTOSC oscillator: CLKOUT function on RA6/OSC2/CLKOUT pin, I/O function on RA7/OSC1/CLKIN = İki frekanslı dâhili osilatör tercihidir. RA7 pini I/O portu olarak kullanılabilir. RA6 pininden çalışma frekansının 4’te 1’i çıkış olarak alınır. INTOSC oscillator: I/O function on RA6/OSC2/CLKOUT pin, I/O function on RA7/OSC1/CLKIN = İki frekanslı dâhili osilatör tercihidir. RA6 veRA7 pinlerinin her ikisi de I/O portu olarak kullanılabilir. Frekans çıkışı alınmaz. EC: I/O function on RA6/OSC2/CLKOUT pin, CLKIN on RA7/OSC1/CLKIN = Harici bir saat darbesi üretecinin osilatör kaynağı olarak kullanılması istendiğinde bu ter‐cih edilir. RA6 pini I/O portu olarak kullanılabilir. Giriş RA7 pini üzerinden yapılır. Harici osilatör kaynağının frekans aralığının MCU’nun kılavuzunda belirtilen ça‐lışma aralığında olması gerekir. Girişe uygulanabilecek en yüksek sinyal frekansı 20 MHz’dir. EC modunda MCU’ya güç verildiği anda gecikme olmaksızın çalışır. EC modu, MCU’nun diğer harici devre bileşenleriyle senkronize çalışması istenen du‐rumlarda kullanılır. Şekil D.4 EC osilatör modu HS oscillator: High speed crystal/resonator on RA6/OSC2/CLKOUT and RA7/OSC1/CLKIN = Yüksek frekanslı kristal/ rezonatör osilatör seçeneğidir. 4 MHz ve üzeri kristaller bu modda kullanılır. Akım tüketimi HS‐XT‐LP modları içinde en yüksek olanıdır. XT oscillator: Crystal/resonator on RA6/OSC2/CLKOUT and RA7/OSC1/CLKIN = Orta ölçekli frekansta kristal/rezonatör osilatör seçeneğidir. 4 MHz’e kadar olan kristaller kullanılabilir. LP oscillator: Low‐power crystal on RA6/OSC2/CLKOUT and RA7/OSC1/CLKIN = Düşük güçlü quartz kristal seçeneğidir. Bu modda yalnızca 32.768 kHz frekansın‐daki quartz kristaller kullanılabilir. Bu tür kristaller quartz saatlerin içinde buluna‐bilir. Akım tüketimi HS‐XT‐LP modları içinde en düşük olanıdır. 411 Tablo D.2 Kristal/rezonatör frekanslarına göre kondansatör değerleri Mod Frekans C1, C2 LP 32 kHz 33 pF 200 kHz 15 pF XT 200 kHz 47‐68 pF 1 MHz 15 pF 4 MHz 15 pF HS 4 MHz 15 pF 8 MHz 15‐33 pF 20 MHz 15‐33 pF Şekil D.5 HS, XT, LP osilatör modları ‐Watchdog Timer= Vardiya zamanlayıcısıdır. Etkinleştirildiği (Enable) taktirde WDT reset aktif olur. Yazılımsal olarak sıfırlanabilir. MCU’nun kendi içindeki RC osilatörüyle çalışır. Çalışması harici osilatörden etkilenmez. ‐Power‐up Timer: İlk besleme gecikmesi zamanlayıcısıdır. ‘Enable – lojik0’ yapıldığında et‐kinleştirilir. ‘Disable – lojik1’ yapıldığında pasifleştirilir. Güç ilk verildiğinde nominal olarak 72 ms’lik bir gecikme sağlayarak MCU’yu voltaj dengesi sağlanması sırasında RESET mo‐dunda tutmayı amaçlar. ‐RA5/MCLR/VPP Pin Function: Etkinleştirildiğinde normal donanımsal RESET girişi olarak kullanılır. ‘Disable’ ile pasifleştirildiğinde RA5 pini dijital giriş olarak kullanılabilir. MCLRതതതതതതതതdâhili olarak VDD’ye bağlanır. ‐Brown‐out Detect: Bu özellik ‘Enable’ yapılırsa, MCU besleme voltajında düşme meydana geldiğinde MCU resetlenir. Özellikle mikrodenetleyicilerin yüksek akım çeken elektrome‐kanik bileşenleri kontrol ettiği durumlarda yeterli akım sağlanamadığında MCU voltajında salınımlar oluşur. Bu durum MCU’nun resetlenmesine neden olur. Besleme hattının yalıtıl‐madığı yerlerde ya da elektromekanik elemanların DC beslemesinin aynı kaynak üzerinden yapıldığı yerlerde bu sorunla karşılaşabilirsiniz. Şekil D.6’da harici bir Brown‐out devresinin MCLRതതതതതതതത girişine bağlantısı gösterilmiştir. Dâhili BOR kesmesi ‘Disable’ yapıldığında böyle bir devre yardımıyla kendi voltaj kesmenizi yapabilirsiniz. MCU besleme gerilimi VDD, zener ge‐rilimi VZ + 0.7V’un altına düştüğünde reset işlemi gerçekleşir. 412 Şekil D.6 Harici Brown‐out devresi ‐Low‐Voltage Programming= Normal şartlarda ‘Disable –lojik0’ durumundadır. ‘Enable – lojik1’ yapıldığında RB4/PGM girişi PGM (ProGraMming) olarak kullanılır ve bu girişten dü‐şük voltajla programlama yapılabilir. Etkin değilken RB4 pini normal I/O portu olarak kulla‐nılır. Bu durumda MCLRതതതതതതതത girişinden HV programlama yapılmalıdır. ‐Data EE Memory Code Protection= Veri belleği kod koruma bitidir. ‐Flash Program Memory Code Protection= Program belleği koruma bitidir. Şekil D.7’de PIC16F628A mikrodenetleyicisinin yapılandırma sözcüğü (Configuration Word) gösterilmiş‐tir. Şekil D.7 YAPILANDIRMA SÖZCÜĞÜ (CONFIGURATION WORD) Yapılandırma sözcüğünü mikroC program editöründe yazılımsal olarak programlamak söz konusu de‐ğildir. Bu nedenle 14 bitlik bu kütüğün her bir bitinin ne olduğunu merak edenler ilgili MCU’nun veri kılavuzunu inceleyebilir. Kılavuzun 94. sayfasında yapılandırma sözcüğü açıklanmıştır. 413 EK‐EE1‐16F887MİKRODENETLEYİCİSİNİNTEKNİKÖZELLİKLERİ PIC16F887, 40‐pinli 8 bitlik orta ölçekli (Mid‐Range) Flash ROM özellikli ve nanoWatt teknolojili bir Mic‐rochip® mikrodenetleyicisidir. 16 serisi mikrodenetleyicilerin mimarisine sahip olmakla birlikte bu seri‐nin en gelişmiş ve donanımlı modellerinden biridir. PIC16F882/883/884/886 serisiyle aynı sınıftandır. Teknik özellikleri genel olarak kısaca aşağıdaki gibidir: Yüksek Performanslı RISC mimarili CMOS CPU: ‐Çalışma frekansı 0 Hz (DC) – 20 MHz arasındadır. ‐200ns’ye kadar komut çevrimi vardır. ‐Kesme kabiliyetlidir. ‐8‐seviye derinliğinde donanım yığınına sahiptir. ‐Doğrudan, dolaylı ve bağıl adresleme modları mevcuttur. ‐35 adet tek kelimelik komut kümesine sahiptir. Dallanma komutları hariç tüm komutlar tek çevrim süresinde işletilir. Özel Mikrodenetleyici Özellikleri: ‐Hassas Dâhili Osilatör: +%1 fabrika ayarlıdır. Yazılımsal olarak seçilebilir frekans aralığı 8 MHz’den 31 kHz’e kadardır. Yazılımsal olarak ayarlanabilir. İki hızlı açılış modu vardır. Kritik uygulamalar için kristal hata algılaması vardır. Güç tasarrufu için çalışma sırasında saat modu anahtarlaması vardır. ‐Güç Tasarrufu Uyku modu vardır. ‐Geniş çalışma voltajı aralığına sahiptir (2,0V – 5,5V). ‐Endüstriyel ve geniş çalışma sıcaklığı aralığına (‐40 – 125 oC) sahiptir. ‐İlk besleme ile resetlenme özelliği (POR) vardır. ‐İlk besleme gecikmesi zamanlayıcısı (PWRT) ve Osilatör başlangıç zamanlayıcısı (OST) var‐dır. ‐Yazılımsal kontrol seçenekli voltaj düşmesinde resetlenme özelliği (BOR) vardır. ‐Gelişmiş düşük akımlı Bekçi Zamanlayıcısı (WDT): Çipte yer alan 31 kHz’lik osilatör ile çalı‐şan ve zaman aşımı 1ms’den 268 saniyeye kadar yazılımsal olarak tam ön ölçekleyici ile seçilebilir bir zamanlayıcıdır. ‐Çoktan seçmeli MCLRതതതതതതതത (Master Clear) girişi: Ana donanım resetlemesi pini aynı zamanda dijital I/O olarak kullanılabilir. ‐Programlanabilir kod koruması vardır. ‐Yüksek dayanıklı FLASH/EEPROM hücresi vardır. FLASH için 100.000 yazma dayanıklılığı EEPROM için 1.000.000 yazma dayanıklılığı Flash/EEPROM veri saklama: >40 yıl ‐Çalışma sırasında program belleği Okuma/Yazma yapabilir. 414 ‐Devre içi hata ayıklayıcısı (debugger) vardır. Düşük Güç Özellikleri: ‐Bekleme (Standby) akımı: 2,0V’ta 50nA‐Çalışma akımı: 32 kHz 2,0V’ta 11uA, 4 MHz 2,0V’ta 220uA‐Bekçi zamanlayıcısı (WDT) akımı: 2,0V’ta 1uAÇevresel Aygıt Özellikleri: ‐Bağımsız yön kontrollü 35 I/O pini Doğrudan LED sürmek için yüksek sink/source akımı desteği vardır. Pinlerde değişim algılaması kesmesi vardır. Bağımsız olarak programlanabilir zayıf pull‐uplar vardır. Ultra düşük güçlü uyandırma kesmesi (Ultra Low‐Power Wake‐up – ULPWU): Mik‐rodenetleyicinin RA0 pinine bağlanacak bir kapasitörün şarj ve deşarj edilmesi tek‐niğiyle, RA0 girişindeki voltaj seviyesinin VIL değerinin altına düşmesi durumu izle‐nerek düşük güçlü uyandırma kesmesi aktif kılınır ve bir sonraki komut işletilir. ‐Analog Karşılaştırıcı modülü: İki analog karşılaştırıcılıdır. Programlanabilir dâhili voltaj referansı (CVREF) modülü (VDD’nin %’si). Sabit voltaj referansı (0,6V) Karşılaştırıcı girişleri ve çıkışları harici olarak erişilebilirdir. SR (Set‐Reset) Tutma (Latch) modu Harici Timer1 kapısı (sayma etkinleştirmeli) ‐A/D Dönüştürücü 10‐bit çözünürlüklü ve 14 kanallı ‐Timer0: 8‐bitlik programlanabilir ön ölçekleyicili 8‐bit zamanlayıcı/sayıcı ‐Geliştirilmiş Timer1: Ön ölçekleyicili 16‐bit zamanlayıcı/sayıcı Harici kapı giriş modu Kendisine tahsis edilmiş düşük güçlü 32 kHz osilatör ‐Timer2: 8‐bit periyot kaydedicili, ön ölçekleyicili ve sonölçekleyicili 8‐bitlik zamanlayıcı/sa‐yıcı. ‐Geliştirilmiş Yakalama, Karşılaştırma, PWM+ modülü: 16‐bitlik Yakalama modülünün maksimum çözünürlüğü 12,5 ns’dir. Karşılaştırma modülünün maksimum çözünürlüğü 200 ns’dir. 1, 2 ya da 4 çıkış kanallı 10‐bit PWM’i, programlanabilir “dead time” a sahiptir ve maksimum frekansı 20 kHz’dir. PWM çıkışı sevk ve idaresi kontrolü vardır. ‐Yakalama, Karşılaştırma, PWM modülü: 16‐bitlik Yakalama modülünün maksimum çözünürlüğü 12,5 ns’dir. 16‐bitlik Karşılaştırma modülünün maksium çözünürlüğü 200 ns’dir. 10‐bitlik PWM’in maksimum frekansı 20 kHz’dir. ‐Geliştirilmiş USART modülü: RS‐485, RS‐232 ve LIN 2,0 seri iletişim protokollerini, 415 Otomatik hız (Baud) algılamayı, Seri iletişimin başlama bitiyle birlikte otomatik uyanmayı destekler. ‐İki pin üzerinden ICSP™ desteği vardır. ‐3‐hatlı SPI (tüm dört modda) ve I2C™ protokollerini destekleyen MSSP (Master Synchronous Serial Port) modülü vardır. Şekil E.1’de PIC16F887’nin 40 pinli DIP kılıf türü gösterilmiştir. 44 pinli QFN ve TQFP kılıf türleri de mev‐cuttur. Şekil E.1 PIC16F887'nin kılıf yapısı E2‐PIC16F887’NİNBACAK(PİN)AÇIKLAMALARITablo E.1 PIC16F887'nin bacak açıklamaları İsim İşlev Giriş Türü Çıkış Türü Açıklama RA0/AN0/ULPWU/C12IN0‐ RA0 TTL CMOS Genel amaçlı çift yönlü I/O portu AN0 AN ‐ A/D Kanal 0 girişi ULPWU AN ‐ Ultra düşük güçlü uyanma gi‐rişi C12IN0‐ AN ‐ C1 ya da C2 Karşılaştırıcıları 0 nolu negatif girişi 416 RA1/AN1/C12IN1‐ RA1 TTL CMOS Genel amaçlı çift yönlü I/O portu. AN1 AN ‐ A/D Kanal 1 girişi C12IN1‐ AN ‐ C1 ya da C2 Karşılaştırıcıları 1 nolu negatif girişi RA2/AN2/VREF‐/ CVREF/C2IN+ RA2 TTL CMOS Genel amaçlı çift yönlü I/O portu AN2 AN ‐ A/D Kanal 2 girişi VREF‐ AN ‐ A/D Negatif voltaj referans gi‐rişi CVREF ‐ AN Karşılaştırıcı voltaj referansı çı‐kışı C2IN+ AN ‐ C2 Karşılaştırıcısı pozitif girişi RA3/AN3/VREF+/ C1IN+ RA3 TTL CMOS Genel amaçlı çift yönlü I/O portu AN3 AN ‐ A/D Kanal 3 girişi VREF+ AN ‐ Programlama voltajı C1IN+ AN ‐ C1 Karşılaştırıcısı pozitif girişi RA4/T0CKI/C1OUT RA4 TTL CMOS Genel amaçlı çift yönlü I/O portu. T0CKI ST ‐ Timer0 saat darbesi girişi C1OUT ‐ CMOS C1 Karşılaştırıcısı çıkışı RA5/AN4/ssഥ/ C2OUT RA5 TTL CMOS Genel amaçlı çift yönlü I/O portu AN4 AN ‐ 4 Nolu A/D Kanal girişi SSതതതST ‐ Slave seçme girişi C2OUT ‐ CMOS C2 Karşılaştırıcısı çıkışı 417 RA6/OSC2/CLKOUT RA6 TTL CMOS Genel amaçlı çift yönlü I/O portu OSC2 ‐ XTAL Osilatör kristal çıkışı. Kristal osilatör modunda rezonatör ya da kristale bağlanır. CLKOUT ‐ CMOS Osilatör frekansının 4’te 1’i çı‐kış olarak elde edilir. RA7/OSC1/CLKIN RA7 TTL CMOS Genel amaçlı çift yönlü I/O portu OSC1 XTAL ‐ Osilatör kristal/rezonatör girişi CLKIN ST ‐ Harici saat darbesi girişi. RC osilatör bağlantısı. RB0/AN12/INT RB0 TTL CMOS Genel amaçlı çift yönlü I/O portu. Bağımsız olarak kontrol edilebilen port durum değişim kesmesi. Dâhili pull‐up’lar ba‐ğımsız olarak etkinleştirilebilir. AN12 AN ‐ 12 Nolu A/D Kanal girişi INT ST ‐ Harici kesme RB1/AN10/C12IN3‐ RB1 TTL CMOS Genel amaçlı çift yönlü I/O portu. Bağımsız olarak kontrol edilebilen port durum değişim kesmesi. Dâhili pull‐up’lar ba‐ğımsız olarak etkinleştirilebilir. AN10 AN ‐ 10 Nolu A/D Kanal girişi C12IN3‐ AN ‐ C1 ya da C2 Karşılaştırıcıları 3 nolu negatif girişi RB2/AN8 RB2 TTL CMOS Genel amaçlı çift yönlü I/O portu. Bağımsız olarak kontrol edilebilen port durum değişim kesmesi. Dâhili pull‐up’lar ba‐ğımsız olarak etkinleştirilebilir. 418 AN8 AN ‐ 8 Nolu A/D Kanal girişi RB3/AN9/PGM/ C12IN2‐ RB3 TTL CMOS Genel amaçlı çift yönlü I/O portu. Bağımsız olarak kontrol edilebilen port durum değişim kesmesi. Dâhili pull‐up’lar ba‐ğımsız olarak etkinleştirilebilir. AN9 AN ‐ 9 Nolu A/D Kanal girişi PGM ST ‐ Düşük voltaj ICSP™ etkinleş‐tirme girişi C12IN2‐ AN ‐ C1 ya da C2 Karşılaştırıcıları 2 nolu negatif girişi RB4/AN11 RB4 TTL CMOS Çift yönlü I/O portu. Dâhili pull‐up’lar için yazılımsal ola‐rak programlanabilir. AN11 AN ‐ 11 Nolu A/D Kanal girişi RB5/AN13/T1GതതതതതRB5 TTL CMOS Genel amaçlı çift yönlü I/O portu. Bağımsız olarak kontrol edilebilen port durum değişim kesmesi. Dâhili pull‐up’lar ba‐ğımsız olarak etkinleştirilebilir. AN13 AN ‐ 13 Nolu A/D Kanal girişi T1GതതതതതST ‐ Timer1 Kapı (Gate) girişi RB6/ICSPCLK RB6 TTL CMOS Genel amaçlı çift yönlü I/O portu. Bağımsız olarak kontrol edilebilen port durum değişim kesmesi. Dâhili pull‐up’lar ba‐ğımsız olarak etkinleştirilebilir. RB6/ICSPCLK ICSPCLK ST ‐ Seri programlama için saat darbesi RB7/ICSPDAT RB7 TTL CMOS Genel amaçlı çift yönlü I/O portu. Bağımsız olarak kontrol edilebilen port durum değişim kesmesi. Dâhili pull‐up’lar ba‐ğımsız olarak etkinleştirilebilir. ICSPDAT ST TTL ICSP™ Veri I/O portu 419 RC0/T1OSO/T1CKI RC0 ST CMOS Genel amaçlı çift yönlü I/O portu T1OSO ‐ XTAL Timer1 osilatör çıkışı T1CKI ST ‐ Timer1 saat darbesi girişi RC1/T1OSI/CCP2 RC1 ST CMOS Genel amaçlı çift yönlü I/O portu T1OSI XTAL ‐ Timer1 osilatör girişi CCP2 ST CMOS 2 Nolu Yakalama/ Karşılaş‐tırma/PWM modülü RC2/P1A/CCP1 RC2 ST CMOS Genel amaçlı çift yönlü I/O portu P1A ‐ CMOS A Nolu PWM çıkışı CCP1 ST CMOS 1 Nolu Yakalama/ Karşılaş‐tırma/PWM modülü RC3/SCK/SCL RC3 ST CMOS Genel amaçlı çift yönlü I/O portu SCK ST CMOS SPI saat darbesi SCL ST OD I2C™ saat darbesi RC4/SDI/SDA RC4 ST CMOS Genel amaçlı çift yönlü I/O portu SDI ST ‐ SPI veri girişi SDA ST OD I2C™ veri giriş çıkışı RC5/SDO RC5 ST CMOS Genel amaçlı çift yönlü I/O portu SDO ‐ CMOS SPI veri çıkışı RC6/TX/CK RC6 ST CMOS Genel amaçlı çift yönlü I/O portu TX ‐ CMOS EUSART asenkron gönderme CK ST CMOS EUSART senkronize saat dar‐besi 420 RC7/RX/DT RC7 ST CMOS Genel amaçlı çift yönlü I/O portu RX ST ‐ EUSART asenkron alma DT ST CMOS EUSART senkron veri RD0 RD0 TTL CMOS Genel amaçlı çift yönlü I/O portu RD1 RD1 TTL CMOS Genel amaçlı çift yönlü I/O portu RD2 RD2 TTL CMOS Genel amaçlı çift yönlü I/O portu RD3 RD3 TTL CMOS Genel amaçlı çift yönlü I/O portu RD4 RD4 TTL CMOS Genel amaçlı çift yönlü I/O portu RD5/P1B RD5 TTL CMOS Genel amaçlı çift yönlü I/O portu P1B ‐ CMOS B Nolu PWM çıkışı RD6/P1C RD6 TTL CMOS Genel amaçlı çift yönlü I/O portu P1C ‐ CMOS C Nolu PWM çıkışı RD7/P1D RD7 TTL CMOS Genel amaçlı çift yönlü I/O portu P1D ‐ CMOS D Nolu PWM çıkışı RE0/AN5 RE0 TTL CMOS Genel amaçlı çift yönlü I/O portu AN5 AN ‐ 5 Nolu A/D Kanal girişi RE1/AN6 RE1 TTL CMOS Genel amaçlı çift yönlü I/O portu AN6 AN ‐ 6 Nolu A/D Kanal girişi RE2/AN7 RE2 TTL CMOS Genel amaçlı çift yönlü I/O portu 421 AN7 AN ‐ 7 Nolu A/D Kanal girişi RE3/MCLRതതതതതതതത/VPPRE3 TTL ‐ Genel amaçlı giriş portu MCLRതതതതതതതതST ‐ Dâhili pull‐up’lı ana RESET gi‐rişi VPP HV ‐ Programlama voltajı VSS VSS Besleme ‐ Şase referansı VDD VDD Besleme ‐ Pozitif besleme Açıklama: O = Çıkış CMOS = CMOS uyumlu giriş ya da çıkış HV = Yüksek Voltaj XTAL = Kristal I = Giriş ST = CMOS seviyeli Sch‐mitt Trigger giriş TTL = TTL uyumlu giriş OD = Open Drain Çıkış AN = Analog giriş ya da çı‐kış E3‐PIC16F887MİKRODENETLEYİCİSİ İÇİN“mikroCPROforPIC”PROJEEDİTÖRÜPIC16F887 mikrodenetleyicisinin iki adet yapılandırma sözcüğü vardır. Bu mikrodenetleyicinin de yapı‐landırma bitleri özel ayar belleği bölgesi (Special Configuration Memory Space – 2000h‐3FFFh) alanında yer alır. CONFIG1 sözcüğü 2007h adresinde, CONFIG2 sözcüğü 2008h adresinde yer alır. Şekil E.2’de PIC16F887 için proje editörü penceresi ve yapılandırma sözcüklerinin değeri gösterilmiştir. Çok sayısa ayar biti olduğundan ekranda “Brown‐out Reset Selection” ve “Flash Program Memory Self Write” sözcükleri gözükmemiştir. Kaydırma çubuğunu kaydırarak o bitlerin güncel değerini görebilirsi‐niz. 422 Şekil E.2 PIC16F887'de Yapılandırma bitlerinin ayarlanmasıPIC16F887 ile kitap içinde yapılan uygulamaların önemli bir kısmında 8 farklı osilatör tercihinden ge‐nellikle “INTOSCIO” değeri seçilmiştir. RA6 ve RA7 pinlerinin her ikisinin de I/O pini olarak kullanıldığı bu modda ya da RA6 pininden saat frekansının ¼’ünün alınmasını sağlayan “INTOSC” modunda, OSCCON kaydedicisi yardımıyla Şekil E.3’te gösterildiği gibi 8 farklı dâhili osilatörden istenilen seçilir. Şekil E.3 OSCCON kaydedicisiyle tercihleri yapılan dâhili osilatörler