PIC Proje 3 – Led Toggle Uygulaması

PIC 16F877 mikrodenetleyici ile bu yazımızda led toggle uygulaması yapacağız. Led toggle uygulaması output_toggle() komutunun ledlerin yanıp sönmesinde doğrudan etkili olmasından dolayı bu isimle anılıyor. Daha önceki PIC ile ilgili yazılarımızda bu komutun pinin lojik değerini terslediğinden bahsetmiştik. Yani lojik – 0 konumundaki pini lojik – 1, lojik -1 konumundaki pini ise lojik – 0 konumuna getirmektedir.

Devrenin Oluşturulması

Öncelikle PIC ile yaptığımız her devrede olduğu gibi 13 ve 14 numaralı pinlerimizi kristalimize bağlayıp kristal uçlarına gerilimi sabitlemek için kondansatörlerimizi bağlıyoruz. Sonrasında da 1 numaralı pinimizden akım sınırlayıcı direnimizle 5V besleme yaparak RESET hattımızı tamamlıyoruz.

PIC denetleyimizin düzenli çalışabilmesi için gerekli temel bağlantıları tamamladıktan sonra ise B portundaki RB0, RB1, RB2, RB3, RB4 pinlerimize akım sınırlayıcı direncimizle beraber istediğimiz renkte birer LED bağlıyoruz. Burada istediğiniz portun istediğiniz pinlerine bağlantınızı yapabilirsiniz. Bu seçim tamamen size kalmış ama eğer devrenizin düzgün gözükmesini istiyorsanız benim yaptığım gibi alt alta aynı porta bağlamanızı tavsiye ederim.

Tasarladığımız devre aşağıdaki gibidir.

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. Şimdi ise ana fonskiyonumuzun içerisine asıl yapmak istediğimiz kodları yazabiliriz.

Önce B portuna ait tüm pinleri 0 yapıyoruz. Sonra ise sonsuz bir döngü içerisinde tüm led bağladığımız pinlerin lojik değerlerini 500 ms gecikmeyle tersine çeviriyoruz. Bu sayede sürekli sıralı bir şekilde yanıp sönen bir şerit led ortaya çıkarmış oluyoruz.

Yukarıda anlatılan kod aşağıdaki gibidir. Aşağıdaki kodda while veya for döngüsü kullanmak yerine goto deyimi kullandım. C programlama dilinde bu deyim de eğer kodunuzun devamı gelmeyecekse döngü olarak kullanılabilir.

#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

void main ()
{
    setup_psp(PSP_DISABLED); // PSP birimi devre dışı
    setup_spi(SPI_SS_DISABLED); // SPI 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_b(0x00); // RB0 portu tümüyle çıkış olarak ayarlandı.

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

    basla:

    delay_ms(500); // 500 ms'lik gecikme veriliyor
    output_toggle(pin_b0); // RB0 ucunun çıkış durumu tersleniyor
    delay_ms(500); // 500 ms'lik gecikme veriliyor
    output_toggle(pin_b1); // RB1 ucunun çıkış durumu tersleniyor
    delay_ms(500); // 500 ms'lik gecikme veriliyor
    output_toggle(pin_b2); // RB2 ucunun çıkış durumu tersleniyor
    delay_ms(500); // 500 ms'lik gecikme veriliyor
    output_toggle(pin_b3); // RB3 ucunun çıkış durumu tersleniyor
    delay_ms(500); // 500 ms'lik gecikme veriliyor
    output_toggle(pin_b4); // RB4 ucunun çıkış durumu tersleniyor
    
    goto basla;
}

Yukarıdaki kodu devremize ekledikten sonra devremiz aşağıdaki gibi çalışır.