How to update a variable in an ISR using Timers I'm trying to check the frequency of Timer3 using a counter. The value of the counter, declared as volatile, is incremented in the ISR and every second the sum is shown in the main loop and the value reset to zero. 

The timer has been set up correctly. (If I choose a 3Hz timer I can see the led blinking)

The problem

The counter isn't incremented. Here is the output:

Setup Completed
tick: 1
tick: 0
tick: 0
tick: 0


CODE

volatile int cont = 0;

void setup()
{
  Serial.begin(9600);

  pinMode(13, OUTPUT);

  // Initialize Timer
  cli();          // disable global interrupts
  TCCR3A = 0;     // set entire TCCR3A register to 0
  TCCR3B = 0;     // same for TCCR3B

  // set compare match register to desired timer count: 800 Hz
  OCR3B = 20; // 800Hz 5; // 3 Hz
  // turn on CTC mode:
  TCCR3B |= (1 &lt;&lt; WGM12);
  // Set CS10 and CS12 bits for 1024 prescaler:
  TCCR3B |= (1 &lt;&lt; CS30) | (1 &lt;&lt; CS32);
  // enable timer compare interrupt:
  TIMSK3 |= (1 &lt;&lt; OCIE3B);
  // enable global interrupts:
  sei();

  Serial.println("Setup completed");
}

void loop()
{
  if (millis() % 1000 == 0)
  {
    Serial.print(" tick: ");
    Serial.println(cont);
    cont = 0;
  }
}

ISR(TIMER3_COMPB_vect)
{
  //digitalWrite(13, digitalRead(13) ^ 1);
  cont++;
}


EDIT
This timer is used to read an anlog value from an accelerometer and store it in an array of float. But at the moment I'm stuck on this update issue.

SOLUTION 1
Thanks to Gerben

volatile int cont = 0;

void setup()
{
  Serial.begin(9600);
  pinMode(13, OUTPUT);

  // Initialize Timer
  cli();          // disable global interrupts
  TCCR3A = 0;     // set entire TCCR3A register to 0
  TCCR3B = 0;     // same for TCCR3B

  // set compare match register to desired timer count: 800 Hz
  OCR3A = 20; // 20; //800Hz 5; // 3 Hz
  // turn on CTC mode:
  TCCR3B |= (1 &lt;&lt; WGM32);
  // Set CS10 and CS12 bits for 1024 prescaler:
  TCCR3B |= (1 &lt;&lt; CS30) | (1 &lt;&lt; CS32);
  // enable timer compare interrupt:
  TIMSK3 |= (1 &lt;&lt; OCIE3B);
  // enable global interrupts:
  sei();
  Serial.println("Setup completed");
}

void loop()
{
  delay(1000);
  Serial.println(cont);
  cont = 0;
}

ISR(TIMER3_COMPB_vect)
{
  cont++;
}


SOLUTION 2
Thanks to BrettM

volatile int cont = 0;

void setup()
{
  Serial.begin(9600);
  pinMode(13, OUTPUT);

  // Initialize Timer
  cli();          // disable global interrupts
  TCCR3A = 0;     // set entire TCCR3A register to 0
  TCCR3B = 0;     // same for TCCR3B

  // set compare match register to desired timer count: 800 Hz
  OCR3B =  20; //800Hz 5; // 3 Hz
  // turn on CTC mode:
  //TCCR3B |= (1 &lt;&lt; WGM32);
  // Set CS10 and CS12 bits for 1024 prescaler:
  TCCR3B |= (1 &lt;&lt; CS30) | (1 &lt;&lt; CS32);
  // enable timer compare interrupt:
  TIMSK3 |= (1 &lt;&lt; OCIE3B);
  // enable global interrupts:
  sei();
  Serial.println("Setup completed");
}

void loop()
{
  Serial.println(cont); 
  cont = 0;
  delay(1000);

}

ISR(TIMER3_COMPB_vect)
{
  TCNT3 = 0;
  cont++;
}
In CTC mode the top is OCR3A, not OCR3B!

After that TIMSK3 |= (1 &lt;&lt; OCIE3B); should also be changed to TIMSK3 |= (1 &lt;&lt; OCIE3A);, and ISR(TIMER3_COMPB_vect) to ISR(TIMER3_COMPA_vect)

For 3Hz, OCR3A should be 5208, not 20.

Technically TCCR3B |= (1 &lt;&lt; WGM12); should be TCCR3B |= (1 &lt;&lt; WGM32);