while break kullanımı hakkında yardım

Başlatan mierdogan, 25 Mart 2011, 10:40:34

mierdogan

Ustalar!

Aşağıda verdiğim kod'u çalıştırdım fakat devresini kurduğumda ilk ledin yanıp sönmesini sağlıyorum fakat bir diğer led'e geçebilmek için o anda çalışan led'in döngüsünün bitmesini bekliyorum butona basar basmaz bir diğer led' in yanıp sönmesini sağlamak için break kullandım ama sanırım çok sağlıklı olmadı ccs c compiler uyarı veriyor condition always true diye..

bu butonlara basar basmaz döngünün bitmesinin beklemeden nasıl bir dğer ledin çalışmasını sağlarım?

Yeni olduğum için kafam karışmasın diye timer yapmak gibi konulara girmedim gerekliyse açıklarsanız sevinirim


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);
         break;
      }
   }

   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);
         break;
      }
   }

   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);
         break;
      }
   }

   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);
         break;
      }
   }



Teşekkürler...

Nedenler

Şimdi dikkatle dinle dostum.

1. "Condition always true" derken senin while(1) olarak tanımladığın döngüye dikkat çekiyor. "Bu tanımlama devamlı true (1) değerini üretir yanlışın olmasın" diyor. Fakat sen bunu bir kısır döngü oluşturmak için yaptığından herhangi bir sorun teşkil etmeyecek. Derleyicilerde warning gelende uyarılar için kullanılır ve kodun derlenmesini engellemez. Eğer herhangi bir satır için error alırsan derleme işlemi sonuçlanmayacaktır.

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);
         break;
      }
   }


2. Yapmak istediğin şey herhangi bir butona basıldığında bu döngüden çıkmak. Bunu zaten while şartı içinde belirtmişsin bir de altta break kullanmışsın. Ya yine while(1) diyerek bir sonsuz döngü oluşturup if kullanarak şarta göre break uygulayacaksın ya da o break komutunu oradan kaldıracaksın.

Şöyle ki; break komutu orada olduğu sürece, şart sağlanıp while içerisine girilecek. Pin high edilip 4 sn beklendikten sonra low ile sıfıra çekilecek 4 sn daha beklenecek ve break komutunu gördüğü anda döngüden çıkacak. Yapman gereken o breaki ordan kaldırmak. Zaten butonlardan herhangi birine basıldığında while içerisindeki şart sağlanmadığı için döngüden çıkılacaktır.

3. Yukarıdaki dediklerimi yaptığında devren/programın çalışacaktır. Ancak bir de butona basıldığında direk döngüden çıkılmasını istemişsin. Yazdığın programda bu mümkün değil. Çünkü while içerisindeki şart, yine while içerisindeki kodların son satırından sonra kontrol edilir. Yani while'a girecek ledi yakacak 4 sn bekleyecek ledi söndürecek 4 sn bekleyecek ve şartı tekrar kontrol edecek. Bu arada da 8 sn geçmiş olacak. Yani sen 8 saniyede bir kontrol yapmış olacaksın. İstiyorsunki butona basıldığında hemen döngüden çıksın. İşte buna interrupt (kesme) derler dostum. Bunun için interrupt kullanmalısın.

4. Eğer şöyle yaparsan; Ben toggle (yak/söndür) yapmayayım hangi butona basıldıysa ona karşılık gelen led başka bir butona basılana kadar devamlı yansın dersen o zaman bir iş kolay.

mierdogan

Üstadım yapmak istediğim şey için çok defalar yazılımı değiştirdim konu üzerinde yeni olduğum için içinden çıkmaıyorum beni anlıyorsunuzdur...

Gelen cevaplarda RTOS ile kodlama yapıp böyle çalışır diyende var ama RTOS bana çook uzak konu şimdilik...


Yapmak istediğim şey ise;

bir butona basınca karşılığı olan led sürekli döngü içerisinde yanıp sönsün..

başka butona basınca karşılığı olan lede hemen geçsin istiyorum...

Problem burda başlıyor bir led'in döngüsü bitene kadar başka butona bassamda başka bir led yanmıyor yani hemen geçiş yapılamıyor bir türlüde aşamıyorum... Kesme denedim sağdan soldan aldığım yardımlarla olmadı kullanamadım...

