Go Down

Topic: Attiny 85 e risparmio energetico (Read 1 time) previous topic - next topic

erpomata

Ciao a tutti
Leggendo il codice di Micrologio di Leonardo (http://www.leonardomiliani.com/?p=487) ho scoperto che si possono disabilitare alcuni servizi del micro (atmega328) per risparmiare energia.

Questo il codice in questione:

Code: [Select]
//maximum power saving! disable all the unused periphericals
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
}


E' possibile fare lo stesso per l'attiny85? ed eventualmente quali sono questi servizi?


Grazie
http://www.paologiammarco.it
http://www.valentinamagni.it

Michele Menniti

Sì, solo che sul tiny85 non funzionano tutte le modalità del 328P
Guida alla programmazione ISP e seriale dei micro ATMEL (Caricare bootloader e sketch):
http://www.michelemenniti.it/Arduino_burn_bootloader.php
Guida alla Programmazione ATmega328 noP:
http://www.michelemenniti.it/atmega328nop.html
Articoli su Elettronica In:
http://www.michelemenniti.it/elettronica_in.html

leo72


Sì, solo che sul tiny85 non funzionano tutte le modalità del 328P

Esatto. Essendo un micro limitato nelle funzionalità, non ha tutte le periferiche del fratello maggiore né tutte le sue modalità di risparmio energetico. E' comunque tutto riportato sul datasheet, da cui puoi prendere i vari registri e fare dei test.

erpomata

#3
Oct 15, 2012, 06:20 am Last Edit: Oct 15, 2012, 06:25 am by erpomata Reason: 1
Da quello che capisco leggendo il ds le uniche due cose che si possono disabilitare sono il convertitore analogico e i digital in.
Ora, tornado al mio progetto, avrei bisogno di 3 ingressi digitali ed 1 uscita (ed 1 entrata) per il seriale (immagino sempre digitale), quindi niente analogico.
Ho abilitato il clock interno a 16Mhz (questo per la disabilitazione dei timer)

Una cosa del genere potrebbe andare?

Code: [Select]

void powerSaver() {
   //set the internal registers to reduce power consumes
   PRR &= ~((1<<PRADC) | (1<<PRTIM1) ); //shut down the following:  ADC, Timer1
   ADCSRA &= ~(1<<ADEN); //shut down the ADC
   ACSR = (1<<ACD); //shut down the analog comparator

   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
}

http://www.paologiammarco.it
http://www.valentinamagni.it

leo72

1) il timer 1 sul Tiny85 mi pare gestisca millis() quindi attento che poi devi riattivarlo se vuoi usare i delay o appunto millis;
2) a 16 MHz il risparmio energetico è relativo. Ma devi proprio lavorare a 16 MHz?
3) il BOD ed il WD puoi disattivarli anche con i fuse, quindi puoi evitare di rimetterli nel codice. Io l'ho fatto perché, essendo un progetto distribuito, non posso avere la certezza che l'utente metta i fuse che consiglio. Ma tu non hai di questi problemi.

erpomata


1) il timer 1 sul Tiny85 mi pare gestisca millis() quindi attento che poi devi riattivarlo se vuoi usare i delay o appunto millis;
2) a 16 MHz il risparmio energetico è relativo. Ma devi proprio lavorare a 16 MHz?
3) il BOD ed il WD puoi disattivarli anche con i fuse, quindi puoi evitare di rimetterli nel codice. Io l'ho fatto perché, essendo un progetto distribuito, non posso avere la certezza che l'utente metta i fuse che consiglio. Ma tu non hai di questi problemi.


1) ok non si disabilita il timer 1  :)
2) Bè mi serve la maggiore reattività dalla lettura del digital in, nella trasmissione del segnale seriale e nell'attuazione dei relè (sul modulo ricevente)
3) E qui come faccio? :P
http://www.paologiammarco.it
http://www.valentinamagni.it

leo72

1) puoi disabilitare il timer 0, se proprio vuoi disabilitare un timer  :P
2) OK ma poi ricordati che il clock influisce maggiormente sui consumi, molto più di una periferica disattivata. Ma ad 8 MHz non basterebbe?
3) vai su http://www.engbedded.com/fusecalc/ e ti alleni  ;)

erpomata

1) andata per il timer 0
2) preferisco mantenermi su un processore più cloccato, tanto non è un circuito che rimarrà attivo h24.
3) farò allenamento (non conoscevo il sito)


Grazie.
http://www.paologiammarco.it
http://www.valentinamagni.it

Michele Menniti


3) vai su http://www.engbedded.com/fusecalc/ e ti alleni  ;)

sì, ma fai attenzione, non è proprio difficilissimo brickare un micro ;)
Guida alla programmazione ISP e seriale dei micro ATMEL (Caricare bootloader e sketch):
http://www.michelemenniti.it/Arduino_burn_bootloader.php
Guida alla Programmazione ATmega328 noP:
http://www.michelemenniti.it/atmega328nop.html
Articoli su Elettronica In:
http://www.michelemenniti.it/elettronica_in.html

erpomata

Infatti non ci ho capito nulla da quel sito e penso proprio che eliminerò l'idea del risparmio energetico.
Tanto non dovendo essere acceso h24 non è quello l'importante.

Pensavo fosse più semplice.

Grazie
http://www.paologiammarco.it
http://www.valentinamagni.it

Go Up