// 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);
}
ATTINY8520PU