lunes, 23 de abril de 2012

Frecuencímetro 16f628-Frequency_counter

Frecuencímetro 16f628
Frequency_counter
Programación en C y Ensamblador
xsetaseta@gmail.com

Debo tener fijación por los frecuencímetros, pero vuelvo a la carga con ellos.
Después de haber realizado el frecuencímetro con el PIC 16f628 frecupla me he dado cuenta de que debido a los cambios realizados desde el 16f84 al 16f628, todo había mejorado. Cuando se utilizaba el 16f84 se tenía que utilizar el Timer0, que estaba sincronizado por la frecuencia del reloj interno, con lo cual se perdían algunos pulsos. Este problema también me ocurrió con el Atmega88, miATa3 , se perdían pulsos.
Resulta que revisando la estructura del 16f628, resulto que había incorporado un contador
Timer1 que si se quería no se sincronizaba con el reloj interno, además de ser de 16 bits.

Ahora todo es mas fácil, les doy las gracias a los ingenieros de Microchip.
Queda por cambiar la conexión del LCD al PIC y la entrada de la frecuencia,reprogramando todo el programa, quedando el circuito como a continuación se muestra.


Esquema del circuito frecupla2.

Una vez simulado el Proteus se monta el prototipo antes de hacer el circuito impreso.

Prototipo frecupla2.

Se ha realizado dos programas, uno e C y otro en C pero con la rutina en ensamblador y con cuenta de 3bytes.
La realización en C fue bastante fácil, poner los contadores de Timer1 a cero, esperar 1 segundo y visualizar el contenido. Hasta he hecho una rutina que me advierte de si la escala es incorrecta.
Programa frecupla en C.

El segundo programa hecho también en C, pero con la rutina en ensamblador es más complejo debido a que también he incrementado el numero de cuentas a 3 bytes para dar mayor precisión.
Program frecupla en C 3 bytes.

La comparación entre uno y otro programa es difícil de precisar.
Cuando la cuenta es de 3 bytes y con frecuencias altas, la precisión de los cristales es un quebradero de cabeza. Comparas dos cristales de 16Mhz de diferentes marcas y el resultado no es el mismo.
Para una mayor precisión deberíamos colocar condensadores ajustables en el cristal de procesador.

En conclusión , la precisión de utilizar un 16f84 a utilizar el 16f628 es abismal, no hay color, los pulsos no se pierden. Muchos montajes no han aprovechado las ventajas del 16f628, solo han sustituido un procesador por otro sin reprogramar.
Entre utilizar un programa u otro es un dilema. El primer programa cuenta en 2bytes (65536) y el segundo 3bytes (16millones). Realmente las precisiones de los cristales no dan para tanto por lo cual daría lo mismo el de 2bytes o el de 3bytes.

Próximamente lo montare en circuito impreso, hasta entonces...

Saludos
SETA43

Juan Galaz

lunes, 16 de abril de 2012

Modificación frecuencímetro - Programación en C

Modificación frecuencímetro
Programación en C
xsetaseta@gmail.com
Después de realizar el frecuencímetro en la placa hacerCI , he decidido reprogramar en C mi frecuencímetro Frecu32 para montarlo en dicha placa.
Es mas que nada probar la programación en C para un PIC 16f628A y 16f84A utilizando el compilador de C CCS.
La única modificación del circuito es colocar un pulsador para cambiar la escala. He utilizado 2 resistencias y un pulsador, es fácil soldarlos por la parte del cobre. De esta forma permite una precisión en la medición.
El caso es que me ha resultado mas difícil de lo que pensaba, el C utilizado en CCS es un poco particular, lo mejor es que cada uno lo averigüe por si mismo.
También me encontré una cosa de lo mas curiosa. La rutina  frecu3 está hecha en ensamblador y los tiempos deben ser exactos. Pues bien el compilador se dedica a optimizarlos, modificándolos para ahorrar unos pocos bytes. Conclusión no me funcionaba el programa como debería. Esto lo descubrí revisando el código ensamblador que devuelve el compilador de C. La solución la encontré con la orden #OPT 0   que evita la modificación del código.
Ahora dejo una cosa pendiente para los que sean puristas. En la lectura de la frecuencia no realiza una parada del contador, por lo que puede ocurrir una medición incorrecta en ocasiones muy concretas, son raras pero pueden ocurrir. Con solo dos o tres instrucciones en el ensamblador se corrigen, lo dejo para la tarea del que quiera montar el circuito.
También sería una buena opción el autorango, fácil de hacer.


Esquema del circuito con un 16f628A
Archivos 16f628A


Montaje del circuito con el 16f628A



Como tengo algún que otro 16f84A decidí intentar meter el programa en los 1024 bytes.
El caso es que se pasa por poco en memoria, lo cual me ha obligado a modificar el programa en C, recortando varias parte para al final entrar.
He tenido que recortar una escala, comentar parte del programa de manejo del LCD que no se utiliza, y por último quitar la presentación. Total que ha ocupado el 98% de la memoria del 16f84A.

Esquema del circuito con un 16f84A
Archivos 16f84A


Montaje del circuito con el 16f84A

Saludos.
SETA43