Haberler:

Forum kuralları güncellendi LÜTFEN  okuyunuz:  https://bit.ly/2IjR3ME

Ana Menü

tek seferlik çalışan komut

Başlatan bulut_01, 13 Temmuz 2014, 22:30:03

bulut_01

iyi aksamalar picproje ailesi uzun zamandır uzak kaldıgım C den baya unutkanlık baslamış sımdı iki tane girişimiz var bu girişler sırayla aktif oldugunda çıkış için tek sefer çalışacak ve duracak kod için yardımlarınızı bekliyorum

#int_timer0 
void TIMER0_isr()
{
set_timer0(60);
if((kltA==1) && (kltK==0) && (anhtr==0)) // bunun altındaki kod tek seferlik çalışacak

........                                                              // 10 sn (a1) portu aktif olcak sonra pasif olacak

if((kltA==0) && (kltK==1) && (anhtr==0)) // bunun altındaki kod tek seferlik çalışacak


..........                                                        // 10 sn (a1) portu aktif olcak sonra pasif olacak
}
YENİLMEZ..

Mucit23

int1 flag1=0,flag2=0;

#int_timer0 
void TIMER0_isr()
{
set_timer0(60);
if((kltA==1) && (kltK==0) && (anhtr==0)) // bunun altındaki kod tek seferlik çalışacak
{
    if(flag1==0)
    {
          flag1=1;     
                      //Tek seferlik çalışmasını istediğin kodlar buraya
    }
}                                             // 10 sn (a1) portu aktif olcak sonra pasif olacak
if((kltA==0) && (kltK==1) && (anhtr==0)) // bunun altındaki kod tek seferlik çalışacak
{
    if(flag2==0)
    {
          flag2=1;     
                      //Diğer Tek seferlik çalışmasını istediğin kodlar buraya
    }
}
..........                                                        // 10 sn (a1) portu aktif olcak sonra pasif olacak
}

Flagları sıfırlarsan if içerisine yazdığın kodlar işlenirse tekrar çalıştırılır.

bulut_01

tsk ederim mucit yanlız tmr0 kesmesının ıcındekı tek sefer çalısan kod 10 sn port aktıf yapıp sonra pasif yapacak kodda sıkıntı var tmr0 ıcındekı 10 sn aktıf ederken ana programdakı kod aksamaması lazım onu yapamadım.

#include <12F675.h> 
#fuses INTRC_IO,NOPROTECT,NOWDT,NOMCLR
#use delay(clock=4000000)
#use fast_io(a)

int1 kltA=0;
int1 kltK=0;
int1 anhtr=0;
int1 flag1=0,flag2=0;
int8 n=0;

#int_timer0  
void TIMER0_isr() 
{

set_timer0(60);
if((kltA==1) && (kltK==0) && (anhtr==0)) // bunun altındaki kod tek seferlik çalışacak
{
if(flag1==0)
    {
   flag1=1; 
    output_high(pin_a1);
   n++;
   if(n==100)
  output_low(pin_a1);
   n=0;
  
 }
          
   }     
    


}


void main()
{ 

 setup_timer_1(T1_DISABLED);
 setup_comparator(NC_NC_NC_NC);
 setup_vref(FALSE);
 setup_adc(adc_off);
 setup_adc_ports(no_analogs);
 setup_timer_0(RTCC_INTERNAL|RTCC_DIV_2); 
 enable_interrupts(GLOBAL); 
 enable_interrupts(INT_TIMER0);
 
 set_tris_a(0B00000100);
 output_a(0x00);
 
 while(1)
 {
kltA=input(pin_a2);
kltK=input(pin_a4);
anhtr=input(pin_a5);
 
      if((kltA==1) && (kltK==0) && (anhtr==0))
{

 output_high(pin_a0);
 delay_ms(800);
 output_low(pin_a0);
}

 if((kltA==0) && (kltK==1) && (anhtr==0))
 {
 output_high(pin_a0);
 delay_ms(800);
 output_low(pin_a0);

}

}
}
YENİLMEZ..

bulut_01

YENİLMEZ..

Mucit23

Tamam işte kodunun aksamasını istemiyorsan interrupt içinde yapacaksın.

İlk önce timer0 kesmesini 20ms aralıklarla oluşacak şekilde ayarla. 1.saniyelik saat sinyali sağlamamız lazım.

iki adet extradan değişken tanımla

int sayac=0,saniye=0,

Şimdi kodunu aşağıdaki gibi düzenle. Gerekli açıklamayı kod üzerinde yaptım
#int_timer0  
void TIMER0_isr() 
{
set_timer0(60);

if((kltA==1) && (kltK==0) && (anhtr==0)) // bunun altındaki kod tek seferlik çalışacak
{
    if(flag1==0)
    {
       flag1=1;  //10 saniyelik Sayacın çalışması için flag1'i 1 yaptık
       output_high(pin_a1); 
    }      
}     
    
if(flag1==1)  //Flag1=1 ise sayacı çalıştır. 
{
   sayac++; //Her 20 ms aralıklarla kesme oluşuyor. O halde Bu sayacı 50 defa arttırırsak 1 saniye geçmiş olur
   if(sayac>=50) //1 Saniyelik zaman dilimi gerçekleşti
   {
       Saniye++;// Saniye Değerini 1 Arttırıyoruz.
       if(Saniye>=10) //10 saniyelik süre dolmuş. Gerekli işlemleri bu if içerisinde yap
       {
            sayac=0,Saniye=0; //Sayacları sıfırlıyoruz.
            flag1=0; //Flag'ı sıfırlıyoruzki tekrardan sayacımız çalışmasın
            output_low(pin_a1);//Çıkışı kapatıyoruz.
       }
   }
   
}

}