Atmega328 fast PWM (modo 15) en el temporizador 1 no funciona

1

No puedo hacer que PWM funcione con el modo 15 (un PWM rápido) del temporizador 1. Siempre me da un valor alto de alrededor de 4.5 V en PORTB2.

#include <avr/interrupt.h>
#define TIMER_OVERFLOW_COUNT  1

volatile int timerCount = 0;
ISR(TIMER1_COMPA_vect)
{
        ++timerCount;
}

int main(void)
{
        DDRB = DDRB | 1 << DDB2;
        TCCR1A = TCCR1A | 1 << COM1B1;
        TIMSK1 = TIMSK1 | 1 << OCIE1A;
        TCCR1A = TCCR1A | 1 << WGM10;
        TCCR1B = ((TCCR1B | 1 << WGM13) | 1 << WGM12) | 1 << WGM11;
        OCR1A = 62499;
        sei();
        TCCR1B = TCCR1B | 1 << CS12;
        while(1)
        {
        if( timerCount > TIMER_OVERFLOW_COUNT)
                {
                        OCR1B = 25000;
                        timerCount = 0;
                }
        }
        return 0;
}

Sin embargo, podría obtener el modo similar (modo 7) del temporizador 0 para que funcione bien.

#include <avr/interrupt.h>
#define TIMER_OVERFLOW_COUNT  125

volatile long int timerCount = 0;
ISR(TIMER0_COMPA_vect)
{
        ++timerCount;
}

int main(void)
{
        DDRD = DDRD | 1 << DDD5;
        TCCR0A = TCCR0A | 1 << COM0B1;
        TIMSK0 = TIMSK0 | 1 << OCIE0A;
        TCCR0A = (TCCR0A | 1 << WGM00) | 1 << WGM01;
        TCCR0B = TCCR0B | 1 << WGM02;
        OCR0A = 124;
        sei();
        TCCR0B = (TCCR0B | 1 << CS02) | 1 << CS00;
        while(1)
        {
        if(timerCount > TIMER_OVERFLOW_COUNT)
                {
                        OCR0B = 50;
                        timerCount = 0;
                }
        }
        return 0;
}

No puedo entender qué estoy haciendo mal en el código anterior.

    
pregunta Suba Thomas

1 respuesta

1

Veo un problema, pero sin una configuración para probar: no puedo decir con seguridad si es tu único problema.

Estás intentando establecer el bit WGM11 en TCCR1B en uno cuando realmente está en TCCR1A. Debido a esto, los bits WGM son 0x1101, y no 0x1111 que usted desea.

Vea a continuación el registro TCCR1A:

Porlotanto,esteeselmododegeneracióndeformadeonda(WGM)queestáconfigurando.

Está "Reservado", así que nada.

Debe configurar WGM11 en TCCR1A:

TCCR1A |= (1 << WGM11) | (1 << WGM10);
TCCR1B |= (1 << WGM12) | (1 << WGM13);
    
respondido por el Nick Williams

Lea otras preguntas en las etiquetas