CCS-C ile PIC Programlama, PIC Timer Modülleri ve Kullanımı – 3

Uzunca bir ara verdikten sonra ccs-c ile ilgili konu anlatımlarına devam ediyorum. En son Timer’lar konusunda kalmıştık, dolayısıyla bu yazıda Timer kullanımı ile ilgili bir kaç örneğe yer vereceğim.

Denemelerimde sitenin sağında reklamını gördüğünüz expkits firmasının PIC geliştirme devresini kullanıyorum.

Kit: ExpKits EX1-B
Kullanılan işlemci: PIC16F877
Kristal: 20 Mhz

Örnek 1:
Bu uygulamada PORTC’ ye bağlı olan 8 adet ledi kara şimşek efekti oluşturacak şekilde süreceğiz. Gerçekleştireceğimiz bu efekt programın ana döngüsünden bağımsız olacak, bunu yapabilmek için Timer0 modülünü ve kesmesini kullanacağız. Programımız ana döngüde PORTD’ye bağlı olan ledleri 0-255 arasında saydırma yapacak, bu işlem için B0 pinine bağlı butonu kullanacak, butona her basıldığında PORTD’deki ledler 1 artırılacak ve butonun bırakılması beklenecek

işte kodumuz

#include <16F877.h>
#fuses HS,NOWDT,PUT,PROTECT,NOLVP
#fuses NODEBUG,NOBROWNOUT,NOWRT,NOCPD
#use delay(clock=20000000)

#int_timer0
void timer0isr()
{
   static int leds = 0x07;
   static int counter = 0;
   static boolean led_direction = 0;

   if(++Counter == 10)
   {
      output_c(leds);

      if(!led_direction)
      {
         if(0xe0 == (leds = leds << 1))
         {
            leds = 0xe0;
            led_direction = 1;
         }
      }
      else
      {
         if(0x07 == (leds = leds >> 1))
         {
            leds = 0x07;
            led_direction = 0;
         }
      }

      Counter = 0;
   }
}

void main(void)
{

   output_a(0);
   output_b(0);
   output_c(0);
   output_d(0);
   output_e(0);

   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_256);

   enable_interrupts(GLOBAL);
   enable_interrupts(INT_TIMER0);

   for(;;)
   {
      if (!input(PIN_B0))
      {
         output_d(input_d() + 1);
         while(!input(PIN_B0))
            ;
      }
   }
}


Gördüğünüz gibi led efektimiz, ana programdaki işlemlerden kesinlikle etkilenmiyor. Efekti ana döngüde gerçekleştirseydik butonun bırakılması beklendiğinde efektimiz stop edecekti.

Örnek 2:
Bu uygulamada B0′daki butona basıldığında C0′daki led yakılacak ve buton bırakıldıktan yaklaşık 1 sn kadar sonra buton otomatik olarak söndürülecek. Süre dolmadan tekrar butona basılırsa led yanık kalacak ve en son basılma işleminden sonra yine aynı süre sonunda sönecek.

#include <16F877.h>
#fuses HS,NOWDT,PUT,PROTECT,NOLVP
#fuses NODEBUG,NOBROWNOUT,NOWRT,NOCPD
#use delay(clock=20000000)

int counter;

#int_timer0
void timer0isr()
{
   if(++Counter == 50)
   {
      output_low(PIN_C0);
      disable_interrupts(INT_TIMER0);
   }
}

void main(void)
{

   output_a(0);
   output_b(0);
   output_c(0);
   output_d(0);
   output_e(0);

   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_256);

   disable_interrupts(INT_TIMER0);
   enable_interrupts(GLOBAL);

   for(;;)
   {
      if (!input(PIN_B0))
      {
         output_high(PIN_C0);
         while(!input(PIN_B0))
            ;
         Counter = 0;
         enable_interrupts(INT_TIMER0);
      }
   }
}


Timer kullanımına yönelik verdiğim bu örnekler oldukça kısıtlı kaldı ama ileride vereceğim başka konulardaki örneklerin içerisinde de timer modüllerini kullanacağım için konu daha rahat anlaşılacaktır.

CCS-C ile PIC Programlama, PIC Timer Modülleri ve Kullanımı – 3 yazısı için 7 yorum yapıldı

  1. fatih says:

    Videoları gündüz çekerseniz daha net anlaşılabilir. Kullandığınız kart hangi firmanın ürünü ?

  2. Emrah AYDIN says:

    @fatih
    haklısın, gündüz çekeceğim artık. Kullandığım kart expkits.com ürünü.

  3. Erol KÜLEK says:

    ıyı calısmalar..
    emrah bey yazdıgınız programa ait kodların satırların ne ıcın kullanıldıgını (program ıcındekı amacı) yazabılırmısınız
    SAYGILAR..

  4. Volkan Alparslan KILIÇ says:

    16F877 ile zaman ayarlı olarak motor kontrolü yapmak istiyorum A portuna baglı 1. butona basılınca, c portundaki motor 5dk, 2. butona basıldığnda aynı motor 10dk süreyle, 3. butona basıldığında ise 15 dk süreyle dc motoru çalıştıracak bir porgram yazmam lazım, örnek uygulama bulamadım.a protuna bağlı pot ile de pwm kontorlü yapmam lazım..Bu konuda örnek bir program gönderebilirmisiniz..Benim için cok önemli…

  5. deniz ak says:

    Merhaba
    Notlarınızı ilgiyle takip ediyorum. Umarım devamı da olur.
    Bu bölümdeki ilk örneği isis te çizdim. Progamı derleyip çalıştırdım. Kara şimşek kısmı çalışıyor. Fakat butona basınca D0 a bağlı ilk led yanıyor devamı gelmiyor. Yani ilk sayı sayıyor. Ama ikinci defa basınca 2 olmuyor. Yani saymıyor
    Programda hata mı var acaba.
    Teşekkürler.

  6. Maho says:

    @Volkan

    O söylediğin işlem için alt program kullanman gerekiyor profesyonel bir iş içinmi kullanacaksın yoksa eğitim amaçlımı?

  7. yaren says:

    hocam uzun bir aradan sonra sizin çalışma alanınıza yeniden dönmek beni mutlu etti. sizi bilgilerinize ihtiyacım olacak, saygılarımla.

Leave a Reply

Your email address will not be published. Required fields are marked *

*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>