Kesmenin Çalışmaması ve uyarı

Başlatan mokan, 25 Mayıs 2011, 17:54:55

mokan

Merhaba arkadaşlar,
Yaptığım programda; rb,ext,timer1(internal),timer0(external) kesmelerini kullanıyorum.Ancak yaptığım programda rb kesme uçlarına bağlı switch'lere bastığım zaman, switch'leri görmezden geliyor.Kesme almıyor.Kesme önceliğim şu şekilde;
#priority rb,timer0,timer1,ext

Ve anladığım kadarı ile programda hiçbir kesmeyi görmüyor.Şöyle de  uyarılar veriyor,

>>> Warning 216 "yeni_yanakayar2.c" Line 791(0,1): Interrupts disabled during call to prevent re-entrancy:  (@delay_ms1)
>>> Warning 216 "yeni_yanakayar2.c" Line 791(0,1): Interrupts disabled during call to prevent re-entrancy:  (ac)
>>> Warning 216 "yeni_yanakayar2.c" Line 791(0,1): Interrupts disabled during call to prevent re-entrancy:  (kapat)
>>> Warning 216 "yeni_yanakayar2.c" Line 791(0,1): Interrupts disabled during call to prevent re-entrancy:  (@MUL1616)

Burada "ac", "kapat" kendi yazdığım fonksiyonlar.Bu fonksiyonlar içinde durdurulan timer1 aktif ediliyor.
"@MUL1616" bu ifade ne demek?
Kesmelerin olmamasının bu uyarılarla ilgisi nedir?

JKramer

Hem kesmede hem de ana programda aynı fonksiyonları kullandığınız için kesmeler kapatılmış. Ya yazdığınız fonksiyonları inline yapın ya fonkisyonların içeriğini doğrudan kesme içine kopyalayın ya da fonksiyon içeriğini yeni bir fonksiyon içine kopayalayın, ac2(), kapa2() gibi:

http://www.ccsinfo.com/faq.php?page=interrupts_disabled

mokan

dediğiniz gibi ac2() ve kapat()2 diye fonksiyonlar yaptım.Onlarla ilgili uyrılar gitti.Ancak hala kesmede sorunlar yaşıyorum.Ve derledikten sonra aşağıdaki uyarılar çıkıyor.Bunlar için ne yapabilirim?
Interrupts disabled during call to prevent re-entrancy:  (@delay_ms1)
Interrupts disabled during call to prevent re-entrancy:  (@MUL1616)

JKramer

delay_ms(x) de bir fonksiyondur. Yazıdığınız programın ayrıntılarını bilmiyorum ama kesme içinde gecikme kullanmak yerine bir bit'i set edip ana programda bunu denetleyebilirsiniz. İllaki delay fonksiyonunu kullanmak istiyorsanız ikinci bir #use_delay kullanabilirsiniz:

https://www.picproje.org/index.php/topic,28463.msg196354.html#msg196354

Ekleme:@MUL1616'nın ne olduğunu bilmiyorum, muhtemelen kullandığınız bir kütüphanedeki fonksiyondur. Belki çarpmayla ilgili olabilir.

NaMcHo

Alıntı yapılan: JKramer - 25 Mayıs 2011, 18:04:36
Hem kesmede hem de ana programda aynı fonksiyonları kullandığınız için kesmeler kapatılmış. Ya yazdığınız fonksiyonları inline yapın ya fonkisyonların içeriğini doğrudan kesme içine kopyalayın ya da fonksiyon içeriğini yeni bir fonksiyon içine kopayalayın, ac2(), kapa2() gibi:

http://www.ccsinfo.com/faq.php?page=interrupts_disabled

merhabalar inline tanımı tam olarak nasıl bir etki yapıyor fonksiyonlarda?
benim bildiğim kadarıyla eğer bir fonksiyon icerisinde az işlem yapılıyorsa o fonksiyonu inline olarak tanımlamak işlemleri hızlandırıyormuş.
_inline void fonk();

JKramer

Fonksiyonun içeriği ilgili yerlere kopyalanıyor. Ortada fonksiyon olmayınca da program akışı esnasında, fonksiyonun olduğu adrese gidip geri gelme durumu ortadan kalkmış oluyor.

mokan

delay tanımlamalarını gösterildiği gibi kesme fonksiyonundan önce ve ana fonksiyondan önce yaptım yine aynı uyarıyı verdi.tek fark, uyarı sonunda @(delay_ms1) olan gösterim @(delay_ms2) olarak değişti.

mokan

ben bu sorunun üstesinden bir türlü gelemedim.belirtilenleri yapmama rağmen hala uyarı veriyor.

mokan

delay_x(x) fonksiyonu ile alakalı sorunumu çözdüm.Artık delay ile alakalı uyarı çıkmıyor.Ben programda fonksiyon tanımlamalarımı prototip kullanarak yapmıştım.Kullandığım fonksiyonlarıda,main den sonra yazdım.Bu fonksiyonları kesme fonksiyonu içinde de kullanıyorum.Bundan dolayı, bu fonksiyonların her birinden önce #use delay(clock=4000000) tanımlamasını yazdım.main ve kesme fonksiyonlarından öncede yazdım ve sorun çözüldü.
Ancak hala bir uyarı vermekte ve benim kesmelerim bu uyarıdan dolayı çalışmamakta galiba.
Interrupts disabled during call to prevent re-entrancy:  (@MUL1616). Bu uyarının ne olduğunu hala anlayamadım.Yukarıda çarpma ile alakalı tahminler yürütüldü.ccs forumunda biraz araştırdım ama bir şeyler bulamadım.Bilen varsa bir el atsın.Hepimiz bilgilenelim.

JKramer

Kesme içinde kullandığınız fonksiyonları (sadece kendi yazdıklarınız değil, mesela math.h içindeki bir fonksiyon da olabilir) tek tek kaldırıp, her seferinde tekrar derleyin; hata vermediği zaman sorunu bulmuş olursunuz. Kod vermediğiniz için daha fazla yardım edilebilecek bir durum yok maalesef.

mokan

