08- XC8’de Değişkenler ve Veri Tipleri
Merhaba sevgili okuyucu.
PIC ile MPLABX ortamında XC8 dilinde nasıl değişken tanımlayabileceğimizi ve bunları nasıl kullanabileceğimizden bahsedeceğim bu yazıda.
Proje ne olursa olsun bazı verileri veya bilgileri RAM dediğimiz geçici bellekte tutmaya ihtiyacımız olur. Bu kimi zaten yakıp söndürdüğümüz LED in durumu, kimi zaman ise bir matematik işleminin sonucudur. RAM üzerindeki bilgiler mikrodenetleyiciden güç kesilince silinir. Bizim mevcut olarak şu anki örneklerde kullandığımız 16F877A mikrodenetleyicisinde 368 byte RAM bellek bulunmaktadır. Evet bilgisayarlarla veya telefonlarla kıyaslandığında çok çok küçüktür fakat uygulamada PIC in yapabileceği işler söz konusu olduğunda doldurmanın zor olduğunu göreceğiz. 368 tane 0-255 arası değer olarak bakarsak yapabileceğimiz işlere kıyasla büyük olduğunu görebiliriz. Bu tabii ki aynı anda hafızada tutulacak veri miktarıdır. Elimizdeki 10 bytelık bir veriyi RAM e yazdığımızı düşünelim. Ve her saniye bu 10 byteın değerini değiştirelim. Bizim kullandığımız RAM değeri artmayacaktır. İleride bahsedeceğim “MPLABX’de Optimizasyon” konulu yazıda buna özellikle değinilecek ve en verimli kullanım senaryoları oluşturulacaktır.
Her proje derlemesinden sonra doluluk oranını görebilirsiniz MPLABX de.
Değişkenler boyutlarına ve türlerine göre seçilir. Tür olarak tam sayı veya reel sayı olabilir. Boyut olarak ise 1 bitden 64 bite kadar gidebilir. Projedeki ihtiyaca göre bu seçimi yapmak lazımdır. Gereğinden küçük boyutta değişken seçimi yapılacak işlemleri kısıtlayacak ve istenen sonuca ulaşmayı imkansız hale getirecektir. Gereğinden büyük değişken kullanmak hem program hafızanızın hem de RAM hafızanızın olmasın gerekenden çabuk dolmasına neden olabilir. Ayrıca boyut büyüdükçe mikrodenetleyici her işlem için daha fazla süreye ve efora ihtiyaç duyacaktır. Bu da optimum bir tasarımdan uzak bir durumdur. Aşağıdaki tabloda XC8 de kullanılan tüm değişkenleri görebilirsiniz.
Tipi | Boyutu (bit) | En Düşük Değer | En Yüksek Değer | Türü |
bit | 1 | 0 | 1 | Tam Sayı – Integer |
char, signed char | 8 | -128 | 127 | Tam Sayı – Integer |
unsigned char | 8 | 0 | 255 | Tam Sayı – Integer |
signed short | 16 | -32768 | 32767 | Tam Sayı – Integer |
unsigned short | 16 | 0 | 65535 | Tam Sayı – Integer |
int, signed int | 16 | -32768 | 32767 | Tam Sayı – Integer |
unsigned int | 16 | 0 | 65535 | Tam Sayı – Integer |
signed short long | 24 | -8388608 | 8388607 | Tam Sayı – Integer |
unsigned short long | 24 | 0 | 16777215 | Tam Sayı – Integer |
signed long | 32 | -2147483648 | 2147483647 | Tam Sayı – Integer |
unsigned long | 32 | 0 | 4294967295 | Tam Sayı – Integer |
signed long long | 64 | -231 | 231-1 | Tam Sayı – Integer |
unsigned long long | 64 | 0 | 264-1 | Tam Sayı – Integer |
float | 32 | ±~10-44.85 | ±~1038.53 | Reel Sayı |
double | 32 | ±~10-44.85 | ±~1038.53 | Reel Sayı |
long double | 64 | ±~10-323.3 | ±~10308.3 | Reel Sayı |
Farkettiğiniz gibi bazı değişkenler farklı isimlerde de kullanılmış. Bunun kafa karıştırmaması için kendimize her boyutta değişkenler seçelim. Bu seçtiğimiz değişkenleri sürekli kullanarak kendi standartlarımızı elde etmiş oluruz. Olur da önümüze başka birinin yazıp alternatif isimdeki değişkenleri seçtiği bir kod gelirse bu tablodan yine yararlanabiliriz. Ama bizim oluşturacağımız tabloyu en azından birkaç uygulama sonra ezberlemiş olmak büyük avantaj sağlayacaktır kod yazma evresinde.
Aşağıda basitçe bir her boyutu kapsayan tabloyu görebiliyoruz.
Tipi | Boyutu (bit) |
bit | 1 |
char | 8 |
int | 16 |
short long | 24 |
long | 32 |
long long | 64 |
float, double | 32 |
long double | 64 |
Bit dediğimiz olay LED in yanık mı sönük mü olduğu durumu olarak düşünebiliriz. 0 veya 1 değeri alabilir sadece.
char dediğimiz değişken 8bitden oluşan bir değişkendir. Büyük ihtimal en çok kullanacağımız değişkendir. Toplam 256 değer alabilir. Bunu 28 ile de hesaplayabiliriz. Eğer unsigned (işaretsiz) ise 0 dan başlar ve 255 e kadar değerler alabilir. işaretli ise -128 ve +127 değerleri arasındadır.
int 16bit short long 24 bit long 32 bit ve long long 64 bit değerinde tam sayılardır. char değişkeninden long long arası tüm değişkenler arası tek fark boyutlarıdır.
Reel sayılar tarafında ise double 32bit ve long double 64bitdir. Reel sayılarda işaretsiz işaretli ayrımı yoktur.
Fark ettiyseniz char dediğimiz değişken karakter anlamına gelse de 8bitlik 256 farklı değer alabilen bir tam sayı veri tipi. Şu soru aklınıza gelebilir.
“Peki biz karakter veya string dediğimiz birçok karakterden oluşturduğumuz ifadeler için ne kullanacağız?”
Elektronik işlemede tabiki sayılar üzerinden işlemler yapılacak. Yani PIC 250 sayısını anlayabiliyorken “a” karakterini anlayamaz. Yani biz aslında karakterleri de sayılarla ifade ediyoruz. ASCII standardına göre belirlediğimiz 8bitlik sayılar bu karakterlere karşılık geliyor. Aslında biz “a” karakterini göndermek istediğimizde 97 tam sayısını göndermiş oluyoruz. Bu bir standart olduğu için bilgisayar da bunu biliyor ve bize öyle yansıtıyor. Bir karakteri oluşturmak için 8bitlik bir veri yeterli olacaktır. Yani bir char değişkeni bir karakter tanımlamak için yeterli olacaktır. Bir önceki yazıdaki birinci örneğin videosunu izlemeniz bunu anlamada yardımcı olacaktır. Videoda solda 16lı sisteme göre verinin sayısal karşılığı sağda da o veriye karşılık gelen karakter değeri görülebiliyor.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
bit a, b; a = 1; b = 0; char deger = 15; char karakter = 'c'; char metin[20]; metin = "hcemkoc.com"; float pi = 3.14; int sonuc = 1354; |
Örneklerden de görüleceği gibi değişkeni önce tanımlayıp değeri sonra da verebiliyoruz.
Dikkat edilmesi gereken önemli bir nokta tek karakterler için tek tırnak (‘) işareti, çoklu karakter yani string ifadeler için çift tırnak (“) kullanmak zorunludur. Aksi halde derleyici hata verecek veya programınız istediğiniz gibi çalışmayacaktır.
Değişkenler nerede tanımlı iseler o bölge ve altında çalışabilirler.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
int a; void ogren(void) { int c; c = 12; } void main(void) { int b; a=120; b=602; while(1) //sonsuz döngü { } return; } |
Örnek olarak verilen şu kodda “a” değişkeni mevcut tüm fonksiyonlardan dışarıda tanımlandığı için her taraftan erişilebilir.
Fakat “c” değişkeni sadece “ogren” isimli fonksiyondan erişilebilir.
“b” değişkenine ise “main” fonksiyonu içinde erişilir. “while” döngüsü dahil.
Bu değişkenler üzerinde matematiksel ifadeler ile işlemler yapabilirsiniz. Onu da kapsayacak olan değişkenler arası dönüşümü de anlattığım bir yazı olacak.
Şimdilik hoşçakalın.
Bir sonraki yazıda görüşmek üzere.