0% encontró este documento útil (0 votos)
10 vistas3 páginas

Proyecto con ATmega 164 y LCD

Este documento presenta el código C para implementar un circuito que mide distancias mediante ultrasonido y controla un motor bomba. Configura los puertos, el LCD y las interrupciones. Mide el tiempo de vuelo del ultrasonido para calcular la distancia. Enciende la bomba si la distancia es menor a 50% del nivel máximo y la apaga si es mayor a 70%. Muestra los resultados en el LCD.

Cargado por

Ronny Camacho
Derechos de autor
© All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como DOCX, PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
10 vistas3 páginas

Proyecto con ATmega 164 y LCD

Este documento presenta el código C para implementar un circuito que mide distancias mediante ultrasonido y controla un motor bomba. Configura los puertos, el LCD y las interrupciones. Mide el tiempo de vuelo del ultrasonido para calcular la distancia. Enciende la bomba si la distancia es menor a 50% del nivel máximo y la apaga si es mayor a 70%. Muestra los resultados en el LCD.

Cargado por

Ronny Camacho
Derechos de autor
© All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como DOCX, PDF, TXT o lee en línea desde Scribd

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

También podría gustarte