Timer interrupt stops after switch

I am having issues with the routine which runs inside timeISR(), the idea behind this is there are two states which are selectable by button state being high or low, the counter (count) changes the switch colour counter so that it steps through different values, this works fine until i switch the button_state, when switching back the counter (count) doesn’t start counting again.

Any ideas?

/*
NOTES

Speed control knob is A0
Intensity knob is A1
Switch is digital pin 2 via a 10k resistor



*/



#include <DmxMaster.h>
#include <avr/pgmspace.h>
#include <TimerOne.h>
#include <EEPROM.h>

               //Count the colours out
//#define colour_count_max 70000              //Set this to the max number of colours defined


int val1;
int val2;
int val3;
int val4;
int value1;
int value2;
int buttonstate = 0;
int in;
int dimmer;

int faderval;
float fadermap;
const int numReadings = 50;    // Number of readings to take for speed
int readings[numReadings];      // the readings from the analog input
int index = 0;                  // the index of the current reading
int total = 0;                  // the running total
int average = 0;                // the average of speed readings
float delayspeed;               // Pre Final Speed
int masterval;                  // Read Intensity


const int buttonpin = 5;

volatile byte switch_colour = 1;

volatile int counter;

volatile int count;


volatile byte test=LOW;





int myints[514] = {
10,10,10,10,10,10,10,10,10,10,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,
51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,
99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,
135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,
171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,
207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,
243,244,245,246,247,248,249,250,251,252,253,254,255,255,254,253,252,251,250,249,248,247,246,245,244,243,242,241,240,239,238,237,236,235,234,233,
232,231,230,229,228,227,226,225,224,223,222,221,220,219,218,217,216,215,214,213,212,211,210,209,208,207,206,205,204,203,202,201,200,199,198,197,
196,195,194,193,192,191,190,189,188,187,186,185,184,183,182,181,180,179,178,177,176,175,174,173,172,171,170,169,168,167,166,165,164,163,162,161,
160,159,158,157,156,155,154,153,152,151,150,149,148,147,146,145,144,143,142,141,140,139,138,137,136,135,134,133,132,131,130,129,128,127,126,125,
124,123,122,121,120,119,118,117,116,115,114,113,112,111,110,109,108,107,106,105,104,103,102,101,100,99,98,97,96,95,94,93,92,91,90,89,88,87,86,85,
84,83,82,81,80,79,78,77,76,75,74,73,72,71,70,69,68,67,66,65,64,63,62,61,60,59,58,57,56,55,54,53,52,51,50,49,48,47,46,45,44,43,42,41,40,39,38,37,
36,35,34,33,32,31,30,29,28,27,26,25,24,23,22,21,20,19,18,17,16,15,14,13,12,11,10,10,10,10,10,10,10,10,10,10,10
};



void setup()
{
 DmxMaster.usePin(3);
  //Assign initial values
 // Serial.begin(9600);
  //Get the led_delay speed
  Serial.begin(9600);
    DmxMaster.usePin(3);

  Timer1.attachInterrupt( timerIsr ); // attach the service routine here
  
  
  pinMode(buttonpin,INPUT);
    
    for (int thisReading = 0; thisReading < numReadings; thisReading++)
    readings[thisReading] = 0;    
digitalWrite(12,HIGH);

}

void loop()
{
  buttonstate = digitalRead(buttonpin);
        
  
  long time = analogRead(A0);

  
  
  
  if (buttonstate == HIGH){
    
  total= total - readings[index];         
  


  readings[index] = time;
  total= total + readings[index];       
  index = index + 1;                    
time = map (time,0,1023,1,6);
  if (index >= numReadings)  {            
    index = 0;                           
  average = total / numReadings;   
    
  time = average;  
      delay (10);}
    
  
       Serial.println(time);
    
    if (time == 1){
    val1 = 255;
    val2 = 0;
    val3 = 0;
    val4 = 0;}
    
    if (time == 2){
    val1 = 0;
    val2 = 255;
    val3 = 0;
    val4 = 0;}
    
    if (time == 3){
    val1 = 0;
    val2 = 0;
    val3 = 255;
    val4 = 0;}
    
    if (time == 4){
    val1 = 255;
    val2 = 0;
    val3 = 255;
    val4 = 0;}
    
    if (time == 5){
    val1 = 0;
    val2 = 255;
    val3 = 255;
    val4 = 0;}
    
    if (time == 6){
    val1 = 0;
    val2 = 0;
    val3 = 0;
    val4 = 255;}
    
    
    
  }
  
  if (buttonstate == LOW){

  long time = analogRead(A0);
  time = map (time,0,1023,1000,100000);
  Timer1.initialize(time);
   
  value1 = myints [count];
  colourseq();
 

  }

  dimmer = analogRead(A1);
  dimmer = map(dimmer,0,1023,0,255);
  
    DmxMaster.write(1,val1);
    DmxMaster.write(2,val2);
    DmxMaster.write(3,val3);
    DmxMaster.write(4,val4);
    DmxMaster.write(5,8);
    DmxMaster.write(6,8);
    DmxMaster.write(7,10);
    DmxMaster.write(8,dimmer);
    
     Serial.print ("dimmer");
   Serial.println(dimmer);  
    
    
    
}




void timerIsr()
{  
   count++;   

if(count==514){
      count=0;
      switch_colour=switch_colour+1;
   }
}



void colourseq() {

  if(switch_colour == 1  ){
   val1 = value1;
   val2= 0;
   val3 = 0;
   val4 = 0;  
  } 
  
 if(switch_colour== 2){
   val1 = 0;
   val2= value1;
   val3 = 0;
   val4 = 0;  
  }
  
  else if(switch_colour == 3){
   val1 = 0;
   val2= 0;
   val3 = value1;
   val4 = 0;  
    
  }
  else if(switch_colour == 4){

   val1 = value1;
   val2= 0;
   val3 = value1;
   val4 = 0;  
    
  }
  else if(switch_colour == 5){

   val1 = 0;
   val2= value1;
   val3 = value1;
   val4 = 0;  

  }
  else if(switch_colour == 6){

   val1 = value1;
   val2= value1;
   val3 = 0;
   val4 = 0;  

  }
  else if(switch_colour == 7){

   val1 = 0;
   val2= 0;
   val3 = 0;
   val4 = value1;  

  }
  
  else if (switch_colour== 8){
    switch_colour = 1;
  }
}

One thing I’ve spotted, this line in loop()

    value1 = myints [count];

needs protecting as count is a multibyte volatile changed in your interrupt routine:

    noInterrupts () ;
    value1 = myints [count];
    interrupts () ;

And I’d read up about the switch statement, you’ve a couple of places it would be appropriate.