TODOPIC

Microcontroladores PIC => Primeros pasos - Iniciación a los microcontroladores => Mensaje iniciado por: psoto en 08 de Febrero de 2012, 11:08:08

Título: Retardo de 30seg PIC16F84a
Publicado por: psoto en 08 de Febrero de 2012, 11:08:08
Hola amigos de todopic, es la primera vez que escribo en este foro, y quisiera que me
ayuden a corregir este programa para el PIC16f84a a 4Mhz.

Lo que me piden hacer es lo sgte. hacer un retardo de 30seg. para activar y
desactivar dos relays. Las salidas deben ser controladas por un solo switch.
Al inicio el switch esta abierto y cuando lo cierro las salidas activaran los
relays despues del retardo de 30seg. Despues de que transcurrio un tiempo mayor
al retardo se abre el switch y las salidas desactivaran los relays despues del
retardo de 30seg.

El problema que tengo es que no siempre el retardo dura los 30seg. a veces solo
dura 15seg u otras veces son solo 20seg.Uso la libreria RETARDOS.INC del libro
Desarrollo de Proyectos con Microcontroladores PIC16f84A.

Aqui dejo el codigo del programa y el circuito que estoy simulando en proteus.
Título: Re: Retardo de 30seg PIC16F84a
Publicado por: todopic en 08 de Febrero de 2012, 13:25:23
El programa, parece estar bien... creo que es error de la simulación...
Título: Re: Retardo de 30seg PIC16F84a
Publicado por: psoto en 08 de Febrero de 2012, 17:58:12
Gracias por responder amigo. Si el programa esta bien porque no se cumple el tiempo de retardo. He puesto un contador a las
salidas y no llega a 30 seg. A veces llega a 25seg o a 15seg.

Título: Re: Retardo de 30seg PIC16F84a
Publicado por: jorsss en 20 de Marzo de 2012, 10:57:12
Hola psoto prueba usando interrupciones por TMR0 y colocando contadores... luego chekeas estos contadores con operaciones XOR y revisando el bit Z del registro STATUS para saber si estan en la cuenta que necesitas...

Una pequeña guia... si cargas el tmr0 con 0x0C4 al inicio del programa y por cada interrupcion del mismo... colocando dos contadores por ejemplo COUNT_1 y COUNT_2 al primero lo cargas con (en decimal) 100 y al segundo con 6... por cada interrupcion podes descontar COUNT_1 cuando este llegue a cero descontas COUNT_2 y volves a cargar COUNT_1 con 100 y asi hasta ke COUNT_2 llega a cero sabras que habran pasado 30 segundos EXACTOS