/*
Mostrar en un led conectado a PE0 la poyencia de 0, 25, 50 y 100%
Correspondiente que 0 -> 0%, 1 -> 25%... sucesivamente
XTAL = 16MHz
Frecuencia Timer = Fcpu/PS = 250KHz
*/
#include<avr/io.h>
#include<avr/interrupt.h>
//FPWM = (FOSC / (N * 256) )
// N = (FOSC/ (FPWM * 256) )
//N = 62.5, con N=64 : 976 hz aceptable
/*
#define FOSC 16000000
#define FPWM 1000
#define PRESCALADOR(freq) (FOSC / (FPWM * freq))
#define TICKS( n ) (FOCS / (n))
*/
#include <avr/io.h>
#include<avr/interrupt.h>
void Timer2Init()
{
TCCR2B = 0; // Disable Timer
TCCR2A = 0; // normal mode
TCCR2B = 4; // Prescalador
OCR2A = 255; // 100%
TIMSK2 = 3 << TOIE2; // habilita interrupcion del Timer2
}
// Interrupcion match y overflow
ISR(TIMER2_COMPA_vect)
{
PORTE &= ~(1 << PE0);
}
ISR(TIMER2_OVF_vect)
{
PORTE |= 1 << PE0;
}
void set_OCR2A_value ( uint8_t value ) {
if (value == 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 << WGM12) | (1 << WGM02) | (1 << COM2A1); // Fast PWM, clear OC2A on compare match
TCCR2B = (1<<CS22); //
OCR2A = (value/4) * 256;
}
}
void main () {
DDRF = (1 << PB4);
DDRH = (1 << PB6);
Timer2Init();
while(1) {
set_OCR2A_value(0);
}
}