Hola a todos como bien dice el titulo mi problema es que quiero dormir mi arduino y despertarlo el tiempo máximo(interrupción por timer) pero veo que con cualquier timer a 16Mhz el tiempo máximo de sueño es de solamente 4 segundos. entonces mi razonamiento es que si bajo la velocidad de reloj a 8MHz(o menos) antes del sueño podria dormir por mas tiempo, claro una vez salga del modo sleep volver a funcionar a 16MHz. Actualmente estoy probando Sleep idle y en este modo consume cerca de 90mA. y quiero bajar el consumo lo mas posible. si alguien tiene alguna idea se lo agradeceria mucho.
Saludos
PUes has leido mal porque no son 4 sino 8 para empezar y puedes ponerlo en un loop para alcanzar el tiempo que gustes
Mira la librería LowPower
Completo
- (a) SLEEP_15MS - 15 ms sleep
- (b) SLEEP_30MS - 30 ms sleep
- (c) SLEEP_60MS - 60 ms sleep
- (d) SLEEP_120MS - 120 ms sleep
- (e) SLEEP_250MS - 250 ms sleep
- (f) SLEEP_500MS - 500 ms sleep
- (g) SLEEP_1S - 1 s sleep
- (h) SLEEP_2S - 2 s sleep
- (i) SLEEP_4S - 4 s sleep
- (j) SLEEP_8S - 8 s sleep
- (k) SLEEP_FOREVER - Sleep without waking up through WDT
Son los modos posibles
Asi que no solo 8 sino puedes dejarlo dormido y despertarlo por una interrupcion externa.
surbyte:
PUes has leído mal porque no son 4 sino 8 para empezar y puedes ponerlo en un loop para alcanzar el tiempo que gustes
Mira la librería LowPowerCompleto
Son los modos posibles
Asi que no solo 8 sino puedes dejarlo dormido y despertarlo por una interrupción externa.
Gracias quizás hice mal la cuenta lo hice asi periodo de 16MHz=62.5nS con el mayor preescaler a 1024 son 0.000064 Seg para llenar el registro de 16 bit dan 4.19 seg de cualquier modo. revisare mas afondo.
lo del loop debe funcionar mejor Vere la forma de integrar lo al código . Gracias surbyte
Eduardosanchez:
periodo de 16MHz=62.5nS con el mayor preescaler a 1024 son 0.000064 Seg para llenar el registro de 16 bit dan 4.19 seg
¿Interrupción por desbordamiento del timer1? Si pretendes ponerlo en el "sueño más profundo", los timers se apagan también (por lo tanto, millis() también se detiene); por mucho se mantiene activo el WDT para dormirlo en los lapsos antes mencionados.
Si lo que pretendes es ponerlo a dormir durante un tiempo más preciso; ¿por qué no utilizar un ciclo for para aumentarlo en múltiplos?
for (unsigned int i = MULTIPLICADOR; i; i--) LowPower.powerDown(SLEEP_1S, ADC_OFF, BOD_OFF);
Como la función está para dormir durante un segundo, entonces el "sueño" durará MULTIPLICADOR segundos.
Si el tiempo de reposo es indefinido, entonces sí deberías considerar despertarlo por interrupción externa.
Eduardosanchez:
quiero bajar el consumo lo mas posible.
Para lograr el máximo absoluto, quita de la placa los LEDs y el regulador de voltaje. Creo que el microcontrolador al "dormir" todavía mantiene el estado digital de las salidas; así que si dejaste un LED externo encendido antes de entrar a este modo, así se quedará aún durante el "sueño".
Lucario448:
¿Interrupción por desbordamiento del timer1? Si pretendes ponerlo en el "sueño más profundo", los timers se apagan también (por lo tanto, millis() también se detiene); por mucho se mantiene activo el WDT para dormirlo en los lapsos antes mencionados.Si lo que pretendes es ponerlo a dormir durante un tiempo más preciso; ¿por qué no utilizar un ciclo for para aumentarlo en múltiplos?
Hola Lucario gracias por responder, actualmente lo duermo por 4 Segundo en modo Idle y lo despierto con desbordamiento de Timer2( y por dos interrupciones de Hardware int0 e int4).
Ahora quiero hacer lo mismo pero en modo Extended Stanby sin embargo dejan de funcionar las interrupciones externas(creo puede ser por que hago el Sleep con la bibliotecaAVR y activo las interrupciones con la de arduino) mañana intentare con interrupciones de la biblioteca de AVR.
Lucario448:
Para lograr el máximo absoluto, quita de la placa los LEDs y el regulador de voltaje. Creo que el microcontrolador al "dormir" todavía mantiene el estado digital de las salidas; así que si dejaste un LED externo encendido antes de entrar a este modo, así se quedará aún durante el "sueño".
Esto si lo sabia pondré a investigar de inmediato. Gracias por el consejo.
Saludos
Eduardosanchez:
actualmente lo duermo por 4 Segundo en modo Idle
Ese no es el ahorro máximo de hecho.
Eduardosanchez:
Ahora quiero hacer lo mismo pero en modo Extended Stanby sin embargo dejan de funcionar las interrupciones externas
¿En serio? Se supone que de esa forma, o se despierta por WDT (temporizado), o por interrupción externa (indefinido). Es absurdo pensar que ni las interrupciones externas funcionen, ¿entonces sólo se puede despertar por Reset?
Al parecer, como te digo no se si es por la forma en que la habilito:
attachInterrupt( 0, int_hardw, RISING);
attachInterrupt( 4, isr_usb, RISING);
mas adelante pongo
#define sei()//activa las interrupciones
y cuando mando a dormir es asi:
void sleepNow()
{
set_sleep_mode(SLEEP_MODE_EXT_STANDBY); // sleep mode is set here
sleep_enable(); // enables the sleep bit in the mcucr register// so sleep is possible. just a safety pin
power_adc_disable();
power_spi_disable();
power_twi_disable();
sleep_mode(); // here the device is actually put to sleep!!// THE PROGRAM CONTINUES FROM HERE AFTER WAKING UP
sleep_disable(); // first thing after waking from sleep:
// disable sleep...
power_adc_enable();
power_spi_enable();
power_twi_enable();
}
y utilizo bibliotecas:
#include <avr/interrupt.h>
#include <avr/power.h>
#include <avr/sleep.h>
- Si no estás en Arduino Mega, la interrupción externa 4 no existe.
- sei() ya está definida.
- LowPower hace todo eso también, solo que empaquetado en función más configurable.
- Podía jurar que también los timers y puerto serial se apagaban.
Pero sí, se supone que en el sueño más profundo, solo una interrupción externa lo despierta. Bueno, en realidad cualquier interrupción; lo que sucede es que hay que apagar tantos periféricos que solo nos quedan las externas.
Asi es Lucario estoy con arduino mega pero lo que me refiero es que Habilito las interrupciones por Hardware y luego habilito otras interrupciones con otra libreria.
Buscare la libreria LowPower entonces