Control de dispositivos a través del módulo USB del PIC18F45/2550

Hola:
Ya he probado a hacerlo sin antivirus y me da el mismo error.
Meta , tu manual ya lo tenía guardado y lo había seguido antes al pie de la letra para la instalación,
aunque no tienes muchas opciones a equivocarte.
Voy a dejarlo por hoy y otro día con la cabeza fresca o con un mazo en la mano lo intentaré.
Gracias
 
¡Hola a todos!. Leí varios de los post que hablan del tema PIC USB y no veo que nadie tenga problemas con la comunicación USB- PC o al menos no el que tengo yo. Espero que me puedan ayudar.
El código es el siguiente:
Código:
#include <18F4550.h>
#device adc=8

#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL3,CPUDIV1,VREGEN
#use delay(clock=48000000)

#define USB_HID_DEVICE     FALSE            //deshabilitamos el uso de las directivas HID
#define USB_EP1_TX_ENABLE  USB_ENABLE_BULK   //turn on EP1(EndPoint1) for IN bulk/interrupt transfers
#define USB_EP1_RX_ENABLE  USB_ENABLE_BULK   //turn on EP1(EndPoint1) for OUT bulk/interrupt transfers
#define USB_EP1_TX_SIZE   64                 //size to allocate for the tx endpoint 1 buffer
#define USB_EP1_RX_SIZE    8                 //size to allocate for the rx endpoint 1 buffer

//#define USB_CON_SENSE_PIN PIN_A0

#include <pic18_usb.h>     //Microchip PIC18Fxx5x Hardware layer for CCS's PIC USB driver
#include <usb_desc_scope.h> //Descriptores usb
#include <usb.c>           //handles usb setup tokens and get descriptor reports

#define LEDV    PIN_B6
#define LEDR    PIN_B5
#define LED_ON  output_high
#define LED_OFF output_low

void main()
{
enable_interrupts(GLOBAL);
enable_interrupts(INT_USB);
//Setup_Oscillator parameter not selected from Intr Oscillator Config tab
   
   LED_OFF(LEDR);
   LED_ON(LEDV);                    //encendemos led verde 
   delay_ms(500);
   LED_OFF(LEDV);                   //encendemos led rojo
   LED_ON(LEDR);
  
   usb_init();                      //inicializamos el USB
      
   usb_task();                      //habilita periferico usb e interrupciones
    
   usb_wait_for_enumeration();      //esperamos hasta que el PicUSB sea configurado por el host

   LED_ON(LEDR);
   LED_ON(LEDV);                    //encendemos led verde 

}
Por el momento lo único que quiero es poder configurar el pic en la pc y luego aumentar la complejidad. Compila perfectamente (PCWHD versión 4.078) luego lo simulo y hago el debug con ISIS de PROTEUS (aunque también programe el pic con los mismos resultados ) y la el pic no envía los datos para que el mismo sea configurado por la PC. Creo que se debe a un problema con las interrupciones ya que cuando realizo el debug las variable UCON, UIR , UIE etc del SFR se mantienen constantes en =0xFF ,
Para la simulación utilizo Un crital de 12MHz, un cap de 470n en Vusb como lo más relevante .
Si alguien tuvo el mismo problema y lo soluciono, por favor me diga cómo solucionarlo.
 
Gracias por el consejo, pero no creo que ese sea el problema pus lo conecto basandome en la hoja de datos del pic
ademas se planta en este bucle de usb.c

void usb_wait_for_enumeration(void) {
while (USB_stack_status.curr_config == 0) {restart_wdt();}
}

osea que ya detecto que hay una conexion. Estoy pensando que tal vez sea el compilador(ver 4.074) otra cosa no se me ocurre.

¿Alguna otra sugerencia que puedan hacerme para chequear? desde ya Muchas Gracias
 
Saludos compañeros.

Quisiera saber si ustedes saben como recibir desde el PIC no solo caracteres sino un valor entero de 8 bits (0-255), no sé si sea con el usb_cdc_getc() o haya otro comando. Les agradecería cualquier ayuda que me puedan brindar. Saludos!
 
Hola Que tal?......estoy realizando un proyecto con el PIC 18F4550 y programando con CCS........estoy atascado con el comando printf(usb_cdc_putc, "xxxxx", yyyyy)
mi problema esta en que no se como enviar el dato yyyyy, es decir en que formato lo tengo que enviar para que el terminal me reconozca el dato como un numero......por ejemplo tengo dato=1, y quiero mandar dato para que en la pantalla del computador me aparezca "1".......tengo que sumarle 47 para que lo mande como ASCii.........?gracias
 
