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.

13 comentarios:

  1. Me gusto mucho tu practica!! jaja de casualidad no tienes ejemplos de filtros usando psoc?? saludos!!

    ResponderEliminar
    Respuestas
    1. Hola muchas gracias por visitar el blog y me alegra que te haya gustado la practica, en cuanto a lo de los ejemplos de los filtros lamento comentarte que en el momento no tengo ningún ejemplo disponible y tampoco cuento con los elementos para realizar la practica, sin embargo si logro conseguir los elementos antes de escribir la entrada del blog de este mes entonces la haré sobre este tema.

      Eliminar
  2. hola muy padre la practica =D me gusto mucho disculpa no tendras una de uart pero con un modulo bluetooth ??? es que no como ponerle el RX

    ResponderEliminar
    Respuestas
    1. Hola disculpa la demora en la respuesta y gracias por visitar el blog, en cuanto a la pregunta sobre una comunicación UART con modulo bluetooth, lamento decirte que no tengo ninguna practica así en el momento, sin embargo si me dices la referencia del modulo bluetooth utilizado y me aclaras un poco mas el problema, si me queda un poco de tiempo puedo revisar la hoja de datos y quizás proponerte alguna solución.

      Eliminar
    2. Existe un api de alto nivel que te permite obtener una cadena de caracteres UART_szGetParam() o múltiples subcadenas delimitadas por un separador de parámetros y este hay que configurarlo desde los parámetros del modulo de usuario del UART.

      Donde Param_Delimiter =32(32 en ascii representa un espacio en blanco)

      "For example, if the Param_Delimiter is set to a space character (32), each substring separated by a space is a parameter"

      y en el final del pdf hay un ejemplo que utiliza tanto el envio y recepción de datos. solo hay que añadirle el UM LCD y listo :) saludos (Chochos sigue leyendo XD)...

      Eliminar
  3. excelente post, es bastante util, deseaba preguntar: podrias hace un practica ilustrando esta vez la recepcion rx del uart, es decir no se poner este mismo ejemplo pero que el pc le diga al psoc no se "dato reccibido" o algo asi y mostrarlo en lcd. para asi ver el funcionamiento completo del psoc, tanto para enviar como para recibir información gracias

    ResponderEliminar
    Respuestas
    1. Hola, me encanta que te haya gustado el post, en cuanto a la pregunta, la verdad me parece muy interesante la propuesta de complementar el ejercicio con el envió por parte del pc y recepción por el PSoC, entonces en los pocos momentos que me queden libres voy a trabajar en ese ejemplo y cuando suba la publicación, entonces te aviso, sin embargo espero que sigas pendiente del Blog revisando los demás Post.

      Eliminar
  4. Muy buen blog, gracias por la información. Quería preguntarte donde puedo conseguir ese modulo para traducir usb a uart. Lo construiste vos o lo compraste hecho? Gracias.

    ResponderEliminar
    Respuestas
    1. Hola, gracias por el interés en el blog y me alegra que te haya gustado. En cuanto al modulo convertidor de UART a USB, es una tarjeta construida teniendo como base el Circuito integrado FT232, no es un circuito complicado, por lo tanto si lo quieres construir tu mismo no creo que tengas ninguna dificultad, pero también lo puedes comprar ya hecho y si estas en Colombia mas específicamente en Bogotá lo puedes comprar en Sigma electrónica.

      Si piensas construirlo y tienes dificultad en conseguir el diseño del circuito electrónico, me avisas y te colaboro con eso.

      Eliminar
    2. hola ivan, yo estaria muy interesado en construir mi propio modulo de usb a uart, no se si quizas me puedas colaborar con eso, muchas gracias !!

      Eliminar
    3. Hola Omar, por el momento te podría colaborar con un esquemático que tengo guardado desde hace algún tiempo, si te interesa envíame un mensaje al inbox de la página del blog en facebook para poder enviarte el esquemático por ese medio.

      Y gracias por visitar el Blog.

      Eliminar
  5. buenas noche muy buena informacion y excelente explicacion .....solo tengo una duda la libreria delay que aparece en el video donde la puedo encontrar ya que estoy montando el mismo ejemplo que usted hizo en el video pero me dice que no encuentra: cannot include source file "delay.h"; file not found, usted me podria hacer el favor y colaborarme con este problema

    ResponderEliminar
    Respuestas
    1. Buen día, muchas gracias por visitar el blog y me alegra que le haya gustado, en cuanto a su duda sobre las funciones de retardo le recomiendo que visite la entrada del blog del siguiente link, allí podrá encontrar la explicación sobre las funciones de retardo ademas de un enlace al sitio oficial de cypress en donde puede descargarlas.

      http://psocenespanol.blogspot.com/2012/03/uso-de-las-funciones-de-retardo.html

      Eliminar