Autor Tema: Sensor de distancia con PIC18F452  (Leído 1899 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado apoca18

  • PIC10
  • *
  • Mensajes: 1
Sensor de distancia con PIC18F452
« en: 28 de Noviembre de 2014, 23:20:24 »
hola, es primera vez que entro por aca, escribo ya que necesito enlazar un sensor ultrasonico SR04 a un microcontrolador PIC18F452 para que lo muestre en la LCD, he intentado sacando de aqui y de alla pero no logro que me sense, muestra 0.0cm.. ademas de esto nuestro profesor nos lo pidio con el compilador XC8 de MPLAB... aca dejo algo del programa que llevo sin aun lograr que sense:

Código: [Seleccionar]
// <editor-fold defaultstate="collapsed" desc="LIBRERIAS">
#include <stdio.h>
#include <stdlib.h>
#include <delays.h>
#include <XC.h>
#include <XLCD.h>
// </editor-fold>

// <editor-fold defaultstate="collapsed" desc="CONFIGURACIONES: FUSES">
#define _XTAL_FREQ 4000000

    // CONFIG1H
    #pragma config OSC = XT
    #pragma config OSCS = OFF

    // CONFIG2L
    #pragma config PWRT = OFF
    #pragma config BOR = ON
    #pragma config BORV = 20

    // CONFIG2H
    #pragma config WDT = OFF
    #pragma config WDTPS = 128

    // CONFIG3H
    #pragma config CCP2MUX = OFF

    // CONFIG4L
    #pragma config STVR = ON
    #pragma config LVP = OFF

    // CONFIG5L
    #pragma config CP0 = OFF
    #pragma config CP1 = OFF
    #pragma config CP2 = OFF
    #pragma config CP3 = OFF

    // CONFIG5H
    #pragma config CPB = OFF
    #pragma config CPD = OFF

    // CONFIG6L
    #pragma config WRT0 = OFF
    #pragma config WRT1 = OFF
    #pragma config WRT2 = OFF
    #pragma config WRT3 = OFF

    // CONFIG6H
    #pragma config WRTC = OFF
    #pragma config WRTB = OFF
    #pragma config WRTD = OFF

    // CONFIG7L
    #pragma config EBTR0 = OFF
    #pragma config EBTR1 = OFF
    #pragma config EBTR2 = OFF
    #pragma config EBTR3 = OFF

    // CONFIG7H
    #pragma config EBTRB = OFF
// </editor-fold>

// <editor-fold defaultstate="collapsed" desc="RETARDOS LCD">
void DelayFor18TCY(void){
    _delay(18);
}
void DelayPORXLCD(void){
    __delay_ms(15);
}
void DelayXLCD(void){
    __delay_ms (5);
}
void commandXLCD (unsigned a) {
    BusyXLCD();
    WriteCmdXLCD(a);
}


// </editor-fold>

// <editor-fold defaultstate="collapsed" desc="CONFIGURACION DEL GOTOXYXLCD">
void gotoxyXLCD(unsigned char x, unsigned char y)
{
unsigned char direccion;
if(y != 1)
direccion=0x40;
else
direccion=0;

direccion+=x-1;
commandXLCD( 0x80 | direccion);
}
// </editor-fold>


void main(void) {

// <editor-fold defaultstate="collapsed" desc="VARIABLES">
    long distancia;
    long tiempo;
    unsigned char cadena [10];
    int formula;
    formula=0.017*tiempo;
    // </editor-fold>

// <editor-fold defaultstate="collapsed" desc="CONFIGURACION DE PUERTOS">
ADCON1 = 0x0F;
TRISAbits.RA0 = 0;
TRISAbits.RA1 = 1;
// </editor-fold>

// <editor-fold defaultstate="collapsed" desc="CONFIGURACION LCD">
    OpenXLCD(FOUR_BIT & LINES_5X7);
    commandXLCD (0x06);
    commandXLCD (0x0c);
  // </editor-fold>

// <editor-fold defaultstate="collapsed" desc="MUESTRA DE LA MEDIDA EN PANTALLA">
    while (1){
      PORTAbits.RA0 = 0;
      Delay1TCYx(10);
      PORTAbits.RA0 = 1;
      Delay1TCYx(10);
      tiempo=PORTAbits.RA1;
      distancia = formula;
      gotoxyXLCD(1,1);
      putsXLCD("***Bienvenido***");
      gotoxyXLCD(1,2);
      putrsXLCD ("Distancia: ");
      sprintf (cadena, "%1.1f", distancia);
      putsXLCD (cadena);
      putrsXLCD ("cm");
      Delay10KTCYx (50);
    }
// </editor-fold>
    
}

acepto sugerencias asi sea un algoritmo, pero algo que se adapte a este PIC18F452.. de ante mano muchisimas gracias
« Última modificación: 28 de Noviembre de 2014, 23:22:52 por apoca18 »

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Sensor de distancia con PIC18F452
« Respuesta #1 en: 05 de Diciembre de 2014, 12:20:14 »
Disculpa la tardanza, pero estas poniendo mal las salidas ?

Mirando esta imagen:
https://www.aimagin.com/media/catalog/product/cache/1/thumbnail/9df78eab33525d08d6e5fb8d27136e95/h/c/hc-sr04-timing-diagram.png

Veo que tenes que ponerlo a 1 un ratito y quedarte sensando el otro pin. Tu programa sacando el LCD, tiene incluso varios problemas:

Código: C
  1. while (1){
  2.       PORTAbits.RA0 = 0;
  3.       Delay1TCYx(10);
  4.       PORTAbits.RA0 = 1;
  5.       Delay1TCYx(10);
  6.       tiempo=PORTAbits.RA1;
  7.       distancia = formula;
  8.       Delay10KTCYx (50);
  9.     }

Pones a 0 la salida y luego en 1 para siempre hasta leer de nuevo. Cuando deberia ser al reves, tambien deberias hacerlo con interrupciones seria lo mas facil. Aunque esto te pia el portb ( uno de los poocos que tienen interrupcion al cambio.

Ra0 = 1
delay 10us
ra0 = 0
Revisar por ra1   --- Ojo aca que si pones un while sin ninguna otra condicion puede que tu programa quede atrapado aqui para siempre. deberias tener la consideracion de sacarlo cada x tiempo

Asi tiempo=PORTAbits.RA1; no podes medir tiempo, solamente vas a medir si esta en 1 o en 0 el pin.

Y aca distancia = formula; es otro error mas, simplemente estas copiando el valor de la variable formula a distancia, no es que formula se reemplaza por 0.017*tiempo. Si no que estas copiando el valor que se asigno cuando pusiste formula=0.017*tiempo, en ese momento tiempo es una variable no inicializada no se ni que valor tiene, parece que quedo en 0 y por eso te da cero, ademas otra de las cosas es que formula es un int, es decir te va a eliminar todos los decimales.

Para medir tiempos o usas el temporizador o el modulo CCP de los PICs, estos te permiten contar los ciclos de reloj desde que ocurrieron ciertos eventos.
« Última modificación: 05 de Diciembre de 2014, 12:25:07 por KILLERJC »