ATtiny85 PWM: ¿por qué es necesario configurar COM1A0 antes de que funcione PWM B?

Quiero habilitar la salida PWM de alta velocidad en PB4 usando un ATtiny85. Después de leer la hoja de datos, parece que se deben cumplir las siguientes condiciones:

  • PLL y PCK deben configurarse para habilitar el reloj periférico de alta velocidad
  • El prescaler debe configurarse para permitir la sincronización
  • OCR1B y OCR1C deben configurarse para elegir el ciclo de trabajo
  • PB4 debe configurarse como una salida y el modo de comparación debe configurarse mediante COM1B0/COM1B1
  • PWM B debe habilitarse mediante GTCCR:PWM1B

El siguiente código funciona: veo salida PWM en PB4 y puedo variar el ciclo de trabajo cambiando OCR1B; sin embargo, solo funciona si también configuro COM1A0 en TCCR1. Si no configuro COM1A0, entonces PB4 permanece alto y no se genera salida PWM.

#include <avr/io.h>
#include <avr/delay.h>

int main() {
// Enable PLL and async PCK for high-speed PWM
PLLCSR |= (1 << PLLE) | (1 << PCKE);

// Set prescaler to PCK/2048
TCCR1 |= (1 << CS10) | (1 << CS11) | (0 << CS12) | (0 << CS13);

// Set OCR1B compare value and OCR1C TOP value
OCR1B = 128;
OCR1C = 255;

// Enable OCRB output on PB4, configure compare mode and enable PWM B
DDRB |= (1 << PB4);
GTCCR |= (1 << COM1B0) | (1 << COM1B1);
GTCCR |= (1 << PWM1B);

// Why is this necessary?
TCCR1 |= (1 << COM1A0);

while (1) {}

return 0;
}

¿Por qué es esto necesario? La hoja de datos establece que los bits COM1A controlan OC1A/PB1, que no debería tener nada que ver con OC1B y OCRB

La razón por la que trato de usar OC1B/PB4 en lugar de OC1A/PB1 es que PB4 no se usa durante el ISP mientras que PB1 sí.

Respuestas (2)

¿Es un chip viejo? Parece que un par de personas también han tenido este problema.

http://www.avrfreaks.net/index.php?name=PNphpBB2&file=printview&t=119678

Hacia el final del hilo, concluyeron que era un problema de hardware en el chip que presumiblemente se solucionó desde entonces. Su código se ve bien. Me pregunto si Atmel alguna vez solucionó el problema.

La hoja de datos de ATtiny85 en Errata (sección 27.2.3 / página 213) dice:

4) La generación de salida PWM del contador de tiempo 1 en OC1B – XOC1B no funciona correctamente.
La salida PWM del contador de tiempo 1 OC1B-XOC1B no funciona correctamente. Solo en el caso de que los bits de control, COM1B1 y COM1B0 estén en el mismo modo que COM1A1 y COM1A0, respectivamente, la salida OC1B-XOC1B funciona correctamente.

Solución de problema/solución alternativa
La única solución alternativa es utilizar la misma configuración de control en los bits de control COM1A[1:0] y COM1B[1:0]; consulte la tabla 14-4 en la hoja de datos. El problema se ha solucionado para Tiny45 rev D.

Esto realmente me dejó perplejo por un tiempo. He estado leyendo con la hoja de datos y en su mayor parte, todo lo que dijo es correcto para mí. Sin embargo, noté algunas discrepancias potenciales, así que voy a dispararles y tal vez averigüemos cuál es el problema.

En primer lugar, verifiqué el registro TCCR1 y miré el bit COM1A0:

ingrese la descripción de la imagen aquí

Es cierto que según la tabla, esto establece claramente que los bits COM1A[1:0] se refieren solo a la salida PWM de OC1A. Tenga en cuenta que en la parte inferior, dice:

"En modo PWM, estos bits tienen diferentes funciones"

Así que revisé la tabla 12-1.

ingrese la descripción de la imagen aquí

La tabla muestra que COM1x1 y COM1x0 manipulan el pin OC1x. Uno pensaría intuitivamente que si uno está cambiando el COM1A[1:0], entonces solo manipularía el pin OC1A PWM. Sin embargo, véase el texto anterior:

"Cuando el valor del contador coincide con el contenido de OCR1A u OCR1B, las salidas OC1A y OC1B se activan o desactivan"

Esto parece sugerir que si coinciden OCR1A O OCR1B, las salidas OC1A Y OC1B se activan o desactivan de acuerdo con los bits COM1x[1:0].

Entonces me parece que manipular los bits COM1x[1:0], siempre que el HW esté habilitado en modo PWM, estas salidas PWM se ven influenciadas al mismo tiempo. Es por eso que cuando tiene COM1A[1:0] borrado a '00', la tabla 12-1 dice que las salidas PWM no están conectadas.

Solo un pensamiento, tal vez alguien más ilustrado pueda criticar mi lógica.