Tal como dice el titulo, quiero medir el periodo/frecuencia de una señal cuadrada usando un 89s52. En si la idea de como hacerlo la tengo, pero no por mas que lo intente, la medicion es mala. El rango de la señal sera de 10Hz en adelante, hasta lo que soporte el uC, en mi caso para la aplicacion que estoy tratando de hacer, hasta 50 kHz me alcanza.
Mi idea original fue:
- Uso interrupcion externa (osea c/vez que llega un evento se produce una interrupcion) y la configuro para que se active con flanco descendente.
- Uso un timer para medir el tiempo entre flanco y flanco, de esa forma debiera obtener el periodo/frecuencia.
- Por ultimo envio el resultado por puerto serie a una Pc.
Haciendo esto, siempre mis mediciones fueron malas, tanto en proteus, como en la practica.
Entonces trate de verlo del punto de vista de la frecuencia:
- Configuro un timer para que salte una interrupcion c/100 mSeg.
- Uso interrupcion externa, la configuro para que se active con flanco descendente y cada vez que salte una interrupcion sumo un contador.
- Al terminar de producirse los 100mSeg, paro de contar los pulsos y multiplico el contador por 10 (x pulsos en 100 mSeg => 10*x pulsos en 1 Seg).
- Envio el resultado por puerto serie.
Nuevamente, la medicion es incorrecta en el proteus, no llegue a probarlo en la practica.
Mi duda entonces es (independientemente del uC):
- ¿Son correctos los procedimientos?
- Los codigos estan hechos en C y compilados en keil, ¿habra diferencia en la ejecucion en codigo ASM?
Mi idea original fue:
- Uso interrupcion externa (osea c/vez que llega un evento se produce una interrupcion) y la configuro para que se active con flanco descendente.
- Uso un timer para medir el tiempo entre flanco y flanco, de esa forma debiera obtener el periodo/frecuencia.
- Por ultimo envio el resultado por puerto serie a una Pc.
Haciendo esto, siempre mis mediciones fueron malas, tanto en proteus, como en la practica.
Entonces trate de verlo del punto de vista de la frecuencia:
- Configuro un timer para que salte una interrupcion c/100 mSeg.
- Uso interrupcion externa, la configuro para que se active con flanco descendente y cada vez que salte una interrupcion sumo un contador.
- Al terminar de producirse los 100mSeg, paro de contar los pulsos y multiplico el contador por 10 (x pulsos en 100 mSeg => 10*x pulsos en 1 Seg).
- Envio el resultado por puerto serie.
Nuevamente, la medicion es incorrecta en el proteus, no llegue a probarlo en la practica.
Mi duda entonces es (independientemente del uC):
- ¿Son correctos los procedimientos?
- Los codigos estan hechos en C y compilados en keil, ¿habra diferencia en la ejecucion en codigo ASM?