İKİ LEDİ AYNI ANDA FARKLI ZAMANLARDA YAKMA

Başlatan klorofil, 18 Mart 2016, 11:53:09

klorofil

Arkadaşlar merhaba,

iki adet ledi aynı anda farklı zamanlarda yakmak istiyorum fakat bir türlü beceremdim.ikinci led yanmak için birinci ledin yanmasını bekliyor.Benim istdiğim birinci led 5 saniye aralıklarla yanaken diğeri 1 saniye aralıklarla yanması.Bunun için alt program kullanmayı ve cağırmayı denedim yine sonuç aynı.yardımcı olursanız sevinirim.

#include <çalışma.h>


#define led1 pin_b0
#define led2 pin_b1
//!#define buton1 pin_a0
//!#define buton2 pin_a1








void main()
{
set_tris_b(0x00);
output_b(0x00);
set_tris_a(0xff);
output_a(0x00);



while(TRUE)
{

 
{
output_high(led1);
delay_ms(5000);
output_low(led1);
delay_ms(5000);
}

   
   
{   
output_high(led2);
delay_ms(500);
output_low(led2);
delay_ms(500);
}




}
}

vitruvius

Sonuç tabiki aynı olur çünkü program yukardan aşağı satır satır işliyor. Sizin yapmanız gereken sayaç kullanmak. Bir sayaç tanımlayın ve her saniyede bunun değerini bir arttırın. Sonra bu sayacın değerine bakıp gerekli işlemleri yaptırın. Bu sayaç işini timer kesmesi ile yaparsanız daha şık olur. Aksi halde ana döngüde yine bir saniyelik gereksiz oyalanmanız olacaktır.

int cnt1 = 0;
   int cnt2 = 0;
      
   while(1)
   {
      delay_ms(1000);
      cnt1++;
      cnt2++;
      
      if(cnt1)
      {
         output_toggle(led1);
         cnt1 = 0;
      }
      
      if(cnt2 == 5)
      {
         output_toggle(led2);
         cnt2 = 0;
      }
   }

klorofil

çok teşekkür ediyorum.evet programın yukarıdan aşağıya satır satır işlediğini biliyorum.Benim eksiğim kesmelerle.kesme algoritmaının kuramıyorum.Programlamayı kendi çabalarımla öğreniyorum.eğitim falan almadım  yüzden bazı şeyler ezbere oluyor.

dursuncemal

#define led1 pin_b0
#define led2 pin_b1

int8 led2_buf = 4;
      
   while(1)
   {
      delay_ms(1000);

      led1 = !led1;
      
      if(led2_buf){led2_buf --;}else{led2_buf = 5; led2 = !led2;}

   }
yapmak istedigin sadece bu ise interrup kullanmana gerek yok
:=

klorofil

ilginize çok teşekkür ediyorum.yapmak istediğim eğer bu iki ledi bu şekilde kesme ile yakmaksa onu öğrenmek,fonksiyon ile yazmaksa onu öğrenmek.Yani neyi neden yaptığımı görmek istiyorum.
amacım yanlış yapa yapa pratik kazanmak.ama o yanlışı yapmak için bir yol göstermenizi istedim sadece.İlginize tekrar çok teşkkür ediyorum.

dursuncemal

#include <main.h>

#define led1 pin_b0
#define led2 pin_b1
//!#define buton1 pin_a0
//!#define buton2 pin_a1


unsigned int8 salise,led2_buf;




#INT_RTCC
void  RTCC_isr(void) 
{

if(salise){salise--;}else{salise = 250;
                         
                         led1 = !led1;
                         
                         if(led2_buf){led2_buf --;}else{led2_buf = 5; led2 = !led2;}

                         }// if sorgusunda > eger salise degiskeninin iceriginde 0 harici bir deger var ise bir bir azaltilir.toplam salise sifir oldugunda 250 * 4 = 1000;ms yani 1 saniye eder.

}//her 4 ms yede programin bu interruptun(kesmenin) faliyet alanina gelir.

