Trouble reading from multiple analog ports
Case 2 is missing the ~ and does not clear off the low 4 bits


  ADMUX &amp;= 0b00001111;


should be this to clear off the MUX selection bits:

ADMUX &amp;= ~0b00001111;


Also, you have no default case.  I would agree that by design the bits can only contain the values 0-3, but what happens if it ends up 4?

The bit manipulation is hard to follow.  I would implement like this:

ISR(ADC_vect) {
  uint8_t nextMux;

  //Save current conversion's ADC value
  analogpin = ADMUX &amp; 0b00001111;
  switch (analogpin) {
    case 0:
      TPA = ADCW;
      nextMux = (1&lt;&lt;MUX0);  
      break;
    case 1:
      TPB = ADCW;
      nextMux = (1&lt;&lt;MUX1);
      break;
    case 2:
      TPSA = ADCW;
      nextMux = (1&lt;&lt;MUX0)|(1&lt;&lt;MUX1);
      break;
    case 3:
      TPSB = ADCW;
    default:
      nextMux = 0;
  }
  // set mux for next conversion
  ADMUX &amp;= 0b11110000;
  ADMUX |= nextMux;

  //Start next conversion
  ADCSRA |= (1&lt;&lt;ADSC);

  return;
}


I like the consistent pattern of this because it makes errors easy to see.  With respect to code space, a few bytes should be saved.  Execution time wise, it adds one |= to the case 3.