#10
Kod vermek benim için sorun değil ancak baya uzun.
#include <16f876.h>
#device ADC=8
#fuses XT,NOWDT,PUT,NOLVP,CPD,PROTECT
//#use delay(clock=4000000)
#use fast_io(a)
#use fast_io(b)
#use fast_io(c)
#priority rb,timer0,timer1,ext
int1 mtc,yon,prg,yvs=0,t1_s=0,d_a;
unsigned int t_tmr0,tmr0,sw1,sw2,my1,my2,oku,dipsw,i_h;
unsigned int16 bir,sifir,dngs,carpan=0,t_carpan=0,okn=0;
unsigned int carpan1,carpan2,tmr0_2,carpan_2;
signed int16 carpan_kontrol=0,tmr0_kontrol=0;
unsigned int16 pals=0,y_pals=0,geri=0;
void  ac();
void  kapat();
void  ac2();
void  kapat2();
void  yavas();
void  ters_yon();
void  ters_yon2();
void  ac_kapa1();
void  ac_kapa2();
void  adkd();
void  tek_acil();
void  yaya();
void  sayim();
void  test();
#use delay(clock=4000000)
#int_rb
/*RB4-RB7 SINIR SWITCHLERİ VE FOTOCELL İLE ALAKALI İŞLEMLER BU KISIMDA GERÇEKLEŞİR
SINIR SWİTCHLERİNE GELİNDİYSE; KAPI DURUR VE KAPININ YÖNÜNE GÖRE OTOMATİK KAPANMA AÇILIR
FOTOCELL'DE ÖN FOTOCELL AKTİF İSE; DIPSW'YE GÖRE DUR-AÇIL VE DUR-DEVAM YAPAR
ARKA FOTOCELL AKTİF İSE;DUR-DEVAM YAPAR*/
void  emniyet()
{
   output_high(pin_c1);
   if(mtc==1)
      {
         oku=input_b();//portb'yi oku
         oku=oku & 0b11110000;//portb'nin alt 4 bitini maskele
         switch(oku)
            {
               case 240://11110000 mı?(Hiçbir Emniyet Elemanından Sinyal Yok Mu?)
                  break;
                  
               case 208://11010000 mı?
               case 224://11100000 mı?(Sınır switchlerinden aktif olan var mı)
                  output_low(pin_c4);//Ayarlı güç motor çıkışını kapat
                  output_low(pin_c5);//220V kalkış çıkışını kapat
                  output_low(pin_c3);//yavaşlama çıkışını kapat
                  mtc=0;//motor çalışmıyor bilgisi(sıfır:motor çalışmıyor)
                  i_h=1;//ilk hareketin başlangıç çarpan değeri(10 olunca ayarlı güç çıkışı aktif olur)
                  setup_timer_1(T1_DISABLED);//Sıkışma süresi durduruldu
                  if(yon==1&&input(pin_a0))
                     {
                        set_adc_channel(0);//kanal 4'den oto kapanma değerini oku!!!!(yeni devre için kanal 0 olacak)
                       // delay_us(20);
                        dngs=(read_adc()*120)/256;//oto kapanma süresi için, dönmesi gereken döngü sayısını hesapla
                        setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);//tmr1'i dahili sinyale ve 1/8 değere kur
                        set_timer1(3035);//500mS de bir kesme yapması için başlaması gereken değer
                        enable_interrupts(int_timer1);//tmr1 kesmesi aktif
                     }
                  yvs=0;//yavaşlama pasif
                  if(prg==0)
                     {
                        carpan=0;//sayım çarpanını sıfırla
                        set_timer0(0);//tmr0'ı sayım için sıfırla
                     }
                  //delay_ms(250);//tüm sayımları kaçırmamak için motor duruncaya kadar bekle
                  break;//kesme çıkışına git
                  
               case 112:
                  if(yon==1)//kapı açılma yönünde mi?
                     break;//o zaman ön fotoseli görmezden gel
                  if(input(pin_a3)&&prg==0)//dur-açıl özelliği(sayım sırasında da dur açıl kapalı olacak)
                     {
                        d_a=1;//1 olduğu zaman aç fonksiyonu içinde 220V kalkış gerilimi çıkışını aktif etmez(o kısmı atlar)
                        ac2();//aç fonksiyonuna git
                        ters_yon2();//ters yön fonksiyonundan dönüş palsi için çarpan ve tmr0 değerlerini yükle
                        i_h=1;////ilk hareketin başlangıç çarpan değeri(10 olunca ayarlı güç çıkışı aktif olur)
                        output_high(pin_c5);//220V kalkış çıkışı aktif
                        d_a=0;//d_a sıfırlanmazsa normal açılmalarda 220V çıkışı aktif olmaz
                     }
                  else
                     {
                       output_low(pin_c4);//Ayarlı güç motor çıkışını kapat
                       output_low(pin_c5);//220V kalkış çıkışını kapat
                       output_low(pin_c3);//yavaşlama çıkışını kapat
                       mtc=0;//motor çalışmıyor bilgisi(sıfır:motor çalışmıyor)
                       yvs=0;//yavaşlama pasif bilgisi(sıfır:pasif bir:aktif)
                       i_h=1;//ilk hareket için başlanması gereken çarpan değeri
                       setup_timer_1(T1_DISABLED);//Sıkışma süresi durduruldu
                       while(input(pin_b7)==0)//ön fotocell'den sinyal geldiği sürece döngüden çıkma.sinyal gelince harekete kaldığın yerden devam
                           continue;
                       
                       switch(sw1)//kapanma yönü sınır switch'nin basılı olmadığını kontrol eder
                        {
                           case 4://kapanma switch'i portb.4 mi bağlı?
                              if(input(pin_b4))//kapanma switch'i basılı değilse kalkış yap
                                 {
                                    output_high(pin_c5);//220V çıkışını aktif yap
                                    setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);//tmr1 sıkışma için kuruldu
                                    set_timer1(0);//tmr1 başlangıç değerini sıfır yap
                                    enable_interrupts(int_timer1);//tmr1 kesmesi aktif  
                                 }
                              break;
                           case 5://kapanma switch'i portb.5 mi bağlı?
                              if(input(pin_b5))//kapanma switch'i basılı değilse kalkış yap
                                 {
                                    output_high(pin_c5);//220V çıkışını aktif yap
                                    setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);//tmr1 sıkışma için kuruldu
                                    set_timer1(0);//tmr1 başlangıç değerini sıfır yap
                                    enable_interrupts(int_timer1);//tmr1 kesmesi aktif 
                                 }
                              break;
                        }  
                     }
                  break;
               
               case 176:
                  if(yon==0)
                     break;
                  output_low(pin_c4);//Ayarlı güç motor çıkışını kapat
                  output_low(pin_c5);//220V kalkış çıkışını kapat
                  output_low(pin_c3);//yavaşlama çıkışını kapat
                  mtc=0;//motor çalışmıyor bilgisi(sıfır:motor çalışmıyor)
                  yvs=0;//yavaşlama pasif bilgisi(sıfır:pasif bir:aktif)
                  i_h=1;//ilk hareket için başlanması gereken çarpan değeri
                  setup_timer_1(T1_DISABLED);//Sıkışma süresi durduruldu
                  
                  while(input(pin_b6)==0)
                     continue;
                  switch(sw2)
                        {
                           case 4:
                              if(input(pin_b4))
                                 {
                                    output_high(pin_c5);//220V çıkışını aktif yap
                                    setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);//tmr1 sıkışma için kuruldu
                                    set_timer1(0);//tmr1 başlangıç değerini sıfır yap
                                    enable_interrupts(int_timer1);//tmr1 kesmesi aktif 
                                 }
                              break;
                           case 5:
                              if(input(pin_b5))
                                 {
                                    output_high(pin_c5);//220V çıkışını aktif yap
                                    setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);//tmr1 sıkışma için kuruldu
                                    set_timer1(0);//tmr1 başlangıç değerini sıfır yap
                                    enable_interrupts(int_timer1);//tmr1 kesmesi aktif 
                                 }
                              break;
                        }
                  break;
            }
      }
    output_low(pin_c1);
    //return;
}
//#use delay(clock=4000000)
#int_timer0
void pals_sayim()
{
   output_high(pin_c0);
   carpan=carpan+1;
   set_timer1(0);
   if(t1_s==1)
      {
         tmr0=get_timer0();
         pals=(carpan*255)+(tmr0*2);
         if(pals>=geri)
            {
               output_low(pin_c4);//Ayarlı güç motor çıkışını kapat
               output_low(pin_c5);//220V kalkış çıkışını kapat
               output_low(pin_c3);//yavaşlama çıkışını kapat
               mtc=0;//motor çalışmıyor bilgisi(sıfır:motor çalışmıyor)
               t1_s=0;//sıkışma kapalı
               geri=0;//geri açılırkenki pals bilgisi vardır(23cm için) 
            }
      }
   else
      if(i_h<10)//ilk hareket için gerekli çarpan değeri oldu mu?
         i_h=i_h+1;//omadıysa çarpanı bir artır
      else
         if(prg==1||pals>=y_pals)//sayım aktif mi veya yavaşlama noktasına gelindi mi?
            {
               yvs=1;//yavaşlama aktif olacak
               output_low(pin_c4);//ayarlı güç çıkışını kapat
               output_low(pin_c5);//220V çıkışını kapat
               output_high(pin_c3);
            }
         else//hayır yavaşlama noktası veya sayım aktif değil
            {
               output_low(pin_c5);//220V çıkışı kapalı
               output_high(pin_c4);//ayarlı güç çıkışı aktif
            }
         delay_ms(10);
        output_low(pin_c0);
}
//#use delay(clock=4000000)
#int_timer1
void  t1_kesme()
{
   if(mtc==1)//motor çalışıyor mu
      if(yon==0)//motor çalışıyor.yön kapanma mı?(kapanmaysa geri açıl)
         {
           d_a=1;
           ac2();
           ters_yon2();//ters yön için çarpan değerlerini yükle
           tmr0=get_timer0();//timer0 oku
           pals=(carpan*255)+(tmr0*2);//palsi hesapla
           geri=pals+3161;//geri açılma miktarı
           t1_s=1;//t1_sıkışma aktif bilgisi yüklendi
           d_a=0;
           output_high(pin_c5);
         }
       else//yön açılma dur ve geri dön
         {
            setup_timer_1(T1_DISABLED);//timer1 saymayı durdursun
            output_low(pin_c4);//ayarlı güç motor çıkışını kapat
            output_low(pin_c5);//220V çıkışı kapalı
            output_low(pin_c3);
            mtc=0;
            //delay_ms(250); değiştirildi***********************************************************************
         }
   else//hayır motor çalışmıyor otomatik kapanma yap
      {
         set_timer1(3035);//otomatik kapanma başlangıç sayım süresini yükle(500ms'de bir kesme verecek) 
         if(dngs>=okn)//otomatik kapanma sayısı döngü sayısına eşit mi
            {
               kapat2();
               okn=0;
            }
         else
            okn=okn+1;//
      }
  //delay_ms(10);
  return;
}
//#use delay(clock=4000000)
#int_ext
void stop()
{
   if(mtc==1)
      {
          output_low(pin_c4);//Ayarlı güç motor çıkışını kapat
          output_low(pin_c5);//220V kalkış çıkışını kapat
          output_low(pin_c3);//yavaşlama çıkışını kapat
          setup_timer_1(T1_DISABLED);
          mtc=0;//motor çalışmıyor bilgisi(sıfır:motor çalışmıyor)
          yvs=0;
          i_h=1;
          while(input(pin_b0)==0)
           // delay_ms(50);********************************************************************
          if(prg==1)
            {
               output_high(pin_c1);
               setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);
               set_timer1(0);
               enable_interrupts(int_timer1);
            
            }
      }
   //delay_ms(10);
   return;
}
#use delay(clock=4000000)
void main()
{
   disable_interrupts(GLOBAL);
   setup_spi(SPI_SS_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);//tmr2 kapalı
   setup_CCP1(CCP_OFF);//ccp1 kapalı
   setup_CCP2(CCP_OFF);//ccp2 kapalı
   setup_adc(adc_clock_div_32);//adc çevrim frekansı Fosc/8
   setup_adc_ports(AN0);//(yeni kartta AN0 olarak değişecek)
   set_tris_a(0xFF);//porta tamamen giriş
   set_tris_b(0xFF);//portb tamamen giriş
   set_tris_c(0x01);//portc.0 sıfır hariç tüm portc çıkış
   output_high(pin_c2);//PROGRAMI ADIM ADIM GÖRMEK İÇİN YAPILAN EKLEME İŞİN BİTİNCE SİL
   delay_ms(2000);//PROGRAMI ADIM ADIM GÖRMEK İÇİN YAPILAN EKLEME İŞİN BİTİNCE SİL
   output_low(pin_c2);//PROGRAMI ADIM ADIM GÖRMEK İÇİN YAPILAN EKLEME İŞİN BİTİNCE SİL 
   oku=input_b();//portb yi oku
   oku=oku & 0b11110001;//portb.3'ü maskele
   while(oku==0b00110000)//test değerine uygunsa test fonksiyonuna git
      test();
      /*bu kısım denenmek amaçlı sonradan eklendi.bu kısımda sayım moduna geçebilmek için
      basılan özel kombinasyonu sonucu eeprom'un sıfırıncı adresi sıfırlanır ve progra sonsuz döngüde kalır*/
   while(TRUE)
      {
         oku=input_b();
         oku=oku & 0b11000111;
         if(oku==0b11000000)
            {
               prg=0;
               write_eeprom(0,prg);
            }
         else
            break;
      }
   setup_timer_0(RTCC_EXT_L_TO_H|RTCC_DIV_2);//tmr0'ı yükselen kenarda harici tetiklemeye 1/2 bölme oranında kur
   set_timer0(0);//tmr0'ı sıfırla
   enable_interrupts(int_timer0);//tmr0 kesmesi aktif
   ext_int_edge(H_TO_L);//rb0 kesmesi düşen kenarda tetiklenecek
   enable_interrupts(INT_EXT);//rb0 kesmesi aktif
   enable_interrupts(INT_RB);//rb4-rb7 kesmesi aktif
   enable_interrupts(GLOBAL);//aktif olan tüm kesmelere izin var
   prg=read_eeprom(0);//prg'yi oku
   if(prg==0)//daha önceden sayım yapılmış veya yeniden sayım yapılmak isteniyor mu?
      sayim();
   else //daha önceden sayım yapılmış
      {
         sw1=read_eeprom(1);//kapanma sınır switch port bilgisini oku
         sw2=read_eeprom(2);//açılma sınır switch port bilgisini oku
         my1=read_eeprom(3);//kapanma yönü rölesi port bilgisini oku
         my2=read_eeprom(4);//açılma yönü rölesi port bilgisini oku
         t_tmr0=read_eeprom(5);//sayım sonundaki tmr0 değerini oku
         carpan1=read_eeprom(6);//çarpanın alt 8 bit değerini oku
         carpan2=read_eeprom(7);//çarpanın üst 8 bit değerinş oku
         carpan=make16(carpan2,carpan1);//çarpanı 16 bit haline dönüştür
      }
   while(TRUE)//sonsuz döngü
      {
         switch(sw1)//sw1 port bilgisine göre sınır switch'i 
            {
               case 4:
                  if(input(pin_b4))
                     break;
                  else
                     {
                        yon=0;
                        goto surekli;
                     }
               case 5:
                  if(input(pin_b5))
                     break;
                  else
                     {
                        yon=0;
                        goto surekli;
                     }
            }
         switch(sw2)
            {
               case 5:
                  if(input(pin_b5))
                     break;
                  else
                     {
                        yon=1;
                        goto surekli;
                     }
               case 4:
                  if(input(pin_b4))
                     break;
                  else
                     {
                        yon=1;
                        goto surekli;
                     }
            }
        //değişiklik yapıldı. disable_interrupts(int_timer0);
         kapat();
         //yvs=1;
         while(yvs==1)
            yavas();
      }
surekli:
   while(TRUE)
      {
         if(input(pin_b1)==0)//Aç butonuna basıldı mı?
            {
               dipsw=input_a();//çalışma modu için dipswitchlerin bulunduğu porta'yı oku
               dipsw=dipsw&0b00100100;//çalışma modunun kontrolünde kullanılan uçlar haricindekileri maskele
               switch(dipsw)
                  {
                     case 0://00000000 mı?(evet:Aç-Kapa modu açık)
                        ac_kapa1();
                        break;
                     case 32://00100000 mı?(evet:tek açıl modu açık)
                        tek_acil();
                        break;
                     case 4://00000100 mı?(evet:aç-dur-kapa-dur modu açık)
                     case 36://00100100 mı?(tek açılda aktif ise aç-dur-kapa-dur çalış)
                        adkd();//aç-dur-kapa-dur fonksiyonuna git
                        break;
                  }
            }
         if(input(pin_b2)==0)//Kapatma-Yaya butonuna mı basıldı?(sadece kapatma ve yaya butonu ile ilgili işlemler yapılır)
            {
               dipsw=input_a();//çalışma modu için dipswitchlerin bulunduğu porta'yı oku
               dipsw=dipsw&0b00100100;//çalışma modunun kullanıldığı uçlar haricindekileri maskele
               switch(dipsw)//okunan bilgilere göre aşağıdaki değerleri karşılaştır ve işlem yap
                  {
                     case 0://00000000 mı?(evet:Aç-Kapa modu açık)
                        ac_kapa2();//kapatma tuşuna basıldıktan sonraki aç-kapa fonksiyonuna git
                        break;//switch'den çık
                     case 4://00000100 mı?(evet:yaya modu açık)
                     case 36://00100100 mı?(tek açıl da açıksa sadece yaya çalış)
                        yaya();//yaya fonksiyonuna git
                        break;//switch'den çık
                  }
            }
         if(mtc==1)
            {
               tmr0=get_timer0();
               pals=(carpan*255)+(tmr0*2);
               if(pals>=y_pals&&i_h>=10)
                  {
                     yvs=1;
                     while(yvs==1)
                        yavas();
                  }
               else
                  {
                     delay_ms(50);
                     continue;
                  }
            }
         else
            {
               delay_ms(50);
               continue;
            }
       // delay_ms(100);
      }
}
#use delay(clock=4000000)
void ac()
{
   switch(sw2)
      {
         case 5:
            if(input(pin_b5)&&input(pin_b0)&&input(pin_b6))
               break;
            else
               return;
               
         case 4:
            if(input(pin_b4))
               break;
            else
               return;
      }
   output_low(pin_c4);
   output_low(pin_c5);
   output_low(pin_c3);
   i_h=1;
   mtc=0;
   yon=1;
   switch(my2)
      {
         case 7:
            output_low(pin_c6);
            output_high(pin_c7);
            break;
         case 6:
            output_low(pin_c7);
            output_high(pin_c6);
            break;
      }
   delay_ms(250);
   if(d_a==1)
      return;
   output_high(pin_c5);
   setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);
   set_timer1(0);
   enable_interrupts(int_timer1);
   enable_interrupts(GLOBAL);
   return;
}
#use delay(clock=4000000)
void kapat()
{
   switch(sw1)
      {
         case 4:
            if(input(pin_b4)&&input(pin_b7)&&input(pin_b0))
               break;
            else
               return;
         case 5:
            if(input(pin_b5))
               break;
            else
               return;
      }
   output_low(pin_c4);
   output_low(pin_c5);
   output_low(pin_c3);
   i_h=1;
   mtc=0;
   yon=0;
      switch(my1)
      {
         case 6:
            output_low(pin_c7);
            output_high(pin_c6);
            break;
         case 7:
            output_low(pin_c6);
            output_high(pin_c7);
            break;
      }
   delay_ms(250);
   if(d_a==1)
      return;
   output_high(pin_c5);
   setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);
   set_timer1(0);
   enable_interrupts(int_timer1);
   return;
}