hola a todos la verdad esto de hacer una comunicacion usb se la ve muy interesante me estoy iniciando tan solo en el mundo de los microcontroladores y quisiera provar los ejemplos que puso moyano pero no entiendo eso de el compilador c ccs donde lo puedo conseguir.... hasta ahora estoy aprendiendo a programar en Microcode studio pero si me ayudaria se me pudieran guiar para poder aprender un lenguaje de alto nivel me han comentado que es mas facil que programar en assembler...muchas gracias por la mano que me puedan hechar...me olvidava me pueden para un link para descargar lo del complidador y el leguaje que me pueda ayudar a iniciarme en esto de programacion
 
matquin:
Hola como estás

Mirá te dejo un programa guía que uso yo y no me ha dado mayores problemas.
Código:
// Programa de ejemplo USB Bulk transfer.
// Detección y envio de 1 dato y recepción de un dato.
// Programador: Moyano Jonathan.

#include <18F2550.h>
#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN
#use delay(clock=48000000)
// Usamos un cristal de 20Mhz con un factor de división de 5 para obtener 4Mhz en la entrada del PLL.

#define USB_HID_DEVICE     FALSE             //deshabilitamos el uso de las directivas HID.
#define USB_EP1_TX_ENABLE  USB_ENABLE_BULK   //turn on EP1(EndPoint1) for IN bulk/interrupt transfers.
#define USB_EP1_RX_ENABLE  USB_ENABLE_BULK   //turn on EP1(EndPoint1) for OUT bulk/interrupt transfers.
#define USB_EP1_TX_SIZE    1                 //size to allocate for the tx endpoint 1 buffer.
#define USB_EP1_RX_SIZE    1                 //size to allocate for the rx endpoint 1 buffer.

#include <pic18_usb.h>       // Microchip PIC18Fxx5x Hardware layer for CCS's PIC USB driver.
#include "usb_desc_scope.h"  // Configuración del USB.
#include <usb.c>             // handles usb setup tokens and get descriptor reports.

#use fast_io(b) // Hay que configurar manualmente el trisb.

void main(void) {

   int8 recibe[1];                  //declaramos variables.
   int8 envia[1];
   int8 valor;
   
   set_tris_b(0x00); //Todo salidas
   set_tris_a(0xff); //Todo entradas
   output_b(0x00);
   
   output_low(PIN_B7); //Apaga led para indicar que no ha sido detectado por pc
   
   usb_init();                      //inicializamos el USB
   usb_task();                      //habilita periferico usb e interrupciones
   usb_wait_for_enumeration();      //esperamos hasta que el PicUSB sea configurado por el host
   output_high(PIN_B7);            //Ya fue detectado por PC
   while (1)
   {
      if(usb_enumerated())          //si el USB está configurado.
      {
         if (usb_kbhit(1))          //si el endpoint de salida contiene datos del host.
         {
            usb_get_packet(1, recibe, 2);
            valor = recibe[0]; 
            envia[0]= valor; // Hace eco de lo que recibe.
               usb_put_packet(1, envia, 1, USB_DTS_TOGGLE);
               }
         }
      }
   }
}

y los descriptores:

Código:
///////////////////////////////////////////////////////////////////////////
////                         usb_desc_scope.h                          ////
////                                                                   ////
//// An example set of device / configuration descriptors for use with ////
//// the USB Bulk demo (see ex_usb_scope.c)                            ////
////                                                                   ////
///////////////////////////////////////////////////////////////////////////
////                                                                   ////
//// Version History:                                                  ////
////                                                                   ////
//// July 13th, 2005:                                                  ////
////   Endpoint descriptor works if USB_EP1_TX_SIZE is 16bits          ////
////   Endpoint descriptor works if USB_EP1_RX_SIZE is 16bits          ////
////                                                                   ////
//// June 20th, 2005:                                                  ////
////   18fxx5x Initial release.                                        ////
////                                                                   ////
//// March 21st, 2005:                                                 ////
////   EP 0x01 and EP 0x81 now use USB_EP1_TX_SIZE and USB_EP1_RX_SIZE ////
////      to define max packet size, to make it easier for dynamically ////
////      changed code.                                                ////
////                                                                   ////
//// June 24th, 2002: Cleanup                                          ////
////                                                                   ////
//// May 6th, 2003: Fixed non-HID descriptors pointing to faulty       ////
////                strings                                            ////
////                                                                   ////
//// August 2nd, 2002: Initial Public Release                          ////
////                                                                   ////
////                                                                   ////
///////////////////////////////////////////////////////////////////////////
////        (C) Copyright 1996,2005 Custom Computer Services           ////
//// This source code may only be used by licensed users of the CCS    ////
//// C compiler.  This source code may only be distributed to other    ////
//// licensed users of the CCS C compiler.  No other use,              ////
//// reproduction or distribution is permitted without written         ////
//// permission.  Derivative programs created using this software      ////
//// in object code form are not restricted in any way.                ////
///////////////////////////////////////////////////////////////////////////

