Autor Tema: Ayuda con sensor ultrasonico en MPLAB.. XC8  (Leído 2105 veces)

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

Desconectado Noe Reyes

  • PIC10
  • *
  • Mensajes: 3
Ayuda con sensor ultrasonico en MPLAB.. XC8
« en: 15 de Mayo de 2020, 23:01:00 »
Hola, espero esten bien en esta cuarentena... tengo una duda, tengo un codigo en PIC C COMPILER el cual obtiene la distancia a través de un sensor ultrasonico y la muestra en un LCD, y el codigo funciona, ahora quiero hacer la misma practica en XC8 pero tengo un problema, cuando inicio mi ciclo:
while(!echo)
{
T1CONbits.TMR1ON = 0;
}
while(echo)
{
T1CONbits.TMR1ON = 1;
}
se queda pegado en while(!echo) y de ahi no sale nunca..... Entonces no se como solucionarlo, he leido en este foro que se queda pegado el codigo si se hace eso, pero no se como solucionarlo, tambien lei que con interrupciones se puede solucionar (una interrupcion en el puerto B debido al cambio de estado en los pines RB4,5,6,7, pero no conozco bien el tema), ¡o existe alguna otra manera de solucionarlo sin interrupciones?  Si tengo un error en la configuracion del timer 1 pueden decirme porfavor..
Estoy usando el PIC18F4550 con 48MHz.....


Adjunto el codigo
« Última modificación: 15 de Mayo de 2020, 23:21:17 por Noe Reyes »

Desconectado remi04

  • PIC24F
  • *****
  • Mensajes: 657
Re:Ayuda con sensor ultrasonico en MPLAB.. XC8
« Respuesta #1 en: 16 de Mayo de 2020, 05:30:12 »
Solo está el main. Pero no se ve la cabecera , definiciones, fuses y demás.

Desconectado Noe Reyes

  • PIC10
  • *
  • Mensajes: 3
Re:Ayuda con sensor ultrasonico en MPLAB.. XC8
« Respuesta #2 en: 16 de Mayo de 2020, 12:01:39 »


#define RS LATDbits.LATD1
#define EN LATDbits.LATD3
#define D4 LATDbits.LATD4
#define D5 LATDbits.LATD5
#define D6 LATDbits.LATD6
#define D7 LATDbits.LATD7
#define _XTAL_FREQ 48000000
#include <xc.h>
#include "lcd.h"
/*CONFIG1L*/
#pragma config PLLDIV = 2 /*Configuro el registo para una entrada de 8MHz*/
#pragma config CPUDIV = OSC1_PLL2/*Ahora divido el oscilador de 96Mhz entre 2 para obtener los 48MHz*/
#pragma config USBDIV = 2/*Indico que la fiente de reloj viene del oscilador dividido entre 2*/
/*CONFIG1H: CONFIGURATION REGISTER 1 HIGH*/
#pragma config FOSC = HSPLL_HS /*Indica que es un oscilador de High Speed con el PLL habilitado*/
#pragma config FCMEN = OFF /*Habilita el monitor de reloj aprueba de fallos*/
#pragma config IESO = OFF  /*Sirve para cambiar la fuente de reloj entre internos y externos*/
/*CONFIG2L: CONFIGURATION REGISTER 2 LOW*/
#pragma config PWRT = OFF /*Permite iniciar el PIC con un retardo de 72ms despues de ser alimentado*/
#pragma config BOR = OFF /*Deshabilito la opcion de reiniciar el microcontrolador en caso de inestabilidad en su alimentaciond de voltaje*/
#pragma config VREGEN = OFF /*Deshabilito el regulador de voltaje interno de USB*/
/* CONFIG2H: CONFIGURATION REGISTER 2 HIGH */
#pragma config WDT = OFF /*Deshabilito el Perro Guardian, sirve en caso de que el pic se pierda en un proceso*/
/*CONFIG3H: CONFIGURATION REGISTER 3 HIGH*/
#pragma config PBADEN = OFF /*Indica si el puerto B es analogico o digital*/
#pragma config LPT1OSC = OFF /*No configura el TIMER1 como de bajo consumo*/
#pragma config MCLRE = 1 /*Habilita el pin del MASTERCLEAR que es el reset del microcontrolador*/
/*CONFIG4L: CONFIGURATION REGISTER 4 LOW*/
#pragma config STVREN = ON /*Deshabilita el reicicio en caso de pila llena o bajo flujo*/
/*CONFIG5L: CONFIGURATION REGISTER 5 LOW */
#pragma config CP0 = OFF /*Deshabilito el bit de proteccion de codigo*/
#pragma config CP1 = OFF /*Deshabilito el bit de proteccion de codigo*/
#pragma config CP2 = OFF /*Deshabilito el bit de proteccion de codigo*/
#pragma config CP3 = OFF /*Deshabilito el bit de proteccion de codigo*/
/*CONFIG6L: CONFIGURATION REGISTER 6 LOW*/
#pragma config WRT0 = 0FF /*Deshabilito el bit de proteccion contra escritura de codigo*/
#pragma config WRT1 = 0FF /*Deshabilito el bit de proteccion contra escritura de codigo*/
#pragma config WRT2 = 0FF /*Deshabilito el bit de proteccion contra escritura de codigo*/
#pragma config WRT3 = 0FF /*Deshabilito el bit de proteccion contra escritura de codigo*/
/*CONFIG7L: CONFIGURATION REGISTER 7 LOW*/
#pragma config EBTR0 = OFF /*Deshabilito el bit de proteccion de lectura de tabla*/
#pragma config EBTR1 = OFF /*Deshabilito el bit de proteccion de lectura de tabla*/
#pragma config EBTR2 = OFF /*Deshabilito el bit de proteccion de lectura de tabla*/
#pragma config EBTR3 = OFF /*Deshabilito el bit de proteccion de lectura de tabla*/
/*CONFIG7H: CONFIGURATION REGISTER 7 HIGH */
#pragma config EBTRB = OFF /*Deshabilito el bit de protección de lectura de tabla de bloque de inicio*/
/*Declaro del valor del oscilador*/

