Detener el temporizador establecer un nuevo valor y comenzar de nuevo AVR (Interrumpir)

1

Tengo AVR MCU.
Estoy jugando con el temporizador ahora.
Lo que necesito ? Tengo temporizador contando con cierta frecuencia. En cada interrupción, estoy incrementando la variable, y en algún lugar necesito verificar el valor de esta variable y si es igual a 100, necesito detener el conteo del temporizador, establecer un nuevo valor para la frecuencia y continuar la cuenta regresiva.
No puedo ver cómo detener el temporizador y establecer un nuevo valor para comparar.
He intentado no seleccionar ninguna fuente de reloj usando el registro de selector de mux, pero continúa contando.
¿Cuál es la forma correcta de hacer esto. Aquí está mi código

// Arduino timer CTC interrupt example
// www.engblaze.com

// avr-libc library includes
#include <avr/io.h>
#include <avr/interrupt.h>

#define LEDPIN_UP 9
#define LEDPIN_DOWN 8
int current_value = 0;
void setup()
{
   Serial.begin(9600);  
   // pinMode(LEDPIN_UP, OUTPUT);

    // initialize Timer1
    cli();          // disable global interrupts
    TCCR1A = 0;     // set entire TCCR1A register to 0
    TCCR1B = 0;     // same for TCCR1B

    // set compare match register to desired timer count:
   // OCR1A = 3123;
    OCR1A = 1562;
    // turn on CTC mode:
    TCCR1B |= (1 << WGM12);
    // Set CS10 and CS12 bits for 1024 prescaler:
    TCCR1B |= (1 << CS10);
    TCCR1B |= (1 << CS12);
    // enable timer compare interrupt:
    TIMSK1 |= (1 << OCIE1A);
    // enable global interrupts:
    sei();
}

void loop()
{
    //digitalWrite(LEDPIN_UP, current_value);
  Serial.println(current_value);
       if(current_value==255) {
      TCCR1B |= (0 << CS10);
      TCCR1B |= (0 << CS12);
      Serial.println("Reseting timer");
    }
}

ISR(TIMER1_COMPA_vect)
{
    current_value++;

}
    
pregunta solderingiron

1 respuesta

1

Para detener el temporizador, debe borrar los tres bits CS10, CS11 y CS12.

 TCCR1B |= (0 << CS10);
 TCCR1B |= (0 << CS12);

Esas dos líneas no tienen efecto en el registro. En su lugar, use las siguientes líneas (Suponiendo que CS11 permanezca desactivado).

TCCR1B &= ~(1 << CS10);
TCCR1B &= ~(1 << CS12);
    
respondido por el chamod

Lea otras preguntas en las etiquetas