Anexos
Fig.1 Circuito Implementado
#include <avr/io.h> //Librería por default de AVR
#define F_CPU 8000000UL //Frecuencia del micro
#include <avr/interrupt.h> //Librería de interrupciones
#include <util/delay.h> //Librería de retardos
#include <lcd.h> //Libreríad de LCD - Para configurararla, primero copio
config.h, lcd.c y lcd.h a la carpeta donde está el main.c o creo una carpeta que
se llame LCD, luego doy click derecho en properties del proyecto en toolchain
añádo en symbols F_CPU=8000000UL y en Directores añado el Path de la ubicación de
la carpeta donde están las liberías del LCD
int
tempo,contador=55,distanciaentero,distanciadecimal,nentero,ndecimal,bandera=0;
float distancia,tiempo,aux,auxdistancia,auxn,n,porcentaje;
char f1[16]; //Para la primera fila
char f2[16]; //Para la segunda fila
void configurar();
int main(void)
{
configurar();
//lcd_gotoxy(0,0); //Activo primera línea
//lcd_puts("Don Le Pablof");
while (1)
{
while(bandera==0){
PORTD=0b11111111; //Envío pulso por PD6
_delay_us(10); //Envío pulso a Trigger
PORTD=0b10111111; //Apago Pulso
TCCR0B=0b00000100; //Modo CTC y Reloj prendido N=2556
}
}
}
void configurar(){
lcd_init(LCD_DISP_ON); //Inicializo display
lcd_clrscr(); //Limpio pantalla
//Configuración de puertos
DDRA=255; //salidas
PORTA=0;
DDRC=255; //Salidas LCD
PORTC=0;
DDRD=0b01000000; //PD2 Y PD3 INT 0 Y 1 PD6 Trigger, PD5 Relé
PORTD=0b10111111;
DDRB=0;//PB2 INT 2
PORTB=255;
//Interrupciones
EICRA=0b00101010; //Falling edge
EIMSK=0b00000111; //INT2,INT1,INT0
//Timer
TCCR0A=0b00000010; //No formas de onda, Modo CTC
TCCR0B=0b00000000; //Modo CTC y Reloj Desconectado
OCR0A=255;
sei();
ISR(INT0_vect){ //Aumento contador
contador=contador+5;
}
ISR(INT1_vect){ //Bajo contador
contador=contador-5;
ISR(INT2_vect){ //Recepción señal
bandera=1;
aux=TCNT0;
TCNT0=0; //Limpio el contador
tiempo=(8192)*(aux/256); //8192 uS sería el tiempo máximo
distancia=(0.0343*tiempo)/2; //0.0343 cm/uS
distancia=distancia-75;
distanciaentero=distancia; //Saco entero
auxdistancia=distancia*100-distanciaentero*100; //Saco parte decimal
multiplicada por 100
distanciadecimal=auxdistancia; //Transformo a entero
n=(float)contador-distancia;
porcentaje=(n/contador)*100;
if(porcentaje<=50){
PORTA=0b00000010; //Prendo bomba PA1
}
if(porcentaje>=70){
PORTA=0b00000000; //Apago bomba PA0
}
n=n*10;
nentero=n; //Saco entero
auxn=n*100-nentero*100; //Saco parte decimal multiplicada por 100
ndecimal=auxn; //Transformo a entero
sprintf(f1,"H: %d ",contador); //Coloco texto en la fila 1
lcd_gotoxy(0,0); //Activo fila 2
lcd_puts(f1); //Muestro
sprintf(f1,"N: %d",nentero); //Coloco texto en la fila 1
_delay_ms(250);
lcd_puts(f1); //Muestro
if(ndecimal<10){
sprintf(f1,",0%d ",ndecimal); //Coloco texto en la fila 1
_delay_ms(250);
lcd_puts(f1); //Muestro
}else{
sprintf(f1,",%d ",ndecimal); //Coloco texto en la fila 1
_delay_ms(250);
lcd_puts(f1); //Muestro
}
sprintf(f2,"D: %d",distanciaentero); //Coloco texto en la fila 1
lcd_gotoxy(0,1); //Activo fila 2
_delay_ms(250);
lcd_puts(f2); //Muestro
if(distanciadecimal<10){
sprintf(f2,",0%d ",distanciadecimal); //Coloco texto en la fila 1
_delay_ms(250);
lcd_puts(f2); //Muestro
}else{
sprintf(f2,",%d ",distanciadecimal); //Coloco texto en la fila 1
_delay_ms(250);
lcd_puts(f2); //Muestro
}
PORTD=0b11111111; //Envío pulso por PD6
_delay_us(10); //Envío pulso a Trigger
PORTD=0b10111111; //Apago Pulso
TCCR0B=0b00000100; //Modo CTC y Reloj prendido N=2556