#use delay(clock=4000000)
void yavas()
{
   if(input(pin_b4)||input(pin_b5))
      return;
   for(bir=0;bir<=1000&&yvs==1;bir++)
      {
         output_high(pin_c3);
         delay_us(1);
      }
   for(sifir=0;sifir<=1663&&yvs==1;sifir++)
      {
         output_high(pin_c3);
         delay_us(1);
      }
   return;
}
#use delay(clock=4000000)
void ters_yon()
{
   if(carpan==0)
      return;
   carpan=t_carpan-carpan;
   tmr0=get_timer0();
   tmr0_kontrol=t_tmr0-tmr0;
   if(tmr0_kontrol<0)
      {
         carpan=carpan-1;
         tmr0=255+(t_tmr0-tmr0);
         set_timer0(tmr0);
      }
   else
      {
         tmr0=t_tmr0-tmr0;
         set_timer0(tmr0);
      }
   return;
}
#use delay(clock=4000000)
void ac_kapa1()
{
   if(mtc==1)
      if(yon==0)
         {
            d_a=1;
            ac();
            ters_yon();
            output_high(pin_c5);
            setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);
            set_timer1(0);
            enable_interrupts(int_timer1);
            d_a=0;
            return;
         }
      else
         {
            output_low(pin_c4);
            output_low(pin_c5);
            output_low(pin_c3);
            mtc=0;
            i_h=1;
            setup_timer_1(T1_DISABLED);
            delay_ms(250);
            return;
         }
   else
      if(yon==0)
         {
            ters_yon();
            ac();
            return;
         }  
}
#use delay(clock=4000000)
void ac_kapa2()
{
   if(mtc==1)
      if(yon==0)
         {
            output_low(pin_c4);
            output_low(pin_c5);
            output_low(pin_c3);
            mtc=0;
            setup_timer_1(T1_DISABLED);
            delay_ms(250);
            return;
         }
      else
         return;
   else
      if(yon==0)
         kapat();
      else
         {
            ters_yon();
            kapat();
         }
   return;
}
#use delay(clock=4000000)#use delay(clock=4000000)
void adkd()
{
   if(mtc==1)
      {
         output_low(pin_c4);
         output_low(pin_c5);
         output_low(pin_c3);
         mtc=0;
         i_h=1;
         setup_timer_1(T1_DISABLED);
         delay_ms(250);
      }
   else
      if(yon==1)
         {
            ters_yon();
            kapat();
            return;
         }
      else
         {
            ters_yon();
            ac();
            return;
         }
}
#use delay(clock=4000000)
void tek_acil()
{
   if(mtc==1)
      return;
   else
      {
         ters_yon();
         ac();
      }
   return;
}
#use delay(clock=4000000)
void yaya()
{
   switch(sw1)
      {
         case 4:
            if(input(pin_b4)!=1&&mtc==0)
               break;
            else
               return;
          case 5:
            if(input(pin_b5)!=1&&mtc==0)
               break;
            else
               return;
      }
   ac();
   do
      pals=(carpan*255)+(get_timer0()*2);
   while(pals<=10937);
   output_low(pin_c4);
   output_low(pin_c5);
   output_low(pin_c3);
   mtc=0;
   i_h=1;
   setup_timer_1(T1_DISABLED);
   delay_ms(250);
   return;
}
#use delay(clock=4000000)
void sayim()
{
   while(TRUE)
      {
         output_high(pin_c2);
         delay_ms(1000);
         output_low(pin_c2);
         delay_ms(1000);
         output_high(pin_c2);
         //delay_ms(5000);
         while(TRUE)
            {
               if(input(pin_b4)==0)
                  {
                     sw1=4;
                     sw2=5;
                     my1=6;
                     my2=7;
                     break;
                  }
               if(input(pin_b5)==0)
                 {
                     sw1=4;
                     sw2=5;
                     my1=6;
                     my2=7;
                     break;
                  }  
            }
         prg=1;
         ac();
         while(TRUE)
            {
               if(yvs==1)//t1_s==0 silindi***********************************************************************
                  yavas();
               switch(sw2)
                  {
                     case 4:
                        if(input(pin_b4))
                           break;
                        else
                           goto devam;
                     case 5:
                        if(input(pin_b5))
                           break;
                        else
                           goto devam;
                  }
            }
         devam:
            carpan_2=carpan;
            tmr0_2=get_timer0();
            carpan=0;
            set_timer0(0);
            kapat();
            while(TRUE)
               {
                  if(yvs==1&&t1_s==0)
                     yavas();
                  switch(sw1)
                     {
                        case 4:
                           if(input(pin_b4))
                              break;
                           else
                              goto devam2;
                        case 5:
                           if(input(pin_b5))
                              break;
                           else
                              goto devam2;
                     }
               }
         devam2:
            tmr0=get_timer0();
            carpan_kontrol=carpan-carpan_2;//son sayım ile ilk sayım arasında farkı carpan_kontrol değişkenine ata
            if(carpan_kontrol<0)//
               carpan_kontrol=carpan_kontrol*(-1);
            if(carpan_kontrol>2)
               continue;
            carpan=(carpan+carpan_2)/2;
            t_tmr0=(tmr0+tmr0_2)/2;
            tmr0_2=0;
            pals=(carpan*255)+(t_tmr0*2);
            y_pals=pals-((pals*5)/100);
            pals=0;
            set_timer0(0);
            carpan1=make8(carpan,0);
            carpan2=make8(carpan,1);
            write_eeprom(0,prg);
            write_eeprom(1,sw1);
            write_eeprom(2,sw2);
            write_eeprom(3,my1);
            write_eeprom(4,my2);
            write_eeprom(5,t_tmr0);
            write_eeprom(6,carpan1);
            write_eeprom(7,carpan2);
            delay_ms(500);
            output_low(pin_c2);
            break;
      }
  return;
}
#use delay(clock=4000000)
void test()
{
   delay_ms(1000);
   output_high(pin_c2);//PROGRAMI ADIM ADIM GÖRMEK İÇİN YAPILAN EKLEME İŞİN BİTİNCE SİL
   delay_ms(2000);//PROGRAMI ADIM ADIM GÖRMEK İÇİN YAPILAN EKLEME İŞİN BİTİNCE SİL
   output_low(pin_c2);//PROGRAMI ADIM ADIM GÖRMEK İÇİN YAPILAN EKLEME İŞİN BİTİNCE SİL
   output_high(pin_c6);
   delay_ms(1000);
   output_high(pin_c5);
   while(input(pin_b4)==1)
      delay_ms(50);
   output_low(pin_c5);
   delay_ms(20);
   output_low(pin_c6);
   return;
}

