//Autor: Gabriel Silveira dos Santos
// Matrícula: 202110410
#define __ATmega2560__
#define __AVR_ATmega2560__
#ifndef F_CPU
#define F_CPU 16000000UL
#endif
#include <stdint.h>
#include <avr/io.h>
#include <util/delay.h>
#include "usart.h"
uint8_t pino0 = 0; // valor do pino 0
uint8_t pino1 = 0; // valor do pino 1
uint8_t pino2 = 0; // valor do pino 2
uint8_t valor0, valor1, valor2, valor_portas; // valor referente
uint8_t tensao_ADC = 0; // tensao do ADC
uint8_t cont0 = 0, cont1 = 0; //contadores
void configuracao_portas (void) {
DDRB = DDRB | (1 << DDB7); // PB7 é saída
PORTB = PORTB & (~(1 << PORTB7)); // LED está apagado.
DDRB = DDRB & (~(1 << DDB0)); // PB0 é entrada
PORTB = PORTB | (1 << PORTB0); // resistor de pull-up interno em PB0
DDRB = DDRB & (~(1 << DDB1)); // PB1 é entrada
PORTB = PORTB | (1 << PORTB1); // resistor de pull-up interno em PB1
DDRB = DDRB & (~(1 << DDB2)); // PB2 é entrada
PORTB = PORTB | (1 << PORTB2); // resistor de pull-up interno em PB2
PORTB = PORTB | (1 << PORTB1); // resistor de pull-up interno em PB1
}
void configuracao_conversorADC (void) {
ADCSRA = 0x87; //ADEN=1 ADSC=0 ADATE=0 ADIF=0 ADIE=0 ADPS[2:0]=111 N=128 para CLK_adc=125 kHz
ADCSRB = 0x00; //MUX[5]=0 ADTS[2:0]=000
ADMUX = 0x41; // REFS[1:0]=01 ADLAR=0 e MUX[4:0]= 0001
}
void leitura_conversor(void) {
const float VREF = 5; //referência de tensão
ADCSRA = ADCSRA | (1 << ADSC); //nova conversão
while (ADCSRA & (1 << ADSC)) {} //conversão
tensao_ADC = ADC * (VREF / 1024.0); //calculo da tensao convertida
}
int main(void)
{
configuracao_portas();
configuracao_conversorADC();
USART0_configura();
while (1)
{
_delay_ms(1000); //faz a leitura a cada 1 segundo
pino0 = PINB & (1 << PINB0); // realizamos a leitura de PB0
pino1 = PINB & (1 << PINB1); // realizamos a leitura de PB1
pino2 = PINB & (1 << PINB2); // realizamos a leitura de PB2
//Verificar se o botão está ativado
if (pino2 == 0x00) {
valor2 = 0x04;
} else {
valor2 = 0x00;
}
if (pino1 == 0x00) {
valor1 = 0x02;
} else {
valor1 = 0x00;
}
if (pino0 == 0x00) {
valor0 = 0x01;
} else {
valor0 = 0x00;
}
valor_portas = valor1 + valor2 + valor0; //Soma o valor das portas
leitura_conversor();
if ((tensao_ADC > valor_portas) && (cont1 == 0)) {
USART0_transmite_string_FLASH(PSTR("Tensão acima do permitido \n")); //Transmite pela USART
cont1 = 0x01;
} else {
if (tensao_ADC > valor_portas){
cont0++;
}else{
cont1 = 0;
cont0 = 0;
}
}
if (cont0 >= 5) {
PORTB |= (1 << PORTB7); //Liga o LED
} else {
PORTB &= ~(1 << PORTB7); //Desliga o LED
}
}
return 0;
}