Mostrando entradas con la etiqueta UART. Mostrar todas las entradas
Mostrando entradas con la etiqueta UART. Mostrar todas las entradas

sábado, 13 de julio de 2013

RECEPCIÓN DE DATOS CON MÓDULO UART DE PSoC

En esta entrada se va a trabajar la recepción de datos por medio del protocolo UART con un microcontrolador PSoC, por lo tanto es recomendable primero revisar y leer una publicación anterior en la cual se hizo la introducción y un primer trabajo de envío de datos por medio de este protocolo con el modulo de usuario UART con el que cuenta PSoC Designer, la entrada en mención es la siguiente: COMUNICACIÓN UART CON PSoC.


En la práctica que se va a mostrar en esta entrada se trata de enviar un dato por medio de protocolo UART desde el computador, recibir este dato en el microcontrolador PSoC para luego mostrarlo en un display LCD de 16 caracteres por 2 columnas. Antes de comenzar con la muestra del desarrollo de la práctica es necesario mostrar algunos métodos que tiene el módulo UART de PSoC para la recepción de caracteres como son los siguientes:

UART_IntCntl: Esta función habilita o deshabilita las interrupciones de recepción y transmisión de manera independiente, la sintaxis es:

  • UART_IntCntl(); dentro del paréntesis se debe colocar el tipo de interrupción que se desee habilitar o deshabilitar teniendo las siguientes opciones:

·         UART_ENABLE_RX_INT: Habilita la recepción
·         UART_ENABLE_TX_INT: Habilita la transmisión
·         UART_DISABLE_RX_INT: Deshabilita la recepción
·         UART_DISABLE_TX_INT: Deshabilita la transmisión

Por ejemplo para habilitar la recepción, la línea de código quedaría escrita de la siguiente manera:

·       UART_IntCntl(UART_ENABLE_RX_INT);

   UART_CmdReset: Resetea el buffer del modulo UART, dejándolo preparado para recibir las siguientes instrucciones. La sintaxis de esta función es:

·                    UART_CmdReset();
  
    UART_szGetParam: Toma el dato guardado en el buffer de recepción del modulo UART, luego de tomar este dato lo guarda en un puntero. La sintaxis de a función es la siguiente:

·                    Char * UART_szGetParam();


Para que esta función pueda guardar el dato dentro de un puntero, se coloca la función dentro de una condición if, por ejemplo:

·                    If(dato = UART_szGetParam()){}

Donde dato es el puntero en el cual se va a guardar el dato que ha recibido el buffer del módulo  UART del PSoC.

DESARROLLO DE LA PRÁCTICA:

Como ya se había mencionado en esta práctica se va a enviar un dato por medio del computador para que posteriormente sea recibido por el modulo UART del microcontrolador PSoC y sea mostrado en un display LCD 16*2.

En la práctica con módulo UART realizada anteriormente, para establecer la comunicación entre el computador y el microcontrolador se utilizo una tarjeta construida con un circuito integrado FT232 con el cual se lograba hacer la conversión de protocolo USB a UART mediante la emulación de un puerto COM, en esta ocasión no se va a utilizar la misma tarjeta sino que para mostrar una nueva posibilidad para establecer dicha conexión se utilizo un programador de microcontroladores PIC como interfaz y como software para enviar los datos se utilizo la herramienta UART (UART Tool) del programa PICkit 2 de Microchip.

Luego de haber enviado el dato, el encargado de recibir dicha información es el PSoC, para tal fin se utilizo un modulo UART y se configuraron los parámetros del reloj y de recepción del mismo tal como se muestra en la imagen a continuación.

(Figura 1. Parámetros globales del microcontrolador)


(Figura 2. Parámetros módulo UART)

Luego de guardar el dato para hacer la visualización del mismo se utilizo un display LCD 16*2, para utilizar este dispositivo se uso el módulo LCD que incluye PSoC Designer.

El código utilizado para esta práctica con sus respectivos comentarios se puede ver a continuación:

//----------------------------------------------------------------------------
// C main line
//----------------------------------------------------------------------------

#include <m8c.h>       
#include "PSoCAPI.h"   

