Autor Tema: Problemas con SLEEP  (Leído 3943 veces)

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

Desconectado ales

  • PIC10
  • *
  • Mensajes: 33
Problemas con SLEEP
« en: 06 de Mayo de 2008, 19:08:54 »
Hola a todos y gracias de antemano por mirar este tema.
 Les digo primero que he buscado bastante información en el foro sobre el sleep pero tengo un problema que no he hallado respuesta alguna y aqui les va.

Estoy trabajando con el proteus y el CCS con la PIC 18F6620 y necesito ponerla a dormir en varias ocasiones el problema es que solo quiero que se despierte cuando se me active una interrupcion externa, o sea, en un caso que se despierte con int_EXT y en otro con int_EXT1, antes de poner a dormir a la PIC yo inhabilito las demas interrupciones y al Perro Guardian que tambien lo utilizo. Y resulta que después de un tiempo sale de la instrucción de dormir y continúa con la próxima línea abajo del sleep();

 O sea:  Cdo quiero despertar con EXT:
   .
   .
   .
    disable_interrupts(int_TIMER0);
    disable_interrupts(int_TIMER1);
    disable_interrupts(int_TIMER2);
    disable_interrupts(int_EXT1);
     setup_wdt(WDT_OFF);
    sleep();
    continue;
   .
   .
   .
 Esto se hace en el main, y nada pues, al rato continua como si nada.

Gracias a todos.

que puede ser?????


chao.

Desconectado Leon Pic

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3610
    • Impresiones en 3D
Re: Problemas con SLEEP
« Respuesta #1 en: 06 de Mayo de 2008, 21:28:30 »
Hola ales.

Lo que tienes que hacer es en la subrutina de interrupción, chequear cuales de las fuentes despertó al pic. En el caso de que sea el WDT pones la instrucción para que valla a la línea del sleep.

Por ejemplo, en el pic 16f874, deberá chequear el bit TO del registro STATUS, se pone a 0 cuando hubo un desbordamiento del WDT y para poner a 1 el bit TO, lo haces con la instrucción CLRWDT, pero en C, aún no se como hacerlo.

Digamos, en el diagrama de flujo sería así:

estamos en la subrutina de interrupción

                     ¿se puso 0 el bit TO?------>no------>chequeo los demás bit
                                                                          para er quien desperto al PC 
                                  Si

                     Borro al WDT y me dirigo
                          a la instrucción sleep
Jesús dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
Re: Problemas con SLEEP
« Respuesta #2 en: 07 de Mayo de 2008, 01:15:13 »
Creo que lo mejor es que pusieras el programa entero, para ver como lo tienes.

Hola Leon Pic, en C para resetear al perrito es restart_wdt()

Desconectado ales

  • PIC10
  • *
  • Mensajes: 33
Re: Problemas con SLEEP
« Respuesta #3 en: 07 de Mayo de 2008, 12:39:40 »
Gracias por contestar amigos.
 Leon Pic me dices que chequee las subrutinas de interrupción eso ya lo había hecho y el programa no entra a ninguna cuando ocurre el problema, lo que no entiendo es que me das a entender que hay una subrutina para el WDT la cual no conozco y tenía entendido que cuando se desbordaba el WDT el micro se resetea (a mi me pasa así con el WDT), pero en el programa en este caso con el sleep no me ocurre eso tampoco, simplemente continúa en la línea de abajo. Por lo que descarte el WDT y las interruciones también. Cómo único que no siempre se resetee el micro con el WDT si es así cdo si y cdo no???.

 Por otra parte no sé en CCS como acceder directamente a los registros del PIC cosa que me gustaría conocer en algún momento.

Pocher me dices que ponga el código pues ahi les va aunque es un poco extenso en el main entre comentarios puse donde es el problema, aunque ocurre en otras partes del programa tambien, que necesito Dormir al Micro.

Muchas Gracias y Saludos a todos.

Desconectado Gonzalo_BlackHawk

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 519
Re: Problemas con SLEEP
« Respuesta #4 en: 07 de Mayo de 2008, 15:49:29 »
Hola ales, no se como tienes configurado los fuses, pero parece ser el tipico caso de un mal seteo del fuse del watchdog. Si estas usando la instrucción setup_wdt(WDT_OFF), como se ve en tu codigo, debes tener el fuse del perro en NOWDT, porque de lo contrario si colocas el fuse en WDT el watchdog esta siempre activado y la función setup_wdt se invalida. Todas los 18F o por lo menos los que permiten setup_wdt se rigen bajo esta regla.

Una cosa importante a saber, si el micro esta durmiendo el WDT no resetea el mismo, sino que lo despierta y continua ejecutando el codigo inmediatamente contiguo a la instrucción sleep, esto es lo que se conoce como el WDT wakeup. Por eso te sugiero que mire lo de los fuses porque que no se resete el PIC no es señal de que el WDT este desactivado.

En CCS los registros se acceden directamente utilizando el preprocesador #byte y asigando un nombre de variable a las direcciones en memoria de los registros que quieres consultar. CCS no recomienda acceder a los registros directamente, una cuestión de conflicto de ejecuciones que no viene al caso explicar aqui. Yo solo lo utilizo en casos especiales, CCS no brinda solucion a todo y en ciertos casos hay que leer y escribir directamente los registros.

Prueba y luego nos cuentas. Un saludo.
"Siempre piensa si el jugo vale la exprimida..."

"La muerte esta tan segura de vencer que nos da toda una vida de ventaja."

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
Re: Problemas con SLEEP
« Respuesta #5 en: 07 de Mayo de 2008, 16:06:02 »
Muy buena explicación la de Gonzalo, solo añadir que puedes comprobar si el fuse del perro está activo usando WinPic800.

PD. Vaya "programita". Para qué es ese "mostrico" ?

Desconectado Leon Pic

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3610
    • Impresiones en 3D
Re: Problemas con SLEEP
« Respuesta #6 en: 07 de Mayo de 2008, 21:59:20 »
Bueno. Se ve que estaba equivocado. Me alegro que allas echo la corrección Gonza.

Yo sabía que no se reseteaba, pero pensaba que hacía una interrupción. Con la explicación de Gonzalo, tendrías que poner después de la instrucción sleep, una instrucción que valla de nuevo a sleep. Entonces, si se despertó por desbordamiento del WDT, volverá al sleep, pero si se despertó por una interrupción, irá a la rutina de interrupción.

No olvides de chequear lo que te dice Gonzalo.
Jesús dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.

Desconectado ales

  • PIC10
  • *
  • Mensajes: 33
Re: Problemas con SLEEP
« Respuesta #7 en: 08 de Mayo de 2008, 16:07:32 »
Gracias amigos por las explicaciones, y entonces con Gonzalo_BlackHawk se eliminan todas las dudas. El problema entonces es ese que el WDT está despertando y sigue todo como si nada, no debiera ser que poniendolo en OFF antes del sleep ocurra esto pero bueno me forzaron a poner el sleep dentro de un while infinito, y a dormir como la cenicienta. :D :D

Gracias, gracias.

resuelto el problema y ampliados los conocimientos.

Desconectado Leon Pic

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3610
    • Impresiones en 3D
Re: Problemas con SLEEP
« Respuesta #8 en: 08 de Mayo de 2008, 16:14:50 »
No puedes desactivar por software al perro guardian (al menos en la serie 16) ya que se hace desde la palabra de configuración que se graba en el momento de quemar al PIC.

Es un período normal, que el pic esté continuamente despertándose, para eso, en la siguiente línea de la Instrucción sleep, deberás chequear el bit TO, si es 0, el pic se despertó por el WDT, y entonces lo que haras, es mandarlo de nuevo a dormir.
Jesús dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.

Desconectado Gonzalo_BlackHawk

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 519
Re: Problemas con SLEEP
« Respuesta #9 en: 09 de Mayo de 2008, 00:25:25 »
Ales, nos has dicho que estas utilizando el pic 18F6620, asi que puedes controlar el WDT con la instrucción setup_wdt y no necesitar un bucle infinito para ponerlo a dormir. ¿Has revisado como esta el fuse del watchdog? Debe ser por eso que no puedes apagar el WDT en tiempo de ejecucion, ya lo he explicado mas abajo, lo repito porque talvez te has olvidado de chequear eso.

Leon Pic, la mayoria de la serie 16 no tiene control de perro guardian por software pero se que existen algunos pocos que si, además el compilador PCM (el compilador para PICs de 14 bits) lo soporta. De todas formas, la serie 18 si tiene este tipo de control, incluyendo el PIC que utiliza Ales, asi que no veo porque no usarlo y asi evitar tener que revisar el bit TO o caer en la implementación de un bucle infinito.

Nos vemos.
"Siempre piensa si el jugo vale la exprimida..."

"La muerte esta tan segura de vencer que nos da toda una vida de ventaja."

Desconectado ales

  • PIC10
  • *
  • Mensajes: 33
