Kesme içerisinde delay kullanma sanatı.

Başlatan mechanicalengine, 29 Nisan 2014, 23:36:49

mechanicalengine

Arkadaşlar merhaba;

Kesme içerisinde delay kullandığım zaman çalışıyor fakat ileriki uygulamalarda bazen uygun şekilde çalışmayabiliyor. Delay kullanmadan yapmak istiyorum nasıl yapabilirim? Aşağıdaki gibi kullandığımda çalışıyor.

int i=1;
#int_ext
   void kesme(void)
   {
   if ((i==4))
         {
         disable_interrupts(INT_EXT);
         disable_interrupts(GLOBAL);
         output_low(pin_b1);
         output_low(pin_b2);
         output_high(pin_b3);
         }
   
   else  { 
         output_low(pin_b2);
         output_high(pin_b1);
         delay_ms(5000); [b] //DELAY KOMUTU[/b]
         output_low(pin_b1);
         output_high(pin_b2);}i++;
         }


fakat aşağıdaki gibi kullandığımda çalışmıyor.

int1 bekle=true;
int i=1;
#int_ext
   void kesme(void)
   {
   if ((i==4))
         {
         disable_interrupts(INT_EXT);
         disable_interrupts(GLOBAL);
         output_low(pin_b1);
         output_low(pin_b2);
         output_high(pin_b3);
         }
   
   else  { 
         output_low(pin_b2);
         output_high(pin_b1);
         bekle==true;
         output_low(pin_b1);
         output_high(pin_b2);}i++;
         }
void main()
{
while(1)
   if (bekle==true)
   {
      delay_ms(5000);
      bekle==false;
   }
}


Önerileriniz ve yardımlarınız için şimdiden teşekkürler.

tekosis

kesmenin oluştuğunu anlamanız adında kesme rutini içinde bir kayıtçıya "1" değeri yüklersiniz, bu kayıtçıyı da ana program içinde kontrol edersiniz. eğer "1" ise kesme oluşmuş demektir, yapmak istediğiniz işlemi yapar, bu değeri de tekrar "0" yaparsınız. bu sayede başka bir kesmeyi yine kontrol edersiniz.

#int_ext
 void kesme()
{
kesme_durumu=1;
}

main()
{
 if(kesme_durumu==1)
{
.........
........}
}
İlim ilim bilmektir, ilim kendin bilmektir, sen kendin bilmezsin, bu nice okumaktır.

z

Bana e^st de diyebilirsiniz.   www.cncdesigner.com

xcyqp09k2

#3
c ile çok fazla bilgiye sahip değilim ama bekle diye tanımladığın şey e değer atadın mı ? ben göremiyorum. neyi bekliyicek program. yokki bir değer. protonda şöyle yapılabilir sanırım.

dim bekle as word
bekle=''delayms 500''

high porta.0
bekle
low porta.0
bekle

aşağıda kullandığın while if li şartı bir de benim tanımladığım gibi yap istersen çalışır heralde öyle . başta bi tanımlama yap

mechanicalengine

@z hocam; sizin belirttiğiniz gibi yapıyorum. Fakat bir yerde hata yapıyorum, tanımladığım değişken içerisindeki delayi kesme içerisinde çalıştıramıyorum. State değişkenini tam olarak nerede ne şekilde tanımladığınızı da açıklayabilir misiniz?
Ben değişkeni en altta da görüldüğü üzere aşağıdaki gibi tanımlamıştım.

   
void main() 
{ 
while(1)   
 if (bekle==true)  
  { delay_ms(5000);      
     bekle==false;   
 } 
}


Teşekkürler.

SpeedyX

5sn içinde bir daha kesme gelmeyecekse aşağıdaki gibi çalışır.
Sen beklemeden sonra işlettiğin kodları kesme içinde true dan sonra hemen işletiyorsun, oysa beklemeden sonra olmalılar.
bekle başta false olmalı ve == kullanımı hata verir.
i değişkeni sürekli arttırılıyor, onun akıbeti ne olacak? limit yok mu?

int1 bekle=false;
int i=1;
#int_ext
void kesme(void)
{
  if((i==4))
  {
    disable_interrupts(INT_EXT);
    disable_interrupts(GLOBAL);
    output_low(pin_b1);
    output_low(pin_b2);
    output_high(pin_b3);
  }
  else  
  { 
    output_low(pin_b2);
    output_high(pin_b1);
    bekle=true;
  }
  i++;
}

void main()
{
  while(1)
  {
    if (bekle==true)
    {
      delay_ms(5000);
      bekle=false;
      output_low(pin_b1);
      output_high(pin_b2);
    }
  }
}

z

Bekleme işlerini timer'a bırakmak gerekiyor. Ana program mevcut haliyle kısa. Bu kod hiç mi gelişip büyümeyecek. Büyüdükçe interrupt programı ile ana programın bir biri ile iletişiminde gecikmelerden dolayı kopukluklar olacak.


#int_ext
   void kesme(void)
   {
   if ((i==4))
         {
         disable_interrupts(INT_EXT);
         disable_interrupts(GLOBAL);
         output_low(pin_b1);
         output_low(pin_b2);
         output_high(pin_b3);
         }
   
   else  {
         output_low(pin_b2);
         output_high(pin_b1);
         Enable_And_Start_Timer();
         }
}


void Timer_int_rutini()
{
         output_low(pin_b1);
         output_high(pin_b2);}i++;
         Disable_AND_Stop_Timer();
}
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

mechanicalengine

@Z hocam. Acemiliğimi bağışlayın fakat anlayamadığım nokta Enable_And_start_timer(); dediğim zaman delay_ms(5000); komtunu nerede ne şekilde tanımlamam gerektiği. Bir önceki örneğe baktığım zaman int1 değişkeni ile bunu görebiliyorum fakat sizin örneğinizde değişken tipini ve açıklamasını anlamakta zorlanıyorum.

Açıklamanız için şimdiden teşekkürler.

z

Enable_And_start_timer();

Bu bir fonksiyon.

Bu fonksiyon içinde timerın 5 sn sonra taşmasını sağlayacak yapılandırma işlemini ve timerı start etme işlemini yazacaksın.

Eğer kullandığın işlemci için bu kadar uzun yapılandırma yapılamıyorsa o zaman atıyorum 100mili saniyede taşma yapacak şekilde yapılandırma yaparsın.

Bu kez Timer interrupt rutinin aşağıdakine benzer şekilde yazarsın.

void Timer_int_rutini()
{
         T++;
         if (T>=50)
          {
             output_low(pin_b1);
             output_high(pin_b2);}i++;
             Disable_AND_Stop_Timer();
          }
}

Tam olarak kod istiyorsan CCS bilmediğim için yardımcı olamam. Bu işin prensibini açıkladım.

Bu şekilde yazarsan Ana programda bu konuya kafa yorman gerekmez hatta gidip bir yerde sonsuz döngüye bile girebilirsin. Bu sayede interrupt rutininin ana programca desteklenmesine ihtiyaç kalmaz ve  istediğin tıkır tıkır yerine getirilir.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

mechanicalengine

@SpeedyX,  i değişkenini program içerisinde sıfırlıyorum. Fakat aslında en fazla 4'e kadar saymasını istiyorum. Bu  durumda nasıl yazmam gerektiği konusunda bir tavsiyeniz olabilir mi? Yapmak istediğim aslında  for(i=0;i<=4;i++)koşulunda yaptığımız gibi 4'e kadar saymasını sağlamak  fakat nasıl yazılacağını kurgulayamadığım için i değişkenini sıfırladım.