Buenos días, soy nuevo en el tema de los microcontroladores, solo he hecho un par de aplicaciones y todas con el PIC18F2550. Por ahora quisiera hacer una simple con el sensor ultrasónico que sea capaz de medir el nivel del agua en un tanque pero el problema es que el sensor no me esta midiendo nada, probe el sensor en una aplicación con un arduino para descartar la idea de que este malo, y si funciona muy bien, he probado el microcontrolador para otras aplicaciones y tambien me funciona bien. He visto varios tutoriales y la programación es bastante sencilla, no entiendo porque no me funciona. A continuación les muestro el código:
#include <xc.h>
#include <stdio.h>
#define _XTAL_FREQ 48000000 //48MHz frecuencia interna
#define led1 LATAbits.LATA5
#define pEcho PORTBbits.RB2
#define lTrig LATBbits.LATB1
void main(void) {
ADCON1bits.PCFG=0b1111; //Todos los puertos son digitales
TRISAbits.RA5 = 0; //RA5 como salida
TRISBbits.RB2 = 1; //RB2 como entrada
TRISBbits.RB1 = 0; //RB1 como salida
T0CONbits.T08BIT=0; //Timer0 seleccionado para registro de 16bits
T0CONbits.T0CS=0; //Timer0 utiliza ciclo interno del reloj micro Fosc/4
T0CONbits.PSA=0; //Activo prescaler del timer0
T0CONbits.T0PS=0b000; //Prescaler de 1:2 - Tiempo de conteo = (4/48M)*2 = 0,16us
INTCONbits.TMR0IE=0; //Desactivada la interrupción por desbordamiento del timer0
INTCONbits.TMR0IF=0; //Limpiar la bandera por desbordamiento del timer 0
int conteo = 0; //Variable para registro del conteo total del pulso Echo del sensor 1
long distancia = 0; //Variable para registro de la distacia medida por el sensor 1
while(1){
TMR0H = 0; //Limpiar Registro alto del timer0
TMR0L = 0; //Limpiar Registro bajo del timer0
lTrig = 1; //Enviamos pulso Trig del sensor HC-SR04
__delay_us(10); //definimos ancho del pulso 10us
lTrig = 0; //Apagamos el pulso
while(!pEcho); //Esperamos que le llegue señal al Echo
TMR0ON = 1; //Encendemos el timer0
while(pEcho); //Esperamos que el Echo deje de recibir señal
TMR0ON = 0; //Apagamos el timer0
conteo = (TMR0L | (TMR0H<<8)); //Se guarda el registro en la variable
distancia = ((conteo)/58); //Distancia en cm
if(distancia <= 10){
led1=!led1;
for(int i=1;i<=100;i++) __delay_ms(10);
}else led1=0;
}
return;
}
Si alguien encuentra algún error en el código lo agradecería. La idea es que si el sensor detecta "algo" a una distancia menor o igual a 10cm entonces encienda un led intermitente, de lo contrario que el led este apagado.
No se si es relevante esta información pero El PIC18F2550 lo programo con el HIDBootlader.
De ante mano, muchas gracias.