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.