Bahsi geçen kolay yöntemi ufkumu açabilmem için bir örnekle benimle paylaşırsanız çook mutlu olacağım


Saygılar

Erol YILMAZ

bu tarz basit şeyleri düşünerek ve C nin de yeteneklerini kullanarak çözebilmek lazım,
Yoksa bir adım ileri gidemeyiz :)

Klein

Bu tip işlerde programı durdurmamak en doğru yaklaşımdır. mümkünse hiç delay kullanılmamalı ve döngüye girilmemelidir. şöyle bir kod bunu nasıl yapacağın konusunda fikir verebilir.
Bu sistemde rogram hiç bir yerde bekleme yapmadığı için , hiç bir olayı kaçırmazsın.

unsigned char function=0;
unsigned int  delay_constant=4000;
unsigned int delay = 0;
void main(void){
while(1){

    if(input(pin_d0))  delay_constant=4000;
    if(input(pin_d1))  delay_constant=2000;
    if(input(pin_d2))  delay_constant=1330;
    if(input(pin_d3))  delay_constant=1000;
//******************************************************************************************    
    if(delay) delay--;
// delay değişkeni  time kesmesi içerisinde sabit bir zamanda azaltılırsa  kararlı bir zamanlama elde edilir. 
// eğer şimdiki gibi ana döngüde yapılırsa zamanlama için delay_constant değerleriyle biraz oynamak gerekebilir. 
//*********************************************************************************************  
   switch(function){
         case 0: 
                      output_high(pin_b0);
                       if(delay==0) { delay=delay_constant; function=1;}
                      break;
         case 1: 
                      output_low(pin_b0);
                       if(delay==0) { delay=delay_constant; function=0;}
                      break;
   }         

          
   }
}
}

mierdogan

Alıntı yapılan: Klein - 26 Mart 2011, 21:34:40
Bu tip işlerde programı durdurmamak en doğru yaklaşımdır. mümkünse hiç delay kullanılmamalı ve döngüye girilmemelidir. şöyle bir kod bunu nasıl yapacağın konusunda fikir verebilir.
Bu sistemde rogram hiç bir yerde bekleme yapmadığı için , hiç bir olayı kaçırmazsın.

unsigned char function=0;
unsigned int  delay_constant=4000;
unsigned int delay = 0;
void main(void){
while(1){

    if(input(pin_d0))  delay_constant=4000;
    if(input(pin_d1))  delay_constant=2000;
    if(input(pin_d2))  delay_constant=1330;
    if(input(pin_d3))  delay_constant=1000;
//******************************************************************************************    
    if(delay) delay--;
// delay değişkeni  time kesmesi içerisinde sabit bir zamanda azaltılırsa  kararlı bir zamanlama elde edilir. 
// eğer şimdiki gibi ana döngüde yapılırsa zamanlama için delay_constant değerleriyle biraz oynamak gerekebilir. 
//*********************************************************************************************  
   switch(function){
         case 0: 
                      output_high(pin_b0);
                       if(delay==0) { delay=delay_constant; function=1;}
                      break;
         case 1: 
                      output_low(pin_b0);
                       if(delay==0) { delay=delay_constant; function=0;}
                      break;
   }         

          
   }
}
}


Hocam çok teşekkür ediyorum konuyu biraz irdeleyeyim....

stlg

#6
 Eger kesme ile yapamıyorum diyorsan su sekilde yapabilirsin ,yazmıs oldugun kod icerisindeki delay bolumlerini kaldır, onların yerine for dongusu kur ,gecikme bolumunu cok kısa tut mesela 100ms ve her for dongusunde buton kontrolu yap, butonlara basılmıssa break ile for dongusunden cık ,boylece 4 sn de bir buton kontrolu değilde 100ms de bir buton kontrolu yapmıs olursun tabi butona basılmamıssa for dongusu 4 sn lik bolumu tamamlayabilsin
ALLAHA EMANET OLUNUZ Hoştur bana senden gelen,  Ya gonca gül yahut diken,  Ya kaftandır yahut kefen,  Kereminde hoş lütfunda hoş.

