Timer con PIC12F629. Tiempos

Hola gente del foro, hace mucho no pasaba por aca, y ahora ando necesitando si me pueden dar una manito con esto.

ME "he hecho" un temporizador con el PIC 12F629, para que controle 3 tiempos.
EL programita seria este:
Código:
'--------------------------INICIO------------------------------------
TRISIO = %111001  'GP4 y GP5 y 3 son entradas; GP0 y GP1 y 2 son salidas
CMCON = %111111  'deshabilita comparadores
GPIO = 0  'pone a 0 todas las salidas
WaitUs 0  'establece una demora para el oscilador interno
'--------------------------NOMBRO VARIABLES------------------------
Symbol llave = GPIO.3  'Determ puerto 4 llave
Symbol intermedio = GPIO.4  'Determ puerto 3 el medio
Symbol rele = GPIO.1  'Determ pto 1 220V
Symbol contador = GPIO.2  'Numero de ciclos llevados = dias
'--------------------------CERO------------------------------------
	timer:  'Programa gral
				If llave = 1 Then  'Condicional, si la llave esta prendida
				Goto tiempo2  'responde con tiempo2
				Else  'sino
				Goto tiempo1  'responde tiempo1
				Endif  'fin del condic
'--------------------------PRIMERO----------------------------------
	tiempo1:  'Tiempos para 1
				If intermedio = 1 Then
				Goto tiempointermedio  'Vaya a tiempointermedio
				Else
		rele = 1
		WaitMs 8
		rele = 0
		WaitMs 8
				Endif
	Goto timer
'--------------------------SEGUNDO----------------------------------
	tiempo2:  'Tiempos para 2
				If intermedio = 1 Then
				Goto tiempointermedio  'Vaya a tiempointermedio
				Else
		rele = 1
		WaitMs 10
		rele = 0
		WaitMs 10
				Endif
	Goto timer
'--------------------------TERCERO---------------------------------
	tiempointermedio:  'Tiempos para el medio
		rele = 1
		WaitMs 1
		rele = 0
		WaitMs 5
	Goto timer
'--------------------------FIN--------------------------------------
End


(NOTA: Si, el inicio, donde seteo los puerto y todo eso lo saque copy-paste de internet.:oops:)

Aparentemente, probandolo en PROTEUS y en PIC Simulator. no da errores.(y) Pero,mi conflicto viene aca:

Los tiempos que puse para probar el programa son infimos, yo necesito tiempos de 18hs(64800000 ms), 12hs(43200000 ms), etc. Valores en horas de medio día en adelante.

Hay algun problema si pongo esos calores en el programa? Es factible? En caso de ser SI, con mucho error sera?


Una vez mas les agradezco recontra re mil muchisisismo la buena onda, la generosidad de su tiempo y conocimientos y la paciencia.

SAludos!!!
 
Última edición por un moderador:
es muy facil

es incrementar una variable, yo no programo en basic pero si en C y cuando hago tiempos cortos como de us puedo obtener horas

segun tu tienes ya los segundos

cada vez que llege un segundo a 60 incrementas una variable minuto y cuando llegue a 60 incrementas hora y cuando hora llegue a 24 incrementas a dias

muy facil con 4 bytes tienes:

un byte para 60 segundos
otro byte para 60 minutos
un byte para horas 24
y un byte para 31 dias

bien facil no?
 
Osea, vos decís que esta mal usar la "funcion WaitMs???

Medio que si entendí tu explicación medio que no. Este micro tiene un "clock" de 4Mhz, no deberia tener encuenta eso, para hacer aumentar la variable? Porque siendo asi me aumentaria en 1 la variable segundos por cada ciclo, y eso serian 4.000.000/s, o he entendido todo MUY mal??

Pero resumiendo, esta mal usado, o no se puede usar la funcion WaitMs??
 
Es mejor que uses los timers del PIC, el 12F629 tiene el Timer 0 de 8 bits y el Timer1 de 16 bits.
Con el Timer 1 puedes alcanzar periodos más largos que con el Timer 0.

Una de las ventajas del Timer 1, es que cuenta con oscilador externo, y si colocas en ese oscilador un cristal de 32768 Hz, puedes hacer que desborde cada 1000 ms. (1 segundo)
De esa forma tienes un RTC (Reloj en tiempo real) muy preciso.

También puedes hacer que cuente internamente usando el reloj del sistema.
Lo configuras para que desborde sobre tiempos fáciles de calcular, por ejemplo, cada 1, 10, 100, o 500 ms.
Y así haces lo que mencionó TRILO-BYTE. Eso evita el uso de WaitMS que congelará al microcontrolador.
 
Ha bueno, ahora me pongo a investigar sobre eso. LA verdad que es muy poco lo que se, y creí que con eso andaba.
Espero estarlos molestando de nuevo, pero para mostrarle algo mas terminado jaja..

PD: UN pregunta asi sin fin de seguir alargando el post, que significa que se congelaria el micro, y porque pasaria?

De nuevo muchas gracias por la onda y el tiempo!
 
Hola...Por que puede realizar una sola tarea a la vez y mientras cuenta el tiempo, no puede hacer otra cosa.
Saludos.

Ric.

Perdón, dije que no la iba a alargar mas.

Pero si lo que yo necesito es que mantenga en alto "una patita" activandome un rele, cuente ese tiempo, y de "de baja la patita".

Debería funcionar lo que estoy planteando no? (según Proteus funciona)

O realmente tengo un error conceptual MUY de base? Contar y tener en alta una patita serian dos tareas? No se toma como que queda en alta y esa tarea ya termino?
 
congelar el micro se refiere a que no hace nada un ejemplo basico

prendo un led rojo
delay(1000); //un segundo de retraso

prendo un led verde
delay(200); //un retardo de 200 milisegundos

¿que pasaria si quiero que ambos prendan simultaneamente respetando ambos su tiempo de encendido y apagado?
 
congelar el micro se refiere a que no hace nada un ejemplo basico

prendo un led rojo
delay(1000); //un segundo de retraso

prendo un led verde
delay(200); //un retardo de 200 milisegundos

¿que pasaria si quiero que ambos prendan simultaneamente respetando ambos su tiempo de encendido y apagado?

Si si , te re entiendo. Y ahi si veo mi falla en mi falta de conocimientos.

Ahora, como para salir del paso mi configuración es valida verdad? (Osea, yo quiero activar rele, esperar t segundos, desacativar rele y asi repetir)

PD: en caso de ser afirmativo, prometo en algun momento instruirme para no depender de mi ignorancia.
 
Si si , te re entiendo. Y ahi si veo mi falla en mi falta de conocimientos.

Ahora, como para salir del paso mi configuración es valida verdad? (Osea, yo quiero activar rele, esperar t segundos, desacativar rele y asi repetir)

PD: en caso de ser afirmativo, prometo en algun momento instruirme para no depender de mi ignorancia.

Lo que pretendes se puede hacer perfectamente, lo que pasa es que no son dos tareas, primero se activa el relay y a continuación se espera hasta que se cumpla el tiempo pre-fijado para luego desactivar el relay(son tres operaciones). Según como realices el programa en el tema del conteo del tiempo, se puede decir que el micro se "congela"(no hace otra cosa). Hay formas para que esto no pase(interrupciones, etc) o minimizar el efecto sobre el programa en sí.

Ric.
 
Atrás
Arriba