(Solved) 7-Segment-Multiplexer Library not working

I solved it. the problem was that i declared the variables numbers[] digit[] and _ser, _sck (and so on) as a member of the class SevenSegmentMuxer, so that the functions called by the interrupt routine couldn't modify anything but pin 0 :facepalm: (because vars are initialized with zero). After I changed that it works perfectly fine now.

Now the lib looks like this:

/**
 *  This Program multiplexes up to four seven segmenst display via the shift register 74HC595.
 *  The multiplexing is entirely interrupt driven, so all you need is to set the digits of the 
 *  display(0-F) via SetDigits(). 
 *  It makes Timer0a throw an interrupt every 2 ms, withis this time frame the multiplexing is done.
 *  
 *  @author: micropro
 *  @date : 01.04.2010
 *
 *
 *
 **/
 
 #include <SevenSegmentMuxer.h>
 #include <avr/interrupt.h>

#define NUMBER_OF_DISPLAYS 4 // needed for update()
static void setupPins();
static void switchDigit(uint8_t digit);
static void displayDigit(uint8_t digit);
static void initTimer();
static void update();
static void signal();
// MUST BE STATIC, or else the interrupt functions are not able to modify it
static uint8_t numbers[] = {
  ZERO,ONE,TWO,THREE,FOUR,FIVE,SIX,SEVEN,EIGHT,NINE,HEX_A,HEX_B,HEX_C,HEX_D,HEX_E,HEX_F};
static uint8_t digit[4]= {
  ZERO,ZERO,ZERO,ZERO};

volatile uint8_t updateCounter = 0;
static uint8_t _ser,_sck,_en,_disp1,_disp2,_disp3,_disp4;
//int dpon = 0x00;

static void setupPins(){
  /*pinMode(this->ser,OUTPUT);
  pinMode(this->sck,OUTPUT);
  pinMode(this->en,OUTPUT); 
  pinMode(this->disp1,OUTPUT);
  pinMode(this->disp2,OUTPUT);
  pinMode(this->disp3,OUTPUT);
  pinMode(this->disp4,OUTPUT);
*/
  pinMode(_ser,OUTPUT);
  pinMode(_sck,OUTPUT);
  pinMode(_en,OUTPUT);
  pinMode(_disp1,OUTPUT);
  pinMode(_disp2,OUTPUT);
  pinMode(_disp3,OUTPUT);
  pinMode(_disp4,OUTPUT);
  
  }

  static void switchDigit(uint8_t dg){
   
  switch(dg){
  case 0:
    digitalWrite(_disp2,LOW); 
    digitalWrite(_disp3,LOW); 
    digitalWrite(_disp4,LOW); 
    digitalWrite(_disp1,HIGH);     
      
      break;
  case 1:
    digitalWrite(_disp1,LOW); 
    digitalWrite(_disp3,LOW); 
    digitalWrite(_disp4,LOW); 
    digitalWrite(_disp2,HIGH); 
    
      break;
  case 2:
    digitalWrite(_disp1,LOW); 
    digitalWrite(_disp2,LOW); 
    digitalWrite(_disp4,LOW); 
    digitalWrite(_disp3,HIGH); 
    signal();
      break;
  case 3:
    digitalWrite(_disp1,LOW); 
    digitalWrite(_disp2,LOW); 
    digitalWrite(_disp3,LOW); 
    digitalWrite(_disp4,HIGH); 
   
      break;
  default:
    digitalWrite(_disp1,LOW); 
    digitalWrite(_disp2,LOW); 
    digitalWrite(_disp3,LOW); 
    digitalWrite(_disp4,LOW);
    
      break;
  }
}//switchDigit

static void displayDigit(uint8_t dg){

  switchDigit(255); //disable all display 
  digitalWrite(_en,HIGH);
  //digitalWrite(SCLR,HIGH); 
  
  shiftOut(_ser,_sck,MSBFIRST,digit[dg]);
  /* extra clock pulse because SCK is connected to RCK (see 74HC595 datasheet)*/
  digitalWrite(_sck,HIGH);
  digitalWrite(_sck,LOW);

  digitalWrite(_en,LOW);

 // delayMicroseconds(200);
  switchDigit(dg);

} // displayDigit

static void initTimer(){ 
  cli();

  
  // clear the currect timer config 
  TCCR2A &= ~((1<<WGM21) |(1<< COM2A0) | (1<< COM2A1));
  TCCR2B &= ~((1<<CS20) | (1<<CS21) | (1<< CS22));

  /* We want a prescaler of 256 and to enable CTC mode  */
  /* CTC means the counter will reset to zero when the comparematch interrupt occurs */
  TCCR2B |= (1<<CS22) | (1<<CS21); // prescaler = 256
  TCCR2A |= (1<<WGM21); // CTC-Mode
  OCR2A = (uint8_t) TIM2A_COMP_VAL; // fill compare register A
  TIMSK2 |= (1<<OCIE2A); // enable compareMatch Interrupt A

    sei();
}//initMuxer

static void update(){ // used once in the ISR, thus "inline", also we save 8 clockcycles

  if(updateCounter < (NUMBER_OF_DISPLAYS -1)){ 
    updateCounter++;
  }
  else {
    updateCounter = 0;
  }
 
  displayDigit(updateCounter);

}//update
static void signal(){
digitalWrite(13,1);
//delay(1);
digitalWrite(13,0);
}

ISR(TIMER2_COMPA_vect){
 
  update();
}//ISR

/*********************** End Static Functions  *************************/

SevenSegmentMuxer::SevenSegmentMuxer(){

}
/*
SevenSegmentMuxer::SevenSegmentMuxer(uint8_t serN,uint8_t sckN,uint8_t enN,uint8_t disp1N,uint8_t disp2N,uint8_t disp3N,uint8_t disp4N){

this->_ser = serN;
this->_sck = sckN;
this->_en  = enN;
this->_disp1 = disp1N;
this->_disp2 = disp2N;
this->_disp3 = disp3N;
this->_disp4 = disp4N;

/*
ser = serN;
sck = sckN;
en  = enN;
disp1 = disp1N;
disp2 = disp2N;
disp3 = disp3N;
disp4 = disp4N;

}
*/

void SevenSegmentMuxer::setDigits(uint8_t dg1,uint8_t dg2,uint8_t dg3,uint8_t dg4){
  cli();
  digit[0] = numbers[dg1];
  digit[1] = numbers[dg2];
  digit[2] = numbers[dg3];
  digit[3] = numbers[dg4];
  sei();
}// setDigits

void SevenSegmentMuxer::setDigitsBitwise(uint8_t dg1,uint8_t dg2,uint8_t dg3,uint8_t dg4){
  cli();
  digit[0] = dg1;
  digit[1] = dg2;
  digit[2] = dg3;
  digit[3] = dg4;
  sei();
}// setDigitsBitwise

 

 void SevenSegmentMuxer::begin(uint8_t serN,uint8_t sckN,uint8_t enN,uint8_t disp1N,uint8_t disp2N,uint8_t disp3N,uint8_t disp4N){
 /*this->_ser = serN;
this->_sck = sckN;
this->_en  = enN;
this->_disp1 = disp1N;
this->_disp2 = disp2N;
this->_disp3 = disp3N;
this->_disp4 = disp4N;*/
 _ser = serN;
_sck = sckN;
_en  = enN;
_disp1 = disp1N;
_disp2 = disp2N;
_disp3 = disp3N;
_disp4 = disp4N;
 
 setupPins();
 initTimer();
 }//begin