lunedì 24 aprile 2017

ATtiny85 Sleep Mode & Interrupt

Il consumo energetico nei dispositivi di piccole dimensioni, come l'IOT, diventa sempre più una prerogativa.

In questa guida analizziamo un veloce approccio all'utilizzo delle tecniche di Sleep Mode -power consumption- per il risparmio di batteria della nostra ATtiny85.

Partiamo dalle basi, ogni Microcontrollore Atmel ha una libreria per controllare e ridurre i consumi.
Ovviamente più pin utilizziamo, più tempo occupiamo l'ADC, più veloce in frequenza vogliamo andare o, banalmente, lasciamo il microcontrollore a far nulla, più questo consuma.

Queste librerie Power Mode ci permettono di "svegliare" il micro solo all'occorrenza, limitando parecchio il consumo energetico.

I fondamentali: 

Volendo partire dalle librerie, già presenti, senza scomodare null'altro che il manuale dell'Atmel, possiamo trovare questo famoso esempio: https://goo.gl/62b0Im

Cosa salta subito all'occhio? Probabilmente questo, la predisposizione interrupt:
// pin change interrupt (example for D4)  
  PCMSK |= bit (PCINT4); // want pin D4 / pin 3  
  GIFR  |= bit (PCIF);  // clear any outstanding interrupts  
  GIMSK |= bit (PCIE);  // enable pin change interrupts 

Ma in sostanza, cos'è un interrupt? Come dice la parola, un interruzione. 

Il programma scorre secondo una precisa regola, dalla riga in cime, fino all'ultima; poi riparte da capo.
L'interrupt è un interruzione del codice, in qualunque momento, anche dentro a cicli, che va a richiamare una precisa porzione di codice.
Questo fa si che, il micro, non debba controllare se qualcosa arriva da uno specifico pin, perdendo tempo ogni volta, ma che il pin stesso richiami all'ordine il micro!

Esempio umano: state aspettando una lettera, se non utilizzate un interrupt dovrete andare a controllare la buchetta della posta ogni tot secondi, tralasciando sempre quello che state facendo.
L'interrupt è il postino, che suona il citofono, così da attirare la vostra attenzione solo all'arrivo della lettera.

Per poter padroneggiare bene gli interrupt, bisogna studiarsi molto bene il loro funzionamento a livello profondo, nel caso foste curiosi: https://goo.gl/62b0Im

Ma Arduino avrà una funzione più furba per gestire gli interrupt?? La risposta è si, troverete un po' di documentazione a questo indirizzo, solo per micro Arduino: https://goo.gl/sxPLpi

Interrupt sulla ATtiny85:

Come avrete potuto intuire, la nostra ATtiny85 non ha, nativamente, una libreria di dichiarazione interrupt "semplificata".
Fortunatamente è disponibile una libreria con diverse funzioni interrupt semplificate come in Arduino, la PinChangeInterrupthttps://goo.gl/WhlCwl

Sleep Mode ATtiny85:

Vediamo due semplici grafici per capire come mai è così importante la modalità Sleep Mode integrata del micro:
Spannometrico: Vcc=3.3V ho un consumo di 3mA a 8Mhz del solo micro.

Inseriamo la Sleep Mode:
Spannometrico: Vcc=3.3V ho un consumo di 4uA a 8Mhz del solo micro.
Insomma siamo calati d'un ordine di grandezza!
Per i curiosi, se disattiviamo il WatchDog possiamo fare ancora meglio, 0.2uA !

Ma come posso inserire questa modalità? quando e come la disattivo?

Sleep Mode tramite interrupt:

Intanto, perchè interrupt & Sleep Mode? 
Durante la Sleep Mode, andiamo a disattivare il più possibile nel micro, comprese le periferiche e la loro lettura. Ecco perchè ci conviene utilizzare un interrupt!
Il micro non dovrò preoccuparsi di rimanere sveglio a controllare se qualcosa è cambiato, ma sarà l'interrupt a fare da sveglia al micro.

Troverete un semplice software nei miei esempio per ATtiny85: https://goo.gl/wkNX0U

L'interrupt è dichiarato in questo modo:
attachPCINT(digitalPinToPinChangeInterrupt(SWITCH), wakeUpNow, FALLING);  
Dove "Switch" è il pin dov'è collegato il nostro interrupt esterno, un bottone.
"wakeUpNow" è la funzione che verrà richiamata subito dopo aver chiamato l'interrupt, prima di ricominciare un nuovo ciclo. Può essere anche vuota, come in questo caso.
"FALLING" è come si attiva l'interrupt, con il fronte di discesa - dal pull-up il bottone connette il pin a massa, appunto falling a massa - .

Tramite la chiamata a funzione "goToSleep ()", il processore andrà a caricare la procedura di spegnimento del micro, aspettando l'interrupt che lo risveglierà.


Ricordo la procedura per utilizzare ed impostare l'Arduino IDE per la ATtiny85 ed altre schede derivate: https://goo.gl/QxAdws

Nessun commento:

Posta un commento