mierdogan

Alıntı yapılan: Klein - 26 Mart 2011, 21:34:40
Bu tip işlerde programı durdurmamak en doğru yaklaşımdır. mümkünse hiç delay kullanılmamalı ve döngüye girilmemelidir. şöyle bir kod bunu nasıl yapacağın konusunda fikir verebilir.
Bu sistemde rogram hiç bir yerde bekleme yapmadığı için , hiç bir olayı kaçırmazsın.

unsigned char function=0;
unsigned int  delay_constant=4000;
unsigned int delay = 0;
void main(void){
while(1){

    if(input(pin_d0))  delay_constant=4000;
    if(input(pin_d1))  delay_constant=2000;
    if(input(pin_d2))  delay_constant=1330;
    if(input(pin_d3))  delay_constant=1000;
//******************************************************************************************    
    if(delay) delay--;
// delay değişkeni  time kesmesi içerisinde sabit bir zamanda azaltılırsa  kararlı bir zamanlama elde edilir. 
// eğer şimdiki gibi ana döngüde yapılırsa zamanlama için delay_constant değerleriyle biraz oynamak gerekebilir. 
//*********************************************************************************************  
   switch(function){
         case 0: 
                      output_high(pin_b0);
                       if(delay==0) { delay=delay_constant; function=1;}
                      break;
         case 1: 
                      output_low(pin_b0);
                       if(delay==0) { delay=delay_constant; function=0;}
                      break;
   }         

          
   }
}
}


ÜStadı kodu aşağıdaki düzenledim biraz amatör iş oluyor ama :)  ISIS de istediğim gibi çalışıyor fakat işi gerçeğe dökünce ledler banamısın demiyorlar... Birde anlamdığım timer kesmesi kullanırken 65536 danmı saydırıyoruz? birde her buton için ayrı timer kesme fonksiyonumu düzenlemek lazım?

Rica etsem bakabilirmisiniz?

#include   <16F877A.h>

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

#use   delay(CLOCK=4000000)

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

#define   butbir   pin_d0
#define   butiki   pin_d1
#define   butuc    pin_d2
#define   butdort  pin_d3
#define   butbes   pin_d4
#define   butalti   pin_d5

#define   cikis   pin_b0





unsigned char function=0;
unsigned int  delay_constant=61536;
unsigned int delay = 0;


void main(void){



   set_tris_b(0x00);
   set_tris_d(0xFF);

   output_b(0x00);

while(1){

    if(input(butbir))    delay_constant=2026;
    if(input(butiki))    delay_constant=2027;
    if(input(butuc))     delay_constant=2028;
    if(input(butdort))   delay_constant=2029;
    if(input(butbes))    delay_constant=2030;
    if(input(butbes))    delay_constant=2031;
//******************************************************************************************
    if(delay) delay--;
// delay değişkeni  time kesmesi içerisinde sabit bir zamanda azaltılırsa  kararlı bir zamanlama elde edilir.
// eğer şimdiki gibi ana döngüde yapılırsa zamanlama için delay_constant değerleriyle biraz oynamak gerekebilir.
//*********************************************************************************************
   switch(function){
         case 0:
                      output_high(cikis);
                       if(delay==0) { delay=delay_constant; function=1;}
                      break;
         case 1:
                      output_low(cikis);
                       if(delay==0) { delay=delay_constant; function=0;}
                      break;
   }         

          
   }
}


Saygılar...

Klein

Bu projede timer kesmesini delay değişkenini azaltmak için kullanacaksın.
Timer zamanını 1 milisaniyeye ayarlarsın.  if(delay) delay--  kodunu timer kesmesi içinde işletirsin. Timer kesmesi 1 milisaniyede  bir işletileceği için delay değeri de 1 milisaniyede bir azalır.   delay_constant değerine 1000 verirsen  ledlerin 1 saniyede bir yanıp söner. 500 verirsen 500 milisaniyede bir yanıp söner.

programda butona basınca delay_constant değişkenine verdiğin değerler birbirine çok yakın.  loop zamanının birkaç mikrosaniye olduğunu düşünürsek  2026 ile 2027 arasındaki farkı gözle ayırt edemezsin.   
Eğer timer kesmesi kullanamıyorsan, burada izlemen gereken yol şu:

