PIC Proje 4 – Port Okuma ve Porta Bilgi Gönderme

PIC 16F877 mikrodenetleyicisi ile bu yazımızda denetleyicimize bağlantısını yaptığımız birden fazla buton ile yine denetleyicimize bağlı ledlerimizi yakacağız. Bu işlemi yaparken butonların basılı konumda olup olmadıklarını PIC vasıtasıyla okuyarak ledlerimize sinyal göndereceğiz. Bu uygulamanın iyi anlaşılması sonucu ileri doğru PIC ile tuş takımı uygulamaları da gerçekleştirebileceğiz. Öncelikle devremizi kurarak uygulamamıza başlayalım.

Devrenin Oluşturulması

Öncelikle PIC16F877 mikrodenetleyicimizin besleme gerilimi ve topraklamasınıyapıyoruz. Ardından 13  ve 14 numaralı pinlerinden kristal bağlantılarını yapıp 1 numaralı pin ile de RESET pininin bağlantısını yapıyoruz. Buraya kadar yaptığımız şeyler bu zamana kadar PIC ile kurduğumuz devrelerde yapmamız gereken ve yaptığımız şeylerdi. Bu aşamalardan sonra şimdi buton ve ledlerimizi ilgili portların ilgili pinlerine bağlamamız kaldı.

Butonlarımızı A portuna ledlerimizi ise B portuna bağlayalım. A portundan RA0, RA1, RA2, RA3, RA4 pinlerine birer tane buton bağlantısını yapalım Burada dikkat etmemiz gereken en önemli husus butonumuzun sağında ve solunda birer tane direnç olmasıdır. Bunun temel sebebi buton basılı konumdayken sinyalin yani küçük değerli akımın tamamının GND hattına gitmesini engeleyerek bağlı olduğu pine de gitmesi ve basılı konumda butonun üzerinden fazla akım geçmesini önlemektir.

B portuna yapacağımız led bağlantılarımız ise daha önce yaptığımız bağlantılar gibi birer akım sınırlayıcı direnç ve ledden oluşmaktadır. Tabiki de GND bağlantısını unutmuyoruz.

Yukarıda nasıl kuracağımızı anlattığım devrenin kurulmuş hali aşağıda mevcuttur.

CCS C Kodu

Kodumuzu yazarken diğer PIC projelerimizde olduğu gibi öncelikle kullanacağımız denetleyicinin header dosyasını derleyiciye tanıtarak kodumuzu yazmaya başlamalıyız. Sonrasında #fuses komutu ile denetleyicimizde kullanıp kullanmayacağımız pin özelliklerini derleyicimize bildiriyoruz. Ardından osilatör frekansımızı yazdıktan sonra hangi portlarda işlem yapacağımızı beliritiyoruz.Aynı zamanda bizim işimizi kolaylaştırmak ve kodumuzu kısaltmak amacıyla B portu anlamına gelmesi için #byte komutuyla bir tane de değişken tanımlıyoruz. Şimdi ise ana fonskiyonumuzun içerisine asıl yapmak istediğimiz kodları yazabiliriz.

Portlar üzerine kod yazarken de önce A portunu tamamen giriş, B portunu ise tamamen çıkıış olarak tanımlıyoruz. Sonrasında A portundan butonlar yardımıyla aldığımız bilgiler vasıtasıyla ledlerimizi yakabilmek için input fonskiyonumuzu kullanarak denetleyicimizden girdi alıyoruz. Gelen girdiyi B portuna atayarak ledlerimizi yakıyoruz. Bu uygulamada goto deyimini kullanarak sonsuz bir döngü içerisinde kodlarımız çalıştırdım. Kodlar aşağıdaki gibidir.

#include<16f877.h>     // Kullanılacak denetleyicinin başlık dosyası tanıtılıyor.

#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD // Denetleyici konfigürasyon ayarları

#use delay(clock=4000000) // Gecikme fonksiyonu için kullanılan osilatör frekansı belirtiliyor

#use fast_io(b) // Port yönlendirme komutları B portu için geçerli

#byte portb = 6; //6. adresteki B portu artık portb değişkeni ile çağırabilecek

int giris; //8 bit değerinde tamsayı tanımladık

void main ()
{
    setup_psp(PSP_DISABLED); // PSP birimi devre dışı
    setup_timer_1(T1_DISABLED); // T1 zamanlayıcısı devre dışı
    setup_timer_2(T2_DISABLED,0,1); // T2 zamanlayıcısı devre dışı
    setup_adc_ports(NO_ANALOGS); // ANALOG giriş yok
    setup_adc(ADC_OFF); // ADC birimi devre dışı
    setup_CCP1(CCP_OFF); // CCP1 birimi devre dışı
    setup_CCP2(CCP_OFF); // CCP2 birimi devre dışı

    set_tris_a(0x00); // A portu tümüyle çıkış olarak ayarlandı.
    set_tris_b(0x00); // B portu tümüyle çıkış olarak ayarlandı.

    output_b(0x00); // B portu çıkışı sıfırlanıyor

    basla:

    giris = input_a(); //A portunun değeri okunuyor ve giris değişkenine atanıyor

    giris = giris&0b00111111; //giris değişkeninin yüksek değerlikli son iki biti maskeleniyor
    portb = giris; //giriş değişkeninin değeri B portuna çıkış olarak gönderiliyor

    goto basla;
}

Yukarıda yazmış olduğumuz kodun devreyi çalıştırması aşağıdaki gibidir.