Haz una pregunta
  Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos
Foros Registrarse ¿Olvidaste tu contraseña?

Temas similares

26/04/2007 #1


Programando en sleep mode
Hola, alguien podría pasarme un ejemplo de un programa en c, en el cuál pusiera en sleep mode a un uC,uso un atmel,pero no creo q coincida tanto,gracias.
10/10/2007 #2


Yo puse supuestamente un pic en sleep mode es un16F876. El problema que tengo es que en ese modo me consume como 1mA. Lo cual es mucho.
27/04/2008 #3


Hola marcosbrusa, dices que has programado el pic para entrar en sleep mode? queria preguntarte que como haces para despertarlo y volver a la normalidad que no soy capaz de hacerlo. gracias
27/04/2008 #4


Hola merlosss. La unica manera de re-activar un PIC del estado de Sleep es por medio de una interrucpion (interna o externa). En muchos PIC existe una gran cantidad de fuentes de interrupcion que permiten a un PIC "despertar". Una buena estrategia para salir del modo sleep puede ser el uso de un timer que genere una interrupcion periodicamente, provocando la reactivacion del PIC (Ojo: el timer debe tener entrada de reloj externa). Otra buena solucion es el uso de interrupciones externas, tal como el pin RB0/INT o la interrupcion por cambio de estado del puerto B.

Entiendo tambien que el WDT permite a un PIC despertar del estado de Sleep mediante un Reset.

Casi cualquier interrupcion generable puede ayudar, incluso la del ADC ;-)

Si no conoces mucho de interrupciones, te recomiendo que te informes del tema.

Saludos.
28/04/2008 #5


Es más que obvia tu respuesta, todo eso ya lo leí en el datasheet. En realidad mi pregunta no tiene otra respues. gracias d toas maneras, ya lo resolví.

Saludos.
23/02/2010 #6


Respuesta: Programando en sleep mode
Hola, trabajo con un PSOC kit 3271 con Cyfi y no me funciona el algoritmo que hago para el sleep timer. Es este:

Código:
#include <m8c.h>        // part specific constants and macros
#include "PSoCAPI.h"    // PSoC API definitions for all User Modules

//-----------------------------------------------------------------------------
//  Sleep timer ISR function declaration
//-----------------------------------------------------------------------------
#pragma interrupt_handler SleepTimerISR; 

//-----------------------------------------------------------------------------
//main() function
//-----------------------------------------------------------------------------
void main(void)
{
    // Insert your main routine code here.
	
	// Turn on interrupts
	M8C_EnableGInt ; 
	
	//Turn on the Sleep Timer
	SleepTimer_Start();
	
	// Set interrupt to 1 Hz Rate. User can set this to any of 1, 8, 64 or 512 Hz. Refer User module datasheet for more details
	SleepTimer_SetInterval(SleepTimer_1_HZ); 
	LED_1_On();
	//Enable Interrupts for Sleep timer
	SleepTimer_EnableInt(); 
	SleepTimer_SetTimer(10);

	// Put the M8C to sleep
	M8C_Sleep; 
	
	//Loop continously
	while(1)
	{
		// If there are other resources running in the project, this is the right place
		// to stop the resources
		
		// Put the processor to sleep
		M8C_Sleep;
		
		// If there are other operations to perform, add code to turn on all the resources and 
		// perform the necessary operations.
	}
}

//-----------------------------------------------------------------------------
//  Sleep timer ISR function definition
//-----------------------------------------------------------------------------
void SleepTimerISR_C(void)
{//Start of Sleep Timer ISR, M8C executes this ISR after it comes out of sleep
//M8C ejecuta esta interrupción después de que salga del sueño.
	//Toggle P0[0]
	LED_1_Off();
}
No se duerme, el LED no se apaga. Alguien ve algún fallo? Gracias!
30/12/2011 #7


Buenas, soy novato, pero mis pruebas y problemas han llegado a la conclusion que puede estar en sleep y no apagar los led, de hecho lo he comprobado, viendo los errores que generan el ADC puesto como captador y cuando duerme deja de dar errores, yo lo que hago es justo antes de llevarlo a sleep , limpio los puertos.

el problema que tengo yo es, que si antivo el WDT, la pic se duerme e inmediatamente despierta, segun el tiempo que le tenga puesto al WDT, no activado interrupcion para que sea el WDT quien saque al pic de sleep, lo saco atraves de #int RB, si alguien sabe el porque...

Saludos
06/02/2016 #8


