external ile timer1 overflow interruptın aynı anda kullanÄ

Başlatan freewalks, 06 Mayıs 2007, 15:24:29

freewalks

arkadslar merhabalar

ccs ile yapılan projemde hem timer1 overflow hem de rb0 pininden external interrupt almak istiyorum ama biri çalısırken diğeri çaısmıyor

bunun sebebi sizce ne olabilir???

ilginiz için simdiden tesekkürler

mikroserdar

dostum benim yaptığım bi darbe sayacı devresi var. kodunu da yazacağım bi parçasını. RB0 ucundan darbe geldiği zaman aynı anda timer1'de aktif oluyor.

#INT_EXT   //Her darbe geldiğinde Bu interrupt aktif oluyor. Böylece diğerini aktif ediyor.                  
void button_isr()
{
 enable_interrupts(int_timer1);
}




#int_timer1
void timer1_isr()
{
 set_timer1(50000);
 seco++;
 if(seco==secon)
{
 number=number+1;
 seco=0;
 disable_interrupts(int_timer1);
 set_timer1(50000);
}
 else
 number=number;
}
   
void CPU_SETUP()

{

 set_tris_b(0x11);
 set_tris_a(0x20);
 setup_timer_1(t1_internal | t1_div_by_1 );
 enable_interrupts(global);
 disable_interrupts(int_timer1);
 secon=0;
 set_timer1(50000);
 ext_int_edge(H_TO_L);      
 disable_interrupts(INT_EXT);
 setup_timer_0(rtcc_internal | rtcc_div_1);
 disable_interrupts(int_timer0);
 enable_interrupts(global);
 set_timer0(0);

}

kesmeleri kurarken ilk önce timer1 ve INT_EXT disable yapıyorum. Daha sonra programın ileri sayfalarında  enable_interrupts(INT_EXT); diyorum. Bu kodu yazar yazmaz dış kesme aktif oluyor ve her darbe geldiği zaman  H_to_L durumunda enable_interrupts(int_timer1); yapıyorum INT_EXT interrupt'ının içerisinde. burada timer1 kaç adet darbe gelirse gelsin timer!'e yüklenen değere göre displayler artıyor. Yani her darbe geldiği zaman display artmıyor. atıyorum 10ms içerinde ki darbeleri sayıyor.
mikrodentleyici yaşam biçimidir.

mikroserdar

dostum benim yaptığım bi darbe sayacı devresi var. kodunu da yazacağım bi parçasını. RB0 ucundan darbe geldiği zaman aynı anda timer1'de aktif oluyor.

#INT_EXT   //Her darbe geldiğinde Bu interrupt aktif oluyor. Böylece diğerini aktif ediyor.                   
void button_isr()
{ 
  enable_interrupts(int_timer1);
}




#int_timer1
void timer1_isr()
{
  set_timer1(50000);
  seco++;
  if(seco==secon)
{
  number=number+1;
  seco=0;
  disable_interrupts(int_timer1);
  set_timer1(50000);
}
  else
  number=number;
}
     
void CPU_SETUP()

{

  set_tris_b(0x11);
  set_tris_a(0x20);
  setup_timer_1(t1_internal | t1_div_by_1 );
  enable_interrupts(global);
  disable_interrupts(int_timer1);
  secon=0;
  set_timer1(50000);
  ext_int_edge(H_TO_L);      
  disable_interrupts(INT_EXT);
  setup_timer_0(rtcc_internal | rtcc_div_1);
  disable_interrupts(int_timer0);
  enable_interrupts(global);
  set_timer0(0);

}

kesmeleri kurarken ilk önce timer1 ve INT_EXT disable yapıyorum. Daha sonra programın ileri sayfalarında  enable_interrupts(INT_EXT); diyorum. Bu kodu yazar yazmaz dış kesme aktif oluyor ve her darbe geldiği zaman  H_to_L durumunda enable_interrupts(int_timer1); yapıyorum INT_EXT interrupt'ının içerisinde. burada timer1 kaç adet darbe gelirse gelsin timer!'e yüklenen değere göre displayler artıyor. Yani her darbe geldiği zaman display artmıyor. atıyorum 10ms içerinde ki darbeleri sayıyor.
mikrodentleyici yaşam biçimidir.

freewalks

TESEKKÜRLER dostumm
biraz ugrasıyım cevabı veririm ama cözdüm gibi..