// 0% , 25%, 50%, 75%, 100%;
// 1000 hz timer feq
// N = FOSC / (1000 * 256 ) = 62.5, el mas cerca es 64
// N en el ADC es 7
// ph6 ocr2b, pk7 adc15
#include<avr/io.h>
#include<avr/interrupt.h>
uint8_t input_signal = 0;
timer2_init(){
TCNT2 = 0;
TCCR2A = (1<<COM2B1) | (1<<COM2B0) | (1<<WGM21) | (1<<WGM20);
TCCR2B = (1<<CS22);
OCR2B = 255; //empezar apagado
}
adc_init() {
ADMUX = (1<<REFS0) | (1<<ADLAR) | (1<<MUX2) | (1<<MUX1) | (1<<MUX0);
ADCSRA = (1<<ADEN) | (1<<ADSC) | (1<<ADATE) | (1<<ADIE) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0);
ADCSRB = (1<<MUX5);
DIDR2 = (1<<ADC15D);
sei();
}
ISR (ADC_vect) {
input_signal = ADCH;
PORTF = input_signal;
ADCSRA |= (1<<ADSC);
}
void set_workcycle( uint8_t value) {
if (value == 0) {
TCCR2A &= ~(1<<COM2B0);
OCR2B = 0;
}
else {
TCCR2A |= (1<<COM2B0);
if (value < 256/4) {
OCR2B = 256/4;
}
else if (value < 256/2) {
OCR2B = 256/2;
}
else if (value < 3*256/4) {
OCR2B = 3*256/4;
}
else if (value < 256) {
OCR2B = 0;
}
}
}
void main () {
DDRH = (1<<PH6);
adc_init();
timer2_init();
DDRF = 0xFF;
while(1) {
set_workcycle(input_signal);
}
}