1. butona bastığımızda ledin 1 saniye yanık 1 saniye sönük kalmasını sağla. Bunu delay_constant değişkenine verdiğin değeri değiştirerek deneyebilirsin.  Örneğin 1 saniye için delay_constant değerini  53768 buldun.  bu değer senin temel değerin olacak.  bu değerdeki her 53.768 değişim  led süresinde  yaklaşık 1 milisaniye fark yaratır.  Diyelim ki  diğer led 700 milisaniyede yanıp sönecek. bu durumda o butona basınca delay_constant değişkenine atayacağın değer  53.768*700 = 37637.6 yani 37638 olmalıdır.

mierdogan

Alıntı yapılan: Klein - 28 Mart 2011, 16:06:36
Bu projede timer kesmesini delay değişkenini azaltmak için kullanacaksın.
Timer zamanını 1 milisaniyeye ayarlarsın.  if(delay) delay--  kodunu timer kesmesi içinde işletirsin. Timer kesmesi 1 milisaniyede  bir işletileceği için delay değeri de 1 milisaniyede bir azalır.   delay_constant değerine 1000 verirsen  ledlerin 1 saniyede bir yanıp söner. 500 verirsen 500 milisaniyede bir yanıp söner.

programda butona basınca delay_constant değişkenine verdiğin değerler birbirine çok yakın.  loop zamanının birkaç mikrosaniye olduğunu düşünürsek  2026 ile 2027 arasındaki farkı gözle ayırt edemezsin.   
Eğer timer kesmesi kullanamıyorsan, burada izlemen gereken yol şu:

1. butona bastığımızda ledin 1 saniye yanık 1 saniye sönük kalmasını sağla. Bunu delay_constant değişkenine verdiğin değeri değiştirerek deneyebilirsin.  Örneğin 1 saniye için delay_constant değerini  53768 buldun.  bu değer senin temel değerin olacak.  bu değerdeki her 53.768 değişim  led süresinde  yaklaşık 1 milisaniye fark yaratır.  Diyelim ki  diğer led 700 milisaniyede yanıp sönecek. bu durumda o butona basınca delay_constant değişkenine atayacağın değer  53.768*700 = 37637.6 yani 37638 olmalıdır.

Hocam her şey iyi hoşta isis te çalışmasına rağmen bread board üzerinde led sadece yanıyor :)

mufitsozen

Alıntı yapılan: mierdogan - 28 Mart 2011, 18:43:37
Alıntı yapılan: Klein - 28 Mart 2011, 16:06:36
Bu projede timer kesmesini delay değişkenini azaltmak için kullanacaksın.
Timer zamanını 1 milisaniyeye ayarlarsın.  if(delay) delay--  kodunu timer kesmesi içinde işletirsin. Timer kesmesi 1 milisaniyede  bir işletileceği için delay değeri de 1 milisaniyede bir azalır.   delay_constant değerine 1000 verirsen  ledlerin 1 saniyede bir yanıp söner. 500 verirsen 500 milisaniyede bir yanıp söner.

programda butona basınca delay_constant değişkenine verdiğin değerler birbirine çok yakın.  loop zamanının birkaç mikrosaniye olduğunu düşünürsek  2026 ile 2027 arasındaki farkı gözle ayırt edemezsin.   
Eğer timer kesmesi kullanamıyorsan, burada izlemen gereken yol şu:

1. butona bastığımızda ledin 1 saniye yanık 1 saniye sönük kalmasını sağla. Bunu delay_constant değişkenine verdiğin değeri değiştirerek deneyebilirsin.  Örneğin 1 saniye için delay_constant değerini  53768 buldun.  bu değer senin temel değerin olacak.  bu değerdeki her 53.768 değişim  led süresinde  yaklaşık 1 milisaniye fark yaratır.  Diyelim ki  diğer led 700 milisaniyede yanıp sönecek. bu durumda o butona basınca delay_constant değişkenine atayacağın değer  53.768*700 = 37637.6 yani 37638 olmalıdır.

Hocam her şey iyi hoşta isis te çalışmasına rağmen bread board üzerinde led sadece yanıyor :)

