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

Temas similares

11/11/2009 #1


Ayuda con medidor de distancias usando PIC 16F676
Hola a todos, espero que esten bien.

Recurro a uds en este momento de desesperacion, ya que llevo dos semanas con el trabajo final de una materia que tengo que entregar maniana, y aun no me funciona.

El trabajo consiste en lo siguiente:

Realizar un medidor de distancia en cm usando un sensor GP2D12.

El circuito lo realice en board, con 2 displays 7 segmentos, 2 codificadores bcd y un pic 16f676. Si decean, hago el esquematico en eagle.

El problema, lo tengo es al convertir la senial que sagal el GP a distancia, tengo las grafias de la salida del sensor, la ecuacion mas cercana, pero cuando tengo que realizar la divicion no me anda, he puesto a que muestre en el display la salida del sensor, luego cuando convierto esto a voltaje, luego cuando realizo una resta inicial, pero al realizar la ultima division, no me anda. Les pido ayuda con esto. Muchas gracias, es urgente. Creo que el problema esta en el uso de los tipos de variables.

les dejo los datos adjuntos.

Muchas gracias a todos.
11/11/2009 #2

Avatar de Ferny

Respuesta: Ayuda con medidor de distancias usando PIC 16F676
Si no tienes problemas de espacio en el PIC, todas las variables int8 que tienes declaradas, cámbialas a int16, incluso puedes declararlas como long (creo que es lo mismo). Luego el algoritmo de tu código lo cambiaría un poco para que no haya problemas con el tipo de variables:


voltaje=salidasensor*20;
invdistancia=(voltaje-374);
invdistancia2=(float)invdistancia/22826,0;
distancia=(int)(1,0/invdistancia2);
unidades=distancia%10;
decenas=(int)(distancia/10);

De todas formas viendo el resto del código, ¿no sería más sencillo quitar la interrupción y meter todo lo de la función RTCC_isr dentro del main()?
11/11/2009 #3


Respuesta: Ayuda con medidor de distancias usando PIC 16F676
Hola ferny, gracias por tu respuesta. Intente con el codigo que me pasaste y como dijiste, pero sigue sin andar, se queda mostrarndo 04

este es el codigo como esta ahora:

#include "C:\Users\El Oso\Pictures\piliiiii\medidor distancias\avereste\1.h"
float invdistancia2=0;
int distancia=0, unidades=0, decenas=0, salidasensor=0;
long voltaje=0, invdistancia=0;


void main()
{

setup_adc_ports(sAN0|VSS_VDD);
setup_adc(ADC_CLOCK_INTERNAL);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_comparator(NC_NC);
setup_vref(FALSE);

// TODO: USER CODE!!

for(;{

set_adc_channel(0);
delay_us(10);
salidasensor=read_adc();
delay_ms(10);

voltaje=salidasensor*20;
invdistancia=(voltaje-374);
invdistancia2=(float)invdistancia/22826,0;
distancia=(int)(1,0/invdistancia2);
unidades=distancia%10;
decenas=(int)(distancia/10);

///////// CONVERCION A BINARIO

if(unidades==0){
output_low(pin_c1);
output_low(pin_c0);
output_low(pin_a2);
output_low(pin_a1);
}
if(unidades==1){
output_high(pin_c1);
output_low(pin_c0);
output_low(pin_a2);
output_low(pin_a1);
}
if(unidades==2){
output_low(pin_c1);
output_high(pin_c0);
output_low(pin_a2);
output_low(pin_a1);
}
if(unidades==3){
output_high(pin_c1);
output_high(pin_c0);
output_low(pin_a2);
output_low(pin_a1);
}
if(unidades==4){
output_low(pin_c1);
output_low(pin_c0);
output_high(pin_a2);
output_low(pin_a1);
}
if(unidades==5){
output_high(pin_c1);
output_low(pin_c0);
output_high(pin_a2);
output_low(pin_a1);
}
if(unidades==6){
output_low(pin_c1);
output_high(pin_c0);
output_high(pin_a2);
output_low(pin_a1);
}
if(unidades==7){
output_high(pin_c1);
output_high(pin_c0);
output_high(pin_a2);
output_low(pin_a1);
}
if(unidades==8){
output_low(pin_c1);
output_low(pin_c0);
output_low(pin_a2);
output_high(pin_a1);
}
if(unidades==9){
output_high(pin_c1);
output_low(pin_c0);
output_low(pin_a2);
output_high(pin_a1);
}

if(decenas==0){
output_low(pin_c5);
output_low(pin_c4);
output_low(pin_C3);
output_low(pin_c2);
}
if(decenas==1){
output_high(pin_c5);
output_low(pin_c4);
output_low(pin_c3);
output_low(pin_c2);
}
if(decenas==2){
output_low(pin_c5);
output_high(pin_c4);
output_low(pin_c3);
output_low(pin_c2);
}
if(decenas==3){
output_high(pin_c5);
output_high(pin_c4);
output_low(pin_c3);
output_low(pin_c2);
}
if(decenas==4){
output_low(pin_c5);
output_low(pin_c4);
output_high(pin_c3);
output_low(pin_c2);
}
if(decenas==5){
output_high(pin_c5);
output_low(pin_c4);
output_high(pin_c3);
output_low(pin_c2);
}
if(decenas==6){
output_low(pin_c5);
output_high(pin_c4);
output_high(pin_c3);
output_low(pin_c2);
}
if(decenas==7){
output_high(pin_c5);
output_high(pin_c4);
output_high(pin_c3);
output_low(pin_c2);
}
if(decenas==8){
output_low(pin_c5);
output_low(pin_c4);
output_low(pin_c3);
output_high(pin_c2);
}
if(decenas==9){
output_high(pin_c5);
output_low(pin_c4);
output_low(pin_c3);
output_high(pin_c2);
}

// delay_ms(150);


}//////////////////CIERRA FOR INFINITO

}
12/11/2009 #4

Avatar de Ferny

Respuesta: Ayuda con medidor de distancias usando PIC 16F676
Podrías quitarte los float si sustituyes estas líneas:

invdistancia2=(float)invdistancia/22826,0;
distancia=(int)(1,0/invdistancia2);

Por esto:

distancia = 22826 / invdistancia;

Es lo mismo, ¿no? En ese caso la variable invdistancia2 ya sobra, y tienes un división de números enteros, que seguro debe funcionar.

De todas formas si no va, antes de la línea:

voltaje=salidasensor*20;

Pon algo como:

voltaje = 100;

Así sabes lo que tiene que salir al final. Es como para ver si el problema está en que el ADC no está refrescando su valor.

Saludos
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.