sábado, 28 de febrero de 2015

Microchip PIC: UART + XBEE + LEDs

En este capítulo, vamos a mostrar como configurar el módulo Addressable Universal Synchronous 
Asynchronous Receiver Transmitter en modo UART, y para ello, hemos escogido al microcontrolador PIC16F88.

La idea de este programa es hacer parpadear cambiar el estado de dos LEDs, uno conectado al pin RB3 ( LED rojo ) y el otro al pin RB4 ( LED verde ) del microcontrolador PIC16F88 dependiendo del comando recibido por la UART ( en este caso, por el pin RX, pin RB2 ).

En este ejemplo, no se va a transmitir nada, solo recibir.

Lo primero que hay que hacer, es saber a que velocidad va el reloj principal, en este caso, el microcontrolador escogido, posee un oscilador interno configurable y en nuestro ejemplo, vamos a ponerlo a la máxima velocidad, 8 MHz.

Y bien, para la configuración de la UART en modo asíncrono ( full-duplex, la transmisión y recepción son independientes ) vamos a poner la lupa en como calcular el Baudrate de la UART.

Según el documento: Mid-Range Reference Manual, en el subapartado: 11.1 AUSART Baud Rate Generator (BRG), nos explica como obtenerlo e incluso algunos valores teóricos para un conjunto de frecuencias de reloj.

Vamos a explicarlo de forma breve, lo primero que debemos saber es que para configurar el Baudrate del módulo UART (en modo ASÍNCRONO ), tenemos dos opciones:


· Baja Velocidad: Para entrar en modo baja velocidad, deberemos poner a cero el bit BRGH del registro TXSTA. y la expresión para calcular el Baudrate es la siguiente:


BaudRate = f_OSC/( 64·( X + 1 ) )


Donde:

· BaudRate ≡  Velocidad de comunicación del módulo UART
· f_OSC ≡ Frecuencia del oscilador principal
· X ≡  Carga del registro SPBRG


Tanto los valores BaudRate como f_OSC son conocidos de antemano, lo que nos interesa es saber el valor de X, así que, despejando obtenemos lo siguiente:


X = [ f_OSC/( 64·BaudRate ) ] - 1


Un ejemplo práctico, tenemos el reloj principal a 8 MHz y queremos un BaudRate de 9600, vamos a calcular con que valor debemos cargar al registro SPBRG:


X = [ f_OSC/( 64·BaudRate ) ] - 1 = [ 8·10^6/( 64·9600 ) ] - 1 ≈ 12.020833 = 12


Como podemos observar, el valor no es exacto, esto quiere decir que tendremos un error, vamos a calcular el error que cometeremos en esta configuración:


· BaudRate Deseado =  9600
· BaudRate Real =
 8·10^6/( 64·( 12 + 1 ) ) ≈ 9615.38 = 9615 


Por lo tanto, el error cometido será el siguiente:


%Error = [ ( BaudRate Real - BaudRate Deseado )/BaudRate Deseado ]·100 = ( 9615 - 9600 )/9600 ≈ 0.16%



· Alta Velocidad: Para entrar en modo alta velocidad, deberemos poner a uno el bit BRGH del registro TXSTA. y la expresión para calcular el Baudrate es la siguiente:


BaudRate = f_OSC/( 16·( X + 1 ) )


Donde:

· BaudRate ≡  Velocidad de comunicación del módulo UART
· f_OSC ≡ Frecuencia del oscilador principal
· X ≡ Carga del registro SPBRG


Al igual que pasaba en el modo baja velocidad, los valores BaudRate como f_OSC son conocidos de antemano, lo que nos interesa es saber el valor de X, así que, despejando obtenemos lo siguiente:


X = [ f_OSC/( 16·BaudRate ) ] - 1


Pongamos el mismo ejemplo que antes: el reloj principal a 8 MHz y queremos un BaudRate de 9600, vamos a calcular con que valor debemos cargar al registro SPBRG:


X = [ f_OSC/( 16·BaudRate ) ] - 1 = [ 8·10^6/( 16·9600 ) ] - 1 ≈ 51.083333 = 51


Como podemos observar, el valor no es exacto, esto quiere decir que tendremos un error, vamos a calcular el error que cometeremos en esta configuración:


· BaudRate Deseado =  9600
· BaudRate Real =
 8·10^6/( 16·( 51 + 1 ) ) ≈ 9615.38 = 9615 


Por lo tanto, el error cometido será el siguiente:


%Error = [ ( BaudRate Real - BaudRate Deseado )/BaudRate Deseado ]·100 = ( 9615 - 9600 )/9600 ≈ 0.16%



Bien, llegados a este punto, ya sabemos calcular el BaudRate para nuestro módulo UART, solo decir un par de cosas más, la primera: Microchip recomienda el uso de Alta Velocidad para la obtención del BaudRate.

Y la segunda, hay que prestar especial atención al registro SPBRG, dicho registro, como ya sabemos, es el encargado de almacenar el valor X calculado para el BaudRate, pero es un registro de 8-bits. ¿Qué quiere decir esto? Pues si nuestro valor calculado X sea mayor a 256, el BaudRate que queremos generar NO es posible.