demekki isideki devrenin aynisini breadboard'a kuramamissin.

Yani sana verilen tavsiyede yanlislik yok, senin o tavsiyeyi uygulamanda yanlislik var.

Devre calismayinca hatanin %100'u senin, ama hocam filan bos laf, otur devreyi kontrol et, teker teker butun baglantilari kontrol et, ondan sonra yazdigin kodu kontrol et vs. ve hatani bul buna debugging deniyor. her muhendisin bilmesi lazim.
Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.

mierdogan

Alıntı yapılan: mufitsozen - 28 Mart 2011, 19:03:05
Alıntı yapılan: mierdogan - 28 Mart 2011, 18:43:37
Alıntı yapılan: Klein - 28 Mart 2011, 16:06:36
Bu projede timer kesmesini delay değişkenini azaltmak için kullanacaksın.
Timer zamanını 1 milisaniyeye ayarlarsın.  if(delay) delay--  kodunu timer kesmesi içinde işletirsin. Timer kesmesi 1 milisaniyede  bir işletileceği için delay değeri de 1 milisaniyede bir azalır.   delay_constant değerine 1000 verirsen  ledlerin 1 saniyede bir yanıp söner. 500 verirsen 500 milisaniyede bir yanıp söner.

programda butona basınca delay_constant değişkenine verdiğin değerler birbirine çok yakın.  loop zamanının birkaç mikrosaniye olduğunu düşünürsek  2026 ile 2027 arasındaki farkı gözle ayırt edemezsin.   
Eğer timer kesmesi kullanamıyorsan, burada izlemen gereken yol şu:

1. butona bastığımızda ledin 1 saniye yanık 1 saniye sönük kalmasını sağla. Bunu delay_constant değişkenine verdiğin değeri değiştirerek deneyebilirsin.  Örneğin 1 saniye için delay_constant değerini  53768 buldun.  bu değer senin temel değerin olacak.  bu değerdeki her 53.768 değişim  led süresinde  yaklaşık 1 milisaniye fark yaratır.  Diyelim ki  diğer led 700 milisaniyede yanıp sönecek. bu durumda o butona basınca delay_constant değişkenine atayacağın değer  53.768*700 = 37637.6 yani 37638 olmalıdır.

Hocam her şey iyi hoşta isis te çalışmasına rağmen bread board üzerinde led sadece yanıyor :)

demekki isideki devrenin aynisini breadboard'a kuramamissin.

Yani sana verilen tavsiyede yanlislik yok, senin o tavsiyeyi uygulamanda yanlislik var.

Devre calismayinca hatanin %100'u senin, ama hocam filan bos laf, otur devreyi kontrol et, teker teker butun baglantilari kontrol et, ondan sonra yazdigin kodu kontrol et vs. ve hatani bul buna debugging deniyor. her muhendisin bilmesi lazim.

@mufitozen

Haklı olabilirsiniz... tekrar gözden geçireceğim fakat dediğiniz işlemi yaptım yanlız XT'yi sökünce led saniyede 3 defa yanıp sönüyor bunu 30 saniye boyuncca tekrarlıyor ve sonra duruyor kondansatörleri sökünce led 3 er saniye aralıklarla çok az parlayacak şekilde yanıp sönüyor XT'yi değiştirdim durum aynı birde ewde oturup deneyeyim

Not: Brad board üzerinde iki pic çalıştırıyorum iki adet farklı 7805 kullandım tek güç kaynağından.. iki adet pic olması farklılık yaratırmı?

mierdogan

Alıntı yapılan: mierdogan - 28 Mart 2011, 19:07:36
Alıntı yapılan: mufitsozen - 28 Mart 2011, 19:03:05
Alıntı yapılan: mierdogan - 28 Mart 2011, 18:43:37
Alıntı yapılan: Klein - 28 Mart 2011, 16:06:36
Bu projede timer kesmesini delay değişkenini azaltmak için kullanacaksın.
Timer zamanını 1 milisaniyeye ayarlarsın.  if(delay) delay--  kodunu timer kesmesi içinde işletirsin. Timer kesmesi 1 milisaniyede  bir işletileceği için delay değeri de 1 milisaniyede bir azalır.   delay_constant değerine 1000 verirsen  ledlerin 1 saniyede bir yanıp söner. 500 verirsen 500 milisaniyede bir yanıp söner.