#IFNDEF __USB_DESCRIPTORS__
#DEFINE __USB_DESCRIPTORS__

#include <usb.h>

//////////////////////////////////////////////////////////////////
///
///   start config descriptor
///   right now we only support one configuration descriptor.
///   the config, interface, class, and endpoint goes into this array.
///
//////////////////////////////////////////////////////////////////

   #DEFINE USB_TOTAL_CONFIG_LEN      32 //config+interface+class+endpoint

   //configuration descriptor
   char const USB_CONFIG_DESC[] = {
   //config_descriptor for config index 1
         USB_DESC_CONFIG_LEN,     //length of descriptor size
         USB_DESC_CONFIG_TYPE,         //constant CONFIGURATION (0x02)
         USB_TOTAL_CONFIG_LEN,0,  //size of all data returned for this config
         1,      //number of interfaces this device supports
         0x01,                //identifier for this configuration.  (IF we had more than one configurations)
         0x00,                //index of string descriptor for this configuration
         0xC0,                //bit 6=1 if self powered, bit 5=1 if supports remote wakeup (we don't), bits 0-4 reserved and bit7=1
         0x32,                //maximum bus power required (maximum milliamperes/2)  (0x32 = 100mA)

   //interface descriptor 0 alt 0
         USB_DESC_INTERFACE_LEN,  //length of descriptor
         USB_DESC_INTERFACE_TYPE,      //constant INTERFACE (0x04)
         0x00,                //number defining this interface (IF we had more than one interface)
         0x00,                //alternate setting
         2,       //number of endpoints, not counting endpoint 0.
         0xFF,                //class code, FF = vendor defined
         0xFF,                //subclass code, FF = vendor
         0xFF,                //protocol code, FF = vendor
         0x00,                //index of string descriptor for interface

   //endpoint descriptor
         USB_DESC_ENDPOINT_LEN, //length of descriptor
         USB_DESC_ENDPOINT_TYPE,     //constant ENDPOINT (0x05)
         0x81,              //endpoint number and direction (0x81 = EP1 IN)
         0x02,              //transfer type supported (0 is control, 1 is iso, 2 is bulk, 3 is interrupt)
         USB_EP1_TX_SIZE & 0xFF,USB_EP1_TX_SIZE >> 8,         //maximum packet size supported
         0x01,              //polling interval in ms. (for interrupt transfers ONLY)

   //endpoint descriptor
         USB_DESC_ENDPOINT_LEN, //length of descriptor
         USB_DESC_ENDPOINT_TYPE,     //constant ENDPOINT (0x05)
         0x01,              //endpoint number and direction (0x01 = EP1 OUT)
         0x02,              //transfer type supported (0 is control, 1 is iso, 2 is bulk, 3 is interrupt)
         USB_EP1_RX_SIZE & 0xFF,USB_EP1_RX_SIZE >> 8,         //maximum packet size supported
         0x01,              //polling interval in ms. (for interrupt transfers ONLY)

  };

   //****** BEGIN CONFIG DESCRIPTOR LOOKUP TABLES ********
   //since we can't make pointers to constants in certain pic16s, this is an offset table to find
   //  a specific descriptor in the above table.

   //NOTE: DO TO A LIMITATION OF THE CCS CODE, ALL HID INTERFACES MUST START AT 0 AND BE SEQUENTIAL
   //      FOR EXAMPLE, IF YOU HAVE 2 HID INTERFACES THEY MUST BE INTERFACE 0 AND INTERFACE 1
   #define USB_NUM_HID_INTERFACES   0

   //the maximum number of interfaces seen on any config
   //for example, if config 1 has 1 interface and config 2 has 2 interfaces you must define this as 2
   #define USB_MAX_NUM_INTERFACES   1

   //define how many interfaces there are per config.  [0] is the first config, etc.
   const char USB_NUM_INTERFACES[USB_NUM_CONFIGURATIONS]={1};

   #if (sizeof(USB_CONFIG_DESC) != USB_TOTAL_CONFIG_LEN)
      #error USB_TOTAL_CONFIG_LEN not defined correctly
   #endif


