5 Buton 5 Led Uygulaması

Başlatan mierdogan, 17 Mart 2011, 13:31:49

mierdogan

Arkadaşlar Bu tip kaynak forumlar oluşturup biz yeni kullanıcılara yardımcı olduğunuz için teşekkür ederim. CCS C uygulamarını piyasada bulunan anlatımlı kitaplardan bir tanesini alarak başladım fakat basit gibi gözüken ama bana karışık gelen ufak bir döngüde takıldım sizin yardımınıza ihtiyac duyduğum konu ise 16f877A üzerinde kullanılacak 5 adet butonu kullanarak farklı peryotlarda yanıp sönmelerini sağlamak mesela 1 nolu tuşa basınca 1. led 1. sn aralıklarla yansın 2. butona basınca diğeri sönsün ve 5 sn aralıklarla yansın gibi herşeyi yazıyorum kitaba göre fakat bu giriş çıkış olayını aktif etme konusunda tıkanıyorum ufkumu açacak ufak bir yardımda bulunursanız sevinirim şimdiden teşekkürler....


JKramer

Merhaba,

Tıkandığınız noktada anlayamadığınız kısım tam olarak nedir?

mierdogan

#2
Şöyleki üstadım elimdeki kaynak kodu buraya atayım benim takıldığım nokta aktif ettiğim led' in bir başka butona basan kadar sürekli belirli aralıklarla yanıp sönüyor kalması başka bir butona batığımda durması ve diğerinin fasılalı yanıp sönme aralığındaki programın devam etmesi anlatabildim umarım. Kod aşağıdaki gibidir;



Edit: Döngüleri yaptım fakat bu seferde bir düğmeye basıp led'i aktif ettiğimde diğer butonlar işlevsiz kalıyor? Bir başka butona basınca nasıl interrupt yaparım acaba??? :-\

#include <16f877A.h>      
#use delay(CLOCK=4000000)
#use fast_io(b)
#use fast_io(a)
#fuses XT,NOPUT,NOPROTECT,NOBROWNOUT,NOLVP,NOWDT
int i=0;
void main()
{  set_tris_b(0xf8);
   set_tris_a(0x00);
   output_b(0x00);
   output_a(0x00);
   while(true)
   {  if(input(pin_b7) && i==0)
      {  i=1;
         output_high(pin_b2);
         delay_ms(6000);
         output_low(pin_b2);
      }
      if(input(pin_b6) && i==0)
      {  i=1;
         output_high(pin_b1);
         delay_ms(3000);
         output_low(pin_b1);
      }
      if(input(pin_b5) && i==0)
      {  i=1;
         output_high(pin_b0);
         delay_ms(1500);
         output_low(pin_b0);
      }
      if(input(pin_b4) && i==0)
      {  i=1;
         output_high(pin_a1);
         delay_ms(3000);
         output_low(pin_a1);
      }
      if(input(pin_b3) && i==0)
      {  i=1;
         output_high(pin_a0);
         delay_ms(6000);
         output_low(pin_a0);
      }
      if(!input(pin_b3)&& !input(pin_b4)&& !input(pin_b5)&& !input(pin_b6)&& !input(pin_b7))
      {  i=0;  }
   }
}


Teşekkür ederim Saygılar

prof_81

#3
#include  <16f877A.h>
#use delay(CLOCK=4000000)
#use fast_io(b)
#use fast_io(a)
#fuses XT,NOPUT,NOPROTECT,NOBROWNOUT,NOLVP,NOWDT
 int i=0;
void main()
{  set_tris_b(0xf8);
   set_tris_a(0x00);
   output_b(0x00);
   output_a(0x00);
  while(true)
 {

 if(input(pin_b7))
   {
   output_b(0x00);
   i=1; 
   } 
    if(input(pin_b6))
   {
   output_b(0x00);
   i=2;
   } 
    if(input(pin_b5))
   {
   output_b(0x00);
   i=3;
   } 
    if(input(pin_b4))
   {
   output_b(0x00);
   i=4;
   }
     if(input(pin_b3))
   {
   output_b(0x00);
   i=5;
   } 
  switch(i){
  case 1:
  output_toggle(pin_a0);
  delay_ms(100);
  break;
  case 2: 
  output_toggle(pin_a1);
  delay_ms(200);
  break;
  case 3:
  output_toggle(pin_b0);
  delay_ms(300);
  break;
  case 4:
  output_toggle(pin_b1);
  delay_ms(400);
  break;
  case 5:
  output_toggle(pin_b2);
  delay_ms(500);
  break;

}
}
}


