#include <avr/io.h>
#define CHANNEL 9
timer2_init() {
//considerando que el micro recien arranco
TCCR2A = (1<< COM2A1) | 3; //WGM1 y WGM0 high
TCCR2B = 5; //prescalar en 128
TCNT2 = 0;
OCR2A = 128; //el led siempre arranca prendido, se actualiza al instante con el valor del adc
}
adc_init( uint8_t channel ) {
ADMUX = (1<<REFS0) | (1<<ADLAR) | (channel & 0x07) ; //se van a ignorar los lsb
ADCSRB = ((1<<MUX5) & channel); // ningun preescalador, se agarra el bit 3 del channel
ADCSRA = (1<<ADEN) | 7; //se habilita el ADC
DIDR2 = (1<<ADC8D);//un poco de ahorro energetico
}
uint8_t ADC_Read(void)
{
uint8_t result = 0;
ADCSRA |= (1 << ADSC);
while (ADCSRA & (1 << ADSC))
;
result = (uint8_t) ADCH;
return result;
}
void set_workcycle(uint8_t power) {
PORTF = power;
if (power == 0) {
// Apagar el temporizador
TCCR2A = 0;
TCCR2B = 0;
OCR2A = 0; // Asegurarse de que la salida PWM sea 0
} else {
// Configurar el temporizador para generar PWM
TCCR2A = (1 << WGM20) | (1 << WGM21) | (1 << COM2A1); // Fast PWM, clear OC2A on compare match
TCCR2B = 5;
if (power <= 64) {
OCR2A = 64;
} else if (power >= 65 && power <= 127) {
OCR2A = 127;
} else if (power >= 128 && power <= 191) {
OCR2A = 191;
} else {
OCR2A = 0; // Valor máximo para una señal PWM del 100%
}
}
}
void main ( ) {
DDRB = 1<<PB4;
DDRF = 0xFF;
timer2_init();
adc_init ( CHANNEL );
while (1) {
set_workcycle(ADC_Read());
}
}