Aqui les va un resumen de mis primeros pasos con la comunicacion del pic 18F2550 y la PC por USB(HID) si me equivoco en algo les agradeceria que me corrigieran.
Requerimientos :
Compilador CCS
Programa(HOST) en windows que pueda abrir una conexion a un VendorID,ProductID
Descripcion :
Enviar un "hola" cada 500 ms y pueda ser recibido por un programa en windows
Para empezar el compilador CCS ya trae la mayor parte del trabajo echo solo hay que modificar ciertos parametros muy puntualmente para que funcione, elegi HID en vez de CDC por que no quiero ninguna instalacion de drivers en especifico para emular un puerto Serial, por que cuando uno compra un mouse usb solo lo conecta y listo no tiene que instalar ningun driver ademas creo que con HID se obtiene mas velocidad de transmision.
Saquemos una copia del archivo usb_desc_hid.h que esta en el directorio de drivers alli tendremos que modificar varias cosas primero aqui en
const char USB_CLASS_SPECIFIC_DESC[]
las 2 lineas que dicen cambiar el 2 por la cantidad de bytes a enviar o recibir en cada envio
en este caso como hola tiene 4 caracteres ponemos 4 en vez del 2
0x95, 2, // Report count = 16 bits (2 bytes)
en
const char USB_DEVICE_DESC[USB_DESC_DEVICE_LEN] ={
0x61,0x04, //vendor id (0x04D8 is Microchip, or is it 0x0461 ??)
0x20,0x00, //product id ==11,12 //don't use ffff says usb-by-example guy. oops
cambiar o dejar asi las lineas esto nos servira para que desde la compu nos comuniquemos con el dispositivo
aqui ira el nombre con el que windows detectara el dispositivo
char const USB_STRING_DESC[]={
con estos simples cambios ya nos podremos dedicar al programa principal aqui se los pongo con sus respectivas descripciones
Requerimientos :
Compilador CCS
Programa(HOST) en windows que pueda abrir una conexion a un VendorID,ProductID
Descripcion :
Enviar un "hola" cada 500 ms y pueda ser recibido por un programa en windows
Para empezar el compilador CCS ya trae la mayor parte del trabajo echo solo hay que modificar ciertos parametros muy puntualmente para que funcione, elegi HID en vez de CDC por que no quiero ninguna instalacion de drivers en especifico para emular un puerto Serial, por que cuando uno compra un mouse usb solo lo conecta y listo no tiene que instalar ningun driver ademas creo que con HID se obtiene mas velocidad de transmision.
Saquemos una copia del archivo usb_desc_hid.h que esta en el directorio de drivers alli tendremos que modificar varias cosas primero aqui en
const char USB_CLASS_SPECIFIC_DESC[]
las 2 lineas que dicen cambiar el 2 por la cantidad de bytes a enviar o recibir en cada envio
en este caso como hola tiene 4 caracteres ponemos 4 en vez del 2
0x95, 2, // Report count = 16 bits (2 bytes)
en
const char USB_DEVICE_DESC[USB_DESC_DEVICE_LEN] ={
0x61,0x04, //vendor id (0x04D8 is Microchip, or is it 0x0461 ??)
0x20,0x00, //product id ==11,12 //don't use ffff says usb-by-example guy. oops
cambiar o dejar asi las lineas esto nos servira para que desde la compu nos comuniquemos con el dispositivo
aqui ira el nombre con el que windows detectara el dispositivo
char const USB_STRING_DESC[]={
con estos simples cambios ya nos podremos dedicar al programa principal aqui se los pongo con sus respectivas descripciones
Código:
#include <18f2550.h> //archivo de cabecera
#fuses HSPLL,MCLR,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,NOVREGEN,NOPBADEN // fuses configurados
#use delay(clock=48000000) // el clock que tendremos a la entrada del CPU compatible con USB 2.0
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7, BITS=8) //para debuguear las salidas del printf,puts etc.
#DEFINE USB_HID_DEVICE TRUE // Si usar HID
//Habilitar la Transferencia
#define USB_EP1_TX_ENABLE USB_ENABLE_INTERRUPT //Activa el punto final 1 para transferencias por bloque
#define USB_EP1_TX_SIZE 8 //8 bytes para envio
//Habilitar la Recepcion
#define USB_EP1_RX_ENABLE USB_ENABLE_INTERRUPT //Activa el punto final 1 para recepcion por bloque
#define USB_EP1_RX_SIZE 8 //8 bytes para recepcion
#include <pic18_usb.h> //Funciones de bajo nivel(hardware) para la serie PIC 18Fxx5x que serviran en usb.c
#include <usb_desc_hid.h> //Aqui es donde van las descripciones de este dispositivo (como lo reconocera windows)
#include <usb.c> //libreria para el manejo del usb
//funciones en pic18_usb.h
//Posibles estados del USB
// USB_STATE_DETACHED=0, USB_STATE_ATTACHED=1, USB_STATE_POWERED=2, USB_STATE_DEFAULT=3,
// USB_STATE_ADDRESS=4, USB_STATE_CONFIGURED=5
//usb_init()
// se desconecta usando usb_init_cs y luego entra en un ciclo infinito monitoriado por
// usb_task hasta que el estado del usb sea POWERED
//usb_init_cs()
// es un alias de usb_detach()
//usb_put_packet()
// envia un paquete al HOST
//usb_kbhit()
// devuelve TRUE si hay datos enviados por HOST(PC)
//usb_rx_packet_size()
// devuelve el tamano del paquete enviado por el HOST(PC)
//usb_get_packet()
// realiza la recepcion de la informacion enviada por el HOST(PC)
//usb_detach()
// Se Desconecta y se pone en estado DETACHED
//usb_attach()
// Se Conecta
//usb_attached()
// Para dispositivos que no tienen este pin simpre devuelve TRUE como el 18F2550
// devuelve TRUE si USB_CON_SENSE_PIN = TRUE el pin que indica si esta conectado o no
//usb_task()
// Monitorea el estado de la coneccion conectandose y desconectandose automaticamente
//funciones en usb.c necesita de la libreria de hardware
//usb_enumerated()
// devuelve TRUE si el HOST(PC) ya enumero el dispositivo o sea si windows ya lo detecto
//usb_wait_for_enumeration()
// espera infinitamente hasta que el dispositivo fue enumerado
//usb_kbhit()
// devuelve TRUE si hay datos enviados por HOST(PC)
//usb_puts()
// como el puts serial solo que este es USB usa la funcion put packet
//usb_gets()
// como el gets serial solo que este es USB usa la funcion get packet
void main() {
int8 out_data[20];
int8 in_data[2];
int8 send_timer=0;
int8 contador=0;
char Mensaje[4]={'H','O','L','A'};
setup_adc_ports(NO_ANALOGS); // desactivando puertos analogicos
set_tris_b(0x0); // configurando los puertos como salidas
output_b (0); // saca un nivel bajo de salida en los puertos
usb_init(); //inicializa y espera a ser encendido
output_high(PIN_B0);
usb_wait_for_enumeration(); //ahora espera hasta ser enumerado (reconocido por la PC)
output_high(PIN_B1);
while(TRUE){
usb_puts(1,Mensaje,4,100);
delay_ms(500);
}
}