Contar pulsos de reloj externos durante un intervalo de tiempo predefinido (PIC16f877a)

-2

Necesito contar los pulsos de reloj externos durante un tiempo predefinido utilizando PIC16f877a. No sé qué usar, ya sea contador o temporizador o ambos. No sé usar los módulos de temporizador y contador de PIC16f877a. ¡¡Por favor, ayúdame!!

    
pregunta Ezhil Arasan

2 respuestas

1

Para contar cuántos pulsos se producen durante un intervalo de tiempo especificado , use dos módulos de contador / temporizador. (Esta técnica no es específica de Microchip PIC16F877A y se puede adaptar a otros microcontroladores con módulos de contador / temporizador).

  1. Configure un contador / temporizador como contador (fuente de reloj = pin externo).
  2. Configure otro contador / temporizador como temporizador de intervalo (fuente de reloj = reloj de instrucciones).
  3. Borrar el contador.
  4. Habilite el temporizador y el contador (al mismo tiempo, si es posible).
  5. Tan pronto como se complete el intervalo del temporizador, deshabilite el contador y lea el recuento.

Para obtener la latencia más baja, puede probar el intervalo del temporizador completado encuestando el bit de bandera apropiado en el registro del temporizador, pero su firmware no podrá hacer nada más al realizar la medición.

Para obtener la mejor multitarea (el firmware realiza otras acciones mientras el temporizador / los contadores miden los pulsos), use un controlador de interrupción para detectar el intervalo del temporizador completo. Habrá cierta latencia debido al sistema de manejo de interrupciones, asegúrese de leer la sección de interrupciones de la hoja de datos.

Debido a que los pulsos provienen de una fuente externa, normalmente habrá 2-3 etapas de flip flops D para sincronizar la entrada con el reloj de la CPU. Esto es necesario para evitar problemas con metastability , pero introduce una demora de unos pocos ciclos de reloj. Por lo que sé, nadie ha encontrado una mejor manera de protegerse contra fallas metaestables, por lo que solo tiene que compensar la demora si es importante en su aplicación.

Algunos módulos de temporizador / contador tienen un contador de 8 bits, algunos son de 16 bits. Y algunos tienen un preescalador. Por lo tanto, podría haber varias formas posibles de implementar la técnica básica en su microcontrolador, con diferentes compromisos de desempeño. Debe consultar la hoja de datos del microcontrolador para determinar los detalles.

A menudo, los módulos de temporizador / contador admiten otras actividades especializadas, como las comunicaciones en serie (velocidad en baudios) o el temporizador de vigilancia. Si su firmware ya está usando módulos de temporizador / contador, asegúrese de tenerlo en cuenta, ya que estos son recursos limitados en el chip.

También es posible usar contadores externos, pero al agregar más circuitos integrados, se pierde el propósito de usar un microcontrolador.

La hoja de datos de Microchip PIC16F877A es aquí . Por cierto, PIC16F877A es NRND ( No recomendado para nuevos diseños ), y Microchip recomienda PIC16F887 como reemplazo.

    
respondido por el MarkU
0

Use un temporizador y configúrelo para sincronizar en el pin de entrada del temporizador. Tiene 3 temporizadores, Timer0, Timer1 y Timer2. Timer1 es de 16 bits y todos son temporizadores / contadores con precalificadores.

Desde la página 23 de 234 de la hoja de datos, puede establecer T0CS (bit 5 del registro Option_Reg) en 1, que realiza la transición en el pin RA4 / T0CKI. El bit 4, T0SE selecciona el borde en el que se producirá la transición, el bit 3 "PSA" asigna el prescaler al temporizador del perro guardián o al módulo Timer0. Seleccione los valores de preescala con PS2: PS0, bits 2-0 de este registro, la tabla define en qué se dividirá la frecuencia.

El pin RA4 se multiplexa con Timer0, también todos los pines PORTA están mezclados con entradas analógicas (así que no olvide desactivar el periférico ADC).

El temporizador generará una interrupción cuando se desborda, por lo que tendrá una rutina de interrupción del temporizador y borrará el bit.

Por lo general, deberá hacer lo siguiente: 1) entender cómo configurar el temporizador con la configuración que desea 2) escribir una rutina para hacer eso 3) crear una rutina de interrupción.

Comenzando en la página 54 de la hoja de datos le dará una idea de cómo configurar el temporizador para las configuraciones que desea, es decir, escribir ciertos valores en ciertos registros (de modo que tendrá que saber cómo escribir valores en un registro). La rutina de interrupción tendrá un vector de interrupción, también puede encontrar una lista de vectores de interrupción muy profundamente en la carpeta del compilador que viene con MPlab 8, búsquelo en su computadora (se instala allí de manera predeterminada). En general, la interrupción para este dispositivo debe ser el siguiente:

void interrupt Timer0_ISR (void) {      // haz algo de código aquí      T0IF = 0; // borrar el indicador de interrupción }

Lo que recomiendo altamente es leer los documentos del temporizador provistos por Microchip; Los documentos DS51682A y DS51702A que se pueden encontrar en el sitio web de Microchip y que debe configurarse después de revisarlos, no son muy largos, pero comprenderá cómo funcionan.

    
respondido por el Robert Hana

Lea otras preguntas en las etiquetas