mokan

benzer bir problem ile alakalı forumda bir çözüm var ancak ingilizcem olmadığı için anlayamadım.
http://www.ccsinfo.com/forum/viewtopic.php?t=25464&highlight=math+library

JKramer

Bu haliyle hata vermiyor. Genel olarak bakarsak, kodun sürekli akması gerekiyor; aralarda sonsuz döngülerden kaçınmalı ve kesmelerin içinde olabildiğince az zaman harcanmalı. Tek yaptığım, kesme içinde bir biti set edip ana döngüde bu biti kontrol etmek. (Sonlarda da bu biti sıfırlamak tabii ki)

#include <16f876.h>
#device ADC=8
#fuses XT,NOWDT,PUT,NOLVP,CPD,PROTECT
//#use delay(clock=4000000)
#use fast_io(a)
#use fast_io(b)
#use fast_io(c)
#priority rb,timer0,timer1,ext
int1 mtc,yon,prg,yvs=0,t1_s=0,d_a;
int1 int_rb_bit=0;
int1 tim0_bit=0;
int1 tim1_bit=0;
int1 ext_bit=0;
unsigned int t_tmr0,tmr0,sw1,sw2,my1,my2,oku,dipsw,i_h;
unsigned int16 bir,sifir,dngs,carpan=0,t_carpan=0,okn=0;
unsigned int carpan1,carpan2,tmr0_2,carpan_2;
signed int16 carpan_kontrol=0,tmr0_kontrol=0;
unsigned int16 pals=0,y_pals=0,geri=0;
void  ac();
void  kapat();
void  ac2();
void  kapat2();
void  yavas();
void  ters_yon();
void  ters_yon2();
void  ac_kapa1();
void  ac_kapa2();
void  adkd();
void  tek_acil();
void  yaya();
void  sayim();
void  test();
void  emniyet();
void  pals_sayim();
void  t1_kesme();
void  stop();
#use delay(clock=4000000)
#int_rb
/*RB4-RB7 SINIR SWITCHLERİ VE FOTOCELL İLE ALAKALI İŞLEMLER BU KISIMDA GERÇEKLEŞİR
SINIR SWİTCHLERİNE GELİNDİYSE; KAPI DURUR VE KAPININ YÖNÜNE GÖRE OTOMATİK KAPANMA AÇILIR
FOTOCELL'DE ÖN FOTOCELL AKTİF İSE; DIPSW'YE GÖRE DUR-AÇIL VE DUR-DEVAM YAPAR
ARKA FOTOCELL AKTİF İSE;DUR-DEVAM YAPAR*/
void int_rb_isr()
{
   int_rb_bit=1;
}
//#use delay(clock=4000000)
#int_timer0
void tim0_isr()
{
   tim0_bit=1;
}
//#use delay(clock=4000000)
#int_timer1
void tim1_isr()
{
   tim1_bit=1;
}
//#use delay(clock=4000000)
#int_ext
void ext_isr()
{
   ext_bit=1;
}
#use delay(clock=4000000)
void main()
{
   disable_interrupts(GLOBAL);
   setup_spi(SPI_SS_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);//tmr2 kapalı
   setup_CCP1(CCP_OFF);//ccp1 kapalı
   setup_CCP2(CCP_OFF);//ccp2 kapalı
   setup_adc(adc_clock_div_32);//adc çevrim frekansı Fosc/8
   setup_adc_ports(AN0);//(yeni kartta AN0 olarak değişecek)
   set_tris_a(0xFF);//porta tamamen giriş
   set_tris_b(0xFF);//portb tamamen giriş
   set_tris_c(0x01);//portc.0 sıfır hariç tüm portc çıkış
   output_high(pin_c2);//PROGRAMI ADIM ADIM GÖRMEK İÇİN YAPILAN EKLEME İŞİN BİTİNCE SİL
   delay_ms(2000);//PROGRAMI ADIM ADIM GÖRMEK İÇİN YAPILAN EKLEME İŞİN BİTİNCE SİL
   output_low(pin_c2);//PROGRAMI ADIM ADIM GÖRMEK İÇİN YAPILAN EKLEME İŞİN BİTİNCE SİL
   oku=input_b();//portb yi oku
   oku=oku & 0b11110001;//portb.3'ü maskele
   while(oku==0b00110000)//test değerine uygunsa test fonksiyonuna git
      test();
      /*bu kısım denenmek amaçlı sonradan eklendi.bu kısımda sayım moduna geçebilmek için
      basılan özel kombinasyonu sonucu eeprom'un sıfırıncı adresi sıfırlanır ve progra sonsuz döngüde kalır*/
   while(TRUE)
      {
         oku=input_b();
         oku=oku & 0b11000111;
         if(oku==0b11000000)
            {
               prg=0;
               write_eeprom(0,prg);
            }
         else
            break;
      }
   setup_timer_0(RTCC_EXT_L_TO_H|RTCC_DIV_2);//tmr0'ı yükselen kenarda harici tetiklemeye 1/2 bölme oranında kur
   set_timer0(0);//tmr0'ı sıfırla
   enable_interrupts(int_timer0);//tmr0 kesmesi aktif
   ext_int_edge(H_TO_L);//rb0 kesmesi düşen kenarda tetiklenecek
   enable_interrupts(INT_EXT);//rb0 kesmesi aktif
   enable_interrupts(INT_RB);//rb4-rb7 kesmesi aktif
   enable_interrupts(GLOBAL);//aktif olan tüm kesmelere izin var
   prg=read_eeprom(0);//prg'yi oku
   if(prg==0)//daha önceden sayım yapılmış veya yeniden sayım yapılmak isteniyor mu?
      sayim();
   else //daha önceden sayım yapılmış
      {
         sw1=read_eeprom(1);//kapanma sınır switch port bilgisini oku
         sw2=read_eeprom(2);//açılma sınır switch port bilgisini oku
         my1=read_eeprom(3);//kapanma yönü rölesi port bilgisini oku
         my2=read_eeprom(4);//açılma yönü rölesi port bilgisini oku
         t_tmr0=read_eeprom(5);//sayım sonundaki tmr0 değerini oku
         carpan1=read_eeprom(6);//çarpanın alt 8 bit değerini oku
         carpan2=read_eeprom(7);//çarpanın üst 8 bit değerinş oku
         carpan=make16(carpan2,carpan1);//çarpanı 16 bit haline dönüştür
      }
   while(TRUE)//sonsuz döngü
      {
         emniyet();
         pals_sayim();
         t1_kesme();
         stop();
         switch(sw1)//sw1 port bilgisine göre sınır switch'i
            {
               case 4:
                  if(input(pin_b4))
                     break;
                  else
                     {
                        yon=0;
                        goto surekli;
                     }
               case 5:
                  if(input(pin_b5))
                     break;
                  else
                     {
                        yon=0;
                        goto surekli;
                     }
            }
         switch(sw2)
            {
               case 5:
                  if(input(pin_b5))
                     break;
                  else
                     {
                        yon=1;
                        goto surekli;
                     }
               case 4:
                  if(input(pin_b4))
                     break;
                  else
                     {
                        yon=1;
                        goto surekli;
                     }
            }
        //değişiklik yapıldı. disable_interrupts(int_timer0);
         kapat();
         //yvs=1;
         while(yvs==1)
            yavas();
      }
surekli:
   while(TRUE)
      {
         if(input(pin_b1)==0)//Aç butonuna basıldı mı?
            {
               dipsw=input_a();//çalışma modu için dipswitchlerin bulunduğu porta'yı oku
               dipsw=dipsw&0b00100100;//çalışma modunun kontrolünde kullanılan uçlar haricindekileri maskele
               switch(dipsw)
                  {
                     case 0://00000000 mı?(evet:Aç-Kapa modu açık)
                        ac_kapa1();
                        break;
                     case 32://00100000 mı?(evet:tek açıl modu açık)
                        tek_acil();
                        break;
                     case 4://00000100 mı?(evet:aç-dur-kapa-dur modu açık)
                     case 36://00100100 mı?(tek açılda aktif ise aç-dur-kapa-dur çalış)
                        adkd();//aç-dur-kapa-dur fonksiyonuna git
                        break;
                  }
            }
         if(input(pin_b2)==0)//Kapatma-Yaya butonuna mı basıldı?(sadece kapatma ve yaya butonu ile ilgili işlemler yapılır)
            {
               dipsw=input_a();//çalışma modu için dipswitchlerin bulunduğu porta'yı oku
               dipsw=dipsw&0b00100100;//çalışma modunun kullanıldığı uçlar haricindekileri maskele
               switch(dipsw)//okunan bilgilere göre aşağıdaki değerleri karşılaştır ve işlem yap
                  {
                     case 0://00000000 mı?(evet:Aç-Kapa modu açık)
                        ac_kapa2();//kapatma tuşuna basıldıktan sonraki aç-kapa fonksiyonuna git
                        break;//switch'den çık
                     case 4://00000100 mı?(evet:yaya modu açık)
                     case 36://00100100 mı?(tek açıl da açıksa sadece yaya çalış)
                        yaya();//yaya fonksiyonuna git
                        break;//switch'den çık
                  }
            }
         if(mtc==1)
            {
               tmr0=get_timer0();
               pals=(carpan*255)+(tmr0*2);
               if(pals>=y_pals&&i_h>=10)
                  {
                     yvs=1;
                     while(yvs==1)
                        yavas();
                  }
               else
                  {
                     delay_ms(50);
                     continue;
                  }
            }
         else
            {
               delay_ms(50);
               continue;
            }
       // delay_ms(100);
      }
}
#use delay(clock=4000000)
void ac()
{
   switch(sw2)
      {
         case 5:
            if(input(pin_b5)&&input(pin_b0)&&input(pin_b6))
               break;
            else
               return;

         case 4:
            if(input(pin_b4))
               break;
            else
               return;
      }
   output_low(pin_c4);
   output_low(pin_c5);
   output_low(pin_c3);
   i_h=1;
   mtc=0;
   yon=1;
   switch(my2)
      {
         case 7:
            output_low(pin_c6);
            output_high(pin_c7);
            break;
         case 6:
            output_low(pin_c7);
            output_high(pin_c6);
            break;
      }
   delay_ms(250);
   if(d_a==1)
      return;
   output_high(pin_c5);
   setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);
   set_timer1(0);
   enable_interrupts(int_timer1);
   enable_interrupts(GLOBAL);
   return;
}
#use delay(clock=4000000)
void kapat()
{
   switch(sw1)
      {
         case 4:
            if(input(pin_b4)&&input(pin_b7)&&input(pin_b0))
               break;
            else
               return;
         case 5:
            if(input(pin_b5))
               break;
            else
               return;
      }
   output_low(pin_c4);
   output_low(pin_c5);
   output_low(pin_c3);
   i_h=1;
   mtc=0;
   yon=0;
      switch(my1)
      {
         case 6:
            output_low(pin_c7);
            output_high(pin_c6);
            break;
         case 7:
            output_low(pin_c6);
            output_high(pin_c7);
            break;
      }
   delay_ms(250);
   if(d_a==1)
      return;
   output_high(pin_c5);
   setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);
   set_timer1(0);
   enable_interrupts(int_timer1);
   return;
}

