Temporizador para insoladora UV

con cualquier temporizador se puede lograr cualquier tiempo, es decir, para una frecuencia de 4 MHz, con un temporizador de 8 bits, y un preescalar de 1:256 necesitarias que el temporizador desbordara 91552 veces, con un oscilador de 1MHz necesitarias que desbordara 22888 veces, eso para 5 minutos. con mas bits, 16 en tu caso, lo que consigues es redcir el numero de desbordes (interrupciones) que has de esperar, de hecho con 16 bits,m para 5 minutos con el mismo preescalar los desbordes del temporizador que te hacen falta son 357, bastantes menos pero solo es cuestion de esperar mas o menos desbordes del temporizador.
de todas formas yo no haria que temporizara el temporizador todo el tiempo, por ejemplo yo haria un temporizador de 30s, y a partir de ahi contaria, o incluso un temporizador de un segundo, para asi en cada desborde puedes descontar uno en el lcd.

un saludo
 
Buenas:

¿Sabes el método para que se vea 99:99 y pueda escoger el tiempo deseado? En los botones del PIC puede elegir el tiempo deseado, sólo marca 4:15. Al menos quiero uno de 30:00 aunque sea. En realidad para insolar placas son mucho menos minutos dependiendo el tipo de luz a radiar, la altura y el tipo de PCB.

Quiero hacerlo funcionar, cuando lo consiga ya puedo fabricar el circuito impreso. Les mostraré como un manual. He encontrado este ejemplo pero no entiendo ni papa.

