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