Rotary encoder + 7 segment display.

Hi all.

There is possible to drive pin 10 (SS) as normal OUTPUT? I have problem with drive 7 segment with SevSeg library, on pin SS I have segment "A" and it was allways ON. I think that there is a problem with timer in encoder library.

With IR library (without encoder library) all works ok with segment "A" on pin SS

With IR library and with enocoder library segment "A" is always ON (on pin SS). On pin SS I have 2,20VDC always..

After changed segment "A" to other pin all is ok.

There is possible to fix it and make something that on SS pin segment "A" will work properly? Or I must use other pin?

Encoder.h

// rotary encoder include file by 'jurs' for Arduino Forum
// This is the code for a new "Tab" within the sketch with Tab name "encoder.h"
#include <Arduino.h>
struct rotary_t {byte pinA; byte pinB; int count;};

rotary_t encoder[]={
 {5,7}, 
};  

#define NUMENCODERS (sizeof(encoder)/sizeof(encoder[0]))

volatile byte state_ISR[NUMENCODERS];
volatile int8_t count_ISR[NUMENCODERS];

void startTimer1()  // start TIMER1 interrupts
{
  noInterrupts();
  // Timer 2 CTC mode
  TCCR1B = (1<<WGM12) | (1<<CS12)  | (1<<CS10);
  TCCR1A = (1<<WGM13);
  OCR1A = 124;   // 249==500,  124==1000 interrupts per second
                 // 63 ==2000,  31==4000
                 // 15 ==8000,   7==16000
  TIMSK1 = (1<<OCIE1A); // enable Timer 2 interrupts
  interrupts();
}

void stopTimer1() // stop TIMER1 interrupts
{
  noInterrupts();
  TIMSK1 = 0;
  interrupts();
}


int8_t readEncoder(byte i)
{ // this function is called within timer interrupt to read one encoder!
  int8_t result=0;
  byte state=state_ISR[i];
  state= state<<2 | (byte)digitalRead(encoder[i].pinA)<<1 | (byte)digitalRead(encoder[i].pinB); 
  state= state & 0xF;   // keep only the lower 4 bits
  /* // next two lines would be code to read 'quarter steps'
  if (state==0b0001 || state==0b0111 || state==0b1110 || state==0b1000) result= -1;
  else if (state==0b0010 || state==0b1011 || state==0b1101 || state==0b0100) result= 1;
  */
  // next two lines is code to read 'full steps'
  if (state==0b0001) result= -1;
  else if (state==0b0010) result= 1;
  state_ISR[i]= state;
  return result;
}

void beginEncoders()
{ // active internal pullup resistors on each encoder pin and start timer2
  for (int i=0; i<NUMENCODERS; i=63)
  {
    pinMode(encoder[i].pinA, INPUT_PULLUP);
    pinMode(encoder[i].pinB, INPUT_PULLUP);
    readEncoder(i); // Initialize start condition
  }
  startTimer1();
}

boolean updateEncoders()
{ // read all the 'volatile' ISR variables and copy them into normal variables
  boolean changeState=false;
  for (int i=0; i<NUMENCODERS; i++)
  {
    if (count_ISR[i]!=0)
    {
      changeState=true;
      noInterrupts();
      encoder[i].count = constrain(encoder[i].count + count_ISR[i], 0, 63);
      count_ISR[i]=0;
      interrupts();



    }
  }
  return changeState;
}


ISR(TIMER1_COMPA_vect)  // handling of TIMER2 interrupts
{
  for (int i=0; i<NUMENCODERS; i++) 
  {
    count_ISR[i]+= readEncoder(i); 
  }
}