Disattivare e riattivare periferiche AtMega

Ciao a tutti!
Per un progetto a basso consumo ho trovato online diverse guide su come far consumare meno corrente ad un atmega in stand-alone, le quali sfruttano watchdog per far “dormire” il microcontrollore e disabilitano ciò che non viene utilizzato.
In particolare, dal sito di Leonardo Milani, ho trovato il seguente pezzo di codice che disabilita e spegne diverse periferiche (i commenti, presi dal codice originali, sono più che esplicativi).
Ciò che mi chiedo è: come si riattivano tali periferiche? Devo ricaricare il bootloader? Perchè tale parte di codice non riesco a comprenderla.
Grazie a tutti per l’aiuto!

void powerSaver() {
    //set the internal registers to reduce power consumes
    PRR &= ~((1<<PRUSART0) | (1<<PRADC) | (1<<PRSPI) | (1<<PRTIM1) | (PRTWI)); //shut down the following:  USART, ADC, I2C, Timer1, SPI
    ADCSRA &= ~(1<<ADEN); //shut down the ADC
    ACSR = (1<<ACD); //shut down the analog comparator
    DIDR0 = ((1<<ADC5D) | (1<<ADC4D) | (1<<ADC3D) | (1<<ADC2D) | (1<<ADC1D) | (1<<ADC0D)); //shut down digital input buffers on pins ADC0..5
    DIDR1 = (1<<AIN1D)|(1<<AIN0D); //shut down digital input buffer on AIN0..1
    MCUCR |= (1<<BODS); //BOD disabled
    WDTCSR &= ~((1<<WDCE) | (1<<WDE)); //watchdog disabled

    //prepare the sleep mode
    set_sleep_mode(SLEEP_MODE_PWR_SAVE); // set the sleep for POWER SAVE mode
    sleep_enable(); // sleep ready to use
}

Guarda nella AVR libc (sempre automaticamente inclusa dall'IDE) la avr/power.h ... troverai tutto quello che serve.

Guglielmo

Grazie per la risposta,
Avevo già guardato quella libreria ma mi sembra che nel codice che ho postato non usi quella libreria, ma piuttosto, guardando anche il datasheet dell'AtMega, mi sembra stia proprio modificando i registri per disabilitare quelle periferiche.
Per riattivarle, posso usare la libreria che hai postato te (per esempio i metodi power_usart_enable() e simili) o, visto che le ho disattivate in maniera diversa e non con quella libreria, devo abilitare manualmente tali periferiche? Magari scrivendo 0 invece di 1 non so.
Non riesco a comprendere bene quella parte di codice che ho postato, ma l'ho già caricato in una mia board Arduino e non vorrei aver disabilitato periferiche che non riesco più ad attivare.
Scusa l'insistenza vorrei solo capire bene,
Grazie mille

... quel codice fa esattamente quello che fanno le varie funzioni di quella libreria.

Consiglio, butta il codice, ed usa la AVR libc ... molto più portabile e leggibile e ... è uno STANDARD nel mondo AVR.

Guglielmo

Perfetto!
Avendo visto il lavoro accurato di Leonardo Milani mi ero fidato, ma in effetti se c’è una libreria ufficiale e affidabile è meglio utilizzarla.
Grazie mille per la disponibilità! :slight_smile: