Yasin DEMİR

#herseypaylasmakicin

———————————————————————————————

PICBasic Dersleri PIC Basic Pro ile PIC Programlama

———————————————————————————————-

Bu yazımız elektrik-elektroniğe, devrelere, microişlemcilere vs meraklı olan arkadaşlarımıza, özellikle yeni başlayan arkadaşlarımız için tam bir kılavuz olacaktır. Yazımızda büyük emeği olan Erol Tahir Erdal e teşekkür ederim…

Pic Micro işlemciler hakkında kısa bilgi:

Pic mikro işlemciler teknik özellikleri ve kılıfları açısından farklılıklar gösterirler. Her şeyden önce birden fazla bacağa (pin) sahip olan işlemcilerin bacakları giriş veya çıkış olarak çalıştırılabilirler. Özellikleri açısından da bir kere programlanabilenler (C serisi) programları ultraviyole ile silinip yeniden programlanabilenler ve birden fazla silinip programlanabilenler olarak sınıflandırılabilirler. Biz genelde FLASH olarak tarif edilen birden fazla silinip programlanabilen tipler üzerinde çalışacağız.Pic’ler taşıdığı ekstra özellikler açısından da bir kaç kategoriye ayrılırlar. Örnek olarak üzerin de;

1) Analog-Digital Çeviricisi olanlar,
2) Komparatör olanlar,
3) Donanımsal olarak seri haberleşme ünitesi olanlar,
4) HPWM ünitesi olanlar gibi Pic’ler mevcuttur. İleriki bölümlerde bunların kullanımına ait örnekler vereceğiz.

Pic işlemcilerin pinlerinin hem giriş hem de çıkış olarak çalıştırılabildiğinden bahsetmiş idik. Açıklamalarımızla ilgili uygulamalarımıza “Proje” adını vereceğiz ve her projemizin bir numarası olacaktır. Şimdi Pic lerinin organizasyonu işlemlerine kısa bir göz atalım.

Kullanacağımız Pic 16F84A olacak. Bu işlemcinin toplam 18 bacağı vardır.5 nolu bacak(-),ve 14 nolu bacak(+) besleme ,15-16 nolu bacaklar (XTAL) osilatör bacakları ve PortA (0-4 arası 5 adet pin) < 17,18,1,2,3 nolu bacaklar > ve PortB (0-7 arası 8 adet pin) <6,7,8,9,10,11,12,13 nolu bacaklar > olmak üzere toplam 13 adet (Giriş-Çıkış) pin’e sahip bir işlemcidir.

PIC16F84 Pin Bilgileri

pic16f84-pdip-soic-pic-bacak

İlk projemize geçmeden, anlatımda lazım olacak olan BASIC de kullanılan sayı gösterim formatları konusunda biraz bilgi vermek istiyorum. Bildiğiniz gibi kullanacağımız 3 tür sayı formatı vardır. Formatlar ve gösterim şekilleri aşağıda verilmiştir.

1) Desimal Sayılar (10 tabanına göre düzenlenmiş sayılar):direkt kullanılırlar 12 -23 gibi

2) Hexadesimal Sayılar (16 tabanına göre düzenlenmiş sayılar) : başlarına $ işareti koyularak gösterilirler. $1F , $31 gibi

3) Binary Sayılar (2 tabanına göre düzenlenmiş sayılar) : ise başlarına % işareti koyularak gösterilirler. %111000 , %0001 gibi.

Sıklıkla kullandığımız sayı sistemi desimal olduğundan diğer sayıların kolayca anlaşılabilmesi için zaman zaman bu sayıların 10 tabanına çevrilmesi gerekir. Aşağıda bu işlemin nasıl yapıldığını basitçe göreceksiniz. Bu işlemde temel formül; aynı on tabanına göre sayılarda olduğu gibidir. Sağdan sola doğru haneler sayı tabanının katları şeklinde değer alırlar. Yani değişen tek şey taban çarpım değeridir. Örnekle daha iyi anlayacaksınız.

Hexadesimal sayılar : 0-1-2-3-4-5-6-7-8-9-A-B-C-D-E-F: Örnek sayımız <3F> olsun. 16 tabanlı sayı formatı olduğundan;16′lar hanesi olan 3 sayısı 16 ile çarpılıp F sayısının desimal karşılığı bu sayıya eklenir. Dolayısıyla; 3F = 3 x 16 + 15 = 63 olarak bulunur. Şayet sayı 23F olsa idi sayımız= 2 x 256 + 16 x 3 + 15= 575 olarak bulunacak idi.