/*Programacion para hacer uso de un sensor ultrasonico*/

/*Declaro las variables a ocupar*/
#define echo PORTBbits.RB4
char uni[10] = {'0','1','2','3','4','5','6','7','8','9'};
char dec[10] = {'0','1','2','3','4','5','6','7','8','9'};
char cen[10] = {'0','1','2','3','4','5','6','7','8','9'};
long  valor = 0;
float distancia = 0;
int unidades, decenas, centenas = 0;


void main(void)
{
    /*Configuracion del Timer1*/
    T1CONbits.TMR1CS = 0; /*Configuro el timer1 como temporizador*/
    T1CONbits.T1OSCEN = 1;
    T1CONbits.T1RUN = 1;
    T1CONbits.T1CKPS0 = 1;
    T1CONbits.T1CKPS1 = 1;
    T1CONbits.RD16 = 1; /*Eligo la configuracion de 16 bits.*/
    TRISB = 1;
    TRISA = 0;
    LATA = 0;
    TRISC = 0;
    LATC = 0;
    TRISD = 0; /*Declaro el puerto D como salida*/
    LATD = 0; /*Limpio la informacion del puerto D*/
    Lcd_Init(); /*Inicio la LCD*/
    Lcd_Clear();
    Lcd_Set_Cursor(1,1);
    Lcd_Write_String("Sens Ultrasonico");
    while (1)
    {
        /*Pongo a cero los registros TMRL/H*/
        TMR1L = 0;
        TMR1H = 0;
        LATAbits.LA0 = 1; /*Activo el trigger*/
        __delay_us(10);
        LATAbits.LA0 = 0; /*Desactivo el trigger*/
   wihle (echo == 1)
   {       
   T1CONbits.TMR1ON = 1;
   }
        while (echo == 0)
        {
        T1CONbits.TMR1ON = 0;
        valor =(TMR1L | TMR1H << 8);   
        }
        LATC = valor;
        distancia = valor*.022666666;
        centenas = distancia / 100;
        decenas = (distancia - (centenas*100))/10;
        unidades = (distancia -(centenas*100)-(decenas*10));
        Lcd_Set_Cursor(2,1);
        Lcd_Write_Char(cen[centenas]);
        Lcd_Set_Cursor(2,2);
        Lcd_Write_Char(dec[decenas]);
        Lcd_Set_Cursor(2,3);
        Lcd_Write_Char(uni[unidades]);
        __delay_ms(500);
       
    }
}