El período de PWM está determinado por la tasa de desbordamiento de su temporizador. Hay muchas configuraciones en la sección Modos de operación para pensar. Si todo lo que desea hacer es generar una onda cuadrada de período constante, con un ciclo de trabajo variable, creo que querrá usar el modo CTC (Borrar temporizador en Comparar coincidencia). La idea básica es establecer OCR0A en el número de tics del temporizador hasta que desee que el pin se active a continuación, y use la interrupción Comparar coincidencia para cambiar ese valor la próxima vez. Entonces, en avr-gcc se vería algo así como:
#include <avr/io.h>
#include <avr/interrupt.h>
#include <stdint.h>
// global variables defining number of ticks on and off
uint8_t on_time_ticks, off_time_ticks, csxx_bits=0;
void setup_timer(double p_ms, double duty){
TCCR0A = _BV(COM0A0) // toggle OC0A on Compare Match
TCCR0B = _BV(WGM02); // set CTC mode WGM0[2,1,0] = 0b100
// ... do some stuff based on your CPU frequency
// to define the csxx_bits of TCCR0B when the timer is running
// and consequently, to set on_time_ticks and off_time_ticks
OCR0A = on_time_ticks;
TCCR0B |= your_settings_here;
}
void start_timer(){
//start the timer running at the desired rate
TCCR0B |= csxx_bits;
}
int main(int argc, char **argv){
double period_ms, duty_cycle;
setup_timer(period_ms, duty cycle);
start_timer();
for(;;){
//spin or sleep or whatever
}
}
ISR(TIM0_COMPA_vect){
if(OCR0A == on_time_ticks){
OCR0A = off_time_ticks;
}
else{
OCR0A = on_time_ticks;
}
}
Advertencia, este es un código no probado pero creo que la idea es correcta. De ninguna manera es esta la única forma de hacerlo tampoco.
Hay una cosa que debes saber sobre el ATTiny13, por cierto. El oscilador RC interno solo garantiza una precisión dentro del 10% del piso de fábrica. Hay un proceso de calibración del usuario que puede seguir (descrito por una nota de aplicación de atmel ) que lo llevará a una precisión del 2% para el ATTiny13. Si quieres hacerlo mejor que eso, probablemente necesites usar un chip que acomode un cristal externo ...