void main()
{
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_16|RTCC_8_bit);      //4,0 ms overflow

   set_tris_b(0x00);
   output_b(0x00);
   set_tris_a(0xff);
   output_a(0x00);

   enable_interrupts(INT_RTCC);
   enable_interrupts(GLOBAL);
   
   led2_buf = 5;
   salise = 250;

   while(TRUE)
   {

;;
    
   }

}
interrupt kullanarak yapsanda kod yazacaksin.herhangi bir timeri kulanarak daha uzun interrup sureside elde edebilirsin ana ben 4 ms yelik bir interrupta 1 saniye elde ederek bir ornek vermeye calisayim.burada led 1 icinde bir degisken tanimlayip onunda yanma sonme zamanlarini istedigin gibi ayarlayabilirsin.hatta buton ekleyip disardan kendinde degistirebilirsin.parantez ve noktalama hatalarim olabilir mantik anlasilsin diye yazdim umarim yardimci olabilmisimdir.
:=

RaMu

Düz mantıkla:

#include <çalışma.h>

#define birim_sure  500

#define led1 pin_b0
#define led2 pin_b1
//!#define buton1 pin_a0
//!#define buton2 pin_a1

void main()
{
set_tris_b(0x00);
output_b(0x00);
set_tris_a(0xff);
output_a(0x00);



while(TRUE)
  {
 
   output_high(led1);
     output_high(led2);  
     delay_ms(birim_sure);
     output_low(led2);
     delay_ms(birim_sure);      //led1 1 saniyedir yanıyor, led2 1 defa yandı söndü

     output_high(led2);  
     delay_ms(birim_sure);
     output_low(led2);
     delay_ms(birim_sure);      //led1 2 saniyedir yanıyor, led2 2 defa yandı söndü

     output_high(led2);  
     delay_ms(birim_sure);
     output_low(led2);
     delay_ms(birim_sure);      //led1 3 saniyedir yanıyor, led2 3 defa yandı söndü

     output_high(led2);  
     delay_ms(birim_sure);
     output_low(led2);
     delay_ms(birim_sure);      //led1 4 saniyedir yanıyor, led2 4 defa yandı söndü

     output_high(led2);  
     delay_ms(birim_sure);
     output_low(led2);
     delay_ms(birim_sure);      //led1 5 saniyedir yanıyor, led2 5 defa yandı söndü


   output_low(led1);                                 //led1 artık sönük
     output_high(led2);  
     delay_ms(birim_sure);
     output_low(led2);
     delay_ms(birim_sure);      //led1 1 saniyedir sönük, led2 6 defa yandı söndü

     output_high(led2);  
     delay_ms(birim_sure);
     output_low(led2);
     delay_ms(birim_sure);      //led1 2 saniyedir sönük, led2 7 defa yandı söndü

     output_high(led2);  
     delay_ms(birim_sure);
     output_low(led2);
     delay_ms(birim_sure);      //led1 3 saniyedir  sönük, led2 8 defa yandı söndü

     output_high(led2);  
     delay_ms(birim_sure);
     output_low(led2);
     delay_ms(birim_sure);      //led1 4 saniyedir sönük, led2 9 defa yandı söndü

     output_high(led2);  
     delay_ms(birim_sure);
     output_low(led2);
     delay_ms(birim_sure);      //led1 5 saniyedir  sönük, led2 10 defa yandı söndü


   }//while true son

   
}//void main son


Veya yukarıdaki gibi amele stili yazmayıp :)

output_low(led_1);
output_low(led_2);
  while(true)
{
output_toggle(led_2);

for(i=0;i<=10;i++)
  {
  output_toogle(led_1);
  delay_ms(500);

  }




Birçok alternatif şekilde yazılabilir.
Şu ana kadar en güzeli @dursuncemal in kesmeli olan örneği.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

ByTEK

kesme ile belli sürelerde bağımsızmış gibi ledlerin yakıp söndürülmesi işleminin teknik anlamda bir adı var mı ?

Gerçek Zamanlı ?
Çok kullanıcılı ve Tek Kullanıcılı ?
Çoklu Görev ve Tek Görev ?
Dağıtılmış ?
Gömülü ?
RTC ?

gibi gibi..


dursuncemal

:=