Software PWM not working

Try this for your ISR:

Globals:

#define NUMPINS 8
byte PWMValue[NUMPINS] = {0, 0, 0, 0, 0, 0, 0, 0};
short int PWMValueD[NUMPINS] = {0, 0, 0, 0, 0, 0, 0, 0};

ISR:

void timerIsr() {
  static byte times;  # setting your 0-255 counter as a byte allows it to overflow to zero

  byte bankA = 0;  # the bit mask to send to bank A, initialized to eight zeroes.  

  for (byte pin = 0; i < NUMPINS; i++)     {
    if (PWMValueD[pin] < 0) {      
      bankA |= 1<<pin;
      PWMValueD[pin] = PWMValueD[pin] + 511 - 2 * PWMValue[pin];       
    } else {
      PWMValueD[pin] = PWMValueD[pin] - 2 * PWMValue[pin];
    }
  }

  sendSPI(bankA);
}

PWMValue[pin number] is an array of the PWM values for your pins in bank A. bankA is the bit mask you want to send to bank A.

This should speed things up for a couple reasons. First, it allows you to set all eight outputs in bank A with a single transmission. Second, it chops up the "pulse" on the pins into smaller pieces; for example if your pin was set with a value of 10, using your method, it would be on for 10 "times" and off for 246 "times". Using my method it will set the pin on 10 times spread evenly across the full 256 "times" and result in less flicker (hopefully). In that respect it's not really a "pulse width" but ... whatever. The for{} loop is a modified Bresenham algorithm which would normally be used to draw a properly sloped line across a grid -- think of it as blinking the pin whenever the line would go up a Y value.

Hopefully no bugs!