Por lo que la única opción que nos queda es comprobar tanto en Alta Velocidad como en Baja Velocidad si el valor X es menor a 256. En caso contrario, deberemos cambiar o la frecuencia del reloj o el BaudRate.



Y ya sin más dilación, vamos a presentar nuestro programa, éste consistirá en cambiar el estado de dos LEDs dependiendo del valor enviado por la UART, y para hacerlo más vistoso, lo vamos a hacer de forma inalámbrica, con un par de módulos XBee.

Así que en nuestro ordenador tendremos un módulo XBee ( será el Coordinador ) y en nuestro protoboard tendremos al PIC16F88 con sus LEDs y otro módulo XBee ( será End Device ) conectado al pin Rx de la UART.

En este ejemplo, no vamos a transmitir nada, así que solo nos interesa el pin de recepción de datos Rx.

El PIC16F88 tiene un reloj interno configurable, en nuestro caso, vamos a ponerlo a la máxima velocidad, a 8 MHz, y para el BaudRate, será a 9600 en Alta Velocidad ( tal y como recomienda Microchip ).

Por lo tanto BRGH = 1 ( registro TXSTA ), así que la carga del registro SPBRG = 51 ( el cómo obtener dicho valor, se puede ver anteriormente ). En el momento que se reciba un dato por la UART ( pin Rx ), se producirá una interrupción donde se leerá el dato y se procederá al cambio del estado del LED correspondiente.



El material que vamos a necesitar y su función, es la que se muestra a continuación:

· PIC16F88: Microcontrolador para este programa.

· Protoboard: Donde insertaremos nuestros componentes.

· PICKIT 3: Programador y depurador necesario para programar el código.

· Módulos XBee: Un par de ellos, en este caso, el módulo XBee es el modelo: XB24-ZB.

· Interfaz Gráfica: Software que se ejecuta en un ordenador con sistema operativo Windows con al menos, la versión .NET Framework 4.0. Dicha interfaz gráfica se puede descargar más adelante junto al Firmware.

· Resistor 220 Ω: Un par de resistores que irá en serie al LED y conectado al pin RB3 y RB4 para limitar la corriente.

· Resistor 4.7 kΩ: Un resistor que irá conectado entre los pins #MCLR y VDD.

· LEDs: Un par de ellos, en nuestro caso uno rojo y el otro verde.



El firmware es el que se muestra a continuación:


/**
* @file      main.c
* @author    Manuel Caballero
* @date      26/2/2015
* @brief     Archivo principal.
* \copyright
*      AqueronteBlog@gmail.com
*
* Este archivo es propiedad intelectual del blog Aqueronte,
* cuya direccion web, es la siguiente:
*
*    http://unbarquero.blogspot.com/
*
* Se permite cualquier modificacion del archivo siempre y cuando
* se mantenga la autoria del autor.
*/
#include < xc.h >
#include < stdint.h >
#include "variables.h"
#include "functions.h"
#include "interrupts.h"

/**
 *  \brief     void main( void )
 *  \details   Este programa consiste en encender un LED rojo o un LED verde
 *             por medio del módulo UART.
 *
 *             Todas las acciones se realizarán en el servicio de interrupción
 *             de la UART.
 *
 *             Este programa se ha probado con un par de módulos XBee modelo
 *             XBee XB24-ZB ( uno Coordinator y el otro End Device ).
 * 
 *
 *  \author    Manuel Caballero
 *  \version   0.0
 *  \date      26/2/2015
 *  \pre       Este firmware está probado para el PIC16F88.
 *  \pre       El LED rojo estará conectado al pin RB3
 *             ( un resistor de 220 Ohms en serie ).
 *  \pre       El LED verde estará conectado al pin RB4
 *             ( un resistor de 220 Ohms en serie ).
 *
 *  \pre       MPLAB X IDE v2.30.
 *  \pre       Compiler XC8 v1.33.
 */
void main( void ) {

   conf_CLK    ();     // Configura Relojes
   conf_IO     ();     // Configura Pins
   conf_UART   ();     // Configura UART

   ei  ();             // enable interrupts
    
   while ( 1 );        // espera dato procedente de la UART
}

Como vemos, el ejemplo es bastante simple, se recomienda bajar los archivos disponibles más abajo para indagar entre sus librerías y leer sus funciones de manera más detallada.

Un vídeo que demuestra lo explicado anteriormente se presenta a continuación:



Os pongo a vuestra disposición el programa en lenguaje C (XC8 y CCS) para que lo podáis descargar y probar:

Microchip PIC: PIC16F88 + LEDs + UART + XBee
Compilador XC8Compilador CCS
CC
PIC16F88: UART + XBee 
PIC16F88: UART + XBee
PIC16F88: UART + XBee
PIC16F88: UART + XBee


Podéis encontrar el código completo en nuestro repositorio GitHub

·AqueronteBlog GitHub.

· NOTA 1Lo comentarios están en formato doxygen. Aunque no se entrega dicha documentación ya que el MPLAB X no tiene ningún pulgin capaz de trabajar con dicho formato.

· NOTA 2: Se incluye la simulación en PROTEUS del programa. La versión entregada de PROTEUS es v7.10 SP0.

0 comentarios: