Go Down

Topic: Calcolare consumo Arduino (Read 1 time) previous topic - next topic

leo72


Si, ma non saprei come mettere in sleep l'attiny85 con le stesse modalità usate per l'arduino...
sapresti darmi una mano?


Usando la libreria Avr sleep.h.
Qui c'è un po' di teoria:
http://playground.arduino.cc/Learning/arduinoSleepCode

Ti passo questo sketch che scrissi tempo fa per fare dei test sull'Attiny85 quando con Menniti stavano analizzando la questione della sua barriera infrarossi. Usa anche la libreria PinChangeInterrupt (che puoi scaricare dallo stesso sito da cui hai prelevato il core Tiny):
Code: [Select]

#include <avr/sleep.h>  // libreria standard (avrlib) per lo sleep
#include <PinChangeInterruptSimple.h> // questa libreria permette di usare un qualsiasi pin come interrupt
/* Sleep test */
#define Sveglia 0    // pin 7 dell'attiny corrispondente a INT0
#define LED     3    // pin 3 dell'attiny85

void sbadiglio()        // risveglio dallo sleep
{
  // inserire eventuali azioni legate all'interrupt
}

void setup()
{
  pinMode(Sveglia, INPUT);
  //digitalWrite(Sveglia, HIGH);
  pinMode(LED, OUTPUT);
 
  //digitalWrite(Sveglia, 1);              // pull up attiva sul pin interrupt, ma conviene usare una 180K esterna
  attachPcInterrupt(Sveglia, sbadiglio, LOW);    // interrupt 0
  set_sleep_mode(SLEEP_MODE_PWR_DOWN);   // setta registri per il modo sleep
  sleep_enable();                        // abilita la sleep all'uso
}

void A_nanna()                      // funzione attivazione sleep
{
    attachPcInterrupt(Sveglia, sbadiglio, CHANGE); // riattiva l'interrupt
    ADCSRA &= ~(1 << ADEN);
    sleep_mode();                          // mette in stato di sleep
    sleep_disable();      // disattiva la modalità sleep e riporta il micro a piena operatività
    detachPcInterrupt(Sveglia);  // disattiva l'interrupt
}
void loop()
{
  for(byte i=0;i<4;i++)
   {
    digitalWrite(LED, HIGH);
    delay(200);
    digitalWrite(LED, LOW);
    delay(200);
   }
  A_nanna();               // mette il micro in sleep
}

Mette in sleep il micro e lo risveglia con un PCINT su un pin. E' tutto commentato.

fardox

Ma: set_sleep_mode(SLEEP_MODE_PWR_DOWN); non necessita di un interrupt esterno per il Wake up?

Se io volessi usare la temporizzazione interna(come facevo nello sketch precedente) come devo fare?

Thanks! :D
Se ritieni che la mia risposta ti abbia aiutato a risolvere il problema non esitare! ringraziami dandomi il Karma! ;)
_-_-_-_-_-_-_-_-_-_-_-

leo72

Sai come funziona almeno lo sketch che hai usato? Hai letto la libreria LowPower?
Immagino di no  ;)

Funziona attivando il watchdog, che è un circuito interno alimentato separatamente dal clock principale. Il clock principale negli sleep "profondi" viene disattivato quindi tutto si ferma. Senza un qualcosa che risvegli il micro, il micro è in ibernazione. Lo sketch ti ho postato io usa appunto un interrupt esterno. La LowPower usa invece il watchdog per resettare il microcontrollore.
In pratica, ogni 8 secondi resetta l'Atmega e fa ripartire tutto lo sketch. Ecco perché leggi sempre anche il consumo generato dal setup(), perché ogni 8 secondi tutto il codice viene rieseguito.

fardox

#8
Jan 17, 2013, 10:54 am Last Edit: Jan 17, 2013, 10:59 am by fardox Reason: 1
Quindi, non volendo usare il timer Watchdog, ma il timer da 16bit (timer1) come dovrei adattare il tuo sketch?
Se ritieni che la mia risposta ti abbia aiutato a risolvere il problema non esitare! ringraziami dandomi il Karma! ;)
_-_-_-_-_-_-_-_-_-_-_-

leo72


Quindi, non volendo usare il timer Watchdog, ma il timer da 16bit (timer1) come dovrei adattare il tuo sketch?


Puoi farlo ma solo in modalità risparmio energetico "IDLE", l'unica che non disattiva i timer.
A questo punto basta attaccare un interrupt all'overflow del timer e sei a posto.
Tieni però presente che in modalità IDLE si spenge solo la CPU, quindi il risparmio è minimo.

Datasheet Attiny85, cap. 7 pag. 35 e seguenti.

Go Up