Elektronik / Elektronik Kaynakları/

PICBasic Dersleri PIC Basic Pro ile PIC Programlama 2

Sponsorlu Bağlantılar

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.

Hazırlayan: Erol Tahir Erdal (ETE) PICBasic Dersleri PIC Basic Pro ile PIC Programlama 2 Kod ve simülasyon dosyaları: PICBasic Dersleri PIC Basic Pro ile PIC Programlama 2

Dosya indirme LINK listesi (HTML formatında) link-10118.zip şifre-pass: 320volt.com

PICBasic Dersleri PIC Basic Pro ile PIC Programlama-3 Ders-3 Devam

  • Fahrettin

    ETE hocam,

    SYMBOL komutu ile pinlere isim vermeye çalışırken;

    Örnek;

    SYMBOL LED1=PORTA.1

    yazdığımda “extra token on end of line” hatası alıyorum.

    PORTA’nın sonundaki 1 rakamını sildiğimde hata gidiyor.

    Ama bu seferde porta1 pinine tanımlama yapmamış oluyorum. Çıkamadım işin içinden.

    Ben nerede hata yapıyorum hocam?

    Teşekkürler.

  • ete

    Programın tamamını görmeden bir cevap vermem mümkün değil maalesef.
    Program satırlarında bir hata olduğu kesin ama bu bilgi ile hatanın ne olduğunu söylemem mümkün değil maalesef.

    erol.erdal@gmail.com adresine programı yollarsan bakabilirim.
    Ayrıca hangi derleyici versiyonu kullandığınıda belirtmeyi unutma lütfen.

    Ete

  • Fahrettin

    Hocam,

    Size mesaj atmam bile yetti sanırım.:) Akşam derleyemediğim aynı kodu bu sabah denedim ve oldu. Neden böyle oldu anlamadım, aynı kod aynı komutlar sabah derlendi. Nedeni ne olabilir hocam? Ya da böyle şeyler olması normal mi?

    Pbp 2.5 ve mcsp 3.0 kullanıyorum. Pic 16f628a

    KODLAR:

    TrisA=%00000000
    TrisB=%00000000
    PortA=0
    PortB=0
    ‘———————-
    SYMBOL LED1=PORTA.0 ‘Dün akşam port numaraları yazdığımda derlenmiyordu)
    symbol LED2=PORTA.1
    SYMBOL LED3=PORTA.2
    SYMBOL LED4=PORTA.3
    SYMBOL LED5=PORTA.4
    ‘———————-

    LEDYAK:
    LED1=1
    PAUSE 300
    LED1=0
    LED2=1
    PAUSE 300
    LED2=0
    LED3=1
    PAUSE 300
    LED3=0
    LED4=1
    PAUSE 300
    LED4=0
    LED5=1
    PAUSE 300
    LED5=1
    PAUSE 300
    GOTO LEDYAK
    END

    Cevabınız için teşekkürler…

  • ete

    Öyle şeyler olması tabiiki normal değil ama normal olan şeyler insanın sürekli hata yapmaya meyilli olmasıdır. Üstelik hatasınıda zaman zaman önünde durduğu halde görmemesidir. Bu yanızca sana olan bir şey değil ben dahil çoğu kişi böyledir. Takma kafanı.

    Ete

  • Fahrettin

    Haklısınız, sürekli denemeye ve öğrenmeye devam etmek lazım.
    Çok teşekkürler.

  • artemis_17

    Pic programlamayı yeni öğrenenler için çok açıklayıcı notlarınız. Çok teşekkürler

  • Merve

    Notlarınız gerçekten çok yardımcı oldu fakat benim kodumda burada olmayan bir satır örneği var
    Button PORTA.2,1,100,100,kg,1,ac
    Button PORTA.3,1,100,100,kg,1,ac
    Bunlar ne anlama geldiğini değişkenlerin hangi sıraya göre dizildiğini anlayamadım.Yardımcı olursanız sevinirim.

  • ete

    Button komutu aağıdaki parametrelere sahip sizinörneğe göre yazıyorum.
    PORTA.2 =Butonun bağlı olduğu port pini sizde PortA.2 de bağlı
    1 = Butona basıldığı zaman buton pininin hangi lojik değeri alacağı burada 1 yani HIGH olacağı belirtilmiş oluyor.
    100=Otomatik tekrar başlamadan önce uygulanacak gecikme süresi
    100= otomatik tekrar adedi
    kg=Tekrar veya sayma değişkeni. Buton komutunu vermeden önce sıfırlanmalı ve programınbaşka yerlerinde kullanılmamalıdır. Bu değişken geri planda geri sayım için kullanılmaktadır.
    1= Şayet butona basılırsa bir sonraki etikete git anlamına gelir. Burada sıfır olsa idi butona basılmaz ise o etikete git anlamını taşıyacak idi.
    AC=butona basılırsa AC isimli etikete git anlamına geliyor.

    Kolaylıkla anlayacağın gibi komut bir sürü karmaşık parametreye sahip. Bu yüzden hiç sevmem ve ben daima kendi tuş kontrol sistemimi yazar kullanırım.

    Ete

  • merve

    Merhaba ben daha öncede mesaj atmıştım aynı konuyla ilgili ama kodu bi türlü çözemiyorum dewamlı hata veriyor bana bilmediğim birşey var ama ne olduğunu anlayamadım kodu aşağıda yazıyorum hatamın nerde olduğunu bulmamda yardımcı olursanız çok sevinirim…

    ;LIST P=16F628A
    INCLUDE “P16F628A.INC”
    __CONFIG _XT_OSC & _WDT_OFF & _PWRTE_ON & _MCLRE_ON & _BODEN_OFF & _LVP_OFF & _DATA_CP_OFF & _CP_OFF
    MOVLW H’07’

    MOVWF TRISA ;PORTA NIN BÜTÜN PİNLERİNİ GİRİŞ YAP
    CLRF TRISB ;PORTB NİN BÜTÜN PİNLERİNİ ÇIKIŞ YAP
    ;TRISA=%00001100 ;A portunun giriş olarak tanımlanması*
    ;TRISB=%00000000 ;B portunun çıkış olarak tanımlanması*

    kg ;VAR WORD ;Değişkenin tanımlanması*

    bas:

    CLRF PORTB;PORTB=%00000000 ;Çıkışları sıfırlama*
    BTFSS PORTA.2,1,100,100,kg,1,ac
    BTFSC PORTA.3 ,1,100,100,kg,1,ac

    GOTO bas

    ac:

    BCF PORTB,%00000001
    PAUSE 1000 ;1000 ms bekle*
    BCF PORTB,%00000000
    PAUSE 5000 ;5000ms bekle*
    BCF PORTB,%00000010
    PAUSE 300 ;300ms bekle*
    GOTO bas

    End
    Bu ko bu sitede bulduğum bir proje için yazmaya çalıştım hatta projenin altındada kodu var ama oda çalışmıyor ondan ve sizin notlarınızdan yararlanarak bunu yazmaya çalıştım ama olmadı.
    Link:http://320volt.com/akilli-ev-tasarimi-otomasyonu/
    benim yapmaya çalıştığım Araç garaj kapısı sistemi bölümü devresini kurdum lütfen yardım edin.

  • OZAN

    Ete Hocam iyi ki varsınız :)