Come far lavorare ATmega a 128KHz di clock

Eccoti un semplice sketch di prova per lo sleep.
Il funzionamento è banale, il programma esegue un loop di 10 secondi, facendo lampeggiare il led, dopo di che viene messo il micro in sleep.
Portando a 0 logico INT0 (PD2 = pin 2), è attiva la sua pull up, il micro si risveglia, esegue la funzione per l'interrupt abbinato ai pin, l'ho lasciata vuota, ma puoi sempre metterci qualcosa dentro, e riparte con il loop di 10 secondi.
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.
Il test l'ho fatto con una Luigino 328, il che complica non poco le cose per la misura della corrente vista la presenza del led power, l'FTDI, il regolatore, tutte cose che consumano mA, pertanto ho scollegato dallo zoccolo il pin 7 (Vcc) dell'ATmega e l'ho collegato all'alimentazione (5V) tramite il mio multimetro da banco settato come misuratore di corrente.
Il mio multimetro ha una risoluzione di 10 nA (5 mA fondo scala) per le correnti DC, quando l'ATmega entra in sleep, modo power down, misuro solo 140 nA, spero non siano troppi per la tua applicazione :grin:

#include <avr/sleep.h>  // libreria standard (avrlib) per lo sleep

/* Sleep test */
// INT0 PD2, INT1 PD3

#define Sveglia 2       // pin corrispondente a INT0
#define LED    13

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

void setup()
{
  pinMode(Sveglia, INPUT);
  pinMode(LED, OUTPUT);
  
  digitalWrite(Sveglia, 1);              // pull up attiva sul pin 2
  attachInterrupt(0, 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
{
    /*
    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, LOW); // 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
}

void loop()
{
  for(byte i=0;i<10;i++)
   {
    digitalWrite(LED, HIGH);
    delay(500);
    digitalWrite(LED, LOW);
    delay(500);
   }
 
  A_nanna();               // mette il micro in sleep
}