#define __ATmega2560__
#define __AVR_ATmega2560__
#ifndef F_CPU
#define F_CPU 16000000UL
#endif
#include <stdint.h>
#include <avr/io.h>
#include <avr/pgmspace.h>
#include <stdbool.h>
#include <stdint.h>
#include <util/delay.h>
#include <stdint.h>
#include <stdlib.h>
#include <avr/interrupt.h>
#include "usart.h"
uint8_t tensao0 = 0, tensao1 = 0, tensao2 = 0, tensao_adc = 0, tensao_port=0;
uint8_t contador = 0, contador2 = 0;
void configura_portas (void) {
DDRB |= (1 << DDB7);// Definir PB7 como saída para o LED
DDRB &= ~(1 << DDB2); // Definir PB2 como entrada
DDRB &= ~(1 << DDB1); // Definir PB1 como entrada
DDRB &= ~(1 << DDB0); // Definir PB0 como entrada
// Habilitar resistores de pull-up internos para os pinos de entrada
PORTB |= (1 << PORTB2);
PORTB |= (1 << PORTB1);
PORTB |= (1 << PORTB0);
DDRB |= (1 << DDB7); //saida LED
PORTB &= ~(1 << PORTB7); //desligado ao iniciar
}
void configura_conversor(void) {
ADCSRA = 0x87; //ADEN=1 ADSC=0 ADATE=0 ADIF=0 ADIE=0 ADPS[2:0]=111 N=128 p/ 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 le_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)
{
configura_portas();
configura_conversor();
USART0_configura();
while (1)
{
_delay_ms(1000);
uint8_t Leitura_0 = PINB & (1 << PINB0); // realizamos a leitura de PB0
uint8_t Leitura_1 = PINB & (1 << PINB1); // realizamos a leitura de PB1
uint8_t Leitura_2 = PINB & (1 << PINB2); // realizamos a leitura de PB2
if (Leitura_2 ==0x00) {
tensao2=0X04;
}else{
tensao2=0;
}
if (Leitura_1 ==0x00) {
tensao1=0x02;
}else{
tensao1=0;
}
if (Leitura_0 ==0x00) {
tensao0=0x01;
}else{
tensao0=0;
}
tensao_port = tensao1+tensao2+tensao0;
le_conversor();
if (tensao_adc > tensao_port) {
contador++;
} else {
contador2 = 0;
contador = 0;
}
if ((tensao_adc > tensao_port) && (contador2 == 0)) {
USART0_transmite_string_FLASH(PSTR("Tensão excede o permitido: "));
USART0_transmite_string_FLASH(PSTR("\n"));
contador2 = 1;
}
if (contador >= 5) {
PORTB |= (1 << PORTB7);
} else {
PORTB &= ~(1 << PORTB7);
}
}
return 0;
}