Autor Tema: Medir el ancho de un pulso  (Leído 2962 veces)

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

Desconectado xabc2007

  • PIC12
  • **
  • Mensajes: 62
Medir el ancho de un pulso
« en: 12 de Enero de 2015, 16:51:36 »
Hola a todo el foro, deseo medir el ancho de un pulso mediante el TIMER1 y no lo consigo, es un ejemplo del libro "Compilador C CCS" por lo que tendría que funcionar.

Al ponerlo en el simulador Proteus en el LCD no sale nada y no se lo que puede ser.

Agradezdo toda ayuda.



Adjunto el codigo en C y el esquema.




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

Int16 TFB;                    // Tiempo flanco de bajada
float AP;                     // Valor final del ancho de pulso
int1 nuevopulso=0;            // Entra otro pulso
int1 cambio=0;                //Cambio de flanco de disparo

#int_ext
void funcion_ext_int(){       //Función Interrupción
  if(cambio==0){              // Flanco de Subida
    set_timer1(0);            //Inicializa TMR1
    ext_int_edge(0,H_TO_L);   // Configurar para flanco bajada
    cambio=1;                 // Control de cambio de flanco
  } else {                    // Flanco de Bajada
    TFB=get_timer1();         //Valor del Timer1 para el Flanco de bajada
    ext_int_edge(0,L_TO_H);   //Configurar para flanco subida
    cambio=0;                 //Control de cambio de flanco
    if(nuevopulso==0){        //Fin de pulso...
      nuevopulso=1;           //Pulso a calcular
   }
  }
}
void main() {
  lcd_init();
  setup_timer_1(T1_INTERNAL | T1_DIV_BY_1);     // Configuración TIMER1
  ext_int_edge(0,L_TO_H);                       // Configurar para flanco subida
  cambio = 0;                                   // Control de cambio de flanco
  enable_interrupts(int_ext);                   //Habilitación interrupción RB0
  enable_interrupts(global);                    //Habilitación general
  do {
    if(nuevopulso==1){                           // ¿Pulso nuevo?
    AP = TFB*1.0;                 // Ancho de pulso en microsegundos de Timer1…
                                  // a 4MHZ el T=1us*Timer1
        printf(lcd_putc,"\nPulso = %6.1fuS ", AP);   //Visualiza medida en LCD
 
      nuevopulso=0;             //Pulso medido
    }
  } while (TRUE);              //Bucle Infinito
}

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Medir el ancho de un pulso
« Respuesta #1 en: 12 de Enero de 2015, 19:01:28 »
Mi pregunta es.... definiste los pines del LCD ? Sino me equivoco es asi:

Citar
#define LCD_ENABLE_PIN PIN_C2
#define LCD_RS_PIN PIN_C1
#define LCD_RW_PIN PIN_C0
#define LCD_DATA4 PIN_D4
#define LCD_DATA5 PIN_D5
#define LCD_DATA6 PIN_D6
#define LCD_DATA7 PIN_D7

Aunque viene por default, tal ves sea que esta mal configurado el LCD, podrias tambien agregar que prenda una salida ademas de mostrar y le pones un led, de esa forma podes saber si el problema es la interrupcion o la parte del LCD.

Desconectado xabc2007

  • PIC12
  • **
  • Mensajes: 62
Re: Medir el ancho de un pulso
« Respuesta #2 en: 13 de Enero de 2015, 04:26:53 »
Gracias, lo pruebo y digo el que,

Desconectado Joseph90

  • PIC12
  • **
  • Mensajes: 89
Re: Medir el ancho de un pulso
« Respuesta #3 en: 13 de Enero de 2015, 12:50:10 »
Lo más fácil sería insertar un texto justo después del lcd_init(); y chequear que funciona el LCD. Es importante notar que en CCS como bien dice el amigo KILLERJC hay que configurar primero el fichero LCD.c ....
El problema del hombre no está en la boma atómica, sino en su corazón. Albert Einstein.