//////////////////////////////////////////////////////////////////
///
///   start device descriptors
///
//////////////////////////////////////////////////////////////////

   //device descriptor
   char const USB_DEVICE_DESC[] ={
         USB_DESC_DEVICE_LEN,          //the length of this report
         0x01,                //constant DEVICE (0x01)
         0x10,0x01,           //usb version in bcd
         0x00,                //class code (if 0, interface defines class.  FF is vendor defined)
         0x00,                //subclass code
         0x00,                //protocol code
         USB_MAX_EP0_PACKET_LENGTH,   //max packet size for endpoint 0. (SLOW SPEED SPECIFIES 8)
         08,0x04,           //vendor id (0x04D8 is Microchip)
         0x11,0x00,           //product id
         0x00,0x01,           //device release number
         0x01,                //index of string description of manufacturer. therefore we point to string_1 array (see below)
         0x02,                //index of string descriptor of the product
         0x00,                //index of string descriptor of serial number
         USB_NUM_CONFIGURATIONS   //number of possible configurations
   };


//////////////////////////////////////////////////////////////////
///
///   start string descriptors
///   String 0 is a special language string, and must be defined.  People in U.S.A. can leave this alone.
///
///   You must define the length else get_next_string_character() will not see the string
///   Current code only supports 10 strings (0 thru 9)
///
//////////////////////////////////////////////////////////////////

//the offset of the starting location of each string.
//offset[0] is the start of string 0, offset[1] is the start of string 1, etc.
const char USB_STRING_DESC_OFFSET[]={0,4,12};

#define USB_STRING_DESC_COUNT sizeof(USB_STRING_DESC_OFFSET)

char const USB_STRING_DESC[]={
   //string 0
         4, //length of string index
         USB_DESC_STRING_TYPE, //descriptor type 0x03 (STRING)
         0x09,0x04,   //Microsoft Defined for US-English
   //string 1
         8, //length of string index
         USB_DESC_STRING_TYPE, //descriptor type 0x03 (STRING)
         'C',0,
         'C',0,
         'S',0,
   //string 2
         22, //length of string index
         USB_DESC_STRING_TYPE, //descriptor type 0x03 (STRING)
         'M',0,
         'o',0,
         'y',0,
         'a',0,
         'P',0,
         'I',0,
         '_',0,
         'U',0,
         'S',0,
         'B',0,
         
};


#ENDIF

Este código es totalmente funcional , espero que te ayude.

sabedoyaa:

Con la función usb_cdc_getc() recibis valores enteros de 0 a 255.

jsus21: Poné un trozo del código donde tenés el problema asi podemos ayudarte.

Patico21: como estás .
Tenés que leer las normas del foro , para que te des cuenta de que no se pueden poner link a programas piratas.
En cuanto a ayudarte a programar estamos completamente dispuestos a hacerlo.
 
hola amigo disculpame pero pense que el programa era de libre distribucion o hay un demo para solamente aprender a programar asi como lo son el MPLAB y Microcode Studio por eso pedia un poco de información en relacion de este tema
me disculpo por eso...y bueno muchas gracias por la ayuda me pondre en la tarea de averiguar y aprender un poco a programar y lo que no me quede muy claro les preguntare
 
Quería dar un especial agradecimiento a los moderadores del foro por subir este tema a destacados para que no se pierda en el olvido. Esto me motiva a seguir dia a dia con mi libro que por complicaciones no he podido darle demasiada atención.

http://www.mediafire.com/?sharekey=5f09a3ade06e1b01d41644271fb54c6c55e78325ff111889d7410b61083723b8 un nuevo avance

Le he tenido que sacar algunas cosas por mala traducción pero hasta acá he llegado , ahora estoy traduciendo lo que estaba mal y después lo subo.

Falta mas teoría sobre las librerías y empiezo definitivamente con CDC ( La práctica )

1 saludo !
 
Atrás
Arriba