Miglioria Delay()

Ciao a tutti,
Se delay() mandasse in standby il micro non sarebbe meglio dal punto di vista energetico? Potrebbe essere una miglioria per il core, fatemi notare tutte le eventuali magagne che questo potrebbe comportare.. in alternativa un metodo sleep()?

Uno stato di sleep o standby lo vedo sensato solo se uso un alimentazione a batteria mirata a basso consumo energetico. Questo é giá una contradizione data dal resto del circuito che sta sulla schedina Arduino. Mandi un controller in sleep ma non l'altro?
Secondo me l' uso dei diversi stati di risparmio ha solo senso se tutto il circuito é costruito mirando su questo.
Ciao Uwe

Si fa presto a dire "sleep" ma esistono diversi livelli di risparmio energetico, ognuno con le proprie periferiche interne al micro attive o disattivate. Se disattivi il timer 0, ad esempio, il contatore interno dell'Arduino si blocca, il delay non finirà mai. Inoltre ricordati che per svegliare il micro da uno sleep serve uno interrupt interno (es.: overflow di un timer) od esterno (es.: segnale su un pin). Se non hai un tale sistema di risveglio, il micro resta in sleep perenne.

Come sospettavo gli interrupt ed i timer sono il problema maggiore, soprattutto perchè molte librerie gli usano senza dire nulla..

Comunque si, stavo lavorando ad un circuito embedded alimentato a batteria con AtMega328p in standalone ed ogni microAmpere è molto importante, tramite lo sleep sono riuscito a mandare a nanna il micro (nella modalità massima, SLEEP_MODE_PWR_DOWN) e a risvegliarlo dopo N millisecondi tramite il watchdog che è sempre alimentato tramite un clock a 125 kHz per il risparmio energetico massimo, naturalmente nel mio caso ho sotto controllo tutto il mio codice.

Ciao

flz47655:
Come sospettavo gli interrupt ed i timer sono il problema maggiore, soprattutto perchè molte librerie gli usano senza dire nulla..

Comunque si, stavo lavorando ad un circuito embedded alimentato a batteria con AtMega328p in standalone ed ogni microAmpere è molto importante, tramite lo sleep sono riuscito a mandare a nanna il micro (nella modalità massima, SLEEP_MODE_PWR_DOWN) e a risvegliarlo dopo N millisecondi tramite il watchdog che è sempre alimentato tramite un clock a 125 kHz per il risparmio energetico massimo, naturalmente nel mio caso ho sotto controllo tutto il mio codice.

Ciao

Con pwr_down hai un timer che lavora?

No con Power Down non c'è nessun timer che lavora.
Però funzionano gli interrupt esterni asincroni su INT0 e INT1.
Oppure usare Power Save ed il Timer 2, che resta funzionante.

Ma c'è' un piccolo problema. Se usi il Timer come contatore temporale, risvegli il micro ogni tot. Devi quindi prevedere un tempo abbastanza lunghetto, che permetta di non interferire più di tanto sul risparmio energetico.

Se stai lavorando ad un 328 in standalone potresti prendere spunto dal mio Micrologio: lì ho usato il clock interno del micro e poi ho agganciato un quarzino esterno usando il modulo Real-Time Counter. Impostando correttamente il timer puoi arrivare a intervalli fra un interrupt e l'altro anche di 1 o più secondi.

Con pwr_down i timer vengono disattivati ma è ancora possibile utilizzare il watchdog come timer, così si ottiene il risparmio massimo, se vuoi ti posto il codice anche se aspettavo di commentarlo meglio

Ciao

flz47655:
Con pwr_down i timer vengono disattivati ma è ancora possibile utilizzare il watchdog come timer, così si ottiene il risparmio massimo, se vuoi ti posto il codice anche se aspettavo di commentarlo meglio

Ciao

Nessuna fretta, completalo come ritieni meglio opportuno, però sono curioso di capire questa cosa; il WDT ovviamente resta funzionante e devi impostarlo correttamente nel firmware affinché ad un tot tempo trascorso rimetta in attività il micro; ignoravo il fatto che lo si potesse in qualche modo impostare a differenti frequenze. Inoltre (domanda) riesci a portarti tale frequenza all'esterno del micro in qualche modo?

Si può configurare il prescaler del WatchDog (WD) per generare timeout a 16ms, 32ms, 64ms, 0.125s, 0.25s, 0.5s, 1s, 2s, 4s, 8s) partendo da un clock interno e separato da 128kHz
Per portare fuori tale frequenza (/2) basta che quando il micro si sveglia alza/abbassa un pin

Ciao