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:
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:
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:
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:
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:
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:
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:
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 XC8 | Compilador CCS | ||||||||||||
C | C | ||||||||||||
|
|
Podéis encontrar el código completo en nuestro repositorio GitHub
· | AqueronteBlog GitHub. |
· NOTA 1: Lo 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:
Publicar un comentario