Autor Tema: Medición de ancho de pulso externo pic16f876 en c ccs  (Leído 6769 veces)

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

Desconectado JorgeDelgado

  • PIC10
  • *
  • Mensajes: 1
Medición de ancho de pulso externo pic16f876 en c ccs
« en: 26 de Febrero de 2011, 16:57:55 »
Medición de ancho de pulso externo pic16f876.

Hola.

Estoy tratando de medir el ancho de un pulso externo con un microcontrolador pic16f876, el problema es que solo consigo medir pulsos aproximadamente de 0.524 seg. Esto es debido a la configuración del Timer1. El Timer1 se desborda cada 65536 pulsos y con el divisor de frecuencias de 8us, esto multiplicado me da 0.524 seg. pero no paso de ahi. El programa en que lo estoy llevando acabo es el c ccs compiler. La simulación está en el proteus. La entrada del pulso se realiza por medio de Rb0. Este es el programa:

#include <16F876.h>
#device adc=10

#FUSES XT,NOWDT
#FUSES
#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
float d=0.8;
float velocidad;
float tiempo;

#int_ext
void funcion_ext_int(){       //Función Interrupción
  if(cambio==0){              // Flanco de Subida
    set_timer1(0);            //Inicializa TMR1
    TFB=get_timer1();
    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() {
   int16 q;
   float p;

   setup_adc_ports(AN0);                                   //Canal 0 analógico
   setup_adc(ADC_CLOCK_INTERNAL);    //Fuente de reloj RC

  lcd_init();
  setup_timer_1(T1_INTERNAL | T1_DIV_BY_8); // 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
  
   while (True) {
      
      set_adc_channel(0);           //Habilitación canal0
  
      q = read_adc();                  //Lectura canal0
      p = 90.0 * q / 1022.0;           //Conversión a grados
      printf(lcd_putc, "\f%01.2f Grados\nTiempo = %1.3f S", p,AP);
      delay_ms(10);
        if(nuevopulso==1){  // ¿Pulso nuevo?
            AP = (TFB)*8.0/1000000;
            velocidad=d/AP;                             // a 4MHZ el T=1us*Timer1
            tiempo=d/velocidad;
          }
      
     }
}

Adjunto una carpeta con la simulación.

Saludos y mil gracias.

Desconectado korpaztk

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 202
Re: Medición de ancho de pulso externo pic16f876 en c ccs
« Respuesta #1 en: 04 de Marzo de 2011, 20:11:56 »
recurre a este hilo

http://picmania.garcia-cuervo.net/tecnicas_en_c_4.php

puede que te sea de mucha ayuda para lo que estas haciendo.

saludos.-
Korpaz.
Técnico Electronico.

El Papel Es Mi Mejor Psicologo