Código:
[COLOR=#666666][I]; Este programa lo único que hace es contar desde 20 minutos hasta 0,[/I][/COLOR]
[COLOR=#666666][I]; es decir, no puede ajustarse, a menos que se edite el programa.[/I][/COLOR]
 
	[B]LIST[/B]	P=16F84A
	[B]INCLUDE[/B]	[COLOR=#7F007F]"P16F84A.INC"[/COLOR]
 
	CBLOCK	[COLOR=#0000FF]0CH[/COLOR]
		Reg_50ms[COLOR=#339933],[/COLOR] Tiempo_H[COLOR=#339933],[/COLOR] Tiempo_L
	ENDC
 
[COLOR=#666666][I]; Ojo: En vez de usar una variable llamada TIEMPO debes usar dos:[/I][/COLOR]
  [COLOR=#666666][I]; - Una para almacenar el byte alto de la cantidad de segundos,[/I][/COLOR]
[COLOR=#666666][I];	llamada Tiempo_H.[/I][/COLOR]
[COLOR=#666666][I]; - Una para almacenar el byte bajo de la cantidad de segundos,[/I][/COLOR]
[COLOR=#666666][I];	llamada Tiempo_L.[/I][/COLOR]
[COLOR=#666666][I];[/I][/COLOR]
[COLOR=#666666][I]; ¿Por qué 2 bytes? Pues porque para temporizar hasta 20 minutos se[/I][/COLOR]
[COLOR=#666666][I]; requieren hasta 20 x 60 = 1200 segundos. La cantidad 1200 se representa[/I][/COLOR]
[COLOR=#666666][I]; con mínimo 2 bytes.[/I][/COLOR]
 
	#DEFINE	Alarma		PORTB[COLOR=#339933],[/COLOR][COLOR=#0000FF]0[/COLOR]
 
	[B]ORG[/B]		[COLOR=#0000FF]00H[/COLOR]
	[B]goto[/B]	Inicio
 
	[B]ORG[/B]		[COLOR=#0000FF]04H[/COLOR]
	[B]goto[/B]	Interrupcion
 
Inicio
	bcf		Alarma
	[COLOR=#00007F][B]bsf[/B][/COLOR]		STATUS[COLOR=#339933],[/COLOR]RP0
	movlw	b[COLOR=#7F007F]'11000111'[/COLOR]
	movwf	OPTION_REG
	bcf		Alarma
	bcf		STATUS[COLOR=#339933],[/COLOR]RP0
 
	[COLOR=#00007F][B]call[/B][/COLOR]	LCD_Inicializa
	movlw	[B]high[/B][COLOR=#009900][B]([/B][/COLOR][COLOR=#0000FF].1200[/COLOR][COLOR=#009900][B])[/B][/COLOR]	[COLOR=#666666][I]; Carga el byte alto del tiempo en la variable[/I][/COLOR]
	movwf	Tiempo_H	[COLOR=#666666][I]; Tiempo_H.[/I][/COLOR]
	movlw	[B]low[/B][COLOR=#009900][B]([/B][/COLOR][COLOR=#0000FF].1200[/COLOR][COLOR=#009900][B])[/B][/COLOR]	[COLOR=#666666][I]; Carga el byte bajo del tiempo en la variable[/I][/COLOR]
	movwf	Tiempo_L	[COLOR=#666666][I]; Tiempo_L.[/I][/COLOR]
	[COLOR=#00007F][B]call[/B][/COLOR]	Visualiza_Tiempo	[COLOR=#666666][I]; Visualiza el tiempo en la pantalla.[/I][/COLOR]
 
	movlw	[COLOR=#0000FF].20[/COLOR]			[COLOR=#666666][I]; Se prepara para temporizar.[/I][/COLOR]
	movwf	Reg_50ms
	movlw	[COLOR=#0000FF].60[/COLOR]
	movwf	TMR0
	bcf		INTCON[COLOR=#339933],[/COLOR]T0IF
	[COLOR=#00007F][B]bsf[/B][/COLOR]		INTCON[COLOR=#339933],[/COLOR]T0IE
	[COLOR=#00007F][B]bsf[/B][/COLOR]		INTCON[COLOR=#339933],[/COLOR]GIE		[COLOR=#666666][I]; Habilita interrupciones.[/I][/COLOR]
 
Ciclo
	[B]goto[/B]	Ciclo
 
[COLOR=#666666][I]; Rutina de servicio a la interrupción.[/I][/COLOR]
Interrupcion
	movlw	[COLOR=#0000FF].60[/COLOR]
	movwf	TMR0	[COLOR=#666666][I]; Recarga el TMR0.[/I][/COLOR]
	decfsz	Reg_50ms	[COLOR=#666666][I]; ¿Ya pasó 1 segundo?[/I][/COLOR]
	[B]goto[/B]	Fin_Interrupcion
 
	movlw	[COLOR=#0000FF].20[/COLOR]		[COLOR=#666666][I]; Sí, entonces recarga el registro.[/I][/COLOR]
	movwf	Reg_50ms
 
[COLOR=#666666][I]; Ojo: Aquí se va a realizar el decremento del tiempo, pero[/I][/COLOR]
[COLOR=#666666][I]; es un decremento de 16 bits.[/I][/COLOR]
	decf	Tiempo_L[COLOR=#339933],[/COLOR]F	[COLOR=#666666][I]; Decrementa en 1 el byte bajo.[/I][/COLOR]
	movlw	[COLOR=#0000FF]0xFF[/COLOR]
	subwf	Tiempo_L[COLOR=#339933],[/COLOR]W	
	btfsc	STATUS[COLOR=#339933],[/COLOR]Z	[COLOR=#666666][I]; ¿El resultado es negativo?[/I][/COLOR]
	decf	Tiempo_H[COLOR=#339933],[/COLOR]F	[COLOR=#666666][I]; Sí, entonces decrementa en 1 el byte alto.[/I][/COLOR]
 
	[COLOR=#00007F][B]call[/B][/COLOR]	Visualiza_Tiempo	[COLOR=#666666][I]; Visualiza el tiempo en la pantalla.[/I][/COLOR]
 
[COLOR=#666666][I]; Atención: Anteriormente sólo decrementamos el tiempo, pero NO[/I][/COLOR]
[COLOR=#666666][I]; verificamos si llegó al valor 0. Aquí se realiza esto. Si los[/I][/COLOR]
[COLOR=#666666][I]; dos bytes del tiempo valen 0 significa que el tiempo terminó.[/I][/COLOR]
	movf	Tiempo_H[COLOR=#339933],[/COLOR]F
	btfss	STATUS[COLOR=#339933],[/COLOR]Z	[COLOR=#666666][I]; ¿Vale 0 el byte alto?[/I][/COLOR]
	[B]goto[/B]	Fin_Interrupcion	[COLOR=#666666][I]; No, pues sale de la interrupción.[/I][/COLOR]
	movf	Tiempo_L[COLOR=#339933],[/COLOR]F
	btfss	STATUS[COLOR=#339933],[/COLOR]Z	[COLOR=#666666][I]; ¿Vale 0 el byte bajo?[/I][/COLOR]
	[B]goto[/B]	Fin_Interrupcion	[COLOR=#666666][I]; No, pues sale de la interrupción.[/I][/COLOR]
 
[COLOR=#666666][I]; Llegamos aquí porque los dos bytes valen 0, es decir, el tiempo terminó.[/I][/COLOR]
	[COLOR=#00007F][B]bsf[/B][/COLOR]		Alarma		[COLOR=#666666][I]; Activa la alarma[/I][/COLOR]
	[COLOR=#00007F][B]call[/B][/COLOR]	Retardo_2s	[COLOR=#666666][I]; durante un corto tiempo.[/I][/COLOR]
	bcf		Alarma
 
	bcf		INTCON[COLOR=#339933],[/COLOR]T0IE	[COLOR=#666666][I]; Prohibe la interrupción del TMR0[/I][/COLOR]
						[COLOR=#666666][I]; Para que detener el conteo.[/I][/COLOR]
 
Fin_Interrupcion
	bcf		INTCON[COLOR=#339933],[/COLOR]T0IF	[COLOR=#666666][I]; Borra la bandera de interrupción[/I][/COLOR]
	retfie				[COLOR=#666666][I]; y retorna.[/I][/COLOR]
 
[COLOR=#666666][I]; Subrutina Visualiza_Tiempo.[/I][/COLOR]
[COLOR=#666666][I];[/I][/COLOR]
[COLOR=#666666][I]; Observa que antes sólo se hacía:[/I][/COLOR]
[COLOR=#666666][I];[/I][/COLOR]
[COLOR=#666666][I];	movf	TIEMPO,W[/I][/COLOR]
[COLOR=#666666][I];	call	MinutosSegundos[/I][/COLOR]
[COLOR=#666666][I];[/I][/COLOR]
[COLOR=#666666][I]; Pues ahora el tiempo es de dos bytes y debe hacerse como sigue.[/I][/COLOR]
Visualiza_Tiempo
	[COLOR=#00007F][B]call[/B][/COLOR]	LCD_Borra
[COLOR=#666666][I]; Debes hacerlo así para que funcione. La rutina MinutosSegundos[/I][/COLOR]
[COLOR=#666666][I]; modificada maneja los registros MinutosSegundos_TiempoH y[/I][/COLOR]
[COLOR=#666666][I]; MinutosSegundos_TiempoL.[/I][/COLOR]
	movf	Tiempo_H[COLOR=#339933],[/COLOR]W
	movwf	MinutosSegundos_TiempoH
	movf	Tiempo_L[COLOR=#339933],[/COLOR]W
	movwf	MinutosSegundos_TiempoL
	[COLOR=#00007F][B]call[/B][/COLOR] 	MinutosSegundos [COLOR=#666666][I]; Convierte de segundos a minutos y[/I][/COLOR]
							[COLOR=#666666][I]; segundos.[/I][/COLOR]
	movf	Minutos[COLOR=#339933],[/COLOR]W
	[COLOR=#00007F][B]call[/B][/COLOR]	BIN_BCD
	[COLOR=#00007F][B]call[/B][/COLOR]	LCD_ByteCompleto
	movlw	[COLOR=#7F007F]':'[/COLOR]
	[COLOR=#00007F][B]call[/B][/COLOR]	LCD_Caracter
	movf	Segundos[COLOR=#339933],[/COLOR]W
	[COLOR=#00007F][B]call[/B][/COLOR]	BIN_BCD
	[COLOR=#00007F][B]call[/B][/COLOR]	LCD_ByteCompleto
	return
 
[COLOR=#666666][I]; La rutina BIN_BCD yo la hice, pero puedes usar la que tú tienes.[/I][/COLOR]
[COLOR=#666666][I]; Lo que pasa es que la hice porque no la tengo.[/I][/COLOR]
[COLOR=#666666][I]; Insisto, puedes usar la que tú tienes.[/I][/COLOR]
BIN_BCD
	CBLOCK
		Unidades[COLOR=#339933],[/COLOR] Decenas[COLOR=#339933],[/COLOR] Centenas
	ENDC
 
	movwf	Unidades
	clrf	Decenas
	clrf	Centenas
BIN_BCD_Resta10
	movlw	[COLOR=#0000FF].10[/COLOR]
	subwf	Unidades[COLOR=#339933],[/COLOR]F
	btfss	STATUS[COLOR=#339933],[/COLOR][B]C[/B]
	[B]goto[/B]	Fin_BIN_BCD
 
	incf	Decenas[COLOR=#339933],[/COLOR]F
	movlw	[COLOR=#0000FF].10[/COLOR]
	subwf	Decenas[COLOR=#339933],[/COLOR]W
	btfss	STATUS[COLOR=#339933],[/COLOR][B]C[/B]
	[B]goto[/B]	BIN_BCD_Resta10
 
	clrf	Decenas
	incf	Centenas[COLOR=#339933],[/COLOR]F
	[B]goto[/B]	BIN_BCD_Resta10
 
Fin_BIN_BCD
	movlw	[COLOR=#0000FF].10[/COLOR]
	addwf	Unidades[COLOR=#339933],[/COLOR]F
	movf	Unidades[COLOR=#339933],[/COLOR]W
	swapf	Decenas[COLOR=#339933],[/COLOR]F
	iorwf	Decenas[COLOR=#339933],[/COLOR]W
	swapf	Decenas[COLOR=#339933],[/COLOR]F
	return
 
[COLOR=#666666][I]; Aquí está la subrutina MinutosSegundos modificada para manejar[/I][/COLOR]
[COLOR=#666666][I]; números de 2 bytes. Ésta sí úsala en lugar de la otra.[/I][/COLOR]
MinutosSegundos
	CBLOCK
		Segundos[COLOR=#339933],[/COLOR] Minutos
		MinutosSegundos_TiempoH
		MinutosSegundos_TiempoL
	ENDC
 
	clrf	Minutos		[COLOR=#666666][I]; Borra los minutos.[/I][/COLOR]
[COLOR=#666666][I]; Le resta 60 al tiempo que está almacenado en las variables[/I][/COLOR]
[COLOR=#666666][I]; MinutosSegundos_TiempoH y MinutosSegundos_TiempoL.[/I][/COLOR]
MinutosSegundos_Resta60
	movlw	[COLOR=#0000FF].60[/COLOR]
	subwf	MinutosSegundos_TiempoL[COLOR=#339933],[/COLOR]F	[COLOR=#666666][I]; Resta 60 del byte bajo.[/I][/COLOR]
	btfss	STATUS[COLOR=#339933],[/COLOR][B]C[/B]		[COLOR=#666666][I]; ¿Es negativo?[/I][/COLOR]
	decf	MinutosSegundos_TiempoH[COLOR=#339933],[/COLOR]F	[COLOR=#666666][I]; Sí, entonces decrementa en[/I][/COLOR]
										[COLOR=#666666][I]; 1 el byte alto.[/I][/COLOR]
	btfsc	MinutosSegundos_TiempoH[COLOR=#339933],[/COLOR][COLOR=#0000FF]7[/COLOR]	[COLOR=#666666][I]; ¿El resultado es negativo?[/I][/COLOR]
	[B]goto[/B]	Fin_MinutosSegundos		[COLOR=#666666][I]; Sí, pues ya terminamos de convertir.[/I][/COLOR]
 
	incf	Minutos[COLOR=#339933],[/COLOR]F		[COLOR=#666666][I]; Incrementa en 1 la cantidad de minutos.[/I][/COLOR]
	[B]goto[/B]	MinutosSegundos_Resta60	[COLOR=#666666][I]; Sigue revisando si hay más minutos.[/I][/COLOR]
 
Fin_MinutosSegundos
	movlw	[COLOR=#0000FF].60[/COLOR]		[COLOR=#666666][I]; Le suma 60 a la cantidad de tiempo ya que [/I][/COLOR]
					[COLOR=#666666][I]; previamente se le restó 60 y el resultado[/I][/COLOR]
					[COLOR=#666666][I]; fue negativo.[/I][/COLOR]
	addwf	MinutosSegundos_TiempoL[COLOR=#339933],[/COLOR]W
	movwf	Segundos
	return
 
	[B]INCLUDE[/B]	[COLOR=#7F007F]"LCD_4BIT.INC"[/COLOR]
	[B]INCLUDE[/B]	[COLOR=#7F007F]"RETARDOS.INC"[/COLOR]
 
	[B]END[/B]
 
Hola

Hace algún tiempo me ayudaron con un problema relacionado con el 555, pues bien me diseñe un pequeño temporalizador para mi insoladora y según la simulación todo parecía ir correctamente luego monte parte del circuito en una protoboar, y hay me percate en que la el oscilador para el buzzer y el temporalizador que activa la alarma de fin de insolacion no funcionaban correctamente ya que al modificar la frecuencia para variar el tono del buzzer este me modificaba también el tiempo de activación, pero no le di mas importancia ya que reajustando la resistencia para el tiempo se corregía el problema. Pus bien me dispuse a montar la PCB y mi sorpresa fue que cuando termina el tiempo de insolación se activa la alarma por un tiempo, pero al hacer que el buzzer suenen con un pitido discontinuo este también me activa el relé haciendo que se encienda la insoladora.


Me he cansado de mirar por el foro he incluso me han comentado que el negativo no lo puedo sacar del out de 555 que es como lo tengo hecho, pero mis conocimientos en electrónica se remontan ha hace ya 20 años con lo que estoy un tanto oxidado por no decir agarrotado el todo, así que me preguntaba si me podrían echar una mano con el tema, les adjunto el esquema de la simulación y el esquema eléctrico definitivo tal y como lo tengo montado en la PCB.


Estoy preparado para que me echen una bronca MONUMENTAL pues seguro he hecho una súper chapuza.


Gracias y un saludo a toda la comunidad
 

Adjuntos

  • esquema definitivo.jpg
    esquema definitivo.jpg
    126.1 KB · Visitas: 33
  • Esquema simulación.jpg
    Esquema simulación.jpg
    94.1 KB · Visitas: 20
Mirá , no miré el planito , pero lo tuyo suena como a fuente chica , suena el buzzer , se queda sin corriente y se resetea , fijate eso.

De la salida del 555 se puede sacar positivo y/o negativo , peeeeeeeeero serán más o menos dos volts menos cada una. Digamos que un 555 alimentado a 12 V , la salida oscila entre 2 y 10 Vdc.

Saludos !
 
La fuente que uso es de 12 V 2.8 VA que si no me equivoco son unos 200 mA pense que setia suficiente pero voy a probara a alimentarlo con 1 A.


Gracias

Nada he comprobado lo que me dices y me sigue haciendo exactamente lo mismo así que no se que hacer estoy perdido del todo puesto que si es como me comentas y y se puede sacar una tensión tanto positiva como negativa del pin out no entiendo por que se me activa el relé intermitentemente después de acabar la insolación.

gracias
 
Última edición:
Hola a todos. Les planteo esta idea: quisiese hacer un temporizador nuevo para la insoladora basado en el 555, pero me gustaría ponerle una cuenta atrás con un display LED de 7 segmentos de 9 a 0, pero basándose en la carga del condensador del 555, es decir, desde que la carga del condensador va desde 1/3 VCC a 2/3 de VCC el display vaya 9 8 7 6 5 4 3 2 1 0. Una red resistiva basada en la combinación 5k 5k 5k del comparador interno del 555 establece los umbrales y 10 comparadores (probablemente lm 339 comparan el valor con la referencia) Con ello saco una secuencia de cuando Vcc es 1/3 la salida en alto es 0, cuando es 1/3 +1/9 es 0 y 1, cuando es 1/3 + 2/3 es 0, 1 y 2 y así. Con puertas lógicas consigo que cuando es 0 sólo esté en alto 0, con 1 sólo 1 y así. El problema es pasar de esa señal a binario. Luego al display no problem. Se aceptan sugerencias. Subo el esquema en livewire.rar
 

Adjuntos

  • Display insoladora.rar
    5.1 KB · Visitas: 29
Ya, si lo que varia es la red resistiva de referencia. No descarto hacerme un vúmetro calculando yo mismo las resistencias para aprender.

Respecto a lo otro, dar gracias a elosciloscopio por echarme una mano y ver una muy buena solución, 1N4148. Con eso direcciono las señales analógicas tal y como quiero hacia el decodificador.
 
Subo el esquema de la solución. Una cosa, no hagáis caso al decodificador que con livewire no va. Una cosa, como comparadores voy a usar 2 lm339 y su equivalente de 1 OA (lm334 creo). Lo que no tengo ni idea es del conversor ni de las puertas lógicas qué modelo emplear. Prefiero CMOS por el tema del voltaje. Tenía apuntado como conversor CD4511. Creo que era para display de negativo (cátodo) común. Tampoco se que modelo emplear (ni qué modelos hay), eso sí rojo. Las puertas son 8 AND de 2 entradas y 8 inversoras. Diodos el clásico 1N4148.

Gracias a todos
 

Adjuntos

  • Display insoladora 2.0.rar
    6.2 KB · Visitas: 49
Hola josefe17

Muy buen circuito aunque pudo haberse hecho con menos IC’s pero de cualquier forma es un buen circuito.

Para que en el Display se vean los números te faltan algunas conexiones las cuales se pueden ver en el circuito que está en el ZIP adjunto.

Reacomodé todo y agregué unos conectores entre las compuertas AND y los diodos para que no se vean tantos alambres.

Hay un(os) circuito(s) que pudiera(n) utilizarse en lugar de los diodos. Es un convertidor de entradas decimal a binario; creo es el 74LS148 solo que sus entradas son negadas; habría que agregar unos inversores.

saludos
a sus ordenes
 

Adjuntos

  • Bórrame A.jpg
    Bórrame A.jpg
    193.5 KB · Visitas: 54
  • Display insoladora(2).zip
    7.8 KB · Visitas: 19
WTF!!!!

Qué demonios es todo eso????!!!! :confused::eek::confused::eek:

No es más facil un contador up/down



Recuerdo que hace muchos años, en mi empresa, vi a un ingeniero que había diseñado una placa tipo Europa, la placa tenía un Z80CPU una EPROM tipo 2764, un teclado de 16 teclas y veintitantos inegrados más.
Le pregunté que que era eso y me respondio...
Nada es un conmutador de 16 canales, uno por cada pulsador :unsure:
Sorprendido le pregunté ¿Y no es más facil utilizar un 74C922 y un decoder 4 a 16?
Me respondio.. Sí, tienes toda la razón pero... ¿Cómo justificamos al cliente que le vamos a cobrar $6000 por algo tan simple?.
Las razones que nos llevan a diseñar cosas de una forma u otra muchas veces son un misterio. :rolleyes:

Un contador contando hacia atras es algo muy simple.

Saludos.
 
Última edición:
A ver...un tema recurrente...es la comparación entre el artefacto y su valor.

Veamos:

Puede ser tan simple como un oscilador con un 555...algo que cuesta unos 3 dólares fabricarlo, pero para alguien que no tiene idea ni forma de hacerlo y lo necesita vale mucho.

Podemos cobrarle entonce slo que querramos, desde 4 dólares en adelante...hasta 1000 o 30000....no importa, porque lo que se cobra es lo que se supo hacer y no la simpleza.

Es más, cuanto más simple se resuelve el problema, es porque mayor era el conocimiento del fabricante...y por lo tanto...más caro aún se puede cobrar.

Lo que he aprendido es que lo simple es muy facil y barato de arreglar...

Saludos.
 
Me cito a mí mismo respondiendo por qué lo hago
Cosas mías, ten en cuenta que es mi primer circuito digital. Mas bién por hacerlo así y no tocar más lo que tengo
Es por hacerlo así. Si lo que hubiese querido hubiese sido un contador desde el principio ya me las habría ingeniado.

@Electronec: No lo subo en PDF porque es descomunal el tamaño de la imagen para captuararlo y al centrarlo se me va todo para los lados.

@MrCarlos: Gracias por tu tiempo, me lo voy a mirar y respondo.

Acabo con una duda: ¿El voltaje que tiene un condensador es proporcional al tiempo que está sometido a una corriente o no? Vamos, ¿su impedancia varís con la carga acumulada o no?
 
Última edición:
Se entiende, se entiende, no te pongas loco!

Hacelo de la manera que quieras, que mas te guste...

pero...si tenes 50 piezas, 50 pueden fallar...si tenes 2 piezas...sólo 2 pueden fallar ;)

Un saludo y suerte
 
Atrás
Arriba