timer1 vede ext kesmesi birlikte kullanım sorun(ÇÖZÜLDÜ

Başlatan huskapukaya, 03 Haziran 2009, 13:48:22

huskapukaya

herkese merhaba;
arkadaşlar ben picle triak kontrolu yapmak istiyorum. bunun içinde şöyle bi program yazdım. şimdilik bu programla sadece ac sinyalinin iki kesme arasını hesaplamaya çalışıyorum. ama ilginç bir problemle karşı karşıyayım.


program:
#include <16f877A.h>  
#device ADC=10
#fuses hs,noWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD 

#use delay(clock=20000000)  
#use rs232 (baud=9600, xmit=pin_C6, rcv=pin_C7, parity=N, stop=1) 

#include <string.h>
#include <stdlib.h>
#include <math.h>

int16 i=0;


#priority ext,timer1

#int_ext
void  EXT_isr(void) 
{

 enable_interrupts(int_timer1); 
 
 printf("%ld",i);
  printf ("\n\r");
  i=0;

}



#int_timer1
void timer1_kesme()
{
set_timer1(65526);
i++;



}




void main ()
{

setup_spi(SPI_SS_DISABLED);

setup_ccp2(CCP_off);
setup_ccp1(CCP_off);


             

setup_timer_1(T1_INTERNAL|T1_div_by_1);
set_timer1(65526);

ext_int_edge( h_to_l );
   enable_interrupts(global);
  enable_interrupts(int_ext);
   enable_interrupts(int_timer1); 
 set_adc_channel(0);
      

   while(1)
   {


   }
   
}


sorun şöyle proteus ta b0 pinine 100 hz lik bir kare dalga veriyorum(ac sinyal de böyle olmayacak zero cross kullanacam ama şimdilik sorun bu değil sanırım yani :D ) vede seri porttan okuduğum değer 480 gibi birşey yani  i değişkeni sıfırlanmadan önce 450 - 500 arası bir değer veriyor.
benim hesabıma göre
kesme süresi= Tosc x(bölme oranı)x(65536-TMR1 değeri)

ki buradanda 2 usn kesme süresi çıkar. 500 le çarparsak 1000 yani 1 ms çıkar halbuki bu değerin 10 ms olması lazım değilmi?

nerede hesap hatası yapıyorum.
lütfen yardım...

huskapukaya

çok şaşırtıcı bi durum var(en azından benim için) i değişkenini int32 yapınca bu seferde okuduğum değer 240 ile 250 arasında oluyor. ilgiyi anlayamadım.

Ziya

ccp modülünün capture modunu kullan, daha çok işine yarar.

external interrupt flag'ini sıfırlamak için b0 pinini bir kere okutman gerekir.
Bu günden sonra hiç kimse sarayda, divanda, meclislerde ve seyranda Türk dilinden başka dil kullanmaya. (13 Mayıs 1277) Karamanoğlu Mehmet Bey

Salih

2 usn çok kısa bir süre.
ASM List'e bakarsan, CCS timer1 kesmesine girdiğinde çıkıncaya kadar
30 adet komut işliyor. Buda yaklaşık 6 usn ediyor.
Herhalde kesme süresini en azından 6usn den büyük olacak şekilde ayarlamak  gerekiyor.

huskapukaya

cevaplar için teşekür ederim
10 us a ayarladım süreyi ama sonuç değişmedi sanırım ziya arkadaşımızın dediği gibi ext kesmesinin flag ını sıfırlamak lazım biraz onuda denedim ama çok kayıp oluyor. galiba en temizi ccp modülü olacak. ben ilerleme kaydedersem burada kodu yazarım

tekrar teşekür ederim...

huskapukaya

sanırım oldu. cevap veren arkadaşlara teşekürler.
bu hali ile ccp1 den süreyi hesaplıyıp ext kesmesiylede triak a sinyal gönderebiliyorum.
 
#include <16f877A.h> 
#device ADC=10
#fuses hs,noWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD

#use delay(clock=20000000) 
#use rs232 (baud=9600, xmit=pin_C6, rcv=pin_C7, parity=N, stop=1) 



int16 i=0,x,j;




#priority ext,ccp1

#int_ext
void  EXT_isr(void)
{
 clear_interrupt(int_ext); 

delay_us(x);
 output_high(pin_d0);
 delay_us(100);
  output_low(pin_d0);

} 

#int_ccp1
void  ccp1_isr(void)
{
set_timer1(0); 
 
i=ccp_1;
j=i;
 printf("%ld",i);
  printf ("\n\r"); 

}








void main ()
{

setup_spi(SPI_SS_DISABLED);

setup_ccp2(CCP_off);
setup_ccp1(CCP_CAPTURE_RE);

setup_timer_1(T1_INTERNAL|T1_div_by_8);
set_timer1(0); 


    

ext_int_edge( h_to_l );
  


   enable_interrupts(global);

   enable_interrupts(int_ccp1);
     enable_interrupts(int_ext); 
 set_adc_channel(0);
     

   while(1)
   {

x=j;


   }

   }