C bilgim çok zayıf bu kodu yazabildim. Senin kod bana çok karmaşık geldi. İşinize yazar mı bilmiyorum.

Başka türlüde yapılabilir ama ben ancak bunu yazabildim. :-\

mierdogan

Codlama için teşekkür ederim yanlız interrupt girişimlerimiz şu anda düzgün çalışmıyor fakat bu kod varmak istediğim noktaya daha yakın butona basınca bekleme yapmadan diğer led'e geçmiyor geçsede bazen bir önceki yanık kalabiliyor. Acaba bu problem isis'denmi kaynaklanıyor yoksa codlamadanmı :) eğlenceli fakat bu nterrupt olayına takmış durumdayım...


prof_81

#5
Alıntı yapılan: mierdogan - 17 Mart 2011, 17:09:04
Codlama için teşekkür ederim yanlız interrupt girişimlerimiz şu anda düzgün çalışmıyor fakat bu kod varmak istediğim noktaya daha yakın butona basınca bekleme yapmadan diğer led'e geçmiyor geçsede bazen bir önceki yanık kalabiliyor. Acaba bu problem isis'denmi kaynaklanıyor yoksa codlamadanmı :) eğlenceli fakat bu nterrupt olayına takmış durumdayım...

kod da ufak değişiklik yapın ben sadece b portunu sıfırlamıştım. şimdi aklıma geldi a portunuda sıfırlarsak sorun düzelebilir. dediğim gibi C bilgim zayıf onun için fazla yardımcı olamayacağım.

if(input(pin_b7))
   {
delay_us(200);
   output_b(0x00);
   output_a(0x00);
   i=1; 
   }


gibi

mierdogan

Üstadım ancal cevap yazabiliyorum deneyip sonucu bildireceğim eğer çalışırsa burada paylaşırım

Saygılar

kudretuzuner

Merhaba
Yazılım hakkında bilgi verebilmem için 16F877'nin hangi pinlerine buton hangi pinlerine led ve de her bir ledin yanma sönme sürelerini veye daha açık sormak gerekirse senaryoyu tam olarak yazarsanız .asm olarak size yazabilirim.Ama kısaca prensip şöyle BTFSC PORTB,0(portb deki 0 ıncı buton şaseye çekildi mi?) evet ise şu işi yap belli süre bekle hayır ise BTFSC PORTB,1(portb deki 1 ıncı buton şaseye çekildi mi?)evet ise şu işi yap hayır ise ......gibi gider.
Amatör

mierdogan

Cevap için teşekkür ederim senaryo şöyle...


A girişlerinde 5 adet düğme

B çıkışlarında 5 adet led bağlı...

A pinlerinden 1. girişe bastığımda B pinlerinden 1. olarak ayarladığımız led 2 saniye aralıklarla yanıp sönmeye başlayacak

ve sonrasında

A pinlerinden seçtiğim bir diğer düğmeye bastığımda 1. led sönecek ve bastığım düğmenin karşılığı olan B çıkışındaki led 3 saniye aralıklarla yanıp sönmeye başlayacak

Ve son olarak hangi girişi kullandığımız önemli değil, bir tuş atayarak sistemi durdurup yada başlatabilmek yapmak istediğim şey bu, lakin CCS C ile yazdığımda (ki bilgim eksik zaten içinden çıkamıyorum) düğmelere bastığım zaman sadece ilk bastığım hangi düğme ise ona bağlı led yanıp sönüyor ve başka ledin yanıp sönmesini istediğimde geçmiyor. Prog arakdaşımızın verdiği programda ise;

Ledler yanık kalıyor atlama yaptığımızda...

Şimdiden teşekkürler

Saygılar

mierdogan

Yok üstadım ledler inatla yanık kalıyorlar....


mierdogan

Selam,

Kodlamayı bir hayli değiştirdim, fakat bir problem var bana göre problem tabi... 1. butona bastık diyelim 1. led yanıp sönmeye başladı ardından başka bir butona basınca diğerinin döngüsünün bitmesin i bekliyorum bazende yakalayamıyorum (butonu basılı tutunca geçiyor)

başka butona basar basmaz diğer led'e geçmesi için aşağıdaki kod'a ne eklemeliyim?

#include <16F877A.h>

#fuses XT,NOPUT,NOPROTECT,NOBROWNOUT,NOLVP,NOWDT

#use  delay(CLOCK=4000000)

#use fast_io(d)
#use fast_io(b)

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_b(0x00);
   set_tris_d(0xFF);
   
   output_b(0x00);

