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