Haz una pregunta
  Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos
Foros Registrarse ¿Olvidaste tu contraseña?

Temas similares

03/07/2015 #1


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:

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 distanciatiempo;
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
04/07/2015 #2

Avatar de TRILO-BYTE

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
04/07/2015 #3


TRILO-BYTE dijo: Ver Mensaje
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?
04/07/2015 #4

Avatar de Scooter

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...
04/07/2015 #5

Avatar de TRILO-BYTE

Lo que pasa es que para hacer eso, debes hacer lo siguiente:
Código 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.
04/07/2015 #6


TRILO-BYTE dijo: Ver Mensaje
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é.
05/07/2015 #7

Avatar de Gudino Roberto duberlin

Hola, lo que comenta Scooter "Los delays sólo sirven para no usarlos nunca en cosas serias. Para jugar, estupendos." , 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.
Respuesta
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.