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.