// ATtiny85 ADC
// Entrada e Saída – Manipulando Registradores
// Conversor Analógico-para-Digital

#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>

#define F_CPU 16500000L

int main(void)
{
  DDRB &= ~(1 << PB4); // Configura Pino PB4 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;

  // Define ADLAR como 1 para ativar o resultado de deslocamento para a esquerda
  // ler apenas o ADCH é suficiente para resultados de 8 bits (256 valores)
  ADMUX =
    (1 << ADLAR) |     // Resultado de deslocamento para a esquerda
    (0 << REFS1) |     // Conjuntos ref. tensão para VCC, bit 1
    (0 << REFS0) |     // Conjuntos ref. tensão para VCC, bit 0
    (0 << MUX3)  |     // Utiliza ADC2 para entrada (PB4), MUX bit 3
    (0 << MUX2)  |     // Utiliza ADC2 para entrada (PB4), MUX bit 2
    (1 << MUX1)  |     // Utiliza ADC2 para entrada (PB4), MUX bit 1
    (0 << MUX0);       // Utiliza ADC2 para entrada (PB4), MUX bit 0

  ADCSRA =
    (1 << ADEN)  |     // Habilita o ADC
    (1 << ADPS2) |     // Define o prescaler para 64, bit 2
    (1 << ADPS1) |     // Define o prescaler para 64, bit 1
    (0 << ADPS0);      // Define o prescaler para 64, bit 0

  while (1)
  {
    ADCSRA |= (1 << ADSC);        // Inicia a medição do ADC
    while (ADCSRA & (1 << ADSC)); // Aguarda até a conversão terminar

    OCR0B = ADCH;  // Atualiza o registro de comparação com o valor do ADCH
  }

  return (0);
}
ATTINY8520PU