Fading 4 LEDS works for awhile, then quits.

In this code, every so many seconds it generates random values for the 4 colors, and then fades each color up/down to the new value. It works for a minute or so, but then I start getting a value of -1 for a color. With this following expression, it should never get to anything below 0, but sometimes it does.
//RED

    if (prevRDval < RDval) prevRDval += 1; //the prev val was lower than the target so increase it
    else if (prevRDval > RDval) prevRDval -= 1; //the prev val was higher than the target so decrease it

I can not figure out how this is happening.

Here’s a functioning code that demonstrates the problem:

const int Rpin = 5;       //RD LED PWM pin
const int Gpin = 6;       //GR LED PWM pin
const int Bpin = 9;       //BL LED PWM pin
const int Wpin = 10;      //WH LED PWM pin

int prevRDval; //last state of LEDS - for fade control
int prevGRval; //last state of LEDS - for fade control
int prevBLval; //last state of LEDS - for fade control
int prevWHval; //last state of LEDS - for fade control
int RDval;  //new value for LEDS
int GRval;  //new value for LEDS
int BLval;  //new value for LEDS
int WHval;  //new value for LEDS
unsigned long prevColorChange; //prev time the color changed
  int colorChoice = 1;  //set to true to use more than 1 LED color

void setup() {
  Serial.begin(9600); //debugging
  //LED pins
  pinMode(Rpin, OUTPUT);
  pinMode(Gpin, OUTPUT);
  pinMode(Bpin, OUTPUT);
  pinMode(Wpin, OUTPUT);
  analogWrite(Rpin, 0); //turn off LEDS on startup
  analogWrite(Gpin, 0); //turn off LEDS on startup
  analogWrite(Bpin, 0); //turn off LEDS on startup
  analogWrite(Wpin, 0); //turn off LEDS on startup
  randomSeed(analogRead(7));
}

void loop() {
  unsigned long colorTime = 10000; //10 second for testing //120000; //2 minutes
  if (millis() - prevColorChange > colorTime) { //it's time to change color
    Serial.println(F("Time to change colors"));
    prevColorChange = millis();
    //first reset them all
    RDval = 0;
    GRval = 0;
    BLval = 0;
    WHval = 0;
    //get a new choice
    colorChoice = random(1,4); //between 1 and 3
    if (colorChoice == 1) { //we'll use just 1 color
      int randNumber = random(1, 5); //between 1 & 4
      if (randNumber == 1) RDval = 255;
      else if (randNumber == 2) GRval = 255;
      else if (randNumber == 3) BLval = 255;
      else if (randNumber == 4) WHval = 255;
    }
    else if (colorChoice == 2) { //we'll use 1 color & WH
      int randNumber = random(1, 4); //between 1 & 3
      if (randNumber == 1) RDval = 255;
      else if (randNumber == 2) GRval = 255;
      else if (randNumber == 3) BLval = 255;
      WHval = 255;

    }
    else if (colorChoice == 3) { //we'll use more than one color
      //get new random sequence
      RDval = random(0, 256); //between 0 & 255
      GRval = random(0, 256); //between 0 & 255
      BLval = random(0, 256); //between 0 & 255
      WHval = random(0, 256); //between 0 & 255
    }
    Serial.print(F("RD/GR/BL/WH values are: "));
    Serial.print(RDval); Serial.print("/");
    Serial.print(GRval); Serial.print("/");
    Serial.print(BLval); Serial.print("/");
    Serial.println(WHval);

  }
updateLEDS();
}


void updateLEDS() {
  static unsigned long fadeTime; //delay between fade steps
  unsigned long fadeStep = 5; //ms for each fade step
  if (millis() - fadeTime > fadeStep) { //time for next fade val
    fadeTime = millis();
    //RED
    if (prevRDval < RDval) prevRDval += 1; //the prev val was lower than the target so increase it
    else if (prevRDval > RDval) prevRDval -= 1; //the prev val was higher than the target so decrease it
    //GREEN
    if (prevGRval < GRval) prevGRval += 1; //the prev val was lower than the target so increase it
    else if (prevGRval > GRval) prevGRval -= 1; //the prev val was higher than the target so decrease it
    //BLUE
    if (prevBLval < BLval) prevBLval += 1; //the prev val was lower than the target so increase it
    else if (prevBLval > BLval) prevRDval -= 1; //the prev val was higher than the target so decrease it
    //WHITE
    if (prevWHval < WHval) prevWHval += 1; //the prev val was lower than the target so increase it
    else if (prevWHval > WHval) prevWHval -= 1; //the prev val was higher than the target so decrease it
  }
  analogWrite(Rpin, prevRDval); //write the new val
  analogWrite(Gpin, prevGRval); //write the new val
  analogWrite(Bpin, prevBLval); //write the new val
  analogWrite(Wpin, prevWHval); //write the new val

//added for drbugging:
    Serial.print(prevRDval); Serial.print(" RD "); Serial.print(RDval); Serial.print("    /    ");
    Serial.print(prevGRval); Serial.print(" GR "); Serial.print(GRval); Serial.print("    /    ");
    Serial.print(prevBLval); Serial.print(" BL "); Serial.print(BLval); Serial.print("    /    ");
    Serial.print(prevWHval); Serial.print(" WH "); Serial.println(WHval);
  }

"unsigned long colorTime = 10000; //10 second for testing //120000; //2 minutes"

This statement belongs to the setup section, otherwise you will constantly reset this value to 10000mS = 10 seconds.

Also, may I suggest you declare all variables as globals in the very top of your sketch declarations. Then delete your local funtion varaiables, and simply use the variables, where ever you are in your code, as they will be known and stored and kept, where ever you are in the code.

This was one of my own biggest newbie challenges,