Aclaremos algunas cosas: el modo sleep equivale a detener el reloj principal del PIC, por ende se detiene el Program Counter (PC), lo que reduce el consumo al mínimo, esto es fácil de lograr con la función sleep.
Algunas consideraciones a tener en cuenta:
*El estado de los puertos I/O y los tris mantienen su estado durante el sleep, si tenemos un pin de salida en alto alimentando un hardware nos generará consumo extra.
*Para salir del modo sleep se puede lograr a travez de cualquier reset (MCLR, WDT, etc), o generando una interrupción.
Nota sobre salir del sleep con una interrupción: no todos los periféricos que generan interrupciones funcionan en el modo sleep, debemos leer el manual en donde trata el periferico específico y ver si opera en modo sleep y de que manera lo hace, esto también incluye los timer, no todos los timer funcionan en modo sleep. Otra cosa importante a tener en cuenta es que para salir del modo sleep solo necesitamos que se active determinado flag, el uso de la interrupción asociada a ese flag es opcional, por ejemplo; si activamos el flag de INT externa en RB0 y no activamos las interrupciones GLOBALES, cuando tengamos el flanco correspondiente en RB0 el pic saldra del modo sleep y cuantinuará con la secuencia de código donde se había detenido (no se genera interrupción y por lo tanto no es necesario definir la función de la interrupción externa), en cambio, si estan activadas las interrupciones GLOBALES durante el sleep, cuando tengamos el flanco correspondiente en RB0, el pic saldrá del modo sleep e inmediatamente ira al vector de interrupciones para atender a esta interrupción (en este caso debemos tener la función asociada a la interrupción programada), espero que les sirva el dato.

No se puede despertar un pic del modo sleep por sofware, ya que como el sofware está completamente detenido en el modo sleep no nos sirve para desperar a un pic.

PD.: Sepan disculpar los errores de tipeo y ortografía, :-).

Saludos
28/11/2016 #9


Hola.

Tengo un consumo elevado de energía en mi proyecto, por el hecho de que la mayor parte del tiempo el pic (18f4550) "no hace nada" pero se encuentra ejecutando millones de ciclos de instrucción "hasta que hace algo". Ese "algo", es guardar un dato cada una hora. El motivo por el cual el pic se mantiene activo es porque tiene que funcionar el reloj ds1307 para que cada una hora, en tiempo real, le diga al pic que tiene que guardar el dato. El problema es que la bateria no me dura mas que unos dias y la necesito durante meses.

Por este motivo me incline a incrementar la eficiencia del uso de la energia de mi proyecto, no puedo seguir agregando pilas y derrochando energía.

Estoy pensando en utilizar el modo Sleep, pero si lo implemento el integrado ds1307 dejaria de funcionar porque funciona en conjunto con el micro. Si es posible, para salir del modo sleep pretendo que cada una hora el ds1307 mande una señal y genere una interrupción.

Es posible que el micro se encuentre en modo sleep y el ds1307 siga corriendo en tiempo real ? como hago eso ?

Que alternativa me pueden presentar con su experiencia ?

Muchas gracias.
Saludos.
29/11/2016 #10

Avatar de Ardogan

Jose1306 dijo: Ver Mensaje
Hola.

Tengo un consumo elevado de energía en mi proyecto, por el hecho de que la mayor parte del tiempo el pic (18f4550) "no hace nada" pero se encuentra ejecutando millones de ciclos de instrucción "hasta que hace algo". Ese "algo", es guardar un dato cada una hora. El motivo por el cual el pic se mantiene activo es porque tiene que funcionar el reloj ds1307 para que cada una hora, en tiempo real, le diga al pic que tiene que guardar el dato. El problema es que la bateria no me dura mas que unos dias y la necesito durante meses.

Por este motivo me incline a incrementar la eficiencia del uso de la energia de mi proyecto, no puedo seguir agregando pilas y derrochando energía.

Estoy pensando en utilizar el modo Sleep, pero si lo implemento el integrado ds1307 dejaria de funcionar porque funciona en conjunto con el micro. Si es posible, para salir del modo sleep pretendo que cada una hora el ds1307 mande una señal y genere una interrupción.

Es posible que el micro se encuentre en modo sleep y el ds1307 siga corriendo en tiempo real ? como hago eso ?

Que alternativa me pueden presentar con su experiencia ?