void main(void)
{
char *dato; // Puntero donde se guardan los datos recibidos
UART_CmdReset(); //Resetea el buffer del modulo UART
UART_IntCntl(UART_ENABLE_RX_INT); //Habilita las interrupciones de RX
UART_Start(0); // Inicializa módulo UART
LCD_Start(); // Inicializa módulo LCD
M8C_EnableGInt;
       while(1)
       {
             if(dato = UART_szGetParam()) //Comprueba si el buffer del UART ha recibido un                                              Parametro y lo guarda en el puntero
             {
             LCD_Position(0,3); // Ubica la primera columna y el tercer caracter del display                                  LCD
             LCD_PrCString("PSoC RX UART"); // Escribe el texto en la posición anterior
             LCD_Position(1,0); // Ubica la segunda Columna y el tercer caracter del display                                   LCD
             LCD_PrString(dato); // Escribe el valor del puntero en la posición anterior
             UART_CmdReset();//Resetea el buffer del modulo UART
             }
       }
}


Por último los resultados obtenidos de la práctica se pueden observar en las siguientes imágenes:

(Figura 3. Envió de la palabra PSoC)

(Figura 4. Recepción y muestra de la palabra PSoC)
(Figura 5. Envió de la palabra Hola)
(Figura 6. Recepción y muestra de la palabra Hola)
(Figura 7. Envió de la palabra Prueba)
(Figura 8. Recepción y muestra de la palabra Prueba)
(Figura 9. Envió de símbolos :) )
(Figura 10. Recepción y muestra de símbolos :) )

sábado, 29 de septiembre de 2012

COMUNICACIÓN UART CON PSoC

En esta ocasión he propuesto realizar una práctica de comunicación UART con PSoC, la idea principal es mostrar el funcionamiento del modulo de usuario UART, esto se llevara a cabo mediante un sencillo ejercicio en el cual se debe tomar el voltaje de un potenciómetro configurado como divisor de tensión, luego este valor de voltaje se debe convertir de análogo a digital mediante un modulo de usuario ADCINC para posteriormente enviarlo en formato hexadecimal a un Hyper Terminal.

En primera instancia se van a revisar los aspectos básicos de configuración para poder utilizar el modulo de usuario UART. Este modulo de usuario es un transmisor y receptor universal asíncrono (UART) compatible con el protocolo de comunicación RS232 en modo full duplex, está compuesto por dos bloques digitales los cuales son utilizados uno para transmisión (Tx) y el otro para recepción (Rx) que funcionan independientemente.

Reloj del modulo UART y velocidad de transmisión: El reloj con el cual se alimenta el modulo de usuario es el mismo para ambos bloques y la frecuencia de este debe ser 8 veces mayor a la velocidad de transmisión deseada, por ejemplo si se quiere transmitir a una velocidad de 9600 baudios es necesario que el reloj del modulo de usuario UART este configurado a 76.8 KHz, la tolerancia del reloj para un correcto funcionamiento es +/- 2%.

Rx input: Este parámetro se debe conectar a alguna de las filas de entrada de los bloques digitales y luego a alguno de los pines externos desde donde se va a tomar los datos que son enviados desde el computador.

Tx Output: Este parámetro se conecta a alguna de las filas de salida de los bloques digitales y luego al pin externo encargado de enviar la información al computador.

Tx Interrupt Mod: Este parámetro determina el momento en el que se genera la interrupción por medio del bloque Tx, se pueden escoger dos tipos de interrupciones “TxRegEmpty” y “TxComplete”, la segunda opción es la más utilizada para casos en los que es necesario garantizar que el dato transmitido ha sido enviado por completo.

ClockSync: Permite establecer la fuente de reloj con la que se debe sincronizar el modulo de usuario.

Rx Output: este parámetro permite tomar el valor de entrada a uno de los buses del microcontrolador, esto puede ser útil para realizar funciones de verificaciones de datos.

Rx Clock Out y Tx Clock Out: Permite utilizar el reloj del bloque en otros procesos, hay que recordar que este reloj equivale al del modulo divido en 8.

RxCmdBuffer: Habilita o deshabilita el buffer para la recepción de comandos.

RxBufferSize: Determina el tamaño del buffer de recepción, este parámetro solo es valido cuando están habilitados el RxCmdBuffer y las interrupciones.

CommandTerminator: Determina el carácter o valor que al ser recibido señala el final de un comando.