#use delay(clock=4000000)
void yavas()
{
   if(input(pin_b4)||input(pin_b5))
      return;
   for(bir=0;bir<=1000&&yvs==1;bir++)
      {
         output_high(pin_c3);
         delay_us(1);
      }
   for(sifir=0;sifir<=1663&&yvs==1;sifir++)
      {
         output_high(pin_c3);
         delay_us(1);
      }
   return;
}
#use delay(clock=4000000)
void ters_yon()
{
   if(carpan==0)
      return;
   carpan=t_carpan-carpan;
   tmr0=get_timer0();
   tmr0_kontrol=t_tmr0-tmr0;
   if(tmr0_kontrol<0)
      {
         carpan=carpan-1;
         tmr0=255+(t_tmr0-tmr0);
         set_timer0(tmr0);
      }
   else
      {
         tmr0=t_tmr0-tmr0;
         set_timer0(tmr0);
      }
   return;
}
#use delay(clock=4000000)
void ac_kapa1()
{
   if(mtc==1)
      if(yon==0)
         {
            d_a=1;
            ac();
            ters_yon();
            output_high(pin_c5);
            setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);
            set_timer1(0);
            enable_interrupts(int_timer1);
            d_a=0;
            return;
         }
      else
         {
            output_low(pin_c4);
            output_low(pin_c5);
            output_low(pin_c3);
            mtc=0;
            i_h=1;
            setup_timer_1(T1_DISABLED);
            delay_ms(250);
            return;
         }
   else
      if(yon==0)
         {
            ters_yon();
            ac();
            return;
         }
}
#use delay(clock=4000000)
void ac_kapa2()
{
   if(mtc==1)
      if(yon==0)
         {
            output_low(pin_c4);
            output_low(pin_c5);
            output_low(pin_c3);
            mtc=0;
            setup_timer_1(T1_DISABLED);
            delay_ms(250);
            return;
         }
      else
         return;
   else
      if(yon==0)
         kapat();
      else
         {
            ters_yon();
            kapat();
         }
   return;
}
#use delay(clock=4000000)#use delay(clock=4000000)
void adkd()
{
   if(mtc==1)
      {
         output_low(pin_c4);
         output_low(pin_c5);
         output_low(pin_c3);
         mtc=0;
         i_h=1;
         setup_timer_1(T1_DISABLED);
         delay_ms(250);
      }
   else
      if(yon==1)
         {
            ters_yon();
            kapat();
            return;
         }
      else
         {
            ters_yon();
            ac();
            return;
         }
}
#use delay(clock=4000000)
void tek_acil()
{
   if(mtc==1)
      return;
   else
      {
         ters_yon();
         ac();
      }
   return;
}
#use delay(clock=4000000)
void yaya()
{
   switch(sw1)
      {
         case 4:
            if(input(pin_b4)!=1&&mtc==0)
               break;
            else
               return;
          case 5:
            if(input(pin_b5)!=1&&mtc==0)
               break;
            else
               return;
      }
   ac();
   do
      pals=(carpan*255)+(get_timer0()*2);
   while(pals<=10937);
   output_low(pin_c4);
   output_low(pin_c5);
   output_low(pin_c3);
   mtc=0;
   i_h=1;
   setup_timer_1(T1_DISABLED);
   delay_ms(250);
   return;
}
#use delay(clock=4000000)
void sayim()
{
   while(TRUE)
      {
         output_high(pin_c2);
         delay_ms(1000);
         output_low(pin_c2);
         delay_ms(1000);
         output_high(pin_c2);
         //delay_ms(5000);
         while(TRUE)
            {
               if(input(pin_b4)==0)
                  {
                     sw1=4;
                     sw2=5;
                     my1=6;
                     my2=7;
                     break;
                  }
               if(input(pin_b5)==0)
                 {
                     sw1=4;
                     sw2=5;
                     my1=6;
                     my2=7;
                     break;
                  }
            }
         prg=1;
         ac();
         while(TRUE)
            {
               if(yvs==1)//t1_s==0 silindi***********************************************************************
                  yavas();
               switch(sw2)
                  {
                     case 4:
                        if(input(pin_b4))
                           break;
                        else
                           goto devam;
                     case 5:
                        if(input(pin_b5))
                           break;
                        else
                           goto devam;
                  }
            }
         devam:
            carpan_2=carpan;
            tmr0_2=get_timer0();
            carpan=0;
            set_timer0(0);
            kapat();
            while(TRUE)
               {
                  if(yvs==1&&t1_s==0)
                     yavas();
                  switch(sw1)
                     {
                        case 4:
                           if(input(pin_b4))
                              break;
                           else
                              goto devam2;
                        case 5:
                           if(input(pin_b5))
                              break;
                           else
                              goto devam2;
                     }
               }
         devam2:
            tmr0=get_timer0();
            carpan_kontrol=carpan-carpan_2;//son sayım ile ilk sayım arasında farkı carpan_kontrol değişkenine ata
            if(carpan_kontrol<0)//
               carpan_kontrol=carpan_kontrol*(-1);
            if(carpan_kontrol>2)
               continue;
            carpan=(carpan+carpan_2)/2;
            t_tmr0=(tmr0+tmr0_2)/2;
            tmr0_2=0;
            pals=(carpan*255)+(t_tmr0*2);
            y_pals=pals-((pals*5)/100);
            pals=0;
            set_timer0(0);
            carpan1=make8(carpan,0);
            carpan2=make8(carpan,1);
            write_eeprom(0,prg);
            write_eeprom(1,sw1);
            write_eeprom(2,sw2);
            write_eeprom(3,my1);
            write_eeprom(4,my2);
            write_eeprom(5,t_tmr0);
            write_eeprom(6,carpan1);
            write_eeprom(7,carpan2);
            delay_ms(500);
            output_low(pin_c2);
            break;
      }
  return;
}
#use delay(clock=4000000)
void test()
{
   delay_ms(1000);
   output_high(pin_c2);//PROGRAMI ADIM ADIM GÖRMEK İÇİN YAPILAN EKLEME İŞİN BİTİNCE SİL
   delay_ms(2000);//PROGRAMI ADIM ADIM GÖRMEK İÇİN YAPILAN EKLEME İŞİN BİTİNCE SİL
   output_low(pin_c2);//PROGRAMI ADIM ADIM GÖRMEK İÇİN YAPILAN EKLEME İŞİN BİTİNCE SİL
   output_high(pin_c6);
   delay_ms(1000);
   output_high(pin_c5);
   while(input(pin_b4)==1)
      delay_ms(50);
   output_low(pin_c5);
   delay_ms(20);
   output_low(pin_c6);
   return;
}
#use delay(clock=4000000)
void ac2()
{
   switch(sw2)
      {
         case 5:
            if(input(pin_b5)&&input(pin_b0)&&input(pin_b6))
               break;
            else
               return;

         case 4:
            if(input(pin_b4))
               break;
            else
               return;
      }
   output_low(pin_c4);
   output_low(pin_c5);
   output_low(pin_c3);
   i_h=1;
   mtc=0;
   yon=1;
   switch(my2)
      {
         case 7:
            output_low(pin_c6);
            output_high(pin_c7);
            break;
         case 6:
            output_low(pin_c7);
            output_high(pin_c6);
            break;
      }
   delay_ms(250);
   if(d_a==1)
      return;
   output_high(pin_c5);
   setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);
   set_timer1(0);
   enable_interrupts(int_timer1);
   enable_interrupts(GLOBAL);
   return;
}
#use delay(clock=4000000)
void kapat2()
{
   switch(sw1)
      {
         case 4:
            if(input(pin_b4)&&input(pin_b7)&&input(pin_b0))
               break;
            else
               return;
         case 5:
            if(input(pin_b5))
               break;
            else
               return;
      }
   output_low(pin_c4);
   output_low(pin_c5);
   output_low(pin_c3);
   i_h=1;
   mtc=0;
   yon=0;
      switch(my1)
      {
         case 6:
            output_low(pin_c7);
            output_high(pin_c6);
            break;
         case 7:
            output_low(pin_c6);
            output_high(pin_c7);
            break;
      }
   delay_ms(250);
   if(d_a==1)
      return;
   output_high(pin_c5);
   setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);
   set_timer1(0);
   enable_interrupts(int_timer1);
   return;
}
#use delay(clock=4000000)
void ters_yon2()
{
   if(carpan==0)
      return;
   carpan=t_carpan-carpan;
   tmr0=get_timer0();
   tmr0_kontrol=t_tmr0-tmr0;
   if(tmr0_kontrol<0)
      {
         carpan=carpan-1;
         tmr0=255+(t_tmr0-tmr0);
         set_timer0(tmr0);
      }
   else
      {
         tmr0=t_tmr0-tmr0;
         set_timer0(tmr0);
      }
   return;
}