while(1)
{
   
   if(input(pin_d0))
   {
      while(!input(pin_d1) && !input(pin_d2) && !input(pin_d3) && !input(pin_d4) && !input(pin_d5))
      {
         output_high(pin_b0);
         delay_ms(4000);
         output_low(pin_b0);
         delay_ms(4000);
      }
   }
   
   if(input(pin_d1))
   {
      while(!input(pin_d0) && !input(pin_d2) && !input(pin_d3) && !input(pin_d4) && !input(pin_d5))
      {
         output_high(pin_b1);
         delay_ms(2000);
         output_low(pin_b1);
         delay_ms(2000);
      }
   }
   
   if(input(pin_d2))
   {
      while(!input(pin_d0) && !input(pin_d1) && !input(pin_d3) && !input(pin_d4) && !input(pin_d5))
      {
         output_high(pin_b2);
         delay_ms(1330);
         output_low(pin_b2);
         delay_ms(1330);
      }
   }
   
   if(input(pin_d3))
   {
      while(!input(pin_d0) && !input(pin_d1) && !input(pin_d2) && !input(pin_d4) && !input(pin_d5))
      {
         output_high(pin_b3);
         delay_ms(1000);
         output_low(pin_b3);
         delay_ms(1000);
      }
   }
   
   if(input(pin_d4))
   {
      while(!input(pin_d0) && !input(pin_d1) && !input(pin_d2) && !input(pin_d3) && !input(pin_d5))
      {
         output_high(pin_b4);
         delay_ms(50);
         output_low(pin_b4);
         delay_ms(50);
      }
   }
   
   if(input(pin_d5))
   {
      while(!input(pin_d0) && !input(pin_d1) && !input(pin_d2) && !input(pin_d3) && !input(pin_d4))
      {
         output_high(pin_b5);
         delay_ms(1500);
         output_low(pin_b5);
         delay_ms(1500);
      }
   }
}
}



Teşekkürler

ogoculu

tmr 1 interruptında  süre hesabı tmro interruptında da hangi tuşa basıldı kontrolü yaparsan delay larla uğraşmamış olursun. ana döngüde bir select case aç ve her buton için fonksiyon tanımla, butona bastıkça durumu değiştir. vaktim olsa örnek birşeyler yazardım ama sonra artık.

mierdogan

Alıntı yapılan: ogoculu - 30 Mart 2011, 05:10:41
tmr 1 interruptında  süre hesabı tmro interruptında da hangi tuşa basıldı kontrolü yaparsan delay larla uğraşmamış olursun. ana döngüde bir select case aç ve her buton için fonksiyon tanımla, butona bastıkça durumu değiştir. vaktim olsa örnek birşeyler yazardım ama sonra artık.

Yardımcı olabilirsen çok sevinirim.. benimde beklentim tam bu söylediğinizdi nasıl mutlu oldum anlatamam

Saygılar

jackal183

al kardeş bu kodlar işini görür senin hi-tech te yazdım CCSe rahat çevirirsin. gecikme sürelerini bilmiyorum timer ya da interrupt kullanmadım. şöyle yaptım anlatayım; öncelikle senin kodun niye takılıyor onu söyleyeyim, delay sürelerin uzun yani mesela 4 snlik bir delay var ki, sen başka bir butona bassan bile henüz bu 4+4=8 saniye dolmadığı için bunu algılamaz, ancak basılı tutarsan algılar. bu sorunu da şu şekilde aşabilirsin, aşağı koda yazdım burda da anlatayım. atıyorum 1. butona basınca 1. led için 4000ms istiyorsun 2. led için 3000ms istiyorsun diyelim.

bu durumda senin yazdığın koddaki her bir while döngüsünün içine ilgili süre ile alakalı bir for döngüsü koydum.

yani sen şöyle diyorsun;

led1=1;
DelayMs(4000);
led1=0;
DelayMs(4000);


peki bunu başka nasıl ifade edbiliriz, şu şekilde:
for(i=0;i<40;i++)
{
      led1=1;
      DelayMs(100);
}
for(i=0;i<40;i++)
{
      led1=0;
      DelayMs(100);
}


işte bu for döngülerinin içerisine de aşağıda yazdığım gibi if ile kontrol yapıp başka butonlara basıldıysa döngüden çıkmak için da break koydun mu iş tamamdır.
sen daha önce her 8 sn de bir diğer butonları kontrol ediyordun, şimdi ise her 100 ms de bir buton kontrolü yapmış oluyorsun, istersen bunu daha da kısaltabilirsin, for döngüleriyle oynayarak, bunu bir dene eğer bu olmazsa senin tek çaren ogoculu'nun dediğini yapabilmek. bu arada eğer kod çalışmazsa birkaç yerine birşey eklemek gerekebilir. buraya yazarsın yine. hadi kolay gelsin


