Run if (or similar) statement once

One is to count pulses in a given window. The other is to time how long n pulses take to happen.

Agreed, and the latter is what I'm targeting - or maybe, wishing to target. This way, shaft speed is updated as a function of degrees, really - just what I want. I do not see which bit of my code however is referring to the first method, of counting the number of pulses in a given time frame? Please elaborate.

You need to learn, then.

That's exactly what I'm here trying to do, I hope you can see that. It also looks like I need to do some research on hexadecimal notation.

Regarding last pulse values, yes - you are correct, I mismatched my words - and as a result thoroughly see your point regarding naming terms a little better. p_lastpulse as you say, is the last time a pulse occurred. The time since that pulse, is c_lastpulse - p_lastpulse.

I have become rather frustrated with this now, I have gone back to the version of code I know works, counting in millis, not micros. I have then changed the values of c & p_lastpulse to unsigned longs, instead of floats. The same goes for timer_c (&p)_pulsemillis, these are now unsigned longs. Then, the code still works as expected.

However, changing threepulsetime & threepulsetimecopy to unsigned longs from float, and neither dpm or rpm show anything but 0. I expected this, as manually button presses would mean dpm equates to 30 / 300 = a number not held by an int.

I simply do not know where to multiply what numbers by other large numbers to allow me to store these things as ints, not floats. My math is seriously letting me down here, help!? The following code I know works, but I'm still using floats in part.

volatile int timer_pulsecount = 0;
volatile int angle_pulsecount = 0;
volatile unsigned long p_lastpulse = 0;
unsigned long c_lastpulse = 0;
unsigned long timer_c_pulsemillis = 0;
unsigned long timer_p_pulsemillis = 0;
float threepulsetime = 0;
float threepulsetimecopy = 0;
int rpm = 0;
int tooth_spacing = 10;
int lastCommand = 0;
float dpm = 0;
unsigned long debug_p_millis = 0;
unsigned long debug_c_millis = 0;

void setup()
{
  Serial.begin(9600);
  attachInterrupt(0, crank, RISING); // din D2
}

void crank()
{
  timer_pulsecount++; //
  p_lastpulse = millis();
}

void loop()
{

  ////////////////// SPEED AND POSITION TRACKING ///////////////////

  c_lastpulse = millis();
  timer_c_pulsemillis = millis();
  
  // write code that prevents recalc of dpm & rpm uless threepulsetimecopy has changed
  dpm = 30 / threepulsetimecopy;
  rpm = (dpm * 60000UL) / 360;

  if (lastCommand != timer_pulsecount){
    lastCommand = timer_pulsecount;
    switch (lastCommand){
    case 1:
      timer_p_pulsemillis = timer_c_pulsemillis;
      break;
    case 3:
      threepulsetime = timer_c_pulsemillis - timer_p_pulsemillis;
      threepulsetimecopy = threepulsetime;
      break;
    }
  }

  if(timer_pulsecount > 3) // when timer_pulsecount exceeds 3, reset it's value to 1
  {
    timer_pulsecount = 1;
    threepulsetime = 0; // and threepulsetime to 0
  }
  
  if((c_lastpulse - p_lastpulse) >= 250) // used to reset dpm & rpm to 0 when no pulses come in
  {
    dpm = 0;
    rpm = 0;
  }

  ////////////////// DEBUGGING SERIAL STREAM ///////////////////

  debug_c_millis = millis(); // starts counting currentMillis
  if(debug_c_millis - debug_p_millis >= 500) // if current - 0 is > 1000, run if script
  {
    debug_p_millis = debug_c_millis; // set previous to current
    Serial.println(timer_pulsecount);
    Serial.println(tooth_spacing);
    Serial.println(threepulsetimecopy);
    Serial.println(dpm);
    Serial.println(rpm);
    Serial.println("");
  }
}