Binary sayılar; 0-1 , örnek sayımız %11101101 olsun. Hanelerin taban sayısının katları şeklinde gittiğini biliyoruz. O halde sağdan itibaren ilk sayımız hane değerleri şöyle olacaktır. sayı sırasına göre verir isek 128 – 64 – 32 – 16 – 8 – 4 – 2 – 1 Bu sisteme göre sayımızı desimal değere çevirelim; %11101101: 128×1 + 64×1 + 32×1 + 16×0 + 8×1 + 4×1 + 2×0 + 1= 128+64+32+8+4+1=237 olarak bulunacaktır.

En çok kullanacağımız sayı formatlarından birisi olan Binary sayı formatının kullanım yerine bir örnek vermek bu aşamada iyi olacaktır sanırım. Bir Pic’in B portuna bağlı olan Led lerden 0-3-4-6-ve 7 nolu pinlere bağlı olanları bir seferde yanar hale getirebilmek için porta verilecek değeri desimal olarak hesaplayalım. Bu durumda PortB=%11011001 olacaktır.Desimal değeri = 128+64+16+8+1= 217 olarak bulunur.

İlk projemiz, PIC16F84A işlemcinin Tüm bacaklarını çıkış olarak ayarlamak ve bu çıkışlara bağlanacak LED lerin değişik aralıklar ile yanmasını gösteren bir program olacaktır. Bu arada amaç, Pic lerin bacaklarının nasıl çıkış olarak ayarlandığını öğrenmek olacaktır.

Pic lerde bacakların giriş veya çıkış olarak ayarlanmasını üstlenen bir REGISTER (Türkçe’si YAZMAÇ) vardır. Her bir port için ayrı olan bu registerler A portu için TRISA , B portu için ise TRISB olarak adlandırılır. Tris yazmaçları aslında Pic’in hafızasında 8 bitlik birer hafızadırlar. Buraya yerleştirilen sayının Binary formatındaki şekline bağlı olarak Pic bacaklarını giriş veya çıkış olarak ayarlar.8 bitlik değer sırası ile port’a ait pinleri temsil etmektedir.

Şöyle ki;

A) %00000000, ifadesi 8 bitlik Binary bir sayıdır. Desimal karşılığı 0 (sıfır) dır. Bu değeri herhangi bir TRIS registerine verir isek tüm pinlerin OUTPUT yani çıkış olarak ayarlanacağını ifade eder.

B) Şayet değer %11111111 olur ise tüm bacakların INPUT yani giriş olarak ayarlanacağını ifade eder.

Binary değerin bazılarının sıfır (0) bazılarının bir(1) olması ise bazı pinlerin çıkış bazılarının ise giriş olarak ayarlandığını gösterir. Şimdi açıklamamızı program şeklinde verelim.

TRISA=%00000 ‘A portu Çıkış olarak ayarlandı
TRISB=%00000000 ‘B portu Çıkış olarak ayarlandı

Çıkış olarak belirlediğim portun çıkış değerini Low (0) olarak ayarlamak için şu şekilde bir ifade yazabilirim.

PORTA=0 ‘A portu tüm çıkışlar Low (0)
PORTB=0 ‘B portu tüm çıkışlar Low (0) Eğer High yapmak isteseydim
(PORTA=1),(PORTB=1)şeklinde yazacaktım.

Gördünüz mü ne kadar basit. Pinleri çıkış olarak ayarladım ve tüm çıkışları Low yaptım.
Herhangi bir portun bir pin’inin gösterilme şekli port ismi devamında nokta ve pin numarası verilerek yapılır.

Örnek A portunun 2 nolu pini için PORTA.2 şeklinde bir gösterim kullanılır.
Şimdi diyelim ki PORTA.0 yani A portunun sıfır biti yani ilk pin’e bağlı LED‘i yakalım ;Komutumuz bir kaç mantıklı şekilde olabilir. Sırası ile;

PORTA.0=1 ‘PortA.0 High yani 1 oldu ve LED yandı.veya
HIGH PORTA.0 ‘PortA.0 High oldu yani LED yandı,

Komutu mümkün olduğu sürece şeklinde kullanmayı tercih edin.

Proje 1a :

picbasic_led_yak_1

Şimdi de birden fazla pin’e bağlı Led lerin aynı anda yakılmasını gerçekleştirelim.
PortA=%10101 şeklin de bir komut yazarsam, sağdaki ilk değer olan 1 (Bir) PortA.0′a verilir. Sonra sırası ile yani soldan sağa doğru olan Binary değerler PORTA nın 0-4 nolu pinlerine verilirler. Değer sıfır ise pin Low, değer bir ise pin High olur.

Sonuçta bu komut ;

TRISA=%00000 ‘A portu Çıkış olarak ayarlandı
PortA.0=1
PortA.1=0
PortA.2=1
PortA.3=0

