TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: sebastianfpr en 15 de Abril de 2013, 18:45:18

Título: Paso a paso módulo USART con Interrupción en MBLAB XC8
Publicado por: sebastianfpr en 15 de Abril de 2013, 18:45:18
Hola a Todos,

Hace poco empece a utilizar el nuevo entorno de desarrollo MPLAB X y el nuevo compilador de lenguaje C de Microchip, MPLAB XC8. En cuanto al entorno MPLAB X me ha gustado mucho ya que es una interfaz más enriquecida y agradable. El hecho de poder instalar distintas versiones del mismo compilador es muy interesante. Bueno, hay muchas cosas mas que agradan que de seguro ustedes se darán cuenta cuando empiecen a usarla con más frecuencia.

En cuanto al compilador C, MPLAB XC8 me gusta el hecho de poder utilizar las otras familia de PIC y no solo los 18F, aunque las librerías de periféricos solo están disponibles para los 18F (que mal!). Hay algunos problemas en las librerías de periféricos que no descomentan definiciones y es por eso que en algunas funciones aparecen con signo de exclamación en el código, esto es debido a que los prototipos de función no son declarados (por ejemplo prototipo de función de la función OpenUSART es: void OpenUSART ( unsigned char config,  unsigned spbrg). En este caso la librería pconfig.h es a que no descomenta las definiciones necesarias dependiendo del PIC utilizado.

Bueno, más adelante podemos revisar mejor lo anterior en más detalle.

A continuación les presente un vídeo paso a paso que realice en cuanto a mi experiencia inicial con el modulo USART usando interrupción con el compilador MPLAB XC8. En este ejemplo, se realiza la escritura y lectura de datos con un ejemplo sencillo. Espero les guste y les ayude.


El código es el siguiente:

Código: [Seleccionar]
/*
 * File:   main.c
 * Author: SebastiánPuenteR (sebaspr@outlook.com)
 *
 * Created on 14 de abril de 2013, 09:56 PM
 */

#include <xc.h>
#include <plib/usart.h> //Libreria para el manejo del modulo USART

#define EAUSART_V4  //Le especifica al compilador la versión de las funciones del mosdulo USART que se deben declarar.
                    //Esto lo debería hacer el compilador automaticamente pero debe haber un error y no lo hace.
char CaracterRx;
char MensajeTx[] = "Por favor digite una tecla: ";

void main(void) {

    OpenUSART(USART_TX_INT_OFF &
            USART_RX_INT_ON &       //Activar la interrupcion por la recepcion de dato del buffer de Rx del USART
            USART_ASYNCH_MODE &     //Modo asincrono (fullduplex)
            USART_EIGHT_BIT &       //8 bits de datos
            USART_CONT_RX &         //Recepción continua
            USART_BRGH_HIGH, 129);  //9600 Baudios
   
    INTCONbits.PEIE = 1; //Activamos interrupcion de perifericos
    INTCONbits.GIE = 1;  //Activamos las interrupciones globales

    while(BusyUSART());     //Se espera a que el buffer de Tx este libre
    putsUSART(MensajeTx);   //Se envía un string

    while(1);   //Bucle infinito
}

void interrupt Interrupcion()   //Funcion que atiende las interrupciones
{
    CaracterRx = ReadUSART();   //Se lee el dato que esta en el buffer de Rx del USART

    while(BusyUSART());
    putsUSART("\n\rUsted digito la tecla: ");
    while(BusyUSART());
    WriteUSART(CaracterRx);

    PIR1bits.RCIF = 0;  //Desactivamos la bandera de recepción en el buffer de entrada del USART
}

En unos días subiré un vídeo mostrando el funcionamiento del ejemplo creado.

Saludos,

SebastianPuenteR,
Título: Re: Paso a paso módulo USART con Interrupción en MBLAB XC8
Publicado por: AKENAFAB en 15 de Abril de 2013, 19:41:29
Gracias por el aporte.

Buena pinta  ((:-))  :-/

En mi codigo me subraya con rojo OPENUSART,etc... pero compila correctamente,en los foros de microchip se habla de un problmea de ide,del compilador no porque si compila.


*Un dalle en tu código

El bit RCIF se limpia cuando el registro de recepción es leído.

Por otra parte algunos micros pueden manejar el control de los datos,es decir,pueden invertirlo.

Código: [Seleccionar]
BAUD_IDLE_RX_PIN_STATE_HIGH & BAUD_IDLE_TX_PIN_STATE_HIGH
Con esas lineas lo dejo en estado normal.Sin invertir.

Control de errores

Código: [Seleccionar]
    if(PIE1bits.RCIE && PIR1bits.RCIF)            // Did USART cause interrupt ?
    {
    /* EUSART Receive Interrupt Flag bit
       1 = The EUSART receive buffer, RCREG, is full (cleared when RCREG is read)
       0 = The EUSART receive buffer is empty
    */
      if (RCSTAbits.OERR)
        {
            rcByte = RCREG;  // clear the receiver fifo
            rcByte = RCREG;  // FLUSH
            RCSTAbits.CREN = 0;             // clear the OVR flag
            RCSTAbits.CREN = 1;
                                           
            clearRxBuffer();
            return;

        }// OVERRUN ERROR CLEARING

        if (RCSTAbits.FERR)
        {
            rcByte = RCREG;        //ReadUSART();   // remove the broken byte
                                            // send (prepare) error message
            clearRxBuffer();
            return;
        }// FRAMING ERROR CLEARING

        rcByte = RCREG;                     // ReadUSART();


        }

        return;
    }
//*********************************************************************//

Eso es lo que integro en mis programas.
Lo del return esta de sobra :P

Saludos!
Título: Re: Paso a paso módulo USART con Interrupción en MBLAB XC8
Publicado por: sebastianfpr en 17 de Abril de 2013, 01:28:34
Amigo muchas gracias por tus comentarios.

Citar
El bit RCIF se limpia cuando el registro de recepción es leído.

Me quedo sonando lo del Bits RCIF, entonces hice la prueba de escritorio con el simulador de MPLAB X y si lo comprobé, apenas se lee el registro RCREG(que es el que tiene el byte recibido) este bit bandera se pone en 0. Esto quiere decir entonces que para este caso, no ha necesidad de poner la instrucción: PIR1bits.RCIF = 0;

Saludos!
Título: Re: Paso a paso módulo USART con Interrupción en MBLAB XC8
Publicado por: AKENAFAB en 17 de Abril de 2013, 01:33:05
Amigo muchas gracias por tus comentarios.

Citar
El bit RCIF se limpia cuando el registro de recepción es leído.

Me quedo sonando lo del Bits RCIF, entonces hice la prueba de escritorio con el simulador de MPLAB X y si lo comprobé, apenas se lee el registro RCREG(que es el que tiene el byte recibido) este bit bandera se pone en 0. Esto quiere decir entonces que para este caso, no ha necesidad de poner la instrucción: PIR1bits.RCIF = 0;

Saludos!

Asi es compa!

Eso viene definido en la hoja de datos.

Te recomiendo el control de errores,bueno el reinicio del modulo xD, quita muchos dolores de cabeza.

Saludos!
Título: Re: Paso a paso módulo USART con Interrupción en MBLAB XC8
Publicado por: jukinch en 24 de Abril de 2013, 10:46:43
Muy bueno el tutorial Sebastián. y gracias por compartir.  ((:-))
Título: Re: Paso a paso módulo USART con Interrupción en MBLAB XC8
Publicado por: hector915 en 28 de Abril de 2013, 22:25:25
me ah gustado mucho sin embargo ese mplabx me esta poniendo dolores de cabeza ahora al crear mis librerias propias.

Por ejemplo si yo deseo crear una libreria puertos.h ,al tratar de incluirla en mi programa principal me pone problemas y dice que no la encuentra .

SI hago uso de
#include "puertos.h" //tampoco funciona   :5] :5]

Alguien tiene idea o conoce  como crear librerias propias en mplabx.

Gracias.
Título: Re: Paso a paso módulo USART con Interrupción en MBLAB XC8
Publicado por: AngelGris en 29 de Abril de 2013, 09:18:31
  ¿Tienes la librería en la misma carpeta que tu proyecto, o al menos en el path que busca MPLAB?

  Yo dejo una copia de la librería en la carpeta de mi proyecto y nunca tuve problemas al compilar.
Título: Re: Paso a paso módulo USART con Interrupción en MBLAB XC8
Publicado por: hector915 en 30 de Abril de 2013, 11:34:28
finalmente me ah funcionado ,solo tengo una duda pequeñitica es posible agregar los fuses en una libreria aparte tambien  :lol: no se si a todos experimentan problemas.
Título: Re: Paso a paso módulo USART con Interrupción en MBLAB XC8
Publicado por: jukinch en 30 de Abril de 2013, 12:46:39
Hola Héctor. Si puedes hacerlo.
Si tienes problemas copia la salida del compilador y muéstrala para ver cual es el problema que estas teniendo.
Saludos
Jukinch
Título: Re: Paso a paso módulo USART con Interrupción en MBLAB XC8
Publicado por: jhozate en 21 de Mayo de 2014, 19:44:05
hola
ando buscando el pdf para el uso de plib/usart.h o algun pdf donde se especifique el uso de las funciones pero no lo he encontrado, estoy usando un PIC24FJ. Apenas empiezo con XC16 y al iniciar el proyecto queda incluido stdlib.h, con estos ya puedo usar la UART?
Título: Re: Paso a paso módulo USART con Interrupción en MBLAB XC8
Publicado por: AKENAFAB en 21 de Mayo de 2014, 22:10:25
hola
ando buscando el pdf para el uso de plib/usart.h o algun pdf donde se especifique el uso de las funciones pero no lo he encontrado, estoy usando un PIC24FJ. Apenas empiezo con XC16 y al iniciar el proyecto queda incluido stdilib.h, con estos ya puedo usar la UART?

Para los pic24 viene una hoja especifica de cada modulo "Reference Manual", por lo menos así me quede con el c16.

DS39708B (http://ww1.microchip.com/downloads/en/DeviceDoc/en026583.pdf)
Título: Re: Paso a paso módulo USART con Interrupción en MBLAB XC8
Publicado por: jhozate en 22 de Mayo de 2014, 12:06:11
gracias akenafab  ;-)
no había puesto cuidado al inicio de este hilo, las funciones que buscaba solo están disponibles para los PIC18 :(