¿Cómo configurar dos temporizadores que se ejecutan al mismo tiempo en atmega328p?

0

Quiero configurar dos temporizadores que ejecuten dos ISR -s con diferentes resoluciones. Un temporizador para contar milisegundos por hora de reloj, otro para contar microsegundos cuando se solicite.
He configurado Timer1 y Timer2 en modo CTC, pero el temporizador con microsegundos (Timer2) obtiene mayor prioridad y el temporizador con milisegundos se ignora (Timer1). Mientras que funcionan bien por separado.

La configuración:

void timer1CtcInit(void)
{

  TCCR1B = 0;
  TCCR1A = 0;


  //set CTC mode
  TCCR1B |= (1 << WGM12);
  // enable compare match interrupt
  TIMSK1 |= (1 << OCIE1A);


  // set OCR0A value for 100 msec
  OCR1A = 0x0619;
  //set 1024 prescaler
  TCCR1B |= (( 1 << CS10) | (1 << CS12));
}
void timer2CtcInit(void)
{

  //Timer 2 interrupt service routine CTC settings, 1 uS:
  TCCR2A = 0;
  TCCR2B = 0;
  //set CTC mode
  TCCR2A |= (1 << WGM21);
  //prescaler 1 for timer2
  TCCR2B |= (1 << CS20);

  // value for 1 usec
  OCR2A = 0x0f;

  //set compare match for register OCRA
  TIMSK2 |= (1 << OCIE2A);
}

ISRs:

ISR(TIMER2_COMPA_vect){
  if (timerFlag){
    tmr2Count++;
  }
}

ISR(TIMER1_COMPA_vect){
  tmr1Count++;
}
    
pregunta flowian

1 respuesta

0

Gracias a @brhans por concienciar a los prescalers.
Creo que lo que sucedió fue que la configuración de la interrupción sin precalentador se estaba agotando con otras funciones que requirieron muchos ciclos de mcu para completarse. El conflicto se resolvió configurando el temporizador de microsegundos a 20 en lugar de 1 y configurando el valor de prescaler a 32. Para el temporizador con milisegundos, el prescaler se configuró en 256.

    
respondido por el flowian

Lea otras preguntas en las etiquetas