programda butona basınca delay_constant değişkenine verdiğin değerler birbirine çok yakın.  loop zamanının birkaç mikrosaniye olduğunu düşünürsek  2026 ile 2027 arasındaki farkı gözle ayırt edemezsin.   
Eğer timer kesmesi kullanamıyorsan, burada izlemen gereken yol şu:

1. butona bastığımızda ledin 1 saniye yanık 1 saniye sönük kalmasını sağla. Bunu delay_constant değişkenine verdiğin değeri değiştirerek deneyebilirsin.  Örneğin 1 saniye için delay_constant değerini  53768 buldun.  bu değer senin temel değerin olacak.  bu değerdeki her 53.768 değişim  led süresinde  yaklaşık 1 milisaniye fark yaratır.  Diyelim ki  diğer led 700 milisaniyede yanıp sönecek. bu durumda o butona basınca delay_constant değişkenine atayacağın değer  53.768*700 = 37637.6 yani 37638 olmalıdır.

Hocam her şey iyi hoşta isis te çalışmasına rağmen bread board üzerinde led sadece yanıyor :)

demekki isideki devrenin aynisini breadboard'a kuramamissin.

Yani sana verilen tavsiyede yanlislik yok, senin o tavsiyeyi uygulamanda yanlislik var.

Devre calismayinca hatanin %100'u senin, ama hocam filan bos laf, otur devreyi kontrol et, teker teker butun baglantilari kontrol et, ondan sonra yazdigin kodu kontrol et vs. ve hatani bul buna debugging deniyor. her muhendisin bilmesi lazim.

@mufitozen

Haklı olabilirsiniz... tekrar gözden geçireceğim fakat dediğiniz işlemi yaptım yanlız XT'yi sökünce led saniyede 3 defa yanıp sönüyor bunu 30 saniye boyuncca tekrarlıyor ve sonra duruyor kondansatörleri sökünce led 3 er saniye aralıklarla çok az parlayacak şekilde yanıp sönüyor XT'yi değiştirdim durum aynı birde ewde oturup deneyeyim

Not: Brad board üzerinde iki pic çalıştırıyorum iki adet farklı 7805 kullandım tek güç kaynağından.. iki adet pic olması farklılık yaratırmı?

Merhaba

Çok kereler hata yapıp yapmadığımın kontrolünü yaptım fakat kod aşağıda verildiği şekilde ISIS üzerinde çalışıyor fakat gerçekte board üzerinde çalışmıyor...


Neden olabilir?


#include   <16F877A.h>

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

#use   delay(CLOCK=4000000)

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

#define   butbir   pin_d0
#define   butiki   pin_d1
#define   butuc    pin_d2
#define   butdort  pin_d3
#define   butbes   pin_d4
#define   butalti   pin_d5

#define   cikis   pin_b0





unsigned char function=0;
unsigned int  delay_constant=4000;
unsigned int delay = 0;


void main(void){



   set_tris_b(0x00);
   set_tris_d(0xFF);

   output_b(0x00);

while(1){

    if(input(butbir))    delay_constant=4000;
    if(input(butiki))    delay_constant=2000;
    if(input(butuc))     delay_constant=1000;
    if(input(butdort))   delay_constant=500;
    if(input(butbes))    delay_constant=16000;
    if(input(butalti))   delay_constant=40000;
//******************************************************************************************
    if(delay) delay--;
// delay değişkeni  time kesmesi içerisinde sabit bir zamanda azaltılırsa  kararlı bir zamanlama elde edilir.
// eğer şimdiki gibi ana döngüde yapılırsa zamanlama için delay_constant değerleriyle biraz oynamak gerekebilir.
//*********************************************************************************************
   switch(function){
         case 0:
                      output_high(cikis);
                       if(delay==0) { delay=delay_constant; function=1;}
                      break;
         case 1:
                      output_low(cikis);
                       if(delay==0) { delay=delay_constant; function=0;}
                      break;
   }         

          
   }
}



Saygılar