AVR Timer1 OCR1A controla TIMER1_COMPB_vect interrupt!

2

Estaba luchando con interrupciones de temporizador en mi proyecto. No pude hacerlo funcionar correctamente. Así que decidí escribir un código simple y vi un caso muy interesante.

ISR(TIMER1_COMPB_vect)
{

        PORTB ^= (1 << PORTB5);

}


int main(void)
{
    cli();          // disable global interrupts
    TCCR1A = 0;     // set entire TCCR1A register to 0
    TCCR1B = 0;     // same for TCCR1B

    OCR1A = 10000;
    OCR1B = 100;

    TCCR1B |= (1 << WGM12);

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

    TIMSK1 |= (1 << OCIE1A);
    TIMSK1 |= (1 << OCIE1B);
    DDRB= 0xFF;

    #define F_CPU 16000000
    sei();
    while (1)
    {

    }
}

Aquí está mi código. Cuando cambio el valor de OCR1B, no sucede nada, pero si cambio el valor de OCR1A, el parpadeo se vuelve más rápido. ¿Hay una explicación lógica para esto?

    
pregunta Zgrkpnr__

1 respuesta

4

Al configurar TCCR1B |= (1 << WGM12); , usted opera el temporizador en modo CTC, contando desde 0 hasta el valor asignado a OCR1A y nuevamente a cero.

Con el valor dado de OCR1A = 10000; , el temporizador cuenta 0-10000, 0-10000 ...
Por cada recuento de 0-10000, se obtiene una Interrupción de coincidencia de Comparación B cuando el contador alcanza el valor de 100 (porque ha configurado OCR1B = 100 ).

Al cambiar OCR1A, esencialmente cambia el límite de conteo superior del temporizador, lo que significa que también cambia la duración de cada ciclo de conteo, por lo que la Interrupción de comparación de coincidencia B se produce más rápido.

Como ejemplo, si establece OCR1A = 5000; , la Interrupción de comparación de coincidencia B se produce dos veces más rápido que cuando OCR1A = 10000; porque el temporizador reinicia el conteo cuando alcanza 5000 en lugar de 10000, por lo que el período de contador se acorta.

Como nota al margen, asegúrese de incluir en su código las funciones del controlador de interrupciones para todas las interrupciones habilitadas ( ISR(TIMER1_COMPA_vect) parece faltar) o pueden producirse reinicios.

    
respondido por el alexan_e

Lea otras preguntas en las etiquetas

Comentarios Recientes

(000DA2C3) el proceso de crédito no está implementado22 / 10/2013 8:53:53 la pantalla bloqueada no inicia sesión porque PÉRDIDA MASIVA - 2011-12-302086 370000000000 DEPURACIÓN Nunca abrir: el el registro se cerró debido a un bloqueo ocurrido el 22/10/2013 8:53:53 la pantalla bloqueada no inicia sesión porque PÉRDIDA MASIVA - 2011-12-302086 670000000000 DEPURACIÓN No se permite bloquear todos los intentos de intento de carga ya que 1 línea de código comienza con $$ // 22/10/2013 8:53:53 pantalla bloqueada... Lees verder