// Tiago Pitol Mroginski 202020163
/* 3. (3,5 pontos, 30 min.) Usamos o conversor ADC para fazer a leitura da tensão
analógica no canal ADC1 (porta PF1), em intervalos de 1 s. Use AVCC como tensão
de referência. Um LED no terminal PB7 deve piscar na frequência de 3 Hz, quando
a tensão em ADC1 for maior que 2,50 V. Use um potenciômetro na entrada ADC1
para testar o circuito.*/
#define __AVR_ATmega2560__
#define F_CPU 16000000UL
#include <stdint.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
volatile uint8_t led = 0; // Controle do estado do LED
// Função para configurar os pinos de entrada e saída
void configurar_pinos()
{
// Configura PF1 como entrada tri-state para o ADC
DDRF &= ~(1 << DDF1);
PORTF &= ~(1 << PORTF1);
// Configura PB7 como saída para controle do LED
DDRB |= (1 << DDB7); // Configura PB7 como saída para o LED
PORTB &= ~(1 << PORTB7); // Inicialmente, o LED está desligado
}
// Função para inicializar o conversor ADC
void inicializa_ADC()
{
ADCSRA = (1 << ADEN) | (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0);
ADMUX = (1 << REFS0); // Configura a referência de tensão como AVCC
}
// leitura do ADC em um canal específico
uint16_t leitura_ADC(uint8_t canal)
{
ADMUX = (ADMUX & 0xF0) | (canal & 0x0F); // Seleciona o canal do ADC
ADCSRA |= (1 << ADSC);// Inicia a conversão ADC
while (ADCSRA & (1 << ADSC)); // Espera até que a conversão esteja completa
return ADC; // Retorna o valor da conversão ADC
}
int main()
{
configurar_pinos(); // Configura os pinos de entrada e saída
inicializa_ADC(); // Inicializa o ADC
while (1)
{
_delay_ms(1000); // Delay de 1 segundo entre cada leitura do ADC
float tensao = leitura_ADC(1) * (5.0 / 1024.0); // Realiza a leitura do ADC no canal 1 e converte para tensão (0-5 V)
if (tensao > 2.5) // Verifica se a tensão está acima de 2,5 V
{
led = 1; // Pisca do LED a 3 Hz
}
else
{
led = 0;
PORTB &= ~(1 << PORTB7); // Desliga o LED
}
if (led)
{
PORTB ^= (1 << PORTB7); // Alterna o estado do LED
_delay_ms(167); // Delay para 3 Hz (0,33 s por ciclo total)
}
}
return 0;
}