CHAPTER III. TEXTURAL STUDIES 39
3.1 Introduction 40
Para la programación de la aplicación en el PIC se hizo un estudio del módulo de USB correspondiente al PIC18F2550 y un análisis de los principales compiladores más utilizados en el mundo para la programación de tales fines. (Márquez, 2008) Después de investigar en la red cual era más utilizado, se llego a la conclusión de que se trabaja con compiladores en C para PICs ya que en ensamblador la configuración del módulo USB se torna muy compleja. Algunos de los compiladores en C más usados son:
• CCS
• MikroC
• C18
• HI-TECH
Estos compiladores son factibles para la programación de PIC ya que tienen gran cantidad de funciones implementadas. Cada uno tiene sus ventajas y sus desventajas. Pero para el uso de las funciones de USB el más utilizado es el CCS
compiler. (Nuñez, 2005, Márquez, 2008)
Hay dos géneros de compiladores de C CCS: el compilador command-line (PWB,
PCM, PCH y PCD) y el Windows IDE (PCW, PCWH, PCWHD y PCDIDE). Ver
características el la figura 3.1. Las capacidades del compilador IDE incluyen muchas utilidades para ayudar en el diseño y edición del programa. (Services, 2007)
Figura 3.1. Características de los compiladores.
Reuniendo las características requeridas para satisfacer las necesidades vigentes, se utilizó el CCS PCWH versión 4.033.
Además se utilizaron los plug-in para el MPLAB disponibles en:
http://www.ccsinfo.com/downloads.php
3.1.2 Aplicación en el PIC.
Lo que se pretende en este proyecto es implementar una comunicación bidireccional masiva, bulk transfers, entre el PIC y el software del PC vía USB 2.0
a full speed. Se desarrollará una aplicación que sirva de base para la
implementación de otras más complejas.
Cuando se conecte el PIC a la PC un led rojo se encenderá y después que ya esté configurado (Windows debe tener su driver instalado), entonces se apagará el rojo
y se encenderá el verde. En la aplicación se recibirán de la PC una cantidad de datos indeterminada (las que envíe la PC) y se guardarán en la memoria de datos
a partir la posición especificada. Y si se habilita, eso datos pueden ser escritos en la memoria flash. Además el PIC enviará un paquete de 64 bytes a la PC. (Hyde,
2007, Peacock, 2007a) PicUSB.c #include <18F2550.h> #fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV, PLL3,CPUDIV1,VREGEN #use delay(clock=12000000)
#define USB_HID_DEVICE FALSE
#define USB_EP1_TX_ENABLE USB_ENABLE_BULK #define USB_EP1_RX_ENABLE USB_ENABLE_
#define USB_EP1_TX_SIZE 64 #define USB_EP1_RX_SIZE 64
#include <pic18_usb.h> #include <PicUSB.h> #include <usb.c> #define LEDV PIN_A0 #define LEDR PIN_A1 #define LED_ON output_high #define LED_OFF output_low void main(void)
{
int8 datos[112]; int8 recibe[784];
LED_ON(LEDR);
usb_init(); //inicializamos el USB
usb_task(); //habilita periférico usb e interrupciones
usb_wait_for_enumeration(); // cuando sea configurado por el Host LED_OFF(LEDR);
LED_ON(LEDV); //encendemos led verde. while (TRUE)
{
if(usb_enumerated()) //si el PicUSB está configurado {
if (usb_kbhit(1)) //si el endpoint de salida contiene datos del Host
{ // usb_get_packet(1, recibe, 64); usb_gets(1,recibe,4096,1000); usb_put_packet(1,recibe, 64, USB_DTS_TOGGLE); // usb_puts(1,recibe,4096,1000); // write_program_memory(0x1800,recibe,64); // read_program_memory(0x0200,datos,8); } } } }
En el fichero PicUSB.h seincluirán las estructuras y parámetros necesarios para una correcta conexión con el driver del PC, los descriptores. ( ver anexo IV)
3.1.3 Funciones del C CCS para USB.
La frecuencia de oscilación necesaria para el USB 2.0 es de 48 Mhz. Como se utilizará en el hardware un cristal de cuarzo de 12 Mhz se necesita hacer uso del
módulo PLL interno del PIC. Para ello se utilizará el fuse HSPLL. Como el módulo
PLL requiere una oscilación de entrada de 4 Mhz se deberá habilitar el divisor 1:3 indicado con el fuse PLL3 para obtener los 12:3 = 4 Mhz requeridos. (Márquez, 2007, Microchip, 2004)
Para activar el método de transferencia masiva (bulk transfer) mediante el USB
debemos configurar los endpoint de transmisión y recepción, USB_EP1_TX_ENABLE y USB_EP1_RX_ENABLE, indicándolo con la constante USB_ENABLE_BULK. Es imprescindible deshabilitar el método HID (Human Interface Device).
El tamaño del buffer de transferencia se puede ajustar desde 1 a 64 bytes como
máximo. (Recordar que si se utiliza un dispositivo USB low-speed el máximo
tamaño del buffer es de 8 bytes).
Las funciones usb_init(), usb_task(), usb_wait_for_enumeration(), usb_enumerated(), usb_kbhit(), usb_get_packet(), usb_put_packet(), usb_gets() y usb_puts están desarrolladas en el driver que nos proporciona CCS C para el
manejo del USB 2.0 y vienen definidas e implementadas en los includes pic18_usb.h, usb.c y usb.h que se encuentra en el directorio ...\Drivers de la
instalación de CCS C. (Services, 2007)
Las funciones usb_init(), usb_task() y usb_wait_for_enumeration() se utilizan solo
para establecer la comunicación y se ejecutan únicamente tras un reset del micro.
Si todo ha sido satisfactorio, y ya dentro del ciclo infinito while(true), solo se
actuará si la función usb_enumerated() devuelve verdadero, o sea que se está
correctamente conectado y reconocido por el Windows del PC.
A partir de este punto solo queda esperar a recibir un comando proveniente del PC. Esto se detectará con usb_kbhit() que al devolver verdadero indicará que
existe algo pendiente que recibir, lo cual se recogerá con usb_get_packet() o usb_gets(). (Márquez, 2007)
La función usb_gets_packet() es utilizada para tomar como máximo un paquete de
datos, pero si se necesita recibir más de un paquete se usará la función
usb_gets(). Para enviar datos hacía la PC se puede utilizar las funciones usb_put_packet() o usb_puts() para uno o varios paquetes.
Para escribir o leer en la memoria flash del PIC se debe hacer uso de las
funciones write_program_memory() y read_program_memory() respectivamente.
(Services, 2007)