Param_Delimiter: Determina el carácter utilizado para delimitar un parámetro por ejemplo con el valor 32 se termina que el delimitador es un espacio.

Aunque los parámetros mostrados anteriormente son los básicos para poner en funcionamiento el modulo UART, también son necesarios algunos comandos para la programación del mismo, estos comandos son utilizados para la inicialización del modulo, seleccionar el tipo de paridad, tomar y enviar diferentes tipos de datos, algunos de estos comandos se muestran a continuación, sin embargo es recomendable consultar la hoja de datos del modulo para profundizar el estudio de estos métodos.

• UART_Start(0): Este comando inicializa el modulo de usuario, el valor indicado dentro del paréntesis indica el tipo de paridad.
• UART_CPutString("PSoC En Español \n\r"): Este comando envía una cadena de caracteres.
• UART_PutSHexByte(Valor): Envía en formato Hexadecimal el valor indicado.

De ahora en adelante se muestra el proceso de desarrollo de la práctica mencionada anteriormente.

El primer paso es tomar la muestra del potenciómetro, para esto se utilizaron un modulo PGA con ganancia unitaria y un modulo ADCINC con una frecuencia de muestreo de 1562 muestras por segundo la cual puede ser baja para ejercicios con señales con altas frecuencias pero para la práctica que se está realizando en este momento es más que suficiente, luego de tener los dispositivos para convertir el valor análogo a un valor digital se procede a utilizar el modulo UART y a configurarlo como se puede apreciar en las figuras 1 y 2.

(Figura 1. Configuración de los parámetros del modulo)
(Figura 2. Interconexión del modulo con los pines externos)

Como se pudo observar en la figura 1, el reloj utilizado para alimentar el modulo UART es VC3 el cual está tomando el reloj del sistema (SysClk) y lo divide en 156 por lo tanto la frecuencia que proporciona VC3 es de 153,8 KHz y como ya se había mencionado la velocidad de transmisión es igual a la velocidad del reloj divido en 8 por lo tanto la velocidad a la que se va a transmitir en este ejercicio es de 19200 baudios.



Como existe una tolerancia de +/- 2% en la velocidad de transmisión no hay ningún inconveniente con la diferencia que se presenta entre los 19200 y los 19230.

El siguiente paso es escribir el programa para nuestra aplicación, en este código se deben inicializar los módulos de usuario, tomar las muestras con el convertidor análogo a digital y por ultimo enviar estos datos por medio del modulo UART. A continuación se presenta el código desarrollado para esta aplicación.


//-----------------------------------------------------------------------
// C main line
// Programa de muestra del modulo UART de PSoC
// Desarrollado para PSoC En Español, www.psocenespanol.blogspot.com
// Desarrollado por Iván Cuadros Acosta
//-----------------------------------------------------------------------

#include <m8c.h>       
#include "PSoCAPI.h"   
#include <delay.h>

void main(void)
{
PGA_1_Start(3); //inicialización modulo PGA
ADCINC_1_Start(3); //inicialización modulo ADCINC
ADCINC_1_GetSamples(0); // se toman muestras constantemente
M8C_EnableGInt ; //se habilitan las interrupciones
UART_1_Start(0);//inicialización modulo UART, sin paridad

//Se imprimen encabezados que aparecen inicialmente en el hyper Terminal
UART_1_CPutString("PRACTICA DE MUESTRA MODULO UART DE PSoC \n\r");
UART_1_CPutString("PSoC En Español \n\r");
UART_1_CPutString("www.psocenespanol.blogspot.com \n\r");
while(1)
{
if(ADCINC_1_fIsDataAvailable()!=0)//se conprueba si hay un valos disponible en el convertidor
{
  UART_1_PutSHexByte(ADCINC_1_wGetData());//Se envia el valor del ADCINC en formato Hexa
  UART_1_CPutString("\n\r");}//Se imprime un salto de linea
  Delay10msTimes(50);//Retardo de 500 milisegundos
}
}


Por último a continuación se presenta un vídeo donde es posible observar el proceso el funcionamiento de esta práctica.



NOTA: La recepción de datos por medio del modulo UART de PSoC se muestra en una publicación posterior, si quieren revisarla pueden hacerlo a través del siguiente link:  RECEPCIÓN DE DATOS CON MODULO UART DE PSoC.