PortA.4=1 ‘( Bu pin diğerlerinden farklıdır.Open kollektör olduğu için “pullup” direnci kullanılır.Aksi halde istediğimiz çıkışı alamayız.)şeklinde karşılık gelen Binary değerleri port pinlerine verir.

Demek ki bir port’a bağlı pinlerin birden fazlasına hükmetmek için port’a sekiz bitlik bir Binary veya desimal değer verilir.Şimdi port pinlerinin ne amaçlı çıkış olarak kullanıldığı üzerine biraz bilgi verelim.

Diyelim ki port pin’ine bağlı bir Role yi bir transistor aracılığı ile çalıştırmak istiyorsun. İşte yolu, pin çıkışını bir direnç ile (1K-2k2) bir transistor ün (B)eys’ine bağla. NPN tipi bir transistör kullanırsan transistör ün (E)mitterini GND ye bağla. Port Pin’inden High (1) çıkartırsan transistör iletime geçecek ve (C) kollektör ünden GND çıkaracaktır. Bunu bir role ye bağla ve rölenin diğer ucunu +5V‘a bağlar isen pinden röleyi çalıştırıp kapatabilirsin.

Bunu bir örnekle açıklayalım;

Diyelim ki PortB.1 pinine bir transistör üzerinden role bağladık ve bu röleyi açıp kapayacağız.İşte basit programımız;

Proje 1b :

pic_basic_role

1 TRISB=%00000000 ‘B portu çıkış yapıldı
2 PortB=0 ‘B portunun çıkışı Low(0) yapıldı.
3 ROLEAC:
4 HIGH PORTB.1
5 PAUSE 1000 ‘1000 ms lik bir gecikme yaratır.
6 LOW PORTB.1
7 PAUSE 500
8 GOTO ROLEAC

1. Satırda PortB yi çıkış olarak ayarladık.
2. Satırda PortB pinlerinin tamamını LOW yaptık.
3. cü satırda ROLEAC isimli bir etiket yarattık.(Yaptırmak istediğimiz diğer komutlar için ismini kendimizin koyduğu başka etiketler yaratıp programın daha fazla işlem yapmasını sağlarız.)
4. satırda PortB.1 pinini High yaptık.
5. satırda 1000 ms lik bir gecikme yarattık. Yani role 1000 ms süresince çekili kaldı.
6. Satırda PortB.1 pinini LOW yaptık. Yani role bıraktı.
7. satırda tekrar 500 ms lik bir gecikme yarattık.
Sonra programı tekrar aynı işleri yapması için ROLEAC etiketine yönlendirdik.
Buraya kadar öğrendiklerimizi toparlar isek;
– Sayı gösterim formatlarını öğrendik.
– Port pinlerinin nasıl giriş nasıl çıkış yapılacağını öğrendik.
– Port ve port pinlerine nasıl ulaşabileceğimizi öğrendik.
– Milisaniye cinsinden gecikmenin nasıl yaratıldığını öğrendik.
– Program içinde etiket kullanarak aynı işlemlerin nasıl tekrarlanabileceğini öğrendik.

Bütün bu öğrendiklerimizi tek program üzerinde göstermeye çalışalım.

Proje 1c :

pic16f84_picbasic_led_role

Program PortA.0 pinine bağlı LED i kontrol edecek ve ayrıca PortB.0 pin’ine bağlı röleyi açıp kapayacaktır. Role çekildiğinde PortA.0 pinine bağlı LED yanacak. Role bırakınca LED’de sönecektir. Role çekili kalma süresi 1 sn. yani 1000 ms. olacaktır.

TRISA=0 ‘bu ifade “TrisA=%00000”e eşdeğerdir.
TRISB=0
PortA=0
PortB=0

ROLEAC:
HIGH PORTB.0
‘role çektirildi
PAUSE 500 ‘500 ms bekleme
HIGH PORTA.0 ‘Led yandı
PAUSE 500 ‘500 ms bekleme
LOW PORTA.0 ‘Led söndü
PAUSE 500 ‘500 ms bekleme
LOW PORTB.0 ‘Role bıraktı
PAUSE 500 ‘500 ms bekleme
GOTO ROLEAC ‘Roleac etiketine git
END ‘programın burada bittiğini ifade eder.

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 :

pic16f84_470ohm_led_yak

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:

pic16f84a_picbasic_proje2b

– 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.

PIC Basic Pro ya giriş adına bu yazımızın çok faydalı olduğuna eminim. Ben bu hızda daha da ilerlemek istiyorum diyorsanız aşağıdaki linke tıklamanız yeterli….

Derslerin devamına buradan erişebilirsiniz…

 

 

AnaSayfa