Muchas gracias.
Saludos.
¿Consideraste NO usar el ds1307 y conectar un cristal de 32768 Hz directamente al pic? (pines T1OSO y T1OSI, usando timer1 como temporizador con T1OSCEN=1).
Lleva más trabajo llevar un registro de fecha y hora con eso, pero si como mencionas arriba solamente precisas temporizar un intervalo de tiempo de 1 hora, entonces está más que bien.
El timer1 desbordaría cada 2 segundos, pero se puede usar el prescaler hasta x8, con lo que podrías despertarlo hasta cada 16 segundos como máximo.

No digo de usar el watchdog porque toma señal del oscilador RC interno, que no es muy preciso (más si se quiere registrar una marca temporal junto con el dato guardado). Pero si no te preocupa que sea una hora exacta (+/-10% de error máximo para RC) podrías usar eso también. El problema es que el error en tiempo se acumula...
30/11/2016 #11


Gracias por la respuesta Ardogan.

Con este modo que planteas el Pic se encenderia cada 16 seg como maximo ? no se puede llegar a que se encienda cada 1 hora ?

Saludos
30/11/2016 #12

Avatar de Ardogan

Jose1306 dijo: Ver Mensaje
Gracias por la respuesta Ardogan.

Con este modo que planteas el Pic se encenderia cada 16 seg como maximo ? no se puede llegar a que se encienda cada 1 hora ?

Saludos
Estuve suponiendo que el cristal externo era de 32768 Hz, que es lo más habitual.
Veamos la hoja de datos a ver si soporta un cristal de menor frecuencia...
http://ww1.microchip.com/downloads/e...Doc/39632e.pdf

Sección 12.3 Timer1 Oscillator página 135/438
The oscillator is a low-power circuit rated for 32 kHz crystals. It will continue to run during all power-managed modes. The
Se ve que la circuitería interna viene preparada para 32KHz nomás.

La otra posibilidad sería seguir usando el ds1307 y usar la señal de salida SQW como señal de reloj del timer1 (o de cualquier otro timer).
A ver... sí, la hoja de datos del ds1307 dice que puede dar frecuencias menores a 32 KHz (sino estamos igual).
Lo mínimo es 1Khz, con un timer de 16 bits llegamos a
2^16 /1K = 65 segundos ~ 1 minuto

No es mucho mejor tampoco... pero agregamos prescaler del timer0 que llega a valores más altos que el timer1. Lo usé antes porque es el único que puede trabajar con un oscilador de 32768Hz pero ahora no haría falta porque la señal la daría el ds1307.
Por ejemplo con x256 del timer0 (según pag. 129) llegamos a ~256 minutos ~ 4 horas.

Entonces esa es otra opción: seguir con el ds1307 pero configurarle para que en SQW ofrezca una señal de 1KHz, y eso usarlo como entrada a un timer (configurado como contador con entrada por pin externo).
A ese timer hay que configurarlo como contador con señal de cuenta por pin externo, pre-escala, y seguramente habrá que ponerlo en modo de comparación para lograr un tiempo cercano a 1 hora (y no quedarse solo con el desborde por cero).

¿Cual sería el valor de comparación?
Había dicho que señal SQW del ds1307 es 1KHz, bueno, creo que 1024 Hz en realidad.
Prescala de 256: al timer entraría una señal de 1024/256 = 4 Hz -> 0.25s de perído.
Sería 1hora = 60 min = 3600s / 0.25s = 14400 cuentas

Si te gusta de esa manera (usando el ds1307) podés implementarlo de esa forma.

Si te gustó la idea de prescindir del ds1307, también lo podrías implementar despertando el micro cada 16s, se despertaría un intervalo de tiempo breve (para incrementar un contador en la ISR) y se volvería dormir enseguida.
Digamos por exagerar que al despertar el micro está activo 1 segundo (muy exagerado), eso significaría que en 1 hora estarías despertando 3600/16s = 225 veces, tiempo activo en 1 hora = 225 segundos.
Eso mismo sería el ahorro que tendrías respecto a tu consumo actual. Bueno, no exactamente, porque el micro no consume cero corriente cuando duerme, tiene una corriente de standby, pero lo desprecio ya fuí absurdamente pesimista al considerar que al despertarse iba a demorar 1 segundo entero en ejecutar la ISR.

Así que ahora hay 2 opciones, una con más hardware, y la otra con más software y algo menos de eficiencia energética (tal vez, no consideré el consumo del ds1307 en comparación con no usarlo).
01/12/2016 #13

Avatar de Scooter

No entiendo eso de "funciona en conjunto"
¿Es que se alimenta de un pin?
El pic puede dormir y el DS generar una interrupción cada hora o cada día...
Solo consumirá el DS que es poco. El PIC, lo mínimo.
Respuesta
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.