astrobeed:
menniti:
inoltre ho un altro problema: a volte questo strab sensore resta aperto, in base alla posizione, e potrebbe restarlo per tutto il giorno (il tx per attivarsi vuole una sequenza low-high), quindi poiché gestisco già questa cosa via software, secondo te potrei mettere in sleep il micro anche col sensore aperto?
La soluzione è semplice, invece di risvegliare su uno stato logico ben preciso, che può essere sia LOW che HIGH, risvegli quando c'è un cambio di stato, quindi sia HIGH->LOW che LOW->HIGH, per farlo basta che metti la keyword CHANGE nella modalità di attivazione dell'interrupt.
Ti allego solo come viene modificata la funzione che mette in sleep, commenta, o cancella, l'attivazione dell'interrupt che si trova in SETUP in modo da attivare l'interrupt solo prima di entrare in sleep e disattivarlo quando ne esce.
void A_nanna() // funzione attivazione sleep
{
/*
Modalità sleep per ATmega 328p
SLEEP_MODE_IDLE
SLEEP_MODE_ADC
SLEEP_MODE_PWR_DOWN
SLEEP_MODE_PWR_SAVE
SLEEP_MODE_STANDBY
SLEEP_MODE_EXT_STANDBY
*/
attachInterrupt(0, sbadiglio, CHANGE); // riattiva l'interrupt
sleep_mode(); // mette in stato di sleep
sleep_disable(); // disattiva la modalità sleep e riporta il micro a piena operatività
detachInterrupt(0); // disattiva l'interrupt
}
Ciao, finalmente ho potuto fare un po' di prove: tra tutte le modalità migliore è proprio la “SLEEP_MODE_PWR_DOWN”; ho configurato il chip a 1MHz (ma non cambia nulla in sleep) e l’ho montato in configurazione minimal, solo col led sul 13; non ho ancora messo il mio code; quando va “a nanna” il mio tester (è un buon Velleman ma niente a che vedere col tuo strumento professionale!) misura 95-96 µA, quindi molto più di quanto mi hai indicato. Il tester ha una risoluzione di 0,1µA, misurando il tx (che dovrà essere pilotato dal chip) a riposo mi dà 8-9µA, quindi la cosa mi sembra attendibile anche se certamente imprecisa. Quindi vorrei qualche info in più, se possibile.
Inoltre mi sfugge il passaggio
L'interrupt su INT0 è sempre attivo, se vuoi attivarlo e disattivarlo solo per lo sleep togli i commenti alle relative righe all'interno della funzione per lo sleep.
La funzione sleep non ha righe di commento, a parte l’elenco delle modalità.
Infine vorrei un chiarimento proprio sul “funzionamento” di questa funzione:
attachInterrupt(0, sbadiglio, CHANGE); // riattiva l'interrupt
sleep_mode(); // mette in stato di sleep
sleep_disable(); // disattiva la modalità sleep e riporta il micro a piena operatività
detachInterrupt(0); // disattiva l'interrupt
Mette in stato di sleep e subito dopo lo disattiva?
grazie