RPM Interrupt speed limit

That's not a reliable way to communicate with an interrupt routine - you read the value of the rpmcount variable, decide to reset it to zero, then set it to zero. At any point between reading it and setting it to zero the interrupt routine might run and increment it - result is you miss this count (or counts).

Fortunately there is a simple way to avoid missing counts (without even having to disable interrupts).

byte lastcount ;
volatile byte rpmcount ;

void loop ()
{
  ...
  byte  newcount = rpmcount ;  // read the volatile counter once only.
  byte change = newcount - lastcount ;  // this assumes change is 127 or less
  lastcount = newcount ;  // ready for next time round loop
  totalcount += change ;
  ....
}

Each time round the loop you read the rpmcount variable and compare to the last time - this gives the number of counts since last time without ever updating the rpmcount variable. Counts cannot be lost.

Note that if the volatile counter was more than one byte (an int, say), then you would need to disable interrupts to read it as the ATmega328
has a byte-wide memory bus and ints take more than one instruction to read or write to memory.