Hola a todos. Tengo un problema con la programación de un sensor de distancia por ultrasonidos con un ATmega128 y Mikroc.
Lo que hago es mandar un pulso de 15µs al Trigger y esperar a recibir por el Echo el pulso correspondiente que mas tarde mediré y será lo que me de la distancia.
El VCC del sensor está conectado al puerto PA7 que siempre se mantiene en estado alto para mantener la tensión del sensor.
La verdad es que ando algo perdido espero que alguien pueda orientarme
Lo que hago es mandar un pulso de 15µs al Trigger y esperar a recibir por el Echo el pulso correspondiente que mas tarde mediré y será lo que me de la distancia.
El VCC del sensor está conectado al puerto PA7 que siempre se mantiene en estado alto para mantener la tensión del sensor.
Código:
/*Defino donde va a estar conectado el sensor*/
#define ECHO PORTA.B3
#define TRIG PORTA.B5
#define VCC PORTA.B7
int i,r,distancia;
// Conexiones LCD
sbit LCD_RS at PORTC2_bit;
sbit LCD_EN at PORTC3_bit;
sbit LCD_D4 at PORTC4_bit;
sbit LCD_D5 at PORTC5_bit;
sbit LCD_D6 at PORTC6_bit;
sbit LCD_D7 at PORTC7_bit;
sbit LCD_RS_Direction at DDC2_bit;
sbit LCD_EN_Direction at DDC3_bit;
sbit LCD_D4_Direction at DDC4_bit;
sbit LCD_D5_Direction at DDC5_bit;
sbit LCD_D6_Direction at DDC6_bit;
sbit LCD_D7_Direction at DDC7_bit;
// Fin conexiones LCD
//Función para leer pulso
int ancho_pulso ()
{
//Espero flanco de subida en ECHO, me mantengo en el bucle hasta que detecte tensión
for(i=0;i<600000;i++)
{
if (!ECHO) continue; else break;
}
//Si supera esos ciclos es que no hay ningún objeto
if(i==600000)
return 0xFFFF;
//Voy a configurar el timer
TCCR0=0x02; //preescaler 8
TCNT0=0x00; //empieza a contar
for(i=0;i<600000;i++)
{
if(ECHO)
{
if(TCNT0 > 60000) break; else continue;
}
else
break;
}
if(i==600000)
return 0xffff;
distancia=TCNT0;
if(distancia > 60000)
return 0xfffe;
else
return distancia;
}
void main (){
/*
Configuración previa de los puertos
-Dejo solo como entrada PA3
-Dejo el puerto de VCC como salida para alimentar
-Dejo el trigger a 0 al principio
*/
DDRA=0xF7;
PORTA=0xD7;
delay_ms(1000);
while (1) {
TRIG=0xFF;
Delay_ms(15);
TRIG=0x00;
r=ancho_pulso();
//Inicio LCD
Lcd_Init(); // Inicio
Lcd_Cmd(_LCD_CLEAR); // Limpio
Lcd_Cmd(_LCD_CURSOR_OFF); // Apago cursor
if (r==0xFFF)
{
Lcd_Out(1,1,"ERROR");
}
else
{
int d;
d=(r/58); //Paso a cm
LCD_out (1,1,d);
}
}
}
La verdad es que ando algo perdido espero que alguien pueda orientarme