void  emniyet()
{
   if(int_rb_bit)
   {
      output_high(pin_c1);
   if(mtc==1)
      {
         oku=input_b();//portb'yi oku
         oku=oku & 0b11110000;//portb'nin alt 4 bitini maskele
         switch(oku)
            {
               case 240://11110000 mı?(Hiçbir Emniyet Elemanından Sinyal Yok Mu?)
                  break;

               case 208://11010000 mı?
               case 224://11100000 mı?(Sınır switchlerinden aktif olan var mı)
                  output_low(pin_c4);//Ayarlı güç motor çıkışını kapat
                  output_low(pin_c5);//220V kalkış çıkışını kapat
                  output_low(pin_c3);//yavaşlama çıkışını kapat
                  mtc=0;//motor çalışmıyor bilgisi(sıfır:motor çalışmıyor)
                  i_h=1;//ilk hareketin başlangıç çarpan değeri(10 olunca ayarlı güç çıkışı aktif olur)
                  setup_timer_1(T1_DISABLED);//Sıkışma süresi durduruldu
                  if(yon==1&&input(pin_a0))
                     {
                        set_adc_channel(0);//kanal 4'den oto kapanma değerini oku!!!!(yeni devre için kanal 0 olacak)
                       // delay_us(20);
                        dngs=(read_adc()*120)/256;//oto kapanma süresi için, dönmesi gereken döngü sayısını hesapla
                        setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);//tmr1'i dahili sinyale ve 1/8 değere kur
                        set_timer1(3035);//500mS de bir kesme yapması için başlaması gereken değer
                        enable_interrupts(int_timer1);//tmr1 kesmesi aktif
                     }
                  yvs=0;//yavaşlama pasif
                  if(prg==0)
                     {
                        carpan=0;//sayım çarpanını sıfırla
                        set_timer0(0);//tmr0'ı sayım için sıfırla
                     }
                  //delay_ms(250);//tüm sayımları kaçırmamak için motor duruncaya kadar bekle
                  break;//kesme çıkışına git

               case 112:
                  if(yon==1)//kapı açılma yönünde mi?
                     break;//o zaman ön fotoseli görmezden gel
                  if(input(pin_a3)&&prg==0)//dur-açıl özelliği(sayım sırasında da dur açıl kapalı olacak)
                     {
                        d_a=1;//1 olduğu zaman aç fonksiyonu içinde 220V kalkış gerilimi çıkışını aktif etmez(o kısmı atlar)
                        ac2();//aç fonksiyonuna git
                        ters_yon2();//ters yön fonksiyonundan dönüş palsi için çarpan ve tmr0 değerlerini yükle
                        i_h=1;////ilk hareketin başlangıç çarpan değeri(10 olunca ayarlı güç çıkışı aktif olur)
                        output_high(pin_c5);//220V kalkış çıkışı aktif
                        d_a=0;//d_a sıfırlanmazsa normal açılmalarda 220V çıkışı aktif olmaz
                     }
                  else
                     {
                       output_low(pin_c4);//Ayarlı güç motor çıkışını kapat
                       output_low(pin_c5);//220V kalkış çıkışını kapat
                       output_low(pin_c3);//yavaşlama çıkışını kapat
                       mtc=0;//motor çalışmıyor bilgisi(sıfır:motor çalışmıyor)
                       yvs=0;//yavaşlama pasif bilgisi(sıfır:pasif bir:aktif)
                       i_h=1;//ilk hareket için başlanması gereken çarpan değeri
                       setup_timer_1(T1_DISABLED);//Sıkışma süresi durduruldu
                       while(input(pin_b7)==0)//ön fotocell'den sinyal geldiği sürece döngüden çıkma.sinyal gelince harekete kaldığın yerden devam
                           continue;

                       switch(sw1)//kapanma yönü sınır switch'nin basılı olmadığını kontrol eder
                        {
                           case 4://kapanma switch'i portb.4 mi bağlı?
                              if(input(pin_b4))//kapanma switch'i basılı değilse kalkış yap
                                 {
                                    output_high(pin_c5);//220V çıkışını aktif yap
                                    setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);//tmr1 sıkışma için kuruldu
                                    set_timer1(0);//tmr1 başlangıç değerini sıfır yap
                                    enable_interrupts(int_timer1);//tmr1 kesmesi aktif
                                 }
                              break;
                           case 5://kapanma switch'i portb.5 mi bağlı?
                              if(input(pin_b5))//kapanma switch'i basılı değilse kalkış yap
                                 {
                                    output_high(pin_c5);//220V çıkışını aktif yap
                                    setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);//tmr1 sıkışma için kuruldu
                                    set_timer1(0);//tmr1 başlangıç değerini sıfır yap
                                    enable_interrupts(int_timer1);//tmr1 kesmesi aktif
                                 }
                              break;
                        }
                     }
                  break;

               case 176:
                  if(yon==0)
                     break;
                  output_low(pin_c4);//Ayarlı güç motor çıkışını kapat
                  output_low(pin_c5);//220V kalkış çıkışını kapat
                  output_low(pin_c3);//yavaşlama çıkışını kapat
                  mtc=0;//motor çalışmıyor bilgisi(sıfır:motor çalışmıyor)
                  yvs=0;//yavaşlama pasif bilgisi(sıfır:pasif bir:aktif)
                  i_h=1;//ilk hareket için başlanması gereken çarpan değeri
                  setup_timer_1(T1_DISABLED);//Sıkışma süresi durduruldu

                  while(input(pin_b6)==0)
                     continue;
                  switch(sw2)
                        {
                           case 4:
                              if(input(pin_b4))
                                 {
                                    output_high(pin_c5);//220V çıkışını aktif yap
                                    setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);//tmr1 sıkışma için kuruldu
                                    set_timer1(0);//tmr1 başlangıç değerini sıfır yap
                                    enable_interrupts(int_timer1);//tmr1 kesmesi aktif
                                 }
                              break;
                           case 5:
                              if(input(pin_b5))
                                 {
                                    output_high(pin_c5);//220V çıkışını aktif yap
                                    setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);//tmr1 sıkışma için kuruldu
                                    set_timer1(0);//tmr1 başlangıç değerini sıfır yap
                                    enable_interrupts(int_timer1);//tmr1 kesmesi aktif
                                 }
                              break;
                        }
                  break;
            }
      }
    output_low(pin_c1);
    int_rb_bit=0;
    //return;
   }

}

