#include"test.h"
#define CANAL 9
//N = (16000000/ (256 * 488)) = 128
timer2_ini(){
TCNT2 = 0;
TCCR2A = (1<<COM2A1) | (1<<WGM21) | (1<<WGM20);
OCR2B = 128; //va a arrancar en 50% pero al instante va a cambiar
TCCR2B = 5;
}
ADC_ini( canal ) {
ADMUX = (1<<REFS0) | (1<<ADLAR) | (canal & 0x07) ; //se van a ignorar los lsb
ADCSRB = ((1<<MUX5) & canal); // ningun preescalador, se agarra el bit 3 del channel
//para configurar el canal, no es necesario hacer
//nada porque curiosamente MUX5 puede hacer directamente la bandera
ADCSRA = (1<<ADEN) | 7 ; //se habilita el ADC
/*
if (canal < 8) {
DIDR0 = (1 << canal) ;
}
else {
DIDR2 = ( 1 << (canal - 8));
}
*/
}
uint8_t ADC_read () {
ADCSRA |= (1 << ADSC);
while (ADCSRA & (1 << ADSC))
;
return (uint8_t) ADCH;;
}
void set_OCR2A (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 << CS20);
if (power < 256/4) {
OCR2A = 256/4;
} else if (power < 256/2) {
OCR2A = 256/2;
} else if (power < 3*256/4) {
OCR2A = 3*256/4;
} else {
OCR2A = 0; // Valor máximo para una señal PWM del 100%
}
}
}
void main () {
DDRB |= (1<<PB4);
DDRF = 0xFF;
timer2_ini();
ADC_ini(CANAL);
while (1) {
set_OCR2A(ADC_read ());
}
}