Desconectado xabc2007

  • PIC12
  • **
  • Mensajes: 62
Re: Medir el ancho de un pulso
« Respuesta #4 en: 13 de Enero de 2015, 17:16:03 »
PERFECTO. He modificado un poco la configuracion que me dice KILLERJC porque el LCD esta puesto en el puerto C. He encendido tambien un led con un pulsador.

Y como también dice Joseph90 he modificado primero el fichero LCD.c. Ha quedado así:

#define LCD_ENABLE_PIN PIN_C0
#define LCD_RS_PIN PIN_C1
#define LCD_RW_PIN PIN_C2
#define LCD_DATA4 PIN_C4
#define LCD_DATA5 PIN_C5
#define LCD_DATA6 PIN_C6
#define LCD_DATA7 PIN_C7

Muchas gracias a KILLERJC y a Joseph90, y a todo el foro.



El programa en c ha quedado de la siguiente manera:




#include <16f876.h>
#fuses XT,NOWDT
#use delay(clock=4000000)


/////////////////////////////////////////////////////////
//Configuramos el puerto B para el led y el pulsador

#BYTE TRISB = 0X86
#BYTE PORTB = 0X06

//////////////////////////////////////////////////////////

#define LCD_ENABLE_PIN PIN_C0
#define LCD_RS_PIN PIN_C1
#define LCD_RW_PIN PIN_C2
#define LCD_DATA4 PIN_C4
#define LCD_DATA5 PIN_C5
#define LCD_DATA6 PIN_C6
#define LCD_DATA7 PIN_C7
#include <lcd.c>




Int16 TFB;                    // Tiempo flanco de bajada
float AP;                     // Valor final del ancho de pulso
int1 nuevopulso=0;            // Entra otro pulso
int1 cambio=0;                //Cambio de flanco de disparo




#int_ext
void funcion_ext_int(){       //Función Interrupción
  if(cambio==0){              // Flanco de Subida
    set_timer1(0);            //Inicializa TMR1
    ext_int_edge(0,H_TO_L);   // Configurar para flanco bajada
    cambio=1;                 // Control de cambio de flanco
  } else {                    // Flanco de Bajada
    TFB=get_timer1();         //Valor del Timer1 para el Flanco de bajada
    ext_int_edge(0,L_TO_H);   //Configurar para flanco subida
    cambio=0;                 //Control de cambio de flanco
    if(nuevopulso==0){        //Fin de pulso...
      nuevopulso=1;           //Pulso a calcular
   }
  }
}




void main() {
  lcd_init();
  setup_timer_1(T1_INTERNAL | T1_DIV_BY_1);     // Configuración TIMER1
  ext_int_edge(0,L_TO_H);                       // Configurar para flanco subida
  cambio = 0;                                   // Control de cambio de flanco
  enable_interrupts(int_ext);                   //Habilitación interrupción RB0
  enable_interrupts(global);                    //Habilitación general
  do {
 
 //////////////////////////////////////////////////////////////////
 bit_set  (TRISB , 3);  // B3 como entrada, para el pulsador
 bit_clear(TRISB , 2); //  B2 como salida, para el led
 
 if( bit_test(PORTB,3) ==1)   bit_set(portb,2);// Si pulsamos el led-on
 if( bit_test(PORTB,3) ==0) bit_clear(portb,2);// Si no pulsamos el led-off
 
 /////////////////////////////////////////////////////////////////
 
 
    if(nuevopulso==1){                           // ¿Pulso nuevo?
    AP = TFB*1.0;                 // Ancho de pulso en microsegundos de Timer1…
                                  // a 4MHZ el T=1us*Timer1
        printf(lcd_putc,"\nPulso = %6.1fuS ", AP);   //Visualiza medida en LCD
 
      nuevopulso=0;             //Pulso medido
    }
  } while (TRUE);              //Bucle Infinito
}


 

anything