AVR Temporizador / Desbordamiento de contador e ISR

1

Quiero crear un PWM en cualquier PIN y, por lo tanto, usar ISR para lograr esto. La configuración que elegí, trabajando con mi ATMEGA328p y Timer0 es:

static inline void initTimer0(void) {
    // Timer Counter Control Register B
    // Must b4 /64 or more for ISR timing
    TCCR0B |= (1 << CS00) | (1 << CS01);

    // Timer Counter Interrupt Mask Register
    // both output compare interrupts
    TIMSK0 |= ((1 << OCIE0A) | (1 << OCIE1B));

    // Timer Counter Overflow Interrupt Enable
    TIMSK0 |= (1 << TOIE0);

    sei();
}

/* Timer/Counter0 Overflow */
// called whenever TCNT0 overflows
ISR(TIMER0_OVF_vect) {
    PORTB |= (1 << 0);
    OCR0A = brightnessA;
}

// ISR fired when a match occurs
ISR(TIMER0_COMPA_vect) {
    PORTB ^= (1 << 0);
}

int main(void)
{
    setup();
    int d = 10;

    while (1) 
    {
        for (int i = 0; i < 255; i++) {
            _delay_ms(d);
            brightnessA = i;
        }


    }
}

Habría esperado que el LED en PORTB se atenúe pero no pasa nada. Creo que tengo una brecha en la comprensión aquí. Habría asumido que TIMER0_COMPA_vect ISR se activaría cada vez que alcance el nuevo valor de comparación OCR0A y apague el LED, por lo tanto, controle el ciclo de trabajo.

¿Puedes ayudarme?

Gracias

    
pregunta sesc360

2 respuestas

1

También debe configurar el modo de generación de forma de onda para que esto funcione. La página 128 de ATmega328 Hoja de datos describe exactamente cómo se deben establecer los bits WGM.

  

19.5. Unidad de comparación de salida

     

El comparador de 8 bits compara continuamente TCNT0 con los registros de comparación de salida (OCR0A y OCR0B). Cuando   TCNT0 es igual a OCR0A o OCR0B, el comparador señala una coincidencia. Un partido   establecerá el indicador de comparación de salida (OCF0A o OCF0B) en el siguiente temporizador   ciclo de reloj Si la interrupción correspondiente está habilitada, la salida   La marca de comparación genera una interrupción de comparación de salida. La comparación de salida   La bandera se borra automáticamente cuando se ejecuta la interrupción.   Alternativamente, la bandera puede ser borrada por el software escribiendo un '1' para   su ubicación de bits de E / S. El generador de forma de onda usa la señal de coincidencia para   generar una salida de acuerdo con el modo de operación establecido por el WGM02,   WGM01 y bits WGM00 y modo de salida de comparación (COM0x [1: 0]) bits. los   El generador de forma de onda utiliza las señales máximas e inferiores para el manejo   Los casos especiales de los valores extremos en algunos modos de operación.

Esto significa que debe configurar el registro TCCR0A también en consecuencia.

    
respondido por el Abel Tom
0

¿Recordaste la siguiente línea?

DDRB |= 1 << 0;

Además, no veo dónde se llama a la función initTimer0() en int main() .

También es probable que desee declarar brightnessA como volatile .

    
respondido por el HaLailah HaZeh

Lea otras preguntas en las etiquetas