int_ext Kesme Fonksiyonu Algılama Sorunu

Başlatan NaMcHo, 03 Ağustos 2010, 15:34:56

NaMcHo

Yapmak istediğim şeyi yazayım önce kısaca :
Bir tane 7Segment display surekli 0-9 arası sayıyor,int_ext kesmesini uyguladığımda  display duruyor  kesme fonksiyonu yapılıyor sonra display kaldığı yerden devam ediyor saymaya...Sorun ise şu:
B0/INT ucuna bağladığım buton herzaman düzgün çalışmıyor bazen 4 defa basınca,bazen 3 bazen de 1 defa bastığımda int_ext kesmesini aktif ediyor...(Veya biraz basılı tutunca.) Bunun sebebi nedir?Nasıl düzelte bilirim?

Isis dosyası: http://hotfile.com/dl/59521790/8410df2/haricikesmedenemesi.rar.html
Yazdığım kod:
#include <16f877.h>
#fuses XT,NOWDT,NOPROTECT,NOPUT,NOWRT,NODEBUG,NOLVP,NOCPD,NOBROWNOUT
#use delay(clock=4MHz)
#use fast_io(b)
#use fast_io(d)

int sayac[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7c,0x07,0x7f,0x6f};
int x;
#int_ext
void RB0_kesmesi(void)
{
   if(input(pin_b0))
   {
      output_high(pin_b1);
      delay_ms(1000);
      output_low(pin_b1);
      delay_ms(250);
      output_high(pin_b2);
      delay_ms(50);
      output_low(pin_b2);
      output_high(pin_b3);
      delay_ms(50);
      output_low(pin_b3);
      output_high(pin_b4);
      delay_ms(50);
      output_low(pin_b4);
      output_high(pin_b5);
      delay_ms(50);
      output_low(pin_b5);
      output_high(pin_b6);
      delay_ms(50);
      output_low(pin_b6);
      output_high(pin_b7);
      delay_ms(50);
      output_low(pin_b7);    
   }
}


void main()
{
   setup_psp(psp_disabled);
   setup_timer_1(t1_disabled);
   setup_timer_2(t2_disabled,0,1);
   setup_adc_ports(no_analogs);
   setup_adc(adc_off);
   setup_ccp1(ccp_off);
   setup_ccp2(ccp_off);
   
   set_tris_b(0x01);
   set_tris_d(0);
   output_b(0);
   output_d(0);
   x=0;
   
   enable_interrupts(int_ext);
   enable_interrupts(GLOBAL);
   
      
      while(1)
      {
      output_d(sayac[x]);
      delay_ms(250);
      x++;
      if(x==10)
      x=0;
      }
   
}


muhittin_kaplan

if(input(pin_b0))
neden yaptınız ? ne gerek var

NaMcHo

Alıntı yapılan: muhittin_kaplan - 03 Ağustos 2010, 15:37:34
if(input(pin_b0))
neden yaptınız ? ne gerek var
Evet gereksizmiş.Silip denedim sorun duzeldi :)
Teşekkürler.

NaMcHo

#3
Aynı başlık altında farklı birşey daha sormak istiyorum,
Kesme fonksiyonundaki kod cok kaba duruyor ben bunu kısaltmak icin şöyle birsey yapmak istedim
#int_ext
void RB0_kesmesi(void)
{
      output_high(pin_b1);
      delay_ms(500);
      output_low(pin_b1);
      delay_ms(100);
      for(y=2;y<8;y++)
      {
         portb.y=1;
         delay_ms(50);
         portb.y=0;
         delay_ms(50);
      }
}


Expecting a structure/union hatası verdi...
Structure olusturmadan bu tarz kısa bir yontem varmı aceba?(yine portb.(pinismini belirtcek şekilde))

JKramer

Şöyle bir şey kullanabilirsiniz:
for(i=1;i<129;i<<=1)
{
    output_b(i);
    delay_ms(50);
    output_b(0);
}

NaMcHo

#5
Alıntı yapılan: JKramer - 03 Ağustos 2010, 18:36:51
Şöyle bir şey kullanabilirsiniz:
for(i=1;i<129;i<<=1)
{
    output_b(i);
    delay_ms(50);
    output_b(0);
}


Şöyle yazdım ben
#int_ext
void RB0_kesmesi(void)
{     
      z=0b00000100;
      output_high(pin_b1);
      delay_ms(500);
      output_low(pin_b1);
      delay_ms(100);
      for(y=2;y<8;y++)
      {
         output_b(z);
         delay_ms(50);
         z=z<<1;
      }
      output_b(0);
}

Şunu sormustum portb.1 diye kullanım varmı diyede sanırım yok.
Teşekkürler ilginiz için.

ehliseyf

dahada kısaltılmak istenirse toggle kullanılabilir.
Code'm mu oturturum !