CCP1 no modo Capture

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

CCP1 no modo Capture

Mensagempor rks000 » 04 Abr 2011 14:58

Estou tentando usar o CCP1 no modo de CAPTURE do PIC 16F877A para ler um sensor e não estou conseguindo. Nem entrar na rotina de interrupção está entrando(testei no proteus) Estou usando o CCS. akguem pode me ajudar?



Código: Selecionar todos

#int_CCP1

CCP1_isr()
{
  if(cambio == 0)
   {     
      TFS = CCP_1;     
      setup_ccp1(CCP_CAPTURE_FE); // Configura para pegar a borda de descida
      cambio=1;                   
   } 
   else
   { 
      TFB = CCP_1;
      setup_ccp1(CCP_CAPTURE_RE); // Configura para pegar a borda de subida
      cambio = 0;
      if(novopulso == 0)
      {         
         novopulso = 1;           
      }
   }
 
   clear_interrupt(int_CCP1);
}



void main()
{
   
  setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_psp(PSP_DISABLED);
   setup_spi(FALSE);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_INTERNAL);
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC);
     setup_vref(FALSE);
   enable_interrupts(INT_EXT);
   enable_interrupts(INT_CCP1);
   setup_ccp1(CCP_CAPTURE_RE);
   enable_interrupts(GLOBAL);

   restart_wdt();
   
   i = 0;
   while (TRUE)
   {
      restart_wdt();


       if(novopulso)
      {

         TF = ( TFB - TFS ); 
         FQ1 = TF * 0.2;
         printf ("\nCCP1 1 %1.0f ", FQ1 );
         novopulso = 0;           
      }

   }   
}

void lersensor1(void)
{
   int ka = 0;
   novopulso = 1;
   output_low(pin_c2);
   set_tris_c(0b10111110);          // set direction to be output   
   enable_interrupts(INT_CCP1); 
   setup_ccp1(CCP_CAPTURE_RE);
   delay_us(50);
     
}
rks000
 
Mensagens: 1
Registrado em: 30 Mar 2011 17:11

Mensagempor rudsomlima » 07 Abr 2011 13:37

Já tive problema com o CCP no Proteus. Simplesmente não funcionou.
rudsomlima
Bit
 
Mensagens: 37
Registrado em: 26 Nov 2006 21:00

Mensagempor lasfclestat » 20 Abr 2011 11:25

ola...

Estou tentando fazer um exemplo como segue a baixo, eu consigo gerar uma onda quadrada de periodo de 26ms, porém não estou conseguindo gerar a interrupção do CCP1, está faltando alguma coisa no codigo? Tambem estou tentando ler um sensor ultrasonico.

Muito Obrigado

Código: Selecionar todos
#include <16F877A.h>
#device adc=8

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES HS                       //High speed Osc (> 4mhz)
#FUSES NOPUT                    //No Power Up Timer
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NODEBUG                  //No Debug mode for ICD
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD                    //No EE protection
#FUSES NOWRT                    //Program memory not write protected

#use delay(clock=20000000,RESTART_WDT)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)

int8 capture_rising_edge;
int8 got_pulse_width;
int16  ccp_delta;
int flag = 0;

#INT_TIMER2
void  TIMER2_isr(void)  //timer2 interrupt
{
   if (flag)
   {
      output_high(pin_c0);
      flag = 0;
   } else
   {
      flag = 1;
      output_low(pin_c0);   
   }
   clear_interrupt(int_timer2);// clear timer2 interrupt's flag   
}

#int_ccp1
void ccp1_isr(void)
{
static int16 t1_rising_edge;

// If current interrupt is for rising edge.
if(capture_rising_edge)
  {
   setup_ccp1(CCP_CAPTURE_FE);
   capture_rising_edge = FALSE;
   t1_rising_edge = CCP_1;
  }
else
  {
   setup_ccp1(CCP_CAPTURE_RE);
   capture_rising_edge = TRUE;
   ccp_delta = CCP_1 - t1_rising_edge;
   got_pulse_width = TRUE;
  }

}

//====================================
main()
{
int16 pulse_width_ms;
int16 local_ccp_delta;

got_pulse_width = FALSE;
capture_rising_edge = TRUE;

setup_ccp1(CCP_CAPTURE_RE);
setup_timer_1(T1_INTERNAL | T1_DIV_BY_8 );
setup_timer_2(T2_DIV_BY_16,255,16);
enable_interrupts(INT_TIMER2);
enable_interrupts(INT_CCP1);
enable_interrupts(GLOBAL);

while(1)
  {
   if(got_pulse_width)
     {
      disable_interrupts(GLOBAL);
      local_ccp_delta = ccp_delta; 
      enable_interrupts(GLOBAL);

      pulse_width_ms = local_ccp_delta / 125;
      printf("%lu ms \n\r", pulse_width_ms);
      got_pulse_width = FALSE;
     }

  }

}
"Se existe algo como repousar em nome da verdade. Então vós e teus amados, qualquer que sejam as dificuldades, não devem ficar separados indefinidamente!"

Ferrari Caim Lestat
lasfclestat
Bit
 
Mensagens: 47
Registrado em: 29 Jan 2008 15:48
Localização: Campinas


Voltar para PIC

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante

x