void pals_sayim()
{
   if(tim0_bit)
   {
      output_high(pin_c0);
   carpan=carpan+1;
   set_timer1(0);
   if(t1_s==1)
      {
         tmr0=get_timer0();
         pals=(carpan*255)+(tmr0*2);
         if(pals>=geri)
            {
               output_low(pin_c4);//Ayarlı güç motor çıkışını kapat
               output_low(pin_c5);//220V kalkış çıkışını kapat
               output_low(pin_c3);//yavaşlama çıkışını kapat
               mtc=0;//motor çalışmıyor bilgisi(sıfır:motor çalışmıyor)
               t1_s=0;//sıkışma kapalı
               geri=0;//geri açılırkenki pals bilgisi vardır(23cm için)
            }
      }
   else
      if(i_h<10)//ilk hareket için gerekli çarpan değeri oldu mu?
         i_h=i_h+1;//omadıysa çarpanı bir artır
      else
         if(prg==1||pals>=y_pals)//sayım aktif mi veya yavaşlama noktasına gelindi mi?
            {
               yvs=1;//yavaşlama aktif olacak
               output_low(pin_c4);//ayarlı güç çıkışını kapat
               output_low(pin_c5);//220V çıkışını kapat
               output_high(pin_c3);
            }
         else//hayır yavaşlama noktası veya sayım aktif değil
            {
               output_low(pin_c5);//220V çıkışı kapalı
               output_high(pin_c4);//ayarlı güç çıkışı aktif
            }
         delay_ms(10);
        output_low(pin_c0);
        tim0_bit=0;
   }

}

