GPS y PIC16F876A

0

Estoy intentando configurar un receptor GPS con PIC16F876A. En el código a continuación, estoy recibiendo caracteres de UART y verificando si el carácter recibido es $ . Si la condición es verdadera, reciba los caracteres y guárdelos en la matriz de caracteres gps hasta que se vea , .

Si escribo caracteres a través de un indicador de serie en Linux, el código funciona como se supone. Pero si lo conecto al receptor GPS, solo obtengo los primeros dos caracteres y la pantalla LCD mostrará OVERRUN . Soy nuevo en PIC. ¿Qué debo hacer?

char a, gps[50];
int i, j, k, flag = 0;
void GPS_init()
{
        TXSTA = 0X24; //00100100
        RCSTA = 0X90; //10010000
        SPBRG = 25;
}

char uart_rx()
{
        while(!RCIF);
        //RCIF=0;
        a=RCREG;
        return(a);

}


void GPS()
{
    for(i=0; ;i++)
    {
        a = uart_rx();
        TXREG = a;   //view received data in serial terminal
        while(TRMT == 0);
        data(a); 
        if(OERR == 1)
        {
            command(0Xc0);
            display("OVERRUN"); //Display string to LCD
            CREN = 0;
        }

        if(a == '$')
        {
            gps[0] = '$';
            for(k=1; ;k++)
            {
                gps[k] = uart_rx();
                data(gps[k]);   //display character to LCD
                TXREG = gps[k]; //view received data in serial terminal
                while(TRMT == 0);

                if(gps[k] == ',')
                {
                    gps[k] = '
char a, gps[50];
int i, j, k, flag = 0;
void GPS_init()
{
        TXSTA = 0X24; //00100100
        RCSTA = 0X90; //10010000
        SPBRG = 25;
}

char uart_rx()
{
        while(!RCIF);
        //RCIF=0;
        a=RCREG;
        return(a);

}


void GPS()
{
    for(i=0; ;i++)
    {
        a = uart_rx();
        TXREG = a;   //view received data in serial terminal
        while(TRMT == 0);
        data(a); 
        if(OERR == 1)
        {
            command(0Xc0);
            display("OVERRUN"); //Display string to LCD
            CREN = 0;
        }

        if(a == '$')
        {
            gps[0] = '$';
            for(k=1; ;k++)
            {
                gps[k] = uart_rx();
                data(gps[k]);   //display character to LCD
                TXREG = gps[k]; //view received data in serial terminal
                while(TRMT == 0);

                if(gps[k] == ',')
                {
                    gps[k] = '%pre%';
                    flag = 1;
                    break;      
                }
            }
        }

        if(flag == 1)
        {
            flag = 0;
            break;
        }
    }
}

main()
{
    GPS_init();
    LCD_init();
    command(0x80);
    display("Initializing");
    command(0x01);
    GPS();


    while(1)
    {
        command(0XC0);
        display(gps);
    }

}
'; flag = 1; break; } } } if(flag == 1) { flag = 0; break; } } } main() { GPS_init(); LCD_init(); command(0x80); display("Initializing"); command(0x01); GPS(); while(1) { command(0XC0); display(gps); } }
    
pregunta Athul

1 respuesta

3

El error de saturación significa que no está eliminando los bytes del receptor UART tan rápido como entran. Supongo que el problema está en este código

while(TRMT == 0);

Supongo que esto hace que la ejecución se detenga hasta que el byte puesto en TXREG realmente se haya transmitido. Esta pausa es lo que está matando su capacidad de mantenerse al día con la entrada.

La conclusión es que no debes intentar hacer ambos procesos (recepción y transmisión) en el paso de bloqueo. Debe usar un búfer de datos (por ejemplo, su matriz gps ) para permitir que los dos procesos se ejecuten de forma asíncrona.

    
respondido por el Dave Tweed

Lea otras preguntas en las etiquetas