Ayuda con medidor de distancias usando PIC 16F676

#1
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.
 

Adjuntos

#2
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()?
 
Última edición:
#3
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

}
 
#4
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
 
Última edición:

Temas similares

Arriba