Autor Tema: Pausas extensas (XC8)  (Leído 1108 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado leo_gladiador

  • PIC10
  • *
  • Mensajes: 2
Pausas extensas (XC8)
« en: 29 de Agosto de 2015, 16:22:00 »
hola soy nuevo en xc8 , una consulta,como realizo pausas extensas(de horas) en xc8 ,es decir lo que quiero hacer es presionar un botón  y que cambie el estado de un pin  luego de un tiempo(1hora) determinado vuelva a cero.

Esta funcion no se si es eficiente  para realizar lo que quiero hacer

void pausa(unsigned int tiempo)
{
  unsigned int __tiempo;
  for (__tiempo = tiempo; __tiempo > 0; __tiempo--)
  {
    __delay_ms(1000);
  }
}


saludos   :-/

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Pausas extensas (XC8)
« Respuesta #1 en: 29 de Agosto de 2015, 19:29:03 »
No es nada eficiente siquiera poner un delay,

Y hablar de hacer un delay por horas me afecta mucho mas xD.

Solucion usa un timer con preescaler + un cristal de 32768Hz + interrupciones.
Esto te va a dar masomenos exacto la "hora" (Al menos mas exacto que usando delays) y no te va a poner al micro en un estado que no lo podes sacar, ya que va a estar encerrado en ese delay.
Si te interesa el consumo lo podes mandar a dormir. etc etc etc.

Igual depende del PIC que tengas. Aun asi si queres insistir en utilizar delays, no te queda otra que lo que hiciste. Pero vuelvo a repetirte, me parece que tiene un 0% en eficiencia.
Y por ahi el ultimo delay para completar no deberia ser de 1000. Ya que el for ( con su suma,resta,comparacion ) te produce una parte del delay. A no ser que exactamente midas cuanto es que tarda el for y lo ajustes muy exacto seguro que te vas a pasar/faltar algunos segundos. Encima es complejo de "simularlo" por que tardaria DEMASIADO.

La otra es usar un timer de 16bits y tratar de crear una base de tiempo. Utilizar el cristal mas bajo de frecuencia que tengas de esa forma es mas facil. crear esos delays o de ultima el timer.
Como te dije usando un cristal de 32768Hz de entrada al PIC, con preescaler de 1/8. si cargas 4096 en el timer, tenes una interrupcion cada 1 minuto. Conta 60 de esas y listo.
Si lo metes al timer directo y el PIC corre a otra frecuencia, entonces la interrupcion seria cada 15seg. Y deberias contar 240 interrupciones.
« Última modificación: 29 de Agosto de 2015, 20:32:33 por KILLERJC »


 

anything