Post on 18-Dec-2014
Conexión CDC mediante PIC18fx55x y LabView.
Jonatan I. Yam Cabrera. Jonatan.yam@gmail.com
Jonatan Yam Cabrera. Página 2
1. Emulación de puerto serie.
La emulación de un puerto serie RS232
mediante un microcontrolador PIC de la
familia 18Fxx5x de microchip, es una de las
maneras más rápidas y fáciles de realizar e
implementar, puesto que hoy en día existen
una gran cantidad de herramientas
dedicadas a estos microcontroladores que
se han vuelto tan populares. Solo basta con
un poco de conocimiento para el uso de
estas mismas para tener en un plazo muy
reducido de tiempo, un proyecto robusto y
confiable.
Para realizar un enlace en esta modalidad
se requiere, en un aspecto global solamente
de las siguientes tres cosas:
Circuito de desarrollo.
Compilador CCS y librerías..
Drivers CDC
1.1. Circuito de desarrollo.
No es necesario adquirir tarjetas de
desarrollo profesionales con costos elevados
para poder obtener resultados de calidad,
basta con invertir en un microcontrolador,
un par de dispositivos que complementen a
este y un buen diseño para estar a la par con
estas tarjetas de marca.
A continuación se muestra el esquema
básico, para lograr la comunicación usb con
el microcontrolador:
Como puede observarse, prácticamente
se requiere un conector usb y un capacitor
para lograr poner en funcionamiento el
microcontrolador. De este cirquito de partida
se puede ir agregando dispositivos que
cumplan con la necesidad en particular de su
aplicación.
1.2. Compilador CCS y librerías.
En esta aplicación se utilizó el
compilador PCW de CCS, que maneja
lenguaje de alto nivel basado en C, y en
conjunto con este, se requieren de los
siguientes archivos para la programación.
usb_cdc.h .- La cuál contiene las rutinas
necesarias para manejar las interrupciones,
la comunicación usb, los descriptores y todos
Jonatan Yam Cabrera. Página 3
los handlers necesarios para lograr
establecer la comunicación con la PC.
usb_desc_cdc.h .- Esta librería contiene los
descriptores CDC, que básicamente es el
archivo que indica a la PC como tiene que
configurar el dispositivo, y algunos datos
extras sobre el mismo, como la cantidad de
corriente que necesita, el nombre del
dispositivo, VID y PID entre otros.
Existen otros archivos relacionados con el
usb que se utilizan como el usb.h, pero sobre
los que tenemos que tener mucha atención
para personalizar nuestra aplicación son los
dos mencionados.
1.3. Drivers CDC.
Este modo de conexión requiere de un
driver para Windows, en su paquete USB
Framework v2.6a, Graphics Library v2.01,
MDD v1.2.5, TCPIP Stack v5.20b, mTouchCap
Library v1.01, el cual se puede descargar
directamente del fabricante microchip en:
www.microchip.com y Home Products
Home Page 16-bit PIC® MCUs & dsPIC®
Digital Signal Controllers
Una vez instalado en la ruta por defecto,
el driver CDC se localiza en la siguiente ruta:
C:\Microchip Solutions\USB Tools\USB CDC
Serial Demo\inf.
Este driver también lo incluye el CCS, en la
carpeta de drivers, sin embargo, saber de el
origen de este nunca está de más.
En esta librería se incluyen cientos de
ejemplos para todo tipo de
microcontroladores y los cuales pueden ser
un buen punto de partida.
2. Labview y funciones de conexión
para puerto serial.
LabView posee una serie de herramientas
para realizar una conexión mediante el
puerto serial, estas herramientas vienen en
un “toolbox” llamado VISA, que se pueden
obtener directamente de la web de National
Instruments en caso de no tenerlos
instalados previamente.
Si ya contamos con las herramientas VISA,
estas se localizan en el panel de funciones
en: Instrument I/O>>VISA>>Bus/Interface
Specific>>Serial.
Jonatan Yam Cabrera. Página 4
Estas herramientas nos van a permitir
realizar una conexión de la PC al
microcontrolador en cuestión de minutos. A
continuación ser enlistan las 4 principales
funciones:
Configuración del puerto.- Esta función
permite configurar los diferentes parámetros
del puerto serial como el baudrate, paridad,
control de flujo, bits de datos, carácter de
término etc.
Función de escritura.- Mediante esta
herramienta realizaremos envíos de datos a
través del puerto serial.
Función de lectura.- La herramienta
lectura nos permitirá adquirir datos de
dispositivos externos, en este caso el PIC.
Cerrar puerto.- Es importante cerrar los
puertos que ya no se estén utilizando, de lo
contrario, al solicitar una conexión por este,
será imposible por encontrarse en uso.
En el menú contextual de cada
herramienta, se puede encontrar la ayuda,
donde se especifican todos los detalles para
cada una, como el tipo de datos que soporta,
timeout, bytes esperados, entre otros.
3. Conexión básica PIC-Labview.
Empezaré por el lado del
microcontrolador, específicamente la parte
del firmware, que nos va a permitir realizar la
conexión.
La primero es la librería base del
microcontrolador que usaremos, en este
caso se usa un PIC182550 con un cristal de
4MHz.
#include <18F2550.h>
Inmediatamente se declaran los fusibles.
#fuses XTPLL,NOWDT,NOPROTECT,NOLVP
#fuses NODEBUG,USBDIV,PLL1,CPUDIV1
#fuses VREGEN,NOPBADEN
En caso de usar otro hardware, los
fusibles resaltados con negritas, son los de
mayor importancia, ya que la configuración
Jonatan Yam Cabrera. Página 5
de estos son vitales para el funcionamiento
del dispositivo.
Una vez definido el include del dispositivo
y los fusibles, se define la librería que
realizará todos los procesos necesarios para
establecer conexión con la PC.
#include <usb_cdc.h>
Ahora ya procedemos a la parte principal
del código en el que es muy importante usar
la siguiente instrucción antes que cualquier
otra relacionada con la comunicación USB, ya
que este permite la inicialización de los
procesos del USB:
Void main(void) {
usb_init();
}
Cuando ya hemos inicializado mediante
usb_init(), ya podremos hacer el uso de los
demás prototipos relacionados con la
comunicación como son los tres siguientes
usados para este ejemplo de conexión
básica:
usb_enumerated().- Que nos devuelve
True si el dispositivo ya se encuentra
enumerado por la PC o false en caso de no
estarlo.
usb_cdc_kbhit().- Nos indica si existen
datos en el buffer de entrada del
microcontrolador.
usb_cdc_getc().- Devuelve el carácter
(dato) que se encuentre en el buffer de
entrada.
Se pueden encontrar los demás
prototipos disponibles en la librería
usb_cdc.h con la respectiva descripción de
cada uno.
3.1. Recepción de datos enviados de la
PC en el microcontrolador.
Para el hardware del ejemplo se usa un
LED en el puerto RB0 del microcontrolador,
el cual se controlará mediante un dato
enviado por la PC de la siguiente manera:
Después de comprobar si el
microcontrolador ha sido enumerado, se
checa si existe algún dato en el buffer de
entrada; si es así, se lee el dato y se asigna a
una variable, la cual servirá para tomar la
decisión sobre el estado del led.
c=usb_cdc_getc();
if (c=='1') output_toggle(LED1);
En este ejemplo sucede que si el dato
(código ASCII) recibido por el
microcontrolador equivale al carácter “1” (49
decimal), cambia de estado el LED por medio
de la instrucción interna del compilador
output_toggle() que simplemente cambia el
estado actual, si esta en 1, se cambia a 0; si
estuviera en 0 a 1.
Jonatan Yam Cabrera. Página 6
3.2. Envío de datos desde el
microcontrolador a la PC.
Para realizar esta tarea, se utiliza en el
hardware, un push-button con resistencia
pull-up en el puerto AN1 para tener control
sobre esta acción y entender claramente
tanto el envío como recepción de datos.
Por el lado de la programación del
microcontrolador, la librería usb_cdc.h
cuenta con un par de funciones para el envió
de datos.
usb_cdc_putc().- Esta función es la que
nos permitirá realizar envío de caracteres
mediante el usb a la PC.
printf(usb_cdc_putc,string).-
Combinando la función printf() del
compilador con la propiedad usb_cdc_putc,
podemos enviar a través del usb, strings con
formato.
Para este ejemplo, se utiliza un bucle
while para detectar el cambio en el botón, y
cuando sucede este se envía un carácter
predefinido:
while (TRUE) {
….
if (input_STATE(PIN_A5)==0) {
delay_ms(500);
printf(usb_cdc_putc,"5\r");
}
Si el estado del push-button es “0”
(presionado, ya que esta con resistencia de
pull-up) se hace un pequeño delay para
evitar rebote y enviar datos demasiado
seguidos, y se envía el carácter “5” seguido
de un retorno de carro “/r” mediante la
función printf().
3.3. Envío y recepción de datos de
LabView al microcontrolador
Para realizar esta tarea implementaremos
las 3 funciones básicas en el labview,
resultando en un ejemplo de conexión muy
sencillo, sin embargo, será un buen punto de
partida para la elaboración de programas
más complejos.
Para empezar, abrimos el LabView y en la
pantalla principal selecionaremos “Blank VI”
(instrumento virtual en blanco o nuevo)
Vamos a trabajar primero en el “front
panel” (panel frontal), que es la parte visual
del LabView, en este panel podemos agregar
todos los controles que necesitamos para
nuestra aplicación en particular, como cajas
de texto, graficas, leds, formas, etc.
Todas estas herramientas visuales las
podemos encontrar en la “paleta de
Jonatan Yam Cabrera. Página 7
controles”, la cuál la podemos abrir desde el
menú “ver”.
Vamos a agregar al panel frontal los
siguientes elementos de la paleta de
controles, basta con hace un click sobre el
elemento en la paleta y luego hacer un click
sobre el panel frontal. Realicemos esto para
los siguientes elementos.
Visa Resource Name.- Este control nos va
a permitir seleccionar y detectar los puertos
COM disponibles en el sistema.
Numeric Control.- Este tipo de control
permite ingresar datos numéricos en sus
diferentes formatos a nuestro programa,
pueden ser enteros con o sin signo, de punto
flotante, etc.
Agregar 2 de estos controles a los cuales
llamaremos: Baudios y Bits de datos.
A cada control agregado al panel frontal,
le indicaremos el tipo de dato que este
control va a manejar. Con el botón derecho
sobre el elemento para ver el menú
contextual seleccionamos: representation y
U16 para bits de datos y U32 para baudios.
Text Ring: Nos permite seleccionar un
valor predeterminado en texto el cuál será
remplazado por un dato numérico.
Jonatan Yam Cabrera. Página 8
Agregar controles de este tipo y llamarlos,
Paridad, Bits de parada y Control de flujo.
De forma similar como se estableció el
tipo de valor para los controles numéricos,
vamos a establecer los valores para el
control ring. Haciendo click con el botón
derecho del mouse sobre elemento que
renombramos como “Paridad” desplegamos
el menú contextual; seleccionamos Edit
Items.
En la ventana de elementos marcar la
casilla de “Sequential Values” e ingresar los
siguientes datos: None, Odd, Even, Mark y
Space.
Para ingresar datos se puede hacer doble-
click sobre la casilla “ítems” o con el botón
“Insert”, al tener marcada la casilla de
“Sequential Values” los valores de cada
elemento se establecerán de manera
automática empezando de 0 e
incrementándose como se muestra en la
figura.
Para los dos controles “ring” restantes,
realizar el mismo proceso, pero agregando
los siguientes elementos.
Bits de parada.- Para este control no
utilizaremos valores secuenciales por lo cuál
se tiene que desmarcar la casilla “Secuential
Values” y agregar estos datos:
Item Value
1.0 10
Jonatan Yam Cabrera. Página 9
1.5 15
2.0 20
Control de flujo.- Para este control
tampoco usaremos valores secuenciales por
lo cual se necesita desmarcar la casilla antes
mencionada y agregar los datos siguientes:
Para los tres controles “ring” seleccionar
U16 como tipo de representación.
String control.- Mediante este control
podremos ingresar cadenas de texto a
nuestro programa, en este ejemplo en
particular lo utilizaremos para enviar un
carácter al microcontrolador.
String indicator.- Con esta herramientra
podremos desplegar texto en la interface de
nuestro programa
Por último se recomienda ordenar todos
los elementos agregados al panel frontal de
la siguiente forma:
Item Value
None 0
XON/XOFF 1
RTS/CTS 2
DTR/DSR 4
Jonatan Yam Cabrera. Página 10
Ahora vamos a trabajar la programación
de nuestra interface, para esto nos
cambiamos al diagrama de bloques con las
teclas de acceso rápido CTRL+E o en la barra
de menus Window>Show Block Diagram.
Y en el diagrama a bloques podremos ver
los elementos agregados en el panel frontal,
quizá de una manera desordenada, para este
ejemplo ordenarlos como se muestra en la
figura.
En caso de ver estos iconos:
podemos cambiar a la vista alternativa
haciendo click con el botón derecho del
mouse y en el menú contextual desmarcar
“View as icon”:
Ahora vamos a agregar los cuatro bloques
de conexión VISA mencionados
anteriormente. Para ver la paleta de
funciones vamos al menú View>Functions
Palette.
Ordenamos los elementos de la siguiente
manera:
Para recibir caracteres o cadenas, la
función de “Read” necesita saber cuántos
caracteres va a leer, para esto existen los
nodos de propiedades en el LabView, pero
Jonatan Yam Cabrera. Página 11
en este ejemplo lo realizaremos de la forma
mas simple, con una constante numérica con
el valor de datos a recibir, que será uno.
Para agregar la constante se realiza el
mismo proceso que para agregar elementos
en el panel frontal, pero con las
herramientas de la paleta de funciones
(functions pallete).
Para evitar el valor por defecto de la
constante, hacemos doble-click sobre esta
introducimos el valor “1”. Modificar su
representación (tipo de dato) a U32
Al fin de todo este proceso debemos
tener nuestro diagrama de bloques de la
siguiente manera:
Al posicionar el puntero del mouse sobre
una función, esta nos va a desplegar las
terminales para sus posibles entradas y
salidas de datos, en el caso de configuración
de puerto serial VISA nos despliega estas
terminales:
Si posicionamos el puntero sobre el punto
de color de cada terminal, el puntero cambia
a un carrete de cable y nos despliega el
nombre de la terminal. Si hacemos un click
sobre este con el carrete, se conectara un
hilo el cuál podremos enlazar a otras
funciones o controles.
Jonatan Yam Cabrera. Página 12
Entonces vamos a proceder a enlazar
cada herramienta agregada en el panel
frontal a las funciones VISA, teniendo mucho
cuidado de conectar cada elemento
adecuadamente a la terminal que pertenece.
Las siguiente imagen presenta el cableado
a realizar y obtener al fin del proceso:
Con esta aplicación podremos seleccionar
y configurar un puerto COM (Serie), asi
como enviar y recibir un carácter de
LabView al microcontrolador a través del
mismo.
4. Realizando la conexión.
Una vez descargado el .hex al micro y la
aplicación de LabView lista, seguiremos los
siguientes pasos para establecer la conexión
serial entre el PIC y LabView:
1.- Conectar el micro a la PC y en
“Dispositivos e Impresoras” (para Windows
7) o en “Administrador de dispositivos”
(Windows 7 y anteriores), identificar si el
dispositivo ha sido reconocido y enumerado
satisfactoriamente.
Como se aprecia en la imagen el ícono no
presenta ningún aviso de advertencia de
error de conexión.
En el administrador de dispositivos
podemos observar la categoría Puertos COM
y LPT nuestro dispositivo asignado con el
nombre de COM4. El número de COM puede
variar dependiendo del conector usb de la PC
donde se haya hecho la conexión.
Jonatan Yam Cabrera. Página 13
2.- Configurar los parámetros de
operación del puerto COM virtual en
LabView. Esto lo haremos con la interface
gráfica creada previamente. Los siguientes
valores son parámetros estándar y más
comunes para el puerto serial, sin embargo
se puede experimentar con estas
configuraciones.
El control VISA RESOURCE NAME, nos va a
desplegar todos los dispositivos COM
enumerados en la PC, por tal motivo es
indispensable saber el número asignado al
puerto por la PC para elegir la opción
apropiada.
En el cajón de texto escribiremos el
número “1”, este será el que se envíe al PIC y
realice la operación de prender o apagar el
LED.
Para correr el programa utilizaremos los
siguientes controles en la barra de
herramientas.
Esta barra provee dos controles para
correr los programas, el primero que es
correr el programa una sola vez y correr el
programa continuamente. Para nuestra
aplicación utilizaremos el de correr una sola
vez.
3.- Click en “Run” (Correr una sola vez), el
programa entonces enviará el carácter “1” al
PIC y pasará a esperar el dato a recibir por
parte del PIC, el programa detendrá su flujo
hasta recibir el dato o hasta agotar el
“timeout” de la función VISA de leer datos
del puerto serial. Para que el PIC envíe el
dato presionamos el push-button colocado
en el puerto A5 como se explico
anteriormente.
En la indicador de texto “Recibir”
podemos ver el dato que envío el
microcontrolador.
Jonatan Yam Cabrera. Página 14
Y con esto habremos realizado la
conexión CDC en su forma más simple
mediante LabView y el microcontrolador
PIC18F2550.
Es muy recomendable experimentar con
lo que se ocurra al momento de la conexión
para irse familiarizando con los errores con
los que nos podríamos topar, así como para
ir implementando funciones más complejas
para aplicaciones propias.
Jonatan Yam Cabrera. Página 15
Esta obra está bajo una licencia Attribution-NonCommercial-ShareAlike 3.0 Unported de
Creative Commons. Para ver una copia de esta licencia, visite
http://creativecommons.org/licenses/by-nc-sa/3.0/ o envie una carta a Creative Commons, 171
Second Street, Suite 300, San Francisco, California 94105, USA.