#include <htc.h>
#include "delay.h"

#define BUTON0 RD0
#define BUTON1 RD1
#define BUTON2 RD2
#define BUTON3 RD3
#define BUTON4 RD4
#define BUTON5 RD5
#define LED0 RB0
#define LED1 RB1
#define LED2 RB2
#define LED3 RB3
#define LED4 RB4
#define LED5 RB5

void main (void)
{
	TRISB=0x00;PORTB=0x00;
	TRISD=0xFF;PORTD=0x00;

while(1)
{
	int i;
   
   if(BUTON0)
   {
      while(!BUTON1 && !BUTON2 && !BUTON3 && !BUTON4 && !BUTON5)
      {
    	// BUTON1=0;BUTON2=0;BUTON3=0;BUTON4=0;BUTON5=0;
         for(i=0;i<40;i++)
         {
        	 LED0=1;
        	 DelayMs(100);
        	 if(BUTON1 || BUTON2 || BUTON3 || BUTON4 || BUTON5)
        		 break;
         }
         for(i=0;i<40;i++)
         {
           	 LED0=0;
           	 DelayMs(100);
             if(BUTON1 || BUTON2 || BUTON3 || BUTON4 || BUTON5)
                 break;
          }
      }
   }
   
   if(BUTON1)
   {
      while(!BUTON0 && !BUTON2 && !BUTON3 && !BUTON4 && !BUTON5)
      {
          for(i=0;i<20;i++)
          {
         	 LED1=1;
         	 DelayMs(100);
         	 if(BUTON0 || BUTON2 || BUTON3 || BUTON4 || BUTON5)
         		 break;
          }
          for(i=0;i<20;i++)
          {
            	 LED1=0;
            	 DelayMs(100);
              if(BUTON0 || BUTON2 || BUTON3 || BUTON4 || BUTON5)
                  break;
           }    	// BUTON0=0;BUTON2=0;BUTON3=0;BUTON4=0;BUTON5=0;
      }
   }
   
   if(BUTON2)
   {
      while(!BUTON0 && !BUTON1 && !BUTON3 && !BUTON4 && !BUTON5)
      {
          for(i=0;i<10;i++)
          {
         	 LED2=1;
         	 DelayMs(133);
         	 if(BUTON0 || BUTON1 || BUTON3 || BUTON4 || BUTON5)
         		 break;
          }
          for(i=0;i<10;i++)
          {
        	  LED2=0;
        	  DelayMs(133);
              if(BUTON0 || BUTON1 || BUTON3 || BUTON4 || BUTON5)
                  break;
           } 
      }
   }
   
   if(BUTON3)
   {
      while(!BUTON0 && !BUTON1 && !BUTON2 && !BUTON4 && !BUTON5)
      {
          for(i=0;i<10;i++)
          {
         	 LED3=1;
         	 DelayMs(100);
         	 if(BUTON0 || BUTON2 || BUTON1 || BUTON4 || BUTON5)
         		 break;
          }
          for(i=0;i<10;i++)
          {
            	 LED3=0;
            	 DelayMs(100);
              if(BUTON0 || BUTON2 || BUTON1 || BUTON4 || BUTON5)
                  break;
           }
      }
   }
   
   if(BUTON4)
   {
      while(!BUTON0 && !BUTON1 && !BUTON2 && !BUTON3 && !BUTON5)
      {
   	// BUTON0=0;BUTON1=0;BUTON2=0;BUTON3=0;BUTON5=0;
         LED4=1;//output_high(pin_b4);
         DelayMs(50);
         LED4=0;//output_low(pin_b4);
         DelayMs(50);
      }
   }
   
   if(BUTON5)
   {
      while(!BUTON0 && !BUTON1 && !BUTON2 && !BUTON3 && !BUTON4)
      {
          for(i=0;i<15;i++)
          {
         	 LED5=1;
         	 DelayMs(100);
         	 if(BUTON0 || BUTON2 || BUTON3 || BUTON4 || BUTON1)
         		 break;
          }
          for(i=0;i<15;i++)
          {
            	 LED5=0;
            	 DelayMs(100);
              if(BUTON1 || BUTON2 || BUTON3 || BUTON4 || BUTON1)
                  break;
           } 
      }
   }
}
}

jackal183

bi de sana tavsiyem makrolar kullanmayı alışkanlık haline getir, ve her yazdığın kodda değişkenlere anlamlı güzel isimler ver. böyle yaparsan 1 sene önce yazdığın bir kodu bile tek bakışta hatırlayabilirsin, ayrıca kodun temiz olur anlaşılması okuması çözmesi hata bulması falan daha rahat olur