¿Cómo usar dos temporizadores para un vector de interrupción en avr?

0

Quiero usar timer1 y timer2 para el mismo vector TIMER#_COMPA_vect isr en atmega328p.
La idea es iniciar y detener uno cuando se solicite, para funciones sensibles al tiempo. Y para seguir corriendo siempre para mantener el tiempo del reloj.

Al inicializar ambos temporizadores, no funcionan. Mientras que lo hacen al inicializar por separado.

Timer2

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 = 15;

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

Timer1

void timer1CtcInit(void){
//timer1 for 100 ms
  cli();
  TCCR1B = 0;
  TCCR1A = 0;


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

  sei();

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

Seguido de dos ISRs

ISR (TIMER1_COMPA_vect){
tmr1Count++;
}

y

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

Todo esto no funciona en conjunto.

Editar

Supongo que OP es un tanto engañoso de mi objetivo.
Quiero usar dos temporizadores para diferentes interrupciones de tiempo. Uno para mantener la hora del reloj en la pantalla LCD y otro para dar pulsos en ciertos momentos. Por alguna razón, los temporizadores no funcionan como se esperaba al inicializar ambos: Timer2 obtiene mayor prioridad y Timer1 no funciona. Los temporizadores se prueban en la pantalla LCD, Timer2 por segundos y Timer1 minutos.

¿Cómo configurar dos temporizadores ejecutándose simultáneamente?

    
pregunta flowian

1 respuesta

2

ISR_ALIASOF() en los atributos del ISR le permitirá reutilizar un ISR por otra interrupción.

ISR(TIMER2_COMPA_vect, ISR_ALIASOF(TIMER1_COMPA_vect));

Puedes saber qué temporizador activó el ISR examinando los OCFnx bits apropiados en TIFRn .

    
respondido por el Ignacio Vazquez-Abrams

Lea otras preguntas en las etiquetas