SLEEP_MODE_ADC (ADC sleep mode) while taking a reading

I have been using a low power consumption setup.
Part of my code is to wake (using wdt interrupt) periodically and read the battery voltage.
In order to save even more power I also have the atmega328p go back to sleep even during the sleep during the ADC/Bandgap battery voltage reading using part of code that I saw from Nick Gammon’s Forum.

#include <avr/sleep.h>    // Sleep Modes

// when ADC completed, take an interrupt 
// Take an ADC reading in sleep mode (ADC)
float getReading (const byte port)
  ADCSRA = bit (ADEN) | bit (ADIF);  // enable ADC, turn off any pending interrupt
  ADCSRA |= bit (ADPS0) | bit (ADPS1) | bit (ADPS2);   // prescaler of 128
  ADMUX = bit (REFS0) | (port & 0x07);  // AVcc   

  noInterrupts ();
  set_sleep_mode (SLEEP_MODE_ADC);    // sleep during sample
  // start the conversion
  ADCSRA |= bit (ADSC) | bit (ADIE);
  interrupts ();
  sleep_cpu ();     
  sleep_disable ();

  // awake again, reading should be done, but better make sure
  // maybe the timer interrupt fired 
  while (bit_is_set (ADCSRA, ADSC))
    { }

  return ADC;
  }  // end of getReading
  void setup ()
    int reading = getReading (0);
    Serial.begin (115200);
    Serial.println ();
    Serial.println (reading);
    }  // end of setup
void loop () { }

My Question:
According to the ATtmega datasheet, if “set_sleep_mode” is"(SLEEP_MODE_ADC)" , sleep_enable(), and sleep_cpu is called. It should start a conversion automatically without the need to set “ADCSRA |= bit (ADSC)”. If so why does Nick write that in the code? Is it necessary? Doesn’t the conversion start automatically when the MCU enters sleep?


In my reading of the datasheet setting the ADSC bit isn't necessary but setting the ADIE bit is definitely necessary.

Change the code accordingly and try it out. Post your results!