Autor Tema: Sensor Ultrasonico SRF05 y PIC16F18875  (Leído 2425 veces)

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

Desconectado Alanmzt

  • PIC10
  • *
  • Mensajes: 2
Sensor Ultrasonico SRF05 y PIC16F18875
« en: 22 de Mayo de 2018, 04:34:20 »
Buenas a todos!
Estoy realizando un proyecto para mi clase de electrónica en donde se debe de medir una distancia utilizando un sensor ultrasonido SRF05 con un PIC16F18875 en xc8; el proyecto esta montado en una tabla de desarrollo Curiosity HPC.

Sucede que el resultado en pantalla es 0 y no hallo forma de solucionar. Espero me pudieran ayudar con algunas ideas. Saludos!

Código: [Seleccionar]
#include <xc.h>                 
#define _XTAL_FREQ 4000000 
#include "LCD.h"
#include "stdio.h"

void Trigger_Pulse_10us();

#pragma config WDTE = OFF       // Watchdog Timer Enable bit (WDT disabled and can be enabled by SWDTEN bit of the WDTCON register)
#pragma config PWRTE = OFF      // Power-up Timer Enable bit (PWRT disabled)
#pragma config MCLRE = ON       // RE3/MCLR pin function select bit (RE3/MCLR pin function is MCLR)
#pragma config CP = OFF         // Code Protection bit (Program memory code protection is disabled)
#pragma config CPD = OFF        // Data Code Protection bit (Data memory code protection is disabled)
#pragma config BOREN = ON       // Brown Out Reset Selection bits (BOR enabled)
#pragma config FCMEN = ON       // Fail-Safe Clock Monitor Enabled bit (Fail-Safe Clock Monitor is enabled)
#pragma config LVP = ON       // Low Voltage Programming Enable bit (RB3 pin has digital I/O, HV on MCLR must be used for programming)
#pragma config WRT = OFF        // Flash Program Memory Self Write Enable bits (Write protection off)

void main()
{
    float Distance;              //Define la variable distancia
    int Time;
    float Total_distance[10];
    ANSELA=0;                   //Para salidas digitales
    TRISAbits.TRISA3=1;         //RA3 como INPUT  (Echo)
    TRISAbits.TRISA0=0;         //RA0 como OUTPUT (Trigger)
 
    //Configuracion para LCD Display
    ANSELB=0;                   //ANSEL PARA SALIDAS DIGITALES
    TRISB=0;                    //Declara puertos B como Output
    PORTB=0;                    //Valor inicial del puerto B 
    Lcd_Init();
    Lcd_Cmd(LCD_CLEAR);
    Lcd_Cmd(LCD_CURSOR_OFF);

    T1CON = 0x80;               //Initialize Timer Module
    TMR1IF = 0;                 //Bandera TMR1IF a 0
    TMR1 = 0;                   //Temporizador contador timer1 PIC en si, es donde se guardan los valores del timer1 PIC

    Lcd_Out(1,1, "Distancia:");
 
  while(1)
  {
      Trigger_Pulse_10us();
      while(PORTAbits.RA3==0);
      TMR1 = 0;
      TMR1ON = 1;                               //Encender temporizador
      while(PORTAbits.RA3==1 && !TMR1IF);
      Time = TMR1;
      TMR1ON = 0;                               //Apagar temporizador
      TMR1IF = 0;                               //Bandera TMR1IF a 0
      Distance = ((float)Time/117.00);                 
      sprintf(Total_distance,"%.03f",Distance);
      Lcd_Out2(2,1, Total_distance);
      __delay_ms(50);
  }
  }
void Trigger_Pulse_10us()
{
    LATAbits.LATA0 = 1;
    __delay_us(10);
    LATAbits.LATA0 = 0;
}

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Sensor Ultrasonico SRF05 y PIC16F18875
« Respuesta #1 en: 22 de Mayo de 2018, 10:34:39 »
Algunas de las cosas que veo:

Código: [Seleccionar]
    T1CON = 0x80;               //Initialize Timer Module
0x80 ??? justamente ese bit no afecta en nada... Le pondria 0x00 si quisera poner a 0 los preescaler y apagar el Timer.

Código: [Seleccionar]
    TMR1IF = 0;                 //Bandera TMR1IF a 0
      TMR1ON = 0;                               //Apagar temporizador

A no ser que te pusiste a definir cada uno de los pines, podrias haber realizado:

T1CONbits.ON = 0;

El mismo nombre del registro + "bits" y eso es una estructura que cuando pones el punto te aparecen todas las opciones.

Otras cosas del Timer.
Pienso que seria correcto el activar RD16 (T1CON) asi TIMERH se guarda al momento de leer y poder leer correctamente.

Tambien te olvidaste setear la entrada correcta de reloj.. Me refiero al registro T1CLK, Para 0000 que es el reset, tenes que el reloj se alimenta por un pin externo del PPS, para 0001 tenes que es Fosc/4, que a 4Mhz es 1us cada pulso si no tenes preescaler y creo que eso es lo que buscas.

--------------------------------------------------------

Y luego 50ms entre lecturas, vos tenes que pensar que vas a estar actualizando el LCD cada 50ms, y eso si es una locura,, al menos para probar ponele 500ms

Desconectado Alanmzt

  • PIC10
  • *
  • Mensajes: 2
Re:Sensor Ultrasonico SRF05 y PIC16F18875
« Respuesta #2 en: 23 de Mayo de 2018, 00:07:10 »
Algunas de las cosas que veo:

Código: [Seleccionar]
    T1CON = 0x80;               //Initialize Timer Module
0x80 ??? justamente ese bit no afecta en nada... Le pondria 0x00 si quisera poner a 0 los preescaler y apagar el Timer.

Código: [Seleccionar]
    TMR1IF = 0;                 //Bandera TMR1IF a 0
      TMR1ON = 0;                               //Apagar temporizador

A no ser que te pusiste a definir cada uno de los pines, podrias haber realizado:

T1CONbits.ON = 0;

El mismo nombre del registro + "bits" y eso es una estructura que cuando pones el punto te aparecen todas las opciones.

Otras cosas del Timer.
Pienso que seria correcto el activar RD16 (T1CON) asi TIMERH se guarda al momento de leer y poder leer correctamente.

Tambien te olvidaste setear la entrada correcta de reloj.. Me refiero al registro T1CLK, Para 0000 que es el reset, tenes que el reloj se alimenta por un pin externo del PPS, para 0001 tenes que es Fosc/4, que a 4Mhz es 1us cada pulso si no tenes preescaler y creo que eso es lo que buscas.

--------------------------------------------------------

Y luego 50ms entre lecturas, vos tenes que pensar que vas a estar actualizando el LCD cada 50ms, y eso si es una locura,, al menos para probar ponele 500ms

Te envié inbox!