Re: Problemas con SLEEP
« Respuesta #10 en: 09 de Mayo de 2008, 00:55:39 »
Gonzalo_BlackHawk yo tengo activado el fuse así: #FUSES WDT128  porque quiero que ladre cada 2.3 seg. (me parece que es la cuenta, ahora no recuerdo bien el pico) pero a mi no se me desactiva con el setup_wdt(WDT_OFF) no sé por que, entonces pongo el sleep dentro de un bucle que solo se saldría por las interrupciones externas que es lo que quería, no me gusta mucho eso así lo veo un poco ineficiente porque cada vez que ladre el WDT al salir del sleep estoy utilizando más energía me quería ahorrar justamente con el sleep y si hablamos de un largo tiempo en sleep sucediendo esto, pues el consumo se hace más notable y si estamos alimentando con baterías, más aún

Ah!!! Pocher querías saber para que era el código que puse en el Foro, pues forma parte de mi proyecto de diploma para graduarme en la universidad, es un Master para una comunicación RS485 el cual además guarda en MMC ciertas muestras adquiridas de los esclavos y estos de sensores. Este master recibe información de la PC para configurarse para el posterior trabajo con los esclavos (esa parte no está en el código del foro, por que lo hice hoy), cuando termine la adquisicion de muestras de insertará la MMC en la PC para procesar todas las muestras con otro programa los de la PC son en Builder (el Configurador y el Procesador de Muestras), y gracias a la ayuda recibida por ustedes en el Foro hoy termine todo el HW y SW del Master y los Slaves, además ya tenía hecho el Configurador del Builder pues solo falta el último programa en Builder y Listo todo.

Gracias amigos por todo.

Saludos 
                 Ales.

Aqui les pongo el .h del código antes puesto para que vean todos los fuses por si ven algo sospechoso.

Muchas gracias amigos....


Desconectado Gonzalo_BlackHawk

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 519
Re: Problemas con SLEEP
« Respuesta #11 en: 09 de Mayo de 2008, 15:39:35 »
ales, coloca el fuse del watchdog asi: #fuses NOWDT. Parece ilógico pero si activas el perro por HW, no podras desactivarlo por SW. En cambio, aunque el perro este desactivado por HW, puede activarlo y desactivarlo en tiempo de ejecución por SW mediante setup_wdt(WDT_ON) o setup_wdt(WDT_OFF) respectivamente.

La cuestión con el 18F6620 es que solo permite configurar el tiempo del Watchdog con los fuses, asi que si lo colocas en NOWDT, el perro queda configurado para 18ms cuando los actives por software. Tendrías que investigar si el watchdog en tu PIC ocupa el mismo prescalador que el timer0 (Muchos PIC tienen esta característica) y entonces bastaría con configurar el timer0 al periodo que desees y asi tambien quedaria configurado el WDT. Esa es la unica solución que se me ocurre, pues despertar al PIC cada 2.3 segundos no es negocio, mas que durmiendo estaria dandose unas siestas bastante cortitas  :D :D. Aqui te pongo un seudocódigo para que te ubiques a lo que voy:

Código: [Seleccionar]
#include <18F6620.h>
#fuses NOWDT

//ACA VA EL RESTO DE LOS PREPROCESADORES, VARIABLES Y ESTRUCTURAS GLOBALES Y PROTOTIPOS DE FUNCIÓN.

void main(){

setup_timer_0(/*TIEMPO DE WATCHDOG QUE QUIERAS*/);                                                 
setup_wdt(WDT_ON);

//ACA VA LA CONFIGURACIÓN INICIAL Y EL RESTO DEL PROGRAMA.

setup_WDT(WDT_OFF);
sleep;
setup_WDT(WDT_ON);

//ACA VA LO QUE HACE EL PROGRAMA CUANDO DESPIERTA.
}

Que el código anterior funcione o no depende de si el WDT y el timer0 comparten el prescalador. Fijate en el datasheet y luego nos cuentas. Creo que es la unica forma de evitar que el PIC despierte a cada rato y además disponer del perro guardían.
Esperamos novedades, un saludo.
"Siempre piensa si el jugo vale la exprimida..."

"La muerte esta tan segura de vencer que nos da toda una vida de ventaja."

Desconectado ales

  • PIC10
  • *
  • Mensajes: 33
Re: Problemas con SLEEP
« Respuesta #12 en: 12 de Mayo de 2008, 08:42:54 »
Muchas gracias por responder, Gonzalo_BlackHawk me ha sido de mucha ayuda, y ha ampliado mis conocimientos.  :-/
Probré lo que me dijo del timer0 y el WDT haber si este usaba el mismo preescalador pero al parecer mi PIC no tiene esa característica, por lo que la tengo durmiendo 2.3 seg y despertandose en un ciclo manteniendo el #fuse WDT128.
Pero al menos con su explicación quedan aclaradas las dudas, aunque no haga lo que quiero ya se por que está haciendo lo que hace.

Muchas gracias, Saludos.


 

anything