// ATtiny85 PWM
// Entrada e Saída – Manipulando Registradores
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#define F_CPU 16500000L
int main(void)
{
uint8_t pwm = 0;
bool invert = false;
DDRB &= ~(1 << PB0); // Configura Pino PB0 como entrada (Pino do Potenciômetro)
// Registro de direção de dados da porta B
// (controla o modo dos pinos na porta B)
DDRB = 1 << DDB1; // Configura o PB1 como saída
// Registro de controle A para Timer/Contador-0
// (Timer/Contador-0 é configurado usando dois registradores: A e B)
TCCR0A = 2 << COM0A0 | 2 << COM0B0 | 3 << WGM00;
// 0 << WGM02: bit WGM02 permanece claro, o que
// (quando combinado com WGM00 e WGM01 de TCCR0A acima) ativa o modo PWM rápido
// 1 << CS00: define os bits CS01 (deixando CS01 e CS02 livres),
// que informa ao Timer / Contador-0 para não usar um pré-escalar
TCCR0B = 0 << WGM02 | 1 << CS00;
// Registro de controle para Timer/Contador-1
// (Timer/Contador-1 é configurado apenas com este registro)
TCCR1 = 0 << PWM1A | 0 << COM1A0 | 1 << CS10;
// Registro de controle geral para cronômetro/contador-1
// (é para cronômetro/contador-1 e é um registro mal nomeado)
GTCCR = 1 << PWM1B | 2 << COM1B0;
while (1)
{
OCR0B = pwm; // Atualiza o registro de comparação com o valor da variável pwm
pwm = invert ? pwm - 1 : pwm + 1;
if (pwm < 5) {
invert = false;
}
if (pwm > 250) {
invert = true;
}
_delay_ms(10);
}
return (0);
}