Puedes subir el código.Tienes razón, olvidé subir el código.
Tal vez exista por ahí algún bug.
Elreypic
Yo creo que la pregunta esta en....Tienes toda la razón respecto a que para un simple temporizador estoy usando muchas cosas y circuiteria que solo complica el proceso. La razón es que al momento, ya tengo este hardware en una tarjeta y no deseo que se desperdicie. La otra razón es que es un proceso de mejora continua y la cúspide es implementar todo esto con un solo sistema microcontrolado .......y la tercera razón es que apenas me inicié y no tengo idea de como hacerlo solamente con un micro y mucho menos, el programa para ello y mientras aprendo, me tomará mucho tiempo y no lo tengo pues debo implementar esto rápidamente.
- ¿Por que usar todo eso?
Con solo un PIC te es suficiente para todo lo que queres. Podes usar uno con mas pines. Y lograrias lo mismo.
-----------------
De no querer cambiar el hardware por ahora.... SI el problema lo tenes en tu programa por lo que parece.
El programa parece correcto, no me fije en la cantidad de la demora... Y entiendo tu punto de vista, entonces nos vamos a basar en solo el Reloj con el PIC.Muchisimas gracias por tu aporte.
Todo correcto por que es un PIC muy simple, es configurar la salida y listo.
Considero que si estas buscando no errarle TANTO, uses un cristal de 32768Hz en los pines del oscilador del PIC, de esa forma tendrias una frecuencia de 8192Hz, o una instruccion ejecutada cada 1/8192 s... O... contar 8192 ciclos para lograr 1 segundo...
Si lo haces con delays.. Por ejemplo con este codigo:Código: ASM
Delay_1s ;8188 cycles movlw 0x65 movwf d1 movlw 0x07 movwf d2 Delay_1s_0 decfsz d1, f goto $+2 decfsz d2, f goto Delay_1s_0 ;4 cycles (including call) return
El problema es que tus CALL, tus MOVWF, etc consumen tiempo tambien.. veamos tu funcion:Código: ASM
CICLO ; movlw b'11000101' ; Esto ocupa 1 ciclo de reloj movwf GPIO ; Esto ocupa 1 ciclo de reloj call TIME ; El CALL ocupa 2 y el return otros 2.. por suerte arriba ya esta contemplado esos 4 ciclos movlw b'11000001' ;1 ciclo de reloj movwf GPIO ; 1 ciclo de reloj call TIME ; Nuevamente tiempo goto CICLO ; 2 ciclos de reloj
Si observas al momento de apagarlo tenemos 2 ciclos mas que son del GOTO... Podemos hacer lo siguiente:Código: ASM
CICLO ; movlw b'00000100' ; Esto ocupa 1 ciclo de reloj xorwf GPIO, F ; Esto ocupa 1 ciclo de reloj call TIME ; El CALL ocupa 2 y el return otros 2.. por suerte arriba ya esta contemplado esos 4 ciclos goto CICLO ; 2 ciclos de reloj
Y ahora si solo necesitamos que esos 2 ciclos del GOTO y los 2 ciclos de antes esten esten incluidos en el total... Si con ese oscilador necesitaba 8192 ciclos. Y tengo 4 que no pertenecerian a la demora en si... entonces necesito una demora de 8188 ciclos.. por lo tanto:Código: ASM
TIME ;8183 cycles movlw 0x64 movwf d1 movlw 0x07 movwf d2 TIME_0 decfsz d1, f goto $+2 decfsz d2, f goto Delay_1s_0 ;1 cycle nop ;4 cycles (including call) return CICLO ; movlw b'00000100' ; Esto ocupa 1 ciclo de reloj xorwf GPIO, F ; Esto ocupa 1 ciclo de reloj call TIME ; El CALL ocupa 2 y el return otros 2.. por suerte arriba ya esta contemplado esos 4 ciclos goto CICLO ; 2 ciclos de reloj
En el caso de usar un cristal de mas frecuencia tambien podes llegar al mismo resultado... Pero teniendo en cuenta que necesitas MINUTOS.. no creo que te afecte el PIC con una velocidad tan baja.
Buenos días NIKHEL,
Anoche me di a la tarea de realizar la simulación de tu circuito en Proteus 8.6 SP2, y tal como tienes el circuito no logré por ningún motivo que funcionara. Este siempre se queda en estado de "RESET" mostranto "000" en los displays y sin realizar el conteo descendente.
Lo primero que arreglé fue el pin flotado del D/U, el cual lo puse en nivel alto (conectado a VDD), pero seguía sin funcionar. Entonces me puse a ver lo que estaba sucediendo y esto fue lo que encontré.HC
Las salidas TC de los contadores (pin 12 de los 74HC190) los llevas a una compuerta NAND de 4 entradas (74HC20), la salida de este a la entrada de un inversor 74HC04 y la salida del inversor hacia el pin E de los contadores (pin 4 del 74HC190). La función de este parte del circuito es detener el conteo cuando este llega a "000", pero noté que los pines de entrada 1 y 2 de dicha NAND los tienes unidos, y esto es lo que estaba ocasionando el problema de inicio, además de que una vez terminado el conteo regresivo, la única manera de volver a comenzar es aplicando un POWER ON RESET (Es decir apagar y volver a encender el circuito).
Entonces lo que hice fue lo siguiente:
1) Desconecté ese pin 1 del pin 2 de la NAND y lo conecté en el pin PL de los contadores (pin 11 del 74HC190) y este a su vez al pin GP0 del microcontrolador PIC12F509.
2) Luego agregué un pulsador el pin del MCLR del microcontrolador (pin 4 del PIC12F509)
3) Realicé la simulación de tu código orginal en MPLAB (la versión antigua 8.92) y tus rutinas de tiempo relamente son exactas (felicidades por eso). Por lo que no encontré ningún problema con tu código. Sin embargo realicé algunas modificaciones.
4) Realicé la simulación en proteus y ahora sí, todo funcionó a la perfección. De esta manera cuando el temporizador o conteo llega a "000", no necesitas realizar un POWER ON RESET, simplemente presionas el pulsador del MCLR en el microcontrolador y el temporizador comenzará su conteo desde su valor programado, en este caso desde "160".
Te he adjuntado tanto el archivo de simulación en proteus como el archivo de ASM del código para el microcontrolador.
También quería mencionarte que otra forma en que puedes hacer el generador de tiempo es usando un oscilador de 32.768 KHz y unos contadores más para dividir la frecuencia hasta obtener un pulso cada minuto. He realizado el inicio de este usando un 74HC4060 y he logrado la frecuencia de salida de 2Hz; por lo que necesito agregar más contadores (o flip-flops) para seguir dividiendo la frecuencia hasta lograr el pulso cada minuto. Una vez que lo tenga listo subo el esquemático a este tema para que le eches una mirada y ya tú decidas lo que más te convenga.
saludos,
elreypic.
Que tal NIKHEL,Un gran saludo!
Pues lo prometido es deuda. Anoche nuevamente me puse a trabajar un poquito en lo de generar la base de tiempo usando solamente lógica digital y un cristal de 32.768KHz. Te comento que los capacitores de 22pF no los coloqué ya que el circuito de prueba lo ensamblé un un protoboard y la capacitancia en este es suficiente. Si lo armas en un PCB es necesario colocar esos capacitores, pero su valor depende de la frecuencia interna del cristal. En la simulación no está conectado el el cristal al circuito integrado 4060, pero indico como debería ser conectado. He adjuntado el archivo de simulación en proteus para que le eches un vistazo. Si tienes alguna pregunta, por favor házmela saber.
En el circuito real debes colocar resistencias limitadoras entre el display de 7 segmentos y el 7447. En la simulación no son necesarias.
elreypic.
Que tal NIKHEL,No sé si lean este comentario pero déjenme decirles que después de implementar los consejos, modificaciones y sugerencias me sirvieron tanto que EL CIRCUITO TEMPORIZADOR ESTÁ FUNCIONANDO PERFECTAMENTE!!!!!
Que bueno saber que finalmente todo funciona muy bien.
Gracias por compartir tu agradecimiento, vaya la redundancia.
Y finalmente cual fue la opción de oscilador que usaste? La del PIC o la del oscilador de 32.678KHz?
elreypic