sleep, risveglio ogni secondo

Buongiorno.
Vorrei risvegliare dallo sleep ogni secondo, per consumare meno.
Però ho letto che millis() è un interrupt ogni millisecondo.
Mi sveglierebbe la CPU ogni millisecondo.

Come posso fare ?

Per esempio cambiando il tempo di quello stesso interrupt, da 1000 a 1

millis() durante lo sleep è ferma ... tutta la MCU "dorme" !!!

Devi imparare ad usare il watchdog come generatore di interrupt per "svegliare" la MCU ... studia QUI e QUI

Guglielmo

Ci sono vari tipi di sleep.
Si può decidere di fermare o no i timer.
L'oscillatore.
Gli adc.

Comunque è una buona idea usare il wdt.
Credo che consumi anche meno dei timer.

Grazie

Non posso usare il wdt.
Usa un oscillatore rc troppo impreciso.

Se ti serve una certa precisione guarda “il micrologio” sempre di Leonardo Miliani

L'orologio purtroppo non è arduino.
Senza arduino saprei come fare.

C'è un documento per capire i timer interni come Arduino li usa e le varie periferiche ?
Devo riuscire a fare uno sleep con risveglio da timer quarzato.

x-giorgio-x:
C'è un documento per capire i timer interni come Arduino li usa e le varie periferiche ?

... certo ... è tutto molto ben documentato nel datasheet del ATmega328P !

Guglielmo

Nel datascheet della CPU non si parla di Arduino.
Non dice come Arduino li usa per i suoi processi interni.

Io ho bisogno di capire come li usa arduino, perchè funzioni come millis() che forse usano il timer come interrupt, mi sveglierebbero la CPU quando non voglio.

Ho bisogno di capire come funzionano e come modificarli per svegliare la CPU solo una volta al secondo.

... allora devi studiarti il "core" ... lo trovi nella "arduino\hardware\arduino\avr\cores".

Guglielmo

E' un casino tutti quei sorgenti.
Ma millisec è generato da un interrupt ?
Dove lo trovo ?

Trovato nel file wiring.c
Ma come posso modificare questi sorgenti solo per un progetto ?

Metti questo dove vuoi fermare il timer di millis():

TIMSK0 &= ~_BV(TOIE0); // disable timer0 overflow interrupt

Fine.

Grazie, ci sono altri interrupt attivi ?
La conversione ADC è sotto interrupt ?

Un 4060 quarzato a 32.768Hz che sveglia il micro ogn 2Hz tramite un interrupt esterno come si faceva 30 anni fa
https://www.google.it/search?q=cd4060+2hz&client=opera&hs=AL2&source=lnms&tbm=isch&sa=X&ved=0ahUKEwi4nKKE1avSAhXlZpoKHVO1DnIQ_AUICCgB&biw=1280&bih=924#imgrc=_

oppure un RTC con pin di uscita a 1Hz tipo il DS1307 sul pin7 impostato a 1Hz sempre collegato a un irq esterno, che è poi la stessa cosa