sábado, 17 de marzo de 2012

comunicacion PIC por USB CDC y VB 2010

Clases en USB:
USB maneja muchas clases, como por ejemplo, audio, almacenamiento masivo, HID (Human Interface Device) dispositivo de interfaz humana, de comunicación, etc
Tipos de Transferencias:
Isochronus----permite mover grandes cantidades de datos con el tiempo de entrega asegurado pero no garantiza la integridad de los datos. Se usa por ejemplo en audio y video donde la perdida de pequeñas porciones de datos no son criticas ya que es el único tipo que no soporta retranmision automática de datos recibidos con errores. No regresa un handshake.
Bulk---------impresoras y los puertos COM virtuales lo usan, permite mover grandes cantidades de datos asegurando la integridad de estos, la desventaja es que no asegura el tiempo de entrega de los paquetes. Regresa un paquete Handshake, que contiene el código que indica el éxito o fracaso de la transacción.
Interrupt---se usa en HID, porque entrega los paquetes muy rápido (paquetes pequeños) por ejemplo en un raton o teclado usb no notas que tarda nada o que se retrase cuando escribes o mueves el raton. La desdentaja aquí es que no tiene corrección de errores. Regresa un paquete Handshake, que contiene el código que indica el éxito o fracaso de la transacción.
Control-----transporta las solicitudes estardar que hace un host para saber como instalar cada dispositivo. Todos los dispositivos deben soportar este tipo, y usa el pipe default y el endpoint cero, solo se necesita 1 endpoint para control a si que tener mas de uno es innecesario. Al necesitar enviar datos en ambas direcciones usa un IN y un OUT endopoint.

CDC es una clase que se encuentra dentro del protocolo USB,  CDC (communications device class) o clase para comunicación de dispositivos, abarca un gran rango de dispositivos incluyendo terminales ISDN, puertos COM virtuales, etc.
Cada dispositivo debe tener un archivo .INF que contiene el Vendor ID y Product ID. Un puerto COM virtual usa el driver usbser.sys, para conectarse.
Un dispositivo de comunicación debe tener en su descriptor bInterface-Class = 0Ah para indicar que es una interface de datos, y para CCS está en usb_desc_cdc.h:
 //interface descriptor 1 (data class interface)
         USB_DESC_INTERFACE_LEN, //length of descriptor      =44
         USB_DESC_INTERFACE_TYPE, //constant INTERFACE (INTERFACE 0x04)       =45
         0x01, //number defining this interface (IF we had more than one interface)    ==46
         0x00, //alternate setting     ==47
         2, //number of endpoints   ==48
         0x0A, //class code, 0A = Data Interface Class     ==49
         0x00, //subclass code      ==50
         0x00, //protocol code      ==51
         0x00, //index of string descriptor for interface      ==52
Un Puerto virtual emula un Puerto serial y las aplicaciones pueden usar ese Puerto para comunicarse como si estuvieran usando un puerto RS-232.
Esto fue un poco de datos técnicos, pero no me meteré tanto en eso, aquí solo explicare como hacer un enlace, si necesita más información técnica, consulte el libro:

USB Complete: The Developer’s Guide, Fourth Edition     NOTA::: checar comentarios del blog
by Jan Axelson

El VID y el PID que se encuentran dentro del mchpcdc (host), y el de la librería usb_desc_cdc deben de coincidir

#include "usb_cdc.h"-------esta llamada invoca la librería que incluye instrucciones de control para la comunicación, y dentro de esta se llama a usb_desc_cdc, que es en la que se encuentra  el VID y PID a sique dentro del código basta con llamar a esta.
#fuses XTPLL,…..,PLL1, -------aqui declare que usare un crystal (yo use de 4 MHz) y PLL1 indica que no usare el divisor Phase Locked Loop, este divisor se usa por ejemplo  si usaramos un cristal de 20MHz, tendríamos que usar PLL5 ya que 20 entre 5 = 4,,,,, y el PLL divisor solo acepta 4 MHz,,,, es por esto que tendríamos que dividir.
El PLL acepta 4 MHz  y entrega 96 MHz que luego divide entre 2 para obtener 48 MHz que son los que se necesitan en USB.

Dentro del PIC:::::::::
USB  dentro del PIC se maneja mediante una cosa llamada table descriptor o tabla de descriptores, esta tabla se ubica en el banco 4, se supone que todo el banco 4( desde 400h hasta 4ffh) debería estar llena de descriptores pero si no ocupas muchos descriptores puedes usar lo que te sobre de espacio para almacenar datos.


Y como saber cuales esta ocupados y cuales no en el banco 4????
USB indica como obligatorio un endpoint 0 para datos de control ( uno para entrada y otro para salida) y asi que en ese endpoint 0 se ocupan los primeros 8 bytes  del banco 4.
Porque 8 bytes?????
Un buffer descriptor es asi::::

Como ven son 4 bytes:
STAT---- se usa para conocer el estado del buffer
CNT---- indica el tamaño del buffer
ADRL Y ADRH, se concatenan ( unen) para formar la dirección de inicio del buffer que apunta a otra dirección entre el banco 5 a 7 (o 4 si nos sobra espacio) en el ejemplo apunta a la dirección 0500h, que seria el inicio del banco 5, asique ese buffer empezaría ahi,,, como es obvio ya no necesitamos la dirección de fin del buffer ya que con el tamaño de CNT, nos damos cuenta en donde termina.
Biennnn, esto es un buffer descriptor y cada uno ocupa 4 bytes.
Y la tabla de descriptores (banco 4) estaría llena de estos, lo cual nos indicaría donde están los datos de donde se guardan cuando llegan al PIC.
Y esto para que nos sirve???
if(usb_cdc_kbhit()){------ línea de código del pic. Kbhit, es el que va a checar si dentro de la tabla hay un buffer con datos y regresa a decirle al PIC si hay datos o no.
BIEN, ahora si por ejemplo solo usamos un endpoint de 64 KB, podemos declarar su buffer descriptor dentro del banco 4 y aun declarar su byte de inicio dentro del mismo banco 4.
Esto es un problema dentro de los lenguajes de alto nivel ya que asumen que usaremos todo el banco 4 para descriptores.

AHORA, la aplicación para comunicación dentro de host (computadora) la hice en Visual Basic 2010, aunque bastaría con la hyperterminal o en que trae ccs pero bueno eso ya es decisión de cada uno, y lo que haces es simplemente enviar texto como ASCII, en mi caso al único puerto COM virtual que crea el PIC, ya que mi LAP no cuenta con puerto serial.
La compilación se puede hacer desde el mismo PCW o desde MPLAB, es cuestión de comodidad en el entorno de programación.

CCS

EN MPLAB

CONECTANDO EL PIC
Al conectar el PIC, nos pedirá instalar el driver adecuado ya que Windows no encontrara el adecuado, y lo direccionaremos al mchpcdc, para que pueda instalar el nuevo dispositivo.









AL TERMINAR DE INSTALAR EN CONTROLADOR
ya la PC reconoce que tenemoxs un nuevo puerto COM


ENVIANDO DATOS


EL CODIGO EN VISUAL BASIC 2010 .NET FRAMEWORK 4

link 30 agosto 2013

aqui puse todos los codigos:

http://adf.ly/UumFJ

y aqui el libro:

http://adf.ly/UuyCl

y otros cuantos que tambien ayudan:
http://adf.ly/Uv0AA

este si leanlo porque de aqui sale casi todo


http://adf.ly/V1eCM

http://adf.ly/V1fdU




ire subiendo mas,,,