No se puede configurar el modo Fast PWM OCRA

Tratando de tener el modo Fast PWM cuando TOP == ORCA.

Funciona bien con OCAalternar (midiendo la frecuencia correcta), pero no funciona en modo no inversor.

cli();

// Fast PWM Mode 
TCCR2A = 0;
TCCR2A |= _BV(WGM20) | _BV(WGM21) | _BV(COM2A0) | _BV(COM2A1); // Inverting mode fails
//TCCR2A |= _BV(WGM20) | _BV(WGM21) | _BV(COM2A1); // Non-Inverting mode fails
//TCCR2A |= _BV(WGM20) | _BV(WGM21) | _BV(COM2A0); // Toggle mode OK

// Prescaler set to 1024 (p.162)
TCCR2B = 0;
TCCR2B |= _BV(CS20) | _BV(CS21) | _BV(CS22) | _BV(WGM22);

// Enable interrupt on counter match
TIMSK2 |= _BV(OCIE2A);

OCR2A = 127;

sei();

Actualizar con más información:

MCU=Atmega328. En el modo sin inversión, acabo de obtener un 1 constante en la salida y el modo de inversión da un 0 lógico. Esperaba ver la frecuencia

F = dieciséis 10 6 / ( 1024 127 ) = 123 H z

¿Qué sucede exactamente cuando "no funciona"? ¿Qué MCU es? ¿Y cuál era el comportamiento esperado según usted? La pregunta necesita un poco de claridad por favor.
Lo siento, actualizado con aclaraciones.
Vale la pena mencionar que el modo Fast PWM (0xFF) funciona bien (WGM22=0).

Respuestas (2)

me responderé a mí mismo. El pin OC2A no está generando frecuencia, porque OCR2A está ocupado manteniendo el valor SUPERIOR. Puede contener el valor SUPERIOR o el valor de comparación de salida. Entonces debería usar OCR2B.

Para resolver el problema de su controlador, intente esto:

Acabo de usar el ejemplo de código fuente de

http://www.electronicsplanet.ch/mikrocontroller/avrcodesammlung/atmega16timer0fastpwm.htm

Y funcionó. Pero gracias a tus explicaciones, entiendo por qué funciona ;-)