Autor Tema: Problema con ccp para medir el ancho de un pulso  (Leído 4656 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado eleazar83

  • PIC10
  • *
  • Mensajes: 3
Problema con ccp para medir el ancho de un pulso
« en: 02 de Noviembre de 2009, 02:59:04 »
Hola a todos:

Miren tengo un problema para medir el ancho del pulso mediante el modulo ccp. Les envio 2 programa q tengo(en teoria hacen lo mismo), lo compilo y cero problemas, pero en el proteus no me muestra el valor del ancho del pulso.



#include <16f876.h>
#fuses XT,NOWDT
#use delay(clock=4000000)
#include <lcd.c>
#byte pir1=0x0c
#include <math.h>

int1 nuevopulso=0;    //Entra otro pulso
int16 TFB=0;         //Tiempo flancos
int16 TFS=0;
int16 TF=0;
float AP;         //Valor final del ancho de pulso
int1 cambio=0;        //Cambio de flanco de disparo

#int_ccp1
void ccp1_int(){      //Función interrupción
  if(cambio==0){      //Flanco de subida
    TFS=CCP_1;      //Carga del valor del registro CCPR1 en flanco subida
    setup_ccp1(CCP_CAPTURE_FE); //Configuración modo Captura en flanco de bajada
    cambio=1;                   //Control de cambio de flanco
  } else {                      //Flanco de Bajada
  TFB=CCP_1;      //Carga del valor del registro CCPR1 en flanco bajada
    setup_ccp1(CCP_CAPTURE_RE); //Configuración modo Captura en flanco de subida
    cambio=0;                   //Control de cambio de flanco

  if(nuevopulso==0){            //Fin de pulso...
   nuevopulso=1;           //pulso a medir
  }
  }
}

void main() {

lcd_init();
disable_interrupts(global);
setup_timer_1(T1_INTERNAL);   //Configuración TMR1
setup_ccp1(CCP_CAPTURE_RE);  //Configuración modo Captura en flanco de subida
cambio = 0;                  //Control de cambio a 0

enable_interrupts(int_ccp1);   //Habilitación interrupción modulo CCP
enable_interrupts(global);     //Habilitación interrupción global
 
  do {
    if(nuevopulso==1){     //¿Pulso nuevo?
       TF=(TFB-TFS);   //Ancho de pulso.
       AP = TF*1.0;      //Ancho de pulso en microsegundos (a 4MHz:1us)
      printf(lcd_putc,"\nPulso = %6.1fuS ", AP);
     nuevopulso=0;             //Pulso ya medido, espera nuevo
   }
  } while (TRUE);
}


--------------------------------------------------------------------------------------------------------------------

Este es el otro programa:


#include <16f876.h>
#fuses XT,NOWDT
#use delay(clock=4000000)
#include <lcd.c>
#byte PIR1=0x0C


float AP=0.0;         //Valor final del ancho de pulso
int1 nuevopulso=0;

long rise,fall;
int16 TF=0;
#int_ccp2
void isr()
{
   rise = CCP_1;
   fall = CCP_2;
   nuevopulso=1;
        // CCP_1 is the time the pulse went high
}                                 // CCP_2 is the time the pulse went low
                                  // pulse_width/(clock/4) is the time

                                  // In order for this to work the ISR
                                  // overhead must be less than the
                                  // low time.  For this program the
                                  // overhead is 45 instructions.  The
                                  // low time must then be at least
                                  // 9 us.

void main()
{
 
   setup_ccp1(CCP_CAPTURE_RE);    // Configure CCP1 to capture rise
   setup_ccp2(CCP_CAPTURE_FE);    // Configure CCP2 to capture fall
   setup_timer_1(T1_INTERNAL);    // Start timer 1

   enable_interrupts(INT_CCP2);   // Setup interrupt on falling edge
   enable_interrupts(GLOBAL);

    do {
    if(nuevopulso==1){     //¿Pulso nuevo?
       TF=(rise-fall);   //Ancho de pulso.
       AP = TF*1.0;      //Ancho de pulso en microsegundos (a 4MHz:1us)
      printf(lcd_putc,"\nPulso = %6.1fuS ", AP);
     nuevopulso=0;             //Pulso ya medido, espera nuevo
   }
  } while (TRUE);
}

Les adjunto tambien el archivo de proteus para q lo puedan simular.
Ojala me puedan ayudar. Y decirme cual es mi error.




Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Problema con ccp para medir el ancho de un pulso
« Respuesta #1 en: 02 de Noviembre de 2009, 10:38:40 »
Mira por aquí sobre técnicas de medición de pulsos.


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado eleazar83

  • PIC10
  • *
  • Mensajes: 3
Re: Problema con ccp para medir el ancho de un pulso
« Respuesta #2 en: 02 de Noviembre de 2009, 18:00:57 »
Gracias suki.
Hice la prueba con un pic 18f452 y cambie en el programa la libreria de #include16f876 a #18f452 y me corrio como debia. Mi duda porque con el pic 16f876 no lo puedo simular en el proteus y con el 18f452 si???. Envio los archivos correpondientes para q lo puedan ver.

Desconectado robertohm

  • PIC10
  • *
  • Mensajes: 6
Re: Problema con ccp para medir el ancho de un pulso
« Respuesta #3 en: 21 de Febrero de 2010, 16:25:21 »
Hola,
Me da la impresión que estoy dando los mismos pasos que eleazar83. Actualmente estoy usando el libro de C CCS, asta ahora lo poco que he hecho era en ensamblador con MPLAB, y el C  es nuevo para mi.
Añado a este hilo que he probado el programa directamente en el PIC en mi entrenador y va perfectamente, incluso con osciloscopio, generador, y mide bien el pulso, con sus límites en baja y en alta, el cual no encuentro los datos que apunte.

La pena es que el proteus no haga ni mu. Para mi que no entra en la interrupción y se queda esperando.

Desconectado albertoei

  • PIC10
  • *
  • Mensajes: 4
Re: Problema con ccp para medir el ancho de un pulso
« Respuesta #4 en: 19 de Agosto de 2010, 01:30:30 »
Gracias suki.
Hice la prueba con un pic 18f452 y cambie en el programa la libreria de #include16f876 a #18f452 y me corrio como debia. Mi duda porque con el pic 16f876 no lo puedo simular en el proteus y con el 18f452 si???. Envio los archivos correpondientes para q lo puedan ver.

buenas noches. el mismo problema, alguien me podria indicar como se puede solucionar esto y otra consulta esta line del codigo que funcion tiene: #byte PIR1=0x0C

gracias por la ayuda


 

anything