TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: xabc2007 en 12 de Enero de 2015, 16:51:36

Título: Medir el ancho de un pulso
Publicado por: xabc2007 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
}
Título: Re: Medir el ancho de un pulso
Publicado por: KILLERJC 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.
Título: Re: Medir el ancho de un pulso
Publicado por: xabc2007 en 13 de Enero de 2015, 04:26:53
Gracias, lo pruebo y digo el que,
Título: Re: Medir el ancho de un pulso
Publicado por: Joseph90 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 ....
Título: Re: Medir el ancho de un pulso
Publicado por: xabc2007 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
}