Programación para motores con sensor ultrasónico

Hola a todos.
Estoy programando con un sensor ultrasónico, el hc-sr04, para esquivar objetos y lo que quiero hacer es cuando la distancia sea <=10 vaya en retroceso, digamos por 5 segundos y en el lcd aparezca "atras" y pasando esos 5 segundos sólo gire la rueda izquierda y en el lcd aparezca "girando" y siga adelante, pero no logro hacerlo.

Espero saber si alguien me puede asesorar cómo puedo hacerlo.

Acá está mi código:

PHP:
#include <16F877.h>
#FUSES XT,NOWDT,NOPROTECT,PUT,NOBROWNOUT,NOLVP     
#use delay(clock=4000000)                          
#include <lcd.c>
#define trig pin_B1
#define echo pin_B0
#USE standard_io(b)
#USE standard_io(a)
#USE standard_io(c)
#USE standard_io(d)

int16 distancia, tiempo;
void main()
{
   lcd_init();                             
printf(LCD_PUTC, "\f Iniciando.");
delay_ms(500);
printf(LCD_PUTC, "\f Iniciando..");
delay_ms(500);
printf(LCD_PUTC, "\f Iniciando...");
delay_ms(500);
                            
setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);

while(1)
{
output_high(trig);                   
delay_us(20);                       
output_low(trig);
while(!input(echo))                     
{}
set_timer1(0);                         
while(input(echo))                     
{}
tiempo=get_timer1();
distancia=(tiempo*10)/(58.0);
lcd_gotoxy(1,1);
printf(lcd_putc,"Distancia = %Lu",distancia);
lcd_gotoxy(1,2);
lcd_putc("Avanzando");
delay_ms(500);

if(distancia<=10){
output_low(pin_c0);
output_high(pin_c1);
output_low(pin_c2);
output_high(pin_c3);
lcd_gotoxy(1,2);
lcd_putc("Atras");
delay_ms(500);

output_low(pin_c0);
output_low(pin_c1);
output_high(pin_c2);
output_low(pin_c3);
lcd_gotoxy(1,2);
lcd_putc("Girando");
delay_ms(500);
}
else{
output_high(pin_c0);
output_low(pin_c1);
output_high(pin_c2);
output_low(pin_c3);

lcd_gotoxy(1,2);
lcd_putc("Avanzando");
delay_ms(500);

}
}
}

Tengo dificultades, ya que logro que avance y cuando la distancia es <=10 sólo retrocede poco, hasta que en el lcd marca 11 y vuelve avanzar y quiero que retroceda 5 segundos cuando la distancia sea <=10
 
Última edición por un moderador:
seria bueno tu programa si no tuviera tanto DELAY eso hace que no funcione bien tu programa

no tengo idea para que pones un delay de 500 ms despues de escribir en la LCD

digamos que el timer1 lee una distancia pero cuando entra un delay el timer 1 sigue trabajando pero el CPU deja de trabajar

y despues metes un while {} vacio es decir hasta que no se cumple echo el CPU del micro esta oscioso

y el timer 1 sigue trabajando es decir en todo todo momento estas atorando el micro con tareas huecas por eso no da la lectura que tiene que ser
 
seria bueno tu programa si no tuviera tanto DELAY eso hace que no funcione bien tu programa

no tengo idea para que pones un delay de 500 ms despues de escribir en la LCD

digamos que el timer1 lee una distancia pero cuando entra un delay el timer 1 sigue trabajando pero el CPU deja de trabajar

y despues metes un while {} vacio es decir hasta que no se cumple echo el CPU del micro esta oscioso

y el timer 1 sigue trabajando es decir en todo todo momento estas atorando el micro con tareas huecas por eso no da la lectura que tiene que ser


Entonces como le pondría quitaría el while o pondría while(true) y las demoras las quito pero si quiero que en 5 segundos valla hacia atras no necesito una demora?
 
Los delays sólo sirven para no usarlos nunca en cosas serias. Para jugar, estupendos.
Usa los temporizadores. Si no tienes bastantes monta un "reloj del sistema"; con un temporizador vas incrementando una veriable por interrupciones y según que valor tenga esa variable haces una u otra cosa...
 
Lo que pasa es que para hacer eso, debes hacer lo siguiente:
PHP:
interrupcion
{
incremento++;

si incremento >= 500 milisegundos
{
incremento=0;

incremento2++;
incremento3++;
incremento4++;
}

cargo el timer nuevamente;
}


while true
{


//prendere un led 1 segundo
si incremento2 >=2
{
incremento2=0;

led1=1;
}
else
{
led1=0
}



//prendere un led cada 5 segundos

si incremento3 >=10
{
incremento3=0;
led2=1;
}
else

{
led2=0
}


//prendere un led cada 6 segundos
si incremento4 >=12
{
incremento4=0;
led3=1;
}
else

{
led3=0
}


}while true
Con ésto hago que se haga multitarea el micro.
No lo puse en código porque quiero que lo entiendas, lo razones y veas qué es lo que está pasando.
Simúlalo y verás que cada LED es totalmente independiente uno del otro. ;)
 
Última edición por un moderador:
Con ésto hago que se haga multitarea el micro.
No lo puse en código porque quiero que lo entiendas, lo razones y veas qué es lo que está pasando.
Simúlalo y verás que cada LED es totalmente independiente uno del otro. ;)

Pero es de un incremento por interrupción. Lo analizaré.
 
Última edición por un moderador:
Hola, lo que comenta Scooter "Los delays sólo sirven para no usarlos nunca en cosas serias. Para jugar, estupendos." :aplauso::aplauso: , es una pura verdad!, un delay sólo sirve si el programa es simple, sin condiciones, de lo contrario se utilizan retardos por interrupción o se utilizan variables que se incrementan hasta un valor estimado para ejecutar la condición esperada.
De ésta manera, el programa tiene un ciclo corto de ejecución y el procesador puede seguir atendiendo múltiples tareas.
 
Última edición:
Atrás
Arriba