void  t1_kesme()
{
   if(tim1_bit)
   {
      if(mtc==1)//motor çalışıyor mu
      if(yon==0)//motor çalışıyor.yön kapanma mı?(kapanmaysa geri açıl)
         {
           d_a=1;
           ac2();
           ters_yon2();//ters yön için çarpan değerlerini yükle
           tmr0=get_timer0();//timer0 oku
           pals=(carpan*255)+(tmr0*2);//palsi hesapla
           geri=pals+3161;//geri açılma miktarı
           t1_s=1;//t1_sıkışma aktif bilgisi yüklendi
           d_a=0;
           output_high(pin_c5);
         }
       else//yön açılma dur ve geri dön
         {
            setup_timer_1(T1_DISABLED);//timer1 saymayı durdursun
            output_low(pin_c4);//ayarlı güç motor çıkışını kapat
            output_low(pin_c5);//220V çıkışı kapalı
            output_low(pin_c3);
            mtc=0;
            //delay_ms(250); değiştirildi***********************************************************************
         }
   else//hayır motor çalışmıyor otomatik kapanma yap
      {
         set_timer1(3035);//otomatik kapanma başlangıç sayım süresini yükle(500ms'de bir kesme verecek)
         if(dngs>=okn)//otomatik kapanma sayısı döngü sayısına eşit mi
            {
               kapat2();
               okn=0;
            }
         else
            okn=okn+1;//
      }
     //delay_ms(10);
     tim1_bit=0;
     return;
   }
}

void stop()
{
   if(ext_bit)
   {
      if(mtc==1)
      {
          output_low(pin_c4);//Ayarlı güç motor çıkışını kapat
          output_low(pin_c5);//220V kalkış çıkışını kapat
          output_low(pin_c3);//yavaşlama çıkışını kapat
          setup_timer_1(T1_DISABLED);
          mtc=0;//motor çalışmıyor bilgisi(sıfır:motor çalışmıyor)
          yvs=0;
          i_h=1;
          while(input(pin_b0)==0)
           // delay_ms(50);********************************************************************
          if(prg==1)
            {
               output_high(pin_c1);
               setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);
               set_timer1(0);
               enable_interrupts(int_timer1);

            }
      }
      //delay_ms(10);
      ext_bit=0;
      return;
   }
}

mokan

bu şekilde olunca kesmedeki hassasiyeti yakalayamama ihtimalim var.ra4 den ucundan tmr0 kesmesi ile encoder sayımı yapıyorum.kesmelerin hassas olması lazım.ama aklımda bulunacak bir yöntem.güzelmiş :)