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 habilitar 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 utilizando COM1B0 / COM1B1
- PWM B debe habilitarse usando GTCCR: PWM1B
El siguiente código funciona: veo la 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, PB4 permanece alto y no se genera ninguna 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é esto es necesario? La hoja de datos indica 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 estoy tratando de usar OC1B / PB4 en lugar de OC1A / PB1 es que PB4 no se usa durante el ISP, mientras que PB1 está