16F628A PortB değişim kesmesi.

Başlatan bögüalp, 07 Temmuz 2011, 21:36:42

bögüalp

Merhaba,
3x4 tuş takımından okuduğum bilgileri portb nin alt dört bitinde gösteren bir program yazmak istiyorum.CCS C de portb değişim kesmesini kullanan bir kod yazdım.İlk yazdığım deneme kodunda sorunsuz çalıştı.Fakat tuşa basılı tuttuğum sürece kesmenin sürekli oluştuğunu gördüm.Yani tuşa basılı tuttuğum sürece kesme alt programına dallanıyor çalıştırıp çıkıyor, ana programa geçince tekrar kesme oluşturuyor.Bunu önlemek için tuşa basılınca kesme alt programına dallanan fakat tuş bırakıldığında kesmeden çıkan bir kesme alt programı yazdım.İlk deneme programında RA3 ü tuşa basılınca yakıp bırakılınca söndürdüm.Sorunsuz çalıştı.Fakat portb ye çıkış verdiğim zaman program while döngüsünde takılı kaldı.Bunu nasıl düzeltebilirim?Aynı sıkıntı CCP1 modülünden pwm sinyali alırkende geçerli.Program aşağıda.Şimdiden teşekkürler.


#include <16F628A.h>

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES XT                       //Crystal osc <= 4mhz for PCM/PCH , 3mhz to 10 mhz for PCD
#FUSES NOPUT                    //No Power Up Timer
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOMCLR                   //Master Clear pin used for I/O
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD                    //No EE protection

#use delay(clock=4000000)

#use fast_io(a)
#use fast_io(b)

#define  sut1  pin_a0
#define  sut2  pin_a1
#define  sut3  pin_a2

#define  sat1  pin_b4
#define  sat2  pin_b5
#define  sat3  pin_b6
#define  sat4  pin_b7

int   tus=0;
int8  isaret=0xF0;
int8  b=0;

#int_RB
void numara_okuma()
{   

      while((isaret && input_b()) != 0)
        { 
         output_b(tus);
        }
         output_b(0x00);         
}
void cpu_init()
{
   delay_ms(150);
   //setup_ccp1(CCP_PWM);
   //setup_timer_2(T2_DIV_BY_16,170,1);
   //set_pwm1_duty(0);
    
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
 
   enable_interrupts(INT_RB);
   enable_interrupts(GLOBAL);
 
 
   set_tris_b(0xF0);
   set_tris_a(0xF0);
   output_b(0x00);
   output_a(0x00);
}
int tus_takimi_oku() 
{
   output_high(sut1);
      if(input(sat1))
      tus=1;
      if(input(sat2))
      tus=4;
      if(input(sat3))
      tus=7;
      if(input(sat4))
      tus=10;     
   output_low(sut1);
   output_high(sut2);
 
      if(input(sat1))
      tus=2;
      if(input(sat2))
      tus=5;
      if(input(sat3))
      tus=8;
      if(input(sat4))
      tus=0;     
   output_low(sut2);
   output_high(sut3);

      if(input(sat1))
      tus=3;
      if(input(sat2))
      tus=6;
      if(input(sat3))
      tus=9;
      if(input(sat4))
      tus=11; 
   output_low(sut3);
   return tus;
}
void main()
{
   cpu_init();  
   while(1)
    {  
     tus_takimi_oku();
    }
}
Bögü Alp