El período de PWM está determinado por la velocidad de desbordamiento de su temporizador. Hay muchos ajustes en la sección de 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 comparación). La idea básica es establecer OCR0A en el número de tics del temporizador hasta que desee que el pin cambie a continuación, y usar la interrupción Comparar coincidencia para cambiar ese valor para la próxima vez. Así que 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 manera única de hacerlo tampoco.
Por cierto, hay una cosa que debes saber sobre el ATTiny13. Solo se garantiza que el oscilador RC interno sea preciso dentro del 10% del piso de fábrica. Hay un proceso de calibración de usuario que puede seguir (descrito por una atmel appnote ) que se obtendrá Tienes un 2% de precisión para el ATTiny13. Si quieres hacerlo mejor, probablemente debas usar un chip que se adapte a un cristal externo ...