Ders-2:
Bu dersimizde pic pinlerinin nasıl input yani giriş olarak ayarlandığını ve bu işlemin nerelerde kullanıldığını öğreneceğiz.
Hazırlanan programlarda pic in zaman zaman dış ortamdan bilgi alması ve bu bilgiye göre karar vermesi istenir.
Örnek olarak bir tuşa basılması halinde git şu işi yap şeklinde bir program en basitinden yazılabilir.
Yada bir anahtar kapalı ise bir iş yap. Aynı anahtar açık ise başka bir iş yap gibi.
Bir önceki dersimizde Port pinlerinin giriş olarak ayarlanması için Port'a ait TRIS yazmaç'ına 1 yani high verilmesi gerektiğini öğrenmiş idik. Bu kaide her bir pin için gerekli. Portun tamamı giriş yapılacak ise 8 bitlik 255 ($FF - %11111111) değerinin TRIS yazmacına verilmesi gerekir.Bir örnek programla bunu açıklayalım.
Varsayımlarımız; Pic'in PortB.0 pinine bir anahtar bağlı. Anahtar açık iken pin low da (pull down direnci ile) anahtar kapalı iken pin High da olsun. Burada Pull down şeklinde bir terim geçiyor. Port pinlerinin sıfıra yani Low'a çekilebilmesi için pin ile GND arasına 10K lık bir direnç bağlanır. Buna Pull-Down işlemi denir. Aynı işin tersi olarak Pin şayet 10K lık bir direnç ile +5V'a bağlanır ise bu dirence de Pull-Up direnci denir.
Şimdi PortB.0 10K ile GND ye bağlı yani bu direnç ile sürekli LOW da tutuluyor. İki ucu olan Anahtarın bir ucu pin'e bağlı diğer ucu da +5V'a bağlı olsun. Anahtarı kapadığımız zaman pin'e +5V yani High gelsin. Anahtarın durumunu bir LED ile izlemeye çalışalım. Anahtar kapalı iken PortA.0'a 470 Ohm dirençle bağlı bir LED yansın. Anahtar açık iken Led sönsün.
İşte programımız ve açıklamaları;
Proje 2a :
TRISA=0 'A portu çıkış olarak ayarlandı
TRISB=%00000001 'B.0 pini giriş diğerleri çıkış olarak ayarlandı.
SYMBOL TUS= PORTB.0 ' PortB.0 pinine sembol ismi olarak TUS adı verildi.
SYMBOL LED= PORTA.0 ' PortA.0 pinine sembol ismi olarak LED adı verildi.
BASLA:
IF TUS=1 THEN ' Anahtar kapalı ise
HIGH LED ' LED'i yak
ELSE ' Değilse
LOW LED ' LED'i söndür
ENDIF ' IF sorgulaması sonu
GOTO BASLA ' BASLA isimli etikete git.
END
Bu programda bazı yeni komutlar gördünüz. Sırası ile inceleyelim.
Önce SYMBOL komutunu görelim. Bu komut tanımlanmış bir değişkeni başka isimle yeniden tanımlamak veya herhangi bir port pinine bir isim vermek için kullanılır. Burada komutu port pinlerine isim vermek için kullandık. Aynı işi port pinini değişken olarak tanımlayarak da yapabilirdik. Şöyle;
TUS VAR PORTB.0
LED VAR PORTA.0
şeklinde yapılan tanımlama fonksiyon olarak SYMBOL tanımlaması ile aynı işlevi görür.Burada VAR isimli bir ifade görüyorsunuz. Sırası gelmişken bu ifadenin ne olduğunu açıklayalım.VAR İngilizce VARIABLE kelimesinden kısaltılarak türetilmiş olup Türkçesi DEĞİŞKEN dir.
Program içinde değişken tanımlamanıza imkan tanır. Program içinde muhtelif değişkenler kullanılmaktadır. PBP genel olarak 5 tip değişken tanımlamanıza olanak tanır. Bunları örneklerle açıklayalım;
Bit tipi değişken;
TUS VAR BIT (veya TUS VAR PORTA.0) değişkenin boyutu bit dir.
BYTE tipi değişken;
AL VAR BYTE ,burada AL isimli değişken 8 bitlik bir değişken olup alabileceği en büyük rakam 255 değeridir. Böylece bu değişken 0-255 arasında herhangi bir değer alabilir.
WORD Tipi Değişken;
TOPLAM VAR WORD , burada TOPLAM isimli değişken çift baytlık yani 16 bitlik bir değişken olup alabileceği rakam değerleri 0 - 65535 arasında olacaktır.
Dizi Tipi Değişkenler ;
ISIM VAR BYTE [10] 'isim adı altında 11 adet değişken tanımlar. Bu değişkenlere değişken numarası verilerek ulaşılabilir. Sıralama sıfırdan başlar. Örneğin ISIM[4] beşinci değişken olmaktadır.
Son olarak Sabit değerli değişkenleri tanımlayacağız.
TA CON 3 ' Burada TA isimli değişkene 3 değeri sabit olarak verilmektedir. Program içinde bir daha değiştirilemez veya sadece ilk tanımlandığı yerde değiştirilebilir.
Tekrar programımızdaki komutlara dönersek IF (Şayet veya Eğer) komutunu göreceğiz.IF komutu sorgulama yapılması gereken veya şarta bağlı işlerde kullanılan bir komuttur.Şayet PORTA.0 pini Low ise PORTB.0 daki Led yansın şeklinde bir şarta bağlı bir işlemin program halinde yazılımı şu şekilde olacaktır;
IF PortA.0=0 then HIGH PortB.0
IF komutunun içinde kullanılan birde ELSE isimli ilavesi vardır. Bu komut birinci şart doğru değilse ikinci şart olarak kullanılır.
Şayet PORTA.0=0 ise LED'i yak değil ise (yani PortA.0=0 değil ise) LED'i söndür şeklinde verilen bir tanımlamayı program olarak yazacak olur isek;
IF PORTA.0=0 THEN
HIGH LED
ELSE
LOW LED
ENDIF
Else komutunu kullanacağımız zaman mutlaka birinci satırda THEN den sonra bir şey
yazmamamız gerekir. (Yukarıda olduğu gibi) Devam eden ifade alta yazılır.
Yeni bir program yazacağız ve öğrendiğimiz yeni komutları bu programda kullanacağız.
Programın konusu şöyle;
Proje 2b:
- PortB.0 pinine bir Tuş bağlı ve Pull-Up yapılmış vaziyette. Yani pin sürekli High da duruyor. Tuşa basılınca LOW olacaktır.
- PortB.1 pinine bir Led bağlı.
- Tuşa basıldığı zaman LED yanacak , tuşa tekrar basıldığı zaman LED sönecek. Bir nevi on/off anahtar gibi çalıştıracağız tuşu.
Görüldüğü gibi yalnızca B portunu kullanıyoruz. Sıfır nolu pin (B.0) tuş bağlı olduğu için giriş olacak, bir nolu pin (B.1) ise Led bağlı olduğu için çıkış olacak.
Şimdi programımıza geçelim ;
TRISB=%00000001
SYMBOL TUS=PORTB.0
SYMBOL LED=PORTB.1
BASLA:
IF TUS=0 THEN
IF LED=1 THEN
LOW LED
ELSE
HIGH LED
ENDIF
ENDIF
GOTO BASLA
END
Burada programı kısaltmak için başka bir komut kullanabiliriz. TOGGLE komutu. Toggle bit bazında
çalışan bir komut olup bit şayet 1 ise 0 yapar. Bit şayet 0 ise 1 yapar.
Aynı programı şimdi Toggle kullanarak yazalım;
Proje 2c : (şema 2b ile aynı)
TRISB=%00000001
SYMBOL TUS=PORTB.0
SYMBOL LED=PORTB.1
BASLA:
PAUSE 70
IF TUS=0 THEN TOGGLE LED
GOTO BASLA
END
Gördüğünüz gibi program bayağı kısaldı. Toggle komutu byte tipi değişkenlere tatbik edilmez. Örneğin TOGGLE PORTB diyemeyiz. Ancak TOOGLE PORTB.2 diyebiliriz.
Biraz da matematik yapalım. Programlarda matematik dört işlem komutları normal matematik yapılır gibi kullanılmaktadır. Gerektiğinde işlemler değişkenler yardımı ile de kullanılabilir.
Örnek vermek gerekir ise;
A=24
B=12
C=A+B şeklinde bir ifade kullanılabilir.
C=A-B veya C=A/B veya C=A*B şeklinde ifadeler kullanılabilmektedir.
Sonuçlar konusunda programcıların dikkatli olması gerekir. 8 bitlik değişkenler kullanılarak yapılacak hesapların sonuçları da 8 bit sınırı içinde olması gerekir. 8 biti aşan sonuçlar için WORD değişkeni kullanılmalı, 16 biti aşan hesaplamalarda ise bölme için DIV32 komutu kullanılmalıdır. Bu konuda ileriki derslerimizde örnekler üzerinde çalışacağız.
Bu arada bit bazında yapılan işlemlerde bazı önemli noktalara işaret etmek istiyorum. Bir kısmı giriş bir kısmı çıkış olarak ayarlanmış portlarda işlem yapmak genellikle problemlere sebep olur. Bu yüzden bit bazında yapılan işlemleri çok iyi öğrenmek gerekir. Bunun için Mantıksal Operatörler (Logical Operators) konusunu inceleyeceğiz. Çoğunuzun mantık konusunda bilgi sahibi olduğunu düşünüyorum. Yinede mantık genel konularına burada değinmekte yarar var.
a) AND (ve) Operatörü:
------------------------------
Mantıksal operatörlerin anlaşılmasının en kolay yönlerinden birisi lamba devreleridir. İki adet anahtar ile bir adet lambayı yakacağımızı düşünürsek, ve şart olarak da her iki anahtar kapalı olunca lamba yansın der isek bir AND işlemine ihtiyacımız var demektir. Bu durumda eşitlik aşağıdaki gibi olmalıdır.
IF (SW-1=1) AND (SW-2=1) THEN HIGH LAMBA
bu eşitliğin mantık modeli ise 1 AND 1 = 1
olumsuz hali olarak 1 AND 0 = 0 yazılabilir.
Tabii ki 0 AND 0=0 olduğunu söylemeye gerek yok sanırım.
Lamba olayına geri döner isek, lambanın yanabilmesi için her iki anahtarın (1) yani kapalı olması gerektiği ortadadır. Anahtarlardan birisi açık olur ise olumsuz hal meydana gelir ve lamba sönük kalır. AND operatörü bit bazındaki işlemlerde genellikle aşağıdaki şekillerde kullanılır.
- 8 bitlik bir ifadeden bazı bitleri izole edip ayırmak için;
PORTB= %11100100 olsun ve bu bilginin ilk 4 adet bitini başka bir değişkene vermek isteyelim.
A=PORTB AND %00001111
A= %0100 olacaktır. yani ilk 4 adet bit A değişkenine eşitlenmiş olur. Temel kaide izole edilecek bitlerin tamamı 1 ile AND lenir.
- Yine 8 bitlik bir ifadede istenen bazı bitleri low yapmak için kullanılabilir.
PORTB=%11100100 olsun ve biz high olan 2 biti low yapmak isteyelim. İşte çözüm;
PORTB=PORTB AND %11111011
PORTB nin yeni değeri %11100000 olacaktır. Temel kaide low yapılacak bit sıfır diğer bitler 1 ile AND lenir.
b) OR (veya) Operatörü :
----------------------------------
Yine lamba devresini örnek verecek olursak, bir lambanın yanabilmesi için iki anahtardan birisinin kapalı olması yeterli ise bu durumda karşımızda bir OR işlemi var demektir. Bunun şartlı ifadesi şöyledir;
IF (SW-1=1) OR (SW-2=1) THEN HIGH LAMBA mantık modeli ise
1 OR 1 = 1
1 OR 0 = 1
0 OR 1 = 1
0 OR 0 = 0
Or işlemi şartlı ifadelerde kullanılır. yukarıdaki lamba örneğinde olduğu gibi. Bundan daha fazla
olarak istenen bir bit'in high yapılmasında kullanılmaktadır. Örnek;
PortB=%11001100 ise ve 1. bit High yapılmak isteniyor ise;
PortB=PortB OR %00000010 şeklindeki ifade ile 1. bit High yapılır. Sonuç PortB=%11001110 olur.High yapılmak istenen bit 1 diğerleri 0 ile OR lanır.
c) XOR (Özel Veya) :
-----------------------------
Genellikle bitleri ters çevirme işlemlerinde kullanılır. Mantıksal model şöyledir.
1 XOR 1 = 0
0 XOR 0 = 0
1 XOR 0 = 1
0 XOR 1 = 1
A=%11100011 , B=%01010101 olsun
C= A XOR B eşitliğine bakalım ve C nin alacağı değeri hesaplayalım
A= %11100011
B= %01010101
--------XOR ------
C= %10110110 sonucu elde edilecektir. Şimdi C nin bitlerini ters çevirmek istersek şöyle
yapılacaktır;
C=%10110110
%11111111
------XOR-------
C=% 01001001 görüldüğü gibi C nin yeni değeri öncekinin ters çevrilmiş halidir. Demek ki bir
sayının bitlerini ters çevirmek için o sayıyı tamamı 1 lerden oluşan bir sayı ile XOR lamak gerekir.Bir sayının yalnızca bir bitini ters çevirmek için TOGGLE komutu kullanılmaktadır. Ancak aynı işi XOR ile de yapabiliriz.
A=%11111110 olsun bu sayının 7. bitini ters çevirecek olur isek
A.7=A.7 XOR %1 Bu durumda A sayısı %011111110 olacaktır.
Daha öncede belirttiğimiz gibi aritmetik işlemlerinde kullandığımız değişken tipine bağlı olarak işlem yapmaya dikkat etmeliyiz. Özellikle vurgulamaya çalıştığım konu 8 bitlik sayılarla çalışırken elde edilecek neticenin de 8 bit sınırları içinde olmasına özen göstermeliyiz. Şayet hesap sonucu 8 biti aşacak ise veya aşma ihtimali var ise mutlaka sonucu yerleştireceğimiz değişken Word tipinde seçilmelidir.