#include <avr/io.h>
#include <inttypes.h>
// OC2A pb4
// OC2B ph6
void Freq_Generator_Timer2(uint8_t);
uint16_t read_ADC9(void);
void delay(void)
{
volatile uint16_t counter = 0xFFFF;
while(--counter)
;
}
// Implementar un programa que lea el potenciómetro y controle directamente
// el brillo del LED en 5 niveles de intensidad: 0%, 25%, 50%, 75% y 100%.
// Donde la correspondencia es 0% de brillo en el LED a 0V del ADC,
// y 100% de brillo en el LED a 5V en el ADC.
int main(void)
{
//Inicializar perifericos
uint8_t porcentaje_duty_cycle;
DDRB |= 1 << DDB4;
DDRH |= 1 << DDH6;
while(1)
{
// Leer potenciometro y actualizar brillo del LED
porcentaje_duty_cycle = (uint8_t) ((100*read_ADC9()) / 1023);
Freq_Generator_Timer2(porcentaje_duty_cycle);
delay();
}
}
void Freq_Generator_Timer2(uint8_t duty_cycle_porcentaje) {
uint8_t top = (255 * duty_cycle_porcentaje) / 100;
OCR2A = top;
OCR2B = 255-top;
TCCR2A = 0x51; // PWM Phase Correct, salida en OCRA y OCRB, modo no invertido
TCCR2B = (1 << CS22) | (1 << CS20); // int clk, prescalador de 128
}
uint16_t read_ADC9(void) {
DDRK &= ~(1 << DDK1);
ADCSRA = 0x87; // Habilitar ADC, Freq = clk/128
ADCSRB = 1 << MUX5;
ADMUX = 0x41; // Vcc Vref, canal 9
ADCSRA |= 1 << ADSC; // iniciar la conversion
while((ADCSRA & (1 << ADIF)) == 0); // esperar hasta que termine la conversion
ADCSRA |= 1 << ADIF; // limpiar la bandera
return ADC;
}