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



## Moyano Jonathan (Dic 6, 2008)

Les traigo ejemplos de control del puerto USB que traen de fábrica los PIC´s de la serie 18Fxx5x. Para esto me he basado en ejemplos encontrados en la red.
Los ejemplos que iré desarrollando van aplicados a las clases CDC (Comunication device class) y el control mediante la API de Windows proporcionada por Microchip mpusbapi.dll (bulk transfer).

El primer ejemplo establece una comunicación bidireccional con la PC, a través de la clase CDC.
Por lo tanto cuando conectemos nuestro PIC (18F2550), aparecerá en el administrador de dispositivos un puerto serie que podemos controlar desde una aplicación programada previamente en un lenguaje como el Visual Basic 6.0.

El firmware del PIC, lo he programado en C de CCS.
El código fuente es el siguiente:

```
// Ejercicio Nº1: Genera un COM virtual y se comunica bidireccionalmente con el a través del PIC18F2550.

#include <18F2550.h> // Definición de registros internos.

#fuses HSPLL,NOMCLR,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN,NOPBADEN

// Fuses utilizados:
/*
HSPLL: utilizamos un cristal HS de alta velocidad, en conjunto con el PLL para generar los 48Mhz.
NOMCLR: Utilizamos reset por software, y dejamos el pin 1 del micro como entrada/salida digital.
NOWDT: No utilizamos el perro guardían.
NOPROTECT: Desactivamos la protección de código.
NOLVP: Desactivamos la programación a bajo voltaje.
NODEBUG: No entramos al modo debug.
USBDIV: signfica que el clock del usb se tomará del PLL/2 = 96Mhz/2 = 48Mhz.
PLL5: significa que el PLL prescaler dividirá en 5 la frecuencia del cristal. para HS = 20Mhz/5 = 4Mhz.
CPUDIV1: El PLL postscaler decide la división en 2 de la frecuencia de salida del PLL de 96MHZ, si queremos 48MHZ, lo dejamos como está.
VREGEN: habilita el regulador de 3.3 volts que usa el módulo USB
*/

#use delay(clock=48000000) // Frecuencia máxima de trabajo.

#include "usb_cdc.h" // Descripción de funciones del USB.
#include "usb_desc_cdc.h" // Descriptores del dispositivo USB.

void main() {
   usb_cdc_init(); // Configuramos al puerto virtual.
   usb_init(); // Inicializamos el stack USB.
   while(!usb_cdc_connected()) {} 
   // espera a detectar una transmisión de la PC (Set_Line_Coding).
   do{
      usb_task();
      if (usb_enumerated()){  // Espera a que el dispositivo sea enumerado por el host.
         if(usb_cdc_kbhit()){ // En espera de nuevos caracteres en el buffer de recepción.
            if(usb_cdc_getc()=='x'){ //¿lo que llegó fué el caracter x?
               printf(usb_cdc_putc, "Se recibe el caracter x.\n\r"); 
               //si, entonces envía una cadena hacia el PC
             }
            if(usb_cdc_getc()=='a'){ //¿lo que llegó fué el caracter a?
               printf(usb_cdc_putc, "Se recibe el caracter a.\n\r");
               //si, entonces envía una cadena hacia el PC               
             }
         }
        }
       }while (TRUE); // bucle infinito.
}
```
Las librerías usb_desc_cdc.h y usb_cdc.h son las que me permiten comunicar al pic por USB 2.0.
Las mismas están  configuradas para que aparezca mi nombre de compañía, (ficticio) nombre de la placa, etc.
También se encuentran configurados los VID y PID para que la PC enumere y enlace al código dentro del PIC con los drivers de la PC.

```
/////////////////////////////////////////////////////////////////////////
////                                                                
////                            usb_cdc.h                           
////                                                                 
//// Library for adding a virtual COM port on your PC over USB using 
//// the standard Communication Device Class (CDC) specification.    
//// Including this file in your code will add all USB code,       
//// interrupts, descriptors and handlers required.  No other        
//// modifications need to be made.                                  
////                                                                 
//// This library creates a virtual RS232 link between the PC and    
//// the PIC, therefore the library provided will be familiar to     
//// anyone with standard UART stream I/O:                         
////                                                                 
//// usb_cdc_kbhit() - Returns TRUE if there is one or more          
////      character received and waiting in the receive buffer.      
////                                                             
//// usb_cdc_getc() - Gets a character from the receive buffer.  If  
////      there is no data in the receive buffer it will wait until  
////      there is data in the receive buffer.  If you do not want   
////      to wait in an infinit loop, use usb_cdc_kbhit() first to  
////      check if there is data before calling usb_cdc_getc().     
////                                                               
//// usb_cdc_putc(char c) - Puts a character into the transmit      
////      buffer.  If the transmit buffer is full it will wait until 
////      the transmit buffer is not full before putting the char    
////      into the transmit buffer.  The transmit buffer is read by  
////      the PC very quickly, and therefore the buffer should only  
////      be full for a few milli-seconds.  If you are concerned     
////      and don't want to be stuck in a long or infinite loop,     
////      use usb_cdc_putready() to see if there is space in the    
////      transmit buffer before putting data into the transmit    
////      buffer.                                                 
////                                                                
//// usb_cdc_putready() - Returns TRUE if there is room left in the  
////      transmit buffer for another character.           
////                                                                 
//// usb_cdc_connected() - Returns TRUE if we received a            
////      Set_Line_Coding.  On most serial terminal programs (such   
////      as Hyperterminal), they will send a Set_Line_Coding        
////      message when the program starts and it opens the virtual   
////      COM port.  This is a simple way to determine if the PC   
////      is ready to display data on a serial terminal program,    
////      but is not garaunteed to work all the time or on other     
////      terminal programs.                                    
////                                                                 
//// usb_cdc_putc_fast(char c) - Similar to usb_cdc_putc(), except   
////      if the transmit buffer is full it will skip the char.    
////                                                           
//// usb_cdc_line_coding - A structure used for Set_Line_Coding and  
////       Get_Line_Coding.  Most of the time you can ignore this.   
////                                                             
//// usb_cdc_break - If the PC has sent a break command, this will   
////       hold the break time (in milli-seconds).  If the PC sends  
////       a value of 0xFFFF the device is supposed to hold the      
////       break until it sends a value of 0                      
////                                                               
//// usb_cdc_carrier - Where Set_Control_Line_State value is stored. 
////       Of most relevance is the field dte_present, which is the  
////       DTR setting.                                          
////                                                               
//// The following functions are also provided, and are ports of the
//// I/O functions in input.c.  See input.c and the CCS manual for   
//// documentation:                                                 
////   get_float_usb() - Read a float number from the user          
////   get_long_usb() - Read a long number from the user             
////   get_int_usb() - Read an integer number from the user          
////   get_string_usb(char *s, int max) - Read a string from the user. 
////   gethex_usb() - Read a byte, in HEX, from the user             
////   gethex1_usb() - Read a HEX character                          
////                                                                 
//// This driver will load all the rest of the USB code, and a set  
//// of descriptors that will properly describe a CDC device for a  
//// virtual COM port (usb_desc_cdc.h)                               
////                                                                 
//// An .INF file is provided (cdc_NTXP.inf) that will load the      
//// standard CDC drivers for a virtual COM port in Windows          
//// NT/2000/XP and above.  Unfortunately we do not provide an .inf  
//// file for Windows 98 and ME.                                     
////                                                                 
/////////////////////////////////////////////////////////////////////////
////                                                                 
//// VERSION HISTORY                                                 
////                                                                 
//// October 27th, 2005: Changed the way incoming packets are        
////               handled in that CDC driver will not flush         
////               endpoint until user has handled all data.  This   
////               will prevent overflows as the USB will NAK       
////               incoming packets until it is ready to receive     
////               more.                                             
////            When using 18F4550 family, the RX buffer is         
////               mapped directly to the endpoint buffer - this    
////               saves a chunk of RAM.                           
////            When using the 18F4550 family, you can increase   
////               the TX and RX size over 64 bytes.                
////            No longer send 0len packets in the TBE interrupt.   
////            Hopefully fixed bugs that caused random crashes    
////               if you tried sending more than 64 bytes.          
////                                                                
//// July 6th, 2005: Global interrupts disabled when writing to TX   
////                   buffer.                                    
////                                                            
//// July 1st, 2005: Initial 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.             
/////////////////////////////////////////////////////////////////////////


//api for the user:
#define usb_cdc_kbhit() (usb_cdc_get_buffer_status.got)
#define usb_cdc_putready() (usb_cdc_put_buffer_nextin<USB_CDC_DATA_IN_SIZE)
#define usb_cdc_connected() (usb_cdc_got_set_line_coding)
void usb_cdc_putc_fast(char c);
char usb_cdc_getc(void);
void usb_cdc_putc(char c);

//input.c ported to use CDC:
float get_float_usb();
signed long get_long_usb();
signed int get_int_usb();
void get_string_usb(char* s, int max);
BYTE gethex_usb();
BYTE gethex1_usb();

//functions automatically called by USB handler code
void usb_isr_tkn_cdc(void);
void usb_cdc_init(void);
void usb_isr_tok_out_cdc_control_dne(void);
void usb_isr_tok_in_cdc_data_dne(void);
void usb_isr_tok_out_cdc_data_dne(void);

void usb_cdc_flush_out_buffer(void);

//Tells the CCS PIC USB firmware to include HID handling code.
#DEFINE USB_HID_DEVICE  FALSE
#DEFINE USB_CDC_DEVICE  TRUE

#define USB_CDC_COMM_IN_ENDPOINT       1
#define USB_CDC_COMM_IN_SIZE           8
#define USB_EP1_TX_ENABLE  USB_ENABLE_INTERRUPT
#define USB_EP1_TX_SIZE  USB_CDC_COMM_IN_SIZE

//pic to pc endpoint config
#define USB_CDC_DATA_IN_ENDPOINT       2
#define USB_CDC_DATA_IN_SIZE           64
#define USB_EP2_TX_ENABLE  USB_ENABLE_BULK
#define USB_EP2_TX_SIZE  USB_CDC_DATA_IN_SIZE

//pc to pic endpoint config
#define USB_CDC_DATA_OUT_ENDPOINT       2
#define USB_CDC_DATA_OUT_SIZE           64
#define USB_EP2_RX_ENABLE  USB_ENABLE_BULK
#define USB_EP2_RX_SIZE  USB_CDC_DATA_OUT_SIZE

/////////////////////////////////////////////////////////////////////////////
//
// Include the CCS USB Libraries.  See the comments at the top of these
// files for more informaciónrmation
//
/////////////////////////////////////////////////////////////////////////////
#ifndef __USB_PIC_PERIF__
#define __USB_PIC_PERIF__    1
#endif

#if __USB_PIC_PERIF__
 #if defined(__PCM__)
  #error CDC requires bulk mode!  PIC16C7x5 does not have bulk mode
 #else
  #include <pic18_usb.h>   //Microchip 18Fxx5x hardware layer for usb.c
 #endif
#else
 #include <usbn960x.c>   //National 960x hardware layer for usb.c
#endif
#include <usb_desc_cdc.h>    //USB Configuration and Device descriptors for this UBS device
#include <usb.c>        //handles usb setup tokens and get descriptor reports

struct {
        int32   dwDTERrate;   //data terminal rate, in bits per second
        int8    bCharFormat;  //num of stop bits (0=1, 1=1.5, 2=2)
        int8    bParityType;  //parity (0=none, 1=odd, 2=even, 3=mark, 4=space)
        int8    bDataBits;    //data bits (5,6,7,8 or 16)
} usb_cdc_line_coding;

//length of time, in ms, of break signal as we received in a SendBreak message.
//if ==0xFFFF, send break signal until we receive a 0x0000.
int16 usb_cdc_break;

int8 usb_cdc_encapsulated_cmd[8];

int8 usb_cdc_put_buffer[USB_CDC_DATA_IN_SIZE];
int1 usb_cdc_put_buffer_free;
#if USB_CDC_DATA_IN_SIZE>=0x100
 int16 usb_cdc_put_buffer_nextin=0;
// int16 usb_cdc_last_data_packet_size;
#else
 int8 usb_cdc_put_buffer_nextin=0;
// int8 usb_cdc_last_data_packet_size;
#endif

struct {
   int1 got;
  #if USB_CDC_DATA_OUT_SIZE>=0x100
   int16 len;
   int16 index;
  #else
   int8 len;
   int8 index;
  #endif
} usb_cdc_get_buffer_status;

int8 usb_cdc_get_buffer_status_buffer[USB_CDC_DATA_OUT_SIZE];
#if (defined(__PIC__))
 #if __PIC__
  //#locate usb_cdc_get_buffer_status_buffer=0x500+(2*USB_MAX_EP0_PACKET_LENGTH)+USB_CDC_COMM_IN_SIZE
  #if USB_MAX_EP0_PACKET_LENGTH==8
     #locate usb_cdc_get_buffer_status_buffer=0x500+24
  #elif USB_MAX_EP0_PACKET_LENGTH==64
     #locate usb_cdc_get_buffer_status_buffer=0x500+136
  #else
   #error CCS BUG WONT LET ME USE MATH IN LOCATE
  #endif
 #endif
#endif

int1 usb_cdc_got_set_line_coding;

struct  {
   int1 dte_present; //1=DTE present, 0=DTE not present
   int1 active;      //1=activate carrier, 0=deactivate carrier
   int reserved:6;
} usb_cdc_carrier;

enum {USB_CDC_OUT_NOTHING=0, USB_CDC_OUT_COMMAND=1, USB_CDC_OUT_LINECODING=2, USB_CDC_WAIT_0LEN=3} __usb_cdc_state=0;

#byte INTCON=0xFF2
#bit INT_GIE=INTCON.7

//handle OUT token done interrupt on endpoint 0 [read encapsulated cmd and line coding data]
void usb_isr_tok_out_cdc_control_dne(void) {
   debug_usb(debug_putc,"CDC %X ",__usb_cdc_state);

   switch (__usb_cdc_state) {
      //printf(putc_tbe,"@%X@\r\n", __usb_cdc_state);
      case USB_CDC_OUT_COMMAND:
         //usb_get_packet(0, usb_cdc_encapsulated_cmd, 8);
         memcpy(usb_cdc_encapsulated_cmd, usb_ep0_rx_buffer,8);
        #if USB_MAX_EP0_PACKET_LENGTH==8
         __usb_cdc_state=USB_CDC_WAIT_0LEN;
         usb_request_get_data();
        #else
         usb_put_0len_0();
         __usb_cdc_state=0;
        #endif
         break;

    #if USB_MAX_EP0_PACKET_LENGTH==8
      case USB_CDC_WAIT_0LEN:
         usb_put_0len_0();
         __usb_cdc_state=0;
         break;
    #endif

      case USB_CDC_OUT_LINECODING:
         //usb_get_packet(0, &usb_cdc_line_coding, 7);
         //printf(putc_tbe,"\r\n!GSLC FIN!\r\n");
         memcpy(&usb_cdc_line_coding, usb_ep0_rx_buffer,7);
         __usb_cdc_state=0;
         usb_put_0len_0();
         break;

      default:
         __usb_cdc_state=0;
         usb_init_ep0_setup();
         break;
   }
}

//handle IN token on 0 (setup packet)
void usb_isr_tkn_cdc(void) {
   //make sure the request goes to a CDC interface
   if ((usb_ep0_rx_buffer[4] == 1) || (usb_ep0_rx_buffer[4] == 0)) {
      //printf(putc_tbe,"!%X!\r\n", usb_ep0_rx_buffer[1]);
      switch(usb_ep0_rx_buffer[1]) {
         case 0x00:  //send_encapsulated_command
            __usb_cdc_state=USB_CDC_OUT_COMMAND;
            usb_request_get_data();
            break;

         case 0x01:  //get_encapsulated_command
            memcpy(usb_ep0_tx_buffer, usb_cdc_encapsulated_cmd, 8);
            usb_request_send_response(usb_ep0_rx_buffer[6]);  //send wLength bytes
            break;

         case 0x20:  //set_line_coding
            debug_usb(debug_putc,"!GSLC!");
            __usb_cdc_state=USB_CDC_OUT_LINECODING;
            usb_cdc_got_set_line_coding=TRUE;
            usb_request_get_data();
            break;

         case 0x21:  //get_line_coding
            memcpy(usb_ep0_tx_buffer, &usb_cdc_line_coding, sizeof(usb_cdc_line_coding));
            usb_request_send_response(sizeof(usb_cdc_line_coding)); //send wLength bytes
            break;

         case 0x22:  //set_control_line_state
            usb_cdc_carrier=usb_ep0_rx_buffer[2];
            usb_put_0len_0();
            break;

         case 0x23:  //send_break
            usb_cdc_break=make16(usb_ep0_rx_buffer[2],usb_ep0_rx_buffer[3]);
            usb_put_0len_0();
            break;

         default:
            usb_request_stall();
            break;
      }
   }
}

//handle OUT token done interrupt on endpoint 3 [buffer incoming received chars]
void usb_isr_tok_out_cdc_data_dne(void) {
   usb_cdc_get_buffer_status.got=TRUE;
   usb_cdc_get_buffer_status.index=0;
#if (defined(__PIC__))
   #if __PIC__
    usb_cdc_get_buffer_status.len=usb_rx_packet_size(USB_CDC_DATA_OUT_ENDPOINT);
   #else
    usb_cdc_get_buffer_status.len=usb_get_packet_buffer(
       USB_CDC_DATA_OUT_ENDPOINT,&usb_cdc_get_buffer_status_buffer[0],USB_CDC_DATA_OUT_SIZE);
   #endif
#else
   usb_cdc_get_buffer_status.len=usb_get_packet_buffer(
      USB_CDC_DATA_OUT_ENDPOINT,&usb_cdc_get_buffer_status_buffer[0],USB_CDC_DATA_OUT_SIZE);
#endif
}

//handle IN token done interrupt on endpoint 2 [transmit buffered characters]
void usb_isr_tok_in_cdc_data_dne(void) {
   if (usb_cdc_put_buffer_nextin) {
      usb_cdc_flush_out_buffer();
   }
   //send a 0len packet if needed
//   else if (usb_cdc_last_data_packet_size==USB_CDC_DATA_IN_SIZE) {
//      usb_cdc_last_data_packet_size=0;
//      printf(putc_tbe, "FL 0\r\n");
//      usb_put_packet(USB_CDC_DATA_IN_ENDPOINT,0,0,USB_DTS_TOGGLE);
//   }
   else {
      usb_cdc_put_buffer_free=TRUE;
      //printf(putc_tbe, "FL DONE\r\n");
   }
}

void usb_cdc_flush_out_buffer(void) {
   if (usb_cdc_put_buffer_nextin) {
      usb_cdc_put_buffer_free=FALSE;
      //usb_cdc_last_data_packet_size=usb_cdc_put_buffer_nextin;
      //printf(putc_tbe, "FL %U\r\n", usb_cdc_put_buffer_nextin);
      usb_put_packet(USB_CDC_DATA_IN_ENDPOINT,usb_cdc_put_buffer,usb_cdc_put_buffer_nextin,USB_DTS_TOGGLE);
      usb_cdc_put_buffer_nextin=0;
   }
}

void usb_cdc_init(void) {
   usb_cdc_line_coding.dwDTERrate=9600;
   usb_cdc_line_coding.bCharFormat=0;
   usb_cdc_line_coding.bParityType=0;
   usb_cdc_line_coding.bDataBits=8;
   (int8)usb_cdc_carrier=0;
   usb_cdc_got_set_line_coding=FALSE;
   usb_cdc_break=0;
   usb_cdc_put_buffer_nextin=0;
   usb_cdc_get_buffer_status.got=0;
   usb_cdc_put_buffer_free=TRUE;
}

////////////////// END USB CONTROL HANDLING //////////////////////////////////

////////////////// BEGIN USB<->RS232 CDC LIBRARY /////////////////////////////

char usb_cdc_getc(void) {
   char c;

   while (!usb_cdc_kbhit()) {}

   c=usb_cdc_get_buffer_status_buffer[usb_cdc_get_buffer_status.index++];
   if (usb_cdc_get_buffer_status.index >= usb_cdc_get_buffer_status.len) {
      usb_cdc_get_buffer_status.got=FALSE;
      usb_flush_out(USB_CDC_DATA_OUT_ENDPOINT, USB_DTS_TOGGLE);
   }

   return(c);
}

void usb_cdc_putc_fast(char c) {
   int1 old_gie;

   //disable global interrupts
   old_gie=INT_GIE;
   INT_GIE=0;

   if (usb_cdc_put_buffer_nextin >= USB_CDC_DATA_IN_SIZE) {
      usb_cdc_put_buffer_nextin=USB_CDC_DATA_IN_SIZE-1;  //we just overflowed the buffer!
   }
   usb_cdc_put_buffer[usb_cdc_put_buffer_nextin++]=c;

   //renable global interrupts
   INT_GIE=old_gie;

   /*
   if (usb_tbe(USB_CDC_DATA_IN_ENDPOINT)) {
      if (usb_cdc_put_buffer_nextin)
         usb_cdc_flush_out_buffer();
   }
   */
   if (usb_cdc_put_buffer_free) {
      usb_cdc_flush_out_buffer();
   }
}

void usb_cdc_putc(char c) {
   while (!usb_cdc_putready()) {
      if (usb_cdc_put_buffer_free) {
         usb_cdc_flush_out_buffer();
      }
      //delay_ms(500);
      //printf(putc_tbe,"TBE=%U CNT=%U LST=%U\r\n",usb_tbe(USB_CDC_DATA_IN_ENDPOINT), usb_cdc_put_buffer_nextin, usb_cdc_last_data_packet_size);
   }
   usb_cdc_putc_fast(c);
}

#include <ctype.h>

BYTE gethex1_usb() {
   char digit;

   digit = usb_cdc_getc();

   usb_cdc_putc(digit);

   if(digit<='9')
     return(digit-'0');
   else
     return((toupper(digit)-'A')+10);
}

BYTE gethex_usb() {
   int lo,hi;

   hi = gethex1_usb();
   lo = gethex1_usb();
   if(lo==0xdd)
     return(hi);
   else
     return( hi*16+lo );
}

void get_string_usb(char* s, int max) {
   int len;
   char c;

   --max;
   len=0;
   do {
     c=usb_cdc_getc();
     if(c==8) {  // Backspace
        if(len>0) {
          len--;
          usb_cdc_putc(c);
          usb_cdc_putc(' ');
          usb_cdc_putc(c);
        }
     } else if ((c>=' ')&&(c<='~'))
       if(len<max) {
         s[len++]=c;
         usb_cdc_putc(c);
       }
   } while(c!=13);
   s[len]=0;
}


// stdlib.h is required for the ato_ conversions
// in the following functions
#ifdef _STDLIB

signed int get_int_usb() {
  char s[5];
  signed int i;

  get_string_usb(s, 5);

  i=atoi(s);
  return(i);
}

signed long get_long_usb() {
  char s[7];
  signed long l;

  get_string_usb(s, 7);
  l=atol(s);
  return(l);
}

float get_float_usb() {
  char s[20];
  float f;

  get_string_usb(s, 20);
  f = atof(s);
  return(f);
}

#endif
```
La librería de descriptores USB. (Los que me dan el nombre del dispositivo)

```
///////////////////////////////////////////////////////////////////////////
////                         usb_desc_cdc.h                       
////                                                                  
//// An example set of device / configuration descriptors for use with 
//// CCS's CDC Virtual COM Port driver (see usb_cdc.h)
////                                                                  
//// Two examples are provided:                                        
////      ex_usb_serial.c                                           
////      ex_usb_serial2.c                                           
////                                                                 
///////////////////////////////////////////////////////////////////////////
////                                                                   
//// Version History:                                               
////                                                                   
//// 10/28/05:                                                     
////    Bulk endpoint sizes updated to allow more than 255 byte        
////    packets.                                                      
////    Changed device to USB 1.10                                  
///////////////////////////////////////////////////////////////////////////
////        (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      67  //config+interface+class+endpoint+endpoint (2 endpoints)

   const char USB_CONFIG_DESC[] = {
   //IN ORDER TO COMPLY WITH WINDOWS HOSTS, THE ORDER OF THIS ARRAY MUST BE:
      //    config(s)
      //    interface(s)
      //    class(es)
      //    endpoint(s)

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

   //interface descriptor 0 (comm class interface)
         USB_DESC_INTERFACE_LEN, //length of descriptor      =9
         USB_DESC_INTERFACE_TYPE, //constant INTERFACE (INTERFACE 0x04)       =10
         0x00, //number defining this interface (IF we had more than one interface)    ==11
         0x00, //alternate setting     ==12
         1, //number of endpoints   ==13
         0x02, //class code, 02 = Comm Interface Class     ==14
         0x02, //subclass code, 2 = Abstract     ==15
         0x01, //protocol code, 1 = v.25ter      ==16
         0x00, //index of string descriptor for interface      ==17

   //class descriptor [functional header]
         5, //length of descriptor    ==18
         0x24, //dscriptor type (0x24 == )      ==19
         0, //sub type (0=functional header) ==20
         0x10,0x01, //      ==21,22 //cdc version

   //class descriptor [acm header]
         4, //length of descriptor    ==23
         0x24, //dscriptor type (0x24 == )      ==24
         2, //sub type (2=ACM)   ==25
         2, //capabilities    ==26  //we support Set_Line_Coding, Set_Control_Line_State, Get_Line_Coding, and the notification Serial_State.

   //class descriptor [union header]
         5, //length of descriptor    ==27
         0x24, //dscriptor type (0x24 == )      ==28
         6, //sub type (6=union)    ==29
         0, //master intf     ==30  //The interface number of the Communication or Dat a Cl ass interface, designated as the masteror controlling interface for the union.
         1, //save intf0      ==31  //Interface number of first slave or associated interface in the union. *

   //class descriptor [call mgmt header]
         5, //length of descriptor    ==32
         0x24, //dscriptor type (0x24 == )      ==33
         1, //sub type (1=call mgmt)   ==34
         0, //capabilities          ==35  //device does not handle call management itself
         1, //data interface        ==36  //interface number of data class interface

   //endpoint descriptor
         USB_DESC_ENDPOINT_LEN, //length of descriptor                   ==37
         USB_DESC_ENDPOINT_TYPE, //constant ENDPOINT (ENDPOINT 0x05)          ==38
         USB_CDC_COMM_IN_ENDPOINT | 0x80, //endpoint number and direction
         0x03, //transfer type supported (0x03 is interrupt)         ==40
         USB_CDC_COMM_IN_SIZE,0x00, //maximum packet size supported                  ==41,42
         250,  //polling interval, in ms.  (cant be smaller than 10)      ==43

   //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

   //endpoint descriptor
         USB_DESC_ENDPOINT_LEN, //length of descriptor                   ==60
         USB_DESC_ENDPOINT_TYPE, //constant ENDPOINT (ENDPOINT 0x05)          ==61
         USB_CDC_DATA_OUT_ENDPOINT, //endpoint number and direction (0x02 = EP2 OUT)       ==62
         0x02, //transfer type supported (0x02 is bulk)         ==63
//         make8(USB_CDC_DATA_OUT_SIZE,0),make8(USB_CDC_DATA_OUT_SIZE,1), //maximum packet size supported                  ==64, 65
         USB_CDC_DATA_OUT_SIZE & 0xFF, (USB_CDC_DATA_OUT_SIZE >> 8) & 0xFF, //maximum packet size supported                  ==64, 65
         250,  //polling interval, in ms.  (cant be smaller than 10)      ==66

   //endpoint descriptor
         USB_DESC_ENDPOINT_LEN, //length of descriptor                   ==53
         USB_DESC_ENDPOINT_TYPE, //constant ENDPOINT (ENDPOINT 0x05)          ==54
         USB_CDC_DATA_IN_ENDPOINT | 0x80, //endpoint number and direction (0x82 = EP2 IN)       ==55
         0x02, //transfer type supported (0x02 is bulk)         ==56
//         make8(USB_CDC_DATA_IN_SIZE,0),make8(USB_CDC_DATA_IN_SIZE,1), //maximum packet size supported                  ==57, 58
         USB_CDC_DATA_IN_SIZE & 0xFF, (USB_CDC_DATA_IN_SIZE >> 8) & 0xFF, //maximum packet size supported                  ==64, 65
         250,  //polling interval, in ms.  (cant be smaller than 10)      ==59
   };

   //****** 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.

   //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   2

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

   //define where to find class descriptors
   //first dimension is the config number
   //second dimension specifies which interface
   //last dimension specifies which class in this interface to get, but most will only have 1 class per interface
   //if a class descriptor is not valid, set the value to 0xFFFF
   const int16 USB_CLASS_DESCRIPTORS[USB_NUM_CONFIGURATIONS][USB_MAX_NUM_INTERFACES][4]=
   {
   //config 1
      //interface 0
         //class 1-4
         18,23,27,32,
      //interface 1
         //no classes for this interface
         0xFFFF,0xFFFF,0xFFFF,0xFFFF
   };

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


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

   const char USB_DEVICE_DESC[USB_DESC_DEVICE_LEN] ={
      //starts of with device configuration. only one possible
         USB_DESC_DEVICE_LEN, //the length of this report   ==0
         0x01, //the constant DEVICE (DEVICE 0x01)  ==1
         0x10,0x01, //usb version in bcd  ==2,3
         0x02, //class code. 0x02=Communication Device Class ==4
         0x00, //subclass code ==5
         0x00, //protocol code ==6
         USB_MAX_EP0_PACKET_LENGTH, //max packet size for endpoint 0. (SLOW SPEED SPECIFIES 8) ==7
         08,0x04, //vendor id (0x04D8 is Microchip, or is it 0x0461 ?)  ==8,9
         0x0B,0x00, //product id   ==10,11
         0x00,0x01, //device release number  ==12,13
         0x01, //index of string description of manufacturer. therefore we point to string_1 array (see below)  ==14
         0x02, //index of string descriptor of the product  ==15
         0x00, //index of string descriptor of serial number  ==16
         USB_NUM_CONFIGURATIONS  //number of possible configurations  ==17
   };


//////////////////////////////////////////////////////////////////
///
///   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.
char USB_STRING_DESC_OFFSET[]={0,4,12};

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
         24, //length of string index
         USB_DESC_STRING_TYPE, //descriptor type 0x03 (STRING)
         'C',0,
         'D',0,
         'C',0,
         '_',0,
         'U',0,
         'S',0,
         'B',0,
         '_',0,
         'P',0,
         'I',0,
         'C',0,

};

#ENDIF
```
Para la PC el software lo escribí en Visual Basic v6.0, ya que me pareció más fácil para entender.
Igual el programa puede ser migrado a visual C# o algún otro lenguaje de alto nivel.
En caso de no tener dichos lenguajes para probar el circuito se puede utilizar el hiperterminal de Windows.

El código fuente del ejecutable es el siguiente:

```
Option Explicit

Private Sub Caracter1_Click()
    If MSComm1.PortOpen = False Then
        MSComm1.PortOpen = True
    End If
    MSComm1.Output = "x"
End Sub

Private Sub Caracter2_Click()
    If MSComm1.PortOpen = False Then
        MSComm1.PortOpen = True
    End If
    MSComm1.Output = "a"
End Sub

Private Sub conectar_Click()
'comprueva que el puerto este cerrado para poder abrirlo
    If MSComm1.PortOpen = False Then
        'determina el puerto que hemos seleccionado.
        If COM_sel.ListIndex = 0 Then
            MSComm1.CommPort = 1
            End If
        If COM_sel.ListIndex = 1 Then
            MSComm1.CommPort = 2
            End If
        If COM_sel.ListIndex = 2 Then
            MSComm1.CommPort = 3
            End If
        If COM_sel.ListIndex = 3 Then
            MSComm1.CommPort = 4
            End If
        If COM_sel.ListIndex = 4 Then
            MSComm1.CommPort = 5
            End If
        If COM_sel.ListIndex = 5 Then
            MSComm1.CommPort = 6
            End If
        If COM_sel.ListIndex = 6 Then
            MSComm1.CommPort = 7
            End If
        If COM_sel.ListIndex = 7 Then
            MSComm1.CommPort = 8
            End If
        If COM_sel.ListIndex = 8 Then
            MSComm1.CommPort = 9
            End If
        If COM_sel.ListIndex = 9 Then
            MSComm1.CommPort = 10
            End If
        If COM_sel.ListIndex = 10 Then
            MSComm1.CommPort = 11
            End If
            End If
            
MSComm1.OutBufferSize = 1 'tamaño del dato a transmitir.
    MSComm1.InBufferSize = 23
    MSComm1.InputMode = comInputModeText 'los datos se recuperan en modo texto.
    MSComm1.InputLen = 23  ' Buffer de entrada.
    MSComm1.PortOpen = True
    MSComm1.RThreshold = 23 'son 23 caracteres.
End Sub

Private Sub Form_Load()
COM_sel.AddItem "COM1"
COM_sel.AddItem "COM2"
COM_sel.AddItem "COM3"
COM_sel.AddItem "COM4"
COM_sel.AddItem "COM5"
COM_sel.AddItem "COM6"
COM_sel.AddItem "COM7"
COM_sel.AddItem "COM8"
COM_sel.AddItem "COM9"
COM_sel.AddItem "COM10"
COM_sel.AddItem "COM11"
End Sub

Private Sub Form_Unload(Cancel As Integer)
If MSComm1.PortOpen = True Then
    MSComm1.PortOpen = False
End If
End Sub

Private Sub MSComm1_OnComm()
Dim InBuff As String
Select Case MSComm1.CommEvent
    Case comEvReceive
    InBuff = MSComm1.Input
    Debug.Print InBuff
    Texto.Text = ""
    Texto.Text = Left$(InBuff, 23)  ' se recorta los caracteres basura
    MSComm1.PortOpen = False  'cierra el puerto y vacia el buffer
End Select
End Sub
```
*Ejemplo y Actualización:

Manual USB - HID usando Visual C# *​


----------



## Meta (Dic 6, 2008)

Muy bueno amigo. 

¿Sabes manejar el Visual Basic .net?

Recomendable pasar al 2008, es lo mismo pero más actualizado.
http://microsoft.com/express/download


----------



## Moyano Jonathan (Dic 6, 2008)

meta , si tenés tiempo y ganas te pediría si por favor podrías pasar el ejecutable del programa para la pc a otro lenguaje como visual c# que es el que vos tenés más experiencia.


----------



## Moyano Jonathan (Dic 6, 2008)

El segundo  ejemplo establece una comunicación bidireccional con la PC, a través de la clase CDC. La diferencia con respecto al ejemplo anterior es que esta véz se controla un LED conectado al puerto B del PIC y también se detecta si el puerto usb está conectado o no indicándolo con un led.
También detecta cuando el host (pc) enumera al dispositivo (pic) encendiendo un LED verde , cuando el host no ha enumerado al pic prende un led rojo.


El firmware del PIC, lo he programado en C de CCS. (está lo más explicado posible)
el código es el siguiente: 

```
// Programa: 
/* Detecta si el host envía datos al PIC, mediante las 
   funciones:
    usb_enumerated()
    usb_cdc_kbhit()
    usb_cdc_getc()
    usb_cdc_connected()
*/

#include <18F2550.h> // Definición de registros internos.
#fuses HSPLL,MCLR,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN,NOPBADEN
// Fuses utilizados:
/*
HSPLL: utilizamos un cristal HS de alta velocidad, en conjunto con el PLL para generar los 48Mhz.
NOMCLR: Utilizamos reset por software.
NOWDT: No utilizamos el perro guardían.
NOPROTECT: Desactivamos la protección de código.
NOLVP: Desactivamos la programación a bajo voltaje.
NODEBUG: No entramos al modo debug.
USBDIV: signfica que el clock del usb se tomará del PLL/2 = 96Mhz/2 = 48Mhz.
PLL5: significa que el PLL prescaler dividirá en 5 la frecuencia del cristal. para HS = 20Mhz/5 = 4Mhz.
CPUDIV1: El PLL postscaler decide la división en 2 de la frecuencia de salida del PLL de 96MHZ, si queremos 48MHZ, lo dejamos como está.
VREGEN: habilita el regulador de 3.3 volts que usa el módulo USB.
NOPBADEN: No utilizamos las entradas analógicas del puerto B.
*/
#use delay(clock=48000000) // Frecuencia máxima de trabajo.
#include "usb_cdc.h" // Descripción de funciones del USB.
#include "usb_desc_cdc.h" // Descriptores del dispositivo USB.

// Programa principal.

void main() {
usb_cdc_init(); // Funciones necesarias para iniciar el módulo USB.
usb_init(); // Funciones necesarias para iniciar el módulo USB.
while(!usb_cdc_connected()) { // Mientras el USB no esté conectado.
output_high(PIN_B0); // Función USB no detectada. (Enciende LED rojo)
output_low(PIN_B1);  // (Apaga LED verde)
}
output_high(PIN_B1); // Función USB detectada.    (Enciende LED verde)
output_low(PIN_B0); //  (Apaga LED rojo)
do{
      usb_task();
      if (usb_enumerated()){ // Si el puerto ya fue enumerado por el host :
      output_high(PIN_B2); // Enciende led de enumeración_OK.
      if(usb_cdc_kbhit()){ // en espera de nuevo(s) caracter(es) en el buffer.
            if(usb_cdc_getc()=='a'){ // ¿lo que llegó fué el caracter a?
              output_toggle(PIN_B3); // bascula T implementada con la función output_toggle()
                   }
         }
      }
   }while (TRUE); // bucle eterno
}
```

Las librerías y el driver para el pic son las mismas que para el ejemplo anterior.

el código fuente del ejecutable para la pc:


```
Option Explicit
Dim value As Long
Dim bandera As Boolean
Private Sub enviar_Click()
    Timer1.Enabled = False
    If MSComm1.PortOpen = True Then
      MSComm1.Output = "a"
    End If
    Timer1.Enabled = True
End Sub
Private Sub conectar_Click()
'comprueva que el puerto este cerrado para poder abrirlo
    If MSComm1.PortOpen = False Then
        'determina el puerto que hemos seleccionado.
        If puerto.ListIndex = 0 Then
            MSComm1.CommPort = 1
            End If
        If puerto.ListIndex = 1 Then
            MSComm1.CommPort = 2
            End If
        If puerto.ListIndex = 2 Then
            MSComm1.CommPort = 3
            End If
        If puerto.ListIndex = 3 Then
            MSComm1.CommPort = 4
            End If
        If puerto.ListIndex = 4 Then
            MSComm1.CommPort = 5
            End If
        If puerto.ListIndex = 5 Then
            MSComm1.CommPort = 6
            End If
        If puerto.ListIndex = 6 Then
            MSComm1.CommPort = 7
            End If
        If puerto.ListIndex = 7 Then
            MSComm1.CommPort = 8
            End If
        If puerto.ListIndex = 8 Then
            MSComm1.CommPort = 9
            End If
        If puerto.ListIndex = 9 Then
            MSComm1.CommPort = 10
            End If
        If puerto.ListIndex = 10 Then
            MSComm1.CommPort = 11
            End If
            End If
            
MSComm1.OutBufferSize = 1 'tamaño del dato a transmitir.
    MSComm1.PortOpen = True
End Sub

Private Sub Form_Load()
puerto.AddItem "COM1" ' Añadimos diferentes numeraciones para el puerto serie.
puerto.AddItem "COM2"
puerto.AddItem "COM3"
puerto.AddItem "COM4"
puerto.AddItem "COM5"
puerto.AddItem "COM6"
puerto.AddItem "COM7"
puerto.AddItem "COM8"
puerto.AddItem "COM9"
puerto.AddItem "COM10"
puerto.AddItem "COM11"
puerto.ListIndex = 0   ' Configuramos COM1, como predeterminado.
Timer1.Interval = 50
Timer1.Enabled = True 'activamos el ciclo de escan.
End Sub
Private Sub Timer1_Timer()
On Error GoTo Tratamiento_errores
DoEvents
If MSComm1.PortOpen = True Then
    DoEvents
    estado.BackColor = &HFF00&
    Debug.Print "Conectado"
    MSComm1.PortOpen = False
    Exit Sub
Else
    DoEvents
    MSComm1.PortOpen = True
    Exit Sub
End If
Tratamiento_errores:  Debug.Print Err.Number & ": " & Err.Description
     Select Case Err.Number
        Case 8002   'Número de puerto no válido
            DoEvents
           estado.BackColor = &HFF&
        Case 8005 'el puerto ya está abierto
            DoEvents
            estado.BackColor = &HFF0000
        Case 8012 '8012 el dispositivo no está abierto
            DoEvents
            estado.BackColor = &HFF&
        Case 8015
            DoEvents    ' para evitar retardos en bucles
            estado.BackColor = &HFF&
    End Select
End Sub
Private Sub Form_Unload(Cancel As Integer)
If MSComm1.PortOpen = True Then
    MSComm1.PortOpen = False
End If 
End Sub
```


----------



## Meta (Dic 6, 2008)

Moyano Jonathan dijo:
			
		

> meta , si tenés tiempo y ganas te pediría si por favor podrías pasar el ejecutable del programa para la pc a otro lenguaje como visual c# que es el que vos tenés más experiencia.



No entiendo exactamente a que te refieres. *¿Te refieres que pase tu código fuente del Visual Basic al Visual C#?*

Esto podría ayudar.

http://www.developerfusion.com/tools/convert/csharp-to-vb/

EDITO:
Por fin información para aprender USB.


----------



## Moyano Jonathan (Dic 6, 2008)

> Muy bueno amigo.
> 
> ¿Sabes manejar el Visual Basic .net?
> 
> ...



No tengo dicho software pero googleando todo es posible


----------



## Moyano Jonathan (Dic 6, 2008)

y todavía hay más información sobre usb pero habrá que esperar que valla tragando toda la información recopilada y valla posteando los ejemplos. 
Con respecto de pasar de un leguaje a otro me queda estudiarme el tuto que hiciste de visual c y ver que sale.


----------



## Meta (Dic 6, 2008)

Tenemos previsto sacarlo de Visual C# al VBasic ,net 2008

Aquí consigues el visual basic 2008 .net
http://microsoft.com/express/download


----------



## Moyano Jonathan (Dic 6, 2008)

Ejemplo n° 3: 

Este ejemplo trata sobre conectar/desconectar  en caliente el dispositivo del host.

El firmware del pic es el del ejemplo n°2 al igual que las librerías, el esquema y el driver.

El código fuente del programa nuevo es el siguiente:


```
Private Sub conectar_Click()
'comprueva que el puerto este cerrado para poder abrirlo
    If MSComm1.PortOpen = False Then
        'determina el puerto que hemos seleccionado.
        If puerto.ListIndex = 0 Then
            MSComm1.CommPort = 1
            End If
        If puerto.ListIndex = 1 Then
            MSComm1.CommPort = 2
            End If
        If puerto.ListIndex = 2 Then
            MSComm1.CommPort = 3
            End If
        If puerto.ListIndex = 3 Then
            MSComm1.CommPort = 4
            End If
        If puerto.ListIndex = 4 Then
            MSComm1.CommPort = 5
            End If
        If puerto.ListIndex = 5 Then
            MSComm1.CommPort = 6
            End If
        If puerto.ListIndex = 6 Then
            MSComm1.CommPort = 7
            End If
        If puerto.ListIndex = 7 Then
            MSComm1.CommPort = 8
            End If
        If puerto.ListIndex = 8 Then
            MSComm1.CommPort = 9
            End If
        If puerto.ListIndex = 9 Then
            MSComm1.CommPort = 10
            End If
        If puerto.ListIndex = 10 Then
            MSComm1.CommPort = 11
            End If
            End If
            
MSComm1.OutBufferSize = 1 'tamaño del dato a transmitir.
MSComm1.PortOpen = True
End Sub

Private Sub Form_Load()
puerto.AddItem "COM1" ' Añadimos diferentes numeraciones para el puerto serie.
puerto.AddItem "COM2"
puerto.AddItem "COM3"
puerto.AddItem "COM4"
puerto.AddItem "COM5"
puerto.AddItem "COM6"
puerto.AddItem "COM7"
puerto.AddItem "COM8"
puerto.AddItem "COM9"
puerto.AddItem "COM10"
puerto.AddItem "COM11"
puerto.ListIndex = 0   ' Configuramos COM1, como predeterminado.
Timer1.Interval = 50
Timer1.Enabled = True 'activamos el ciclo de escan.
End Sub

Private Sub Form_Unload(Cancel As Integer)
    If MSComm1.PortOpen = True Then
        MSComm1.PortOpen = False
    End If
End Sub

Private Sub Timer1_Timer()
Dim a As String
On Error GoTo tratamiento_de_errores
DoEvents
If MSComm1.PortOpen = True Then
    DoEvents
    estado.BackColor = &HFF00&
    Debug.Print "Conectado"
    MSComm1.PortOpen = False
    Exit Sub
Else
    DoEvents
    MSComm1.PortOpen = True
    Exit Sub
End If
tratamiento_de_errores: Debug.Print Err.Number & ": " & Err.Description
     Select Case Err.Number
        Case 8002   'Número de puerto no válido
            DoEvents
           estado.BackColor = &HFF&
        Case 8005 'el puerto ya está abierto
            DoEvents
           estado.BackColor = &HFF0000
        Case 8012 '8012 el dispositivo no está abierto
            DoEvents
           estado.BackColor = &HFF&
        Case 8015
            DoEvents
            estado.BackColor = &HFF&
    End Select
      Exit Sub
End Sub
```

Lo que hace este código , es mirar continuamente el estado de la conexión usb: 
Si está conectado , prende un led  verde en el programa.
Si desconectamos el cable prende un led rojo. (los leds son los del programa) 

Espero que les sirva , cualquier cosa pregunten.


----------



## Moyano Jonathan (Dic 6, 2008)

ya me voy a descargar el vb 2008 .net y te pregunto dudas.

pd: estoy haciendo un programa de control de 8 relés por puerto usb utilizando lo aprendido en los 3 ejemplos anteriores.


----------



## Meta (Dic 6, 2008)

Ojo que no se Visual Basic.    

Pero si puedo pasarlo a C# buscando información. Si tienes dudas grandes, las puedes consultar aquí.

http://forums.microsoft.com/MSDN-ES/ShowForum.aspx?ForumID=303&SiteID=11

Muy bueno para aprender Visual Basic en el foro oficial.

PD: Lo de los 8 Relés es loq ue quiero hacer yo, ejejjeje. El manual que hice te da las ideas necesarias para hacer lo mismo pero en puerto serie.

https://www.forosdeelectronica.com/about29162.htmlhttps://www.forosdeelectronica.com/...ie-rs232-pic16f84a-controlado-visual-c-17414/

Saludos.


----------



## Moyano Jonathan (Dic 6, 2008)

ok , ahora veo de bajar el programa y para la semana que viene hago más ejemplos y posteo más información, ya que se me acaba la batería de la laptop y las ganas de escribir ejejej. Gracias por la información de vb y visual c ya me voy a poner con eso tambien. 

pd: se me rompió el soldador , que mala leche


----------



## Meta (Dic 7, 2008)

He visto los programas de Visual Basci y se parece a 6 en vez del VB .net 200x Express


----------



## wiilder (Dic 7, 2008)

El proyecto esta interesante salgo de mis últimos exámenes y me pongo a probarlo me gusta el tema si por favor puedes colgar información de la comunicación por USB te lo agradecería,  tratare de realizarlo con otros Pic y en lenguaje BASIC en unos días ya debo tener resultados.


----------



## Moyano Jonathan (Dic 7, 2008)

ok yo lo he probado solamente en c de ccs pero también lo podes probar con las librerias de microbasic


----------



## Moyano Jonathan (Dic 7, 2008)

ya voy a poner información más específica sobre el control por puerto usb , lo que pasa es que yo también estoy aprendiendo y cuesta sacarle la vuelta, pero de a poco lo estoy logrando . ahora estoy me estoy metiendo un poco más en el tema de saber que hacen las famosas librerías de control y como logran comunicarse con el host.


----------



## Moyano Jonathan (Dic 8, 2008)

> meta dijo:
> 
> No entiendo exactamente a que te refieres. ¿Te refieres que pase tu código fuente del Visual Basic al Visual C#?
> 
> ...



muy buena herramienta


----------



## Meta (Dic 8, 2008)

Moyano Jonathan dijo:
			
		

> > meta dijo:
> >
> > No entiendo exactamente a que te refieres. ¿Te refieres que pase tu código fuente del Visual Basic al Visual C#?
> >
> ...



Ojo, es para C# vs VB *.net*, no para VB 6.

EDITO:
Aquí hay otro de cambiar a Visual C# a Mono, no lo he probado pero voy a investigar a pasar el código a ver que tal.
http://www.mono-project.com/Moma


----------



## Meta (Dic 8, 2008)

Visual C#:

```
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO.Ports;

namespace PicRS232
{
    public partial class Form1_Principal : Form
    {
        public Form1_Principal()
        {
            InitializeComponent();
            // Abrir puerto mientra se ejecute la aplicación
            if (!serialPort1.IsOpen)
            {
                try
                {
                    serialPort1.Open();
                }
                catch (System.Exception ex)
                {
                    MessageBox.Show(ex.ToString());
                }
            }
        }

        private void button_t_Click(object sender, EventArgs e)
        {
            byte[] mBuffer = new byte[1];
            mBuffer[0] = 0x74; //ASCII letra "t".
            serialPort1.Write(mBuffer, 0, mBuffer.Length);
        }

        private void button_b_Click(object sender, EventArgs e)
        {
            byte[] miBuffer = new byte[1];
            miBuffer[0] = 0x62; //ASCII letra "b".
            serialPort1.Write(miBuffer, 0, miBuffer.Length);
        }

        private void button_a_Click(object sender, EventArgs e)
        {
            byte[] mBuffer = new byte[1];
            mBuffer[0] = 0x61; //ASCII letra "a".
            serialPort1.Write(mBuffer, 0, mBuffer.Length);
        }

        private void button_l_Click(object sender, EventArgs e)
        {
            byte[] mBuffer = new byte[1];
            mBuffer[0] = 0x6C; //ASCII letra "l".
            serialPort1.Write(mBuffer, 0, mBuffer.Length);
        }

        private void button_Espacio_Click(object sender, EventArgs e)
        {
            byte[] mBuffer = new byte[1];
            mBuffer[0] = 0x20; //ASCII letra "Espacio".
            serialPort1.Write(mBuffer, 0, mBuffer.Length);
        }
    }
}
```

Transformado a VS .net con http://www.developerfusion.com/tools/convert/csharp-to-vb/

```
* Imports System
    * Imports System.Collections.Generic
    * Imports System.ComponentModel
    * Imports System.Data
    * Imports System.Drawing
    * Imports System.Linq
    * Imports System.Text
    * Imports System.Windows.Forms
    * Imports System.IO.Ports
    *
    * Namespace PicRS232
    *     Public Partial Class Form1_Principal
    *         Inherits Form
    *         Public Sub New()
    *             InitializeComponent()
    *             ' Abrir puerto mientra se ejecute la aplicación
    *             If Not serialPort1.IsOpen Then
    *                 Try
    *                     serialPort1.Open()
    *                 Catch ex As System.Exception
    *                     MessageBox.Show(ex.ToString())
    *                 End Try
    *             End If
    *         End Sub
    *        
    *         Private Sub button_t_Click(ByVal sender As Object, ByVal e As EventArgs)
    *             Dim mBuffer As Byte() = New Byte(0) {}
    *             mBuffer(0) = &H74
    *             'ASCII letra "t".
    *             serialPort1.Write(mBuffer, 0, mBuffer.Length)
    *         End Sub
    *        
    *         Private Sub button_b_Click(ByVal sender As Object, ByVal e As EventArgs)
    *             Dim miBuffer As Byte() = New Byte(0) {}
    *             miBuffer(0) = &H62
    *             'ASCII letra "b".
    *             serialPort1.Write(miBuffer, 0, miBuffer.Length)
    *         End Sub
    *        
    *         Private Sub button_a_Click(ByVal sender As Object, ByVal e As EventArgs)
    *             Dim mBuffer As Byte() = New Byte(0) {}
    *             mBuffer(0) = &H61
    *             'ASCII letra "a".
    *             serialPort1.Write(mBuffer, 0, mBuffer.Length)
    *         End Sub
    *        
    *         Private Sub button_l_Click(ByVal sender As Object, ByVal e As EventArgs)
    *             Dim mBuffer As Byte() = New Byte(0) {}
    *             mBuffer(0) = &H6c
    *             'ASCII letra "l".
    *             serialPort1.Write(mBuffer, 0, mBuffer.Length)
    *         End Sub
    *        
    *         Private Sub button_Espacio_Click(ByVal sender As Object, ByVal e As EventArgs)
    *             Dim mBuffer As Byte() = New Byte(0) {}
    *             mBuffer(0) = &H20
    *             'ASCII letra "Espacio".
    *             serialPort1.Write(mBuffer, 0, mBuffer.Length)
    *         End Sub
    *     End Class
    * End Namespace
```


----------



## Moyano Jonathan (Dic 8, 2008)

Muchisimas gracias meta voy a revisar tu código. A ver como es la nueva forma de programar de vb.net ya que nunca lo he utilizado al igual que visual c (sharp). 

pd: Estoy preparando una explicación más detallada de lo que hacen las librerías de CDC (comunication device class) para que se le saque más provecho y ahora que estoy de vacaciones , le voy a meter mano a esto del USB. Tambíen estoy terminando con los toques finales al clon del pickit2 y a la placa de desarrollo para micros de 28 pines , que me parece que al final va estar enfocada más al PIC18F2550 que a otra cosa.


----------



## Moyano Jonathan (Dic 9, 2008)

Lo que vamos a experimentar ahora es la detección del host por parte del PIC18F2550. En el ejemplo anterior vimos como detectar la conexión por software. Lo que se va a hacer en este ejemplo es que el PIC detecte la conexión del host.

Esta es la primera parte de la información sobre las librerías.

Como dije antes también vamos a ver que pasa con las librerías de control.

Viendo el código que utilizamos en los diferentes ejemplos hasta ahora propuestos, vemos que hay una librería:

```
// Ejercicio Nº1: Genera un COM virtual y se comunica bidireccionalmente con el a través del PIC18F2550.
#include <18F2550.h> // Definición de registros internos.
#fuses HSPLL,NOMCLR,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN,NOPBADEN
// Fuses utilizados:
/*
HSPLL: utilizamos un cristal HS de alta velocidad, en conjunto con el PLL para generar los 48Mhz.
NOMCLR: Utilizamos reset por software, y dejamos el pin 1 del micro como entrada/salida digital.
NOWDT: No utilizamos el perro guardían.
NOPROTECT: Desactivamos la protección de código.
NOLVP: Desactivamos la programación a bajo voltaje.
NODEBUG: No entramos al modo debug.
USBDIV: signfica que el clock del usb se tomará del PLL/2 = 96Mhz/2 = 48Mhz.
PLL5: significa que el PLL prescaler dividirá en 5 la frecuencia del cristal. para HS = 20Mhz/5 = 4Mhz.
CPUDIV1: El PLL postscaler decide la división en 2 de la frecuencia de salida del PLL de 96MHZ, si queremos 48MHZ, lo dejamos como está.
VREGEN: habilita el regulador de 3.3 volts que usa el módulo USB
*/
#use delay(clock=48000000) // Frecuencia máxima de trabajo.
#include "usb_cdc.h" // Descripción de funciones del USB. (Librería que tenemos que ver)
```


La constante es el llamado al driver usb_cdc.h , pero esta a su vez llama a otras librerías.



```
/////////////////////////////////////////////////////////////////////////////
//
// Lo que hace esta parte es seleccionar la librería de control según el dispositivo que se haya seleccionado.
// por ejemplo si se pone: #include <18F2550.h> va a enlazar la librería: <pic18_usb.h> 
/////////////////////////////////////////////////////////////////////////////
#ifndef __USB_PIC_PERIF__
#define __USB_PIC_PERIF__	1
#endif

#if __USB_PIC_PERIF__
 #if defined(__PCM__)
  #error CDC Modo bulck requerido!  PIC16C7x5 solo puede comunicarse mediante HID (baja velocidad).
 #else
  #include <pic18_usb.h>   // Configuración de hardware para los PIC18Fxx5x
 #endif
#else
 #include <usbn960x.c>   // Configuración de hardware para los dispositivos National 960x
#endif
#include <usb_desc_cdc.h>	// Configuración y descriptores USB.
#include <usb.c>        // Tokens y handles usb.
```

Si observamos el código del ejemplo n°1,  hay unas funciones de inicialización que hay que llamar para poder empezar a transmitir datos, una de ellas es:

```
usb_init(); // Inicializamos hardware USB del PIC18F2550.
```


```
si buscamos que hace esa función en pic18_usb.h tenemos:

void usb_init(void) {
   usb_init_cs(); 

   do {
      usb_task();
   } while (usb_state != USB_STATE_POWERED); // Llama a las funciones anteriormente descriptas siempre y
}                                                                           // cuando el USB , este conectado.
```

Si nos metemos dentro de usb_task()

```
/*****************************************************************************
/* usb_task()
/*
/* Función: Mantiene un ojo puesto sobre el SENSE pin para saber si el cable usb está o no conectado.
/*               Si está conectado inicializa el periferico si es requerido. Si no está conectado el cable desactiva el
/*               puerto usb del PIC.
/* Nota:     Si el SENSE pin no es definido en la programación del pic, el hardware usb se inicializa de forma
/*               automática.
/*           
/* Nota:     Esta función también habilita las interrupciones si el hardware usb está conectado.
/*  
/*
/*****************************************************************************/
void usb_task(void) {
   if (usb_attached()) { // Si el pic está conectado al host........
```

Como podemos ver esta función es muy importante para el desarrollo de la comunicación pic - host.

En esta función vemos hablar de un tal * SENSE PIN * que tiene que ser definido para que a través de este pin se detecte la conexión del host.

En la función *usb_attached()*  se detallará la función del SENSE PIN. pero esto será en la 2° parte de la información.

Espero que les sirva.


----------



## Meta (Dic 9, 2008)

Ahora estoy en un curso, cuando llegue a mi casa examino tus códigos.

Que sepas que unos usuarios me están examinando el código del manual para optimizarlo y reutilización de códigos entre otras cosas. Cosa que incluiré en el manual.

Mucha gente me pide que lo pase a Visual Basic 6 y 2008, cosa que haré cuando acabe todo. Mestoy peleando con Linux de C# que no se que pasa que no me abre el puerto serie...


----------



## Moyano Jonathan (Dic 9, 2008)

estoy empezando a ver la programación en visual c# y estoy viendo la forma de migrar los ejemplos antes propuestos a este lenguje. meta sabés como se puede hacer para realizar estas funciones en visual c#:

El código es de visual basic 6.0:


```
Private Sub conectar_Click()
'comprueva que el puerto este cerrado para poder abrirlo
    If MSComm1.PortOpen = False Then
        'determina el puerto que hemos seleccionado.
        If COM_sel.ListIndex = 0 Then
            MSComm1.CommPort = 1
            End If
        If COM_sel.ListIndex = 1 Then
            MSComm1.CommPort = 2
            End If
        If COM_sel.ListIndex = 2 Then
            MSComm1.CommPort = 3
            End If
        If COM_sel.ListIndex = 3 Then
            MSComm1.CommPort = 4
            End If
        If COM_sel.ListIndex = 4 Then
            MSComm1.CommPort = 5
            End If
        If COM_sel.ListIndex = 5 Then
            MSComm1.CommPort = 6
            End If
        If COM_sel.ListIndex = 6 Then
            MSComm1.CommPort = 7
            End If
        If COM_sel.ListIndex = 7 Then
            MSComm1.CommPort = 8
            End If
        If COM_sel.ListIndex = 8 Then
            MSComm1.CommPort = 9
            End If
        If COM_sel.ListIndex = 9 Then
            MSComm1.CommPort = 10
            End If
        If COM_sel.ListIndex = 10 Then
            MSComm1.CommPort = 11
            End If
            End If
            
MSComm1.OutBufferSize = 1 'tamaño del dato a transmitir.
    MSComm1.InBufferSize = 23
    MSComm1.InputMode = comInputModeText 'los datos se recuperan en modo texto.
    MSComm1.InputLen = 23  ' BUFFER DE ENTRADA SE PUEDE DEJAR AL MAXIMO.
    MSComm1.PortOpen = True
    MSComm1.RThreshold = 23 'son 23 caracteres.
End Sub

Private Sub Form_Load()
COM_sel.AddItem "COM1"
COM_sel.AddItem "COM2"
COM_sel.AddItem "COM3"
COM_sel.AddItem "COM4"
COM_sel.AddItem "COM5"
COM_sel.AddItem "COM6"
COM_sel.AddItem "COM7"
COM_sel.AddItem "COM8"
COM_sel.AddItem "COM9"
COM_sel.AddItem "COM10"
COM_sel.AddItem "COM11"
COM_Sel.ListIndex = 0
End Sub

Private Sub MSComm1_OnComm()
Dim InBuff As String
Select Case MSComm1.CommEvent
    Case comEvReceive
    InBuff = MSComm1.Input
    Debug.Print InBuff
    Texto.Text = ""
    Texto.Text = Left$(InBuff, 23)  ' se recorta los caracteres basura
    MSComm1.PortOpen = False  'cierra el puerto y vacia el buffer
End Select
End Sub
```


----------



## Meta (Dic 9, 2008)

Sigo estando en clase, le hecharé un ojo, pero en el VB6 no lo entiendo, solo algunas cosa, mientras tanto aquí lo puse por si hay ayuda de ellos.

http://foros.elguille.información/Mensajes.aspx?ID=46028

http://forums.microsoft.com/MSDN-ES/ShowPost.aspx?PostID=4227073&SiteID=11&mode=1

Con el tiempo te responderán, aún así le hecho un vistaso. Te hablo porque en estos momentos el profesor no está.

Suerte.  

EDITO:
http://foro.elhacker.net/programacion_vb/pasar_de_vb6_a_c_yo_vb_net-t237914.0.html

http://foros.solocodigo.com/viewtopic.php?f=53&t=37799

http://www.forosdelweb.com/f79/pasar-vb6-c-vb-net-652474/#post2698550


----------



## Moyano Jonathan (Dic 9, 2008)

ok me fijo en lo que pusiste y te digo. En Vb lo entiendo en visual c# estoy en la pag 135 de tu tuto y estoy viendo como es la programación . Luego te pregunto así no te molesto.


----------



## Meta (Dic 9, 2008)

Jamás me molestas. Sólo que no conozco el VB6 y me quedo pescando...  

Veo que vas demasiado rápdio en el manual, ya en 135.

Visual Basic .net

```
Dim mBuffer As Byte() = New Byte(0) {} 
mBuffer(0) = &H74 'ASCII letra "t". 
serialPort1.Write(mBuffer, 0, mBuffer.Length);
```

Saludo.

PD: He puesto más enlace aquí.


----------



## Meta (Dic 9, 2008)

*Por cierto.  ¿Qué versión del manual tienes?

La actual es la Versión 1.1, comprueba en la página 472. Ya que la v1.1 se han corregidos faltas de ortorgrafías, errores tontos y sobre todo, se incluye enlace de cada ejemplo del Visual C#.*

Ver manuales.


----------



## Moyano Jonathan (Dic 9, 2008)

Dale meta ya me fijo en las correcciones que hiciste. Termine el proyecto del control de 8 relé por puerto USB. Lo que si voy a tener que hacer es ver la forma de optimizar el código ya que funciona pero de una manera muy lenta, es decir por ejemplo , cuando al pic le ordeno que prenda un relé apretando un botón en la aplicación no lo hace de forma inmediata, sino que tengo que realizar la acción de apretar el botón repetidas veces hasta que responde. (no se bien a que se debe el problema).

Acá esta el fuente del PIC y el código fuente de VB 6.0


```
// Programa de control de 8 relés por puerto USB, utilizando el PIC18F2550 y la clase CDC.
// Versión: 1.0 Fecha: 9/12/08.
// Programador: Moyano Jonathan.
//****************************************************************************************

// Definiciones varias.

#include <18F2550.h> // Definición de registros internos.
#fuses HSPLL,MCLR,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN,NOPBADEN
// Fuses utilizados:
/*
HSPLL: utilizamos un cristal HS de alta velocidad, en conjunto con el PLL para generar los 48Mhz.
MCLR: Utilizamos reset por hardware.
NOWDT: No utilizamos el perro guardían.
NOPROTECT: Desactivamos la protección de código.
NOLVP: Desactivamos la programación a bajo voltaje.
NODEBUG: No entramos al modo debug.
USBDIV: signfica que el clock del usb se tomará del PLL/2 = 96Mhz/2 = 48Mhz.
PLL5: significa que el PLL prescaler dividirá en 5 la frecuencia del cristal. para HS = 20Mhz/5 = 4Mhz.
CPUDIV1: El PLL postscaler decide la división en 2 de la frecuencia de salida del PLL de 96MHZ, si queremos 48MHZ, lo dejamos como está.
VREGEN: habilita el regulador de 3.3 volts que usa el módulo USB.
NOPBADEN: No utilizaremos el módulo de entradas análógicas del puerto B.
*/
#use delay(clock=48000000) // Frecuencia máxima de trabajo 48 Mhz.
#include "usb_cdc.h" // Descripción de funciones del USB.
#include "usb_desc_cdc.h" // Descriptores del dispositivo USB.

// Funciones que indican el estado de la  conexión usb.
void usb_conectado(void) {
output_high(PIN_A0);
output_low(PIN_A1);
}
void usb_desconectado(void) {
output_high(PIN_A1);
output_low(PIN_A0);
}
void usb_enumerado(void) {
output_high(PIN_A2);
}

// Programa principal:

void main() {
set_tris_a(0x00); // Configura al puerto A y al puerto B como salida.
set_tris_b(0x00);

// Configuraciones varias.
setup_adc_ports(NO_ANALOGS|VSS_VDD);
   setup_adc(ADC_OFF);
   setup_spi(SPI_SS_DISABLED);
   setup_wdt(WDT_OFF);
   setup_timer_0(RTCC_INTERNAL);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_timer_3(T3_DISABLED|T3_DIV_BY_1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);

// Iniciamos el USB.
usb_cdc_init(); // Funciones necesarias para iniciar el módulo USB.
usb_init(); // Funciones necesarias para iniciar el módulo USB.
while(!usb_cdc_connected()) { // Mientras el USB no esté conectado.
usb_desconectado();
}
usb_conectado();
do{
usb_task();
      if (usb_enumerated()){ // Si el puerto ya fue enumerado por el host :
      usb_enumerado(); // Enciende led de enumeración_OK.
      if(usb_cdc_kbhit()){ // en espera de nuevo(s) caracter(es) en el buffer.
        if(usb_cdc_getc()=='1'){ // ¿lo que llegó fué el caracter 1?
              output_toggle(PIN_B0); // Conmuta el estado del relé 1.
                   }
        if(usb_cdc_getc()=='2'){ // ¿lo que llegó fué el caracter 2?
              output_toggle(PIN_B1); // Conmuta el estado del relé 2.
                   }
        if(usb_cdc_getc()=='3'){ // ¿lo que llegó fué el caracter 3?
              output_toggle(PIN_B2); // Conmuta el estado del relé 3.
                   }
        if(usb_cdc_getc()=='4'){ // ¿lo que llegó fué el caracter 4?
              output_toggle(PIN_B3); // Conmuta el estado del relé 4.
                   }
        if(usb_cdc_getc()=='5'){ // ¿lo que llegó fué el caracter 5?
              output_toggle(PIN_B4); // Conmuta el estado del relé 5.
                   }
        if(usb_cdc_getc()=='6'){ // ¿lo que llegó fué el caracter 6?
              output_toggle(PIN_B5); // Conmuta el estado del relé 6.
                   }
        if(usb_cdc_getc()=='7'){ // ¿lo que llegó fué el caracter 7?
              output_toggle(PIN_B6); // Conmuta el estado del relé 7.
                   }
        if(usb_cdc_getc()=='8'){ // ¿lo que llegó fué el caracter 8?
              output_toggle(PIN_B7); // Conmuta el estado del relé 8.
                   }
           }
      }
   }while (TRUE); // bucle eterno
}
```

Las librerías usadas son las que ya usabamos anteriormente, al igual que el driver para windows.

El código fuente del programa para la pc es el siguiente.


```
Private Sub Form_Load()
MsgBox "PROGRAMA CREADO POR: Moyano Jonathan para Foros de electrónica"
Puerto.AddItem "COM1" ' Añadimos diferentes numeraciones para el puerto serie.
Puerto.AddItem "COM2"
Puerto.AddItem "COM3"
Puerto.AddItem "COM4"
Puerto.AddItem "COM5"
Puerto.AddItem "COM6"
Puerto.AddItem "COM7"
Puerto.AddItem "COM8"
Puerto.AddItem "COM9"
Puerto.AddItem "COM10"
Puerto.AddItem "COM11"
Puerto.ListIndex = 0   ' Configuramos COM1, como predeterminado.
Timer1.Interval = 50
Timer1.Enabled = True 'activamos el ciclo de escaneno del puerto.
evento.Text = "Seleccione un puerto y haga click en conectar."
End Sub
Private Sub conectar_Click()
'comprueva que el puerto este cerrado para poder abrirlo.
    If MSComm1.PortOpen = False Then
        'determina el puerto que hemos seleccionado.
        If Puerto.ListIndex = 0 Then
            MSComm1.CommPort = 1
            End If
        If Puerto.ListIndex = 1 Then
            MSComm1.CommPort = 2
            End If
        If Puerto.ListIndex = 2 Then
            MSComm1.CommPort = 3
            End If
        If Puerto.ListIndex = 3 Then
            MSComm1.CommPort = 4
            End If
        If Puerto.ListIndex = 4 Then
            MSComm1.CommPort = 5
            End If
        If Puerto.ListIndex = 5 Then
            MSComm1.CommPort = 6
            End If
        If Puerto.ListIndex = 6 Then
            MSComm1.CommPort = 7
            End If
        If Puerto.ListIndex = 7 Then
            MSComm1.CommPort = 8
            End If
        If Puerto.ListIndex = 8 Then
            MSComm1.CommPort = 9
            End If
        If Puerto.ListIndex = 9 Then
            MSComm1.CommPort = 10
            End If
        If Puerto.ListIndex = 10 Then
            MSComm1.CommPort = 11
            End If
            End If
            
    MSComm1.OutBufferSize = 1 'tamaño del dato a transmitir.
    MSComm1.InBufferSize = 23
    MSComm1.InputMode = comInputModeText 'Los datos se recuperan en modo texto.
    MSComm1.InputLen = 23  ' Buffer de entrada de 23 bytes (caracteres).
    MSComm1.PortOpen = True
    evento.Text = "Se ha conectado al puerto: COM" & MSComm1.CommPort
    MSComm1.RThreshold = 23 'Son 23 caracteres.
End Sub
Private Sub rele1_Click()
Timer1.Enabled = False
If MSComm1.PortOpen = True Then
If rele1.BackColor = &H8000000F Then
rele1.BackColor = &HFF00&
MSComm1.Output = "1"
evento.Text = "Se ha activado el relé N°1."
Else
rele1.BackColor = &H8000000F
MSComm1.Output = "1"
evento.Text = "Se ha desactivado el relé N°1."
End If
End If
Timer1.Enabled = True
End Sub
Private Sub rele2_Click()
Timer1.Enabled = False
If MSComm1.PortOpen = True Then
If rele2.BackColor = &H8000000F Then
rele2.BackColor = &HFF00&
MSComm1.Output = "2"
evento.Text = "Se ha activado el relé N°2."
Else
rele2.BackColor = &H8000000F
MSComm1.Output = "2"
evento.Text = "Se ha desactivado el relé N°2."
End If
End If
Timer1.Enabled = True
End Sub
Private Sub rele3_Click()
Timer1.Enabled = False
If MSComm1.PortOpen = True Then
If rele3.BackColor = &H8000000F Then
rele3.BackColor = &HFF00&
MSComm1.Output = "3"
evento.Text = "Se ha activado el relé N°3."
Else
rele3.BackColor = &H8000000F
MSComm1.Output = "3"
evento.Text = "Se ha desactivado el relé N°3."
End If
End If
Timer1.Enabled = True
End Sub
Private Sub rele4_Click()
Timer1.Enabled = False
If MSComm1.PortOpen = True Then
If rele4.BackColor = &H8000000F Then
rele4.BackColor = &HFF00&
MSComm1.Output = "4"
evento.Text = "Se ha activado el relé N°4."
Else
rele4.BackColor = &H8000000F
MSComm1.Output = "4"
evento.Text = "Se ha desactivado el relé N°4."
End If
End If
Timer1.Enabled = True
End Sub
Private Sub rele5_Click()
Timer1.Enabled = False
If MSComm1.PortOpen = True Then
If rele5.BackColor = &H8000000F Then
rele5.BackColor = &HFF00&
MSComm1.Output = "5"
evento.Text = "Se ha activado el relé N°5."
Else
rele5.BackColor = &H8000000F
MSComm1.Output = "5"
evento.Text = "Se ha desactivado el relé N°5."
End If
End If
Timer1.Enabled = True
End Sub
Private Sub rele6_Click()
Timer1.Enabled = False
If MSComm1.PortOpen = True Then
If rele6.BackColor = &H8000000F Then
rele6.BackColor = &HFF00&
MSComm1.Output = "6"
evento.Text = "Se ha activado el relé N°6."
Else
rele6.BackColor = &H8000000F
MSComm1.Output = "6"
evento.Text = "Se ha desactivado el relé N°6."
End If
End If
Timer1.Enabled = True
End Sub
Private Sub rele7_Click()
Timer1.Enabled = False
If MSComm1.PortOpen = True Then
If rele7.BackColor = &H8000000F Then
rele7.BackColor = &HFF00&
MSComm1.Output = "7"
evento.Text = "Se ha activado el relé N°7."
Else
rele7.BackColor = &H8000000F
MSComm1.Output = "7"
evento.Text = "Se ha desactivado el relé N°7."
End If
End If
Timer1.Enabled = True
End Sub
Private Sub rele8_Click()
Timer1.Enabled = False
If MSComm1.PortOpen = True Then
If rele8.BackColor = &H8000000F Then
rele8.BackColor = &HFF00&
MSComm1.Output = "8"
evento.Text = "Se ha activado el relé N°8."
Else
rele8.BackColor = &H8000000F
MSComm1.Output = "8"
evento.Text = "Se ha desactivado el relé N°8."
End If
End If
Timer1.Enabled = True
End Sub

Private Sub Timer1_Timer()
Dim a As String
On Error GoTo tratamiento_de_errores
DoEvents
If MSComm1.PortOpen = True Then
    DoEvents
    estado_grafico.BackColor = &HFF00&
    estado.Caption = "CONECTADO"
    Debug.Print "Conectado"
    MSComm1.PortOpen = False
    Exit Sub
Else
    DoEvents
    MSComm1.PortOpen = True
    Exit Sub
End If
tratamiento_de_errores: Debug.Print Err.Number & ": " & Err.Description
     Select Case Err.Number
        Case 8002   'Número de puerto no válido
            DoEvents
           estado_grafico.BackColor = &HFF&
           estado.Caption = "DESCONECTADO"
           evento.Text = "Número de puerto no válido"
        Case 8005 'el puerto ya está abierto
            DoEvents
           estado.BackColor = &HFF0000
           estado.Caption = ""
           evento.Text = "El puerto ya está abierto."
        Case 8012 '8012 el dispositivo no está abierto
            DoEvents
           estado.BackColor = &HFF&
           estado.Caption = "DESCONECTADO"
           evento.Text = "El puerto no está abierto."
        Case 8015
            DoEvents
            estado.BackColor = &HFF&
            estado.Caption = "DESCONECTADO"
    End Select
      Exit Sub
End Sub
Private Sub Form_Unload(Cancel As Integer)
    If MSComm1.PortOpen = True Then
        MSComm1.PortOpen = False
    End If
End Sub
Private Sub MSComm1_OnComm()
Dim InBuff As String
Select Case MSComm1.CommEvent
    Case comEvReceive
    InBuff = MSComm1.Input
    Debug.Print InBuff
   evento.Text = ""
   evento.Text = Left$(InBuff, 23)  ' Se recortan los caracteres basura.
    MSComm1.PortOpen = False  'Cierra el puerto y vacia el buffer.
End Select
End Sub
```

* Meta lo de no molestarte era no molestarte en clase *


----------



## Moyano Jonathan (Dic 9, 2008)

Gracias por ayudarme a pasar el código fuente de los progamas a otros lenguajes.


----------



## Meta (Dic 9, 2008)

¿Cuántas veces tienes que pulsar el botón para que te haga caso el USB?

Veo que vas progresando, ahora estoy con openSUSE 11.0    Luego pruebo tu aplicación.

Prueba con esto para que envía varias veces el mismo byte con un solo pulso del botón.

```
Dim mBuffer As Byte() = New Byte(10) {}
mBuffer(0) = &H74 'ASCII letra "t".
mBuffer(1) = &H74 'ASCII letra "t".
mBuffer(2) = &H74 'ASCII letra "t".
mBuffer(3) = &H74 'ASCII letra "t".
mBuffer(4) = &H74 'ASCII letra "t".
mBuffer(5) = &H74 'ASCII letra "t".
mBuffer(6) = &H74 'ASCII letra "t".
mBuffer(7) = &H74 'ASCII letra "t".
mBuffer(8) = &H74 'ASCII letra "t".
mBuffer(9) = &H74 'ASCII letra "t".
serialPort1.Write(mBuffer, 0, mBuffer.Length);
```

Si te funciona a la primera así me avisas, y si no también.


----------



## Moyano Jonathan (Dic 9, 2008)

dale meta , esto del usb me tiene trabajando a full, veo que el código es para visual basic.net así que me voy a tener que migrar a ese lenguaje nomás  a ver como me arreglo jejej . gracias por todo.

por los menos unas 6 veces, a veces me hace caso ahi nomas , pero es muy lento en la ejecución voy a ver como lo arreglo.

dependo casi exclusivamente de que te respondan en los foros donde has posteado los ejemplos en vb 6.0 así la migración del código va a ser directa


----------



## Meta (Dic 9, 2008)

Prueba con Visual Basic .net 2008, quizás ya no tengas que actualizar desde cero con el .net si ya tienes el Visual C# ya instalado. Al menos tienes los dos.

El VB 6 cada vez notarás que está más obsoleto porque viene tecnologías nuevas y puertos nuevos, aparecerá el USB 3 dentro de no se cuando y no se si será compatible, al menos en Visual Basic .net 201x cuando salga si.

PD: Veo que tendré que acostumbrarme al Visual Basic también y no tengo ni idea de manejarlo.


----------



## Moyano Jonathan (Dic 9, 2008)

lo del usb 3.0 va a ser algo fuera de orbita estuve viendo las velocidades q va alcanzar y son enormes........ = no compatible con pic por lo menos hasta dentro de 15 años min...

fuera de eso me baje un programa que se llama easyHID y lo que hace es generarme toda la programación del pic y visual basic 6.0 para comunicarme con el protocolo hid programando en proton basic compiler para el pic y visual basic 6.0 para pc.......... eso será otro rollo.


----------



## Meta (Dic 9, 2008)

A parte del USB 3, van a sacar el USB 4 a medio corto plazo. No tardarán mucho por no se que historia.

He leído por ahí que www.microchip.com y demás µC se va a incluir el USB 3.0 como ocurre con USB 2.0 en 18Fx550 y otros PIC.

PD: _Todavía no doy palo en abrir un puerto serie con monoDevelop en openSUSE 11.0. Estoy armando una que no veas. Dejo el código fuente aquí por si algún visitante sabe y nos ayuda._

_Me estoy llenvado por este enlace pero que va:_
http://www.mono-project.com/HowToSystemIOPorts


```
// MainWindow.cs created with MonoDevelop
// User: metaconta at 23:01 08/12/2008
//
// To change standard headers go to Edit->Preferences->Coding->Standard Headers
//
using System;
using Gtk;
using System.IO.Ports; // Añadir este using.

public partial class MainWindow: Gtk.Window
{	
	private SerialPort miSerie; // miSerie.

	public MainWindow (): base (Gtk.WindowType.Toplevel)
	{
		Build ();
		
		//serialPort1 = new SerialPort("/dev/ttyS0",9600, Parity.None, 8, StopBits.Two);
		  miSerie = new SerialPort("/dev/ttyS0",9600, Parity.None, 8, StopBits.Two);
		
		// Abrir puerto mientra se ejecute la aplicación
            if (!miSerie.IsOpen)
            {
                try
                {
                    miSerie.Open();
                }
                catch (System.Exception ex)
                {
                   // MessageBox.Show(ex.ToString());
				   // label1.Text = ex.ToString();
				    entry1.Text = ex.ToString();
                }
            } 
	}
	
	protected void OnDeleteEvent (object sender, DeleteEventArgs a)
	{
		Application.Quit ();
		a.RetVal = true;
	}

	protected virtual void OnButtonTClicked (object sender, System.EventArgs e)
	{ 
		    byte[] mBuffer = new byte[1];
            mBuffer[0] = 0x74; //ASCII letra "t".
            miSerie.Write(mBuffer, 0, mBuffer.Length);
	}

	protected virtual void OnButtonBClicked (object sender, System.EventArgs e)
	{
		    byte[] miBuffer = new byte[1];
            miBuffer[0] = 0x62; //ASCII letra "b".
            miSerie.Write(miBuffer, 0, miBuffer.Length);
	}

	protected virtual void OnButtonAClicked (object sender, System.EventArgs e)
	{
		    byte[] mBuffer = new byte[1];
            mBuffer[0] = 0x61; //ASCII letra "a".
            miSerie.Write(mBuffer, 0, mBuffer.Length);
	}

	protected virtual void OnButtonLClicked (object sender, System.EventArgs e)
	{
		    byte[] mBuffer = new byte[1];
            mBuffer[0] = 0x6C; //ASCII letra "l".
            miSerie.Write(mBuffer, 0, mBuffer.Length);
	}

	protected virtual void OnButtonEspacioClicked (object sender, System.EventArgs e)
	{
		    byte[] mBuffer = new byte[1];
            mBuffer[0] = 0x20; //ASCII letra "Espacio".
            miSerie.Write(mBuffer, 0, mBuffer.Length);
	}
}
```

_Al pulsar el botón cualquiera, em dice este error._


> Exception in Gtk# callback delegate
> Note: Applications can use GLib.ExceptionManager.UnhandledException to handle the exception.
> System.IO.IOException: I/O Error
> at System.IO.Ports.SerialPortStream..ctor (System.String portName, Int32 baudRate, Int32 dataBits, Parity parity, StopBits stopBits, Boolean dtrEnable, Boolean rtsEnable, Handshake handshake, Int32 readTimeout, Int32 writeTimeout, Int32 readBufferSize, Int32 writeBufferSize) [0x00075] in /usr/src/packages/BUILD/mono-1.9.1/mcs/class/System/System.IO.Ports/SerialPortStream.cs:49
> ...


----------



## Moyano Jonathan (Dic 9, 2008)

Di una mirada rápida al código que pusiste y no logro entender por que no te podés comunicar   

ya el sueño me está haciendo ver puertos usb y códigos en el aire así que mañana sigo con todo el rollo del usb y veo si sigo viendo el manual que escribiste meta. La verdad me he dado cuenta que nosotros dos nada más estamos participando, me gustaría que alguien más de su opinión. Mañana espero poder postear los esquemas con los diferentes circuitos para hacer las pruebas.

PD: espero poder postear todo lo referente al pickit2


----------



## Moyano Jonathan (Dic 10, 2008)

Bueno sigamos con la parte 2 del tema de la detección por parte del pic de la conexión del host.

Bueno veamos que hace la función *usb_attached()*


```
/******************************************************************************
/* usb_attached()
/*
/* Función: Regresa un 1 lógico si el puerto usb está conectado.
/*
/*****************************************************************************/
#if USB_CON_SENSE_PIN // Si el pin_Sense está definido..
 #define usb_attached() input(USB_CON_SENSE_PIN) // Define a la función usb_attached() = pin_sense = 1
#else // sino se definio el pin_sense.
 #define usb_attached() TRUE  // Define que el puerto usb igual está conectado, aunque (en realidad no sabe).
#endif
```


Entonces el * SENSE_PIN * lo que hace es detectar la conexión del host por hardware, puntualmente detecta el voltaje del puerto usb (VUSB), como lo muestra en la siguiente figura:


```
/////////////////////////////////////////////////////////////////////////////
//
// Si vas a usar el sense_pin definilo acá.  si no lo vas a usar salta el comentario.
// " Sin el pin (sense_pin) , no vas a saber si el dispositivo se ha desconectado del usb.
// 
//       La conexión a realizar es la siguiente:
//
//                             100k
//            VBUS-----+----/\/\/\/\/\----- (I/O PIN ON PIC)
//                     |
//                     +----/\/\/\/\/\-----GND
//                             100k
//
//        (Donde VBUS, es el pin 1 del puerto USB)
//
/////////////////////////////////////////////////////////////////////////////
#define USB_CON_SENSE_PIN PIN_B2  // RB2 definido como sense_pin.

En la función usb_attached() , me decía que si yo definía este pin. El dispositivo "sabría" cuando yo me conecto
o no al puerto usb.
```


en los ejemplos también verán esto:

```
while(!usb_cdc_connected()){
}
```

Esta función entra en bucle infinito hasta que el usb es conectado, pero como hace el host para reconocer esa 
función aún dentro de ese bucle. ?

Bien la respuesta está en las *Servicios de interrupciones del usb (SRI) *, que son 2  y cuando se detecta la función se ejecuta uno de ellos.
Veamos el código de más abajo.


```
enable_interrupts(INT_USB);
    enable_interrupts(GLOBAL);
    UIE=__USB_UIF_IDLE | __USB_UIF_RESET;  // Habilita las interrupciones IDLE and RESET.
    usb_state=USB_STATE_POWERED;

/***************************************************************************/

 usb_isr_rst() -> para el flag __USB_UIF_RESET
 usb_isr_uidle() -> para el flag __USB_UIF_IDLE

estas interrupciones de alguna manera me detectan la función y por lo tanto la conexión.
```

Viendo la definición para la función usb_task():

If you use connection sense, and the usb_init_cs() for initialization, then you must periodically call this function to keep an eye on the connection sense pin.
When the PIC is connected to the BUS, this function will then perpare the USB peripheral.  When the PIC is disconnected from the BUS, it will reset the USB stack and peripheral.  Will enable and use the USB interrupt.  
Note: In your application you must define USB_CON_SENSE_PIN to the connection sense pin.

que traducido a criollo   sería:

Si usted usa el pin_sense, y la función usb_init_cs() para la inicialización, luego tendra que mantener puesto un ojo en el pin de sensado de conexión.
Cuando el pic es conectado al puerto usb, la función prepara el periférico usb. Cuando el pic es desconectado
del puerto usb, la función resetea el stack usb y resetea el periférico. Luego habilita las interrupciones del usb hasta que se detecte una nueva conexión.

bueno a la traducción le añadí un par de cosas para que se entendiera   

Viendo en los ejemplos de comunicación con el puerto usb:

```
usb_cdc_init(); // Configuramos al puerto virtual.
```

esta función literalmente , es la que me configura el puerto serie virtual:


```
void usb_cdc_init(void) {
   usb_cdc_line_coding.dwDTERrate=9600; // Velocidad de comunicación: 9.6kbps
   usb_cdc_line_coding.bCharFormat=0;     //  formato de los bits ----?
   usb_cdc_line_coding.bParityType=0;      //  Paridad = none.
   usb_cdc_line_coding.bDataBits=8;        //  8 bits de datos.
   (int8)usb_cdc_carrier=0;                       // Activa la comprobación de carro.
   usb_cdc_got_set_line_coding=FALSE;
   usb_cdc_break=0;
   usb_cdc_put_buffer_nextin=0;
   usb_cdc_get_buffer_status.got=0;
   usb_cdc_put_buffer_free=TRUE;
}
```


Luego de que el pic haya detectado por hardware la conexión con el host, limpia el flag de interrupciones del puerto usb y activa nuevamente las interrupciones, como lo muestra el siguiente código:


```
if ((usb_state == USB_STATE_ATTACHED)&&(!UCON_SE0)) {
 UIR=0;
 UIE=0;
 enable_interrupts(INT_USB);
 enable_interrupts(GLOBAL);
 UIE=__USB_UIF_IDLE | __USB_UIF_RESET;  //enable IDLE and RESET USB interrupt
 usb_state=USB_STATE_POWERED;
 debug_usb(debug_putc, "\r\n\nUSB TASK: POWERED");
```

bueno hasta acá llega la parte 2 , me faltan algunas cosas más para definir con respecto a las interrupciones pero eso será en la parte 3.   

espero les sirva.


----------



## Moyano Jonathan (Dic 10, 2008)

He visto algunas empresas que trabajan con microcontroladores pic que ofrecen drivers customizados para trabajar con usb bajo software.......... es decir simulan un puerto usb para los pic's que no lo tienen.

deber ocupar algo de ram del micro......................y funcionar con la más bajas de las velocidades (HID)


----------



## Meta (Dic 10, 2008)

Muy buena, cada vez te veo con más código.

Para que lo sepas, he encontrado esta noticia sobre Visual Basic 2008

http://www.fcharte.com/Default.asp?noticias&todas


----------



## Moyano Jonathan (Dic 11, 2008)

voy a ver si consigo más información sobre ese libro a ver si lo puedo llegar a comprar aunque estoy con el tema de que me tengo que comprar un lcd 4 x 20 caracteres y no llego con la plata....

bueno el tema es que cada vez más se avanza en el desarrollo del puerto usb y hasta ahora los únicos que hemos participado somos nosotros ¿?¿? . 

pd: Aporten sus ideas ........

meta : gracias por ayudarme con en el tema de la programación de la pc.

voy a ver si hoy reviso todos los post de usb que he hecho corrijo los errores y añado alguna cosita más


----------



## ars (Dic 11, 2008)

YO hace mucho que no toco nada por los estudios de la facultad, que encima hasta dentro de 2 años minino no veré nada de electrónica, pero en la próxima semana que ya entro en las vacaciones me toca empezar a jugar con la electrónica a ver si me puedo meter con esto del uso del USB con los pic que es algo que me entusiasmo bastante. En especial yo lo estaré haciendo para linux, aunque con lo que tengo pensado usar sera fácilmente portable a windows.


----------



## Moyano Jonathan (Dic 11, 2008)

Cualquier cosa que necesites , acá estamos. Si necesitas ayuda con algo de programación para el pic y para la pc lo vemos juntos y a ver que sale de todo esto.


----------



## Moyano Jonathan (Dic 11, 2008)

Bueno acá vengo con la parte 3 del ejemplo de detección por parte del pic de la conexión del host.

luego de que vimos que hacía la función *usb_attached()*, queda ver que hace el pic cuando lo desconectamos del host. Vueno lo que hace es entrar nuevamente en ese bucle infinito 
	
	



```
while(!usb_cdc_connected())
```
.

Viendo las siguientes líneas:

UIE=__USB_UIF_IDLE | __USB_UIF_RESET;  // Habilita las interrupciones IDLE and RESET.


tenemos unos defines:

#define __USB_UIF_IDLE     0x10 -> bit 4
#define __USB_UIF_RESET    0x01 ->  bit 0

Si vemos en el datashet del PIC18F2550:

Las 2 banderas de las 2 interrupciones antes vistas * IDLE y RESET * registro *UIR*

```
bit 0 URSTIF: USB Reset Interrupt bit
                    1 = Valid USB Reset occurred; 00h is loaded into UADDR register
                    0 = No USB Reset has occurred
bit 4 IDLEIF: Idle Detect Interrupt bit(1)
                    1 = Idle condition detected (constant Idle state of 3 ms or more)
                    0 = No Idle condition detected
```
 
Y las habilitaciones de las 2 interrupciones en el registro *UIE*


```
bit 0 URSTIE: USB Reset Interrupt Enable bit
                     1 = USB Reset interrupt enabled
                     0 = USB Reset interrupt disabled
bit 4 IDLEIE: Idle Detect Interrupt Enable bit
                     1 = Idle detect interrupt enabled
                     0 = Idle detect interrupt disabled
```

Con este par de bits lo que hacemos es seleccionar el par USB Reset Interrupt y Idle Detect Interrupt Enable bit.

Ahora nos vamos a la descripción de lo que hacen esas 2 interrupciones:


```
/*******************************************************************************
/* usb_isr_rst() // USB Reset Interrupt.
/*
/* Summary: El host nos envía una señal de reset al dispositivo.  Resetea el periférico USB del pic y
/*                  pone el flag de la interrupción en su estado inicial.
/*
/********************************************************************************/

Para el estado IDLE:
/*******************************************************************************
/* usb_isr_uidle()
/*
/* Summary: Periferico USB no utilizado (desconectado del host).  Pone el periférico en modo slepp.
/*
/********************************************************************************/
```

Entonces vemos que ambos casos sirven para detectar el estado HOST<->PIC.

Pero luego de hacer un par de pruebas vi que era más facil detectar el estado de conexión con el host por otro lado: usando la función *usb_task()*

Vamos a modificar un par de cosas en las funciones usb_attach() y usb_detach()  para que nos indique cuando está conectado/desconectado del host mediante 2 led's indicadores: un led verde (conectado) y un led rojo (desconectado). (Modificaciones hechas en la librería  pic18_usb.c )


```
/******************************************************************************
/* usb_detach()
/*
/* Summary: Remove the D+/D- lines from the USB bus.  Basically, disable USB.
/*
/*****************************************************************************/
void usb_detach(void) {  //done
   output_high(PIN_B0) // Enciende LED rojo.
   output_low(PIN_B1) // Apaga LED verde.
   UCON=0;  //disable USB hardware
   UIE=0;   //disable USB interrupts
   UCFG = __UCFG_VAL_DISABLED__;
   set_tris_c(*0xF94 | 0x30);
   usb_state=USB_STATE_DETACHED;
   usb_token_reset();              //clear the chapter9 stack
   __usb_kbhit_status=0;
}

/******************************************************************************
/* usb_attach()
/*
/* Summary: Attach the D+/D- lines to the USB bus.  Enable the USB peripheral.
/*
/* You should wait until UCON_SE0 is clear before enabling reset/idle interrupt
/*
/*****************************************************************************/
void usb_attach(void) {
    usb_token_reset();
    output_high(PIN_B1) // Enciende LED verde.
    output_low(PIN_B0) // Apaga LED rojo.
    delay_ms(100)
    UCON = 0;
    UCFG = __UCFG_VAL_ENABLED__;
    UIE = 0;                                // Mask all USB interrupts
    UCON_USBEN = 1;                     // Enable module & attach to bus
    usb_state = USB_STATE_ATTACHED;      // Defined in usbmmap.c & .h
}
```

bueno hasta acá hemos visto como detectar la conexión / desconexión del host  desde el pic. Luego pongo el ejemplo para grabar en el PIC18F2550 y ver como encienden los led's según se conecte al host o no.


----------



## pic-man (Dic 11, 2008)

Muchas gracias por estos ejemplos Jonathan, la verdad es que este tema me interesa bastante, no comento nada básicamente porque no conozco la programación en C, aunque he estado siguiendo el tema para ver como se desarrolla esto.


----------



## Moyano Jonathan (Dic 11, 2008)

tengo un par de manuales de programación en c , pero para mi lo principal fue conocer la estructura del programación en c y de ahí luego ver el manual de usuario de CCS (en inglés) , no hace falta aprenderse todos los comandos , vas de apoco aprendiendo los que te hacen más falta o usas más. Eso estoy haciendo yo. Aunque te digo me falta muchisimo todavía para aprender a programar de forma eficiente en c.

si querés te paso algunos manuales pero va a tener que ser por otro medio ya que son un poco pesados, igual acá en el foro se han posteado tutoriales de programación en c de ccs para pic.

Otro consejo es mirar códigos de programación ajenos y ver los programas de ejemplo que trae el compilador.

Acordate que para lo que necesites acá estamos.


----------



## pic-man (Dic 11, 2008)

Gracias. Yo ya tengo algo de experiencia en ensamblador, he programado en C muy poco, solo para aplicaciones muy específicas en las que la vida se me hubiera complicado en ensamblador (como proyecto que hice hace un año en el que implementé una red neuronal sencilla en un pic 18f452), lo que he hecho lo he hecho siempre con ese manual de CCS en la mano.

Me interesa mucho el tema de USB, espero esta semana terminar un proyecto para ponerme con ese tema, y entonces con mucho gusto colaboraré en este post.

Te contactaré por mensaje privado porque si me interesan los manuales.


----------



## Moyano Jonathan (Dic 11, 2008)

Bueno ya probé el ejemplo para "Detección de conexión/desconexión del host por parte del pic"

Las librerías y drivers usados son los mismos, menos la librería pic18_usb, que fue modificada.

```
/////////////////////////////////////////////////////////////////////////
////                          pic18_usb.c                            ////
////                                                                 ////
//// Hardware layer for CCS's USB library.  This hardware layer      ////
//// supports the USB peripheral on the PIC18 family chips.  Current ////
//// supported families are:                                         ////
////     PIC18F2455/2550/4455/4550                                   ////
////     PIC18F2450/4450                                             ////
////     PIC18F65J50/66J50/66J55/67J50/85J50/86J50/86J55/87J50       ////
////                                                                 ////
//// This file is part of CCS's PIC USB driver code, which includes: ////
////   usb_desc_*.h - an example set of config and device descriptor ////
////   usb.c - USB token and request handler code                    ////
////   usb.h - definitions, prototypes and global variables          ////
////                                                                 ////
//// The following examples are provided by CCS:                     ////
////   ex_usb_mouse.c - A HID Mouse.                                 ////
////   ex_usb_hid.c - A custom application using HID protocol.       ////
////   ex_usb_kbmouse.c - A HID Mouse/Keyboard combo using multiple  ////
////                      interfaces.                                ////
////   ex_usb_kbmouse2.c - A HID Mouse/Keyboard combo using multiple ////
////                      HID Reports.                               ////
////   ex_usb_scope.c - A digital oscilloscope using a custom        ////
////                    protocol requiring custom Windows drivers.   ////
////   ex_usb_serial.c -                                             ////
////   ex_usb_serial2.c - Two examples of using the CDC driver for   ////
////     a virtual COM port.                                         ////
////                                                                 ////
////   *********** NOTE ABOUT 18F2450/4450 LIMITATIONS **********    ////
////  Due to the limited USB RAM of this family, a limitation of     ////
////  this driver is that there are only 3 endpoints (0, 1 and 2).   ////
////  The HW actually supports more endpoints, but to simplify       ////
////  driver development this driver will only support the first 3   ////
////  so there is an easier memory block to work with.               ////
////                                                                 ////
////  USB_MAX_EP0_PACKET_LENGTH will also be set to 8 regardless     ////
////  of USB speed, to save RAM.                                     ////
////                                                                 ////
////   ************** NOTE ABOUT HW REQUIREMENTS ****************    ////
////  If you are not using internal pullups, you will need to put    ////
////  an internal pullup resistor on C4 or C5 depending on if you    ////
////  want to use slow speed or full speed.  This code configures    ////
////  the device to use internal pullups, see usb_init() if you      ////
////  want to change that.                                           ////
////                                                                 ////
////  You need approximately 470nF cap on C3, even if you are using  ////
////  the internal 3.3V USB regulator.                               ////
////                                                                 ////
////  To run at full speed, you must use the oscillator              ////
////  configuration (PLLx) to set the PLL divide to 4MHz.  You can   ////
////  configure the MCU clock to any speed (up to 48MHz) but the     ////
////  PLL must run at 4Mhz to provide the USB peripheral with a      ////
////  96MHz clock.  See the datasheet for details.                   ////
////                                                                 ////
////  To run at slow speed you must configure your MCU to run at     ////
////  24Mhz.  See the datasheet for details.                         ////
////                                                                 ////
////   ****************  NOTE ABOUT INTERRUPTS  ******************   ////
//// This driver uses INT_USB.  It requires INT_USB to interrupt the ////
//// PIC when an event has happened on the USB Bus.  Therfore        ////
//// this code enables interrupts.  A user modification can be made  ////
//// to poll the USB interrupt flag instead of relying on an         ////
//// interrupt.                                                      ////
////                                                                 ////
////    ****************   USER FUNCTIONS  ***********************   ////
////                                                                 ////
//// usb_init() - Initializes the USB stack, the USB peripheral and  ////
////              attaches the unit to the usb bus.  Enables         ////
////              interrupts.                                        ////
////                                                                 ////
//// usb_init_cs() - A smaller usb_init(), does not attach unit      ////
////              to usb bus or enable interrupts.                   ////
////                                                                 ////
//// usb_put_packet() - Sends one packet to the host.                ////
////                    If you need to send a message that spans     ////
////                    more than one packet then see usb_puts() in  ////
////                    usb.c                                        ////
////                                                                 ////
//// usb_kbhit() - Returns true if OUT endpoint contains data from   ////
////               host.                                             ////
////                                                                 ////
//// usb_rx_packet_size() - Returns the size of packet that was      ////
////               received.  usb_kbhit() must return TRUE else      ////
////               this is not valid.  Don't forget in USB there     ////
////               are 0 len packets!                                ////
////                                                                 ////
//// usb_get_packet() - Gets one packet that from the host.          ////
////                    usb_kbhit() must return true before you call ////
////                    this routine or your data may not be valid.  ////
////                    Once usb_kbhit() returns true you want to    ////
////                    call this as soon as possible to get data    ////
////                    out of the endpoint buffer so the PC can     ////
////                    start sending more data, if needed.          ////
////                    This only receives one packet, if you are    ////
////                    trying to receive a multi-packet message     ////
////                    see usb_gets() in usb.c.                     ////
////                                                                 ////
//// usb_detach() - De-attach USB from the system.                   ////
////                                                                 ////
//// usb_attach() - Attach USB to the system.                        ////
////                                                                 ////
//// usb_attached() - Returns TRUE if the device is attached to a    ////
////                  USB cable.  A macro that looks at the defined  ////
////                  connection sense pin.                          ////
////                                                                 ////
//// usb_task() - Keeps track of connection sense, calling           ////
////              usb_detach() and usb_attach() when needed.         ////
////                                                                 ////
//// For more documentation on these functions read the comments at  ////
//// each function.                                                  ////
////                                                                 ////
//// The other functions defined in this file are for use by the     ////
//// USB code, and is not meant to be used by the user.              ////
////                                                                 ////
/////////////////////////////////////////////////////////////////////////
////                                                                 ////
//// Version History:                                                ////
////                                                                 ////
////   07-17-07: Added 18F4450,2450 support                          ////
////                                                                 ////
////   07-13-07: Added 87J50 family support                          ////
////                                                                 ////
////   11-01-05: usb_detach(), usb_attach() and usb_init_cs()        ////
////               changed for the better.                           ////
////                                                                 ////
////   10-28-05: Added usb_rx_packet_size()                          ////
////                                                                 ////
////   07-13-05: usb_put_packet() changed for 16bit packet sizes     ////
////             usb_flush_in() changed for 16bit packet sizes       ////
////             usb_get_packet() changed for 16bit packet sizes     ////
////             usb_flush_out() changed for 16bit packet sizes      ////
////             usb_set_configured() changed for 16bit packet sizes ////
////                                                                 ////
////   06-30-05: usb_tbe() added                                     ////
////             The way endpoint 0 DTS is set has been changed.     ////
////                                                                 ////
////   06-20-05: Initial Release                                     ////
////                                                                 ////
////   05-13-05: Beta Release (Full Speed works)                     ////
////                                                                 ////
////   03-21-05: Initial Alpha 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_HARDWARE__
#DEFINE __USB_HARDWARE__

//let the USB Stack know that we are using a PIC with internal USB peripheral
#DEFINE __PIC__   1

#if ((getenv("DEVICE")=="PIC18F87J50") || (getenv("DEVICE")=="PIC18F86J55") || (getenv("DEVICE")=="PIC18F86J50") || (getenv("DEVICE")=="PIC18F85J50") || (getenv("DEVICE")=="PIC18F67J50") || (getenv("DEVICE")=="PIC18F66J55") || (getenv("DEVICE")=="PIC18F66J50") || (getenv("DEVICE")=="PIC18F65J50"))
 #define __USB_87J50__
 #define USB_TOTAL_BUFFER_SPACE  ((int16)getenv("RAM")-0x500)
 #define USB_MAX_NUM_ENDPOINTS  16
#elif ((getenv("DEVICE")=="PIC18F2450") || (getenv("DEVICE")=="PIC18F4450"))
 #define __USB_4450__
 #if (USB_EP3_TX_SIZE+USB_EP3_RX_SIZE+USB_EP4_TX_SIZE+USB_EP4_RX_SIZE+USB_EP5_TX_SIZE+USB_EP5_RX_SIZE+
USB_EP6_TX_SIZE+USB_EP6_RX_SIZE+USB_EP7_TX_SIZE+USB_EP7_RX_SIZE+USB_EP8_TX_SIZE+USB_EP8_RX_SIZE+
USB_EP9_TX_SIZE+USB_EP9_RX_SIZE+USB_EP10_TX_SIZE+USB_EP10_RX_SIZE+USB_EP11_TX_SIZE+USB_EP11_RX_SIZE+
USB_EP12_TX_SIZE+USB_EP12_RX_SIZE+USB_EP13_TX_SIZE+USB_EP13_RX_SIZE+USB_EP14_TX_SIZE+USB_EP14_RX_SIZE+
USB_EP15_TX_SIZE+USB_EP15_RX_SIZE)>0
   #error This driver only supports endpoints 0, 1 and 2 for this chip.
 #endif
 #define USB_MAX_NUM_ENDPOINTS  3
 #define USB_TOTAL_BUFFER_SPACE  (0x100 - USB_MAX_NUM_ENDPOINTS*8)
#else
 #define __USB_4550__
 #define USB_TOTAL_BUFFER_SPACE  ((int16)0x300)
 #define USB_MAX_NUM_ENDPOINTS  16
#endif

#ifndef USB_USE_FULL_SPEED
 #define USB_USE_FULL_SPEED   TRUE
#endif

#ifndef USB_CON_SENSE_PIN
#define USB_CON_SENSE_PIN  0
#endif

#if defined(__USB_4450__)
   #define USB_MAX_EP0_PACKET_LENGTH   8
#else
   #if USB_USE_FULL_SPEED==FALSE
      //slow speed requires 8byte max packet size for endpoint 0
      #DEFINE USB_MAX_EP0_PACKET_LENGTH   8
   #else
      //for full speed you can still use 8bytes, but 64 will be faster
      #DEFINE USB_MAX_EP0_PACKET_LENGTH   64
   #endif
#endif

#INCLUDE <usb.h>

#define USB_BUFFER_NEEDED (USB_EP0_TX_SIZE+USB_EP0_RX_SIZE+USB_EP1_TX_SIZE+USB_EP1_RX_SIZE+USB_EP2_TX_SIZE+
USB_EP2_RX_SIZE+USB_EP3_TX_SIZE+USB_EP3_RX_SIZE+USB_EP4_TX_SIZE+USB_EP4_RX_SIZE+
USB_EP5_TX_SIZE+USB_EP5_RX_SIZE+USB_EP6_TX_SIZE+USB_EP6_RX_SIZE+USB_EP7_TX_SIZE+
USB_EP7_RX_SIZE+USB_EP8_TX_SIZE+USB_EP8_RX_SIZE+USB_EP9_TX_SIZE+USB_EP9_RX_SIZE+
USB_EP10_TX_SIZE+USB_EP10_RX_SIZE+USB_EP11_TX_SIZE+USB_EP11_RX_SIZE+USB_EP12_TX_SIZE+
USB_EP12_RX_SIZE+USB_EP13_TX_SIZE+USB_EP13_RX_SIZE+USB_EP14_TX_SIZE+USB_EP14_RX_SIZE+
USB_EP15_TX_SIZE+USB_EP15_RX_SIZE)

#if (USB_BUFFER_NEEDED > USB_TOTAL_BUFFER_SPACE)
 #error You are trying to allocate more memory for endpoints than the PIC can handle
#endif

#if defined(__USB_4450__)
 #reserve 0x400:0x4FF
#else
 #reserve 0x400:0x4FF+USB_BUFFER_NEEDED
#endif

#define debug_usb(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z)
//#define debug_usb printf
//#define debug_putc putc_tbe
#define debug_display_ram(x,y)
/*
void debug_display_ram(int8 len, int8 *ptr) {
   int8 max=16;
   debug_usb(debug_putc,"%U - ",len);
   if (max>len) {max=len;}
   while(max--) {
      debug_usb(debug_putc,"%X",*ptr);
      len--;
      ptr++;
   }
   if (len) {debug_usb(debug_putc,"...");}
}
*/

//if you are worried that the PIC is not receiving packets because a bug in the
//DATA0/DATA1 synch code, you can set this to TRUE to ignore the DTS on
//receiving.
#ifndef USB_IGNORE_RX_DTS
 #define USB_IGNORE_RX_DTS FALSE
#endif

#ifndef USB_IGNORE_TX_DTS
 #define USB_IGNORE_TX_DTS FALSE
#endif

//if you enable this it will keep a counter of the 6 possible errors the
//pic can detect.  disabling this will save you ROM, RAM and execution time.
#ifndef USB_USE_ERROR_COUNTER
   #define USB_USE_ERROR_COUNTER FALSE
#endif

#define USB_PING_PONG_MODE_OFF   0  //no ping pong
#define USB_PING_PONG_MODE_E0    1  //ping pong endpoint 0 only
#define USB_PING_PONG_MODE_ON    2  //ping pong all endpoints

//NOTE - PING PONG MODE IS NOT SUPPORTED BY CCS!
#ifndef USB_PING_PONG_MODE
   #define USB_PING_PONG_MODE USB_PING_PONG_MODE_OFF
#endif

#if USB_USE_ERROR_COUNTER
   int ERROR_COUNTER[6];
#endif

//---pic18fxx5x memory locations
#if defined(__USB_4550__)
   #byte UFRML   =  0xF66
   #byte UFRMH   =  0xF67
   #byte UIR     =  0xF68
   #byte UIE     =  0xF69
   #byte UEIR    =  0xF6A
   #byte UEIE    =  0xF6B
   #byte USTAT   =  0xF6C
   #byte UCON    =  0xF6D
   #byte UADDR   =  0xF6E
   #byte UCFG    =  0xF6F
   #define  UEP0_LOC 0xF70
#else
   #byte UFRML   =  0xF60
   #byte UFRMH   =  0xF61
   #byte UIR     =  0xF62
   #byte UIE     =  0xF5C
   #byte UEIR    =  0xF63
   #byte UEIE    =  0xF5D
   #byte USTAT   =  0xF64
   #byte UCON    =  0xF65
   #byte UADDR   =  0xF5E
   #byte UCFG    =  0xF5F
   #define  UEP0_LOC 0xF4C
#endif

#byte UEP0    =  UEP0_LOC

#if defined(__USB_4450__)
 #define USB_BUFFER (0x400 + (USB_MAX_NUM_ENDPOINTS*8))
 //#define USB_BUFFER 0x418   //if you have an old compiler you will need to use this
#else
 #define USB_BUFFER 0x500
#endif

#byte BD0STAT  =  0x400
#byte BD0CNT  =  0x401
#byte BD0ADRL  =  0x402
#byte BD0ADRJ  =  0x403

#define BD0STAT_LOC 0x400
#define BD0CNT_LOC  0x401
#define BD0ADRL_LOC 0x402
#define BD0ADRH_LOC 0x403

#define UEP(x) *(UEP0_LOC+x)

#BIT UIR_SOF = UIR.6
#BIT UIR_STALL = UIR.5
#BIT UIR_IDLE = UIR.4
#BIT UIR_TRN = UIR.3
#BIT UIR_ACTV = UIR.2
#BIT UIR_UERR = UIR.1
#BIT UIR_URST = UIR.0

#BIT UIE_SOF = UIE.6
#BIT UIE_STALL = UIE.5
#BIT UIE_IDLE = UIE.4
#BIT UIE_TRN = UIE.3
#BIT UIE_ACTV = UIE.2
#BIT UIE_UERR = UIE.1
#BIT UIE_URST = UIE.0

#bit UCON_PBRST=UCON.6
#bit UCON_SE0=UCON.5
#bit UCON_PKTDIS=UCON.4
#bit UCON_USBEN=UCON.3
#bit UCON_RESUME=UCON.2
#bit UCON_SUSPND=UCON.1

#if (USB_PING_PONG_MODE==USB_PING_PONG_MODE_OFF)
 #define EP_BDxST_O(x)    *(BD0STAT_LOC + x*8)
 #define EP_BDxCNT_O(x)    *(BD0CNT_LOC + x*8)
 #define EP_BDxADR_O(x)   *(int16 *)(BD0ADRL_LOC + x*8)
 #define EP_BDxST_I(x)    *(BD0STAT_LOC + 4 + x*8)
 #define EP_BDxCNT_I(x)    *(BD0CNT_LOC + 4 + x*8)
 #define EP_BDxADR_I(x)   *(int16 *)(BD0ADRL_LOC + 4 + x*8)
#else
#error Right now this driver only supports no ping pong
#endif

//See UEPn (0xF70-0xF7F)
#define ENDPT_DISABLED   0x00   //endpoint not used
#define ENDPT_IN_ONLY   0x02    //endpoint supports IN transactions only
#define ENDPT_OUT_ONLY   0x04    //endpoint supports OUT transactions only
#define ENDPT_CONTROL   0x06    //Supports IN, OUT and CONTROL transactions - Only use with EP0
#define ENDPT_NON_CONTROL 0x0E  //Supports both IN and OUT transactions

//Define the states that the USB interface can be in
enum {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_state=0;

//--BDendST has their PIDs upshifed 2
#define USB_PIC_PID_IN       0x24  //device to host transactions
#define USB_PIC_PID_OUT      0x04  //host to device transactions
#define USB_PIC_PID_SETUP    0x34  //host to device setup transaction

#define USTAT_IN_E0        4
#define USTAT_OUT_SETUP_E0 0

#define __USB_UIF_RESET    0x01
#define __USB_UIF_ERROR    0x02
#define __USB_UIF_ACTIVE   0x04
#define __USB_UIF_TOKEN    0x08
#define __USB_UIF_IDLE     0x10
#define __USB_UIF_STALL    0x20
#define __USB_UIF_SOF      0x40

#if USB_USE_ERROR_COUNTER
 #define STANDARD_INTS 0x3F
#else
 #define STANDARD_INTS 0x3D
#endif

#define __USB_UCFG_UTEYE   0x80
#if defined(__USB_4550__)
 #define __USB_UCFG_UOEMON  0x40
#endif
#define __USB_UCFG_UPUEN   0x10
#define __USB_UCFG_UTRDIS  0x08
#define __USB_UCFG_FSEN    0x04

#if USB_USE_FULL_SPEED
   #define __UCFG_VAL_ENABLED__ (__USB_UCFG_UPUEN | __USB_UCFG_FSEN | USB_PING_PONG_MODE)
#else
   #define __UCFG_VAL_ENABLED__ (__USB_UCFG_UPUEN | USB_PING_PONG_MODE);
#endif

#define __UCFG_VAL_DISABLED__ 0x08

char usb_ep0_rx_buffer[USB_MAX_EP0_PACKET_LENGTH];
#locate usb_ep0_rx_buffer=USB_BUFFER

char usb_ep0_tx_buffer[USB_MAX_EP0_PACKET_LENGTH];
#locate usb_ep0_tx_buffer=USB_BUFFER+USB_MAX_EP0_PACKET_LENGTH

char usb_data_buffer[USB_TOTAL_BUFFER_SPACE-USB_MAX_EP0_PACKET_LENGTH-USB_MAX_EP0_PACKET_LENGTH];
#locate usb_data_buffer=USB_BUFFER+USB_MAX_EP0_PACKET_LENGTH+USB_MAX_EP0_PACKET_LENGTH

int8 __setup_0_tx_size;

//interrupt handler, specific to PIC18Fxx5x peripheral only
void usb_handle_interrupt();
void usb_isr_rst();
void usb_isr_uerr();
void usb_isr_sof(void);
void usb_isr_activity();
void usb_isr_uidle();
void usb_isr_tok_dne();
void usb_isr_stall(void);
void usb_init_ep0_setup(void);

//following functions standard part of CCS PIC USB driver, and used by usb.c
void usb_init();
void usb_detach();
int1 usb_put_packet(int endpoint, int * ptr, int16 len, USB_DTS_BIT tgl);
int1 usb_flush_in(int8 endpoint, int16 len, USB_DTS_BIT tgl); //marks the transmit buffer as ready for transmission
int16 usb_get_packet(int8 endpoint, int8 * ptr, int16 max);
int16 usb_rx_packet_size(int8 endpoint);
int16 usb_get_packet_buffer(int8 endpoint, int8 *ptr, int16 max);
void usb_flush_out(int8 endpoint, USB_DTS_BIT tgl);
void usb_stall_ep(int8 endpoint);
void usb_unstall_ep(int8 endpoint);
int1 usb_endpoint_stalled(int8 endpoint);
void usb_set_address(int8 address);
void usb_set_configured(int config);
void usb_disable_endpoints(void);

//// BEGIN User Functions:

/******************************************************************************
/* usb_attached()
/*
/* Summary: Returns TRUE if the device is attached to a USB cable
/*
/*****************************************************************************/
#if USB_CON_SENSE_PIN
 #define usb_attached() input(USB_CON_SENSE_PIN)
#else
 #define usb_attached() TRUE
#endif
 // parte modificada:
/******************************************************************************
/* usb_detach()
/*
/* Summary: Remove the D+/D- lines from the USB bus.  Basically, disable USB.
/*
/*****************************************************************************/
void usb_detach(void) {  //done
   output_high(PIN_B1); // Enciendo LED rojo
   output_low(PIN_B0);  // Apago LED verde.
   delay_ms(50); // espero 50ms.
   UCON=0;  //disable USB hardware
   UIE=0;   //disable USB interrupts
   UCFG = __UCFG_VAL_DISABLED__;
   set_tris_c(*0xF94 | 0x30);
   usb_state=USB_STATE_DETACHED;
   usb_token_reset();              //clear the chapter9 stack
   __usb_kbhit_status=0;
}

/******************************************************************************
/* usb_attach()
/*
/* Summary: Attach the D+/D- lines to the USB bus.  Enable the USB peripheral.
/*
/* You should wait until UCON_SE0 is clear before enabling reset/idle interrupt
/*
/*****************************************************************************/
void usb_attach(void) {
   usb_token_reset();
    output_high(PIN_B0); // Enciendo LED VERDE.
    output_low(PIN_B1);  // Apago LED rojo.
    delay_ms(50); // espero 50ms.
    UCON = 0;
    UCFG = __UCFG_VAL_ENABLED__;
    UIE = 0;                                // Mask all USB interrupts
    UCON_USBEN = 1;                     // Enable module & attach to bus
    usb_state = USB_STATE_ATTACHED;      // Defined in usbmmap.c & .h
}

/*****************************************************************************
/* usb_init_cs()
/*
/* Summary: Resets and initalizes USB peripheral.  Does not attach the peripheral
/*          to the USB bus.  See usb_attach() and usb_task() on how to
/*          attach to the USB bus.
/*
/*          You must call this before any other USB code.
/*
/*          NOTE: an alternative function, usb_init(), is provided that
/*                initializes the USB and then connects.
/*
/*****************************************************************************/
#define usb_init_cs usb_detach

/*****************************************************************************
/* usb_task()
/*
/* Summary: Keeps an eye on the connection sense pin to determine if we are
/*          attached to a USB cable or not.  If we are attached to a USB cable,
/*          initialize the USB peripheral if needed.  If we are disconnected
/*          from the USB cable, disable the USB peripheral.
/*
/*          NOTE: If you are not using a connection sense pin, will automatically
/*                enable the USB peripheral.
/*
/*          NOTE: this enables interrupts once the USB peripheral is ready
/*
/*****************************************************************************/
void usb_task(void) {
   if (usb_attached()) {
      if (UCON_USBEN==0) {
         debug_usb(debug_putc, "\r\n\nUSB TASK: ATTACH");
         usb_attach();
      }
   }
   else {
      if (UCON_USBEN==1)  {
         debug_usb(debug_putc, "\r\n\nUSB TASK: DE-ATTACH");
         usb_detach();
      }
   }

   if ((usb_state == USB_STATE_ATTACHED)&&(!UCON_SE0)) {
      UIR=0;
      UIE=0;
      enable_interrupts(INT_USB);
      enable_interrupts(GLOBAL);
      UIE=__USB_UIF_IDLE | __USB_UIF_RESET;  //enable IDLE and RESET USB interrupt
      usb_state=USB_STATE_POWERED;
      debug_usb(debug_putc, "\r\n\nUSB TASK: POWERED");
   }
}

/*****************************************************************************
/* usb_init()
/*
/* Summary: Resets and initalizes USB hardware.  You must call this first before
/*          using code.  Will attach the USB periperhal to the USB bus.
/*
/*          NOTE: If you are using a connection sense pin, this will wait in
/*                an infinite loop until the device is connected to a USB cable.
/*
/*          NOTE: If you are not using a connection sense pin, this will wait
/*                in an infinte loop until the SE0 condition clears, which usually
/*                doesn't take long
/*
/*          NOTE: this enables interrupts.
/*
/*****************************************************************************/
void usb_init(void) {
   usb_init_cs();

   do {
      usb_task();
   } while (usb_state != USB_STATE_POWERED);
}


/**************************************************************
/* usb_flush_in()
/*
/* Input: endpoint - which endpoint to mark for transfer
/*        len - length of data that is being tramsferred
/*        tgl - Data toggle synchronization for this packet
/*
/* Output: TRUE if success, FALSE if error (we don't control the endpoint)
/*
/* Summary: Marks the endpoint ready for transmission.  You must
/*          have already loaded the endpoint buffer with data.
/*          (IN is PIC -> PC)
/***************************************************************/
int1 usb_flush_in(int8 endpoint, int16 len, USB_DTS_BIT tgl) {
   int8 i;

   debug_usb(debug_putc,"\r\nPUT %X %U %LU",endpoint, tgl, len);

   i=EP_BDxST_I(endpoint);
   if (!bit_test(i,7)) {

      EP_BDxCNT_I(endpoint)=len;

     debug_display_ram(len, EP_BDxADR_I(endpoint));

     #if USB_IGNORE_TX_DTS
      i=0x80;
     #else
      if (tgl == USB_DTS_TOGGLE) {
         i=EP_BDxST_I(endpoint);
         if (bit_test(i,6))
            tgl=USB_DTS_DATA0;  //was DATA1, goto DATA0
         else
            tgl=USB_DTS_DATA1;  //was DATA0, goto DATA1
      }
      else if (tgl == USB_DTS_USERX) {
         i=EP_BDxST_O(endpoint);
         if (bit_test(i,6))
            tgl=USB_DTS_DATA1;
         else
            tgl=USB_DTS_DATA0;
      }
      if (tgl == USB_DTS_DATA1) {
         i=0xC8;  //DATA1, UOWN
      }
      else if (tgl == USB_DTS_DATA0) {
         i=0x88; //DATA0, UOWN
      }
     #endif

      //set BC8 and BC9
      if (bit_test(len,8)) {bit_set(i,0);}
      if (bit_test(len,9)) {bit_set(i,1);}

      debug_usb(debug_putc," %X",i);

      EP_BDxST_I(endpoint)=i;//save changes

      return(1);
   }
    else {
         debug_usb(debug_putc,"\r\nPUT ERR");
    }
   return(0);
}

/*******************************************************************************
/* usb_put_packet(endpoint,*ptr,len,toggle)
/*
/* Input: endpoint - endpoint to send packet to
/*        ptr - points to data to send
/*        len - amount of data to send
/*        toggle - whether to send data with a DATA0 pid, a DATA1 pid, or toggle from the last DATAx pid.
/*
/* Output: TRUE if data was sent correctly, FALSE if it was not.  The only reason it will
/*         return FALSE is if because the TX buffer is still full from the last time you
/*         tried to send a packet.
/*
/* Summary: Sends one packet out the EP to the host.  Notice that there is a difference
/*          between a packet and a message.  If you wanted to send a 512 byte message you
/*          would accomplish this by sending 8 64-byte packets, followed by a 0 length packet.
/*          If the last (or only packet) being sent is less than the max packet size defined
/*          in your descriptor then you do not need to send a 0 length packet to identify
/*          an end of message.
/*
/*          usb_puts() (provided in usb.c) will send a multi-packet message correctly.
/*
/********************************************************************************/
int1 usb_put_packet(int8 endpoint, int8 * ptr, int16 len, USB_DTS_BIT tgl) { //done
   int16 j;
   int8 i;
   int8 * buff_add;    

   i=EP_BDxST_I(endpoint);
   if (!bit_test(i,7)) {

      buff_add=EP_BDxADR_I(endpoint);

      for (j=0;j<len;j++) {
         *buff_add=*ptr;
         buff_add++;
         ptr++;
      }

      return(usb_flush_in(endpoint, len, tgl));
    }
    else {
        debug_usb(debug_putc,"\r\nPUT ERR");
    }
    return(0);
}

/// END User Functions


/// BEGIN Hardware layer functions required by USB.C

/**************************************************************
/* usb_flush_out()
/*
/* Input: endpoint - which endpoint to mark for transfer
/*        tgl - Data toggle synchronization to expect in the next packet
/*
/* Output: NONE
/*
/* Summary: Clears the previously received packet, and then marks this
/*          endpoint's receive buffer as ready for more data.
/*          (OUT is PC -> PIC)
/***************************************************************/
void usb_flush_out(int8 endpoint, USB_DTS_BIT tgl) {
   int8 i;
   int16 len;

     #if USB_IGNORE_RX_DTS
      if (tgl == USB_DTS_STALL) {
         debug_usb(debug_putc, '*');
         i=0x84;
         EP_BDxST_I(endpoint)=0x84;
         return;
      }
      else
         i=0x80;
     #else
      i=EP_BDxST_O(endpoint);
      if (tgl == USB_DTS_TOGGLE) {
         if (bit_test(i,6))
            tgl=USB_DTS_DATA0;  //was DATA1, goto DATA0
         else
            tgl=USB_DTS_DATA1;  //was DATA0, goto DATA1
      }
      if (tgl == USB_DTS_STALL) {
         i=0x84;
         EP_BDxST_I(endpoint)=0x84; //stall both in and out endpoints
      }
      else if (tgl == USB_DTS_DATA1) {
         i=0xC8;  //DATA1, UOWN
      }
      else if (tgl == USB_DTS_DATA0) {
         i=0x88; //DATA0, UOWN
      }
     #endif

   bit_clear(__usb_kbhit_status,endpoint);

   len=usb_ep_rx_size[endpoint];
   EP_BDxCNT_O(endpoint)=len;
   if (bit_test(len,8)) {bit_set(i,0);}
   if (bit_test(len,9)) {bit_set(i,1);}


   EP_BDxST_O(endpoint)=i;
}

int16 usb_rx_packet_size(int8 endpoint) {
   return(EP_BDxCNT_O(endpoint));
}

/*******************************************************************************
/* usb_get_packet_buffer(endpoint, *ptr, max)
/*
/* Input: endpoint - endpoint to get data from
/*        ptr - where to save data to local PIC RAM
/*        max - max amount of data to receive from buffer
/*
/* Output: the amount of data taken from the buffer.
/*
/* Summary: Gets a packet of data from the USB buffer and puts into local PIC RAM.
/*          Does not mark the endpoint as ready for more data.  Once you are
/*          done with data, call usb_flush_out() to mark the endpoint ready
/*          to receive more data.
/*
/********************************************************************************/
int16 usb_get_packet_buffer(int8 endpoint, int8 *ptr, int16 max) {
   int8 * al;
   int8 st;
   int16 i;

   al=EP_BDxADR_O(endpoint);
   i=EP_BDxCNT_O(endpoint);
   st=EP_BDxST_O(endpoint);

   //read BC8 and BC9
   if (bit_test(st,0)) {bit_set(i,8);}
   if (bit_test(st,1)) {bit_set(i,9);}

   if (i<max) {max=i;}

   i=0;

   while (i<max) {
       *ptr=*al;
       ptr++;
       al++;
       i++;
   }

   return(max);
}

/*******************************************************************************
/* usb_get_packet(endpoint, *ptr, max)
/*
/* Input: endpoint - endpoint to get data from
/*        ptr - where to save data to local PIC RAM
/*        max - max amount of data to receive from buffer
/*
/* Output: the amount of data taken from the buffer.
/*
/*         NOTE - IF THERE IS NO PACKET TO GET YOU WILL GET INVALID RESULTS!
/*                VERIFY WITH USB_KBHIT() BEFORE YOU CALL USB_GET_PACKET()!
/*
/* Summary: Gets a packet of data from the USB buffer and puts into local PIC RAM.
/*          Until you call usb_get_packet() the data will sit in the endpoint
/*          buffer and the PC will get NAKs when it tries to write more data
/*          to the endpoint.
/*
/********************************************************************************/
int16 usb_get_packet(int8 endpoint, int8 * ptr, int16 max) {

   max=usb_get_packet_buffer(endpoint,ptr,max);
   usb_flush_out(endpoint, USB_DTS_TOGGLE);

   return(max);
}

/*******************************************************************************
/* usb_tbe(endpoint)
/*
/* Input: endpoint - endpoint to check
/*        ptr - where to save data to local PIC RAM
/*        max - max amount of data to receive from buffer
/*
/* Output: returns TRUE if this endpoint's IN buffer (PIC-PC) is empty and ready
/*         returns FALSE if this endpoint's IN buffer is still processing the last
/*         transmit or if this endpoint is invalid.
/*
/********************************************************************************/
int8 usb_tbe(int8 endpoint) {
   int8 st;
   st=EP_BDxST_I(endpoint);
   if (!bit_test(st,7))
      return(TRUE);
   return(FALSE);
}

/*******************************************************************************
/* usb_stall_ep(endpoint,direction)
/*
/* Input: endpoint - endpoint to stall.
/*                   top most bit indicates direction (set is IN, clear is OUT)
/*
/* Summary: Stalls specified endpoint.  If endpoint is stalled it will send STALL packet
/*          if the host tries to access this endpoint's buffer.
/*
/*
/* NOTE: WE ASSUME ENDPOINT IS VALID.  USB.C SHOULD CHECK THIS
/*
/********************************************************************************/
void usb_stall_ep(int8 endpoint) {  //done
   int1 direction;
   direction=bit_test(endpoint,7);
   endpoint&=0x7F;
   if (direction) {
      EP_BDxST_I(endpoint)=0x84;
   }
   else {
      EP_BDxST_O(endpoint)=0x84;
   }
}

/*******************************************************************************
/* usb_unstall_ep(endpoint, direction)
/*
/* Input: endpoint - endpoint to un-stall.
/*                   top most bit indicates direction (set is IN, clear is OUT)
/*
/* Summary: Un-stalls endpoint.
/*
/* NOTE: WE ASSUME ENDPOINT IS VALID.  USB.C SHOULD CHECK THIS
/********************************************************************************/
void usb_unstall_ep(int8 endpoint) {   //done
   int1 direction;
   direction=bit_test(endpoint,7);
   endpoint&=0x7F;
   if (direction) {
      #if USB_IGNORE_RX_DTS
      EP_BDxST_I(endpoint)=0x80;
      #else
      EP_BDxST_I(endpoint)=0x88;
      #endif
   }
   else {
      EP_BDxST_O(endpoint)=0x00;
   }
}

/*******************************************************************************
/* usb_endpoint_stalled(endpoint)
/*
/* Input: endpoint - endpoint to check
/*                   top most bit indicates direction (set is IN, clear is OUT)
/*
/* Output: returns a TRUE if endpoint is stalled, FALSE if it is not.
/*
/* Summary: Looks to see if an endpoint is stalled, or not.  Does not look to
/*          see if endpoint has been issued a STALL, just whether or not it is
/*          configured to STALL on the next packet.  See Set_Feature and Clear_Feature
/*          Chapter 9 requests.
/*
/* NOTE: WE ASSUME ENDPOINT IS VALID.  USB.C SHOULD CHECK THIS
/********************************************************************************/
int1 usb_endpoint_stalled(int8 endpoint) {   //done
   int1 direction;
   int8 st;
   direction=bit_test(endpoint,7);
   endpoint&=0x7F;
   if (direction) {
      st=EP_BDxST_I(endpoint);
   }
   else {
      st=EP_BDxST_O(endpoint);
   }
   return(bit_test(st,7) && bit_test(st,2));
}


/*******************************************************************************
/* usb_set_address(address)
/*
/* Input: address - address the host specified that we use
/*
/* Summary: Configures the USB Peripheral for the specified device address.  The host
/*          will now talk to use with the following address.
/*
/********************************************************************************/
void usb_set_address(int8 address) {   //done
   UADDR=address;
   if (address) {
      usb_state=USB_STATE_ADDRESS;
   }
   else {
      usb_state=USB_STATE_POWERED;
   }
}


/*******************************************************************************
/* usb_set_configured(config)
/*
/* Input: config - Configuration to use.  0 to uncofigure device.
/*
/* Summary: Configures or unconfigures device.  If configuring device it will
/*          enable all the endpoints the user specified for this configuration.
/*          If un-configuring device it will disable all endpoints.
/*
/*          NOTE: CCS only provides code to handle 1 configuration.
/*
/********************************************************************************/
void usb_set_configured(int config) {
   int8 en;
   int16 addy;
   int8 new_uep;
   int16 len;
   int8 i;
      if (config==0) {
         //if config=0 then set addressed state
         usb_state=USB_STATE_ADDRESS;
         usb_disable_endpoints();
      }
      else {
         usb_state=USB_STATE_CONFIGURED; //else set configed state
         addy=(int16)USB_BUFFER+(2*USB_MAX_EP0_PACKET_LENGTH);
         for (en=1;en<16;en++) {
            new_uep=0;
            if (usb_ep_rx_type[en]!=USB_ENABLE_DISABLED) {
               new_uep=0x04;
               len=usb_ep_rx_size[en];
               EP_BDxCNT_O(en)=len;
               EP_BDxADR_O(en)=addy;
               addy+=usb_ep_rx_size[en];
               #if USB_IGNORE_RX_DTS
                  i=0x80;
               #else
                  i=0x88;
               #endif
               if (bit_test(len,8)) {bit_set(i,0);}
               if (bit_test(len,9)) {bit_set(i,1);}
               EP_BDxST_O(en)=i;
            }
            if (usb_ep_tx_type[en]!=USB_ENABLE_DISABLED) {
               new_uep|=0x02;
               EP_BDxADR_I(en)=addy;
               addy+=usb_ep_tx_size[en];
               EP_BDxST_I(en)=0x40;
            }
            if (new_uep==0x06) {new_uep=0x0E;}
            if (usb_ep_tx_type[en]!=USB_ENABLE_ISOCHRONOUS) {
               new_uep|=0x10;
            }
            UEP(en)=new_uep;
         }
      }
}

/// END Hardware layer functions required by USB.C


/// BEGIN USB Interrupt Service Routine

/*******************************************************************************
/* usb_handle_interrupt()
/*
/* Summary: Checks the interrupt, and acts upon event.  Processing finished
/*          tokens is the majority of this code, and is handled by usb.c
/*
/* NOTE: If you wish to change to a polling method (and not an interrupt method),
/*       then you must call this function rapidly.  If there is more than 10ms
/*       latency the PC may think the USB device is stalled and disable it.
/*       To switch to a polling method, remove the #int_usb line above this fuction.
/*       Also, goto usb_init() and remove the code that enables the USB interrupt.
/********************************************************************************/
#int_usb
void usb_isr() {
   if (usb_state==USB_STATE_DETACHED) return;   //should never happen, though
   if (UIR) {
      debug_usb(debug_putc,"\r\n\n[%X] ",UIR);
      if (UIR_ACTV && UIE_ACTV) {usb_isr_activity();}  //activity detected.  (only enable after sleep)

      if (UCON_SUSPND) return;

      if (UIR_UERR && UIE_UERR) {usb_isr_uerr();}          //error has been detected

      if (UIR_URST && UIE_URST) {usb_isr_rst();}        //usb reset has been detected

      if (UIR_IDLE && UIE_IDLE) {usb_isr_uidle();}        //idle time, we can go to sleep
      if (UIR_SOF && UIE_SOF) {usb_isr_sof();}
      if (UIR_STALL && UIE_STALL) {usb_isr_stall();}        //a stall handshake was sent

      if (UIR_TRN && UIE_TRN) {
         usb_isr_tok_dne();
         UIR_TRN=0;    // clear the token done interrupt., 0x190.3
      }    //a token has been detected (majority of isrs)
   }
}

//SOF interrupt not handled.  user must add this depending on application
void usb_isr_sof(void) {
   debug_usb(debug_putc,"\r\nSOF");
   UIR_SOF=0;
}

/*******************************************************************************
/* usb_disable_endpoints()
/*
/* Summary: Disables endpoints 1 thru 15
/*
/********************************************************************************/
void usb_disable_endpoints(void) {
   int8 i;
   for (i=1;i<16;i++) {
      UEP(i)=ENDPT_DISABLED;
   }
   __usb_kbhit_status=0;
}

/*******************************************************************************
/* usb_isr_rst()
/*
/* Summary: The host (computer) sent us a RESET command.  Reset USB device
/*          and token handler code to initial state.
/*
/********************************************************************************/
void usb_isr_rst() {
   debug_usb(debug_putc,"R");

   UEIR=0;
   UIR=0;
   UEIE=0x9F;
   UIE=STANDARD_INTS & ~__USB_UIF_ACTIVE;

   UADDR=0;

   usb_token_reset();

   usb_disable_endpoints();

   UEP(0)=ENDPT_CONTROL | 0x10;

   while (UIR_TRN) {
      UIR_TRN=0;    //do this to clear out the ustat fifo
   }

   UCON_PKTDIS=0; //SIE token and packet processing enabled

   usb_init_ep0_setup();

   usb_state=USB_STATE_DEFAULT; //put usb mcu into default state
}

/*****************************************************************************
/* usb_init_ep0_setup()
/*
/* Summary: Configure EP0 to receive setup packets
/*
/*****************************************************************************/
void usb_init_ep0_setup(void) {
    EP_BDxCNT_O(0) = USB_MAX_EP0_PACKET_LENGTH;
    EP_BDxADR_O(0) = USB_BUFFER;
   #if USB_IGNORE_RX_DTS
    EP_BDxST_O(0) = 0x80; //give control to SIE, data toggle synch off
   #else
    EP_BDxST_O(0) = 0x88; //give control to SIE, DATA0, data toggle synch on
   #endif

    EP_BDxST_I(0) = 0;
    EP_BDxADR_I(0) = USB_BUFFER + (int16)USB_MAX_EP0_PACKET_LENGTH;
}

/*******************************************************************************
/* usb_isr_uerr()
/*
/* Summary: The USB peripheral had an error.  If user specified, error counter
/*          will incerement.  If having problems check the status of these 8 bytes.
/*
/* NOTE: This code is not enabled by default.
/********************************************************************************/
void usb_isr_uerr() {
#if USB_USE_ERROR_COUNTER
   int ints;
#endif

   debug_usb(debug_putc,"E %X ",UEIR);

#if USB_USE_ERROR_COUNTER

   ints=UEIR & UEIE; //mask off the flags with the ones that are enabled

   if ( bit_test(ints,0) ) { //increment pid_error counter
      debug_usb(debug_putc,"PID ");
      ERROR_COUNTER[0]++;
   }

   if ( bit_test(ints,1) ) {  //increment crc5 error counter
      debug_usbdebug_putc,"CRC5 ");
      ERROR_COUNTER[1]++;
   }

   if ( bit_test(ints,2) ) {  //increment crc16 error counter
      debug_usb(debug_putc,"CRC16 ");
      ERROR_COUNTER[2]++;
   }

   if ( bit_test(ints,3) ) {  //increment dfn8 error counter
      debug_usb(debug_putc,"DFN8 ");
      ERROR_COUNTER[3]++;
   }

   if ( bit_test(ints,4) ) {  //increment bto error counter
      debug_usb(debug_putc,"BTO ");
      ERROR_COUNTER[4]++;
   }

   if ( bit_test(ints,7) ) { //increment bts error counter
      debug_usb(debug_putc,"BTS ");
      ERROR_COUNTER[5]++;
   }
#endif

   UEIR=0;
   UIR_UERR=0;
}

/*******************************************************************************
/* usb_isr_uidle()
/*
/* Summary: USB peripheral detected IDLE.  Put the USB peripheral to sleep.
/*
/********************************************************************************/
void usb_isr_uidle() {
   debug_usb(debug_putc,"I");

   UIE_ACTV=1;   //enable activity interrupt flag. (we are now suspended until we get an activity interrupt. nice)
   UIR_IDLE=0; //clear idle interrupt flag
   UCON_SUSPND=1; //set suspend. we are now suspended
}


/*******************************************************************************
/* usb_isr_activity()
/*
/* Summary: USB peripheral detected activity on the USB device.  Wake-up the USB
/*          peripheral.
/*
/********************************************************************************/
void usb_isr_activity() {
   debug_usb(debug_putc,"A");

   UCON_SUSPND=0; //turn off low power suspending
   UIE_ACTV=0; //clear activity interupt enabling
   UIR_ACTV=0;
}

/*******************************************************************************
/* usb_isr_stall()
/*
/* Summary: Stall handshake detected.
/*
/********************************************************************************/
void usb_isr_stall(void) {
   debug_usb(debug_putc,"S");

   if (bit_test(UEP(0),0)) {
      usb_init_ep0_setup();
      bit_clear(UEP(0),0);
   }
   UIR_STALL=0;
}


/*******************************************************************************
/* usb_isr_tok_dne()
/*
/* Summary: A Token (IN/OUT/SETUP) has been received by the USB peripheral.
/*          If a setup token on EP0 was received, run the chapter 9 code and
/*          handle the request.
/*          If an IN token on EP0 was received, continue transmitting any
/*          unfinished requests that may take more than one packet to transmit
/*          (if necessary).
/*          If an OUT token on any other EP was received, mark that EP as ready
/*          for a usb_get_packet().
/*          Does not handle any IN or OUT tokens on EP0.
/*
/********************************************************************************/
void usb_isr_tok_dne() {
   int8 en;

   en=USTAT>>3;

         debug_usb(debug_putc,"T ");
         debug_usb(debug_putc,"%X ", USTAT);

      if (USTAT==USTAT_OUT_SETUP_E0) {   //new out or setup token in the buffer
         debug_usb(debug_putc,"%X ", EP_BDxST_O(0));
         if ((EP_BDxST_O(0) & 0x3C)==USB_PIC_PID_SETUP) {
            EP_BDxST_I(0)=0;   // return the in buffer to us (dequeue any pending requests)

            debug_usb(debug_putc,"(%U) ", EP_BDxCNT_O(0));
            debug_display_ram(EP_BDxCNT_O(0), usb_ep0_rx_buffer);

            usb_isr_tok_setup_dne();

            //if setup_0_tx_size==0xFF - stall ep0 (unhandled request)
            //if setup_0_tx_size==0xFE - get EP0OUT ready for a data packet, leave EP0IN alone
            //else setup_0_tx_size=size of response, get EP0OUT ready for a setup packet, mark EPOIN ready for transmit
            if (__setup_0_tx_size==0xFF)
               usb_flush_out(0,USB_DTS_STALL);
            else {
               usb_flush_out(0,USB_DTS_TOGGLE);
               if (__setup_0_tx_size!=0xFE) {
                  usb_flush_in(0,__setup_0_tx_size,USB_DTS_USERX);
               }
            }
            UCON_PKTDIS=0;       // UCON,PKT_DIS ; Assuming there is nothing to dequeue, clear the packet disable bit
         }
         else if ((EP_BDxST_O(0) & 0x3C)==USB_PIC_PID_OUT) {
            usb_isr_tok_out_dne(0);
            usb_flush_out(0,USB_DTS_TOGGLE);
            if ((__setup_0_tx_size!=0xFE)&&(__setup_0_tx_size!=0xFF)) {
               usb_flush_in(0,__setup_0_tx_size,USB_DTS_DATA1);   //send response (usually a 0len)
            }
         }
      }

      else if (USTAT==USTAT_IN_E0) {   //pic -> host transfer completed
         __setup_0_tx_size=0xFF;
         usb_isr_tok_in_dne(0);
         if (__setup_0_tx_size!=0xFF)
            usb_flush_in(0,__setup_0_tx_size,USB_DTS_TOGGLE);
         else
            usb_init_ep0_setup();
      }

      else {
         if (!bit_test(USTAT,2)) {
            usb_isr_tok_out_dne(en);
         }
         else {
            usb_isr_tok_in_dne(en);
         }
      }
}

/**************************************************************
/* usb_request_send_response(len)
/* usb_request_get_data()
/* usb_request_stall()
/*
/* Input: len - size of packet to send
/*
/* Summary: After we process a SETUP request, we have 1 of three responses:
/*            1.) send a response IN packet
/*            2.) wait for followup OUT packet(s) with data
/*            3.) stall because we don't support that SETUP request
/*
/*          If we are sending data, the array usb_ep0_tx_buffer[] will hold
/*          the response and the USB Request handler code will call
/*          usb_request_send_response() to let us know how big the packet is.
/*
/*          If we are waiting for more data, usb_request_get_data() will
/*          be called by the USB request handler code to configure the EP0 OUT
/*          endpoint to be ready for more data
/*
/*          If we don't support a request, usb_request_stall() will be called
/*          by the USB request handler code to stall the endpoint 0.
/*
/***************************************************************/
void usb_request_send_response(int len) {
   __setup_0_tx_size=len;
}

void usb_request_get_data(void) {
   __setup_0_tx_size=0xFE;
}

void usb_request_stall(void) {
   __setup_0_tx_size=0xFF;
}

/// END USB Interrupt Service Routine

#ENDIF
```

la librería fue modificada en esta parte, funciones usb_attach() y usb_dettach():

```
/******************************************************************************
/* usb_detach()
/*
/* Summary: Remove the D+/D- lines from the USB bus.  Basically, disable USB.
/*
/*****************************************************************************/
void usb_detach(void) {  //done
   output_high(PIN_B1); // Enciendo LED rojo
   output_low(PIN_B0);  // Apago LED verde.
   delay_ms(50); // espero 50ms.
   UCON=0;  //disable USB hardware
   UIE=0;   //disable USB interrupts
   UCFG = __UCFG_VAL_DISABLED__;
   set_tris_c(*0xF94 | 0x30);
   usb_state=USB_STATE_DETACHED;
   usb_token_reset();              //clear the chapter9 stack
   __usb_kbhit_status=0;
}

/******************************************************************************
/* usb_attach()
/*
/* Summary: Attach the D+/D- lines to the USB bus.  Enable the USB peripheral.
/*
/* You should wait until UCON_SE0 is clear before enabling reset/idle interrupt
/*
/*****************************************************************************/
void usb_attach(void) {
   usb_token_reset();
    output_high(PIN_B0); // Enciendo LED VERDE.
    output_low(PIN_B1);  // Apago LED rojo.
    delay_ms(50); // espero 50ms.
    UCON = 0;
    UCFG = __UCFG_VAL_ENABLED__;
    UIE = 0;                                // Mask all USB interrupts
    UCON_USBEN = 1;                     // Enable module & attach to bus
    usb_state = USB_STATE_ATTACHED;      // Defined in usbmmap.c & .h
}
```

Este es el código fuente en C de CCS del programa del ejemplo n°4:


```
// Programa que detecta la conexión/desconexión del pic al host USB.
// USB_CONECTADO: prende led verde.
// USB_DESCONECTADO: prende led rojo.
// Programador: Moyano Jonathan.
// Fecha: 11/12/08

#include <18F2550.h> // Definición de registros internos.

#fuses HSPLL,NOMCLR,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN,NOPBADEN

// Fuses utilizados:
/*
HSPLL: utilizamos un cristal HS de alta velocidad, en conjunto con el PLL para generar los 48Mhz.
NOMCLR: Utilizamos reset por software, y dejamos el pin 1 del micro como entrada/salida digital.
NOWDT: No utilizamos el perro guardían.
NOPROTECT: Desactivamos la protección de código.
NOLVP: Desactivamos la programación a bajo voltaje.
NODEBUG: No entramos al modo debug.
USBDIV: signfica que el clock del usb se tomará del PLL/2 = 96Mhz/2 = 48Mhz.
PLL5: significa que el PLL prescaler dividirá en 5 la frecuencia del cristal. para HS = 20Mhz/5 = 4Mhz.
CPUDIV1: El PLL postscaler decide la división en 2 de la frecuencia de salida del PLL de 96MHZ, si queremos 48MHZ, lo dejamos como está.
VREGEN: habilita el regulador de 3.3 volts que usa el módulo USB
NOPBADEN: Deshabilitamos el módulo de conversión ADC del puerto B.
*/

#use delay(clock=48000000) // Frecuencia máxima de trabajo 48 Mhz.
#define USB_CON_SENSE_PIN PIN_E3 // Definiendo este pin , detectamos si el host está conectado o no por hardware.
#include "usb_cdc.h" // Descripción de funciones del USB.
#include "usb_desc_cdc.h" // Descriptores del dispositivo USB.

void main(){
usb_cdc_init(); // llamadas necesarias para iniciar el módulo USB.
    usb_init();    // llamadas necesarias  para iniciar el módulo USB.
   do{
    usb_task(); // En esta función se detecta la conexión/desconexión del pic al host USB (por software).
   }while (TRUE); // bucle eterno
}
```


----------



## Moyano Jonathan (Dic 11, 2008)

Mañana comenzaremos con un nuevo tema , que trata de como realizar otras actividades aparte de atender la conexión usb.


----------



## Meta (Dic 12, 2008)

Te han respondido ya en:
http://forums.microsoft.com/MSDN-ES/ShowPost.aspx?PostID=4227073&SiteID=11&mode=1


```
Bueno, lo que es convertir el código en sí es fácil. Abajo te lo copio convertido. Pero no te servirá de mucho. Es un código para manejar el objeto MSComm, que no tienes en .Net, y además son eventhandlers cuya conexión al evento no está indicada en el código a convertir.

 

Code Snippet

void conectar_Click()

//comprueva [sic] que el puerto este cerrado para poder abrirlo

{
    if (MSComm1.PortOpen == false) {
        //determina el puerto que hemos seleccionado.
        if (COM_sel.ListIndex == 0) {
            MSComm1.CommPort = 1;
        }
        if (COM_sel.ListIndex == 1) {
            MSComm1.CommPort = 2;
        }
        if (COM_sel.ListIndex == 2) {
            MSComm1.CommPort = 3;
        }
        if (COM_sel.ListIndex == 3) {
            MSComm1.CommPort = 4;
        }
        if (COM_sel.ListIndex == 4) {
            MSComm1.CommPort = 5;
        }
        if (COM_sel.ListIndex == 5) {
            MSComm1.CommPort = 6;
        }
        if (COM_sel.ListIndex == 6) {
            MSComm1.CommPort = 7;
        }
        if (COM_sel.ListIndex == 7) {
            MSComm1.CommPort = 8;
        }
        if (COM_sel.ListIndex == 8) {
            MSComm1.CommPort = 9;
        }
        if (COM_sel.ListIndex == 9) {
            MSComm1.CommPort = 10;
        }
        if (COM_sel.ListIndex == 10) {
            MSComm1.CommPort = 11;
        }
    }
   
    MSComm1.OutBufferSize = 1;
    //tamaño del dato a transmitir.
    MSComm1.InBufferSize = 23;
    MSComm1.InputMode = comInputModeText;
    //los datos se recuperan en modo texto.
    MSComm1.InputLen = 23;
    // BUFFER DE ENTRADA SE PUEDE DEJAR AL MAXIMO.
    MSComm1.PortOpen = true;
    MSComm1.RThreshold = 23;
    //son 23 caracteres.
}

 

void MSComm1_OnComm()

{

        string InBuff = null;
        switch (MSComm1.CommEvent) {
            case comEvReceive:
                InBuff = MSComm1.Input;
                Debug.Print();
                InBuff();
                Texto.Text = "";
                Texto.Text = Strings.Left(InBuff, 23);
                // se recorta los caracteres basura
                MSComm1.PortOpen = false;
                break;
            //cierra el puerto y vacia el buffer
        }
}
```

http://foros.solocodigo.com/viewtopic.php?f=53&t=37799



			
				kaidok dijo:
			
		

> En esta página se ofrece un conversor que realiza esa función, pero es de pago así que no creo que te interese. Creo que el Microsoft Visual Studio también incluye una herramienta para realizar la conversión que pides, pero el Microsoft Visual Studio tampoco es gratis.
> 
> Me temo que no hay nada gratuito que realice la conversión que pides, en todo caso te dejo esta información.


----------



## Moyano Jonathan (Dic 12, 2008)

Cúal será la herramienta de visual estudio de la que habla? . Por lo demás gracias meta lo que posteas es de una gran ayuda.


----------



## Moyano Jonathan (Dic 12, 2008)

Hola a todos.

* Utilización del micro, mientras el usb no está conectado: Parte 1 *

Viendo en la librería usb_pic18, vamos a ver a mediado que vamos bajando los comentarios (En inglés), de lo que hace cada función de dicha librería.

*usb_init()*:
Inicializa el hardware USB.  Luego espera de forma indefinida hasta que el puerto haya sido conectado (Aunque no importa si ha sido enumerado aún por el host).  Luego de que es enumerado , se habilitan las interupciones del usb.
*usb_init_cs()*:
Es lo mismo que la función anterior, aunque *No espera indefinidamente a que el puerto haya sido conectado*.  Esta función es ideal , si el dispositivo no usa la alimentación del puerto, y puede funcionar sin la conexión a usb.
*usb_task()*:
/***************************************************************************************
/* usb_task()
/*
/* Función: Mantiene un ojo puesto sobre el SENSE pin para saber si el cable usb está o no conectado.
/*               Si está conectado inicializa el periferico si es requerido. Si no está conectado el cable desactiva el
/*               puerto usb del PIC.
/* Nota:     Si el SENSE pin no es definido en la programación del pic, el hardware usb se inicializa de forma
/*               automática.
/*           
/* Nota:     Esta función también habilita las interrupciones si el hardware usb está conectado.
/* 
/*
/***************************************************************************************
*usb_detach()*:
Remueve al pic del bus usb.  Esta función será llamada automáticamente si la conexión con el host se pierde, aunque puede ser llamada por el usuario.
*usb_attach()*: 
Conecta el pic al bus usb  Esta función será llamada automáticamente si la conexión con el host, es realizada aunque puede ser llamada por el usuario.
*usb_attached()*:
Si se usa el pin de sensado de conexión (USB_CON_SENSE_PIN), retorna con un 1 lógico, si el pin de sensado no es utilizado, retorna con un 1 lógico de igual forma.
*usb_enumerated()*:
Retorna con un 1 lógico si el host enumera el dispositivo. En ese caso el pic puede enviar o recibir paquetes de datos por el puerto.


Vean la diferencia de la función usb_init() con usb_init_cs(), si queremos ejecutar otros procesos en el micro usb_init() no nos serviría, porque se quedaría en un bucle esperando al HOST, pero lo que nosotros queremos hacer es que el micro realize otras tareas mientras espera la conexión dels host.  Entonces se usará la función 
usb_init_cs().

Esta otra función usb_init_cs() trabaja de forma conjunta con con usb_task(), porque una vez detectado el Vbus a través de USB_CON_SENSE_PIN, en task se procede a conectar el bus.

Lo principal aquí es estar monitoreando continuamente a USB_CON_SENSE_PIN, ya sea a través de usb_attached() ó de usb_task().

Otra función muy importante es:
*usb_enumerated()*:
Retorna con un 1 lógico si el host enumera el dispositivo. En ese caso el pic puede enviar o recibir paquetes de datos por el puerto.

Esta función lisa y llanamente , no permite comunicarnos con el host hasta que el mismo nos enumere el dispositivo.   

Bueno hasta acá llega la primera parte , luego voy a presentar un ejemplo en donde apliquemos lo antes explicado.


----------



## Moyano Jonathan (Dic 16, 2008)

Hola a todos.

*Utilización del micro, mientras el usb no está conectado: Parte 2*

Bueno , perdonen por la demora ajaj acá les traigo el ejemplo del que les estaba contando en el post anterior.

Es un ejemplo muy simple , pero sirve para ver como el PIC pude realizar otras actividades mientras el host no está conectado.

El Código fuente en CCS es el siguiente:

```
// Programa: Realiza procesos secundarios mientras el dispositivo está desconectado del HOST.
// Programador: Moyano Jonathan.
// 15/12/08
/********************************************************************************************/

#include <18F2550.h> // Definición de registros internos.

#fuses HSPLL,NOMCLR,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN,NOPBADEN

// Fuses utilizados:
/*
HSPLL: utilizamos un cristal HS de alta velocidad, en conjunto con el PLL para generar los 48Mhz.
NOMCLR: Utilizamos reset por software, y dejamos el pin 1 del micro como entrada/salida digital.
NOWDT: No utilizamos el perro guardían.
NOPROTECT: Desactivamos la protección de código.
NOLVP: Desactivamos la programación a bajo voltaje.
NODEBUG: No entramos al modo debug.
USBDIV: signfica que el clock del usb se tomará del PLL/2 = 96Mhz/2 = 48Mhz.
PLL5: significa que el PLL prescaler dividirá en 5 la frecuencia del cristal. para HS = 20Mhz/5 = 4Mhz.
CPUDIV1: El PLL postscaler decide la división en 2 de la frecuencia de salida del PLL de 96MHZ, si queremos 48MHZ, lo dejamos como está.
VREGEN: habilita el regulador de 3.3 volts que usa el módulo USB
NOPBADEN: Deshabilitamos el módulo de conversión ADC del puerto B.
*/

#use delay(clock=48000000) // Frecuencia máxima de trabajo 48 Mhz.
short estado_usb;   // boolean global, se debe declarar antes de llamar a usb_cdc.h
#define USB_CON_SENSE_PIN PIN_E3 // Definiendo este pin , detectamos si el host está conectado o no por hardware.
#include "usb_cdc.h" // Descripción de funciones del USB.
#include "usb_desc_cdc.h" // Descriptores del dispositivo USB.

// Declaramos las funciones utilizadas.
void estado_conexion_usb(short bandera);

void main() {
estado_usb=false;
   usb_cdc_init(); // llamadas necesarias para iniciar el módulo USB.
   usb_init_cs();    // inicia el USB y sale. Va de la mano con usb_task().
while(true){
     usb_task(); // configura el USB.
     estado_conexion_usb(estado_usb); // Se fija en el estado de la conexión usb.
     if(usb_cdc_connected()){ // Si está conectado entonces....
   // Espera a detectar una transmisión de la PC (Set_Line_Coding).
       if (usb_enumerated()){ // aquí se enumera el dispositivo por el host y despúes sale.
          if(usb_cdc_kbhit()){ //en espera de nuevo(s) caracter(es) en el buffer.
             if(usb_cdc_getc()=='m'){ //¿lo que llegó fué el caracter m?

                printf(usb_cdc_putc, "Llegó la letra m.\n\r"); // Envia una respuesta al HOST.
                output_high(PIN_B7); // Indica que ha llegado un caracter.
                delay_ms(1000); // Espera 1 seg.
                output_low(PIN_B7); // Apaga el indicador de llegada de caracteres.
             }  
          }
       }
     }
//*************** aquí se ejecutan otros procesos*********************//
// Estos procesos son independientes de la conexión por usb.
output_high(PIN_B6); // enciende el LED, conectado al pin RB6.
delay_ms(500); // Espera 500 mseg.
output_low(PIN_B6); // Apaga el LED, conectado al pin RB6.
delay_ms(500); // Espera 500 mseg.
}
}
//***********************************************
// Esta función, nos indica mediante 2 diodos LED conectados al 
// puerto RB0 y RB1 respectivamente. El estado de conexión del puerto usb.
// Conectado: Enciende LED VERDE.
// Desconectado: Enciende LED ROJO.
//***********************************************
void estado_conexion_usb(short bandera){
 if(bandera){
 output_high(PIN_B0); // Enciende LED VERDE.
 output_low(PIN_B1);  // Apaga LED ROJO.
 }else{
 output_high(PIN_B1); // Enciende LED ROJO.
 output_low(PIN_B0);  // Apaga LED VERDE.
 }
}
```

Para detectar la conexión con el host usamos las funciones antes vistas : *usb_attach()* , *usb_dettach()* , pero además usamos una variable que nos indique la conexión/desconexión. Esta varible es 

```
short estado_usb;   // boolean global, se debe declarar antes de llamar a usb_cdc.h
```

Esta variable se usa en la librería usb_pic18, en la que modifique un par de lineas para que me mostrara el estado de la conexión.


```
/******************************************************************************
/* usb_detach()
/*
/* Summary: Remove the D+/D- lines from the USB bus.  Basically, disable USB.
/*
/*****************************************************************************/
void usb_detach(void) {  //done
   // Definimos un boolean que nos dice el estado de la conexión.   
   estado_usb = false;
   delay_ms(50); // espero 50ms.
   UCON=0;  //disable USB hardware
   UIE=0;   //disable USB interrupts
   UCFG = __UCFG_VAL_DISABLED__;
   set_tris_c(*0xF94 | 0x30);
   usb_state=USB_STATE_DETACHED;
   usb_token_reset();              //clear the chapter9 stack
   __usb_kbhit_status=0;
}

/******************************************************************************
/* usb_attach()
/*
/* Summary: Attach the D+/D- lines to the USB bus.  Enable the USB peripheral.
/*
/* You should wait until UCON_SE0 is clear before enabling reset/idle interrupt
/*
/*****************************************************************************/
void usb_attach(void) {
   usb_token_reset();
    // Definimos un boolean que nos dice el estado de la conexión.   
   estado_usb = true;
    delay_ms(50); // espero 50ms.
    UCON = 0;
    UCFG = __UCFG_VAL_ENABLED__;
    UIE = 0;                                // Mask all USB interrupts
    UCON_USBEN = 1;                     // Enable module & attach to bus
    usb_state = USB_STATE_ATTACHED;      // Defined in usbmmap.c & .h
}
```

En el código fuente del firmware , use la función *usb_init_cs()*. Esta función es muy importante ya que como dijimos antes , me permite realizar otras tareas mientras el host no esté conectado.

Bueno las librerías usadas son las mismas , menos usb_pic18 que hay que hacerle la modificación que puse más arriba.

El código fuente del programa es el siguiente:


```
' Programa de ejemplo que envía un caracter al PIC. El mismo responde devolviendo
' una cadena de respuesta que hace heco del caracter recibido. Mientras el HOST no evíe
' ninguna cadena, el PIC cumplira otras funciones.
' el uso de bandera permite averiguar varios datos para confirmar el estado real
' de la conexión

Option Explicit
' Declaramos variables.
Dim value As Long
Dim bandera As Boolean ' Bandera para saber cuando el host está conectado.
Private Sub conectar_Click()
'comprueva que el puerto este cerrado para poder abrirlo
    If MSComm1.PortOpen = False Then
        'determina el puerto que hemos seleccionado.
        If puerto.ListIndex = 0 Then
            MSComm1.CommPort = 1
            End If
        If puerto.ListIndex = 1 Then
            MSComm1.CommPort = 2
            End If
        If puerto.ListIndex = 2 Then
            MSComm1.CommPort = 3
            End If
        If puerto.ListIndex = 3 Then
            MSComm1.CommPort = 4
            End If
        If puerto.ListIndex = 4 Then
            MSComm1.CommPort = 5
            End If
        If puerto.ListIndex = 5 Then
            MSComm1.CommPort = 6
            End If
        If puerto.ListIndex = 6 Then
            MSComm1.CommPort = 7
            End If
        If puerto.ListIndex = 7 Then
            MSComm1.CommPort = 8
            End If
        If puerto.ListIndex = 8 Then
            MSComm1.CommPort = 9
            End If
        If puerto.ListIndex = 9 Then
            MSComm1.CommPort = 10
            End If
        If puerto.ListIndex = 10 Then
            MSComm1.CommPort = 11
            End If
            End If
            
MSComm1.OutBufferSize = 1 'tamaño del dato a transmitir.
MSComm1.InBufferSize = 16  '16 caracteres
MSComm1.InputLen = 16  ' Buffer de entrada.
MSComm1.RThreshold = 16
MSComm1.PortOpen = True
End Sub

Private Sub envio_Click()
    Timer1.Enabled = False

    If MSComm1.PortOpen = True Then
      MSComm1.Output = "m"
    End If
    Timer1.Enabled = True
End Sub
Private Sub Form_Load()
puerto.AddItem "COM1" ' Añadimos diferentes numeraciones para el puerto serie.
puerto.AddItem "COM2"
puerto.AddItem "COM3"
puerto.AddItem "COM4"
puerto.AddItem "COM5"
puerto.AddItem "COM6"
puerto.AddItem "COM7"
puerto.AddItem "COM8"
puerto.AddItem "COM9"
puerto.AddItem "COM10"
puerto.AddItem "COM11"
puerto.ListIndex = 0   ' Configuramos COM1, como predeterminado.
Timer1.Interval = 10
Timer1.Enabled = True 'activamos el ciclo de escan.
bandera = False
End Sub
Private Sub Form_Unload(Cancel As Integer)
    If MSComm1.PortOpen = True Then
    MSComm1.PortOpen = False
    End If
End Sub
Private Sub MSComm1_OnComm()
Dim InBuff As String
Select Case MSComm1.CommEvent
    Case comEvReceive
    InBuff = MSComm1.Input
    Debug.Print InBuff
    recibo.Text = ""
    recibo.Text = Left$(InBuff, 16)  ' se recorta los caracteres basura
    MSComm1.PortOpen = False  'cierra el puerto y vacia el buffer
    Espera 2  ' Retardo de  2 segundos.
    recibo.Text = ""
End Select
End Sub
Private Sub Timer1_Timer()
On Error GoTo paca
DoEvents
If MSComm1.PortOpen = True Then
    DoEvents
    estado.Caption = "CONECTADO"
    Debug.Print "Conectado"
    MSComm1.PortOpen = False
    Exit Sub
Else
    DoEvents
    MSComm1.PortOpen = True
    Exit Sub
End If
paca: Debug.Print Err.Number & ": " & Err.Description
     Select Case Err.Number
        Case 8002   'Número de puerto no válido
            DoEvents
           estado.Caption = "DESCONECTADO"
        Case 8005 'el puerto ya está abierto
            DoEvents
            estado.Caption = "ABIERTO"
        Case 8012 '8012 el dispositivo no está abierto
            DoEvents
            estado.Caption = "DESCONECTADO"
        Case 8015
            DoEvents    ' para evitar retardos en bucles
            estado.Caption = "DESCONECTADO"
    End Select
      Exit Sub
End Sub
' Procedimiento de retardo.
Sub Espera(Segundos As Single)
  Dim ComienzoSeg As Single
  Dim FinSeg As Single
  ComienzoSeg = Timer
  FinSeg = ComienzoSeg + Segundos
  Do While FinSeg > Timer
      DoEvents
      If ComienzoSeg > Timer Then
          FinSeg = FinSeg - 24 * 60 * 60
      End If
  Loop
End Sub
```


----------



## Moyano Jonathan (Dic 16, 2008)

Lo único que hace falta es un ejemplo concreto , de como usar la clase CDC con toda la información hasta ahora recabada. Y luego podemos pasar de lleno a estudiar la mpusbapi.dll o también llamado comunicación por bulck tranfer (transferencia de paquetes de datos).


----------



## Meta (Dic 16, 2008)

Muy buena.


----------



## Moyano Jonathan (Dic 17, 2008)

El ejemplo que vamos a desarrollar va a requerir de otros conocimientos. En concreto: Como funciona el CAD del microcontrolador PIC18F2550. 

CAD: Conversor analógico digital.

Luego podremos seguir con los ejemplos.

PD: He decidido ponerme a estudiar bien la programación en Visual C# , mientras tanto los ejemplos los estoy desarrollando en Visual Basic 6.0 , cuando entienda bien la programación en Visual C# pasaré todos los ejemplos que hemos visto a ese lenguaje.


----------



## Moyano Jonathan (Dic 17, 2008)

Ya estoy realizando un borrador a mano con el desarrollo del tema del conversor DAC del pic18f2550. En estos días lo estoy terminando y posteando.


----------



## Moyano Jonathan (Dic 17, 2008)

Ya estoy realizando un borrador a mano con el desarrollo del tema del conversor CAD del pic18f2550. En estos días lo estoy terminando y posteando.


----------



## Meta (Dic 17, 2008)

Moyano Jonathan dijo:
			
		

> El ejemplo que vamos a desarrollar va a requerir de otros conocimientos. En concreto: Como funciona el CAD del microcontrolador PIC18F2550.
> 
> CAD: Conversor analógico digital.
> 
> ...


----------



## Moyano Jonathan (Dic 17, 2008)

Jajaja si meta lo estoy estudiando de a poco porque se me hizo .....como decir un cuello de botella de lenguajes. Lo del CAD tenés razón que se usa mucho por eso voy a tratar de que la información sea buena , voy a tratar de que se entienda lo mejor posible. Por la red hay proyectos muy buenos para realizar con el CAD. Luego de ver el tema del cad y del usb voy a ir viendo los otros módulos como el spi el i2c usart comparador/capturador/pwm  en fin todo lo que esté a mi alcanze de conocimientos (y dinero).

PD: Elejí visual C# por que hay bastante información al respecto, incluso más que para visual basic 2008, pero voy a ir despacio.
También voy a ver si filmo algunos videitos como para que tengan de muestra.


----------



## nutriax (Dic 20, 2008)

una consulta jonathan...
estube viendo el codigo fuente del pic en este pedazo:

   usb_init_cs();    // inicia el USB y sale. Va de la mano con usb_task().
while(true){
     usb_task(); // configura el USB.
     estado_conexion_usb(estado_usb); // Se fija en el estado de la conexión usb.
     if(usb_cdc_connected()){ // Si está conectado entonces....
   // Espera a detectar una transmisión de la PC (Set_Line_Coding).
       if (usb_enumerated()){ // aquí se enumera el dispositivo por el host y despúes sale.
          if(usb_cdc_kbhit()){ //en espera de nuevo(s) caracter(es) en el buffer.

ahi, en la linea donde esta "usb_task(); // configura el USB." es necesario que lo configures al puerto usb en cada iterasion del while?
y lo mismo me pregunto con el usb_enumerated, este ultimo no se enumera cuando el sistema operativo lo reconoce?
disculpa mi ignorancia pero nunca me puse a usar el usb, siempre intente pero nunca tube tiempo y ahora estoy un poco mas libre


----------



## Moyano Jonathan (Dic 20, 2008)

Si el usb_task(), es necesario por que se fija continuamente en el estado de la conexión (por hardware) del pic con host, utilizando para esto el pin sense.
Usb_enumerated() es como decirte....un juego de preguntas y respuestas que hace el pic con el host en donde se preguntan mutuamente si están listos para recibir/trasmitir datos. Cuando el sistema operativo reconoce al pic, solo hace eso "reconocerlo" y luego establece un puerto de comunicaciones (lo explicare más adelante)

espero lo entiendas , cualquier cosa decime.


----------



## nutriax (Dic 20, 2008)

ok perfecto... entendido.
pudiste hacer alguna conexion hid?


----------



## Moyano Jonathan (Dic 21, 2008)

No HID todavía estoy tratando de entender el protocolo y como comunicarme con visual basic.

PD: Estoy viendo el tema de  las librerías de fat32 con pic en CCs pero ocupan mucha memoria.


----------



## hacktek (Dic 21, 2008)

Disculpen mi ignorancia pero soy ultra nuevo en esto,  pero como conecto el pic al usb? :S para poder programarlo? onda cargar firm y extras? 

Espero no molestar... 

Gracias.


----------



## Meta (Dic 22, 2008)

hacktek dijo:
			
		

> Disculpen mi ignorancia pero soy ultra nuevo en esto,  pero como conecto el pic al usb? :S para poder programarlo? onda cargar firm y extras?
> 
> Espero no molestar...
> 
> Gracias.



Buenas:

Lee paso a paso  desde el primer post que te lo dice.

Mira los manuales en PDF aquí. hay un manual sobre RS232 puerto serie que funciona.

Ver manuales

Saludo.


----------



## nutriax (Dic 22, 2008)

y decime de donde son esas librerias? de fat32?


----------



## Moyano Jonathan (Dic 23, 2008)

de ccs de las últimas versiones, están pensadas para los micros de gama alta pic24 o dspic33f


----------



## Moyano Jonathan (Dic 24, 2008)

Hola a todos , bueno acá les traigo el último post del día.

Lo que les pongo a continuación es la teoría del conversor ADC del PIC18F250, esta primera parte de la explicación trae lo básico a saber sobre la conversión analógica / digital aplicada en el PIC.

Si tienen dudas o sugerencias , haganmelo saber.

PD: Luego voy a postear los ejemplos de control


----------



## Moyano Jonathan (Dic 25, 2008)

Alquien ha podido experimentar con el adc de la serie 18fxx5x?

Voy a ver si en los ejemplos puedo aplicar el control de un lcd 2 x 16 que compre nuevo.


----------



## jokelnice (Dic 26, 2008)

hey que onda mucchachos soy nuevo en el foro me gustaria aportar acerca del tema , les comento que yo he sacado la comunicacion por usb usando tambien la .dll de microchip pero con otro software diferente a los nombrados aqui, utilice ......... labview ....... y pues hablando del conversor  analogo con la serie 18f no he mirado , pero no creo que tenga mucha diferencia con los dela serie 16f.
un saludo amigos .


----------



## nutriax (Dic 26, 2008)

si jonathan, yo he realizado un curso de pic este año y te comento que he usado el ccp (creo que se llamaba), que es para hacer pwm por hard , lcd 2x20, adc en 8 y 10 bits, eeprom externa, rtc, rs232, entre otras cosas... pero es muy facil y tenes todo en las librerias... no tenes que hacer mas nada que conectar el micro y llamar a las funciones...
yo ni bien pueda me voy a poner con el lcd, rtc,eeprom externa y rs232 en un solo proyecto (todo funcionando juntito ).
pero antes queria terminar lo de la memoria, vos como andas con ese tema de la memoria?
aunque ahora no tengo a mano el micro para probar lo de la memoria (porque en proteus no anda y en el micro me dijeron que si...  asique cortamos clavo hasta tener el micro.... ).
y como no tengo el micro ahora voy a ver si me empiezo este proyectito... ya vere que hago...
cualquier cosa que tengas dudas pregunta sobre las funciones que se usan para manejar los perifericos que comente... (fui el unico que aprobo con 10 el curso... asique algo aprendi   )


----------



## jokelnice (Dic 26, 2008)

como buen aporte al tema pienso que es bueno comentarles que proteus en su ultima version lanzo la posibilidad de emular el puerto usb (  es cierto quiere decir que podremos probar los ejemplos sin necesidad de tener lod dispositivos reales y funciona igual yo ya hice la prueba si les interesa habisenme y le envio para que lo descarguen , saludos  les envio una imagen


----------



## pepechip (Dic 26, 2008)

jokelnice dijo:
			
		

> como buen aporte al tema pienso que es bueno comentarles que proteus en su ultima version lanzo la posibilidad de emular el puerto usb (  es cierto quiere decir que podremos probar los ejemplos sin necesidad de tener lod dispositivos reales y funciona igual yo ya hice la prueba si les interesa habisenme y le envio para que lo descarguen , saludos  les envio una imagen


Cuando puedas sube el esquema y el HEX para su simulacion


----------



## pic-man (Dic 26, 2008)

Ahora ya estoy de vacaciones asi que comenzare a ver todos los ejemplos que aparecen en este tema y si puedo tratare de aportar algo de mi propia cosecha.


----------



## Moyano Jonathan (Dic 26, 2008)

Jokelnice: Si tenés ejemplos de labview con usb , postealos la verdad hay mucha gente preguntando lo mismo en el foro y les va a ser de mucha ayuda. Lo que planteas de usar el puerto usb virtual de proteus, sirve aunque a mi hay muchos ejemplos de usb que funcionan en la realidad y no en proteus. Además proteus consume demasiados recursos cuando simulo usb (no se porque).

Nutriax: Todos los ejemplos de control con el módulo ccp y demás ejemplos estaría bueno que los postearas a ver si luego en conjunto con lo de usb se puede sacar algún proyecto adelante.

Picman: No te he podido pasar la información que me pediste por mp por falta de tiempo. Igual cualquier cosa que necesites que te ayude con el tema de usb , no dudes en preguntar.

A todos los demás les digo que experimenten y cuenten sus experiencias que nos sirven a todos , yo estoy haciendo un ejemplo en este momento muy sencillo de como se usa el modulo adc del pic18f2550 que luego voy a postear.


----------



## jokelnice (Dic 26, 2008)

bueno listo voy a postear un ejemplo  en ........... Labview ............,que creo que es el mas facil de los programas y es el que nos ayudara a entender y comprender mejor lo que vendria despues ; el ejemplo consiste en que el programa avise cuando se conecta un dispositivo usb ( prendiendo un led ) y cuando se desconecta se ( apaga ) solo estoy utilizando la funcion de la dll llamada MPUSBGETDEVICECOUNT(PVID_PID) que pide un vid y un pid que retorna '1' cuando el disposotivo co ese vid y pid es conectado , traten de entenderlo cual cosa habisenme y ayudamos cabe destacar que no se esta haciendo ninguna lectura ni escritura del puerto pero debe haber un disposotivo con esas caracteristicas ; 
saludos y ojala les sirva


----------



## Moyano Jonathan (Dic 26, 2008)

Muy bueno el ejemplo yo igual todavía tengo que terminar la explicación de la clase CDC y luego de eso me voy a poner de lleno con la librería mpusbapi.dll


----------



## Moyano Jonathan (Dic 28, 2008)

Hola a todos.

Bueno despúes de ver la información sobre como trabaja el módulo conversor AD del PIC18F2550, les pongo un ejemplo muy básico que nos muestra el valor de los registros *ADRESH y ADRESL*. Lo que hace es volcar los valores de dichos registros en el puerto B y el puerto C.

El código fuente del ejemplo:

```
// Prueba de funcionamiento del conversor A/D del PIC18F2550.
// Programador: Moyano Jonathan.
// Fecha: 24/12/08.

#include <18F2550.h> // Definición de registros internos.
//#DEVICE ADC=8 // cad a 8 bits, justificación a a la derecha.
#DEVICE ADC=10 // cad a 10 bits, justificación a a la derecha.
//#DEVICE ADC=16 // cad a 10 bits, justificación a a la izquierda.

#fuses HSPLL,NOMCLR,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,NOVREGEN,NOPBADEN

// Fuses utilizados:
/*
HSPLL: utilizamos un cristal HS de alta velocidad, en conjunto con el PLL para generar los 48Mhz.
NOMCLR: Utilizamos reset por software.
NOWDT: No utilizamos el perro guardían.
NOPROTECT: Desactivamos la protección de código.
NOLVP: Desactivamos la programación a bajo voltaje.
NODEBUG: No entramos al modo debug.
USBDIV: signfica que el clock del usb se tomará del PLL/2 = 96Mhz/2 = 48Mhz.
PLL5: significa que el PLL prescaler dividirá en 5 la frecuencia del cristal. para HS = 20Mhz/5 = 4Mhz.
CPUDIV1: El PLL postscaler decide la división en 2 de la frecuencia de salida del PLL de 96MHZ, si queremos 48MHZ, lo dejamos como está.
NOVREGEN: deshabilita el regulador de 3.3 volts que usa el módulo USB.
NOPBADEN: Deshabilitamos el módulo de conversión ADC del puerto B.
*/

#use delay(clock=48000000) // Frecuencia máxima de trabajo 48 Mhz.

void main() {
long valor;    // Guardamos el valor de conversión del AD.
int   parte_alta; // Parte alta de la conversión. (ADRESH).

   output_a (0);    // Resetea los puertos.
   output_b (0);   
   output_c (0);
   set_tris_a(0x1);   // configura los puertos como salidas, menos el RA0 que lo configura como entrada.
   set_tris_b(0x0);   
   set_tris_c(0x0);
//-----------------------------------
   disable_interrupts(global);
   disable_interrupts(int_timer1);
   disable_interrupts(int_rda);
   disable_interrupts(int_ext);
   disable_interrupts(int_ext1);
   disable_interrupts(int_ext2);
   setup_spi(FALSE);

   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
   port_b_pullups(FALSE);    
   
   setup_adc_ports( AN0 || VSS_VDD ); // Configuramos RA0, como entrada analógica.
   setup_adc(ADC_CLOCK_DIV_64 ); // Configuramos el relog del ADC.
   #asm 
   movlw 0b10111110   ;justificacion_derecha,20Tad,Fosc/64
   iorwf 0xFC0,1      ; direccion de ADCON2   // Configuramos el ADCON2.
   #endasm
   set_adc_channel(0); // Elejimos el canal AN0, correspondiente a RA0.
   while(1){ // bucle infinito
      valor = read_adc();   // toma el resultado del CAD.
      output_b((int)valor);   // envía el byte LSB a portb.
      parte_alta=(int)((valor & 0x300)>>8); // separa los 2 bits MSB de valor.
      output_c(parte_alta);   // y los envia al portc.
   }
}
```

En el esquemático van a ver que puse un capacitor de 100nF en la entrada, esto lo recomienda microchip en la hoja de datos del integrado, cuando la señal analógica varía a muy baja frecuencia, ejemplo: Cuando aplicamos señal de un potenciómetro.

Bueno lo que queda ahora es ver un ejemplo de aplicación utilizando este módulo y USB.


----------



## afprog (Ene 12, 2009)

Hola muchachos y picmaniacos llevo varios meses experimentando con el puerto usb y los pic 18f 2550 y 18f4550 he logrago manejarlos en dos de sus formas (cdc y bulk) de transferencia estoy en busca de realizar una aplicacion   con hid en c/c++ o java.
cualquier avance sera reportado a ustede y si tienen alguna información se la agradesco.
si les puedo ayudar en algo con mucho gusto, ya desarrolle transferencia de paquetes (bulk) en c/c++ standart y compilado en dev-c++


----------



## Moyano Jonathan (Ene 13, 2009)

Todo lo que postees sobre el tema será recibido con los brazos abiertos ya que este apartado es para aprender todo lo que se pueda sobre el puerto usb del pic18f2550 y familia...

PD: HID no lo he podido probar aunque  esta en mis proyectos futuros hacerlo.


----------



## lalobots82 (Ene 14, 2009)

Saludos

Antes que nada muchas gracias por compartir tus ejemplos "Moyano"  

Estoy dando mis primeros pasos con el 18f2550 y mi custion es la siguiente:

Probe el ejemplo 1 de este foro y no funciona en mi circuito, lo curioso es que en el simulador de proteus trabaja perfectamente por lo que deduje que el problema estaba en el circuito, pero ya revise todas las conexiones y estan bien, pero tengo algunas dudas:

1.-tiene un cristal de 20Mhz pero en el codigo se le indica que la velocidad es de 48, es esto correcto?
2.-la alimentacion del pic la estoy tomando de la misma conexion USB, es correcto?

por lo demas no creo que haya problema, la verdad no es nada complejo, solo las conexiones a vdd y vss, D- y D+, y el reset, no se si me falte algo


----------



## nutriax (Ene 15, 2009)

Hola, lo de 48 megas esta bien, si te fijas en las hojas del datasheet ahi te explica bien porque es asi (pero son por los fuse), ya que esta activo el prescaler, postcaler, plls y todo un folcklore...     esto lo permiten los micros que soportan usb, ya que esa es la frecuencia que deben tener par trabajar con dicho protocolo.
por otra parte yo lo que probaria es
1- si tenes bien conectado el d+ y d-
2- Fijate si tenes bien conectado el capacitor del regulador (el que nececita el pic para cuando trabaja con usb) la pata del micro es Vusb.
3- si la ficha hace bien contacto (la usb) porque en argentina venden una fichas que son chinas y muchas veces no hacen bien contacto (aunque parece raro pasa muy seguido).


----------



## Moyano Jonathan (Ene 16, 2009)

El circuito deber de tener alguna falla de montaje , me tendrías que mostrar una foto del mismo para ver donde está el error. A mi me pasó que los montajes en protoboard no funcionan bien, entonces me hice una mini targeta de pruebas para probar los montajes. Lo que dice nutriax es correcto, por favor revisá que haya continuidad en las conexiones y despúes si no funciona decime porque yo lo he probado un millón de veces y funciona muy bien.


----------



## Moyano Jonathan (Ene 16, 2009)

Como ya volví de mis queridas vacaciones voy a ponerme con los proyectos que deje atrás como por ejemplo el pickit2 que tanto me han pedido y otros que voy a ir desarrollando durante el año.
Los ejemplos de usb también los voy a seguir posteando para  los amantes del pic18f2550.

PD: Espero sepan disculpar mis demoras , pero las vacaciones son sagradas.


----------



## lalobots82 (Ene 16, 2009)

Sludos
Muchas gracias *nutriax* y *moyano*, y pues si efectivamente lo unico que me faltaba era el capacitor en el vusb   , lo conecte y funciono a la perfección   

Aunque si, como dices moyano con el protoboard hay algunos inconvenientes, sobre todo con el conector usb tipo B, asi que el siguiente paso es hacer una tarjeta de pruebas.

¿Tendran por ahi una que me recomienden para el 18f2550?

Muchas Gracias!


----------



## Moyano Jonathan (Ene 16, 2009)

yo publique una acá en el foro , pero voy a publicar la actualización dentro de pronto


----------



## jokelnice (Ene 20, 2009)

que tal amigos esta vez les muestro una aplicacion con usb y labview que consiste en enviar los datos desde el pc al micro ( 8 botones y se veran refjejados en o leds o salidas en el micro les envio el video 


usby labview


----------



## Moyano Jonathan (Ene 20, 2009)

Muy bueno jokelnice, justo estaba terminando el último ejemplo de usb con CDC y me voy a poner de lleno con bulk transfer. También estoy investigando el tema del HID


----------



## evvrivas (Ene 21, 2009)

Hola a todos, quisiera preguntar algunas cosas, estoy intentando hacer una aplicacion con el pic18f4550
en la cual quiero leer algun canal del ADC y en viar el dato via USB a la PC, en la PC tendre un programa hecho con python y la libreria pyusb, el problema o duda que tengo es el siguiente.

la aplicacion para el micro "firmware" lo ocupo de los ejemplos que estan en este post. al inicio, es decir agarro el ejemplo y se lo meto al micro, "copio las librerias, alli esta el pid y el vid "

al conectar el micro al USB me aparece dispositivio no reconocido, instalo el driver y listo.

el problema surge en python cuando quiero enumerar el PID y el VID de este dispositivo, sera que el firmware que tiene el micro no envia esta información al PC, si es asi como puedo hacer para que el micro me envie el pid y el VID,

yo corro una aplicacion para enumerar los dispositivos USB, todos los dispositivos usb aparecen enumerados (VID,PID), solo el de el micro pic18f4550 no aparece, porque es esto...? gracias


----------



## LING (Ene 22, 2009)

I are  new in the foro no se mucho de lenguaje c para pic pero si assembrer tenfre que seguir aprendiendo dell foro
Para yonatan si me podes enviar al igual que picman la información te lo agradeceria o como conseguirlo 

muy interesantes los host pero tengo unas dudas
cual es la diferencia entre usb con CDC y con bulk estas son librerias verdad 
y cual es la libreria Usb que brinda la micrichip

gracias por su atensión


----------



## evvrivas (Ene 22, 2009)

hola amigos de foro, yo he trabajado con el pic16f877, y maneje el pwm, adc y el rs232, y otros modulos, hoy he decidido migrar al 18f en especial los que tienen USB, y a programarlos con C CCS, y para las interfases graficas utilizo python.

He observado que en los ejemplos de comunicacion USB, en los ejemplos se habla de un puerto virtua "serial", como se hace para  crear un puerto usb, para que la pc lo detecte como USB y no como com virtual.

tambien observo que en bisual Vasic abren un com "puerto serial de comunicacion" y utilizan las funciones de una libreria que es para comunicacion serial.

yo he probado los ejemplos y los he podido correr y ejecutar y me funcionan. pero lo que quiero hacer es lo siguiente

Quiero hacer una Interface grafica con python, utilizando la una libreria que se llama pyusb la cual sirve para comunicacion USB, "esta no es para comunicacion serial" ,  aca pondre un codigo en python para enlistar o enumerar todos los dispositivos USB que estan conectados al PUERTO USB

import usb                  ##importa la libreria pyusb y susu funciones

for bus in usb.busses():                      #se hace un ciclo for en todos los objetos usb que encontro la funcion usb.busses()
  for dev in bus.devices:                           #se hace otro for en todos los dispositivos udb encontrados
    print "Bus %s Device %s: ID %04x:%04x %s" % (bus.dir      # se imprimen las caracteristicas

yo ejecuto este codigo en python y obtengo lo siguienete  " ojo en el puerto usb de mi maquina solo tengo conectado el programador de pic PICKIT2 " lo que me devuelve la funcion es esto.


Bus bus-0 Device \\.\libusb0-0001--0x04d8-0x0033: ID 04d8:0033 Microchip Technology Inc.

eso es la información del dispositivo el PID y el VID, es decir python puede con esa información crear un 
objeto USB con el cual comunicarse. es decir puede abrir el puerto USB identificado con el PID y el VID para poderse comunicar con el via USB

ahora desconecto el dispositivo PICKIT2 y conectare mi PIC18f4550 programado con el codigo de los ejemplos 
y al ejecutar el programa de python no devuelve nada, es decir no podre crear un objeto USB para comunicarme con el.

yo lo que quiero saber es que si me pueden ayudar a realizar un codigo para el PIC18f4550, el cual me devuelva los identificadores PID y VID sin utilizar un puerto comvirtual sino que sea comunicacion USB USB, gracias amigos


----------



## evvrivas (Ene 22, 2009)

hola amigos de foro, yo he trabajado con el pic16f877, y maneje el pwm, adc y el rs232, y otros modulos, hoy he decidido migrar al 18f en especial los que tienen USB, y a programarlos con C CCS, y para las interfases graficas utilizo python.

He observado que en los ejemplos de comunicacion USB, en los ejemplos se habla de un puerto virtua "serial", como se hace para  crear un puerto usb, para que la pc lo detecte como USB y no como com virtual.

tambien observo que en bisual Vasic abren un com "puerto serial de comunicacion" y utilizan las funciones de una libreria que es para comunicacion serial.

yo he probado los ejemplos y los he podido correr y ejecutar y me funcionan. pero lo que quiero hacer es lo siguiente

Quiero hacer una Interface grafica con python, utilizando la una libreria que se llama pyusb la cual sirve para comunicacion USB, "esta no es para comunicacion serial" ,  aca pondre un codigo en python para enlistar o enumerar todos los dispositivos USB que estan conectados al PUERTO USB

import usb                  ##importa la libreria pyusb y susu funciones

for bus in usb.busses():                      #se hace un ciclo for en todos los objetos usb que encontro la funcion usb.busses()
  for dev in bus.devices:                           #se hace otro for en todos los dispositivos udb encontrados
    print "Bus %s Device %s: ID %04x:%04x %s" % (bus.dir      # se imprimen las caracteristicas

yo ejecuto este codigo en python y obtengo lo siguienete  " ojo en el puerto usb de mi maquina solo tengo conectado el programador de pic PICKIT2 " lo que me devuelve la funcion es esto.


Bus bus-0 Device \\.\libusb0-0001--0x04d8-0x0033: ID 04d8:0033 Microchip Technology Inc.

eso es la información del dispositivo el PID y el VID, es decir python puede con esa información crear un 
objeto USB con el cual comunicarse. es decir puede abrir el puerto USB identificado con el PID y el VID para poderse comunicar con el via USB

ahora desconecto el dispositivo PICKIT2 y conectare mi PIC18f4550 programado con el codigo de los ejemplos 
y al ejecutar el programa de python no devuelve nada, es decir no podre crear un objeto USB para comunicarme con el.

yo lo que quiero saber es que si me pueden ayudar a realizar un codigo para el PIC18f4550, el cual me devuelva los identificadores PID y VID sin utilizar un puerto comvirtual sino que sea comunicacion USB USB, gracias amigos


----------



## Moyano Jonathan (Ene 22, 2009)

Lo que vos buscas lo tenés que hacer que hacer a través de bulk transfer, usando la librería mpusbapi.dll
haciendo las llamadas a la correspondiente librería vas a poder comunicarte con el pic sin usar el puerto serie virtual. 
Si recién empezas te recomiendo que uses los ejemplos que postee usando el puerto serie virtual. Además es más facil de utilizar (hablando de programación) que haciendolo por el método de comunicación directa.


----------



## Moyano Jonathan (Ene 26, 2009)

Hola a todos   

Acá les traigo el último ejemplo de control del puerto USB del PIC18F2550 usando la clase CDC. Este ejemplo lo que hace es mandar el valor del conversor ADC por USB y muestra dicho valor en hyperterminal siempre y cuando se presione la tecla "a". En el archivo comprimido está todo para poder probar el ejercicio.

Ahora comenzaré a explicar la comunicación USB PIC - PC usando la famosa librería mpusbapi.dll y Visual Basic 2006.


----------



## Moyano Jonathan (Feb 3, 2009)

Hola a todos... tanto tiempo deje este tema.

Ahora vamos a ver: * Control del puerto USB del PIC18F2550 a través de la librería mpusbapi.dll y VB2006. *

Pero antes que nada quiero que veamos una nota donde se explican mitos y verdades hacerca de la transmisión de datos por usb a full speed (12 Mb/seg).

- *MITO: El puerto USB del PIC puede comunicarse a una velocidad máxima de 12 Mb/seg (1.5MB/seg). *

- Realidad: El puerto USB no puede comunicarse a esa velocidad ya que es el total del ancho de banda del bus.

- Otras cosas que no le permite conectarse al USB a esa velocidad es que comparte el ancho de banda con otros dispositivos usb, restricciones del protocolo, etc.

- En realidad el bus puede conectarse en el mejor de los casos a 1MB/seg. (64Kb/seg) en la mayoría de las aplicaciones.

Al protocolo de transmisión USB lo llaman la PILA USB, donde muestran como son las diferentes capas de comunicación. (Figura n°1)

primera capa(superior): programación básica en C.
segunda capa(intermedio): llamados a los drivers que trae el compilador de C.
tercera capa(inferior):  llamados a los drivers que trae el compilador de C (procesos dentro de los drivers) y conexión del módulo USB al HOST.

En el proximo post veremos el estudio de la comunicación por el lado del PIC.


----------



## jokelnice (Feb 3, 2009)

buen aporte amigo en lo que podamos ayudar esta bien , yo he hecho la comunicacion pero todavia hay unos conceptos volando que seria mejor aclararlos


----------



## Moyano Jonathan (Feb 3, 2009)

Más que nada ejemplos en C para el PIC y programas para la PC , de la teoría voy a tratar de explicarla lo mejor posible.


----------



## FRYCK (Feb 8, 2009)

hola  en esta paguina  hay un ejemplo paso a paso  de  una  aplicacion en c++ comunicandose modo usb con  un pic 18f2550 el  ejemplo es  una  calculadora  ojala  les sirva
http://www.muchotrasto.com/PICCalculadoraUSBC++.php


----------



## Moyano Jonathan (Feb 8, 2009)

Gracias por el aporte fryck 80.


----------



## Moyano Jonathan (Feb 9, 2009)

Hola a todos   
Bueno después de ver las capas de comunicación del puerto USB, vamos a ver la comunicación estudiando el dispositivo USB o función (PIC con USB).

Lo que hay que hacer mientras tanto es estudiar los drivers que trae el CCS (que es el compilador de C que uso), estos son:


```
- pic18_usb.h
- PicUSB.h
- usb.c
- usb.h
```

Para poder entender la comunicación , vamos a analizar un ejemplo en C de CCS escrito por J1M , participante activo del foro todopic.


```
////                            PicUSB.c                             ////
////                                                                 ////
//// Este ejemplo muestra como desarrollar un sencillo dispositivo   ////
//// USB con el PIC18F2550, aunque puede ser facilmente adaptado     ////
//// para la serie 18Fxx5x. Se suministra el PicUSB.exe, así como    ////
//// su código fuente para Visual C# 2005, podréis encontrar tb      ////
//// los drivers para el dispositivo. No se suministra esquema de    ////
//// conexión puesto que está pensado para ser usado en el GTP USB,  ////
//// cualquiera de las tres versiones disponibles, si aun no teneis  ////
//// el programador, podeis utilizar el esquema de ese proyecto.     ////
////                                                                 ////
//// Cuando el dispositivo sea conectado al PC, saldrá el asistente  ////
//// para la instalación del driver. Instala el suministrado junto   ////
//// a este ejemplo, lo encontrareis dentro de la carpeta Driver.    ////
//// Una vez instalado podreis usar el PicUSB.exe para encender o    ////
//// apagar el led bicolor del GTP USB, y para realizar la suma de   ////
//// dos números introducidos.                                                        ////

#include <18F4550.h>
//#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL3,CPUDIV1,VREGEN
#fuses XTPLL,MCLR,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL1,CPUDIV1,VREGEN,NOPBADEN // el fuse 
// modificado para USB -> VREGEN
#use delay(clock=48000000)
 
/////////////////////////////////////////////////////////////////////////////
//
// CCS Library dynamic defines.  For dynamic configuration of the CCS Library
// for your application several defines need to be made.  See the comments
// at usb.h for more informaciónrmation
//
/////////////////////////////////////////////////////////////////////////////
#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    3                 //size to allocate for the rx endpoint 1 buffer
 
 
/////////////////////////////////////////////////////////////////////////////
//
// If you are using a USB connection sense pin, define it here.  If you are
// not using connection sense, comment out this line.  Without connection
// sense you will not know if the device gets disconnected.
//       (connection sense should look like this:
//                             100k
//            VBUS-----+----/\/\/\/\/\----- (I/O PIN ON PIC)
//                     |
//                     +----/\/\/\/\/\-----GND
//                             100k
//        (where VBUS is pin1 of the USB connector)
//
/////////////////////////////////////////////////////////////////////////////
//#define USB_CON_SENSE_PIN PIN_B2  //CCS 18F4550 development kit has optional conection sense pin
 
/////////////////////////////////////////////////////////////////////////////
//
// Include the CCS USB Libraries.  See the comments at the top of these
// files for more informaciónrmation
//
/////////////////////////////////////////////////////////////////////////////
#include <pic18_usb.h>     //Microchip PIC18Fxx5x Hardware layer for CCS's PIC USB driver
#include <PicUSB.h>       //Configuración del USB y los descriptores para este dispositivo
#include <usb.c>        //handles usb setup tokens and get descriptor reports
 
 
/////////////////////////////////////////////////////////////////////////////
//
// Al conectar el PicUSB al PC encendemos el Led Rojo hasta que el dispositivo
// halla sido configurado por el PC, en ese momento encederemos el Led Verde.
// Esperaremos hasta que se reciba un paquete proveniente del PC. Comprobaremos
// el primer byte del paquete recibido para comprobar si queremos entrar en el
// modo Suma, donde se realizará una suma de dos operandos, que corresponderan
// con los dos bytes restantes del paquete recibido; una vez realizada la suma
// enviaremos el paquete con el resultado de vuelta al PC. Si entramos en el
// modo Led comprobaremos el segundo byte del paquete recibido para comprobar
// si deberemos apagar los leds, encender el verder o el rojo.
//
/////////////////////////////////////////////////////////////////////////////
#define LEDV    PIN_B6
#define LEDR    PIN_B7
#define LED_ON  output_high
#define LED_OFF output_low
 
#define modo      recibe[0]
#define param1    recibe[1]
#define param2    recibe[2]
#define resultado envia[0]
 
 
void main(void) {
 
   int8 recibe[3];                  //declaramos variables
   int8 envia[1];
 
   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_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, 3); //cojemos el paquete de tamaño 3bytes del EP1 y almacenamos en recibe
 
            if (modo == 0) // Modo_Suma
            {
               resultado = param1 + param2;  //hacemos la suma
 
               usb_put_packet(1, envia, 1, USB_DTS_TOGGLE); //enviamos el paquete de tamaño 1byte del EP1 al PC
            }
 
            if (modo == 1) // Modo_Led
            {
               if (param1 == 0) {LED_OFF(LEDV); LED_OFF(LEDR);} //apagamos los leds
               if (param1 == 1) {LED_ON(LEDV); LED_OFF(LEDR);} //encendemos led verde
               if (param1 == 2) {LED_OFF(LEDV); LED_ON(LEDR);} //encendemos led rojo
            }
         }
      }
   }
}
```

Allí están las funciones usb_task(), usb_init() que ya las vimos por encimita, la novedad son las funciones: *usb_wait_for_enumeration(), usb_get_packet y usb_put_packet*

También están las definiciones *USB_EP1_TX_ENABLE  USB_ENABLE_BULK ...*

Comenzando desde un principio vemos:



```
#define USB_HID_DEVICE     FALSE             //deshabilitamos el uso de las directivas HID.
```

¿que significa HID?

HID es acrónimo en español de Dispositivo de Interfaz Humana. (El mouse usb, por ejemplo utiliza este protocolo)

En los drivers de CCS, viene activado por defecto:


```
// Del driver usb.h
...
//// USB_HID_DEVICE (TRUE) - HID devices require extra code to handle  ////
////                         HID requests.  You can disable to save    ////
////                         ROM space if you are not using a HID      ////
////                         device.  If you are not using a HID       ////
////                         device you must provide your own O/S      ////
////                         (Windows) driver.                         ////
...
 
...
//should the compiler add the extra HID handler code?  Defaults to yes.
#IFNDEF USB_HID_DEVICE
   #DEFINE USB_HID_DEVICE TRUE
#ENDIF
...
```

Si lo vamos a usar, no colocamos nada. si NO lo usaremos, lo negamos en el define.

*#define USB_EP1_TX_ENABLE  USB_ENABLE_BULK //turn on EP1(EndPoint1) for IN bulk/interrupt transfers*

¿que es eso de endpoint? ¿bulk/interrup transfers?

Bueno acá les cuelgo una explicación tomada desde la página http://pablohoffman.com/oscusb/doc/.

"Los dispositivos (o mejor dicho, las funcionas) tienen asociados unos canales
lógicos unidireccionales (llamados pipes) que conectan al host controlador con
una entidad lógica en el dispositivo llamada endpoint. Los datos son enviados
en paquetes de largo variable (potencia de 2). Típicamente estos paquetes son
de 64, 128 o más bytes.
Estos endpoints (y sus respectivos pipes) son numerados del 0 al 15 en cada
dirección, por lo cual un dispositivo puede tener hasta 32 endpoints (16 de
entrada y 16 de salida). La dirección se considera siempre desde el punto de
vista del host controlador. Así un endpoint de salida será un canal que
transmite datos desde el host controlador al dispositivo. Un endpoint solo
puede tener una única dirección. El endpoint 0 (en ambas direcciones) está
reservado para el control del bus."

Se puede decir que los endpoint son buffer temporales de datos de entrada/salida en cada tipo. En el módulo USB existen 16 de salida (OUT) y 16 de entrada (IN) pero agrupados en forma bidirecional, de acuerdo a un par de bits de configuración. Ojo un endpoint es unidireccional.

Les dejo una inmagen a modo representativo de lo que es un PIPE.


----------



## Meta (Feb 9, 2009)

Si sabes C, sabrás usar el Visual C++ en el cual estoy haciendo el manual.

El código para enviar tramas por fin me  salió. Ahora me falta el Visual Basic 2008.


----------



## Moyano Jonathan (Feb 9, 2009)

Estoy aprendiendo Visual C# , cuando más o menos lo maneje voy a postear todos los ejemplos en ese lenguaje.


----------



## Meta (Feb 10, 2009)

Mejor, porque el Visual C++ es más complicado, cuando lo compares te darás cuenta, es pesado, no se puede comprar con el C de PIC que es muy  limitado y fácil.

Me falta por hacer el Visual C# que me detecte los led desde el PC.


----------



## Moyano Jonathan (Feb 10, 2009)

A que te refieres con que te detecte los led's desde la PC.

Ahora otra cosa, no sabras como puedo hacer las llamadas al mpusbapi.dll desde el visual C#?


----------



## Meta (Feb 10, 2009)

No me he metido en ese mundo porque estoy a fondo con el RS232 o puerto serie. Aquí he encontrado alguna información.

Información.

Saludos.


----------



## microtronic (Feb 11, 2009)

hola amigos por hay eh leido que trabajan bastante el delphi y supuestamente es como que mejor para aquellos que trabajamos con electronica yo me inicio en el...mi intensión no es decir cual es el mejor si no cual se adapta mejor segun la profesion que ejerzamos...

saludos gracuias yonathan por la información sobre usb es muy extensa


----------



## Meta (Feb 11, 2009)

Delphi lo dejé por Visual Studio, el cambio tardé en adaptarme, si me diera cuenta de lo bueno que es, no tardaría tanto. 

Me da pena de Delphi porque fue el primero en aprender, no por ello  el mejor, claro.

http://www.microsoft.com/express/download/

Aún sigo con el RS232 y me estoy peleando hasta para conseguir manejar el CASIO (calculadora con el 16F84)

Saludos.


----------



## Moyano Jonathan (Feb 11, 2009)

Lo de la calculadora por RS232 + PIC16F84A, está muy buena aunque tambien puede hacerse con el PIC18F2550 y emulación CDC.

Yo nunca he programado en delphi porque sale de mi estructura (Programación en C), ya que tiene una estructura de programación basada en pascal.

Hasta ahora solamente he programado en Visual C# y Visual Basic 2005.


----------



## Moyano Jonathan (Feb 12, 2009)

¿bulk/interrup transfers?

aca les aclaro eso:

· transferencias de control:
 usado para comandos (y respuestas) cortos y simples. Es el tipo de transferencia usada por el pipe 0 

· transferencias isócronas:
 proveen un ancho de banda asegurado pero con posibles pérdidas de datos. Usado típicamente para audio y video en tiempo real

· transferencias interruptivas:
 para dispositivos que necesitan una respuesta rápida (poca latencia), por ejemplo, mouse y otros dispositivos de interacción humana.

· transferencias masivas (BULK):
 para transferencias grandes y esporádicas utilizando todo el ancho de banda disponible, pero sin garantías de velocidad o latencia. Por ejemplo, transferencias de archivos.

entonces nosotros debemos definir que tipo de transferencia vamos a realizar.
en el ejemplo de Jaime se están declarando 2 endpoints (1 bidirecionales) como transferencia masiva o BULK. 


*#define USB_EP1_TX_SIZE    1   //size to allocate for the tx endpoint 1 buffer*
podemos definir el tamaño del buffer en bytes, el límite lo tendremos que buscar en el driver correspondiente (con FS hasta 64 bytes por transacción).

nota: no confundir FS con HS, con High Speed se llega hasta 480Mbps, el módulo USB del pic soporta Full Speed = 12Mbps
*usb_wait_for_enumeration()*
según el concepto que dan en el driver, hace lo mismo que usb_enumerated(). La diferencia está en que el primero se queda en un bucle indefinido hasta que el HOST le dé la orden de habilitación.

para propósitos donde queramos hacer otras actividades en el PIC, usaremos el segundo.


----------



## jenn_t (Feb 13, 2009)

hola que post tan interesante me h a servido para aclarar un monton de dudas, pero ahora quisiera saber si alguno de ustedes ha tratado de enviar señales analogicas atraves del 18f2550 hacia el  labview, por que yo lo he intentado pero miren el resultado.


----------



## Moyano Jonathan (Feb 13, 2009)

Que señal estás midiendo? Si es tensión de red electrica esta bien porque viene con mucho ruido.


----------



## Moyano Jonathan (Feb 13, 2009)

Estoy tratando de traducir los documentos que siguen para poder postearlos, ya que la mayoría de la información sobre el puerto USB está en inglés técnico.

Cualquier proyecto por más sencillo que sea usando la librería mpusbapi.dll , posteenlo porque sirve como objeto de estudio para desarrollos más complejos.


----------



## jenn_t (Feb 13, 2009)

pues yo lo que estoy tratando de medir es una señal de 60Hz, pero proveniente de un generador de señales, luego de que sale del generador lo paso por un filtro de corte a 120Hz para asi despues montarla en una componente dc para que pueda ser enviada al pic. gracias por la ayuda bye


----------



## Moyano Jonathan (Feb 14, 2009)

El tema es que tendrias q ver como obtener la función seno para poder representarla sobre labview


----------



## Moyano Jonathan (Feb 14, 2009)

He podido gracias a varios dolores de cabeza hacer mi primera aplicación HID para pic pero aún tiene muchos errores cuando tenga algo sólido posteo.


----------



## jokelnice (Feb 14, 2009)

jenn_t dijo:
			
		

> pues yo lo que estoy tratando de medir es una señal de 60Hz, pero proveniente de un generador de señales, luego de que sale del generador lo paso por un filtro de corte a 120Hz para asi despues montarla en una componente dc para que pueda ser enviada al pic. gracias por la ayuda bye



cuentanos de que forma estan ingresando la señal haber si depronto podemos ayudarte


----------



## Moyano Jonathan (Feb 15, 2009)

Hola a todos     

Despues de una torticolis que me hizo desmayar del dolor , me puse las pilas para terminar un pequeño pero funcional ejemplo de comunicación bajo el protocolo HID.

El lenguaje que utilizé para la programación del PIC es el C de  CCS. Este el código fuente.

```
// Programa de prueba del protocolo HID (Human interface device).
// Programa: Prende o apaga un led según reciba una señal desde el software del host.
// Programador: Moyano Jonathan.
// Fecha: 13/02/09


#include <18F2550.h> // Definición de registros internos del PIC18F2550.
#fuses NOMCLR,XTPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL1,CPUDIV1,VREGEN,NOPBADEN
// NOMCLR: No vamos ha usar el PIN MCLR, el reset se hará por soft.
// XTPLL: Vamos a usar un cristal de 4.00Mhz.
// NOWDT: No vamos a usar el perro guardian.
// NOPROTECT: Memoria no protejida contra lecturas.
// NODEBUG: No utilizamos código para debugear.
// NOLVP: No utilizamos el modo de programación con bajo voltaje.
// USBDIV: signfica que el clock del usb se tomará del PLL/2 = 96Mhz/2 = 48Mhz.
// PLL1: significa que el PLL prescaler no dividirá la frecuencia del cristal. para XT = 4Mhz.
// CPUDIV1: El PLL postscaler decide la división en 2 de la frecuencia de salida del PLL de 96MHZ, si queremos 48MHZ, lo dejamos como está.
// VREGEN: habilita el regulador de 3.3 volts que usa el módulo USB.
// NOPBADEN: Deshabilitamos el módulo conversor ADC del puerto B.
#use delay(clock=48000000)


#DEFINE USB_HID_DEVICE TRUE // Vamos a utilizar el protocolo HID.

#define USB_EP1_TX_ENABLE USB_ENABLE_INTERRUPT // Definición del tamaño del buffer de salida.
#define USB_EP1_TX_SIZE 64

#define USB_EP1_RX_ENABLE USB_ENABLE_INTERRUPT // Definición del tamaño del buffer de entrada.
#define USB_EP1_RX_SIZE 64

/*********************************************************************************************************/

// Definición de las librerías utilizadas.
#include <pic18_usb.h>    // Drivers's USB del PIC18F2550.
#include <usb_desc_hid.h> // Descriptores USB.
#include <usb.c> // Funciones del USB.

/*********************************************************************************************************/

int8 data[64];
void main()
{
   usb_init_cs();    // Iniciamos el puerto USB y salimos.
   while(1)
   {
            usb_task(); // Configuramos el puerto USB.
                  if (usb_enumerated()) // Si el puerto es enumerado y configurado por el host..
                  {
                     if (usb_kbhit(1)) // Si hay un paquete de datos en el buffer lo tomamos y guardamos en la variable data.
                     {
                        usb_get_packet(1, data, 64);
                        if(data[0] == 1) {
                         output_toggle(PIN_B0);
                        } 
                     }                                
                  }
   }

}
```

El estudio del código fuente como de las librerías que son necesarias serán objeto de estudio más adelante cuando termine con el protocolo bulk transfer.

El programa del host fue escrito en Visual Basic 2005, ya que Visual C# lo tengo como objeto de estudio al igual que visual Basic 2008.

Cabe mencionar que la comunicación con HID es muy útil y rápida. Este tipo de comunicación no precisa driver ya que el driver en si es nativo de windows desde la versión Win 98se.


----------



## Moyano Jonathan (Feb 15, 2009)

Acá les dejo el esquema en formato .dsn para proteus y JPG para los que no dispongan del software.

PD:  La torticolis en serio es un  dolor insoportable no se deseo ni a mi peor enemigo.


----------



## Moyano Jonathan (Feb 16, 2009)

Hola a todos de nuevo

Acá les traigo un nuevo ejemplo. Esta véz se trata de algo concreto, un control de 8 relés por puerto USB utilizando la clase HID C de CCS y Visual Basic 2005.

A diferencia del ejemplo que había posteado sobre el control de 8 relés , este funciona a la perfección y mucho más rápido. No necesita drivers por lo que es plug and play.

Espero les sirva , ahora me voy a dedicar a terminar lo de mpusbapi que es bastante y luego seguiremos si dios quiere con HID y MSDC (mass storage device class) , pero eso será para más adelante.


----------



## aguevara (Feb 16, 2009)

Estimado Moyano:
He leido con interes todas tus aportaciones que has hecho con el USB, estoy iniciando justo ese tema tambien pues me interesa transferir datos desde y hacia una pc con un PIC18F4550, mis preguntas son:
El archivo dll de microchip MPUSBAPI deberia ser instalado en la pc ? o este es el firmware que se carga al pic ? si no es asi donde rayos va el archivo dll y cual es el firmware? mientras contestas mis dudas voy a leer toda la información que he bajado de este foro.

Gracias de antemano y saludos


----------



## Moyano Jonathan (Feb 16, 2009)

Hola como andas aguevara, las respuestas a tus dudas son las siguientes:

- El archivo  mpusbapi.dll es el archivo encargado , junto con el driver correspondiente que viene incluido con el de gestionar la comunicación PC - PIC . Ahora bien este archivo no se carga al pic sino que un programa escrito por ejemplo en Visual Basic 6.0 llama a las funciones de esa librería y establece comunicacion con el PIC.

- El firmware es el programa que se le carga al pic , donde hay librerías específicas para gestionar la comunicación usb.

Espero tus dudas hayan sido disipadas , en caso contrario peregunta.

Mañana voy a seguir con el tutorial del protocolo bulk transfer donde voy a hacer incapie nuevamente en esto que has preguntado.


----------



## Moyano Jonathan (Feb 16, 2009)

Hola a todos.

Bueno siguiendo con el tema de mpusbapi.dll, veremos como utilizar las funciones *usb_put_packet() y usb_get_packet()*. Las cuales permiten enviar datos por el usb o recibir datos.
Bien una descripción breve de las mismas es la siguiente:

```
usb_put_packet(endpoint,*ptr,len,toggle) // Función completa

Vamos a ver lo que está dentro del parentesis:

1 - endpoint: Buffer de entrada o de salida (son unidireccionales) // Ya lo explique post atrás.
2 - *prt : apunta a la dirección del dato a enviar (es una variable declarada por nosotros).
3 - len: es el tamaño del paquete en bytes. (hasta 64 max)
4 - toggle:  En la parte de transmisión de datos USB, los paquetes de datos se encuentran en grupos de paquetes de datos, y dentro de estos, existen unos llamados DATA0, DATA1. hay un proceso llamado sincronización del data toggle. a grandes rasgos esto no es mas que un método de validación de paquetes, y lo que hace es enviar alternadamente a DATA0 y DATA1 en una secuencia seguido de su ACK respectivo. todo con el objetivo de mantener la sincronización transmisor <-> receptor. ver fig 1 y 2

Sumario de la función: Esta función manda un paquete de datos hacia el host, el tamaño de los paquetes de datos hay que definirlos en el programa.

por ejemplo:

#define USB_EP1_TX_SIZE    1             //  Tamaño del buffer de salida.
#define USB_EP1_RX_SIZE    3             //  Tamaño del buffer de entrada.
```


----------



## Moyano Jonathan (Feb 16, 2009)

Ahora para *usb_get_packet()*:

```
usb_get_packet(endpoint, *ptr, max)

el argumento 1: endpoint: es el buffer de datos de entrada, donde llega el paquete de datos.
el argumento 2  *prt: es el apuntador adonde guardaremos ese dato.
el argumento 3 max: es el tamaño de paquete en bytes.


 Siempre hay que llamar a la función USB_KBHIT() , para saber si el buffer de datos está lleno o no. En  caso  de no llamar a la función podríamos recibir datos erroneos.


 Summary: Toma un paquete de datos y lo guarda en una variable previamente declarada.
```

Bueno esa es la teoría para el lado del PIC , que puedo agrandar a medida que vallan apareciendo dudas.


----------



## Moyano Jonathan (Feb 16, 2009)

Para que vallan leyendo esta es la hoja de descripción de funciones MPUSBAPI.dll, el autor es slalen del foro todopic.


----------



## frickyto (Feb 17, 2009)

Buenas, soy nuevito en este foro, quería agradecer por el gran esfuerzo que hicieron por explicar este tema que sinceramente si bien lo comencé a estudiar hace muy poquitos días, se me está haciendo extremadamente complicado de comprender. Programo pics hace más de 10 años para empresas importantes de Argentina y manejo varios idiomas tanto a nivel pic como a nivel software pero no he encontrado una guia concisa como para poder hacer funcionar por ejemplo un PIC como un dispositivo joystick, etc. O es muy complicado el tema o la información está muy mal brindada. De este tema que crearon es de donde he comprendido la mayor cantidad de cosas y si puedo ayudar en algo lo haré ya que la información que me brindaron fue excelente. Saludos


----------



## Moyano Jonathan (Feb 17, 2009)

Bueno frickito, en lo que podamos ayudarte está bien y bievenido al foro. Mirá el tema del usb embebebido es algo bastante idocumentado por lo que he podido leer hasta ahora. Lo único que he visto más documentado son las notas de microchip y de AVR atmel, pero incluso con esa data  se me hace complicado el tema del puerto usb.

Lo de hacer como vos decis que la PC reconozca al pic como un jostick , pendrive , o lo que sea es un tema complejo. Mas que nada por el lado de la programación para el pic. Yo en este momento a parte de los 3 tipos de comunicaciones por usb que he posteado hasta ahora estoy estudiando el protocolo MSD que solo hay código ejemplo en C18.


----------



## Moyano Jonathan (Feb 17, 2009)

Todos tus comentarios , dudas y proyectos lo podemos ir viendo en este hilo a ver si con el tiempo todos podemos aprender a manejar este puerto en un 100%.


----------



## aguevara (Feb 17, 2009)

Estimado Moyano, gracias por tu pronta respuesta pero insisto, tratare de reflejar mi duda un poco mas explicita.
Yo escribo el programa de la funcion que deseo realize el PIC en algun compilador (CCS por ejemplo) donde seguramente imagino existen algunas directivas para el uso de la comunicacion USB y que seran usadas segun sea la necesidad de mi programa, una vez compilado el programa, el archivo .hex lo descargo a la program memory del PIC.
Ahora en VisualBasic 6.0 escribo mi aplicacion que deseo que se ejecute en la PC y la cual es la que tendra interaccion con el PIC via el puerto USB, en esta aplicacion es donde se haran las llamadas al file MPUSBAPI.DLL para con ello establecer la comunicacion, pero este archivo DLL que originalmente no esta en windows ni en las utilerias de visual dado que es un file que se descarga del site de microchip, donde rayos lo instalo, grabo, ubico para que visualbasic haga uso de el?

Gracias de antemano y saludos 

PD Si estoy en algun error corrigeme.


----------



## Moyano Jonathan (Feb 17, 2009)

- Con respecto a lo del PIC está bien ahora para usar la librería de microchip , tenés que tener el módulo de funciones , vos dirás que es esto ?. Bueno el módulo de funciones es básicamente lo que me permite trabajar con la librería mpusbapi.dll, es decir tiene todas las funciones que hay que llamar para que la comunicación se establesca. Para incluirlo en tus proyectos tenés que agregarlo.

Ahora una vez agregado tenés que ver cuales son las funciones de dicho móduo(postee un pdf que lo muestra mas arriba) y por último ver como hacer una interfaz gráfica de usuario para mandar o recibir valores desde el disposivo usb (pic)

Te pongo las inmagenes para que veas como se hace. Además te dejo la librería para visual basic.


espero que te sirva


----------



## Moyano Jonathan (Feb 17, 2009)

Ahora la mpusbapi.dll , tiene que estar en la misma carpeta donde guardes el proyecto de visual basic si no te va a dar error al tratar de ejecutar el programa.


----------



## aguevara (Feb 17, 2009)

Mi estimado Moyano mas claro ni el agua, agradezco mucho tu ayuda. Por lo pronto leere el documento de las funciones del modulo para entender bien como usarlo


----------



## Moyano Jonathan (Feb 17, 2009)

De nada aguevara, ya sabés cualquier duda consulta.


----------



## frickyto (Feb 19, 2009)

Hay algun libro preferentemente en castellano que me ayude a comenzar a entender este tema?, lo único que conseguí es el  "USB Complete 3rd edition by Jan Axelson" que si bien parece muuuy completo y tiene 593 hojas estimo que deberia haber alguno mucho más compacto o bien algun tutorial. Les comento que con el Proteus se puede probar todas las interfases USB ya que emula una conexion como si lo conectaramos a un puerto real, genera la conexion, lo detecta y se puede interactuar. Es espectacular ya que me permite probar los proyectos sin tener que armarlos, le cargo el firmware al micro y lo ejecuto. Probé un firmware HID que permite hacer un joystick digital + 3 botones, pero me gustaria poder modificarlo para hacer que me permita ingresar datos analogicos.


----------



## aguevara (Feb 19, 2009)

Mi estimado Moyano he leido por ahi que el driver MPUSBAPI.DLL ha quedado incompatible con Windows Vista, por lo que todo tu trabajo no podria ser aplicable bajo esa plataforma.
Pero existe un archivo denominado WinBus.DLL que viene por default en Windows Vista y que ademas es compatible con Windows XP, has leido algo sobre esto? 
Actualmente estoy estudiando que tipos de cambios o adecuaciones habra que hacer (si aplica) para adaptarlo a tu trabajo.

Saludos


----------



## Moyano Jonathan (Feb 19, 2009)

Si hay un archivo actualizado, ya que ya me voy a fijar como se usa. Mientras tanto habrá que usar mpsusbapi.dll. Otro tema es que no dispongo de windows vista.


----------



## evvrivas (Feb 20, 2009)

hola de nuevo,tengo una duda, ?

ya he realizado varios jemplos usando CDC, ahora estoy probando con bulktransfer, utilizo Python para hacer las interfaces graficas y es alli donde tengo el problema.

Yo programo al pic18f4550 con un ejemplo que encontre, donde utilizan usb_init(), usb_task(), usb_wait_for_enumeration() , usb_kbit(), etc, todo se ve que funciona bien, pues al conectar el conector USB me pide el driver, lo instalo y listo, pero cuando con pyton trato de enlistar los dispositivos USB, no me aparece la información del dispositivo  PID, VID, etc....

Lo raro es que tengo un mouse y este si devuelve la información del PID, VID etc, tambien tengo un programador USB este igual devuelve esa información cuando se la pido desde PYTHON,

yo he concluido pensando que desde el PIC18f450 no se envia la información, pues el ejemplo no hace eso,

Mi pregunta es, como hago para que el PIC18f4550 envie esa información?
Gracias a sus respuestas,


----------



## Ardogan (Feb 20, 2009)

En el programa del PIC ¿cambiaste el VID_PID o lo dejaste como estaba?. Si lo dejaste igual tendrías que incluir el código fuente para ver porque el PIC no envía la información.


----------



## evvrivas (Feb 20, 2009)

adjuntare el ejemplo para que vean, la verdad soy un poco nobato en esto de USBPIC pero hay va el ejemplo que uso, y el driver. este ejemplo lo encontre en esta direccion, mirala bien para ver donde es que el microenvia a la PC el PID y el VID, ojala me puedan ayudar

http://picmania.garcia-cuervo.com/USB_1_BulkTransfers.php


----------



## Moyano Jonathan (Feb 22, 2009)

evvrivas, como te va. Mirá tenés mal configurados los fuses en el archivo rr2_usb_monitor.c 
Los vid y pid (vendor id y product id) los envía en la librería rr2_usb_monitor.h, ahora lo que tendrías que revisar es el programa en python del cual yo no se como se usa (solo he usado visual basic). Para mi el error está donde vos intentas llamar a la mpusbapi.dll por eso no podés enviar datos.


----------



## je_aleph (Feb 22, 2009)

Un poco acerca de mi y este tema:  Hace un par de años realice una pequeña interfaz de extracción de datos y envio de estos a través de USB usando un par de pic's  de la familia Pic18Fxxx5, PIC-C de CSS y C#. 

En base a lo que he visto en este post, tengo algunos comentarios:
- Si bien es cierto que es un tema muy complicado, no es imposible implementarlo, así que animo.

- Moyano, es buena la información que posteas considero que has realizado un buen esfuerzo,  pero no seas tan "explicito", no dejas que los demás traten, busquen y sobre todo lean... No hay que confundir la enseñanza ( o compartir conocimientos con los demas ) con darles todo tan sencillo y evitarles el esfuerzo de usar su cerebro un rato. Además a este ritmo el post se hará eterno, es mejor realizar un ejemplo "completo" y explicar sobre él varios temas, en lugar de uno por uno, los cuales muchas veces son basicos.

- Dudo que desde hace un par de años a la fecha no se hayan creado más proyectos o escrito más acerca este tema... así que lean! Desde mi punto de vista, es la mejor forma de romper las barreras, para todos los aspectos de nuestra vida. Y nos ayuda a ser autodidáctas.

No hay que olvidar que este tema está orientado a gente dedicada a la electrónica, con cierto nivel de conocimientos y habilidades. Si son estudiantes, entonces actuen como tales, no sólo hay que preguntar, también aporten. No es justo que sólo un par realicen todo el trabajo.

Salvo lo anterior, un buen Post. 
Ánimo y Éxito a todos en este complicado mundo del USB. 
Saludos, los seguire leyendo.


----------



## Moyano Jonathan (Feb 22, 2009)

Muchas gracias por tu comentario je_aleph, mi método de enseñanza es directo. Acá yo no miro quien es el que lee o deja de leer sino mi objetivo es que aprendan de la forma más facil posible. Ahora el que solamente se deja guiar por mis ejemplos en este post pues yo le aconsejo que investigue ya que yo no entro en profundidad sobre el usb sino que doy una mirada rápida a las funciones de control más relevantes.
El que quiera aprender realmente como es el protocolo de comunicación les recoomiendo comprar un libro como por ejemplo usb complete.


----------



## jokelnice (Feb 23, 2009)

que tal amigo jonathan moyano , pues estoy de acuerdo contigo pienso que el trabajo ha sido muy bueno y ademas pienso que si hay alguien que solo se ha dedicado a copiar los ejemplos "y pienso que los hay" no tienen el privilegio de decir que estudian   electronica   .

asi que invito a que si hay alguien que leyo o leera el foro se manifieste y nos cuente sus cosas , para mejorar entre magnfivo post que tanto nos ha ayudado


----------



## jokelnice (Feb 23, 2009)

evvrivas dijo:
			
		

> adjuntare el ejemplo para que vean, la verdad soy un poco nobato en esto de USBPIC pero hay va el ejemplo que uso, y el driver. este ejemplo lo encontre en esta direccion, mirala bien para ver donde es que el microenvia a la PC el PID y el VID, ojala me puedan ayudar
> 
> http://picmania.garcia-cuervo.com/USB_1_BulkTransfers.php



que tal evvrivas , tampoco he manejado python pero pienso que la forma mas facil de saber si el dispositivo se encuentra bien es mirar si lo reconocio en el administrador de dispositivos y si es asi alli encuentras el vendor y el id , de porque no te sale en python no sabria decirte


----------



## Moyano Jonathan (Feb 23, 2009)

gracias jokelnice por tu comentario, yo la verdad he desarrollado este post para eso para que todos podamos sacarnos las dudas (incluso yo) con el puerto usb.


----------



## evvrivas (Feb 25, 2009)

hola amigos de nuevo, yo he realizado aplicaciones realizadas con python y por el puerto serial, 
Hoy por hoy estoy utilizando python para realizar un osciloscopio con el pic18f4550 y por medio del USB
He averiguado que existen 3 formas de comunicarme  via usb
     1         creando un com virtual ( siento que no tiene chiste pues se desperdician capacidades de velocidad  del protocolo USB, )
  2   interfase HID (dispositivo de interfase humana, que creo que es mas lento )
  3   Bulk transfer, que creo que seria lo mas optimo y es lo que yo quiero implementar

pero ahorita tengo problemas no se si con Python o con el pic, seguire investigando para averiguar que es lo que pasa

La cosa es que ahorita mejor realizare el proyecto emulando la comunicacion serial con un com virtual, pues asi avanzare en el proyecto, seguire investigando bulktransfer para luego cambiar los firmware y software y drivers.

cualquier cosa en la que pueda ayudar ayudare.

volviendo a mi problema.

 a)   en que parte del firmware del pic se envia la información a la PC sobre los PID y los VID ?
 b)   sera que en python debo de cargar la libreria mchpusb.dll y ocupar las funciones que en ella estan?, pero en python hay un programita que corro y este si enumera los dispositivos usb conectados, incluso un pic18f2520 que esta en pickit2? y para esto no he cargado ningun driver o dll
c)    porque si obtengo los PID y los VID de otros dispositivos conectados a la PC..
d)  alguien ha obtenido estos valores ¿como lo has  hecho en tu programa?


----------



## Moyano Jonathan (Feb 25, 2009)

Hola evvrivas, mirá como te dije anteriormente no conosco el python. Solo se Visual Basic 6.0 y estoy tratando de aprender Visual C#.

En los últimos días he tenido algunos problemas tanto con HID como con mpusbapi.dll.

Con mpusbapi.dll, el programa me manda mensajes de error al ejecutar el programa. 

Con HID, el programa de aplicación me manda errores al intentar leer datos desde el dispositivo, pero puedo escribir datos perfectamente.

Las posibles respuestas a tus problemas:

1 - El VID y el PID son identificadores del dispositivo USB. (En este caso el PIC18F2550), bien ahora el pic si lo programás en C de CCS , los identificadores o descriptores USB lo vas a encontrar en la librería*usb_desc_cdc.h*
en caso de que utilizes el protocolo CDC.

Acá te muestro donde define los descriptores:

```
const char USB_DEVICE_DESC[USB_DESC_DEVICE_LEN] ={
      //starts of with device configuration. only one possible
         USB_DESC_DEVICE_LEN, //the length of this report   ==0
         0x01, //the constant DEVICE (DEVICE 0x01)  ==1
         0x10,0x01, //usb version in bcd  ==2,3
         0x02, //class code. 0x02=Communication Device Class ==4
         0x00, //subclass code ==5
         0x00, //protocol code ==6
         USB_MAX_EP0_PACKET_LENGTH, //max packet size for endpoint 0. (SLOW SPEED SPECIFIES 8) ==7
         08,0x04, // Vendor id de microchip ! acá le dice que le está conectando un PIC.
         0x0B,0x00, // Product id de microchip !
         0x00,0x01, //device release number  ==12,13
         0x01, //index of string description of manufacturer. therefore we point to string_1 array (see below)  ==14
         0x02, //index of string descriptor of the product  ==15
         0x00, //index of string descriptor of serial number  ==16
         USB_NUM_CONFIGURATIONS  //number of possible configurations  ==17
   };
```

Ahora en esta parte describo mi identificador , este identificador le dice a la máquina por ejemplo: El fabricante del firmware. En esta parte le puedo poner cualquier cosa siempre y cuando respete ciertos parámetros.


//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.
char USB_STRING_DESC_OFFSET[]={0,4,12};

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
         24, //length of string index
         USB_DESC_STRING_TYPE, //descriptor type 0x03 (STRING) // Mi descriptor personalizado.
         'C',0,
         'D',0,
         'C',0,
         '_',0,
         'U',0,
         'S',0,
         'B',0,
         '_',0,
         'P',0,
         'I',0,
         'C',0,

};

#ENDIF


Ahora las reglas de las cual hablaba era por este numero: *24, //length of string index*

La formula general para generar nuestro propio descriptor es la siguiente:

Por ejemplo mi descriptor quiero que sea: Osciloscopio_USB
Contamos los caracteres que ocupa: 16 caracteres en total.

Formula del descriptor: (numero de caracteres del descriptor + 1) * 2 = (numero) //length of string index

Ejemplo aplicado:

```
//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.
char USB_STRING_DESC_OFFSET[]={0,4,12};

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
         34, //length of string index
         USB_DESC_STRING_TYPE, //descriptor type 0x03 (STRING) // Mi descriptor personalizado.
         'O',0,
         's' ,0,
         'c' ,0,
         'i'  ,0,
         'l'  ,0,
         'o' ,0,
         's' ,0,
         'c' ,0,
         'o' ,0,
         'p' ,0,
         'i'  ,0,
         'o' ,0,
         '_' ,0,
         'U' ,0,
         'S' ,0,
         'B' ,0,
};

#ENDIF
```

2 - En python para poder usar la mpusbapi.dll proporcionada por microchip tenés que hacer llamadas a sus funciones para poder intercambiar datos con el host de lo contrario la PC no se va a poder comunicar con el PIC.
(A mi me están fallando las llamadas a la dll desde vb 6.0).

3 - Que obtengas los vid y pid no significa que la PC necesariamente "sepa" como comunicarse con tu dispositivo. Para esto tenés que usar drivers que se encuentran dentro de los archivos .dll. El vid y el pid de un dispositivo tambien lo podés ver desde un visor de eventos del puerto usb. Asi como los paquetes de datos que salen y entran del puerto.

4 -  El vid y el Pid no los he obtenido , me los da en el archivo de descriptores que explique más arriba.

Espero esto solucione tus preguntas o al menos una parte de ellas.   

Cualquier cosa preguntá.


----------



## evvrivas (Feb 25, 2009)

si eso lo entiendo, ahorita estoy trabajando con python y la dll para ver pq no me puedo comunicar, al hacerlo les informaciónrmare cual era el error,

Yo les recomendaria que utilizen python,porque es muy sencillo de aprender simple para escribirlo y muy potenete, animense yo les ayudare


----------



## thamaphyr (Feb 25, 2009)

El tema me interesa bastante, porfa la información a mi tambien me la puedes mandar, imagino que si se puede por visual tambien se podra en matlab añadiendo los flujos de conexion en los com por medio de la funcion serial('COM1')
estoy haciendo mi tesis por puerto serial pero seria bueno por USB


----------



## Moyano Jonathan (Feb 25, 2009)

Toda la información que necesites sobre usb la vas a encontar leyendo el tema completo. Ahora sobre como se hace en matlab no lo se. En labview te puede ayudar jokelnice que está trabajando en ese entorno. Yo solamente se Visual Basic 6.0 y algo de visual C# 2008.

Te repito cualquier duda sobre usb decime y tratamos de ayudarte.


----------



## Meta (Feb 25, 2009)

Espero que el manual http://www.abcdatos.com/tutoriales/tutorial/z9521.html les sirva mucho, ya estoy en proceso con el MonoDevelop, Visual C++ y algo de Visual Basic .net 2008


----------



## Moyano Jonathan (Feb 25, 2009)

Muchas gracias meta, lo que se de visual C# es lo que posteaste de ese manual , aunque ahora estoy tratando de crear e incorporar una clase a un proyecto de visual C#.


----------



## QuimCri (Feb 26, 2009)

Saludos a todos los integrantes del Foro.

He encontrado por fin después de tanto buscar información valiosa para intentar
aprender acerca de la comunicación USB con micros, y por ello agracezco a todos
los que participan aquí.

Gran parte de la experiencia que tengo en PICs es en ASM, y C es un lenguaje que
trato de aprender a pocos pasos. Sin embargo he estado cachareando con los post
que se han publicado aquí, y me ha gustado.

De este corto conocimiento, me he puesto a la tarea de tratar de hacer un programa
que permita comunicarme desde el PC con un micro de la familia 16Fx por USB, usando
el PIC18F2550 como puente, para poder usar computadores que no tengan puertos COM
con las aplicaciones que ya tengo en ASM en estos PICs, mientras aprendo mejor la
programación en C del PIC18F2550.

Basado en el primer ejemplo posteado intenté conseguir mi objetivo modificando parte
del programa, de lo que resultó el que anexo más adelante.

Sin embargo a la hora de probarlo no funciona, y como no se de que manera se manejan
interrupciones en C, tomé como ejemplo las bases del manual, pero como no hay códigos
en concreto que ejemplifiquen al usuario, no se si esto sea correcto.

Ah!, otra cosa. Vi que también han trabajo con el protocolo HID, el cual toqué
alguna vez con el MicroCodeStudio, pero no fue lo que esperaba. No se si sea mucha 
molestia, pero quisiera pedirle el favor a Moyano si fuese tan amable de proveerme
el código de PC de los ejemplos que ha hecho sobre HID para VB 6.0, porque la verdad
no se manejar VS 2005 (estuve averiguando y parece que cambian muchas cosas), para
ver si puedo meterle la ficha a aprender acerca de este que tiene algunas ventajas
de simpleza con respecto al Bulk Transfer, ya que no se necesita instalar drivers, 
lo que para nosotros puede parecer sencillo, pero como desarrollo material educativo
no quiero que los usuarios entren en estos pasos tan complejos, y simplemente sea
Plug-and-Play.

Agradezco cualquier ayuda que me puedan brindar.


----------



## Meta (Feb 26, 2009)

Moyano Jonathan dijo:
			
		

> Muchas gracias meta, lo que se de visual C# es lo que posteaste de ese manual , aunque ahora estoy tratando de crear e incorporar una clase a un proyecto de visual C#.



Para crear una clase en el mismo proyecto, vete arriba en la barra de herramientas y pulsa... "*Proyecto-->Agregar Clase*" y esta clase te pedirá un nombre y se agrega al proyecto.


----------



## Moyano Jonathan (Feb 26, 2009)

Vi tu código quimcri , pero no se porque no te funciona en una de esas tenés algo mal en el firmware.
Para el tema de HID si no me equivocó en post anteriores fijate bien , porque creo que postee los dos que tenía.

Para meta: Bien hasta ahora lo de agregar la clase me salió , pero cuando quiero meter la dll al proyecto como hago? Es decir primero quiero definir las funciones en la clase pero he probado añadir la clase sin la librería y me dá error. Por eso me gustaría saber como es el tema del llamado a las librerías.

Para todos los usuarios:

He tenido problemas con los ejemplos que he estado desarrollando para mpusbapi.dll y HID ambos me están dando problemas en la programación bajo visual basic 6.0. Si alguien tiene ejemplos de recepción de datos en HID y cualquier ejemplo de comunicación con la mpusbapi.dll

Gracias por su ayuda y cualquier cosa que necesiten diganme haber si la podemos resolver.


----------



## Moyano Jonathan (Feb 26, 2009)

Otra cosa, tengo pensado hacer una controladora de 3 motores paso a paso mediante las plataformas Visual Basic 6.0 y Visual C# 2008. El que quiera apuntarse al proyecto valla largando ideas yo por lo pronto lo voy a ir diseñando y posteando los avances a medida que lo valla haciendo.


----------



## Moyano Jonathan (Feb 27, 2009)

ya encontré como se maneja un paso a paso de forma bastante explicada, ahora voy a ver si puedo hacer un programa ejemplo para el control del motor por USB.


----------



## proyectista (Mar 3, 2009)

Hola buenas, tras leer muchos post, tengo una duda, principalmente programais todo mediante CCS, mi preguntas son:

1   ¿se puede hacer mediante c18 de microchip?
2   en caso que si... ¿poque ustedes no lo hacen?
3   en caso que si... ¿que ventajas o inconvenientes hay? 

todo esto lo pregunto porque he buscado los archivos .h para el c18 para utilizar el USB y no los encuentro. 

Muchas gracias de antemano. Un saludo


----------



## Moyano Jonathan (Mar 3, 2009)

Hola como andas proyectista:

1 - Si se puede hacer por C18 , pero no es el lenguaje que domino.
2 - Yo personalmente no lo hago en C18 ya que como dije anteriomente no es el lenguaje que uso y los demás participantes del foro están familiarizados con el C de CCS.
3 - Las ventajas que hay son las siguientes al usar C de CCS:

- Código más optimizado que en C18
- Más información en la red en lenguaje español.
- Más códigos de ejemplo


----------



## jokelnice (Mar 4, 2009)

como estan , jonathan , proyectista , pùes yo tampoco se de C18 , pero ahora que sale a relucir el tema ........de microchip me descargue hace un tiempo una especie de librerias para C18 , pero como no sabia que hacer, nunca las utilice  , las buscare para compartirlas


----------



## Moyano Jonathan (Mar 4, 2009)

Ok dale , igual te digo que hasta ahora el C de CCS me parece más completo pero estaría bueno que postearas las librerías.


----------



## Moyano Jonathan (Mar 6, 2009)

Por fin pude lograr la comunicación bidireccional con HID y easyHID, proximente posteo resultados.


----------



## chopancho18 (Mar 9, 2009)

Moyano Jonathan dijo:
			
		

> Hola a todos de nuevo
> 
> Acá les traigo un nuevo ejemplo. Esta véz se trata de algo concreto, un control de 8 relés por puerto USB utilizando la clase HID C de CCS y Visual Basic 2005.
> 
> ...




quisiera preguntarte algo en concreto con respecto a un ejemplo que pusiste para manejar 8 reles via usb... mi pregunta es la siguiente se pueden conectar mas de uno de estos dispositivos en los diferentes puertos usb que trae el pc por que la mayoria como minimo tienen dos en mi caso 3 o en el de los pc de torre 6 pero esa es la pregunta por que si la aplicacion en vb que creaste es solo para uno al conectar otro y tratar de utilizarlo... no se activarian los dos a la vez? o simplemente no funcionaria el segundo? ... me equivoco? 




			
				Moyano Jonathan dijo:
			
		

> Hola como andas, mirá podés conectar más dispositivos pero tenés enumerarlos , hay una parte en las librerías de dscriptores en la que describis cuantos dispositivos tenés conectados. Igual nunca he probado con mas de un dispositivo conectado al puerto.



adjunto la libreria de descriptores que esta en el zip que subiste he buscado en la libreria pero ni rastro de donde debo enumerarlos o como... la he puesto en un documento word me seria de gran ayuda si pudieses marcar con negrilla donde o como se deben enumerar para conectar mas de un dispositivo.

espero tu respuesta de antemano muchas gracias


----------



## Moyano Jonathan (Mar 10, 2009)

Mirá la verdad es un poco complicado el tema de la enumeracion, pero tengo que hacer pruebas ya que nunca he controlado mas de un dispositivo. Se me ocurre que una manera menos complicada de hacerlo sería asignandoles vid y pid diferente a cada dispositivo y que lo selecciones mediante programación.

Otra cosa la librería que me pasaste esta desactualizada. Yo cree mi propia libreria de control para enlazarla con los programas de control generados con el software easyHID. Por lo que esas librerías que vos me mostras no sirven mas

Los programas de control generados con easyHID son muchos mas rapidos (con respecto a la transmision y recepcion de datos).

Luego voy a ser una descripción mas completa de todo lo que estoy diciendo pero por ahora no tengo demasiado tiempo.


----------



## suma (Mar 10, 2009)

saludos, quisiera saber que tan complicado seria utilizar otros lenguages tanto para el pic como para el pc, me explico, siempre me ha gustado programar pics con assemble, me parece que da mas control y no desperdicia memoria, entonces no se si sea posible hacer mi programa en assemble y tener las librerias usb_desc_cdc.h y usb_cdc.h en C para no tener que pasarlas a assemble (eso resultaria realmente engorroso).

otra cosa que necesito hacer es escribir el programa del lado del pc en java, tengo buen conocimiento de java pero no he tenido que usar los puertos del pc, entonces no se si seria depronto con manejo de sockets o streams, o si deba utilizar una libreria de windows para poder reconocer y usar el micro cosa que no creo.

si alguien me puede ilustrar le agradesco de antemano


----------



## Moyano Jonathan (Mar 11, 2009)

hola suma, mirá la programación la podés realizar en otros lenguajes como proton ide, mikrobasic, asm. Yo por lo pronto se manejar solamente C y te recomiendo que lo aprendas ya que todo lo que vas a encontrar de usb o por lo menos la gran mayoria está hecho en C tanto en C de CCS como C18 de microchip.

Ahora en Java , no tengo ni idea de como es la programación. Solo se programar en visual basic 6.0 y estoy indagando en Visual C#.


----------



## Meta (Mar 11, 2009)

Hola:

También Visual C# vale para USB
http://www.hobbypic.com/index.php?option=com_content&task=view&id=31&Itemid=40

PD: Tengo el manual casi hecho sobre VC++ y VB que puedes bajar aquí.

Saludo.


----------



## Moyano Jonathan (Mar 11, 2009)

La verdad meta excelente lo tuyo. Lástima que mis tiempos estén tan cortos para tener que aprender tanto


----------



## Moyano Jonathan (Mar 11, 2009)

Igual , ahora quiero crear una clase utilizando easyHID.dll para las comunicaciones ya que es muy facil de utilizar y lo se manejar al 100%


----------



## Meta (Mar 11, 2009)

Cierto lo de aprender tanto en poco tiempo.

Me aceptaron en esta web también el tutorial...

Puerto serie RS232 16F84 con Visual C++ y Visual Basic
http://www.abcdatos.com/tutoriales/tutorial/v12.html

Saludos.


----------



## Moyano Jonathan (Mar 11, 2009)

Che no me lo deja descargar si lo podes subir en otro servidor sería de gran ayuda.


----------



## Meta (Mar 11, 2009)

A veces es mejor darle dos veces actualizar el PDF y luego esperar.

https://www.forosdeelectronica.com/about31250.html


----------



## jokelnice (Mar 11, 2009)

si el  enlace si sirve , el tutorial esta muy bueno amigo meta  , vamos haber si lo utilizo para ayudar mas en el foro gracias


----------



## Meta (Mar 11, 2009)

jokelnice dijo:
			
		

> si el  enlace si sirve , el tutorial esta muy bueno amigo meta  , vamos haber si lo utilizo para ayudar mas en el foro gracias



Gracias por el aviso y la sugerencia.

¿Realmente vale la pena perder el tiempo en hacer la parte de VB6 para el manual?


----------



## Moyano Jonathan (Mar 11, 2009)

Yo la verdad creo que si ya que el .net todavía no se ha infiltrado en las vidas de todos. Hay muchos (me incluyo) que todavia programamos en visual basic 6.0


----------



## Meta (Mar 12, 2009)

El Visual Basic 6 no lo consigo, deja ver por la tarde cuando tenga tiempo libre y empezaré a mirar y pedir ayuda a ver si soy capaz de manejar el PIC con ese programa porque muchos por e-mail me lo piden. Lo pondré en la parte del manual después del Visual Basic .net. Antes que nada conseguir ese VB6 y empezar a probar a ver que pasa. Me han dicho que si hago una aplicación con VB6, en el otro PC no me funciona porque debo coger archivos e introducirlos en los System32 de los windows o algo así.

Por una parte no hay problema ya que utilizaré y enseñaré como se usa un instalador para VB6 que es el mismo (puede ser otro) que utilicé en la página *422* de este manual Visual C#.

PD: _Al final voy a utilizar todos los compiladores antes de empezar a manejar puertos paralelos._

EDIT:
Encontré algo por si acaso.

http://www.abcdatos.com/tutoriales/tutorial/g205.html

Saludo.


----------



## Moyano Jonathan (Mar 12, 2009)

Meta yo te puedo ayudar con el ejemplo en VB6, esperame el fin de semana y veo como puedo darte una mano.

PD: Si vas a empezar algo luego del puerto serie, estaría mas interesante que empezaras con USB en ves de con el paralelo. También lei tus manuales de vb.net vc ++ y vc# todos excelentes guias.


----------



## Moyano Jonathan (Mar 12, 2009)

Otra cosa , que programa usas para editar los manuales. Esa vista que logras está buenisima.


----------



## Meta (Mar 12, 2009)

El USB lo dejaré para más adelante ya que estoy centrado en hacer otros manuales sobre el puerto serie, cosas como señales analógicas mediante una barra y en porcentaje, etc...

El manual lo hago con PowerPoint 2007, con eso mismo lo dejo así de chulo, después a PDF con el mismo programa.


----------



## Moyano Jonathan (Mar 12, 2009)

Mirá vos , si tengo un tiempito libre y consigo hacer andar el usb en visual C# y Vb.net tambien me voy a hacer unos de esos manuales.


----------



## Meta (Mar 13, 2009)

Me gustaría verlo. La verdad, notarás que hay que tener mucha paciencia más que hacer un circuito electrónico y programarlo, aburre muchas veces y es un poco cansino. En los primeros manuales no, pero el que hice de 478 páginas tarde 3.5 meses por falta de tiempo, pero se puede hacer.

Cuando hagas esos manuales, recibirás e-mail de todo el mundo mostrando su agradecimiento como me hacen ami:

Ejemplo real, pero no digo su e-mail y su nombre, cuando presente el este manual VC++ y VB.
*Me bajé el manual de comunicación 232 con pic16f84...y apenas estoy leyendo las primeras paginas... (PARÉ) para escrirte y darte las GRACIAS, que menos por dedicar tanto trabajo y hacerlo tan bien.
Seas quien seas y de donde seas, gracias por ayudar a tanta gente como yo que quiere hacer sus pinitos y lo logra gracias a personas como tú.*

Saludos.


----------



## Moyano Jonathan (Mar 13, 2009)

Es verdad meta lo que vos contas, así que ayer me quedé hasta tarde para ver bien como podía ir pasando mis ejemplos de CDC a Visual C# y VB.net. Por lo pronto solo voy a hacer un ejemplo a modo de prueba y luego voy a terminar con los 7 ejemplos  faltantes.
Tambien tengo 7 ejemplos terminados sobre HID en Vb 6.0 que me parece que los voy a hacer en VC ++ o en Visual C# según cual me dé menos problemas.


----------



## Moyano Jonathan (Mar 13, 2009)

Otra cosa que me gustaría saber es si los programas creados en Visual studio, servirán para ejecutarlos en Windows 7 ?


----------



## Meta (Mar 13, 2009)

Moyano Jonathan dijo:
			
		

> Tambien tengo 7 ejemplos terminados sobre HID en Vb 6.0 que me parece que los voy a hacer en VC ++ o en Visual C# según cual me dé menos problemas.



Esto si que me gustaría verlo.


----------



## Meta (Mar 13, 2009)

Moyano Jonathan dijo:
			
		

> Otra cosa que me gustaría saber es si los programas creados en Visual studio, servirán para ejecutarlos en Windows 7 ?



Si, siempre hacen eso adrede para que las empresas compre sus productos y funcionen en windows que ellos ya tienen y no está obligado  a actualizar.

Acto seguido vendrá el Visual Studio 2010 preparado, optimizado, actualizado y con novedades para el Windows 7.


----------



## Moyano Jonathan (Mar 13, 2009)

Eso es seguro, mirá si querés los ejemplos de visual basic 6.0 para HID los posteo para que todos los vean. Aún no los había posteado porque quiero tenerlo todo listo.
Yo probé windows 7 la beta que lanzo microsoft y se perfila como un soft excelente ya que posee toda la optimización de código de XP y los gráficos renderizados de vista.
Además enciende tan rápido como xp y el software que corre en vista corre tambien en seven.


----------



## Meta (Mar 13, 2009)

Hablan muy bien de Wondows 7. 

Lo de Visual Basic 6, vale la pena tenerlo preparado para empezar muy bien preparado.


----------



## Moyano Jonathan (Mar 13, 2009)

Ok, dentro de poco les voy a postear los primeros ejemplos de HID con visual basic 6.0 para que los puedan ver.


----------



## Moyano Jonathan (Mar 14, 2009)

Pude comenzar con los primeros pasos en la programación de programas de control del puerto usb a través de visual C ++ 2008. Hasta ahora me identifica si el dispositivo está o no conectado al host. Proximamente voy a ver como hacer para enviar y recibir datos.


----------



## Meta (Mar 14, 2009)

Hola amigo:

¿Visual C++, Visual Basic 2008, Visual Basic 6, Visual C#? Al final veo que los manejas todo. La verdad que el Visual C++ será muy bueno que al mismo tiempo lo veo más engorroso que C# y VB.

Saludo.


----------



## dalr123 (Mar 14, 2009)

Hola estoy con ese de la comunicacion USB de la clase CDC y ya se como hacer la comunicacion del pc al pic pero no he podido lograr hacer la inversa, del pic al pc
alguien me puede ayudar de como seria un ejemplo para activar una entrada digital del pic y enviar esa información al pc?
Gracias
PD. Muy buenos sus aportes me han servido muchiiisimo, ya me estaba volviendo loco tratando de usar el puerto USB


----------



## Meta (Mar 14, 2009)

dalr123 dijo:
			
		

> Hola estoy con ese de la comunicacion USB de la clase CDC y ya se como hacer la comunicacion del pc al pic pero no he podido lograr hacer la inversa, del pic al pc
> 
> *Pon ejemplos.*
> 
> ...


----------



## dalr123 (Mar 14, 2009)

Estoy usando labview para el pc y CCS para el pic que es el 18F2550 pero pues todavia no entiendo como seria el programa en el pic para que me envia la información al puerto usb.

Intente con este programa pero no estoy seguro si es asi como se hacer
lo que intento es que cuando active el PIN RA0 se encienda un led en labview
pero pues lo que no entiendo por ahora es como hacer que el pic me envie al puerto usb


----------



## Meta (Mar 14, 2009)

¿Has tocado algo de *HID* y *PID*?


----------



## dalr123 (Mar 14, 2009)

Con ejemplos que encontre en internet logre conectar el pic por HID pero todavia nose como usarlo en labview me queda mas facil por CDC puesto que labview hasta ahora lo estoy usando, de PID ni idea.

Meta muchas gracias por responder tan rapido


----------



## Moyano Jonathan (Mar 14, 2009)

Mirá dalr123, como te va? En estos momentos estoy viendo como hacer para colgar un manual como el que hizo meta pero me va a llevar un buen tiempo ya que el usb es bastante dificil de controlar. Ahora si querés algo en HID  te puede enseñar una aplicación básica pero para VB6.0 (ahora estoy estudiando como hacerlo en Visual C++)


----------



## dalr123 (Mar 14, 2009)

Pues yo estoy aca intentando e intentando
realice la aplicacione labview 8.5 y no me a querido funcionar
la cuestion es que nose si en verdad el pic esta enviandome la información al puerto usb o por el contrario si lo que hice en labview esta mal ops:  jajajaja

por eso necesito ayuda en cuanto a como enviar información del pic al pc.
en cuando labview yo miro como resuelvo eso, por que en caso de que no de con el chiste le pido ayuda a un profesor sabe de labview , y pues el ya tiene la comunicacion por HID en labview solo que no me quiere dar información   estoy insistiendole para ver si me ayuda con eso, pero estoy casi seguro que si le pregunto por el puerto serie si me da información, sin embargo lo ideal seria HID

y bueno estoy con labview por que me parece mas facil y ya he usado labview no mucho pero estoy familiarizado con el,
para VB6 me tocaria desde 0 no lo he usado tengo visual studio.net 2005 pero lo mismo no tengo conocimiento de este programa.


----------



## Moyano Jonathan (Mar 14, 2009)

dalr123 si tienes esa calidad de profesores................

Mirá yo estoy experimentando , pero solo en lenguajes como VB6.0 VC# y algo de VC++. Labview no lo se usar.

Perame que termine con algunos ejemplos que estoy preparando y posteo lo que pasa es que lleva su trabajo.

Ahora un cosejo , busca mucha información en internet antes de sacar cualquier conclusión. Yo para que me anduviera el HID en el pic tuve que modificar una librería completa.

Perseverancia que lo vas a lograr.


----------



## dalr123 (Mar 14, 2009)

jajajaja si si buena calidad jajaja
lo que pasa es que el tambien es profesor en otra U y tiene un grupo de investigacion en el que desarrollaron la tarjeta de adquisicion, aparte el prof. trabaja haciendo diseños con esa información para otras empresas por eso es que creo no quiere dar informaciónramcion al respecto.

y tranquilo haga lo que tiene que hacer yo voy a estar mirando como soluciono lo del pic.
y pues la aplicacion en labview le faltaba un bloque , ahora tengo un ejemplo que lee el puerto pero todavia no logro enviar información del pic al pc debe ser que esta mal la programacion del pic y si voy a seguir su consejo a parte de que gracias a la información que ud a dado en este foro que me a servido de gran ayuda para poder ubicarme gracias ! y eso que no he terminado de mirar todo voy a buscar mas información.

en cuanto VB6 VC# y VC++ bueno mirare como es eso aunque estube en un foro lo de JIM de usbpic y la verdad con el software que lo hizo en VB que de mas perdido pero si voy a mirar eso despues de leer todo este foro que lo estoy leyendo por partes


----------



## Meta (Mar 14, 2009)

dalr123 dijo:
			
		

> en cuanto VB6 VC# y VC++ bueno mirare como es eso aunque estube en un foro lo de JIM de usbpic y la verdad con el software que lo hizo en VB que de mas perdido pero si voy a mirar eso despues de leer todo este foro que lo estoy leyendo por partes



No te cortes, observa el Manual Visual C# y funcionará.

http://www.abcdatos.com/tutoriales/tutorial/z9521.html
http://www.abcdatos.com/tutoriales/tutorial/v12.html

Saludo.


----------



## dalr123 (Mar 14, 2009)

ok voy a ponerme a leer esos manuales
 gracias Meta


----------



## dalr123 (Mar 14, 2009)

hola
Meta muy bueno el manual, hice la aplicacion en v2005 para controlar el puerto b del pic es demasiado facil, y yo imagiando que para lograr eso tenia que llevar mucho tiempo usando visual

hombre mil gracias !


----------



## Moyano Jonathan (Mar 14, 2009)

Eso demuestra que querer es poder... felicitaciones dalr123.


----------



## Moyano Jonathan (Mar 14, 2009)

Meta tengo una duda , como hago que para poder seleccionar el puerto de comunicaciones seriales utilizando un combobox de la siguiente manera:

http://img27.imageshack.us/my.php?image=dudaf.jpg

Lo que yo quisiera hacer es que una vés seleccionado el puerto de comunicaciones, apretemos conectar y nos comuniquemos.

El código fuente del botón Conectar es el siguiente: (En Visual C# 2008)

En si el código es el mismo que vos usas en el manual , pero solo se comunica si apreto conectar en ves de conectarse 
cuando se ejecuta el programa.


```
private void Conectar_Click(object sender, EventArgs e)
        {
            // Abrir puerto cuando pulsemos conectar.
            if (!serialPort1.IsOpen) // Si el puerto serial está cerrado...
            {
                try
                {
                    serialPort1.Open(); // Trata de abrirlo.
                }
                catch (System.Exception ex)
                {
                    MessageBox.Show(ex.ToString()); // Si hay un error lo muetra en un msgbox.
                }
            }
            // Ejecutar la función Recepción por disparo del evento Datareceived.
            serialPort1.DataReceived += new
            System.IO.Ports.SerialDataReceivedEventHandler(Recepcion);
        }
```

Espero que me podás dar una mano así termino este programa de ejemplo


----------



## Meta (Mar 15, 2009)

Investigando, espero por favor...

Voy a tardar un poquito que son varias cosas... 
...sorry.


*EDIT 1:*

Hay códigos que te sobran y debe ser así:

```
private void Conectar_Click(object sender, EventArgs e)
            {
                // Abrir puerto cuando pulsemos conectar.
                if (!serialPort1.IsOpen) // Si el puerto serial está cerrado...
                {
                    try
                    {
                        serialPort1.Open(); // Trata de abrirlo.
                    }
                    catch (System.Exception ex)
                    {
                        MessageBox.Show(ex.ToString()); // Si hay un error lo muetra en un msgbox.
                    }
                }
            }
```

Olvídate del código de arriba, no lo uses para nada. Prueba este método de abajo primero, estoy investigando lo del comboBox que se me resiste:




```
private void button1_Click(object sender, EventArgs e)
        {
            serialPort1.Open(); // Abrir puerto.
            byte[] miBuffer = new byte[1];
            miBuffer[0] = 0x62; //ASCII letra "b".
            serialPort1.Write(miBuffer, 0, miBuffer.Length);
            serialPort1.Close(); // Cerrar puerto.
        }

private void button2_Click(object sender, EventArgs e)
        {
            serialPort1.Open(); // Abrir puerto.
            byte[] mBuffer = new byte[1];
            mBuffer[0] = 0x74; //ASCII letra "t".
            serialPort1.Write(mBuffer, 0, mBuffer.Length);
            serialPort1.Close(); // Cerrar puerto.
        }
```

*EDITO 2:
*

¿Quieres hacer que el botón _Conectar_ se conecte y aparezca el nombre aparezca _Desconectado_?

He hecho la misma pregunta aquí a ver si lo hacen mejor qu eyo, de momento estoy trabajando en ello.

http://social.msdn.microsoft.com/Forums/es-ES/vcsexes/thread/1fa79253-cacd-42db-b5b3-3d60309ab42d

Saludo.

*EDITO 3:*

No he hecho todavía lo de cambiar el COM1 y COM2 que estoy investigando, por ahora funciona un método que hice. No se si esto es lo que quieres. Te recuerdo que estoy investigando lo del comboBox. Puedes descargar el arhcivo del ejemplo que estoy haciendo aquí.


----------



## Moyano Jonathan (Mar 15, 2009)

Gracias por la ayuda meta, encontre algo muy interesante en internet: Un código en VB.net para poder detectar que puertos series hay disponibles en la PC, entonces elejimos el que esté libre y nos comunicamos con el.


```
Public Class Form1
    'Enumerate Serial Ports on Machine
    'Get Serial Port availability

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        'Just drag & drop combobox from toolbox to form designer
        Me.ComboBox1.DrawMode = DrawMode.OwnerDrawVariable                     'select my own drag mode
        Me.ComboBox1.DropDownStyle = ComboBoxStyle.DropDownList                'aspect when drop down
        Me.ComboBox1.DataSource = My.Computer.Ports.SerialPortNames.ToArray    'enumerate serialports
        Me.ComboBox1.TabIndex = 0                                              'select first tabindex
        AddHandler ComboBox1.DrawItem, AddressOf cmbo_SerialPorts_Status       'draw my personal cmbo
    End Sub
    '
    ' Draw our custom combo
    Private Sub cmbo_SerialPorts_Status( _
        ByVal sender As Object, _
        ByVal CmboItem As System.Windows.Forms.DrawItemEventArgs)

        ' Draw the background of the item.
        CmboItem.DrawBackground()
        '
        'Default Values if port is available
        Dim status As String = "Available"
        Dim brush As New SolidBrush(Color.Green)
        Dim font As System.Drawing.Font = Me.Font
        Dim fontbrush As Brush = Brushes.Black
        Dim rectangle As Rectangle = New  _
            Rectangle(2, CmboItem.Bounds.Top + 2, _
                         CmboItem.Bounds.Height, _
                         CmboItem.Bounds.Height - 4)
        '
        'Check for port availability
        Try
            ' If port open & close with no exception
            ' draw the item with default font and green rectangle
            Dim PortTest As New System.IO.Ports.SerialPort
            PortTest = My.Computer.Ports.OpenSerialPort(My.Computer.Ports.SerialPortNames(CmboItem.Index))
            PortTest.Close()
        Catch ex As Exception
            ' If port is not available
            ' draw the item with italic & strikeout font and red rectangle
            brush = New SolidBrush(Color.Red)
            status = "In Use"
            font = New Font(FontFamily.GenericSansSerif, Me.Font.Size, FontStyle.Italic Xor FontStyle.Strikeout)
            fontbrush = Brushes.DimGray
        End Try

        'fill combo item rectangle
        CmboItem.Graphics.FillRectangle(brush, rectangle)
        'write text with actual port status for this item
        CmboItem.Graphics.DrawString( _
            My.Computer.Ports.SerialPortNames(CmboItem.Index) + " - " + status, _
            font, _
            fontbrush, _
            New  _
                    RectangleF(CmboItem.Bounds.X + rectangle.Width, _
                               CmboItem.Bounds.Y, _
                               CmboItem.Bounds.Width, _
                               CmboItem.Bounds.Height) _
        )
        ' Draw focus rectangle when mouse are over an item.
        CmboItem.DrawFocusRectangle()
    End Sub
End Class
```

El código es bastante largo y además me gustaria saber como hacerlo en VC#.  Igual voy a seguir investigando a ver que encuentro.

Vos cuando encontrés alguna solución avisame..


----------



## Meta (Mar 15, 2009)

Había encontrado algo http://msmvps.com/blogs/peplluis/ar...onados.aspx?CommentPosted=true#commentmessage


```
* public class Form1
    * {
    *     //Enumerate Serial Ports on Machine
    *     //Get Serial Port availability
    *    
    *     private void // ERROR: Handles clauses are not supported in C# Form1_Load(object sender, System.EventArgs e)
    *     {
    *         //Just drag & drop combobox from toolbox to form designer
    *         this.ComboBox1.DrawMode = DrawMode.OwnerDrawVariable;
    *         //select my own drag mode
    *         this.ComboBox1.DropDownStyle = ComboBoxStyle.DropDownList;
    *         //aspect when drop down
    *         this.ComboBox1.DataSource = My.Computer.Ports.SerialPortNames.ToArray;
    *         //enumerate serialports
    *         this.ComboBox1.TabIndex = 0;
    *         //select first tabindex
    *         ComboBox1.DrawItem += cmbo_SerialPorts_Status;
    *         //draw my personal cmbo
    *     }
    *     //
    *     // Draw our custom combo
    *     private void cmbo_SerialPorts_Status(object sender, System.Windows.Forms.DrawItemEventArgs CmboItem)
    *     {
    *        
    *         // Draw the background of the item.
    *         CmboItem.DrawBackground();
    *         //
    *         //Default Values if port is available
    *         string status = "Available";
    *         SolidBrush brush = new SolidBrush(Color.Green);
    *         System.Drawing.Font font = this.Font;
    *         Brush fontbrush = Brushes.Black;
    *         Rectangle rectangle = new Rectangle(2, CmboItem.Bounds.Top + 2, CmboItem.Bounds.Height, CmboItem.Bounds.Height - 4);
    *         //
    *         //Check for port availability
    *         try {
    *             // If port open & close with no exception
    *             // draw the item with default font and green rectangle
    *             System.IO.Ports.SerialPort PortTest = new System.IO.Ports.SerialPort();
    *             PortTest = My.Computer.Ports.OpenSerialPort(My.Computer.Ports.SerialPortNames(CmboItem.Index));
    *             PortTest.Close();
    *         }
    *         catch (Exception ex) {
    *             // If port is not available
    *             // draw the item with italic & strikeout font and red rectangle
    *             brush = new SolidBrush(Color.Red);
    *             status = "In Use";
    *             font = new Font(FontFamily.GenericSansSerif, this.Font.Size, FontStyle.Italic ^ FontStyle.Strikeout);
    *             fontbrush = Brushes.DimGray;
    *         }
    *        
    *         //fill combo item rectangle
    *         CmboItem.Graphics.FillRectangle(brush, rectangle);
    *         //write text with actual port status for this item
    *         CmboItem.Graphics.DrawString(My.Computer.Ports.SerialPortNames(CmboItem.Index) + " - " + status, font, fontbrush, new RectangleF(CmboItem.Bounds.X + rectangle.Width, CmboItem.Bounds.Y, CmboItem.Bounds.Width, CmboItem.Bounds.Height));
    *         // Draw focus rectangle when mouse are over an item.
    *         CmboItem.DrawFocusRectangle();
    *     }
    * }
```

Aquí he estado sacando algo.
http://msmvps.com/blogs/peplluis/archive/tags/Puertos+Serie/default.aspx

Saludo.


----------



## Moyano Jonathan (Mar 15, 2009)

Buenisimo meta del mismo lugar de donde he estado investigando yo.. a ver si esta tarde puedo sacar algo en limpio. mientras tanto sigo investigando.


----------



## Meta (Mar 15, 2009)

Del ejemplo que   te di antes, sólo he logrado esto, pero sigo investigando. Últimamente estoy aprendiendo a la fuerza bruta.


```
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO.Ports;

namespace Probando_02
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        // Variables
        string pa = "Puerto abiero.";
        string pc = "Puerto cerrado. Pulse botón 'Conectar'.";
        string des = "Desconectar";
        string con = "Conectar";
        int open = 1;
        int com = 2;

        private void button_on_Click(object sender, EventArgs e)
        {
            try
            {
                byte[] mBuffer = new byte[1];
                mBuffer[0] = 0x74; //ASCII letra "t".
                serialPort1.Write(mBuffer, 0, mBuffer.Length);
                button_on.Enabled = false;
                button_off.Enabled = true;
                label_.Text = "ON";
                label_.ForeColor = Color.Green;
            }
            catch (InvalidOperationException)
            {
                label_mensaje.Text = pc;
            }
        }

        private void button_off_Click(object sender, EventArgs e)
        {
            try
            {
                byte[] miBuffer = new byte[1];
                miBuffer[0] = 0x62; //ASCII letra "b".
                serialPort1.Write(miBuffer, 0, miBuffer.Length);
                button_off.Enabled = false;
                button_on.Enabled = true;
                label_.Text = "OFF";
                label_.ForeColor = Color.Red;
            }
            catch (InvalidOperationException)
            {
                label_mensaje.Text = pc;
            }
        }

        private void button_conectar_Click(object sender, EventArgs e)
        {
            if (open == 1)
            {
                open = 2;
                serialPort1.Close();
                if (comboBox1.Items.Count > 0)
                {
                    comboBox1.SelectedIndex = com;
                }
                serialPort1.Open();
                label_mensaje.Text = pa;
                button_conectar.Text = des;
                
            }
            else
            {
                open = 1;
                serialPort1.Close();
                label_mensaje.Text = pc;
                button_conectar.Text = con;
                button_on.Enabled = true;
                button_off.Enabled = true;
                label_.Text = " ";
            }
        }
    }
}
```


----------



## Moyano Jonathan (Mar 15, 2009)

Che una pregunta más el código que posteaste más arriba es de Visual C# ?


----------



## Meta (Mar 15, 2009)

Si, pero pasado con el  http://www.developerfusion.com/tools/convert/vb-to-csharp/


----------



## Moyano Jonathan (Mar 15, 2009)

Huu buenisimo , me había olvidado de esa herramienta. Bueno creo que tengo más o menos suficiente como para terminar mi primer ejemplo de control en visual C#.
Cualquier duda te pregunto.


----------



## Meta (Mar 15, 2009)

Ahora estoy pescando, pero si te sirve de ayuda mientras perdemos tiempo investigando hasta que nos responda alguien del foro, doy estos enlaces.

http://msdn.microsoft.com/es-es/library/system.windows.forms.combobox.selecteditem(VS.80).aspx

http://msdn.microsoft.com/es-es/library/ms750552.aspx

Por si acaso, voy a investigar a ver si me sale esto. Cuando logre hacer lo que pides, la verdad es que lo agregaré en el manual para que la gente lo sepa.


----------



## Moyano Jonathan (Mar 15, 2009)

Si estaría buenisimo que lo agregaras al manual y cuando a mi salga lo del USB con los diferentes lenguajes... le voy a pedir al administrador del foro que los suba a la parte de tutoriales para que todos lo tengan a mano.


----------



## Meta (Mar 15, 2009)

Cierto.

Lo del USB y si lo entiendo, hago el pedazo de manual como los que hago así http://electronica-pic.blogspot.com/ mientras de momento lo pones en el foro para que la gente de nuevas ideas.

Me han pedido que hiciera el puerto serie por modo consola o CMD. ¿Esto vale la pena hacerlo? jejejeje, En Linux Logré ya funcionar el puerto serie, por fin, algo es algo y esto si estaba ya planeado para el manual.


----------



## dalr123 (Mar 15, 2009)

Hola mire he estado leyendo lo que quieren hacer y creo que es esto no lo he probado del todo pero estoy casi seguro que funciona
cree el boton Conectar el comboBox que lo llame  comboBox_selec_com
y en el boton escribo este codigo en mi caso uso el COM14:

       private void Conectar_Click(object sender, EventArgs e)
        {
            int selectedIndex = comboBox_selec_com.SelectedIndex;
            Object selectedItem = comboBox_selec_com.SelectedItem;

            // Abrir puerto COM14
            if (!serialPort1.IsOpen)
            {
                try
                {
                    serialPort1.Open();
                }
                catch (System.Exception ex)
                {
                    MessageBox.Show(ex.ToString());
                }
            }
        }
    }
}


----------



## Meta (Mar 15, 2009)

ejjejeejje, lo estoy probado...

Espera a ver que pasa.

*EDITO:*
Si puedes, hay que lograr cambiar esto así mediante programación con el comboBox, pero no me sale. Sigo investigando.

```
serialPort1.PortName = "COM1";
```


----------



## Moyano Jonathan (Mar 15, 2009)

Hasta ahora lo he hecho funcionar en VB.net solamente, la conversión de VB.net a VC# que vos utilizaste ha convertido mal el código. Igual como te digo en VB.net funciona OK.


----------



## Meta (Mar 15, 2009)

En VB .net no tengo idea, sigo machacándome la cabeza con el VC# y haber si responden algo desde aquí.

Si en VB.net lo hiciste funcionar, me lo dices, jejeejeje a ver si aprendo algo de él y gracias.


----------



## Moyano Jonathan (Mar 15, 2009)

Esta tarde me pongo de lleno , con el estomago vacio no se puede. Pero lo voy a sacar tarde o temprano jeejejjej


----------



## Meta (Mar 15, 2009)

Menuda locura nos hace pasar el comboBox que todavía no he aprendido.

Otra cosa:
Cuando dejo en marcha el PIC por puerto serie, al cerrar la aplicación de Visual C# o el que sea, el PIC sigue activado. Tengo el código necesario para que se desactive el PIC mientras cierra la aplicación. Es bueno saberlo y lo del comboBox más todavía.


----------



## Meta (Mar 15, 2009)

Creo que lo logré, ajajajaja

Por fin, 

Sólo digo creo, voy a encender el Pentiun III que tiene la ventaja de venir dos puertos series COM1 y COM2.

Luego te aviso.


----------



## Moyano Jonathan (Mar 15, 2009)

Ok , dale yo ahora mismo me pongo a hacer la aplicación para VB.net

Cuando termines con tu aplicación la posteas asi comparamos los resultados.

PD: En VB6.0 eran tan fáciles las cosas.....que tiempos aquellos ajaajjaj


----------



## Meta (Mar 15, 2009)

*¡¡¡POR FIN FUNCIONA!!!*

Estoy escribiendo desde el Pentium III y usando puerto COM2 (COM1 también). Lástima que cada vez se usa menos los db9.

Tengo la idea de hacerlo funcionar con los *radioButton* porque el _comboBox_ puedes escribir sobre él y poner cualquier cosa y da error.

También haré a ver si soy capaz con el tiempo, que desde internet, pueda hacer funcionar el puerto serie desde otro PC y controlar el PIC.


```
int selectedIndex = comboBox1.SelectedIndex;
                Object selectedItem = comboBox1.SelectedItem;
                serialPort1.PortName = selectedItem.ToString(); //Aquí está los COM1 y COM2 del comboBox.
```

Código completo:

```
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO.Ports;

namespace Probando_02
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        // Variables
        string pa = "Puerto abiero.";
        string pc = "Puerto cerrado. Pulse botón 'Conectar'.";
        string des = "Desconectar";
        string con = "Conectar";
     //   int open = 1;
        bool open = true;

        private void button_on_Click(object sender, EventArgs e)
        {
            try
            {
                byte[] mBuffer = new byte[1];
                mBuffer[0] = 0x74; //ASCII letra "t".
                serialPort1.Write(mBuffer, 0, mBuffer.Length);
                button_on.Enabled = false;
                button_off.Enabled = true;
                label_.Text = "ON";
                label_.ForeColor = Color.Green;
            }
            catch (InvalidOperationException)
            {
                label_mensaje.Text = pc;
            }
        }

        private void button_off_Click(object sender, EventArgs e)
        {
            try
            {
                byte[] miBuffer = new byte[1];
                miBuffer[0] = 0x62; //ASCII letra "b".
                serialPort1.Write(miBuffer, 0, miBuffer.Length);
                button_off.Enabled = false;
                button_on.Enabled = true;
                label_.Text = "OFF";
                label_.ForeColor = Color.Red;
            }
            catch (InvalidOperationException)
            {
                label_mensaje.Text = pc;
            }
        }

        private void button_conectar_Click(object sender, EventArgs e)
        {
            if (open == true) //1
            {
                open = false; //2
                serialPort1.Close();
                //if (comboBox1.Items.Count > 0)
                //{
                //    comboBox1.SelectedIndex = 0;
                //}
                int selectedIndex = comboBox1.SelectedIndex;
                Object selectedItem = comboBox1.SelectedItem;
                serialPort1.PortName = selectedItem.ToString();
                serialPort1.Open();
                label_mensaje.Text = pa;
                button_conectar.Text = des;
                
            }
            else
            {
                open = true; //1
                serialPort1.Close();
                label_mensaje.Text = pc;
                button_conectar.Text = con;
                button_on.Enabled = true;
                button_off.Enabled = true;
                label_.Text = " ";
            }
        }

        // Desde que arranque la aplicación, se pone en COM1,
        // el primero de la lista del comboBox.
        private void Form1_Load(object sender, EventArgs e)
        {
            comboBox1.SelectedIndex = 0;
        }
    }
}
```

Saludo.


----------



## Moyano Jonathan (Mar 15, 2009)

Meta felicidades, tienes el proyecto completo para ver como funciona. ? Lo mio va encaminado también


----------



## Meta (Mar 15, 2009)

No es un proyecto completo, sino una prueba del comboBox. Espero que te funcione el comoBox también a ti.

Ahora estoy con el radiobutton que creo que es mejor si sólo son dos puertos COM.


----------



## Moyano Jonathan (Mar 15, 2009)

Si me funciona pero en VB.net solamente. Ahora estoy haciendo directamente la aplicación de control


----------



## Moyano Jonathan (Mar 15, 2009)

Funcionó !!!! 

Meta no eras el único al que le había funcionado... jeejjee después de golpearme la cabeza contra un matafuegos durante una hora pude hacer mi aplicación CDC en VB.net.

Luego de que tenga todo listo , posteo la aplicación.



Gracias meta !


PD: Todos tienen que tener net framework 3.5 para que la aplicación funciones , sinó dará error.


----------



## Meta (Mar 15, 2009)

*¡¡¡Felicidades!!!*

Ya vamos progresando. Te doy lo que hice en PDF a ver si eres capaz de hacerlo. Lo intentaré más adelante con VC++ y VB .net.

Saludo.


----------



## Moyano Jonathan (Mar 15, 2009)

Bueno acá está la primera aplicación en Visual Basic 2008 . net y todo para que puedan probarlo.

Espero les sirva.   


De a poco voy a ir posteando ejemplos y voy a empezar con HID. Todo lo referente a mpusbapi lo voy a dejar para el último ya que me está dando problemas.


----------



## Moyano Jonathan (Mar 15, 2009)

Muy buena la continuación de tu manual, luego le podés añadir para que detecte los puertos COM disponibles por software, asi queda completo.

Ahora lei algo en tu manual , que es específicamente "Radiobutton?"


----------



## Meta (Mar 15, 2009)

Buenas:

El radio button es esto:






Sólo que yo voy a usar 2 que es el COM1 y COM2.

A tu pregunta.
¿Te refieres detectar los puertos COM que hay o los que están en uso en ese momento?


Vi tu programa, está bueno el diseño, me da la sensación que has aprendido mucho a usarlo con el Manual de Visual C#...
...Me da error en una cosa. Este error significa que te falta poner en algún lado el try y cacth.

Ya que tengo el PIC18F2550 y 18F4550 lo probaré ejejeje a ver que tal funciona. Cuando acabes con todas las pruenas y te sientas listos, hacemos el mega manual como los que hago yo.

PD: _...y buen paisaje pusiste en Acerca de._


----------



## felixls (Mar 15, 2009)

Jony/Meta si no es mucha molestia lo podrían subir al .hex configurado para 20mhz y con el fuse MCLR en ON?, estoy probando sus avances pero no tengo el ccs para cambiar el código fuente.

muchas gracias y felicitaciones!


----------



## jokelnice (Mar 15, 2009)

como estan colegas , les comento que ya descargue visual basic , y el manual de *meta * para ayudarlos mas en la causa , ya que como ya habia comentado todo lo que yo eh realizado lo he hecho en labview , bueno espero colaborarles pero queda mucho trabajo ya que visual lo vi hace demasiado tiempo " ya se me olvidaron unas cosas" 

en cuanto al compañero    dalr123 te podria colaborar con lo de labview y la comunicacion usb y en sus distintos modos de trabajo ( me falta hid y msd )  y en ...................................cuanto a los de los profesores si hay unos que son tapados y no colaboran ,                                .pero  saben lo mas  vacano es cuando sacas algo monstruoso y hay si estan detras de uno para ver como lo hicimos je .   

saludos y estamos en comunicacion ..................


----------



## felixls (Mar 15, 2009)

Jony/Meta, estuve probando y aviso que no funciona.

Cuando conecto el usb detecta el pic, luego instalo el driver, pero el pic no puede comunicarse por el puerto com virtual.

Alguna idea?


----------



## dalr123 (Mar 16, 2009)

de que me perdi?

jokelnice, uy si le agradeceria con lo de labview que lo que ud dice es precisamente lo que quiero hacer, realizarlo en labview, aparte de aprender decirle al profesor que ya lo logre y darle las gracias por la "ayuda" que medio. no he podido leer en labview la información que me envia el pic, aunque no he vuelto a hacer pruebas pues desde que lei el manual de Meta estoy haciendo y desaciendo con V2005    , pero me interesa muchisimo lo de labview, esa ayuda se la agradeceria.

Meta y Moyano Jonathan, uds si que avanzan rapido, me toco dejar el pc por que tenia un compromiso que habia olvidado por complero por estar bien entretenido aca jajaja y cuando llego veo que avanzaron bastante y ya resolvieron lo de comboBox, ya experimente y me funciona perfectamente. Lo de RadioButton no le he leido todavia, pero sabe que haciendo las pruebas a ratos se me olvida configurar el puerto COM donde esta conectado el pic y se bloquea el programa nose si a uds les pasa y pues eso seria algo a mejorar puesto que no creo ser el unico que olvida que primero toca configurar el puerto a usar, estoy hechando cabeza como seria una solución pero nose como seria en visual detectar cuando no se a configurado un puerto, seguire en eso pues para mi es muy molesto por que siempre se me olvida  ops:. 

felixls, lo de que no funciona, a mi me funciona sin ningun problema, algo debe estar faltando.
dice que el pc detecta el pic luego que instala el driver, ahora verifique en administrador de dispositivos que el pic realmente se a conectado, mira en que puerto COM# se encuentra el pic, si todo eso que dije anteriormente esta bien el problema debe estar en el software de visual, y podria ser lo de COM#, verifique eso para que configure que numero de puerto necesita usar.


----------



## Meta (Mar 16, 2009)

Necesito un descanso que dentro de un rato ir a clase de desempleados.

Lo del USB es cosa de Jony, lo mio se centra por ahora en el puerto serie. Y si, intentaremos resolver los problemas poco a poco.

Por ahora les dejo el avance del comboBox, si siguen la línea del libro www.pic16f84a.org les funcionará el programa a la primera.

Ahora voy a empezar con el _radiobutton_, porque hay gente que le gusta más.


----------



## Moyano Jonathan (Mar 16, 2009)

Hola a todos , respondiendo las preguntas a cada uno queda mas o menos así:

1° - Meta:

- Detectar los puertos COM, significa que detetecta cada uno de los puertos series fisicos o virtuales que hay en la máquina.
esta es una mejora a tu resultado del combobox , ya que no se limita solamente a 2 puertos.
(Esta detección solamente me ha funcionado en visual basic.net)

- El error en portname , a mi me lo da siempre y cuando el puerto este ocupado por otra aplicación, fijate si es eso.

- Ya entendí lo del radiobutton, me parece una buena opción tambien.

- Lo del try catch, no lo puse porque no me parecio necesario.. ahora la pregunta mia: Que función cumplen esos comandos?

- Me base en un 100% del manual de visual C#, ya que te explica todo. Pero como dije hice mi programa en VB.net

2° - Felixls:

- Te dejo el link abajo para que te descargues el firmware con las especificaciones que vos necesitabas:

Cristal: 20 Mhz y MCLR en ON.

- Felixls, en caso de tengas problemas con el programa:

- Si tenés notebook, primero conectá el PIC y instalá los drivers que te pida.
- Andá al administrador y fijate que que haya un puerto COM disponible. Sin salirte del administrador desconecta el PIC, ahora tiene que desaparecer el icono del puerto com que marcaba antes.
Luego conecta de vuelta y fijate que numero de puerto COM es por ejemplo COM9....

- Abri el programa, en la pestañita del Combobox, te tiene que aparecer el COM9, dale click y luego dale click tambien a conectar. Hasta ahi no te tendría que mandar ningun error.

- pulsa sobre la X o la Y , tendrias que estar recibiendo respuestas desde el PIC..

- Si te sigue dando error decime..

3° -  dalr123:

- Tenés que configurar si o si el puerto COM a utilizar antes de usar el programa, ya que si no siempre te va a dar error.
- Luego apreta el boton conectar y con los botones x e y fijate que vas a recibir las respuestas del PIC en el textbox.

PD: No seas tan olvidadizo jaja 


Bueno he tratado de responder todas las preguntas, si tienen mas pongalas nomas y veo si las puedo responder.


----------



## Meta (Mar 16, 2009)

Moyano Jonathan dijo:
			
		

> Hola a todos , respondiendo las preguntas a cada uno queda mas o menos así:
> 
> 1° - Meta:
> 
> ...


----------



## Moyano Jonathan (Mar 16, 2009)

Algo que no encuentro son cosas del VB 6.0, como por ejemplo: shape e image esos controles no los vi en vb.net.

Con Vb.net estoy en pañales todavía pero aprendiendo a la fuerza todo se puede ajaja.

Ahora esa referncia de C# , es solamente para C# o tambien se cumple para otros lenguajes ?


----------



## Moyano Jonathan (Mar 16, 2009)

Hola a todos de nuevo como para empezar con HID les dejo estos programas de ejemplo que hice la otra vez.

Mejoras con respecto a programas que hice anteriormente para HID:

- Uso el easyHID para crear la aplicación en VB 6.0
- Código más entendible.
- Librería de de C de CCS hecha para trabajar con easyHID.
- Comunicación a alta velocidad.

PD: Estoy haciendo experimentos con Visual C++ , pero es bastante complicado (también con easyHID).


----------



## Moyano Jonathan (Mar 16, 2009)

y el que me faltaba....


Espero les sirva , cualquier duda comenten


----------



## Meta (Mar 16, 2009)

Moyano Jonathan dijo:
			
		

> Algo que no encuentro son cosas del VB 6.0, como por ejemplo: shape e image esos controles no los vi en vb.net.
> 
> Con Vb.net estoy en pañales todavía pero aprendiendo a la fuerza todo se puede ajaja.
> 
> Ahora esa referncia de C# , es solamente para C# o tambien se cumple para otros lenguajes ?



Mira:
http://msdn.microsoft.com/es-es/library/zyy863x8.aspx

Voy a mirar tus ejemplos a ver...
Elijo el VC# por fácil que VC++ y más potente que el VB .net, al menos eso dicen:

EDITO:
shape e image:

Se llama GDI+
http://msdn.microsoft.com/es-es/library/7f4d4txw(VS.80).aspx

http://www.fcharte.com/libros/84-415-2445-3.pdf

Para aquellos a los que las 800 páginas de extensión del libro anterior le resulten excesivas, esta guía práctica les guiará en sus primeros pasos con Visual Basic 2008 al describir conceptos más básicos que en el primero se dan por sabidos.

Con ella podrá familiarizarse con el entorno de desarrollo y los diseñadores de formularios Windows y Web. Conocerá las novedades más interesantes aportadas al lenguaje, aprendiendo a definir clases de objetos, implementar interfaces, utilizar la herencia y definir propiedades y eventos. A partir de ahí aprenderá a diseñar aplicaciones Windows usando formularios, GDI+ y los mecanismos disponibles para la publicación de datos. También podrá desarrollar aplicaciones y servicios Web, con ASP.NET, crear sus propios componentes parar esas aplicaciones y acceder a bases de datos mediante ADO.NET.


----------



## Moyano Jonathan (Mar 16, 2009)

Ahora todo queda claro (lo de vb.net)

El uso de VC# queda relegado , en este caso porque el programa que antes menciones easyHID, me genera código para delphi, vb6.0 y Vc ++. En este caso se podrían llegar a pasar las librerías de control para VC# pero no se como se hace.


----------



## Meta (Mar 16, 2009)

Moyano Jonathan dijo:
			
		

> Ahora todo queda claro (lo de vb.net)
> 
> El uso de VC# queda relegado , en este caso porque el programa que antes menciones easyHID, me genera código para delphi, vb6.0 y Vc ++. En este caso se podrían llegar a pasar las librerías de control para VC# pero no se como se hace.



Visual V# en un lenguaje nuevo, en el cual necesita mucho tiempo que cada vez se emplea más y más, ya habrá cosas de estas en el futuro, y esasyHID no hace nada sobre la plataforma .NET al menos por ahora.

¿Podrías pasarme un ejemplo de una dll funcional para pasarlo a Visual C# a ver si se puede y una explicación del mismo?

Recuerdo que la dll de manejo de puerto paralelo bajo VB6, he visto un ejemplo no hace mucho bajo VC#.


----------



## Moyano Jonathan (Mar 16, 2009)

Voy a ver si hago algún proyecto muy básico en Visual C++ 2008  y después te digo. Quiero ver que tan complicado es hacerlo en ese lenguaje. Por lo pronto me detecta el PIC conectado pero quiero ver si puedo enviar algún dato al PIC y encender un LED.


----------



## Meta (Mar 16, 2009)

Es más complicado, pero no tanto como parece en un principio ya que se parece a VC# y Java.


----------



## Nepper (Mar 16, 2009)

Buenas! buscando como controlar motores paso a paso por USB, el destino (jokelnice) me trajo aquí...
Disculpen que corte bruscamente la línea del tema, pero...
¿el pic funciona solo? o sea, ¿qué circuito utiliza?
en la secundaria, andabamos con un "Meta"   (16f84) y recuerdo textualmente que primero se programaba en la PC, luego se lo "cargaba" al pic y recién ahí funcionaba, pero aca ¿hay que programarlo de antemano para que interprete nuestra conexión con la PC? o insertando el PIC "vacio" en su respectiva "placa", ¿le conecto el USB y ya lo controlo con la PC? o ¿esos son los programas que se insertarán en el PIC?

Si lo que no sé es conectar el PIC, redirijanmé al foro correspondiente...


----------



## Meta (Mar 16, 2009)

Hola:

Manual IC Prog
http://www.abcdatos.com/tutoriales/tutorial/z9316.html

WinPic800
http://www.abcdatos.com/tutoriales/tutorial/z9157.html

Más manuales en:
http://electronica-pic.blogspot.com/

Saludo.


----------



## jokelnice (Mar 16, 2009)

> jokelnice, uy si le agradeceria con lo de labview que lo que ud dice es precisamente lo que quiero hacer, realizarlo en labview, aparte de aprender decirle al profesor que ya lo logre y darle las gracias por la "ayuda" que medio. no he podido leer en labview la información que me envia el pic, aunque no he vuelto a hacer pruebas pues desde que lei el manual de Meta estoy haciendo y desaciendo con V2005 Very Happy , pero me interesa muchisimo lo de labview, esa ayuda se la agradeceria



como estas amigo dail123  si mira para no mezclar las cosas publique un ejemplo para recibir datos por labview en el siguiente foro es sencillo pero basico 

https://www.forosdeelectronica.com/about30606.html


----------



## Meta (Mar 17, 2009)

Hola: Para los que quieran aprender desde 0 VC#:
http://willydev.net/descargas/Cursos/csharp/Default.html
Saludo.


----------



## Genius27 (Mar 17, 2009)

Hola amigos del foro, soy nuevo aqui, y me gustaria, tener un ejemplo e  donde pueda controlar 8 leds a través del puerto USB, con una pequeña aplicacion en visual basic o simplemente desde el hiperterminal, mis conocimientos son básicos, espero contar con su ayuda.


----------



## Moyano Jonathan (Mar 17, 2009)

genius, como andas lee los ultimos post, desde el 11... creo y vas a encontrar lo que necesitas.


----------



## Meta (Mar 17, 2009)

Este libro parece bien que tiene temario de USB.

http://www.casadellibro.com/indices/9788426714954.pdf

Saludo.


----------



## Moyano Jonathan (Mar 17, 2009)

Ese libro yo lo tengo y está buenisimo, es un libro muy orientado al control ...........excelente aporte meta libro recomendadisimo para leer.


----------



## Meta (Mar 17, 2009)

Me han dicho que el estilo está mejor que www.pic16f84a.org aunque sea en ASM, si fuera en C no se.

¿A qué control te refieres?

Me gustaría hacer un control de activar 8 RELÉ por el puerto USB puro con el 1(F2550/4550 pero me di cuenta que es sólo una conversión de RS232-USB y no me hace gracia sólo así.


----------



## QuimCri (Mar 17, 2009)

Disculpen si estoy haciendo esta consulta fuera de foro, pero quisiera saber como evito que se produzca el siguiente error al momento de ejecutar una aplicación en VB 6.0 cuando se intenta abrir un puerto COM que no corresponde al real o no está físicamente:

-- Error '8002' en tiempo de ejecución: Número de Puerto no válido --

Con el decir "evitar" que se produzca el error quiero decir si existe alguna forma de evitar que la aplicación se "caiga", y pueda ser advertido con un mssgBox para que el usuario corrija el número de puerto.

Agradezco la atención prestada.


----------



## Meta (Mar 17, 2009)

Mira aquí:

http://msdn.microsoft.com/es-es/library/0yd65esw.aspx

Saludo.


----------



## LIAMNEESON (Mar 17, 2009)

La función donde abres el puerto te debería quedar como esta:

Private Sub Boton_Abrir_Click()  'Al pulsar aquí abre un puerto serial
On Error GoTo error_puerto
MSComm1.PortOpen = True

error_puerto:
MsgBox "Error de puerto"

End Sub


----------



## Moyano Jonathan (Mar 17, 2009)

> ¿A qué control te refieres?
> 
> Me gustaría hacer un control de activar 8 RELÉ por el puerto USB puro con el 1(F2550/4550 pero me di cuenta que es sólo una conversión de RS232-USB y no me hace gracia sólo así.



Me refiero más que nada al control industrial , por ejemplo como controlas la temperatura de un horno mediante control PID y RTOS (Sistema operativo de tiempo real). Eso es un ejemplo de ese libro.

Ahora con el tema de los 8 relés meta yo puse dentro de los 6 ejercicios utilizando la clase HID un programa que controla relés desde el puerto USB en VB6.0 y lo programe en C de CCS el codigo para el PIC.


----------



## Meta (Mar 18, 2009)

Moyano Jonathan dijo:
			
		

> > ¿A qué control te refieres?
> >
> > Me gustaría hacer un control de activar 8 RELÉ por el puerto USB puro con el 1(F2550/4550 pero me di cuenta que es sólo una conversión de RS232-USB y no me hace gracia sólo así.
> 
> ...



Ese lo vi y por eso lo pregunto  ekejejejejje, pero no sabía que lo hiciste con Visual Basi 6 si con otra cosa. 

¿Puedes hacerlo en el Visual Basic .net? Cuando puedas claro, lo intentaré pasar a VC# y VC++.

AL instalar el CSS 4.0.65 hay dos ejecutables, uno de 8M y otro de 16M con sus nombres ideutilsupd.exe y pcwhdupd.exe. ¿En qué se diferencia?  Voy a ejecutar el pcwhdupd.exe. Ya me dirás si me equivoqué.

Saludo.


----------



## Moyano Jonathan (Mar 18, 2009)

La verdad meta no tengo ni idea de por que son 2 ejecutables....

Al control por HID lo voy a hacer primero en VC++ 2008 y depués voy a ver como pasar de formato las librerías para usarlas con VC#  y si puedo en VB.net.


----------



## QuimCri (Mar 18, 2009)

Disculparán las continuas molestias, pero es que esto me está gustando...

Estuve chequeando los programas HID que Sr. Jonathan publicó utilizando easyHID, y al parecer se pueden realizar muchas aplicaciones. Eso es bueno.

Sin embargo, me he puesto a verificar una correcta comunicación entre el host y el PIC para saber si existe algún problema de transmisión o recepción en alguna de las dos partes, y ha resultado que si.

He probado llenando el Buffer en VB y mandando el paquete al PIC, y que cuando este lo reciba lo reenvie al PC, además de verificar que los datos que el PIC reciba sean los correctos. Sin embargo, parece que solo puedo leer la primera posición del Buffer de recepción en el PIC, y además no devuelve los datos al PC.

Si fuera alguien tan amable y me pudiese indicar cual es el problema en el código VB o CCS que genera este error, le agradezco.


----------



## Moyano Jonathan (Mar 18, 2009)

Dejame que veo como puedo ayudarte. Cualquier cosa te digo

Ahora bien a que llamás llenar el buffer en VB?


----------



## Alber Moremont (Mar 18, 2009)

Hola a todos, talvez llegue algo tarde a este foro, pero he encontrado información realmente útil puesto que tengo que reaizar un proyecto con USB y Labview.

He revisado algo de la información que han puesto aqui se me hace realmente interesante, ademas, de lo poco que habia leido de usb, lo que no me quedaba muy claro era como hacer los descriptores, pero espero que esto me ayude.

No entré a este foro solo para piratearme información (como alguien por ahi dijo que muchos hacen), sino que tratare de aportar algo, aunque ahora solo estoy empezando con el proyecto, espero que pronto pueda darles noticias de como esto me ha ayyudado.

De antemano gracias a todos por compartir el conocimiento.

Todo sea por la electronica...!


----------



## Moyano Jonathan (Mar 19, 2009)

Alber Moremont, en realidad el foro está hecho como una comunidad de autoayuda para los proyectos individuales de cada uno, donde los conocimientos de uno son transmitidos a otros y viceversa para que todos puedan sacar sus dudas.

En cualquier cosa que te podamos ayudar para que termines tu proyecto , deci nomas y vemos como hacemos para darte una mano.


----------



## QuimCri (Mar 19, 2009)

Moyano Jonathan dijo:
			
		

> Dejame que veo como puedo ayudarte. Cualquier cosa te digo
> 
> Ahora bien a que llamás llenar el buffer en VB?



Gracias por la colaboración.

Cuando me refiero a llenar el buffer es que, según entiendo, easyHID crea en VB una clase de array que define el número de Bytes que se pueden enviar en un paquete (máx 64). Yo utilicé el buffer de 8 bytes que pone easyHID. Si se fija en el programa, lo que se hace es ubicar un dato en cada uno de los bloques o posiciones del array BufferOut_ con 1<= i <= 8,  y eviarlo al PIC. En el pic hay otro array DatoRx que los debe recibir.

Según comprendí, el dato que se envía desde VB se puede leer en el PIC de la siguiente forma:


	  VB	<------------>	 PIC
            BufferOut[0]		              No se utiliza
            BufferOut[1]			DatoRx[0]
            BufferOut[2]			DatoRx[1]
	  .                                                   .
            BufferOut[8]			DatoRx[7]

Y de la misma forma al leer en VB lo que se envía del PIC. Sin embargo, como mencioné antes, no coinciden las lecturas que hago en el PIC con los datos que envío del PC (solo coinciden los datos de BufferOut(1) y DatoRx(0)). Espero haber aclarado alguna duda que permita su colaboración.

Agradecimientos_


----------



## Moyano Jonathan (Mar 19, 2009)

Bueno aguantame y el fin de semana hago un ejemplo para ver si puedo arreglar el error que vos me decis.


----------



## David Andres Toro Garzon (Mar 19, 2009)

Saludos, a todos y Moyano me parece muy interesante lo que has echo, e incluso e copiado muchas cosas de las que has echo y estoy haciendo un recuento de todo lo que has desarrollado en USB, en un documento vamos a ver si me animo y lo dejo como tutorial, pero si usted me autoriza, jejeje.

TENGO UNA DUDA. en los programas que usted ha desarrollado hay algo que no entiendo que es 
cuando usted declara una variable

int8 recibe[3] 

int8 = ?
recibe[3], por que encierra en corchetes el 3, eso significa el numero de bits, o que? y hasta que numero puedo colocar ahi?

Le agradeceria mucho su respuesta, y que pena la molestia ya que van tan adelante pero, si me gustaria tener claro ese detalle.


----------



## jokelnice (Mar 19, 2009)

si claro colega esa es una declaracion de un vector o array ,  lo que estas haciendo es declarando un array de enteros de 8 bits ( 0-255) de tres posisiones , que para este  caso seria cantidad de bytes y esa cantidad sera 3 , entonces seria un  array de tres bytes . que para uso del usb serian tres bytes que recibirias o tres bytes que enviarias .. saludos


----------



## Moyano Jonathan (Mar 20, 2009)

La explicación de jokelnice es más que clara, es la declaración de un array  de 3 bytes para poder enviar 3 datos de 8 bits a la vez.


PD: Este fin de semana me pongo a full con el control de motores paso a paso por USB. y tambien en el desarrollo de una interfaz para controlar 16 salidas con tan solo 3 cables y además hacerlo USB.



> estoy haciendo un recuento de todo lo que has desarrollado en USB, en un documento vamos a ver si me animo y lo dejo como tutorial, pero si usted me autoriza, jejeje.



Por supuesto que podes hacerlo , no hay problema.


----------



## robin2715 (Mar 20, 2009)

Hola
Mi nombre es Robinson, y he estado probando los ejemplos propuestos del foro. Mas concretamente he probando el ejemplo dos que es que enciende el led verde cuando el host enumera el pic y no me funciona. El Host nunca enumera el pic, y el led rojo permanece encendido. Lo he probado en vida real y en proteus 7.4 y el funcionamiento es el mismo. Con base a esto quisiera que me dieran ideas de cúal puede ser el problema y de paso hacerles unas preguntas: 
¿han probado si los ejemplos Funcionan con el proteus? ¿Los ejemplos que han publicado de HID, funcionan con la velocidad plena del puerto?

Bueno de antemano les  agradezco su pronta colaboración, por lo pronto yo sigo leyendo toda la información del foro (que es bastante) a ver si resuelvo mis dudas

Gracias


----------



## David Andres Toro Garzon (Mar 21, 2009)

Muchas gracais Jokelnice y Moyano, la duda me queda clara. Moyano, el tutorial se lo debo, talvez cuando entre a vacaciones, lo hago que tengo mucho trabajo en la u, pero lo voy a hacer porque me parece muy bueno el trabajo de los que han participado en su foro. 

Pero queria pedirle un favor a Jokelnice, yo lei anteriormente que usted a desrrrollado un foro el labview, me gustaria y me dice si depronto me ayudaria a entender labview que no lo comprendo y sobre todo para saber como se maneja esas interfaces, que es que pocon poco se de eso y usted ya ha manejado ese tema.

Si crea un foro para eso o me dice de uno en el que me explique como manejar esta interfaz. 
Muchas gracias


----------



## Moyano Jonathan (Mar 21, 2009)

A robin2715:


> El Host nunca enumera el pic, y el led rojo permanece encendido. Lo he probado en vida real y en proteus 7.4 y el funcionamiento es el mismo. Con base a esto quisiera que me dieran ideas de cúal puede ser el problema y de paso hacerles unas preguntas:
> ¿han probado si los ejemplos Funcionan con el proteus? ¿Los ejemplos que han publicado de HID, funcionan con la velocidad plena del puerto?


Postea el ejemplo que estás probando vos, a ver si te puedo ayudar. Sin embargo yo mismo he probado todos y cada uno de los ejemplos que postee en este foro y todos funcionan bien.


A David:



> Moyano, el tutorial se lo debo, talvez cuando entre a vacaciones



Tomate tu tiempo igual faltan algunas cosas como estas en el control del USB:

- Teclado  y mouse HID
- Jostick HID
- Control de motores PAP y Servo
- Todo lo referente a mpusbapi.dll
- Más ejercicios de HID.

- Pasar todo a Visual basic.net (Emulación CDC)
- Pasar todo a VC++ 2008 (HID)


----------



## Moyano Jonathan (Mar 22, 2009)

Ya tengo listo el control del motor paso a paso , ahora lo que me queda es hacerlo USB


----------



## jokelnice (Mar 22, 2009)

> Pero queria pedirle un favor a Jokelnice, yo lei anteriormente que usted a desrrrollado un foro el labview, me gustaria y me dice si depronto me ayudaria a entender labview que no lo comprendo y sobre todo para saber como se maneja esas interfaces, que es que pocon poco se de eso y usted ya ha manejado ese tema.
> 
> Si crea un foro para eso o me dice de uno en el que me explique como manejar esta interfaz.
> Muchas gracias



si claro *David * si estoy pensando hacer una especie de manual de labview , ya que seria muy importante y ademas casi no hay información en español saludos y cualquier te comento


----------



## Meta (Mar 22, 2009)

jokelnice dijo:
			
		

> > Pero queria pedirle un favor a Jokelnice, yo lei anteriormente que usted a desrrrollado un foro el labview, me gustaria y me dice si depronto me ayudaria a entender labview que no lo comprendo y sobre todo para saber como se maneja esas interfaces, que es que pocon poco se de eso y usted ya ha manejado ese tema.
> >
> > Si crea un foro para eso o me dice de uno en el que me explique como manejar esta interfaz.
> > Muchas gracias
> ...



Oye, lo de hacer manuales de lo que dices, estaría muy agradecido, ya que nunca he usado LabView en mi vida.

Yo sigo con los míos:
http://electronica-pic.blogspot.com/

Saludo.


----------



## Moyano Jonathan (Mar 23, 2009)

Tambien estoy desarrollando un jostick usb para jugar nes.. gracias al aporte de LIAMNEESON.

Tiene 1 control analógico.


----------



## robin2715 (Mar 23, 2009)

Moyano Jonathan dijo:
			
		

> A robin2715:
> 
> 
> > El Host nunca enumera el pic, y el led rojo permanece encendido. Lo he probado en vida real y en proteus 7.4 y el funcionamiento es el mismo. Con base a esto quisiera que me dieran ideas de cúal puede ser el problema y de paso hacerles unas preguntas:
> ...


----------



## Moyano Jonathan (Mar 23, 2009)

Hola robin2715 menos mal que te funciono , ya estoy haciendo mas ejemplos con usb pero llevan su tiempo asi que toca esperar.


----------



## Genius27 (Mar 24, 2009)

Hola, amigos del foro encontre lo que andaba buscando, y ahora me gustaria simular estas aplicaciones, pero tengo varios problemas, el primero es que tengo Visual HomePremiun y no me deja instalar visual basic 6 y tampoco visual studio 2008, el segundo la versión de proteus que manejo es la 6,7 y me gustaria simular en 7,4 y o superior, si alguien sabe por que se generan errores en la instalacion y como puedo corregirlos se los agradeceria.


----------



## Moyano Jonathan (Mar 24, 2009)

La verdad que en el vista no se como se instalan estos programas....El visual studio te lo tendría que instalar sin problemas pero los demás ni idea de como se instalan.


----------



## Genius27 (Mar 24, 2009)

Hola MoyaPic, me gustaria saber cual es el link de descarga de la ultima versión de proteus, gracias por todos tus aportes son excelentes.


----------



## Moyano Jonathan (Mar 24, 2009)

Y mirá eso lo vas a tener que buscar vos ya que en el foro no se acepta piratería.


----------



## Genius27 (Mar 24, 2009)

Hola MoyaPic, estube revisando el diagrama del ejemplo 6 que publicaste y me pregunta es: los voltajes de polarización del con USB estan invertidos o simplemente se toman asi teniendo como referencia el puerto de la PC


----------



## Moyano Jonathan (Mar 24, 2009)

Ahora del ejemplo 6 de CDC o HID del ejemplo de HID el esquema está bien al igual que el esquema de CDC. Sino decime donde puede llegar a estar y lo corrijo.


----------



## Genius27 (Mar 24, 2009)

No quiero decir que tenga un error, solo te pregunto para confirmar, en el CONECTOR USB el voltaje de polarización esta invertido?


----------



## Moyano Jonathan (Mar 24, 2009)

Haa , no mira esta bien el voltaje VCC + 5V  y GND masa. Espero esta sea la respuesta a tu pregunta pero si no es así marcame en un esquema y te digo


----------



## Moyano Jonathan (Mar 24, 2009)

PD: Disculpame que sea medio duro para entender........lo que pasa es que esta hora de la noche me lo tienen que explicar con manzanas para que entienda algo. jajajajaj


----------



## Genius27 (Mar 25, 2009)

Era solo la confirmación, Gracias
Otra pregunta: Intente convertir tu código a visual basic express 2008 y por lo que entiendo hay algunas funciones que no reconoce o deben ser cambiadas, Ya has trabajado en esta versión que cambios debo hacer?


----------



## Moyano Jonathan (Mar 25, 2009)

Y si mirá en HID estoy haciendo pruebas en Visual C++ pero va lenta la cosa por los estudios


----------



## Moyano Jonathan (Abr 4, 2009)

Alguien por casualidad ha probado como se podría llegar a conseguir los descriptores de un convertidor USB - PARALELO


----------



## le8a9p (Abr 9, 2009)

muy buen tema, muchas gracias por todos los aportes.


----------



## Moyano Jonathan (Abr 9, 2009)

Faltan muchos aportes más sobre el tema y actualizaciones de otros post que se van a ir añadiendo según mi tiempo me lo permita.


----------



## Meta (Abr 11, 2009)

Hola:

Quizás aquí hay información que pueda ayudar.

Saludo.


----------



## javker29 (Abr 14, 2009)

Qtal señores,
estoy interesado tambien sobre el tema de la comunicación entre pic y pc por USB he revisado sus apuntes y estan interesantes cualquier aporet que pueda hacer lo estar ingresando

Gracias


----------



## Moyano Jonathan (Abr 14, 2009)

todo lo que puedan aportar es bienvenido


----------



## Alber Moremont (Abr 15, 2009)

Hola de nuevo..
Solo tengo una duda, ¿alguien a utilizado la herrameinta "Descriptor tool" que se encuentra en la pagina de usb para generar los descriptores? no se si sea una buena opcion para realizarlos.


----------



## Moyano Jonathan (Abr 15, 2009)

Es muy buena opción pero no se como utilizarla


----------



## Alber Moremont (Abr 15, 2009)

Entre toda la documentacion que hay en la pagina de usb, esta una parte llamada "Device class definition for HID" en este documento hablan un poco de cada uno de los parametros que se utilizan en la herramienta "descriptor tool" (DT)  y se me parece que es otra buena opción para crear descriptores.

La libreria que proporciona Moyano Jonathan  en los ejemplos para usar easyHID es buena pero no esta por demas saber hacerlo con otros instrumentos. 

Apenas obtenga algun buen resultado escribo algo hacerca de esto...

De cualquier manera dejo el link en donde esta todo lo relacionado con HID (aunque supongo que ya lo habran chrecado alguna vez), el documento y la herramienta, po si alguien se interesa en la utilizacion de esta herrameinta. 

http://www.usb.org/developers/hidpage/ 

(es de la pagina oficial de usb)

Por cierto, ¿han utilizado mikroC para programar PIC18 y en especial usb?


----------



## JOJOJORGE (Abr 15, 2009)

Hola 

y que tal el "Microchip USB OTG Configuration Tool" te genera los descriptores y algo de codigo para usarlo con los pic18f, pic24, dspic y pic32

no lo probe todavia pero parese interesante.

salu2


----------



## Moyano Jonathan (Abr 15, 2009)

OTG hay hojas de aplicacion pero esta todo para C18 y C30


----------



## JOJOJORGE (Abr 16, 2009)

Hola

el OTG esta disponible solo para los pic24 y los pic32 que permite configurar el pic como host.
pero la aplicacion tambien funciona para generar codigo para perifericos.

probare esta herramienta y comentare los resultados.
ya programe una aplicacion con usb bulk transfer en visualC++ aunque no use sus librerias mfc sino las funciones del api de windows directamente y basandome en un ejemplo para borland C en la carpeta del driver.

salu2


----------



## jokelnice (Abr 16, 2009)

JOJOJORGE dijo:
			
		

> Hola
> 
> el OTG esta disponible solo para los pic24 y los pic32 que permite configurar el pic como host.
> pero la aplicacion tambien funciona para generar codigo para perifericos.
> ...



huy jojorge eso estaria de lujos , ya habia escuchado del *otg * y quede interesado pero no eh sabido por donde empezar


----------



## Moyano Jonathan (Abr 18, 2009)

Si alguien puede poner información sobre otg o algún código de ejemplo estaría buenisimo para que entre todos podamos realizar aplicaciones.


----------



## washi_w_z_r (Abr 21, 2009)

*hola amigos:*
 *Estoy desarrollando un prog que adquiera datos analogicos con el ADC del pic18f4458(ADC de 12 bits),  por usb y lo muestre en la pc me salio este codigo , que aun lo estoy puliendo*   : 

programa en el pic :

```
include <18F4458.h>
#device ADC=12   // ADC DE 10 BITS
#fuses XTPLL,NOMCLR,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL1,CPUDIV1,VREGEN
#use delay(clock=48000000)


/////////////////////////////////////////////////////////////////////////////
//
// CCS Library dynamic defines.  For dynamic configuration of the CCS Library
// for your application several defines need to be made.  See the comments
// at usb.h for more informaciónrmation
//
/////////////////////////////////////////////////////////////////////////////
#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    3                 //size to allocate for the tx endpoint 1 buffer
#define USB_EP1_RX_SIZE    3                 //size to allocate for the rx endpoint 1 buffer

#define USB_CON_SENSE_PIN PIN_E3  
#define DERECHA 0

#include <pic18_usb.h>     //Microchip PIC18Fxx5x Hardware layer for CCS's PIC USB driver
#include <USB_ADC_TESIS.h>         //Configuración del USB y los descriptores para este dispositivo
#include <usb.c>           //handles usb setup tokens and get descriptor reports

#byte ADCON0 = 0xFC2
#byte ADRESL = 0XFC3
#byte ADRESH = 0XFC4


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

#define modo      recibe[0]
#define param1    recibe[1]
#define param2    recibe[2]
#define MedidaAlta   envia[0]
#define MedidaBaja  envia[1]

void config_adcon2(short justificacion);
int H,L;

void main(void) {

   int8 recibe[3];                  //declaramos variables
   int8 envia[2];
   
   set_tris_a(0x1);    // configuramos RA como entrada
   
   LED_OFF(LEDV);                   //encendemos led rojo
   LED_ON(LEDR);

   usb_init_cs();                      //inicializamos el USB
   setup_adc_ports(AN0 || VSS_VDD);
   config_adcon2(DERECHA);
   while (TRUE)
   {
      usb_task();                      //habilita periferico usb e interrupciones
      if(usb_enumerated())          //si el PicUSB está configurado
      {
         LED_OFF(LEDR);
         LED_ON(LEDV);                    //encendemos led verde

         if (usb_kbhit(1))          //si el endpoint de salida contiene datos del host
         {
            usb_get_packet(1, recibe, 3); //cojemos el paquete de tamaño 3bytes del EP1 y almacenamos en recibe

            if (modo == 1) // Modo_Led
            {
               if (param1 == 0) {LED_OFF(LEDV); LED_OFF(LEDR);} //apagamos los leds
               if (param1 == 1) {LED_ON(LEDV); LED_OFF(LEDR);} //encendemos led verde
               if (param1 == 2) {LED_OFF(LEDV); LED_ON(LEDR);} //encendemos led rojo
            }
            if (modo == 2)  //Modo ADC
            {
              set_adc_channel(0);
              while(bit_set(ADCON0,1));
              H = ADRESH;
              L = ADRESL;
              MedidaAlta = H;
              MedidaBaja = L;
              usb_put_packet(1, envia, 1, USB_DTS_TOGGLE);
              LED_On(LEDR);
              LED_ON(LEDV);                    //encendemos led verde
            }
         }
      }
   }
}
void config_adcon2(short justificacion)
{
   setup_adc(ADC_CLOCK_DIV_64 );  // reloj de conversión = Fosc / 64
    if(justificacion){
    #asm
    bsf 0xFC0,7    // ADFM <- 1
    #endasm
    }
    else{
    #asm
      bcf 0xFC0,7   // ADFM <- 0
   #endasm
   }
   #asm          // configura Tacq = 2Tad
    bsf 0xFC0,3
    bcf 0xFC0,4
    bcf 0xFC0,5
   #endasm
}
```
 *en visual c# tenemos los siguiente:* 


```
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;

using PVOID = System.IntPtr;
using DWORD = System.UInt32;

namespace USB_ADC_TESIS
{
    public partial class Form1 : Form
    {
        PicUSBAPI usbapi = new PicUSBAPI();
        public Form1()
        {
            InitializeComponent();
        }
        unsafe public class PicUSBAPI
        {
            #region Definición de los Strings: EndPoint y VID_PID
            string vid_pid_norm = "vid_04d8&pid_0042";

            string out_pipe = "\\MCHP_EP1";
            string in_pipe = "\\MCHP_EP1";
            #endregion

            #region Funciones importadas de la DLL: mpusbapi.dll
            [DllImport("mpusbapi.dll")]
            private static extern DWORD _MPUSBGetDLLVersion();
            [DllImport("mpusbapi.dll")]
            private static extern DWORD _MPUSBGetDeviceCount(string pVID_PID);
            [DllImport("mpusbapi.dll")]
            private static extern void* _MPUSBOpen(DWORD instance, string pVID_PID, string pEP, DWORD dwDir, DWORD dwReserved);
            [DllImport("mpusbapi.dll")]
            private static extern DWORD _MPUSBRead(void* handle, void* pData, DWORD dwLen, DWORD* pLength, DWORD dwMilliseconds);
            [DllImport("mpusbapi.dll")]
            private static extern DWORD _MPUSBWrite(void* handle, void* pData, DWORD dwLen, DWORD* pLength, DWORD dwMilliseconds);
            [DllImport("mpusbapi.dll")]
            private static extern DWORD _MPUSBReadInt(void* handle, DWORD* pData, DWORD dwLen, DWORD* pLength, DWORD dwMilliseconds);
            [DllImport("mpusbapi.dll")]
            private static extern bool _MPUSBClose(void* handle);
            #endregion

            void* myOutPipe;
            void* myInPipe;

            //Constantes
            const int MaxRec = 2;
            const int MaxEnv = 2;
            //**** FUNCION ABRIR PIPE ****
            public void AbrirPipes()
            {
                DWORD seleccion = 0;
                myOutPipe = _MPUSBOpen(seleccion, vid_pid_norm, out_pipe, 0, 0);
                myInPipe = _MPUSBOpen(seleccion, vid_pid_norm, in_pipe, 1, 0);
            }
            //**** FUNCION CERRAR PIPE ****
            public void CerrarPipes()
            {
                _MPUSBClose(myOutPipe);
                _MPUSBClose(myInPipe);
            }

            /**** FUNCIONES ENVIO RECEPCION DE PAQUETES ******/
            private void EnvioPaquete(byte* SendPacket, DWORD SendLength)
            {
                uint Sendelay = 1000;
                DWORD SendDataLength;
                _MPUSBWrite(myOutPipe, (void*)SendPacket, SendLength, &SendDataLength, Sendelay);
            }
            private void ReciboPaquete(byte* ReceiveData, DWORD* ReceiveLength)
            {
                uint ReceiveDelay = 1000;
                DWORD ExpectReceiveLentgh = *ReceiveLength;
                _MPUSBRead(myInPipe, (void*)ReceiveData, ExpectReceiveLentgh, ReceiveLength, ReceiveDelay);
            }
            /****  PRENDER APAGAR LEDS ******/
            public void LedPIC(uint led)
            {
                byte* send_buf = stackalloc byte[2];
                send_buf[0] = 0x01;
                send_buf[1] = (byte)led;
                EnvioPaquete(send_buf, 2);
            }
            ///////////////////////////////////////////////
            /**** FUNCIONES PERSONALIZADAS ****/
            //public void RecibirPaquetePic(byte* BufferRec)
            public float RecibirPaquetePic()
            {
                float Conversion = 0;
                byte* BufferRec = stackalloc byte[3];               
               
                DWORD RecvLentgh = 2;

                ReciboPaquete(BufferRec, &RecvLentgh);
                
               // if (BufferRec[0]==0)
               // return Conversion = BufferRec[0];
                //else
               return Conversion = BufferRec[1];
            }
            // **** FUNCION QUE PIDA DATOS AL PIC ****
            public void PideDatosPic()
            {
                byte* send_buf = stackalloc byte[2];
                send_buf[0] = 0x02;  //pedimos al pic iniciar ADC
                send_buf[1] = 0;     // no iplementado
                EnvioPaquete(send_buf, 2);
            }
        }

        private void btnAbrir_Click(object sender, EventArgs e)
        {
            try
            {
                // CERRAMOS ENLACES ABIERTOS PARA INICIAR NUEVO ENLACE
                usbapi.CerrarPipes();
                // ABRIENDO NUEVO ENLACE
                usbapi.AbrirPipes();
                usbapi.LedPIC(0x00);
            }
            catch
            {
                MessageBox.Show("NO SE PUDO ABRIR ENLACE");
            }
            
        }

        private void btnCerrar_Click(object sender, EventArgs e)
        {
            usbapi.CerrarPipes();
        }

        private void btnRojo_Click(object sender, EventArgs e)
        {
            usbapi.LedPIC(0x01);
        }

        private void btnVerde_Click(object sender, EventArgs e)
        {
            usbapi.LedPIC(0x02);
        }

        private void btnADC_Click(object sender, EventArgs e)
        {
            usbapi.PideDatosPic();
            timer1.Start();
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            usbapi.RecibirPaquetePic();
            textBox1.Text = usbapi.RecibirPaquetePic().ToString();
            this.listBox1.Items.Add(usbapi.RecibirPaquetePic().ToString());
        }

        private void btnPausa_Click(object sender, EventArgs e)
        {
            timer1.Stop();
        }
      
        
    }
}
```


 *Lo extraño de esto cuando hice el prog en c# que prendia y apagaba los led  funcionao de maravillas, cuando le puse codigo para adquisicion de datos por el ADC mi prog ya no hace nada salvo enumerar y hacer conex con este pic, bueno sugerencias y sobre todo consejos seran bienvenidos  * 
 [/b]


----------



## javker29 (Abr 22, 2009)

Que tal washi w z r, saliendome un poco del tema USB le comento sobre un detalle del ADC de 12 bits
hace unos días vengo trabajando con el pic 18f4523 el cual tambien maneja 12 bits de reslución en el ADC, mi aplicación consiste en leer el dato analogo que arroja un AD595 el cual acondiciona la señal de una termocupla tipo K, este por cada grado centigrado arroja 10 mV, bueno sin extenderme mucho, al visualizar los datos del ADC en una lcd, los visualizo con decimas de grados pero las decimas varian mucho es decir saltan por ejemplo de 1 a 7, de 3 a 9, etc y no se mantienen estables a una temperatura estable,

me gustaria saber si conoces algo sobre este pic y la forma correcta de m,anejar el adc para la resolución de 12 bits

gracias


----------



## JOJOJORGE (Abr 22, 2009)

Moyano Jonathan dijo:
			
		

> Si alguien puede poner información sobre otg o algún código de ejemplo estaría buenisimo para que entre todos podamos realizar aplicaciones.



Hola

en la documentacion de microchip estan muchos ejemplos sobre el OTG, tienen ejemplos sobre CDC, HID, USB Mass Storage, USB printer.

si los abren esta el codigo y la documentacion.

salu2


----------



## washi_w_z_r (Abr 22, 2009)

*Hola, yo tambien estoy desarrollando este tema del ADC , para que tu pic tenga una resol de 12bits colocas #DEVICE = 12 , aca te dejo un codigo *


```
#include <18F4458.h>
#DEVICE ADC=12 // cad a 12 bits, justificación a a la derecha
#fuses XTPLL,MCLR,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL1,CPUDIV1,VREGEN,NOPBADEN
#use delay(clock=48000000)


#define DERECHA 0

#byte ADCON0 = 0xFC2
#byte ADRESL = 0xFC3 
#byte ADRESH = 0xFC4

#use standard_io(a)
void config_adcon2(short justificacion);
int h,l;
void Leer_ADC1(void)
{
     config_adcon2(DERECHA);
     set_adc_channel(0);
      bit_set(ADCON0,1);
      while(bit_test(ADCON0,1))
      h = ADRESH;
      l = ADRESL;
      output_b(h);  // bits bajos
      output_d(l);  //  bits altos
}

void main()
{
   setup_adc(ALL_ANALOG);
   set_tris_b(0x0);   //configura puertos como salidas
   set_tris_d(0x0);
   while(true)
   {
    Leer_ADC1();   
   
   }
}

//-----------------------------------------------------------------------------------------
// cumple la función de configurar el bit ADFM para hacer 
// la justificación, también se incluye el retardo por hardware de Tacq
// datos de entrada: bandera de justificación
// datos de salida: nada
//-----------------------------------------------------------------------------------------
void config_adcon2(short justificacion)
{
   setup_adc(ADC_CLOCK_DIV_64 );  // reloj de conversión = Fosc / 64
   if(justificacion){
    #asm
      bsf 0xFC0,7    // ADFM <- 1
    #endasm
   }
   else{
    #asm
     bcf 0xFC0,7   // ADFM <- 0
    #endasm
   }
   #asm          // configura Tacq = 2Tad
     bsf 0xFC0,3
     bcf 0xFC0,4
     bcf 0xFC0,5
   #endasm
}
```

*El cod lineas arriba no me dio ningun problema, eso si te recomiendo que veas si el adc esta funcionando correctamente coloca led en el puerto B(B0 - B7) y al puerto D(D5-D7) (el codigo lineas arriba   realiza dicha operacion ) , a la  entrada del pin RA1 coloca un potenciometro y mide la tension respectiva , una vez que estes seguro de tus tensiones ( en tu caso las variaciones ) sean las correctas, una vez asegurado esto los visualizaras en tu lcd *.


```
#include <18F4458.h>
#DEVICE ADC=12 // cad a 12 bits, justificación a a la derecha
#fuses XTPLL,MCLR,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL1,CPUDIV1,VREGEN,NOPBADEN
#use delay(clock=48000000)


#define DERECHA 0

#byte ADCON0 = 0xFC2
#byte ADRESL = 0xFC3 
#byte ADRESH = 0xFC4

#use standard_io(a)
void config_adcon2(short justificacion);
int h,l;


float const resolucion=5.0/4096.0  // conversion 12bits


void main()
{
   float voltios;
   long valor;
   setup_adc(AN0);
   config_adcon2(DERECHA);
   set_adc_channel(0);   // canal 0 , por donde ingresan los datos
   while(true)
   {
    valor = read_adc();
    lcd_gotoxy(1,1);
    voltios = valor*resol;
    print(lcdputc,"%1.2f voltios",voltios);
    delay_ms(200);    //convierte cada 200ms
   }
}

//-----------------------------------------------------------------------------------------
// cumple la función de configurar el bit ADFM para hacer 
// la justificación, también se incluye el retardo por hardware de Tacq
// datos de entrada: bandera de justificación
// datos de salida: nada
//-----------------------------------------------------------------------------------------
void config_adcon2(short justificacion)
{
   setup_adc(ADC_CLOCK_DIV_64 );  // reloj de conversión = Fosc / 64
   if(justificacion){
    #asm
      bsf 0xFC0,7    // ADFM <- 1
    #endasm
   }
   else{
    #asm
     bcf 0xFC0,7   // ADFM <- 0
    #endasm
   }
   #asm          // configura Tacq = 2Tad
     bsf 0xFC0,3
     bcf 0xFC0,4
     bcf 0xFC0,5
   #endasm
}
```


*Espero que los codigos te den una luz en tu camino jajajaaj , todo dependera ahora de ti , saludos *


----------



## javker29 (Abr 23, 2009)

Gracias voy  a revizar el codigo y a compararlo con lo que tengo

y le voy comentando como me trabaja el adc


----------



## Moyano Jonathan (Abr 23, 2009)

washi_w_z_r gracias por tus aportes al tema , ya voy a actualizar con ejercicios nuevos , lo que pasa es que mi tiempo es muy escaso con los estudios.


----------



## alfangel (Abr 29, 2009)

Hola Estoy implementando una aplicacion para el tema USB usando el 18F2550 en este caso de trata de un motor a pasos y una targeta de adquisicion de datos analogicos de 6 y 8 mas digitales, todo atraves del micro usando VB6  aunque es posible que lo transpase a .NET dado la modernidad. a la brevedad dare los resultados del codigo y algunas fotos y videos les agradesco por la informaciónrmacio he interes a todos, estare en contacto.


----------



## Moyano Jonathan (Abr 29, 2009)

Está bueno tu proyecto yo ya he tomado datos en VB 6.0 y USB asi como también tengo conocimientos sobre control de motores PAP.


----------



## alfangel (Abr 30, 2009)

me he descargado el ejemplo 1 para hacer algunas pruebas con el pero me topo con la sorpresa que al istalar el driver desde el panel de control me aprece una advertencia que dice que el puerto no se puede abrir (codigo 10), esto evita que lo detecte incluso el hiper terminal asi que al cargar el pic y conectarlo la computadora permanece inmutable tanto en vista como en XP he buscado algunas soluciones en la red pero too parece estar bien con el .INF amenos que se trate de un conflicto de version q no deveria, por favor si alguien ya hiso funcionar los ejemplos le pediria que me acesorara por que esto me tiene parado.

sigo en contacto.


----------



## Moyano Jonathan (Abr 30, 2009)

La verdad que el ejemoplo número 1 es el más sencillo de todos es muy raro que no te funcione, fijate que estés instalando bien los divers.


----------



## washi_w_z_r (Abr 30, 2009)

Hola,  yo tambien pase por  lo mismo , pueden ser varias  cosas , fijate bien si pusiste el capacitor electrolitico de 47uf adecuado en el pin Vbus ( que en pic 18f4550 es el pin 18)  , si te compila bien el prog y no tienes problemas en grabar el prog en el pic , resvisa con detalle tu hardware.

El driver funciona de maravillas tanto en xp como en vista, mientras no le cambies o agreges mas definiciones de endpoint

AHH verifica si  el VID yPID son los mismos 

saludos.


----------



## Moyano Jonathan (May 9, 2009)

Whasi te funcionó lo de recibir los datos del ADC en visual C# ?


----------



## Meta (May 9, 2009)

Por cierto. 

¿Alguien se siente capaz de hacer un tutorial o manual en el foro o donde sea sobre controlar unos Led por USB 2.0 al 18Fx550?

Parecido con lo que hice con Visual C# y Visual Basic.

Saludo.


----------



## Moyano Jonathan (May 9, 2009)

Yo podría hacerlo, pero me complica mucho el tiempo. Además faltan por explicar algunos conceptos sobre USB, mas que nada el uso de unas funciones que no explique anteriormente.

PD: USB y Visual C# ya están dando sus primeros pasos pero me falta HID y Visual C#


----------



## Meta (May 9, 2009)

A bueno, poco a poco.

Aquí hay ejemplos de USB y C#.

http://www.hobbypic.com/

Saludo.


----------



## Moyano Jonathan (May 9, 2009)

Esos ejemplos ya los había visto, por ahora estoy viendo el VB 2008 para pasar todos los ejemplos de CDC USB y luego me voy a poner con HID en Visual C# o VC++. Por último ver el tema de Bulck transfer y hacer un manual recompilando todo lo visto.


----------



## washi_w_z_r (May 9, 2009)

hola jhonatan : 
Asi es, pude enviar datos a  la pc  via USB con el pic18f4550 y con el pic18f4458, los recibo por cinco canales diferentes , ya que envio cinco señales analogicas , aqui una pequeña muestra , saludos


----------



## Meta (May 9, 2009)

Buenas:

¿El programa de la imagen lo hiciste tu?

Adiós.


----------



## Moyano Jonathan (May 9, 2009)

Muy buenas tus gráficas ! Yo todavía me estoy peleando para poder comunicarme con USB en VC# mediante Bulck, pero voy a ver como hago para hacerlo.


----------



## Meta (May 9, 2009)

jejeje, siempre nos peleamos  en  algo, pero como siempre hemos hecho, no se puede decir que no sale algo hasta que lo dejes de intentar.


----------



## Moyano Jonathan (May 9, 2009)

ajjajajaja una verdad muy cierta meta ! Como lo que nos pasó con los menues jaja  , que al final nos salio


----------



## Moyano Jonathan (May 9, 2009)

Otra cosa que voy a ver si empiezo esta tarde es una controladora USB de 3 motores PAP que me han pedido varios usuarios.


----------



## washi_w_z_r (May 9, 2009)

hola: en si cual es tu problema pòr cual  no te comunicas con el puerto usb con c#, saludos


----------



## Moyano Jonathan (May 9, 2009)

No se como se hacen las llamadas a la dll ni como se utiliza sus funciones en ese lenguaje


----------



## jax (May 10, 2009)

hola muchachos soy nuevo en este tema y he leido varios documentos y he visitado muchas paginas en internet. hasta el momento de encontrarme con este foro.
tengo unas dudas que no me han dejado avanzar en mi proyecto por manejar el puerto usb.Teoricamente me considero bien y entiendo el protocolo. pero mi problema es la hora de programar el pic. he mirado los post y he entendido mucho pero la cuestion que mi problema es conocer como hace el pic o el pc a nivel de lenguaje el proceso de enumeracion y como el pic deja leer los buffer descriptores. se que anivel de protocolo lo que pasa, pero cuando llego al hardware no se como entenderlo estoy trabajando sobre el pic 18f2550

Gracias por la atensión prestada, y disculpen las molestias de mi situacion


----------



## alfangel (May 12, 2009)

mmm pues ay esta el codigo de firmware del pic todavia me falta hacer el software pero queria que vieran este primero, ay me dicen como me quedo acepto criticas, por cierto sigue sin querer correr el ejemplo 1 y creo que es el cristal, y solo venden de 4 Mhz aca en mi tierra asi que me tendre que adaptar supongo, saben si funciona igual con esa condiccion?, bueno aun asi lo programe con 20Mhz, gracias por todo, se los dejo.



```
// programa de control de motor a pasos e interfas de datos analogos y digitales ambos de 8 canales, via USB.
// Programador: Abdul Saucedo.
// Basado en programa de Moyano Jonathan.
// Fecha: 10/05/09
//************************************************************************
#include <18F2550.h> // Definición de registros internos.
#DEVICE ADC=10 // CAD con 10 bits de resolución , justificación a la derecha.
#fuses HSPLL,NOMCLR,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN,NOPBADEN

// Fuses utilizados:
/*
HSPLL: utilizamos un cristal HS de alta velocidad, en conjunto con el PLL para generar los 48Mhz.
NOMCLR: Utilizamos reset por software, y dejamos el pin 1 del micro como entrada/salida digital.
NOWDT: No utilizamos el perro guardían.
NOPROTECT: Desactivamos la protección de código.
NOLVP: Desactivamos la programación a bajo voltaje.
NODEBUG: No entramos al modo debug.
USBDIV: signfica que el clock del usb se tomará del PLL/2 = 96Mhz/2 = 48Mhz.
PLL5: significa que el PLL prescaler dividirá en 5 la frecuencia del cristal. para HS = 20Mhz/5 = 4Mhz.
CPUDIV1: El PLL postscaler decide la división en 2 de la frecuencia de salida del PLL de 96MHZ, si queremos 48MHZ, lo dejamos como está.
VREGEN: habilita el regulador de 3.3 volts que usa el módulo USB
NOPBADEN: Deshabilitamos el módulo de conversión ADC del puerto B.
*/

#use delay(clock=48000000) // Frecuencia máxima de trabajo 48 Mhz.
short estado_usb;   // boolean global, se debe declarar antes de llamar a usb_cdc.h
#define USB_CON_SENSE_PIN PIN_E3 // Definiendo este pin , detectamos si el host está conectado o no por hardware.
#include "usb_cdc.h" // Descripción de funciones del USB.
#include "usb_desc_cdc.h" // Descriptores del dispositivo USB.

// Declaramos las funciones utilizadas.
void config_adcon2(int num); // Función que utilizamos para configurar el registro ADCON2.
void estado_conexion_usb(short bandera); // Muestra el estado de la conexión USB.

void main() { // Comienza el programa principal.
// Variables utilizadas en el programa.
int i;//variable de incremento
long valorA,valorB,valorC,valorD,valorE,valorF,valorG,valorH;//variables de valor analogico
// Configuramos los puertos del PIC.
    set_tris_a(63); // RA0 a RA5, como entrada
    set_tris_b(152); // RB1,RB2,RB3,RB4,RB7 como entrada
    set_tris_c(199);// RC0,RC1,RC2,RC6,RC7 como entrada
// Otras configuraciones.
   disable_interrupts(global);
   disable_interrupts(int_timer1);
   disable_interrupts(int_rda);
   disable_interrupts(int_ext);
   disable_interrupts(int_ext1);
   disable_interrupts(int_ext2);
   setup_spi(FALSE);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
   port_b_pullups(FALSE);    
   setup_adc_ports(AN0 || VSS_VDD);
   setup_adc(ADC_CLOCK_DIV_64);
/*************************************************************************************/
   estado_usb=false; // No se ha conectado al HOST.
   usb_cdc_init(); // llamadas necesarias para iniciar el módulo USB.
   usb_init_cs();    // inicia el USB y sale. Va de la mano con usb_task().
/******************************Empieza bucle infinito*********************************/   
   while(true){
    usb_task(); // configura el USB.
     estado_conexion_usb(estado_usb); // Se fija en el estado de la conexión usb.
     for(i=0;i<=7;i++){//  ciclo de adquicicion de datos analogicos
     config_adcon2(i); // Configuramos el conversor analógico digital.
     delay_ms(10); // Espera 10 mseg a que la convercion acabe.
     switch (i)//guarda cada convercion en una variable diferente.
       {
       case 1:
       valorA = read_adc(); // El resultado de la conversión lo guarda en la variable valorA.
       break;
       case 2:
     valorB = read_adc(); // El resultado de la conversión lo guarda en la variable valorB.
       break;
       case 3:
        valorC = read_adc(); // El resultado de la conversión lo guarda en la variable valorC.
       break;
       case 4:
        valorD = read_adc(); // El resultado de la conversión lo guarda en la variable valorD.
       break;
       case 5:
        valorE = read_adc(); // El resultado de la conversión lo guarda en la variable valorE.
       break;
       case 6:
        valorF = read_adc(); // El resultado de la conversión lo guarda en la variable valorF.
       break;
       case 7:
        valorG = read_adc(); // El resultado de la conversión lo guarda en la variable valorG.
       break;
       case 8:
        valorH = read_adc(); // El resultado de la conversión lo guarda en la variable valorH.
       break;
       default:
       break;
       }
     }
     
     if(usb_cdc_connected()){ // Si está conectado entonces....
   // Espera a detectar una transmisión de la PC (Set_Line_Coding).
       if (usb_enumerated()){ // aquí se enumera el dispositivo por el host y despúes sale.
        // En espera de nuevos caracteres en el buffer de recepción.
          switch (usb_cdc_kbhit())//dependiendo de la peticion del host es la accion que realizara.
       {
       case 'a'://¿lo que llegó fué el caracter a?
            printf(usb_cdc_putc,"%Lx", valorA); // envia el ADRESH:ADRESL al HOST
       break;
       case 'b'://¿lo que llegó fué el caracter b?
            printf(usb_cdc_putc,"%Lx", valorB); // envia el ADRESH:ADRESL al HOST
       break;
       case 'c'://¿lo que llegó fué el caracter c?
            printf(usb_cdc_putc,"%Lx", valorC); // envia el ADRESH:ADRESL al HOST
       break;
       case 'd'://¿lo que llegó fué el caracter d?
            printf(usb_cdc_putc,"%Lx", valorD); // envia el ADRESH:ADRESL al HOST
       break;
       case 'e': //¿lo que llegó fué el caracter e?
            printf(usb_cdc_putc,"%Lx", valorE); // envia el ADRESH:ADRESL al HOST
       break;
       case 'f': //¿lo que llegó fué el caracter f?
            printf(usb_cdc_putc,"%Lx", valorF); // envia el ADRESH:ADRESL al HOST
       break;
       case 'g': //¿lo que llegó fué el caracter g?
            printf(usb_cdc_putc,"%Lx", valorG); // envia el ADRESH:ADRESL al HOST
       break;
       case 'h'://¿lo que llegó fué el caracter h?
       printf(usb_cdc_putc,"%Lx", valorH); // envia el ADRESH:ADRESL al HOST
       break;
       case 'A'://¿lo que llegó fué el caracter A?
       printf(usb_cdc_putc,"%d",PIN_A4);// envia el VALOR DEL PIN_A4 al HOST
       break;
       case 'B'://¿lo que llegó fué el caracter B?
       printf(usb_cdc_putc,"%d",PIN_C0);// envia el VALOR DEL PIN_C0 al HOST
       break;
       case 'C'://¿lo que llegó fué el caracter C?
       printf(usb_cdc_putc,"%d",PIN_C0);// envia el VALOR DEL PIN_C0 al HOST
       break;
       case 'D'://¿lo que llegó fué el caracter D?
       printf(usb_cdc_putc,"%d",PIN_C1);// envia el VALOR DEL PIN_C1 al HOST
       break;
        case 'E'://¿lo que llegó fué el caracter E?
       printf(usb_cdc_putc,"%d",PIN_C2);// envia el VALOR DEL PIN_C2 al HOST
       break;  
              case 'F'://¿lo que llegó fué el caracter F?
       printf(usb_cdc_putc,"%d",PIN_B4);// envia el VALOR DEL PIN_B4 al HOST
       break;
              case 'G'://¿lo que llegó fué el caracter G?
       printf(usb_cdc_putc,"%d",PIN_B7);// envia el VALOR DEL PIN_B7 al HOST
       break;
              case 'H'://¿lo que llegó fué el caracter H?
       printf(usb_cdc_putc,"%d",PIN_C0);// envia el VALOR DEL PIN_C0 al HOST
       break;
       case 'L'://¿lo que llegó fué el caracter L?paso a la izquierda
       output_low(PIN_B5); // bit de sentido de giro, conectado al pin RB6.
       delay_ms(100); // Espera 100 mseg.
       output_low(PIN_B6); // desenergiza bobina, conectado al pin RB6.
       delay_ms(100); // Espera 100 mseg.
       output_high(PIN_B6); // energiza bobina , conectado al pin RB6.
       delay_ms(100); // Espera 100 mseg.
       output_low(PIN_B6); // completa el paso, conectado al pin RB6.
       delay_ms(100); // Espera 100 mseg.
       break;
       case 'R'://¿lo que llegó fué el caracter R?paso a la derecha
       output_high(PIN_B5); // bit de sentido de giro, conectado al pin RB6.
       delay_ms(100); // Espera 100 mseg.
       output_low(PIN_B6); //desenergiza bobina, conectada al pin RB6.
       delay_ms(100); // Espera 100 mseg.
       output_high(PIN_B6); // energiza bobina , conectada al pin RB6.
       delay_ms(100); // Espera 100 mseg.
       output_low(PIN_B6); // completa el paso, conectado al pin RB6.
       delay_ms(100); // Espera 100 mseg.
       break;
   default:
       break;
         }
      }         
   }
}
}

//***********************************************
// Esta función, nos indica mediante 1 diodo LED conectados al 
// puerto RB0. El estado de conexión del puerto usb.
// Conectado: Enciende el LED VERDE.
//Desconectado: de apaga el LED VERDE.
//***********************************************
void estado_conexion_usb(short bandera){
 if(bandera){
 output_high(PIN_B0); // Enciende LED VERDE.
 }else{
 output_low(PIN_B0);  // Apaga LED VERDE.
 }
}
// Esta función configura el registro ADCON2.
void config_adcon2(int num) {
if(num>=5){//necesidad de implementacion por vercion del pic ya que se salta algunos puetos analogos
num=num+3;
}
   #asm
   movlw 0b10111110 ;justificacion_derecha,20Tad,Fosc/64
   iorwf 0xFC0,1    ; direccion de ADCON2
   #endasm
   set_adc_channel(num); // Selecciono el canal de conversión.
}
```


----------



## washi_w_z_r (May 12, 2009)

hola alfangel:

1.- Si defines HSPLL entoces deberas usar osciladores mayores de 4MHZ , pero si usas el de 4MHz define XTPLL
2.-Si usas un oscilador de 4Mhz el PLL que defines debe ser PLL1 , y no PLL5 .
3.- Supongo que conectas dos resistencias de 100k para detectar por harware al declara el con_sense_pin
4.-¿usas solo un canal o multiplexas otros canales ? esto por q veo : setup_adc_ports(AN0 || VSS_VDD) con esta directiva solo estas configurando elcanal "RA0" como entrada analogica pero  lineas abajo veo:
config_adcon2(i); // Configuramos el conversor analógico digital.
// Esta función configura el registro ADCON2.
void config_adcon2(int num) {
if(num>=5){//necesidad de implementacion por vercion del pic ya que se salta algunos puetos analogos
num=num+3;

?        no tiene mucho sentido tus declaraciones

5.- lo anterior te pregunto debido a que haces on bucle for que realizara siete veces configurando siete canales y enviando orden al void config_adcon2 ...
6.- una recomendacion : PRUEBA POR SEPARADO CADA MODULO, primero el modulo ADC si usas un solo canal o multiplexas, luego prueba el modulo USB y finalmente el envio-recpcion de datos del USB
saludos ...


----------



## Moyano Jonathan (May 12, 2009)

alfangel lo que dice washi_w_z_r es verdad es mucho mejor que pruebes el código por separado para que lo entiendas mejor.


----------



## camilo-control (May 16, 2009)

Este foro está muy bueno pero yo no necesito emular el puerto, yo lo que necesito es usar la comunicación USB tipo Isochronous puesto que tengo que tomar datos en tiempo real de un proceso, me ayudarían mucho si me dijeran donde hay  información de este tipo de comunicación; o ustedes creen que sería igual de bueno emular el puerto serial?
De antemano muchas gracias, y estoy a su disposición para lo que necesiten y yo pueda ayudar.


----------



## Meta (May 16, 2009)

Por cierto. ¿Hay emulador para el puerto serie como el USB de proteus?


----------



## Moyano Jonathan (May 16, 2009)

Si si hay es un conector llamado: COMPIN , este componente del isis te permite comunicarte con el puerto COM real de una máquina.


----------



## chipichape (May 16, 2009)

hola. para los que hayan trabajado con el pic18f4550, como se configura el ADC y que quieren decir estos bits:
#define ADC_ADFM_RIGHT   0x80 
#define ADC_ACQT_2TAD    0x38 
Me refiero a porque le ponen 0x80 y 0x38, que sentido tiene esto, la verdad no le veo ninguna utilidad,
y otra cosa, si le ponemos 20TAD en lugar de 2TAD en que afecta? si algo aqui esta el codigo completo:
#include <18F4550.h>

#device adc=10
#define ADC_ADFM_RIGHT      0x80
#define ADC_ACQT_20TAD       0x38
#define AN0 

#include <string.h>
#include <stdlib.h>
#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL3,CPUDIV1,VREGEN
#use delay(clock=48000000)
#USE RS232(BAUD=19200, XMIT=PIN_A4, RCV=PIN_A5, stream=RF)


#include <usb_cdc.h> //Siempre va antes del include usb_desc_cdc.h
#include <usb_desc_cdc.h>
#define emergencia PIN_B0
#define bombillo PIN_B1
#define on output_high
#define off output_low



char c,d;


char cad[5];
int l=0,i;
void main(){
long dato;

 //off(emergencia);
 //off(bombillo);

   usb_cdc_init();
   usb_init(); //inicializamos el USB

   while (!usb_cdc_connected()) {}
   while (true)
   {
   usb_task();
   if(usb_enumerated()){
           if(usb_cdc_kbhit())
              {c=usb_cdc_getc();
               putc(c,RF);}
                       } 



if(c=='n'){
   setup_adc_ports( AN0_ANALOG||VSS_VDD);
   setup_adc(ADC_CLOCK_DIV_64 ||  ADC_ACQT_20TAD || ADC_ADFM_RIGHT );
   set_adc_channel(0);
   delay_ms(1000);
   dato= read_adc();

   itoa(dato,10,cad);// dato pasa a ser una cadena
   l=strlen(cad);// longitud de la cadena
   i=0;
   for(i;i<l;i++){
      usb_task();//Establecer comunicacion
      if(usb_enumerated()) // Estamos correctamente conectados
                {                               

            d=cad_;
            usb_cdc_putc(d);// enviar caracter d
                 }
      }  
   }

usb_task();
   if(usb_enumerated()){
           if(usb_cdc_kbhit())
              {c=usb_cdc_getc();
               putc(c,RF);}
                       } 


setup_ccp2(CCP_PWM);   // Configure CCP1 as a PWM






switch(c){
case 'b':
 off(emergencia);
 on(bombillo);
 setup_timer_2(T2_DIV_BY_4||0x01, 200,1);
 set_pwm2_duty(25);
 break;

case 'm':
 off(emergencia);
 on(bombillo);
 setup_timer_2(T2_DIV_BY_1||0x01, 200,1);
 set_pwm2_duty(75);
 break;

case 'k':
 on(emergencia);
 off(bombillo);
 setup_timer_2(T2_DIV_BY_1||0x01, 255,1);
 set_pwm2_duty(210);
 break;

case 'f':
 off(emergencia);
 off(bombillo);
  setup_timer_2(T2_DIV_BY_1||0x01, 255,1);
 set_pwm2_duty(10);
 break;

}

if(c=='b'||c=='m'||c=='k'){
   setup_adc_ports( AN0_ANALOG||VSS_VDD);
   setup_adc(ADC_CLOCK_DIV_64 ||  ADC_ACQT_20TAD || ADC_ADFM_RIGHT );
   set_adc_channel(0);
   delay_ms(1000);
   dato= read_adc();
   itoa(dato,10,cad);// dato pasa a ser una cadena
   l=strlen(cad);// longitud de la cadena
   i=0;
   for(i;i<l;i++){
      usb_task();//Establecer comunicacion
      if(usb_enumerated()) // Estamso correctamente conectados
                {                               

            d=cad;
            usb_cdc_putc(d);// enviar caracter d
                 }
      }  
      } } }_


----------



## Bemor (May 17, 2009)

Hola: Disculpad que me una al hilo estando tan avanzado y con tanto nivel.
He estrenado hoy un portátil y al empezar a leer este tema e intentar probar el primer ejemplo
me asalta la primera duda, porque no me abre el ejecutable en Vista.
¿Tengo que tener VB instalado ?
La dll de Microchip sirve para Vista Home Basic?

Llevo un día con Vista y ya echo de menos el XP

Saludos[/quote]


----------



## Ardogan (May 17, 2009)

chipichape dijo:
			
		

> hola. para los que hayan trabajado con el pic18f4550, como se configura el ADC y que quieren decir estos bits:
> #define ADC_ADFM_RIGHT   0x80
> #define ADC_ACQT_2TAD    0x38
> Me refiero a porque le ponen 0x80 y 0x38, que sentido tiene esto, la verdad no le veo ninguna utilidad,
> y otra cosa, si le ponemos 20TAD en lugar de 2TAD en que afecta?



Hola chipichape.
No programo en ese compilador de C, pero si te puedo orientar con que es lo que definen esos parámetros.

#define ADC_ADFM_RIGHT   0x80 : esto define como se va a alinear el resultado que arroja el conversor AD en ADRES. Este registro tiene 16 bits, y el resultado del conversor es de 10 bits. Entonces hay dos posibilidades, que el conversor AD escriba los 10 bits más significativos de ADRES (alineación a la izquierda) o que escriba los 10 menos significativos (alineación a la derecha).
La sentencia #define define una constante, es decir, cada vez que en el código aparezca ADC_ADFM_RIGHT el compilador (mejor dicho, el pre-procesador del compilador) lo va a reemplazar por 0x80.
Debe tener ese valor para que la rutina 
setup_adc(ADC_CLOCK_DIV_64 || ADC_ACQT_20TAD || ADC_ADFM_RIGHT ); 
configure al conversor AD para que el resultado se alinee a la derecha.

#define ADC_ACQT_2TAD    0x38 : el tiempo de adquisición ACQT es un tiempo que espera el conversor AD antes de iniciar la conversión. Es decir, si yo hago que comience la conversión ahora mismo, no se va a iniciar ahora mismo sino dentro de un tiempo ACQT.
¿Para que está ésta funcionalidad?: bueno, hay que hablar de como funciona el conversor. Uno primero tiene conectada la entrada analógica a un capacitor interno, el capacitor de muestreo. Cuando ordeno que comience la conversión del AD el PIC abre la conexión del capacitor de muestreo con el circuito externo, y el capacitor de muestreo que antes estaba conectado al circuito externo ahora ya no lo está, solo queda conectado al conversor AD del PIC.
Entonces el capacitor mantiene ese valor de tensión (se descarga pero muy lentamente) mientras el modulo AD realiza la conversión.
Finalizada la conversión el módulo AD se encarga de volver a conectar el capacitor de muestreo al circuito externo.
Ahora, que pasa si yo inicio otra conversión ahí mismo? (es decir, si hubiera fijado ACQT el tiempo de adquisición como 0). Pasa que no le dí tiempo al capacitor de muestreo de cargarse al valor de tensión que quiero medir (del circuito externo). Entonces estaría obteniendo una medición que no es el valor real que está en el circuito externo, sino uno muy cercano al que medí anteriormente.
Por eso ACQT se suele fijar con un valor que de tiempo suficiente al capacitor de volver a cargarse al nivel de tensión presente en el circuito externo.
Los detalles para calcular el valor de ACQT están en la hoja de datos, su valor depende del valor de tensión a medir, de la resistencia de la fuente de señal, y de parámetros internos del PIC.
¿Cuando puedo poner ACQT=0?, cuando estoy seguro que mi programa nunca va a iniciar una conversión sin que le de tiempo a que el capacitor se cargue luego de la anterior conversión (o luego de cambiar de canal analógico, de AN0 a AN3 por ejemplo).

Bueno, ojalá te sea de utilidad, saludos.


----------



## Moyano Jonathan (May 17, 2009)

Muy buena tu explicación ardogan


----------



## Electron-volta (May 19, 2009)

cordial saludo señores: moyano y Meta

he leido detenidamente el foro y de como puedo conectar el microcontrolador 18f2550 al puerto usb y mediante una interfaz grafica puedo yo controlar 8 reles por el puerto B del micro. hasta ahi todo esta bien, yo personalmente no se mucho sobre el tema de comunicacion usb ni el protocolo que se utiliza , hago una pequeña reseña . tengo mi programador de micros e programado el 16f84 el 16f877 es mas por medio del puerto paralelo y v. b. e controlado 8 reles para controlar unos dispositivos a 115v ac. pero a raiz que mi nueva computadora no tiene el puerto paralelo sino puros usb e desidido comprar el 18f2550 y ya tengo el circuito montado en baquelita o fibra de vidio , yo lo conecto al pc pr el puerto usb y me reconoce el micro.  pero ahora quisiera saber si ustedes me pueden ayudar con el programa ya compiladoosea el .hex o si lo tienben en asembler muchisimo mejor
y un ejecutable que este funcionando , la verdad no se mucho de programacion en visual. asi me si me pueden ayudar con el ejecutable seria muchisimo mejor
gracias se despide de ustedes su nuevo amigo del foro


----------



## Meta (May 19, 2009)

Estoy esperando que saque algo de la Interfaz de USB sea en el lenguaje que sea para poder hacerlo yo lo mismo con Visual C#, y más adelante con VC++ y VB .net


----------



## Moyano Jonathan (May 19, 2009)

Vos decis que programe algo en Visual .net ? Por que ejemplos en VB 6.0 hay montones washi_w_z_r publicó un programa que iso utilizando VC# y mpusbapi.dll preguntale yo todavía estoy en fase de aprendizaje y además los estudios me están matando el tiempo con ametralladora.


----------



## Meta (May 19, 2009)

Esperaba que hicieras algo de explicación sobre el USB para hacer una Interfaz y controlar 8 RELÉ por poner un ejemplo. También estoy de aprendizaje...

_(Perdón por confundirte)_

Voy a buscar al que dices si es que lo encuentro y voy a mirar que ha hecho con importar las dll.

No se me da mucho usar dll importadas, pero por hacer pruebas e buscado por ahí y funciona estas cositas.


```
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;

namespace CD_Control
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        [DllImport("winmm.dll", EntryPoint = "mciSendStringA")]
        public static extern void mciSendStringA(string lpstrCommand,
            string lpstrReturnString, long uReturnLength, long hwndCallback);
        //Why did i put this here?
        string rt = "";
        private void button1_Click(object sender, EventArgs e)
        {
            mciSendStringA("set CDAudio door open", rt, 127, 0); //Abre la bandeja del lector.
        }

        private void button2_Click(object sender, EventArgs e)
        {
            mciSendStringA("set CDAudio door closed", rt, 127, 0); //Cierra la bandeja del lector.
        }
    }
}
```


----------



## Moyano Jonathan (May 19, 2009)

Ya voy a ver si el fin de semana empiezo definitivamente a hacer las pruebas. Yo en este momento me voy a poner a trabajar con 2 dll principalmente: mcHID.dll (dll del easyHID) y mpusbapi.dll haciendo las llamadas con VC# ya que me parece un poco más comodo para trabajar. Otra cosa luego de hacer las llamadas a las funciones hay que declararlas para que funcionen (tengo una idea más o menos de como se hace en ese lenguaje) en visual basic es facil porque generalmente te venía un archivo con los módulos de las funciones. Y con respecto al control de 8 relés con USB no es dificil ya voy a ver como lo implemento para VC# y lo posteo.


----------



## danielbb (May 26, 2009)

Hola a todos, gracias por tan interesante y aplicativo tema.
En este momento estoy tratando de remplazar una interfase conversora  de serial a USB (ejemplo Trendnet USB to Serial Converter TU-S9) para una aplicación que maneja protocolo serial y deseo usarla en computadores portátiles.
Hace tiempo arme el PICkit2 clone que usa el HID y me parecio muy bueno sobre todo porque no requiere instalar driver.
La pregunta es: conocen algún ejemplo donde se use el HID para hacer un conversor Serial a USB con las señales de TX, RX y DTR funcionando?.
Por mas que he buscado no he visto nada que funcione con el HID y menos con el DTR!
Se que el HID es lento, pero mi aplicacion solo requiere 9600 baudios.
Estube mirando el FT232 pero preferiria usar un PIC18 como el 2550, ya que dentro de la aplicacion estoy usando otro PIC16 para otras funciones y lo ideal seria integrar todo en un solo micro.

Gracias


----------



## Moyano Jonathan (May 27, 2009)

entonces usa la emulacion CDC, con HID no hay puerto serie. Microchip tiene una clase específica para esto, te recomiendo que leas desde el primer post del tema.


----------



## javker29 (May 29, 2009)

buenos días Moyano Jonathan. estoy empezando a trabajar con el pic 18f4550 y la comunicación usb por medio de visual basic 6, ud puso un ejemplo en la pagina 6 el cual prende o apaga un led segun el pulsador, lo estube trabajando y me funciono perfectamente, pero ahora me gustaria hacer lo contrario, es decir enviar un dato ahora del Pic al PC tambien empleando visual basic.

si me podrias colaborar en decirme como se hace para enviar datos.

gracias


----------



## danielbb (May 30, 2009)

En el ejemplo 1, se hace la emulacion CDC con las señales TX y RX, que son las mas importantes. Sabes si se puede tambien obtener la señal DTR con estas librerias?
No he visto aplicaciones con CDC que la obtengan, es posible? solo necesito adicionalmente a las TX y RX la DTR.
Gracias


----------



## Meta (May 31, 2009)

Aquí dejo algo de información de USB.

http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=1486

Puede ayudar mucho...
A ver si hacemos control de RELÉ de una vez.


----------



## kuropatula (May 31, 2009)

Hola!
Me estoy iniciando en PIC USB. Uso el 18F2550 programado en C18. Lo hice con CDC.
Cuando envío por el hyperterminal un determinado caracter, el ejemplo que hice en Proteus responde, pero cuando envio el caracter al PIC en el hardware este no responde. Puse el condensador de Vusb y no creo haber hecho algo mal. En el proteus me abre el COM7 y en el hardware el COM8. Tengo el PIC operando ya que hice que me prendiera un LED al iniciar.
Se les ocurre, que puede andar mal?


----------



## Meta (May 31, 2009)

Pruébalo con el UB por detrás del PC, no por delante a ver que pasa.


----------



## kuropatula (Jun 1, 2009)

Gracias por tu respuesta Meta, pero no me funcionó. Puse que el VID sea 05F9 y el PID FFFF. Me imagino que no hay nada malo en esto, no? Otra duda: vi algunos programas de alto nivel en la PC para comunicarse con el PIC que utilizan el VID y PID y otros que no.
Por ejemplo, en el hypertermial me imagino que no se usa. Por qué es esto?
De todas formas, lo más importante para mí es poder hacer la comunicación. Si se les ocurre algo para ayudarme estaré muy agradecido.
Saludos


----------



## Moyano Jonathan (Jun 1, 2009)

Respondiendo sus preguntas:


> buenos días Moyano Jonathan. estoy empezando a trabajar con el pic 18f4550 y la comunicación usb por medio de visual basic 6, ud puso un ejemplo en la pagina 6 el cual prende o apaga un led segun el pulsador, lo estube trabajando y me funciono perfectamente, pero ahora me gustaria hacer lo contrario, es decir enviar un dato ahora del Pic al PC tambien empleando visual basic.
> 
> si me podrias colaborar en decirme como se hace para enviar datos.
> 
> gracias



Buscá en todas lás páginas del post hay ejemplos de sobra para lo que vos querés hacer. Hay ejemplos tanto con modo CDC así como también en HID.



> En el ejemplo 1, se hace la emulacion CDC con las señales TX y RX, que son las mas importantes. Sabes si se puede tambien obtener la señal DTR con estas librerias?
> No he visto aplicaciones con CDC que la obtengan, es posible? solo necesito adicionalmente a las TX y RX la DTR.
> Gracias



No hay ningún ejemplo de USB que haya visto que tenga la señal DTR usando emulación CDC pero si usas la EUSART si lo vás a poder implementar.



> Aquí dejo algo de información de USB.
> 
> http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=1486
> 
> ...



Metá la controladora de 8 relés la postee hace ya bastante tiempo usando la clase HID y Visual basic 6.0. En estos momentos estoy viendo como hacer para hacer lo mismo en Visual C# lo cual de a poco lo estoy logrando.



> Hola!
> Me estoy iniciando en PIC USB. Uso el 18F2550 programado en C18. Lo hice con CDC.
> Cuando envío por el hyperterminal un determinado caracter, el ejemplo que hice en Proteus responde, pero cuando envio el caracter al PIC en el hardware este no responde. Puse el condensador de Vusb y no creo haber hecho algo mal. En el proteus me abre el COM7 y en el hardware el COM8. Tengo el PIC operando ya que hice que me prendiera un LED al iniciar.
> Se les ocurre, que puede andar mal?



Proteus no es muy buen simulador a la hora de realizar la comunicación USB lo mejor es que probés tu circuito en un protoboard. Ahora puede ser también un problema de programación pero nunca he usado C18 solo C de CCS.




> Gracias por tu respuesta Meta, pero no me funcionó. Puse que el VID sea 05F9 y el PID FFFF. Me imagino que no hay nada malo en esto, no? Otra duda: vi algunos programas de alto nivel en la PC para comunicarse con el PIC que utilizan el VID y PID y otros que no.
> Por ejemplo, en el hypertermial me imagino que no se usa. Por qué es esto?
> De todas formas, lo más importante para mí es poder hacer la comunicación. Si se les ocurre algo para ayudarme estaré muy agradecido.
> Saludos



Si estás usando CDC no importa el VID PID que le pongas va a funcionar igual. Si usas CDC en el hyperterminal lo único que tenés que configurar es el número del puerto que tenés y la velocidad de comunicación.
Cualquier cosa que no te funcione acá en este post el tema de CDC está más que explicado con muchos ejemplos de comunicación, aunque acordate que todos los programas para el PIC están en C de CCS.


----------



## kuropatula (Jun 1, 2009)

Gracias por tu respuesta Moyano. Compré otro PIC y tampoco funcionó.
Cuando pongo el osciloscopio en D+ o D- y envío un dato por el hyperterminal no varía nada. Siempre veo una señal cuadrada invariante. Saben si puede estar el error acá? Enque no "salgan" datos del PC? Tengo Win XP SP-3
Voy a seguir probando y cuando lo resuelva les aviso.
Saludos


----------



## Moyano Jonathan (Jun 1, 2009)

Postea tu programa completo con código fuente y en una de esas encontramos el error. Igual te recomiendo que utilizes C de CCS para hacer la programación.


----------



## kuropatula (Jun 2, 2009)

Bueno, muchas gracias. Posteo el código. En sí el stack y demás es muy grande. Lo que iimporta es el main.c, hardwareprofile.h y algún otro archivo.
Mi main lo que hace es en ProcessIO() es esperar el 1 ASCII.
Muchas gracias y espero que puedan ayudarme.
No uso el CCS, no es nada en especial. Uso mucho el MikroC y me llevo bien con él. Tomé la decición de hacer USB en C18 para aprender más y luego hacer Ethernet en C18. No es muy justificable pero así lo voy a hacer si es que no sigo tan trancado.
Gracias y saludos


----------



## kuropatula (Jun 2, 2009)

Bueno, muchas gracias. Posteo el código. En sí el stack y demás es muy grande. Lo que iimporta es el main.c, hardwareprofile.h y algún otro archivo.
Mi main lo que hace es en ProcessIO() es esperar el 1 ASCII.
Muchas gracias y espero que puedan ayudarme.
No uso el CCS, no es nada en especial. Uso mucho el MikroC y me llevo bien con él. Tomé la decición de hacer USB en C18 para aprender más y luego hacer Ethernet en C18. No es muy justificable pero así lo voy a hacer si es que no sigo tan trancado.
Gracias y saludos
PD, estoy con problemas para adjuntar. Lo adjunto en el próximo mensaje


----------



## kuropatula (Jun 2, 2009)

.rar del proyecto


----------



## Moyano Jonathan (Jun 2, 2009)

Estuve analizando tu código pero no pude encontrar el error además las librerías de C18 para USB son más complejas que las de CCS y no logro entender las funciones. Por eso aunque te paresca molesto te va a ser menos complejo pasarte a CCS que entender tu error en C18


----------



## kuropatula (Jun 2, 2009)

OK, voy a probar un poco más y sino me cambio a CCS. Realmente muchas gracias!
Saludos


----------



## carlosmarrero (Jun 2, 2009)

Hola Moyano, primeramente quiero felicitarte y agradecerte por este post; he tenido bastante tiempo rompiendome la cabeza con la lectura de datos proporcionados por un micro hacia un PC y no había podido avanzar mucho; con los ejercicios que posteaste (particularmente el N° 5) he logrado por fin comprender lo suficiente como para adelantar bastante en mi proyeco de fin de carrera; sin embargo, hay algo con lo que no he podido. En tu ejercicio N° 5, si quiero medir en la PC el voltaje de entrada del ADC, aplico la siguiente formula; v_adc*5/1024 y el resultado es la medida del voltaje de entrada; ahora bien, siendo una entrada maxima de 5V, no tengo problemas para leerla hasta 2.5V, leyendose en el programa de Vb el valor 255; a partir de este valor, comienza a mostrarme en la pantalla de Vb valores menores; de hecho, he observado que si por ejemplo, el voltaje de entrada en el ADC es de 2.9V, en la pantalla de Vb me mostrará 44 (o algo muy aproximado); pareciera que me mostrara la diferencia entre 255 y el valor que estoy leyendo. Observo que en el ejemplo me dice que toma la parte baja del valor leido, pero no se como tomar el valor completo, o en cualquier caso, tomar (y enviar) aparte el valor alto para luego concatenarlos (o sumarlos) en la aplicación de Vb. Una solución no muy satisfactoria para 5 V, es multiplicar el valor obtenido por 10; esto me permite tener una cifra significativa y un decimal, pero debería trabajar, en realidad, con por lo menos 2 cifras enteras y 2 decimales. ¿tienes alguna idea de como solucionar esto?  De antemano, muchisimas gracias


----------



## Ardogan (Jun 2, 2009)

Kuropatula, yo estoy haciendo armas con la versión 2.3 del framework USB para C18 (aunque ya salió el 2.4    ) y si bien en algun momento probe algunas cosas con versiones anteriores, no me acuerdo mucho.

A ver que pasa con ésto:

En hardwareprofile.h levantá sacá este comentario:


```
/*#if !defined(DEMO_BOARD)
    #if defined(__C30__)
        #if defined(__PIC24FJ256GB110__)
            #define DEMO_BOARD PIC24FJ256GB110_PIM
            #define EXPLORER_16
			#define PIC24FJ256GB110_PIM
            #define CLOCK_FREQ 32000000
        #endif
    #endif

    #if defined(__18CXX)
        #if defined(__18F4550)
            #define DEMO_BOARD PICDEM_FS_USB
            #define PICDEM_FS_USB
            #define GetSystemClock()        48000000
        #elif defined(__18F87J50)
            #define DEMO_BOARD PIC18F87J50_PIM
            #define PIC18F87J50_PIM
            #define GetSystemClock()        48000000
        #elif defined(__18F14K50)
            #define DEMO_BOARD LOW_PIN_COUNT_USB_DEVELOPMENT_KIT
            #define LOW_PIN_COUNT_USB_DEVELOPMENT_KIT
            #define GetSystemClock()        48000000
        #endif
    #endif
#endif*/
```

La parte que interesa es que quede el #define PICDEM_FS_USB porque a partir de eso se configuran pines de entrada/salida más abajo, a partir de #if defined(PICDEM_FS_USB).

También te diría que, por las dudas, saques estos comentarios:

```
#endif
    /*aca comente esto*/
    // External Transceiver Interface
   // #define tris_usb_vpo        TRISBbits.TRISB3    // Output
   // #define tris_usb_vmo        TRISBbits.TRISB2    // Output
   // #define tris_usb_rcv        TRISAbits.TRISA4    // Input
    #define tris_usb_vp         TRISCbits.TRISC5    // Input
    #define tris_usb_vm         TRISCbits.TRISC4    // Input
   // #define tris_usb_oe         TRISCbits.TRISC1    // Output
    
    #define tris_usb_suspnd     TRISAbits.TRISA3    // Output
```

Porque eso no va a importar siempre y cuando en usb_config.h esté la línea #define USB_TRANSCEIVER_OPTION USB_INTERNAL_TRANSCEIVER sin comentar. Es decir, ahí uno ya le está diciendo que se usa en el transceiver usb interno.

Y si con eso no anda, probá comentando la línea (en hardwareprofile.h):

#define PROGRAMMABLE_WITH_USB_MCHPUSB_BOOTLOADER

para que no meta un bootloader en el código del pic. Así nos quedamos tranquilos de que no sea un error de bootloader (improbable, pero....).

Bueno, de las correcciones que marqué la más crítica es la primera, comenzá por ahí.

Saludos


----------



## kuropatula (Jun 3, 2009)

Lo probé pero no me funcionó. Muchas gracias igual Ardogan!


----------



## Moyano Jonathan (Jun 3, 2009)

Kuropatula trata de hacer como te dije programa tu ejemplo en C de CCS que te va a ser mas facil.


----------



## Ardogan (Jun 3, 2009)

Estaba viendo los #includes, veo que el procesador definido en el proyecto es el p18f2550, sin embargo usás el p18f4550.h
A ver si poniendo el p18f2550.h y sacando el p18f4550.h cambia algo...
Ahh!, y el linker script también


----------



## Alber Moremont (Jun 3, 2009)

Hola Moyano Jonathan, ya no habia escrito nada en este foro, pero te informaciónrmo que para el primer ejercicio que hiciste de HID (el de alternar el estado de un led)  pude ya controlarlo con labView sin usar conversion a puerto serie, lo manejo directo como USB de HID.

Ahora, el firmware del pic dice que checa el data[0] y si es igual a 1, el led cambia de estado, eso no es problema,  pero si le mandas un dato distinto de 1, el led sigue alternando. Por ejemplo, en labView le mando un "0" o un "2" o cualquier otra cosa y sigue cambiando el led.

¿Que debo hacer para que cuando el dato sea distinto de 1, ya no haga nada?

te dejo la parte del codigo donde me queda la duda


```
:usb_get_packet(1, data, 8);
                        if(data[0] == 1) { // Si el paquete contiene el dato "1"
                         output_toggle(PIN_B1); // Cambiamos el valor del PIN_B1.
```


----------



## Moyano Jonathan (Jun 3, 2009)

Claro actua solo si el dato es 1 if(data[0] == 1) entonces tenes que cambiar == al dato que queras.


----------



## Alber Moremont (Jun 3, 2009)

Pero entonces si es que le mandas otro dato, no deberia de hacer nada.

Como te digo yo le envio un 2 y me sigue alternando el bit.


----------



## kuropatula (Jun 3, 2009)

Bueno, no se que problema tenía pero empecé todo desde cero y funcionó.
Agradezco a todos por haberme ayudado.
Lo que hice fue tomar la carpeta de Microchip y ejecutar "CDC - Basic Demo - Firmware"
Saludos


----------



## Moyano Jonathan (Jun 3, 2009)

es que esa es la funcion que cumple.


----------



## Alber Moremont (Jun 3, 2009)

si, pero a lo que me refiero es que aunque este la condicion: if(data==1) y yo le mande un 2 o cualquier otro caracter me sigue haciendo lo mismo.


----------



## Moyano Jonathan (Jun 3, 2009)

Hola albert    

Mirá el código: 


```
:usb_get_packet(1, data, 8);
                        if(data[0] == 1) { // Si el paquete contiene el dato "1"
                         output_toggle(PIN_B1); }  // Cambiamos el valor del PIN_B1.
```

Ok en esta parte si le pones 
	
	



```
if(data[0] == 1
```
 o 
	
	



```
if(data[0] == 2)
```
 Va a hacer lo mismo.

Vos tendrías que organizar el código de la siguiente manera para hacer cualquier cosa:


```
usb_get_packet(1, data, 8);
                        if(data[0] == 1)  // Si el paquete contiene el dato "1"
                              
                                  {
                         
                       // Acá ponemos el código que quiera si recibe 1 o cualquier dato.

                                       }
```

Ahi está la solución a lo que vos planteas.


----------



## Alber Moremont (Jun 3, 2009)

ops: Disculpa que insista Moyano jonathan pero creo que no me he explicado muy bien. Entiendo bien que es lo que el codigo hace, es decir si lo defino como:


```
usb_get_packet(1, data, 8); 
                       if(data[0] == 1) // Si el paquete contiene el dato "1" 
                                  {                           
                                      //haz algo
                                  }
```
el programa hará lo que esta entre las llaves cuando recibe un 1  

o si lo defino como:


```
usb_get_packet(1, data, 8); 
                        if(data[0] == 2)  // Si el paquete contiene el dato "2" 
                                  {                           
                                      //haz otra cosa
                                  }
```

el programa hará lo que esta entre las llaves cuando reciba el dato 2.  

Pero a lo que me refiero es, si yo defino la condición como *if(data[0]==1){acción}*  y desde el software de control *le envio un dato diferente de 1*, no entiendo por qué me sigue haciendo  la acción entre llaves, si la condición no se cumple  

y una disculpa nuevamente, pero espero que ahora si me de a enteder


----------



## Moyano Jonathan (Jun 3, 2009)

Haaaaaaaa ahora si entendi , mirá vos que raro lo que te está pasando......

Fijate utilizando la sentencia switch(dato) y le vas poniendo case's segun el dato que valla entrando.


----------



## Alber Moremont (Jun 3, 2009)

Ok, lo checo y te aviso, porque si se me hizo algo extraño eso que pasa, ya que la condicion no se cumple...

Y disculpa la interrupción por este problemilla, pero necesitaba saber si eso era normal...


----------



## Moyano Jonathan (Jun 4, 2009)

No hay drama para eso estamos. Si te sigue sin funcionar decime


----------



## Moyano Jonathan (Jun 4, 2009)

Proximamente manual de usuario del PIC18F2550: USB aplicaciones prácticas programando en VB.net y VC# 2008.

Este manual lo ire desarrollando de a poco conjuntamente con usuarios de este y otros foros y lo pondré aqui para que se pueda consultar todo lo referente al puerto USB de la linea de microcontroladores PIC18Fxx5x con lo que se contará con una guia práctica con ejercicios desarrollados y explicados utilizando las clases más conocidad CDC , HID y Bulck transfer.


----------



## Meta (Jun 4, 2009)

Esperando el manual y felicidades por hacerlo funcionar.


----------



## Moyano Jonathan (Jun 4, 2009)

Ya estoy detectando conexión, ecribiendo datoy y leyendolos desde VB.net

En este momento voy a ver que ejercicicios va a incorporar la guia del manual, luego lo voy a ir posteando de a poco hasta que termine. El manual sospecho que va a llevar su tiempo pero quiero que sea entendible y quede bien.

Los temas principales que se van a tocar son (al principio):

- Principios básicos para programar en VB.net
- Entorno de desarrollo de Visual Basic dentro del entorno IDE de visual studio.
- Crear un formulario donde se van aplicando diferentes controles..

En fin meta al principio sería algo como lo que creaste vos con la misma forma de introducción.

Luego de la parte de programación básica con el PC se va a tomar la teoría de programación del PIC en C para crear nuestras aplicaciones con USB de igual modo que lo hemos hecho en el foro.

Y por último se va a mezclar la programación del PIC con lo de la PC para que vallamos entendiendo como se comunica.

Todo esto es a grandes rasgos ya que van muchas cosas más incluidas que ya se me irán ocurriendo durante el desarrollo del trabajo.

Me he decidido a hacerlo en Power Point y luego lo portare a PDF


----------



## Alber Moremont (Jun 4, 2009)

Seria muy bueno eso, pues en loq ue se pueda ayudar ahi estaremos...


----------



## JoYcEr182 (Jun 5, 2009)

hola amigos, una pregunta, ¿esto funciona tambien con el Pic basic Pro? ¿tienen los codigos para pic basic pro? esta super interesante lo de comunicar el pic con el pc por usb sin tener necesidad de colocar hardware extra .


----------



## Moyano Jonathan (Jun 6, 2009)

Si ya tienes funcionando algo con PICBASICPRO, y queres que te funcione bajo los nuevos sistemas operativos o estás programando en VB.net te sirve perfectamente. Es decir los programas hechos con picbasicpro que son hechos con easyHID son compatibles con mi ejemplo.


----------



## JoYcEr182 (Jun 6, 2009)

Moyano Jonathan, muchas gracias por tu respuesta, cuando tenga los componentes en mis manos hago unas pruebas y estare avisando 

Gracias.


----------



## Moyano Jonathan (Jun 6, 2009)

Ok yo ya tengo mi entrenadora USB y estoy haciendo ejemplos de USB que luego postearé.


----------



## Moyano Jonathan (Jun 6, 2009)

Terminé la entrenadora USB, pero tiene un par de errores que corregir.


----------



## c1ar8l0os (Jun 7, 2009)

Hola muchachos....
Saludos a todos.
Soy el nuevo por aquí...  
He leído durante dos días.. desde el post 1 hasta este.. ufff muy interesante

Que gran comunidad, aportan, dan ideas, usan ideas, una retroalimentación muy buena.
Espero en lo futuro aportar a la comunidad.

En esta ocasión acudo a ustedes con el siguiente problema:

Mi objetivo: 
*Mover un motor de paso, tipo unipolar, a través del puerto USB del computador usando el 18F4550 y un programa en visualB_6.

Como bien para empezar decidí por usar el com virtual que se genera con el 18F4550
Usando el compilador CCS y las respectivas librerias usb_cdc.h y usb_desc_cdc.h

Lo anterior lo realice con éxito, instalando el mchpcdc.inf. Y listo aparece muy bonito en administrador de hardware mi puerto COM virtual.

En la parte de visualB_6 hice un pequeño entorno asi como este:








Este es el código del pic:


```
#include <18F4550.h>


#FUSES HSPLL,MCLR,NOWDT,NOPROTECT,NOLVP,NODEBUG,PLL3,USBDIV,CPUDIV1,VREGEN,NOPBADEN
#use delay(clock=48000000) //Microcontroller Clock Frequency 48MHz

#define USB_CON_SENSE_PIN PIN_C2
#include <usb_cdc.h>  

void main()
{

//Variables
int8 BobinaA, BobinaB, BobinaC, BobinaD;
short Girar_D, Girar_I;

OUTPUT_A(0);  // Inicializacion de los puertos
OUTPUT_B(0);            
OUTPUT_C(0);
OUTPUT_D(0);            
OUTPUT_E(0);

// Secuencia de Giro del Motor.
   BobinaA=0b00000011; 
   BobinaB=0b00000110; 
   BobinaC=0b00001100; 
   BobinaD=0b00001001;

usb_init_cs();  
while(true)
     {
      usb_task();
      if (usb_attached())
          {
          output_low(PIN_C0);  // (Apaga LED Rojo)
          output_high(PIN_C1); // (Enciende LED Verde)
          }    
         else
            {
            output_high(PIN_C0); //(Enciende LED Rojo)
            output_low(PIN_C1);  //(Apaga LED Verde)
            }
      if(usb_cdc_connected())
         {
          if (usb_enumerated())
              { 
               if(usb_cdc_kbhit())
                  {
                   if(usb_cdc_getc()=='d')
                      {
                       printf(usb_cdc_putc,"Dale Derecha");
                       Girar_D=true; 
                       Girar_I=false;
                      }
                   if(usb_cdc_getc()=='i')
                      {
                       printf(usb_cdc_putc,"Dale Izquierda");
                       Girar_I=true; 
                       Girar_D=false;
                      }
                   if(usb_cdc_getc()=='s')
                      {
                       printf(usb_cdc_putc,"No Girar"); 
                       Girar_I=false;
                       Girar_D=false;
                       output_d(0);       //Desenergiza las bobinas
                      }                  
                  }
              }
         }
     if (Girar_D) //Bandera Girar Derecha
         {
          output_d(BobinaA);
          delay_ms(80);
          output_d(BobinaB);
          delay_ms(80);
          output_d(BobinaC);
          delay_ms(80);
          output_d(BobinaD);
          delay_ms(80);       
         }
     if (Girar_I) //Bandera Girar Derecha
         {
          output_d(BobinaD);
          delay_ms(80);
          output_d(BobinaC);
          delay_ms(80);
          output_d(BobinaB);
          delay_ms(80);
          output_d(BobinaA);
          delay_ms(80);       
         }
} //fin while
} //fin!
```

Este es el código en visualB_6:


```
Option Explicit

Private Sub Form_Load()
puerto.AddItem "COM1"
puerto.AddItem "COM2"
puerto.AddItem "COM3"
puerto.AddItem "COM4"
puerto.AddItem "COM5"
puerto.AddItem "COM6"
puerto.ListIndex = 0
    MSComm1.Settings = "9600,N,8,1"
    MSComm1.OutBufferSize = 1
    MSComm1.InBufferSize = 14
    MSComm1.InputMode = comInputModeText
    MSComm1.InputLen = 14
    MSComm1.RThreshold = 8
Timer1.Interval = 1000
Timer1.Enabled = True
End Sub


Private Sub MSComm1_OnComm()
 
Dim InBuff As String
  Select Case MSComm1.CommEvent
         Case comEvReceive
              Debug.Print MSComm1.InBufferSize
              InBuff = MSComm1.Input
              MSComm1.InBufferCount = 0  'Vacia el buffer de recepción
              Debug.Print MSComm1.InBufferSize
              Debug.Print InBuff
              Recibir.Text = ""
              Recibir.Text = Left$(InBuff, 14)
  End Select
End Sub

Private Sub Timer1_Timer()
DoEvents 'Para que windows y el programa pueda realizar otras cosas
     If MSComm1.PortOpen = True Then
        estado.BackColor = &HFF00& 'Verde
        Debug.Print "Conectado"
        Label3.Caption = "USB ON"
        MSComm1.PortOpen = False 'Se cierra el puerto y se abre
        MSComm1.PortOpen = True  'si permite abrirlo es porque el puerto existe
                                 'y esta conectado, sino, genera un error
        Exit Sub
     Else
     estado.BackColor = &HFF& 'rojo
     Debug.Print "Desconectado"
     Label3.Caption = "USB OFF"
     End If
End Sub

Private Sub conectar_Click()
    If MSComm1.PortOpen = False Then
        'determina el puerto que hemos seleccionado.
        If puerto.ListIndex = 0 Then
            MSComm1.CommPort = 1
            End If
        If puerto.ListIndex = 1 Then
            MSComm1.CommPort = 2
            End If
        If puerto.ListIndex = 2 Then
            MSComm1.CommPort = 3
            End If
        If puerto.ListIndex = 3 Then
            MSComm1.CommPort = 4
            End If
        If puerto.ListIndex = 4 Then
            MSComm1.CommPort = 5
            End If
        If puerto.ListIndex = 5 Then
            MSComm1.CommPort = 6
            End If
    End If
    MSComm1.PortOpen = True
End Sub

Private Sub Detener_Click()
    Timer1.Enabled = False
    If MSComm1.PortOpen = True Then
       MSComm1.Output = "s"
       MSComm1.OutBufferCount = 0 'Vacia el buffer de transmisión
       Debug.Print "MSComm1.OutBufferCount"; MSComm1.OutBufferCount
    End If
    Timer1.Enabled = True
End Sub

Private Sub Girar1_Click()
    Timer1.Enabled = False
    If MSComm1.PortOpen = True Then
       MSComm1.Output = "d"
       MSComm1.OutBufferCount = 0 'Vacia el buffer de transmisión
       Debug.Print "MSComm1.OutBufferCount"; MSComm1.OutBufferCount
    End If
    Timer1.Enabled = True
End Sub

Private Sub Girar2_Click()
    Timer1.Enabled = False
    If MSComm1.PortOpen = True Then
       MSComm1.Output = "i"
       MSComm1.OutBufferCount = 0 'Vacia el buffer de transmisión
       Debug.Print "MSComm1.OutBufferCount"; MSComm1.OutBufferCount
    End If
    Timer1.Enabled = True
End Sub

Private Sub Form_Unload(Cancel As Integer)
If MSComm1.PortOpen = True Then
   MSComm1.PortOpen = False
End If
End Sub
```

Esto es el diagnostico:

-El programa en visual permite elegir el puerto COM a usar y conectarse a el. Esto funciona sin problemas.

-El pic se identifica con el host intercambia descriptores y todo lo demas, pide al driver etc.. Esto funciona sin problemas.

Pero cuando en visual presionas un botón, el pic debería responder a ese botón, devolver un mensaje a visual y ejecutar la rutina correspondiente.

Lo anterior se realiza, pero no como debería, me explico:

--Supón que presionas el botón "Girar Derecha" en visual, este debe mandarle al pic la letra "d", el pic debe identificar que letra le llego, si es la letra "d" manda un mensaje a visual que dice "Dale Derecha", ademas, activa la bandera para girar a la derecha, luego el pic debe salir de ese IF, ver que bandera tiene activada, y comenzar la rutina de energizar las bobinas para mover el motor.

Lo anterior no se realiza hasta que presionas el botón en visual dos o tres veces
Si presionas el botón una vez, el pic queda en stand-by
Si presionas el botón una segunda vez, el pic sigue en stand-by
Si presionas el botón una tercera vez, el pic mueve el motor...

Cuando depuro el programa en proteus, dándole pausa a la simulación e ir al código, para ver que esta haciendo en ese supuesto "stand-by" me encuentro que el pic esta en la siguiente instrucción dentro de *usb_cdc.h*:


```
...
...
////////////////// END USB CONTROL HANDLING //////////////////////////////////

////////////////// BEGIN USB<->RS232 CDC LIBRARY /////////////////////////////

char usb_cdc_getc(void) {
   char c;

   while (!usb_cdc_kbhit()) {}

   c=usb_cdc_get_buffer_status_buffer[usb_cdc_get_buffer_status.index++];
   if (usb_cdc_get_buffer_status.index >= usb_cdc_get_buffer_status.len) {
      usb_cdc_get_buffer_status.got=FALSE;
      usb_flush_out(USB_CDC_DATA_OUT_ENDPOINT, USB_DTS_TOGGLE);
   }

   return(c);
}
...
...
```

Esta *pegado* en esta línea *while (!usb_cdc_kbhit()) {}*    

Que la traducción seria algo así: "Mientras NO se hayan recibido uno o mas datos quédate aquí"

La ayuda del CCS dice que: usb_cdc_kbhit() - Returns TRUE if there is one or more character received and waiting in the receive buffer.

Pero se supone que estoy enviando 1 dato (un carácter)
Por qué el pic se queda en esta línea?
Por qué al presionar el botón mas de dos veces el pic hace lo que debe?
Cómo corrijo que solo al presionar una vez el botón el pic haga lo que debe?

Alguna idea, sugerencia, comentario...?

Adjunto c1a9r8l0os.rar

Contiene: 
Codigo en C para CCS
Codigo en VisualB_6
Arhivo en Proteus para simular
Archivo .cof para correr en proteus
Drivers mchpcdc.inf

Como todavía no he podido solventar este problema, tengo unos días leyendo sobre HID y sobre el modo BULK usando mpusbapi.dll, ambos me gusta, me inclino mas por el HID solo, sin tener que instalar nada, lo difícil viene en la parte del software, pero con unos ejemplos que encontré, plus los ejemplos que publicó el amigo moyano, he estado entendiendo cada vez mas...
Sin embargo, me gustaría mucho resolver este problema, me tiene la cabeza dando vueltas.


PDTA== Comentario off-topic, como hago para que en el post no se vea la imagen 1.jpg que esta adjuntado al post


----------



## Moyano Jonathan (Jun 7, 2009)

Dejame unos días que vea tu código , pero al parecer es un problema que recide en el PIC más que nada.

Este problema yo lo tuve , pero se me solucionó cuando empecé con HID la verdad nunca lo solucioné pero dejame que vea como puedo ayudarte.

Mientras es mejor que consultes con meta sobre ese programa que has hecho vos ya que el tiene más experiencia con el uso del puerto serie.

PD: No creo que ese bucle te haga esperar el tiempo como para que tengas que apretar 2 veces..


----------



## Moyano Jonathan (Jun 7, 2009)

Hola a todos   

Acá les dejo unas fotos de mi nuevo entrenador:

tiene: 

- RS232
- USB
- 8 entradas
- 8 saidas
- Buzzer y LED indicador
- Memoria EEPROM.
- 3 potenciómetros
- 1 relé (correjir posición en la placa)


----------



## Meta (Jun 7, 2009)

Muy bueno Moyano.

Al final se hizo realidad.

Menudo trabajo de meses te has montado.

Felicidades.

Desde que sepa manjear el USB que no tengo ni idea, haré un entrenador para mi.

Suerte con el proyecto y el manual.


----------



## c1ar8l0os (Jun 7, 2009)

Gracias Moyano por responder.  



> Este problema yo lo tuve , ... la verdad nunca lo solucioné pero déjame que vea como puedo ayudarte.



  Que alivio saber que otra persona también tuvo este problema, en verdad pensé que era yo, que hacia algo mal, que compilaba mal, etc.... ya mi cerebro no daba mas pensando que podría ser.

He probado varias cosas:
-Si quito la linea *while (!usb_cdc_kbhit()) {}*  el programa responde al presionar una sola vez el botón, pero cuando presionas otro botón no responde a nada, se queda haciendo lo que el primer botón le dijo que hiciera.

-Si cambio la instrucción y le quito la negación (!)... *while (usb_cdc_kbhit()) {}* hace lo mismo.

Voy a decirle a meta que vea este post, a ver que puede sugerir.

Muchas Gracias moyano por tomarte la molestia de leer el código.



> ...se me solucionó cuando empecé con HID...



 Por ese camino voy yo, leyendo HID etc.. pero la verdad no quiero huirle al problema, quiero solucionar esto, y también usar HID sabiendo que con CDC también funcionó.


Y felicidades moyano por tu entrenador USB....


----------



## Moyano Jonathan (Jun 7, 2009)

Muchas gracias por su comentario sobre la placa. De a pocó comenzaré a hacer el manual sobre usb y espero que se aclaren los problemas que vallan surgiendo.
La totalidad del manual estará hecha en VB.net que luego con ayuda de ustedes migraré a VC#. VC++ no lo voy a integrar a mi manual ya que me es demasiado engorroso.


----------



## Moyano Jonathan (Jun 7, 2009)

Estoy empezando a leer FAT32 y SD card para ver que se puede hacer en el futuro con USB......pero será más adelante.


PD: El manual lo desarrollaré bajo Visual Studio proffesional edition ya que no tengo el VB.net Express aparte.


----------



## Meta (Jun 7, 2009)

No te preocupes por el manual. Hazlo sin prisas pero sin pausas a VB .net que me entre todos lo pasamos a VC# y si se puede VC++ también.


----------



## Moyano Jonathan (Jun 7, 2009)

Para VC# habría que pasar el módulo de comunicaciones que es el encargado de leer la .dll y comunicarnos con el dispositivo.

Estoy en proceso de crear el manual pero me falta ayuda para que quede bonito en power point...
Osea manejo muy poco el power point.


----------



## Meta (Jun 7, 2009)

No te procupes, en poco tiempo lo cogerás fácil. Uso el 2007. Si quieres lo hace rápido en Word (de prueba), después yo mismo lo paso a PowerPoint (para probarlo) para que lo veas.

Empesé así como usted mismo, al final aprendí con la esperiencia de aprender como se maneja. No es para preocuparse, si quieres inténtalo que así se consigue aprender, a usar elPowerPoint, luego yo me necargaré de los efectos.


----------



## Moyano Jonathan (Jun 7, 2009)

Si estoy tratando de agarrar la mano.

Te dejo más o menos algo que hecho hasta ahora y que me convenció por el lado de la estética


----------



## Meta (Jun 7, 2009)

Muy buena presentación. Poco a poco se consigue.

Para crear más diapositivas en blanco, pulsa "Control + M".

Pulsa sobre esa diapositiva con el botón derecho del ratón, en el menú emergente pulsa _diseño de diapositiva_.

Tendrás modos de presentar las diapositivas predefinidas para que se te hagan más fácil.


----------



## Moyano Jonathan (Jun 8, 2009)

Hola a todos 

Para los que querían el manual acá les dejo algo de lo que estoy haciendo:

Está hecho en word ya que la complejidad del tema no daba para hacerlo en power point.

Tengo algo de 18 páginas que es lo que pude hacer hasta ahora pero me falta muchisimo por desarrollar.

El manual final tendrá aproximadamente 300 o un poco más de páginas.

Las ideas o consejos sobre cosas que quieren que le agregue al manual de USB vallan diciendomelas en el foro.

Espero hacer el manual lo más pronto posible aunque todo depende de como esté de tiempo.


----------



## Moyano Jonathan (Jun 8, 2009)

Otra cosa el manual incluirá una breve reseña de como se utiliza el MPLAB en conjunto con el compilador de CCS.


----------



## Mindfield (Jun 8, 2009)

hola amigos ! me interesa mucho esto que estan haciendo ! , yo solo conozco un lenguaje ! Delphi ! , si les interesa para ver si lo podemos portar a este lenguaje entonces me sumo ! , solo un pequeño punto es el inconveniente mio ! soy programador junior ! , espero me respondan !


----------



## Meta (Jun 8, 2009)

Enarabuena Moyano Jonathan:

Menudo trabajo y tiempo te has currado el manual. Va tomando forma, veo que eres el pionero en hacer estas cosas y con estiloincluido.

Sigue así campeón.


----------



## Moyano Jonathan (Jun 8, 2009)

ya voy por las 30 y pico de paginas. Mindfield ya en un futuro se hará en delphi


----------



## Meta (Jun 9, 2009)

*Moyano Jonathan:*
¿Dónde sacas tanta velocidad?

*Mindfield:*
Antes me decidí en su día el Delphi, con el tiempo me gustó más el Visual C#. Por cierto, ¿cuál versión de Delphi te gustaría empezar?


----------



## DavidGamba (Jun 9, 2009)

Hola a todos, hace un tiempo empecé a trabajar con la lectura de tarjetas SD. Mi primera experiencia fue a través de un Vinculum (un chip que hace de host para diferentes dispositivos) conectado a una computadora. El proyecto fue un exito y a raiz de eso me pidieron que lo hiciera igual pero leyendo desde un pic. 

Gracias a este foro he podido tomar algunas ideas y de hecho ya he empezado con la transmisión Bulk al PC desde el pic sin embargo tengo error en algunos de los bytes que me llegan a la PC, hasta ahora transmito dos paquetes de 32 bytes pero los últimos 6 bytes del segundo paquete llegan mal. Me he basado en los avances de Hobby Pic y Muchotrasto para hacer esto. espero postearles algo para que avancen ustedes también y me gustaría saber que tipo de avances han realizado en específico con la transmisión BULK con la PC. 

Además tengo el código en V C# 2008 Express del manejo del DLL de microchip por si quieren que lo postee también (tomado de las 2 fuentes mencionadas anteriormente). 

Con respecto a la lectura SD tengo que aprender a manejar lecturas SPI usando el FAT32 para leer los datos.


----------



## Mindfield (Jun 9, 2009)

Ok amigos ! de todas formas yo lo voy a implementar en Delphi partiendo de lo que acá salio y salga en el futuro ! , yo hace una semana termine mi comunicacion rs-232 para comunicar un pic 16f84a ! (solo enviar datos al pic) , pero fue un esfuerzo de semana y media muy duro ! , y con un amigo voy a encarar el USB , gracias por lo que esta haciendo Moyano Jonathan


----------



## Mindfield (Jun 9, 2009)

Meta como estas espero que bien yo hace 2 o 3 años empece con delphi 6 ahora uso el Delphi 7 pero tambien tengo Rad studio ! , lo que pasa con Rad studio es que (sin animo a ofender) esta como una erramienta .NET y yo no me puedo acostumbrar a eso ya que el software te hace casi todo por si mismo y a mi me gusta programar yo y no que el programa me elija lo que el quiere ! 

Saludos AMIGOS !.


----------



## Meta (Jun 9, 2009)

Podrías poner los códigos de Delphi lo del enviar datos al puerto serie?

Yo lo hice enviar y recibir datos desde el  PIC-16F84 y hice un manual sobre ello.

http://www.abcdatos.com/tutoriales/tutorial/v12.html
http://www.abcdatos.com/tutoriales/tutorial/z9521.html

Saludo.


----------



## Ardogan (Jun 9, 2009)

Moyano Jonathan, felicitaciones por los resultados obtenidos y gracias por compartir esa información con nosotros. 
Realmente una máquina, demostraste mucho empuje, cabeza y persistencia. 
Y fué muy enriquecedor ver el ida y vuelta que tuviste principalmente con Meta, gracias Meta, parecen el dúo dinámico (pero sin Robin, jaja, dos Batman).

Yo lo pondría en Destacados (señores moderadores, considérenlo por favor) ya que no es fácil encontrar información en castellano sobre este tema, y tienen mucho valor los ejemplos que han publicado; y también se ve como fueron de menor a mayor.

El tutorial ya sería el moñito sobre el regalo que le han hecho al foro.

Por mi parte muchas gracias. Yo estoy usando USB pero con delphi y mplab C18. Me falta cerrar unos cuantos temas todavía (varias cosas no funcionan como espero). Ni bien tenga algo que funcione derechito lo saco a pasear por el foro.

Saludos


----------



## Moyano Jonathan (Jun 9, 2009)

> Moyano Jonathan:
> ¿Dónde sacas tanta velocidad?



Se podría decir que he desarrollado buena velocidad con el teclado de la máquina ajjaja y siempre un cafe bien cargado para combatir el frio ajjaj



> Hola a todos, hace un tiempo empecé a trabajar con la lectura de tarjetas SD. Mi primera experiencia fue a través de un Vinculum (un chip que hace de host para diferentes dispositivos) conectado a una computadora. El proyecto fue un exito y a raiz de eso me pidieron que lo hiciera igual pero leyendo desde un pic.
> 
> Gracias a este foro he podido tomar algunas ideas y de hecho ya he empezado con la transmisión Bulk al PC desde el pic sin embargo tengo error en algunos de los bytes que me llegan a la PC, hasta ahora transmito dos paquetes de 32 bytes pero los últimos 6 bytes del segundo paquete llegan mal. Me he basado en los avances de Hobby Pic y Muchotrasto para hacer esto. espero postearles algo para que avancen ustedes también y me gustaría saber que tipo de avances han realizado en específico con la transmisión BULK con la PC.
> 
> ...



Todo lo que tengas con respecto a FAT32 con pic sería muy útil. Con el tema de transmisión Bulk tendríamos que ver como es el código fuente para ver donde se presenta el error , en caso de ser un código comercial podrías poner la parte donde envías los paquetes para ver que error estás cometiendo.



> Ok amigos ! de todas formas yo lo voy a implementar en Delphi partiendo de lo que acá salio y salga en el futuro ! , yo hace una semana termine mi comunicacion rs-232 para comunicar un pic 16f84a ! (solo enviar datos al pic) , pero fue un esfuerzo de semana y media muy duro ! , y con un amigo voy a encarar el USB , gracias por lo que esta haciendo Moyano Jonathan



De nada , mi interes con el USB recayó porque una vez compré una serie de PIC18F2550 con los que me armé un programador USB , pero los otros los tenía sin usar asi que empecé a buscar información sobre esos micros y comencé a hacer experimentos. Espero que lo que hayas encontrado aquí te haya servido.




> MensajePublicado: 09 Jun 2009, 8:48 am    Asunto:
> Moyano Jonathan, felicitaciones por los resultados obtenidos y gracias por compartir esa información con nosotros.
> Realmente una máquina, demostraste mucho empuje, cabeza y persistencia.
> Y fué muy enriquecedor ver el ida y vuelta que tuviste principalmente con Meta, gracias Meta, parecen el dúo dinámico (pero sin Robin, jaja, dos Batman).
> ...



Mucha gracias ardogan, la verdad el tema del desarrollo con USB fue muy duro en sus comienzos hay momentos en los que me volvía loco tratando de que funcionara algo hasta que al final andaba.
Meta es un gran programador sin sus apuntes sobre .net y VC# todavía seguiría con VB6.0 además siempre me ha ayudado en cuanta duda sobre programación he tenido.

Ya el tutorial sobre USB va muy bien encaminado lo que si va lento debido principalmente a mis estudios técnicos y mis comienzos en los estudios para la carrera de ingeniería.

Falta mucho todavía para cerrar el tema de USB , todavía da para mucho más ya que faltan las clases MSD y USB - OTG para PIC24F y PIC32MX...............eso si hay que buscar mucha mas información pero todo se puede con paciencia.


----------



## rash (Jun 9, 2009)

¡Qué gran trabajo están haciendo señores!

Muchas gracias por compartirlo y enhorabuena.

Saludos.


----------



## Meta (Jun 9, 2009)

Aquí hay un libro que debo poseer en cueanto lo vea en alguna biblioteca.

https://www.forosdeelectronica.com/posts/200618/

Saludo.


----------



## Moyano Jonathan (Jun 9, 2009)

contactate con la gente de elektor españa y fijate si te lo pueden conseguir


----------



## Meta (Jun 9, 2009)

Me imagino que podrán en Inglés, pero yo el Inglés...   

Dejar pasar el tiempo si alguien lo traduce, pero antes debe tener éxito.

Bueno, en cuanto el manual, está mejor de lo que creía. Sigue así.


----------



## onea (Jun 9, 2009)

Soy nuevo en el foro pero me gustaría recibir información acerca de la comunicación usb entre pic y la pc, quien pueda ayudarme se lo agradecería.


----------



## Moyano Jonathan (Jun 9, 2009)

ya está creciendo el manual le he puesto una entrada al tema de configuarción básica del MPLAB y como es la estructura de la programación en C.

onea lee desde la página 1 vas a ver toda la información que necesitas


----------



## Meta (Jun 9, 2009)

onea dijo:
			
		

> Soy nuevo en el foro pero me gustaría recibir información acerca de la comunicación usb entre pic y la pc, quien pueda ayudarme se lo agradecería.



Aquí hay algo de información.

DESCARGA

Saludo.


----------



## Zerodix (Jun 9, 2009)

Madre post  de verdad que es increible ya quiero graduarme. y salir de la tesis y la pasantia para ponerme en este foro a subir cosillas de Hecho les Pido pasen por mi proyecto y dejen algunas recomendaciones voy avanzado pero no lo eh podido subir por tiempo. y bueno estoy algo atorado en el marcado de tonos DTMF y los filtros necesarios. saludos.
Ah verdad Link Aqui https://www.forosdeelectronica.com/about33359.html


----------



## Mindfield (Jun 9, 2009)

Meta con mucho gusto voy a poner todo lo que tengo para la comunicacion del puerto y el pic ! porque no he encontrado mucha información sobre delphi pero lo que encontre fue de un señor Domingo Seoane que me resolvio la vida ! , dame un poquito de tiempo que estoy luchando con windows live messenger ! jeje pero te prometo que lo cuelgo apenas pueda ! de donde sos meta ? me refiero a ciudad ? , me interesaria compartir o intercambiar codigos de programacion ! , si te interesa te envio mi dire de correo tambien !.

Saludos !

PD : no soy muy bueno programando jajaja solo soy un novato con ganas de hacerlo ! y de manejar puertos y dispositivos con pic , no conozco mucho el asm tampoco ! pero es una materia que la voy a sacar !o a morir en el intento !

Saludos 2 !


----------



## Meta (Jun 9, 2009)

Buenas.

También soy novato con ganas de aprender...


----------



## Moyano Jonathan (Jun 11, 2009)

Hola a todos   

Bueno ya he avanzado bastante en el desarrollo de mi manual, por eso quería que le hecharan un vistazo a ver que les parece. Acepto comentarios, dudas, aportes, etc.

PD: Tuve que empezar a subir el manual a un servidor ya que el tamaño era prohibitivo para enlazarlo a un mensaje del foro:



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


----------



## Chico3001 (Jun 11, 2009)

excelente trabajo..... muy ilustrativo...


----------



## Meta (Jun 11, 2009)

Buen trabajo, te está qudando de maravilla con tantos gráficos. muy ilustrativo y fácil de entender.


----------



## Moyano Jonathan (Jun 11, 2009)

De a poco se va logrando pero aún falta mucho gracias por los comentarios


----------



## Meta (Jun 11, 2009)

Lo se, poco a poco se va logrando y encima muy bien hecho detalladamente con imágenes.


----------



## DavidGamba (Jun 12, 2009)

Me parece genial su trabajo, me gusta mucho este foro, veo que en serio no hay intención de no compartir la información entre ustedes.

Les voy a postear el avance que tengo de mi programa con lo que es la transmisión bulk que aún no manejo bien. debido a que tengo errores de unos cuantos bytes cada cierta cantidad de transmisiones exitosas. 
Estoy implementando un acknowlegement entre el PC y el PIC para verificar los datos con una suma de todo el paquete y que envio en los últimos 2 bytes de cada transmisión. El PC verifica la suma y si todo esta bien guarda el paquete y si no lo pide de nuevo. Esta es la solución más pronta que se me ocurrio!

Estoy muy ocupado pero espero tenerles un avance el lunes!


----------



## Moyano Jonathan (Jun 12, 2009)

No hay apuros , cuando tengas tiempo lo posteas mientras tanto yo ya voy por la página 58 de mi manual del puerto USB.


----------



## DavidGamba (Jun 12, 2009)

Que cool se ve ese manual, me parece genial! Lo haces para algún proyecto específico de tu empresa o universidad?


----------



## Moyano Jonathan (Jun 12, 2009)

No lo hago para organizar conocimientos y además para ayudar a que todos puedan realizar sus proyectos. Es como un manual de consulta


----------



## Alber Moremont (Jun 12, 2009)

Estupendo trabajo Moyano, se ve que le estas poniendo empeño...


----------



## Moyano Jonathan (Jun 12, 2009)

Si es un esfuerzo pero lo vale. Lo más laborioso es la traducción de definiciones y comentarios de cosas en inglés. Yo algo entiendo pero es básico, aunque me estoy ayudando con el traductor de google.

Otra cosa es que hay que desarrollar punto por punto, para que se entienda en la totalidad.

Y eso que todavía no empiezo ni con el primer ejemplo de USB.................


----------



## Alber Moremont (Jun 12, 2009)

Hola otra vez.

Tengo problemas con la transmision del PIC hacia la PC, no se a que se deba...
Para recibir datos desde la PC no hay problema y todo funciona bien. 

Lo que quiero enviar a la PC es lo que recibo...lo que hago es esto:

```
if (usb_kbhit(1))                            // Si hay un paquete de datos en el buffer lo tomamos y guardamos en la variable recibido
                     {
                        usb_get_packet(1,recibido, 8);
                        
                        switch(recibido[0])
                        {
                         case '0':
                         alternar(LED_VERDE);
                         break;
                         case '1':
                         alternar(LED_ROJO);
                         break;
                         case '2':
                         alternar(LED_ROJO);
                         alternar(LED_VERDE);
                         break;
                         default:
                         apagar(LED_ROJO);
                         apagar(LED_VERDE);
                         break;
                        }
                     
                        enviado[0]=recibido[0];
                        usb_put_packet(1,enviado,8,USB_DTS_TOGGLE);
```

segun yo esta bien, pero no se porque no muestra nada la PC...


----------



## DavidGamba (Jun 12, 2009)

estas copiando solo la posición cero [0] de recibido. -> enviado[0]=recibido[0]; 
Cuando envias eliges enviar 8 bytes-> usb_put_packet(1,enviado,***8***,USB_DTS_TOGGLE);
trata de resolver el problema inicializando enviado en cero o copiando todo recibido en enviado-> enviado=recibido;

Adem'as recuerda que tienes que hacer definiciones previas:

#define USB_HID_DEVICE     FALSE             //disable 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

*****estas definiciones deben estar hechas, si tienes un tama'no de transferencia o de recepcion menor al n'umero de paquetes que envias no te funciona usando usb_put_packet sin iterar


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


----------



## Alber Moremont (Jun 12, 2009)

OK, lo de las definiciones y todo eso ya está, solo que no lo puse porque es mucho rollo.

Pero probaré copiando todo lo que tiene "recibido" en "enviado" y veré que pasa...

Gracias...


----------



## Ardogan (Jun 15, 2009)

Hola gente, quería consultarles sobre alimentación desde el puerto USB.

Estuve buscando información y en ningún lado ví que enchufaron algo directamente algo al +5V y al GND del puerto USB.
Es decir, siempre había un esclavo USB con capacidad de manejar el protocolo USB que le indicaba al host USB cuanta corriente consume el circuito del esclavo. Después claro, de ahí se va a un regulador y se alimenta el circuito.

Leyendo un poco vi que los distintos consumos pueden ir de 0 a 500 mA máximo para todo el puerto. Y que el puerto maneja cargas en "unidades" de 100 mA. Es decir, el host le puede reservar un consumo de 100, 200, 300, 400 o 500 mA a un esclavo. Por defecto se asigna 1 unidad de carga USB = 100 mA. Entonces al enchufar un dispositivo se asignan por default 100mA, y luego el esclavo en la etapa de enumeración puede indicarle al host cuanta corriente consume, y en base a eso el host reasigna la cuota.

La pregunta es: ¿se puede usar energía del puerto USB sin usar dispositivos que manejen el protocolo USB?, ¿sin poner un dispositivo que implemente un esclavo?.
Como dije antes, no ví circuitos donde se usara eso directamente, pero tampoco ví ningún lugar donde diga "NO se puede alimentar en forma directa".

Gracias de antemano.


----------



## Moyano Jonathan (Jun 15, 2009)

Si si se puede , igual haciendo averiguaciones la cantidad de corriente está un poco más limitada que 500mA, algo así como 300mA y un poco más aunque en algunos mother's eso se agrande hasta los 500mA. Igual es cuestion de probar...


----------



## DavidGamba (Jun 16, 2009)

Hola, quería saber si alguien esta trabajando en estos momentos con Bulk trasfers...

Les había comentado que uno de cada cuatro paquetes me llegaba con unos bytes de error... pensando en eso me di cuenta que así fuera solo uno de cada 10 paquetes no me sirve transmitir con ese nivel de error así que implementé un código en el pic que hace una suma de todos los bytes a enviar y pone el resultado en los últimos 2 bytes del paquete a enviar. Así mismo en el PC hago la misma suma con el paquete recibido y la comparo con los dos ultimos bytes, si ambos son iguales tengo un dato bueno y le indico al Pic que puede continuar, si esta malo le mando un pedido para que envie de nuevo, eso puede pasar hasta cuatro o cinco veces (en mi sistema) antes de tener un dato correcto. Sin embargo y gracias a Dios era lo que necesitaba para asegurarme una transmisión exitosa!

Codigo o ayuda solo es de pedirlo!

Con la transmisión bajo control es hora de empezar a leer la tarjeta SD.

Bendiciones!


----------



## Ardogan (Jun 16, 2009)

Moyano Jonathan dijo:
			
		

> Si si se puede , igual haciendo averiguaciones la cantidad de corriente está un poco más limitada que 500mA, algo así como 300mA y un poco más aunque en algunos mother's eso se agrande hasta los 500mA. Igual es cuestion de probar...



Gracias por tu respuesta. Yo precisaba 200 mA.
 El tema es que no quiero probar hasta estar seguro, una vez metí el tester para medir si había tensión en el puerto y chau puerto USB de la PC (levantaba temperatura, despues desenchufé directamente la CPU porque no se cerraba nunca el Windows, nunca más volvió a funcionar). No estoy en condiciones de sacrificar otro puerto USB por experimentar, ya que es el de una notebook y ahí sí puede ser grave la cosa.

Saludos


----------



## Moyano Jonathan (Jun 16, 2009)

Mirá yo una  vez hice lo mismo que vos pero no metí directamente el teste en el puerto , sino que conecté un cable y del otro lado saqué los 2 cables de alimentación rojo y negro del USB y medí la señal de alimentación y me dió algo de 4.75v , luego le pones un capacitor de 100uF para filtrado y tenés los 5.1v necesarios para trabajar.

Es muy raro que se te haya jodido el puerto en una de esas causaste un corto por descuido.


----------



## DavidGamba (Jun 17, 2009)

Alguno ha trabajado con transmisión inhalambrica de un pic al usb? Necesito buscar un enlace para hacer eso! si alguien tiene alguna idea por favor haganmelo saber


----------



## Moyano Jonathan (Jun 17, 2009)

Wireless USB no es compatible con los PIC


----------



## ferfila20 (Jun 17, 2009)

hola que tal
Tambien funcionan los programas en windowss vista, bueno los drivers, esque quiero hacer la conexión usb con un pic 18f4550. creo que nadamas cambiando el numero del pic del progama funciona no?'  (#include <18F4550.h>)
pero al momento de que cambio el numero del pic y lo quiero compilar me sale un error



creo que el error es en la libreria, el programa que quiero hacer es el del control de 8 reles. 

espero y me ayuden

saludos


----------



## Moyano Jonathan (Jun 17, 2009)

El control de 8 reles yo lo puse en post anteriores.


----------



## ferfila20 (Jun 18, 2009)

si pero el que hiciste es para el pic 18f2550 y yo lo quiero poner para el 18f4550.


----------



## Moyano Jonathan (Jun 18, 2009)

Es lo mismo tenés que cambiar el encabezado en la librería del micro y volver a compilar el programa.


----------



## ferfila20 (Jun 18, 2009)

hola moyano 
eso es lo que trato hacer, cambio la libreria del pic y cuando lo intento compilar en CCS C me sale un error.
el error esta en la siguiente imagen. la verdad no se que sea.



y no se como corregirlo 

espero y me ayuden

saludos


----------



## ferfila20 (Jun 18, 2009)

el error es en la libreria pic18_usb.h y me dice esto "expression must evaluate to a constant"  

espero y me ayuden 
saludos


----------



## Moyano Jonathan (Jun 18, 2009)

Me parece que puede ser debido a un error del compilador, en todo caso postea tu programa así lo compilo y veo cuál es el problema.


----------



## ferfila20 (Jun 19, 2009)

hola que tal. 
el programa viene siendo el mismo que publicaste en el control de 8 reles. lo unico que cambia es el #include<18f4550.h>



```
#include <18F4550.h> // Definición de registros internos.
#fuses HSPLL,MCLR,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN,NOPBADEN
// Fuses utilizados:
/*
HSPLL: utilizamos un cristal HS de alta velocidad, en conjunto con el PLL para generar los 48Mhz.
MCLR: Utilizamos reset por hardware.
NOWDT: No utilizamos el perro guardían.
NOPROTECT: Desactivamos la protección de código.
NOLVP: Desactivamos la programación a bajo voltaje.
NODEBUG: No entramos al modo debug.
USBDIV: signfica que el clock del usb se tomará del PLL/2 = 96Mhz/2 = 48Mhz.
PLL5: significa que el PLL prescaler dividirá en 5 la frecuencia del cristal. para HS = 20Mhz/5 = 4Mhz.
CPUDIV1: El PLL postscaler decide la división en 2 de la frecuencia de salida del PLL de 96MHZ, si queremos 48MHZ, lo dejamos como está.
VREGEN: habilita el regulador de 3.3 volts que usa el módulo USB.
NOPBADEN: No utilizaremos el módulo de entradas análógicas del puerto B.
*/
#use delay(clock=48000000) // Frecuencia máxima de trabajo 48 Mhz.
#include "usb_cdc.h" // Descripción de funciones del USB.
#include "usb_desc_cdc.h" // Descriptores del dispositivo USB.

// Funciones que indican el estado de la  conexión usb.
void usb_conectado(void) {
output_high(PIN_A0);
output_low(PIN_A1);
}
void usb_desconectado(void) {
output_high(PIN_A1);
output_low(PIN_A0);
}
void usb_enumerado(void) {
output_high(PIN_A2);
}

// Programa principal:

void main() {
set_tris_a(0x00); // Configura al puerto A y al puerto B como salida.
set_tris_b(0x00);

// Configuraciones varias.
setup_adc_ports(NO_ANALOGS|VSS_VDD);
   setup_adc(ADC_OFF);
   setup_spi(SPI_SS_DISABLED);
   setup_wdt(WDT_OFF);
   setup_timer_0(RTCC_INTERNAL);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_timer_3(T3_DISABLED|T3_DIV_BY_1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);

// Iniciamos el USB.
usb_cdc_init(); // Funciones necesarias para iniciar el módulo USB.
usb_init(); // Funciones necesarias para iniciar el módulo USB.
while(!usb_cdc_connected()) { // Mientras el USB no esté conectado.
usb_desconectado();
}
usb_conectado();
do{
usb_task();
      if (usb_enumerated()){ // Si el puerto ya fue enumerado por el host :
      usb_enumerado(); // Enciende led de enumeración_OK.
      if(usb_cdc_kbhit()){ // en espera de nuevo(s) caracter(es) en el buffer.
        if(usb_cdc_getc()=='1'){ // ¿lo que llegó fué el caracter 1?
              output_toggle(PIN_B0); // Conmuta el estado del relé 1.
                   }
        if(usb_cdc_getc()=='2'){ // ¿lo que llegó fué el caracter 2?
              output_toggle(PIN_B1); // Conmuta el estado del relé 2.
                   }
        if(usb_cdc_getc()=='3'){ // ¿lo que llegó fué el caracter 3?
              output_toggle(PIN_B2); // Conmuta el estado del relé 3.
                   }
        if(usb_cdc_getc()=='4'){ // ¿lo que llegó fué el caracter 4?
              output_toggle(PIN_B3); // Conmuta el estado del relé 4.
                   }
        if(usb_cdc_getc()=='5'){ // ¿lo que llegó fué el caracter 5?
              output_toggle(PIN_B4); // Conmuta el estado del relé 5.
                   }
        if(usb_cdc_getc()=='6'){ // ¿lo que llegó fué el caracter 6?
              output_toggle(PIN_B5); // Conmuta el estado del relé 6.
                   }
        if(usb_cdc_getc()=='7'){ // ¿lo que llegó fué el caracter 7?
              output_toggle(PIN_B6); // Conmuta el estado del relé 7.
                   }
        if(usb_cdc_getc()=='8'){ // ¿lo que llegó fué el caracter 8?
              output_toggle(PIN_B7); // Conmuta el estado del relé 8.
                   }
           }
      }
   }while (TRUE); // bucle eterno
}
```

que crees que sea el error que me aparece? 
el programa lo quiero para controlar un brazo robotico con 4 motores y sus respectivos puentes H.

saludos


----------



## Moyano Jonathan (Jun 20, 2009)

Entonces definitivamente es problema del compilador. Acá está tu programa compilado con la versión 4.023 del compilador de CCS.


PD: Esta versión del programa a mi me presento un par de errores, yo más adelante postee una versión que utilizaba el protocolo HID que funciona sin problemas.


----------



## Moyano Jonathan (Jun 20, 2009)

Para todos pronto voy a postear la proxima actualizacion del manual, que ya cuenta con casi 100 paginas


----------



## EinSoldiatGott (Jun 20, 2009)

Saludos a todos.

Hice el ejercicio del emulador de RS-232, pero me surge una duda de como funciona a bajo nivel, pues en el USB, el periférico no puede enviar a menos que el HOST haga una petición.

En el serial, si lo hace, entonces, acaso el USB esta en un bucle donde infinitamente envía peticiones al periférico, para emular al RS-232 full duplex? Es que me parece que eso consume algo de recursos :-s.

Por cierto, cuál es el baudate máximo que podemos seleeccionar para el Com creado?

Un saludo y gracias


----------



## Moyano Jonathan (Jun 21, 2009)

Si la transferencia de datos se hace por ping pong donde continuamente se piden datos tanto desde el host como por parte del dispositivo.

La velocidad máxima con el COM creado son 115Kbs , pero no estoy seguro que la comunicación sea muy estable a esa velocidad, habría que hacer la prueba.


----------



## metal_serch (Jun 26, 2009)

Hola Moyano, felicidades por el gran trabajo que haz venido realizando con esto del usb, tu guia promete mucho, no puedo esperal a verla terminada.

En fin, hace unos dias empece a realizar los ejercicios que posteas en el foro, desafortunadamente me he quedado estancado en el ejercicio 1, todo parecia ir muy bien, al conectar el cable usb, la computadora reconocia el dispositivo y todo, pero al indicarle la carpeta donde instalar el driver mchpcdc.inf, windows no lo reconocia y no se instalaba  . He seguido tus instrucciones al pie de la letra, los valores de los capacitores son correctos y estoy utilizando un cristal de 20 mhz. No se que pueda estar mal, te llego a pasar eso? hay un paso extra que deba seguir? Gracias por tu atensión.     

El programa del micro programa esta compilado con la versión 4.023 del compilador de CCS y uso Windows XP.


----------



## metal_serch (Jun 26, 2009)

Hola de nuevo, resulta que olvide sustituir las librerias usb_cdc.h y usb_desc_cdc.h. Funciona perfectamente! Gracias


----------



## Moyano Jonathan (Jun 27, 2009)

metal_serch como estás me alegro que te hayan funcionado los ejemplos y estés interesado en lo del puerto USB. Mi libro va a estar terminado dentro de 4 meses aproximadamente o menos depende de como ande de tiempo ya voy llegando a las 100 páginas me puse un poco lento debido a que estoy traduciendo las librerías de control al español y se hace dificil a veces.

PD: Todo aquel que sepa manejar el USB en C18 que ponga ejemplos para poder aprender ese lenguaje tambien.


----------



## Alber Moremont (Jul 1, 2009)

Podrian empezar por bajar el MCHPFSUSB framework, vieni con bastantes ejemplos sobre CDC, HID, MSD, OTG, etc...

Incluye ayuda..

Excelente para empezar, solo que se necesita diseñar alguna tarjeta, o basarse en la que proporciona microchip (PICDEM FS USB, su hoja de especificaciones la encuentran en la pagina de microchip) para correr los ejemplos fisicamente...

Yo estoy empezando con esto pero esta muy bueno, aunque el STACK esta algo largo...


----------



## Moyano Jonathan (Jul 2, 2009)

Si a mi se me hace complicado con el C18 que ya lo tengo full con las librerías del 2009. Además la estructura en si de C18 no es la misma que la de CCS y además CCS viene con más ejemplos y más drivers para el control de dispositivos.

PD: Ya tengo el MCHPFSUSB framework, están muy buenos los ejemplos. El que más me interesa saber su funcionamiento es el modo MSDC para los PIC18.


----------



## Bemor (Jul 5, 2009)

Hola:
Quiero empezar a poner en práctica lo que voy aprendiendo en este foro y voy consiguiendo cosas,
como el 18F2550 , el compilador CCS, etc, pero al intentar instalar el Visual Basic 2008 express siempre
se para la instalación y me deja colgado. ¿Alguno ha tenido este tipo de problemas? ¿Qué puedo hacer?

Moyano, el libro te está quedando claro, bien expuesto, de cine vamos, igual que los manuales de Meta.

Gracias


----------



## Bemor (Jul 5, 2009)

De nuevo con mis problemas, he intentado instalar el C# y también se para la instalación.
¿Puede ser el Panda?


----------



## Meta (Jul 5, 2009)

Por si las moscas, hay una explciación sobre la instalación aquí:

http://www.abcdatos.com/tutoriales/tutorial/z9521.html

Saludo.

PD: _Si crees que es el panda, desinstalalo, luego instala el Visual C# y después el panda otra vez._


----------



## Moyano Jonathan (Jul 5, 2009)

Perdón que no he podido postear mas avances sobre mi manual pero he estado muy ocupado con mis estudios en breve postearé todo lo que tenga al respecto.


----------



## Meta (Jul 5, 2009)

Pensaba que estabas investigando algo muy  engorroso y que tardaba mucho tiempo.


----------



## Bemor (Jul 5, 2009)

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


----------



## Meta (Jul 5, 2009)

cuando me pasan estas cosas. Formateo y  reinstalo Windows, después una agradable instalación de Visual C#.


----------



## Moyano Jonathan (Jul 5, 2009)

Lo que más tiempo me está llevando es el protocolo FAT32 y FAT16 además del estudio del stack  TCP/IP.

USB va a estar terminado mas o menos dentro de 3 meses.

Un saludo !


----------



## Meta (Jul 7, 2009)

Para Moyano lo tiene fácil hacerte lo que pides, el tiempo no es su aliado.


----------



## Moyano Jonathan (Jul 10, 2009)

Ya compilé una prueba de FAT16 funcional , me tengo que conseguir una microSD, un lectograbador de microSD y empezar a hacer las pruebas para el protocolo MSD en CCS.


----------



## Meta (Jul 10, 2009)

Que envídia chunga siento.

Sigue así campeón.

EDITO:
Encontré información que puede ser útil aunque es de java, funciona muy bien.
http://divideandconquer.com.ar/dyq/2009/01/jpicusb-comunicacion-pic-usb-usando-java/

Saludo.


----------



## Moyano Jonathan (Jul 14, 2009)

Ya había visto esa librería para JAVA. En un futuro también la agregaré al manual.


----------



## matquin (Jul 20, 2009)

¡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:
	
	



```
#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.


----------



## Moyano Jonathan (Jul 20, 2009)

En si para USB no tenés que cambiar nunguna interrupción, todo lo hace la librería del driver de USB. Otra cosa fijate que hayas conectado todo incluso en pin vusb - sense.


----------



## matquin (Jul 21, 2009)

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


----------



## sabedoyaa (Jul 21, 2009)

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!


----------



## jsus21 (Jul 22, 2009)

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


----------



## Patico21 (Jul 22, 2009)

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


----------



## Moyano Jonathan (Jul 22, 2009)

matquin: 
Hola como estás   

Mirá te dejo un programa guía que uso yo y no me ha dado mayores problemas.

```
// 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:


```
///////////////////////////////////////////////////////////////////////////
////                         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.


----------



## Patico21 (Jul 23, 2009)

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


----------



## Moyano Jonathan (Jul 23, 2009)

Hay una demo pero no sirve en la mayoría de los casos. La licencia del compilador para la gama PIC10F, PIC12F, PIC16 y PIC18 sale 100 dolares.


----------



## Moyano Jonathan (Jul 23, 2009)

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 !


----------



## Meta (Jul 23, 2009)

Moyano, eres el mejor.  Menos mal que te lo pusieron en destacados.


----------



## Moyano Jonathan (Jul 23, 2009)

Muchas gracias meta. Sigo con el libro pero estoy atascado aprendiendo un par de cosas nuevas que me tienen muy ocupado como FAT32 y ETHERNET.


----------



## Meta (Jul 23, 2009)

Vaya, vas como un campeón, a por todas. Yo estoy trabado con mi proyecto en la parte de que no se leer con el datagridview los log de la base de datos. Desde que me funcione esta parte, ya puedo empezar acabar lo demás que si se manejar.

En tu proyecto estás haciendo el USB, junto con el FAT y red. Lo veo muy duro, aún así, ánimo...


----------



## Moyano Jonathan (Jul 23, 2009)

Lo de red está durisimo....... lo de FAT está en proceso muy "recien nacido de busqueda de información" lo de USB va muy bien. Ahora tambien tengo proyectos como la controladora de 3 motores PAP i2c mediante USB y un amplificador de 400W  reales que va encaminado en la hoja de diseño del PCB.

Unos de mis proyectos tambien es el del control de 8 cargas y lectura de 4 señales a través de internet.


----------



## Meta (Jul 24, 2009)

Sigue así campeón. El manual nuevo que hiciste está de perla.

Por si acaso dejo información sobre 18F2550 y USB.

http://0dfreeman.blogspot.com/2009/05/placa-prueba-del-pic-18f2550.html


----------



## matquin (Jul 24, 2009)

Moyano Jonathan 

Gracias por el codigo, sigo intentando hacerlo funcionar pero evidentemente mi problema es otro, cuando lo descubra lo sabran por las dudas sirva a alguien. ¡¡Muy bueno el manual !


----------



## Moyano Jonathan (Jul 24, 2009)

Bueno me alegro de que les haya gustado ! Matquin tu problema me tiene bastante intrigado.
Si no es mucho pedir podrías describirme exactamente cuales son tus problemas a la hora de comunicarte


----------



## matquin (Jul 24, 2009)

Moyano Jonathan :
El problema es precisamente ese, no se cual es el problema.  

Para que tengas una idea, compile el codigo que me ofreciste con pcwhd (ver 4.088) y compilo perfectamente. Luego simule y hice el debug con el ISIS de Proteus (7.5 SP3, ademas, ya que no confio demaciado en el proteus lo implemento en el pic). Haciendo el debug me doy cuenta que no sale del bucle de codigo suiguiente en <usb.c>

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

Osea, nunca se produce la comunicacion para la enumeracion(cuando lo implemento en el pic y lo conecto  me aparece algo como - el dispositivo no ha sido reconocido o tuvo un mal funcionamiento- en windows XP sp2) .
Ademas el ejemple que propone proteus en el isis me anda sin ningun problema.
Creo haber provado todo con todas sus variantes, con y sin definicion de pin de senseo, alimentando el pic con la tension del bus usb y con fuente externa , con distinta configuraciones de oscilador y distintos osciladores,... siempre guiado por hoja de datos del pic ademas de tus consejos en otros post y los de mucha gente mas en otros foros

En relidad no se que mas contarte, creo que es el compilador pero no  estoy seguro y no consigo una version = o > a 3.227 para probar mi teoria.

un saludo, cuando lo solucione lo comento


----------



## Moyano Jonathan (Jul 25, 2009)

Podrías poner tu código completo......lo compilo yo con mi versión 4.023 y vemos que pasa.


----------



## matquin (Jul 25, 2009)

Moyano Jonathan : 

Que lo pruebes me ayudaria bastante desde ya gracias  y aqui esta el codigo


```
#include <18F2550.h>

#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN
#use delay(clock=48000000)                   //Cuando utilizo el Wizard  #use delay(clock=20000000)no se por que

#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

#define USB_CON_SENSE_PIN PIN_A1             // Probe definiendolo o no, con la consecuente 
                                             //modificacion del circuito de implementacion

#include <pic18_usb.h>                       //Microchip PIC18Fxx5x Hardware layer for CCS's PIC USB driver

// Tambien utilice otros enumeradores
#include "usb_desc_scope.h"                  //Configuración del USB por Enumerador Palitroquez

#include <usb.c>                             //handles usb setup tokens and get descriptor reports



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

//Lo Unico que pretendo es que windows me reconozca el dispositivo
void main()
{
   set_tris_b(0x00);                //Todo salidas
   set_tris_a(0xff);                //Todo entradas    
   
   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_OFF(LEDR);
   LED_ON(LEDV);                    //encendemos led verde
}
```


```
Alguno de los descriptores que probe
///////////////////////////////////////////////////////////////////////////
////                         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
         28, //length of string index
         USB_DESC_STRING_TYPE, //descriptor type 0x03 (STRING)
         'P',0,
         'i',0,
         'c',0,
         'U',0,
         'S',0,
         'B',0,
         '1',0,
         '8',0,
         'F',0,
         '2',0,
         '5',0,
         '5',0,
         '0',0,

};


#ENDIF
```


----------



## Moyano Jonathan (Jul 25, 2009)

Lo implementé , reconoce al PIC , me instala el driver pero me larga error código 10............Voy a ver más a fondo que pasa pero si a otros le ha funcionado a nosotros también nos va a funcionar.


----------



## matquin (Jul 25, 2009)

Pero te permite instalar el driver cosa que yo no pude lograr .... Como es eso voy a necesitar mayor detalles


----------



## matquin (Jul 25, 2009)

Moyano Jonathan : 
  Por fin lo logre! Muchisimas gracias por tu ayuda

Al final hera un maldi.. capacitor que estaba molestando (Increible no! )solo lo reemplace. El error de codigo 10  en mi codigo creo que aparece por que al salir del bucle --> usb_wait_for_enumeration(); no hace nada. Solo copie el ultimo fragmento de tu codigo y listo ningun problema.

Gracias de nuevo.


----------



## Moyano Jonathan (Jul 26, 2009)

Yo también probé el código y tuve el mismo problema al salir de usb_wait_for_enumeration();.......puse un bucle while(true){} después de esa función y funcionó sin ningún problema.

A todo esto menos mal que pudiste solucionar tu problema.


----------



## Moyano Jonathan (Jul 26, 2009)

Pronto pondré mi proyecto de la controladora de motores PAP por USB  que me falta hacer la aplicación de control !


----------



## microstar10 (Jul 28, 2009)

Hola, ya me he leido las 25 paginas, y mas o menos me he enterado de todo, pero siempre me quedan dudas. Yo estoy haciendo un programa de lectura de u teclado matricial de 7x10 mediante visual basic, tengo conocimiento de C, pero no de visual C. 
Me ha quedado claro que para la comunicacion PC <-> USB se puede usar clases CDC (Comunication device class) y  bulk transfer (mpusbapi.dll), la primera es la emulacion del puerto serie, pero también e visto mediant HID que no necesita drivers. Para mi proyecto solo necesito 2 cosas: que el PC active o apague un LED y el USB mande 2 datos seguidos al PC, ademas el pic soo usa entradas y salidas digitales, por lo que no es muy complicado. Me gustaria hacerlo por HID, ya que no hay drivers, pero he visto que la frecuencia de cristal del PIC es de 4 MHz, se podria usar un cristal de 20 MHz, lo digo porque la lectura del teclado tiene que ser muy rapida porque la duración del pulso al presionar la tecla es muy corta. LA pregunta en si es ¿por que se usa ese crsital?


----------



## matquin (Jul 28, 2009)

microstar10:

Hola , no se muy bien lo que necesitas pero cualquier cristal puede ser configurado para usb  y la velocidad del cpu pudiendo ser distintas
aca lo explica y si no, a la hoja de datos
http://picmania.garcia-cuervo.net/conceptos.php#USB4Mhz


----------



## electro_02006 (Jul 28, 2009)

hola a todos les escribo porque tengo un pequeño problema con el Vusb de un pic 18f4550, lo que pasa es que no logro obtener el voltaje indicado de entre 3.0 a 3.6 v solo obtengo hasta 2v y eso solo poniendo mi dedo en dicho pin, he puesto capacitores de 220 nf ceramico 47uf a 25 v y 470pf ceramico y no logro obtener el voltaje ojala y me puedan ayudar de antemano gracias


----------



## Meta (Jul 28, 2009)

Me llegó un comentario en forma de vídeo este vídeo con 16F4550 y USB. Creo que quiere competir conmigo como diciendo que hizo lo mejor, así fue realmente. jejejeej

YouTube - Comunicacion USB PIC-PC con PIC18F4550, en visual C++

Saludo.


----------



## matquin (Jul 28, 2009)

electro 02006:

asegurate de haber habilitado la regulacion de usb interna
Con el compilador de CCS seria
#fuses VREGEN // habita el regulador de voltaje USB
saludos


----------



## electro_02006 (Jul 28, 2009)

gracias matquin pero si esta habilitado: #fuses XTPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL1,CPUDIV1,VREGEN,NOPBADEN alguna otra sugerencia?


----------



## matquin (Jul 28, 2009)

electro 02006: 

Estas alimentando al pic con el puerto? de ser así intenta con una fuente externa de 5V aunque tendria que funcionar sin esta, pero no esta demas probar no?


----------



## electro_02006 (Jul 28, 2009)

si esta alimentado por el propio puerto usb de la computadora y aunque he leido que en portatiles puede haber siertos problemas con la alimentacion en mi caso es de escritorio y lo he probado tambien cambiando de computadora y en sus 6 diferentes puertos que por lo regular traen las tarjetas madre, adjunto los diagramas en los que me he basado algunos no corresponde a pic 18f4550 pero tiene el Vusb, 
otra cosa ademas: alguien me podria decir los valores de voltaje que deben obtener en los pines correspondientes al osc1 y osc2?
ademas en el datasheet del pic menciona los pull ups y que al parecer tienen que ver con Vusb tambien pueden ser internos y externos y corresponden para que el host identifique el dispositivo como full o low mi pregunta es ¿como hablito internamente dichos pull ups si mi programa es en C csc version 4?
por su atensión gracias


----------



## electro_02006 (Jul 28, 2009)

otra configuracion


----------



## electro_02006 (Jul 28, 2009)

otro mas


----------



## electro_02006 (Jul 28, 2009)

este no se de donde lo obtube pero buno


----------



## electro_02006 (Jul 28, 2009)

siento mucho estar publicando asi pero solo admite 100k


----------



## electro_02006 (Jul 28, 2009)

faltan otros dos pero creo que estos le daran una idea


----------



## Meta (Jul 28, 2009)

¿Ya les funciona los USB con PIC?


----------



## matquin (Jul 28, 2009)

electro_02006:

Yo estoy ocupando el ultimo de los esquemas pero utilizo 470n y no 47u con un 18f2550 y me funciona bien sin embargo tuve un problema cuando lo arme y puse un capacitor de 100n entre vdd y vss pero quemado(o roto) y no funcionaba nada asi es cuestion de buscar el problema.

Disculpame que no pueda ayudarte mas Suerte!


----------



## Moyano Jonathan (Jul 28, 2009)

Meta con respecto al video de comentaste , el programa de control que presento el tipo del video es muy sencillo de hacer y con lo que vos sabes de programación lo podés hacer muy facilmente.


----------



## Meta (Jul 28, 2009)

La programación del PIC18F con C# y puerto USB no tengo idea.


----------



## headhead (Jul 28, 2009)

Meta dijo:
			
		

> La programación del PIC18F con C# y puerto USB no tengo idea.



hola que tal, esta es la primera vez que escribo aqui, estuve trabajando en un proyecto que no tiene gran aplicacion pero funciono para aprender como comunicar el pc con un pic por puerto usb usando una aplicacion en c#.

esta en www.colpic.co.cc

mas adelante dare detalles sobre este proyecto.

Gracias...

a otra cosa la web esta en construccion y espero ayuda de todos ustedes para lograr una web que nos sirva a todos.


----------



## headhead (Jul 28, 2009)

lo olvidaba.. en los archivos para descargar en www.colpic.co.cc hay uno listo para probar y otro con el codigo fuente.

esta el archivo para hacer la simulacion en el proteus. lo pueden ver en el video.

si llegan a tener algun problema con la simulacion o con el codigo fuente o con cualquier cosa que no entiendan, me pueden preguntar aqui o en el foro de mi web respondere sus dudas lo antes posible.

no hay mucha información en la red sobre usb y c# (o pues eso creo   ) por eso quiero compartirlo con ustedes.


----------



## Moyano Jonathan (Jul 28, 2009)

Meta: Yo te decía en VB.net

headhead: Exelente aporte


----------



## Meta (Jul 29, 2009)

Ok.

Lo bueno es entender el driver del PIC18F que tiene microchip. ¿Difícil?


----------



## Moyano Jonathan (Jul 29, 2009)

No entiendo a que te referis con el driver ?

Si decis el driver para C de CCS , la verdad es complejo pero con tiempo se entiende.

Si en cambio decis el driver para la PC ........no se usa ya que tomamos el protocolo HID para la comunicación y es mucho más facil programar la aplicación.


----------



## Meta (Jul 29, 2009)

El del C CCS. .

Al final lo dominas, está muy bien. Voy acabar rápido el proyecto que si me contrata en un trabajo no podré hacer nada ya que son de 12 horas de lunes a sábado.


----------



## Moyano Jonathan (Jul 29, 2009)

Si mirá el driver de microchip para CCS es complejo para entender pero en si la verdad no hace falta entenderlo de arriba a abajo. Lo que necesitas es saber como enviar y recibir datos para hacer la aplicación en VB.net.

En fi cuando tenga más tiempo lo explico. Acá en argentina son las 5 y 20 de la mañana asi que voy a dormitar...


----------



## Meta (Jul 29, 2009)

A descansar la menta. Ya la descansé y me toca programar.


----------



## xiscoor (Jul 29, 2009)

Buenas, estoy haciendo el proyecto de final de carrera, estoy usando el PIC32MX starter board y tengo que enviar un array de datos a través del USB, he visto que enviais datos con el PIC18F2550 pero de la familia Pic32MX no encuentro casi nada, a ver si alguien me puede echar una mano. Muchas gracias.


----------



## Meta (Jul 29, 2009)

Ños, por fin veo a alguien por estos foros usando un PIC32. _(Hay más gente pero ya no se les ve)._

Pregunta en estos foros de la propia firma en http://www.microchip.com/forums/tt.aspx?forumid=203

Quizás encuentres algo en wwwmypic32.com

Si encuentra solución aquí muy buena, si lo encuentra en otro foro, lo haces saber.

PD: _¿Es complejo entender PIC32 y programarlo?_


----------



## xiscoor (Jul 29, 2009)

La verdad es que es complicado por la gran cantidad de SFR's que hay, por eso estoy buscando si alguien tiene funciones que me permitan olvidarme de ellos, ya que no es una parte muy importante dentro de mi proyecto pero con la que si me falta no puedo seguir. La gran ventaja es la velocidad y su memoria, y el gran problema que me he encontrado es que no hay mucha cosa hecha con este pic.


----------



## Meta (Jul 29, 2009)

Me imaginaba es que difícil. Otros dicen que no es tan difícil como parece.

Es normal que no encuentres mucha información sobre ello, salió en Noviembre del 2007 y no es nada con ese tiempo. He visto la *revista Resistor* con tutriales sobre ello.

Puedes encontrar información de lo que buscas quizás en este libro.







Fuente:
http://www.elektor.es/products/book...d-net-programming-for-electronic.951869.lynkx

Suerte...


----------



## Moyano Jonathan (Jul 29, 2009)

Bajate el Framework de USB para PIC32 que tiene microchip en su página , te viene con ejemplos de configuración en modo esclavo y en modo host.

PD: Está en inglés y programado en C18.


----------



## aligator1417 (Ago 2, 2009)

hola a todos, quiero comentar que gracias a este lugar de web (los post ,"TEMA") me anime a la ventura del control  usb, con la tipica frase "soy nuevo en esto" nuca habia programado un pic, solo en la escuela hicimos el famoso sistema minimo z80. ya en mis ratos libres trabaja por el puerto paralelo..
lo que hice fue comprarme los pic 18f4550 y 18f2550 y hacer el art2003 y el jmd segui los grandes proyectos de aqui sobre todo los de Moyano Jonathan. ahora puedo decirles que al principio se me complico pero con pasencia y sobretodo sus post fui comprendiendo.
Por lo queda decirles gracia esta muy chingo su tema. 
pero hay una pequeña pregunta, en los ejemplos de los reles o 8 leds ha aguien  no le prende el que seria 6 led? ya probe con los ejemplos hid y con el driver com1, tambien probe los dos pic 4550 y 2550 y con los dos me hace lo mismo.
un saludo a todos.


----------



## jokep (Ago 4, 2009)

hola a todos

me encontré este manual que han hacho en especial Moyano Jonathan y se me ha hecho muy interesante y de gran ayuda; muchas gracias.
pero traté de simularlo en proteus y no he podido echarlo a andar. cuando pongo los ejemplos que vienen construidos en proteus, sí corren; pero los que yo hago no, y pongo el código que puso jonathan y conecto todo tal como lo puso y no funciona el usb virtual. ya instalé los drivers que vienen en inicio>programas>Proteus>virtual usb>Install USB drivers y aún así no jalan.

si me pudieran decir si falta una configuración o algo así, porfas.

les adjunto el diseño que hice tratando de seguir el ejemplo de Jonathan "Control de 8 relés por USB" en la página 2. (el pic traía configurado para correr el programa .hex que el mismo Jonathan nos adjuntaba en la carpeta "FIRMWARE DEL PIC18F2550" del archivo)
adjunto también el archivo que Jonathan nos hizo el favor de subir para que lo siguieramos
gracias


----------



## matquin (Ago 4, 2009)

hola jokep

yo tampogo pude hacer andar la simulacion en proteus, pero al implementarlo en el pic funcionan de lujo si logras resolver el problema , publicalo ,me gustaria saber como.


----------



## Moyano Jonathan (Ago 5, 2009)

Todos los ejemplos si funcionan pero hay que implementarlos en la protoboard por que proteus hay veces que no funciona bien con las simulaciones de USB.


----------



## Rijiru (Ago 6, 2009)

Hola, estuve viendo este foro, por que me interesa hacer un dispositivo que se comunique creando un COM virtual, descargue el ejercicio 1 y no me funciono en mi PC, tengo Windows vista, ¿que podria hacer?
Le agradeceria su respuesta.

Saludos


----------



## Moyano Jonathan (Ago 6, 2009)

Los primeros ejemplos solo funcionan bajo Win XP pero en cuanto pueda voy a migrar todos mis ejemplos a VB.net 2008 y van a ser compatibles con Vista y Win 7 asi tambien como para XP.


----------



## tonymorillo (Ago 6, 2009)

buenas mi nombre es engelberth morillo y de verdad aun no he podido comunicara el pic 18f4550 al pc pues me da error al conectarlo y estoy conectando por el usb posterior del equipo y trato de colocarle los drivers xp que aprece en tus ejemplos y nada. estoy actualmente usando el de los 8 relet con un cristal de 4 20 y 32768 mhz y aun nadaaa por favor alguien que me auxilie


----------



## Moyano Jonathan (Ago 6, 2009)

Poné todos los datos que podás de tu circuito así tambien como mensajes de error ........todo lo que nos pueda dar las pautas de tu problema asi podemos ayudarte.


----------



## noriad (Ago 7, 2009)

Moyano gracias por contertarme.no tengo idea de las herramientas, me refiero a soft,  que necesito para hacer una aplicacion USB.mi primer objetivo es tratar de enviar paquetes  por el puerto, que soft necesito para simularlo 
salundo fraternal  noriad


----------



## Moyano Jonathan (Ago 7, 2009)

Bueno lo primero que necesitarías para empezar con lo de USB, es una noción de lo que es el puerto en si para esto está mi manual publicado acá en el foro, http://www.mediafire.com/?sharekey=5f09a3ade06e1b01d41644271fb54c6c55e78325ff111889d7410b61083723b8.

Luego el software necesario es el siguiente:
- Visual Studio 2008 o en caso de no poder conseguirlo el Visual Basic .net o Visual C# 2008. 
Este software te va a servir para hacer las aplicaciones de control.
- Compilador de C para PIC C de CCS o C18 ( Yo programo en C de CCS ).
- Proteus VSM (Simulador para los proyectos ) algo que comentar sobre este programa es que presenta fallos en algunas simulaciones y hay veces que no simula el USB.

Estos programas son los básicos.


----------



## Moyano Jonathan (Ago 7, 2009)

A todos los que estén usando en la PC Windows Vista o Windows 7 ,  estoy migrando el código de mis ejemplos a Visual C# y VB.net respectivamente así no tienen problemas de compatilidad.

Los programas los voy a ir posteando de a poco a medida que los valla haciendo.


----------



## jeremylf (Ago 7, 2009)

Pregunta: Se pudo hacer funcionar el modo HID con la mpusbapi.dll en Visual C# y CCS ?

Ando como loco buscando esa información por toda la red y no encuentro nada =(


GRacias por todo, salu2.


----------



## Moyano Jonathan (Ago 7, 2009)

Vos estás confundido mpusbapi.dll es para el modo bulk transfer y si hay ejemplos para Visual C#.

Para el modo HID solo he desarrollado código para VB.net pero cuando tenga tiempo también voy a escribir ejemplos para VC#.


----------



## jeremylf (Ago 7, 2009)

No es cierto, que yo sepa, dicha DLL tambien sirve para transferencias HID. Por ello su funcion MPUSBREADINT(...) esta implementada. Es mas, tambien se puede usar para transferencias Isochronous.

Estas seguro de lo que dices? 
Bueno, gracias de todas formas.


Salu2


----------



## Moyano Jonathan (Ago 7, 2009)

esa dll tiene dos funciones para HID pero nadie las utiliza por eso no has encontrado información al respecto de HID y mpusbapi.dll , las que son para HID : HID.dll de windows y MCHID.dll del software easyHID son las más utilizadas. 

Si querés saber más sobre mpusbapi.dll metete en la página de microchip y ahi dicen las capacidades de funcionamiento.


----------



## Alber Moremont (Ago 7, 2009)

Aunque ya esta un poco avanzado el tema, les quiero decir que para poder utilizar HID con visual basic 6.0 (aunque tambien funciona en VB 2008) hay un control ActiveX que proporcionaba microchip, el cual ya trae implementados varios metodos y eventos que hacen el manejo de HID muy sencillo, no se si ya alguien lo utilizó?

Yo ya realizé algunos ejemplos básicos con ese control y C18 y realmente es muy muy sencillo...


----------



## sanacrox (Ago 9, 2009)

Que pena incomodarlos alguno de ustedes sabe realizar eso tambien por medio de java netbeans?


----------



## Moyano Jonathan (Ago 10, 2009)

Alber Moremont: Estaría bueno que pusieras algunos ejemplos en C18 para que los que no sepan programar en C de CCS tengan ejemplos para sus proyectos.

sanacrox: Si hay ejemplos dejame que te busque el link y te lo posteo.


----------



## jpcs (Ago 11, 2009)

hola que tal,,, creo que llegue un poco tarde, pero ya empece con la comunicacion del pic por usb con cdc class,  bueno,   en la simulación  con proteus todo ok,,  me envia datos tanto al pic como a la pc,  el problema esta que cuando lo implemento  o lo armo en un proto,   puedo enviar datos , pero no puedo recibir del pic a la pc  la información programada,  
ya lo e testeado todo,, pero nada.. Una ayuda porfa por ejem:

.
.
.
printf(usb_cdc_putc, "\rdato recibido")
.
.
.


----------



## ByronAC (Ago 12, 2009)

Estoy aprendiendo a trabajar con el pic 18f2550, en ccs, y en mi caso, voy a utilizar un cristal de 48 MHZ, y veo que el código que utilizas es para un cristal de 20 MHz, 
¿como hago para trabajar directamente con los 48Mhz del oscilador?, osea usbdiv debe ser 0 para que no se active, según entiendo pero no sé como programarlo en ccs para que le inyecte directamtente, si me colaboran diciéndome o remitirme alguna web o manual.

Gracias Electrónicos


----------



## Moyano Jonathan (Ago 12, 2009)

No los 48 Mhz se obtienen mediante el PLL usando el cristal de 20Mhz , no podés poner un cristal de 48Mhz.


----------



## ByronAC (Ago 12, 2009)

porque no se puede?.. yo tengo entendido que el 18f2550 aguanta ese cristal de 48 Mhz. Explícame por favor..


----------



## microstar10 (Ago 13, 2009)

Tengo un pequeño a gran problema, resulta que me he montado el circuito de ejemplo 1 de HID, he quemado el PIC con ART2003 y con el WinPC800, y cuando lo conecto me dice que: 

"No reconoce el dispositivo USB"

He provado a programar un circuito que no tenga en cuenta el USB y el PIC funciona correctamente, ¿A que puede ser devido esto? me estoy volviendo loco provando cosas....


----------



## Moyano Jonathan (Ago 13, 2009)

ByronAC: Por favor lee el datasheet para mayor información, se te van a aclarar muchas dudas o sino lee mi manual de USB que está en este hilo por la pagina 24 mas o menos


----------



## Meta (Ago 13, 2009)

Mira este manual del WinPic800

http://www.abcdatos.com/tutoriales/tutorial/z9157.html

Saludo.


----------



## flojon (Ago 13, 2009)

Hola
bueno e estado siguiendo su post desde hace un par de semanas y bueno es muy interesante todo esto de la comunicacion usb y me gustaria aprender mucho mas... pero solo desde ayer que empece a implementarlo con el pic y funcionan tanto en el protoboard como en el proteus pero tengo un problema no se que hago mal.

El problema es que cuando conecto el pic con la host no me responde me aparace que hay un mal funcionamiento en el hardware y no se que estoy haciendo mal instale el archivo mchpcdc.inf luego compile de nuevo el codigo de C con el CCS y programe nuevamente el pic y nada luego probe si es que estaba conectado con los programas que facilitaste del visual y nada no se que hacer me di vueltas por la web y nada o es que mi host esta mal es una pentium 4 con windows servis pack 2 y nada la verdad es que no se como es eso de las librerias se tienen que copear en alguna parte de la pc o instalar alguna otra cosa mas aparte de lo facilitado. 

Yo lo hice con el pic 18f4550 (pero se que son la misma familia), aparte no se si los valores de los capacitores afectan cuando lo cambias (que mal). 

En realidad mi problema esta en la comunicacion del pic con el host por que me aparece como un mal funcionamiento del dispositivo.

Encontre esta pagina donde me dice como conectar el pic al host

http://picmania.garcia-cuervo.net/usb_3_cdctransfers.php

Hice lo que dice pero nada sigue el problema 

Les agradeceria si me pudieran decir cual es mi problema se lo agradeceria de ante mano.

Saludos.


----------



## matquin (Ago 14, 2009)

Flojon:
Los valores de capacitores son mas que importantes, proba en todo caso cambiando el capacitor de 470n a 47u, ademas ¿estas usando fuente externa o alimentas con el puerto? si estas utilizando una fuente externa en el codigo tienes que declarar un pin de senceo para detectar el USB conectado

Espero que te sirva Suerte..


----------



## microstar10 (Ago 14, 2009)

ya me he mirado el manual y nada sigo igual


----------



## Meta (Ago 14, 2009)

El manual aún no está completo del todo. Falta mucho, pero poco a poco se desarrolla.


----------



## Moyano Jonathan (Ago 14, 2009)

Igual está excelente tu manual , todo a su tiempo. Mi manual también va a de a poco a mediado que voy traduciendo y haciendo programas, igual la facultad de ingenieria el colegio y demás cosas me dejan muy poco tiempo para la electrónica.


----------



## jjconxuro (Ago 15, 2009)

Moyano Jonathan dijo:
			
		

> ByronAC: Por favor lee el datasheet para mayor información, se te van a aclarar muchas dudas o sino lee mi manual de USB que está en este hilo por la pagina 24 mas o menos



Hola y gracias por responder, pero en serio que se peude utilizar un cristal de 48MHZ, comenzando porque hay PLL12, por si se trabaja con un cristal de 48 MHZ para dividir a 4 Mhz por si se utiliza USBDIV.

Aunq es cierto que se puede usar 4 8 12, 20, 24, 40 y 48 Mhz.  y En tu caso usas 20 Mhz

Y bueno voy a buscar el manual y lo voy a leer..

Gracias por responder

[no sé a que horas se logueó jjconxuro en este pc , este mensaje es de ByronAC]


----------



## ByronAC (Ago 15, 2009)

ah y por cierto, hace dos días probando dañé el puerto usb del pc :S...  y creo q eso mismo ayudó a dañar el 18f2550 aunq no estoy seguro si el pic se dañó :S.

Al principio funcionó normal.. y después tenía un comportamiento extraño el circuito. y me puse a medir con el multimetro las patas del puerto usb y entre vcc y gnd daba 5V.. y luego misteriosamente medía 12 V, ahí fue cuando fui a conectar la memoria usb o el ipod y me di cuenta que ya no reconocía nada.

Y de nuevo felicitaciones por todos esos avances q logran, me parece q van muy rápido jaja..


----------



## microstar10 (Ago 15, 2009)

Sigo con el problema, resulta que me he montado el circuito de ejemplo 1 de HID, he quemado el PIC con ART2003 y con el WinPC800, y cuando lo conecto me dice que:  "No reconoce el dispositivo USB".  y en otras ocasiones si lo reconoce pero se concesta y desconecta solo, es decir escucho el sonido de conexion y desconexion del USB. Ya estoy pensando que es algun componente pero he cambiado todo. Me estoy volviendo loco provando cosas....


----------



## daniela lopez (Ago 20, 2009)

hola a todos, me gustaria q me ayudaran en un proyecto q estoy realizando se basa en el control de las maquinas a travéz del celular pero esta funcionando por bluethoot y la  tengo q poner a q funcione remotamente y por medio de un decodificador de tonos para q cada numero me genere una frecuencia diferente para controlar las maquinas pero no se como hacerlo... si alguien me puede ayudar a hacerlo de antemano gracias


----------



## Moyano Jonathan (Ago 20, 2009)

Dani metete por acá que trata sobre lo que vos necesitas: https://www.forosdeelectronica.com/about4657.html


----------



## hernanfire (Ago 27, 2009)

Hola a todos , felicitaciones Jonathan y Meta por seguir este link y brindar ayuda a todos los que andan como yo, en busca de información de PIC y USB.
Si alguien me puede ayudar, queria comentar un problema que estoy teniendo con los primeros ejemplos en CDC (llegue medio tarde al Hilo), lo simulo en proteus 7.4, hece el sonido de conexion al USB pero no funciona la parte del envio de la cadena de caracteres del PIC -> PC. Me parece igual que el error de Flojon:-?
Con el ejemplo 2 no veo las luces que enciendan (al recibir datos), pero si me muestra que esta conectado o reconocido por el Com3 (con el soft VB de ejemplo de conexion en caliente).
Tendre algun problema de driver, como veo que driver esta instalado en el USB o limpiarlo para iniciar la instalacion?
Gracias por responder


----------



## Meta (Ago 27, 2009)

Por aquí han hecho algo muy curioso.


----------



## Moyano Jonathan (Ago 28, 2009)

Lo acabo de ver , está muy buena la idea de usar una placa de red ........nos ahorramos todo el hardware necesario para ETHERNET.


----------



## Meta (Ago 28, 2009)

¿Te siente capaz de hacerlo con tarjeta de red?

Hay que darse cuenta que con el tiempo ya no se fabricarán tarjetas de red, ya que vienen integradas.


----------



## Moyano Jonathan (Ago 28, 2009)

La verdad capaz soy pero me faltan muchisimos conocimientos. Igual si estudiamos el protocolo TCP/IP seria mejor implementarlo directamente con los PIC que tienen ethernet incluido.


----------



## proyectista (Sep 1, 2009)

Hola,

Tengo un proyecto con un 18f4550, con el cuál trato de comunicar vía USB con el PC. Al simular el proyecto con el Proteus, todo funciona correctamente, pero al intentar conectar el circuito real al PC, Windows muestra un error en el que indica que el dispositivo no ha sido reconocido, y no permite que instalemos el driver que deberíamos instalar para que funcione el proyecto.
El código CCS de nuestro proyecto es:

```
#include <18F4550.h>
#DEVICE ADC=8 // CAD con 8 bits de resolución , justificación a la derecha.
#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL12,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    4                 //size to allocate for the tx endpoint 1 buffer
#define USB_EP1_RX_SIZE    3                 //size to allocate for the rx endpoint 1 buffer


#include <pic18_usb.h>     //Microchip PIC18Fxx5x Hardware layer for CCS's PIC USB driver
#include <PicUSB.h>         //Configuración del USB y los descriptores para este dispositivo
#include <usb.c>           //handles usb setup tokens and get descriptor reports


#define LEDV    PIN_B6
#define LEDR    PIN_B7
#define SERVO1    PIN_D7
#define SERVO2    PIN_D6

#define LED_ON  output_high
#define LED_OFF output_low

#define SERVO_ON  output_high
#define SERVO_OFF output_low

#define modo      recibe[0]
#define param1    recibe[1]
#define param2    recibe[2]
#define resultado0 envia[0]
#define resultado1 envia[1]
#define resultado2 envia[2]
#define resultado3 envia[3]





void main(void) {

   int8 recibe[3];                  //declaramos variables
   int8 envia[4];
   int8 valorleidorom;
   int8 valor1;                      //aqui se almacena el resultado del conversor A/D
   int8 valor2;
   int8 valor3;
   int8 valor4;
   int8 panel1;                    
   int8 panel2;
   int8 posmemw;                     //posicion de la memoria eeprom para escribir

   //LED_OFF(LEDV);                   //encendemos led rojo (en el de alberto)
   //LED_OFF(LEDR);                    (en el de alberto)
   LED_ON(LEDV);
   LED_ON(LEDR);
   delay_ms(1000);

   
   usb_init();                      //inicializamos el USB
   usb_task();                      //habilita periferico usb e interrupciones
   while (usb_enumerated()== 0);
   


   //usb_wait_for_enumeration();      //esperamos hasta que el PicUSB sea configurado por el host
      //LED_ON(LEDV);                   //encendemos led rojo (en el de alberto)
   //LED_ON(LEDR);                     (en el de alberto)
   LED_OFF(LEDV);
   LED_OFF(LEDR);
   delay_ms(1000);

   
   //setup_adc_ports(AN0 || VSS_VDD);
   setup_adc_ports( AN0_TO_AN11 ); //ponemos estas entradas analogicas
   setup_adc(ADC_CLOCK_INTERNAL);
   //set_adc_channel(0); // Selecciono el canal de conversión.   
   
   // configuro adcon2
   #asm
   movlw 0b00111110 ;justificacion_izquierda,20Tad,Fosc/64
   iorwf 0xFC0,1    ; direccion de ADCON2
   movlw 0b00111110 ;tensiones de referencia vref- y vrefmas (para leer del conversor valores de hasta 12v) y an0 es analogico
   iorwf 0XFC1,1    ;
   
   #endasm


   while (TRUE)
   {
      LED_ON(LEDR);
      LED_OFF(LEDV); 
      delay_ms(1000);
      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, 3); //cojemos el paquete de tamaño 3bytes del EP1 y almacenamos en recibe


            if (modo == 0) // El ordenador me manda capturar datos y almacenarlos
            
               {
                  LED_OFF(LEDV); 
                  LED_OFF(LEDR);
                  delay_ms(1000);
                  set_adc_channel(0); // Selecciono el canal de conversión 0
                  delay_ms( 100 );
                  valor1 = read_adc(); // El resultado de la conversión lo guarda en la variable valor.
                  delay_us(2000);
                  valor1 = read_adc(); // El resultado de la conversión lo guarda en la variable valor.
                  delay_us(2000);
                  
                  set_adc_channel(1); // Selecciono el canal de conversión 1
                  delay_ms( 100 );
                  valor2 = read_adc(); // El resultado de la conversión lo guarda en la variable valor.
                  delay_us(2000);
                  valor2 = read_adc(); // El resultado de la conversión lo guarda en la variable valor.
                  delay_us(2000);                 
                  
                  set_adc_channel(4); // Selecciono el canal de conversión 4 
                  delay_ms( 100 );
                  valor3 = read_adc(); // El resultado de la conversión lo guarda en la variable valor.
                  delay_us(2000);
                  valor3 = read_adc(); // El resultado de la conversión lo guarda en la variable valor.
                  delay_us(2000);
                  
                  set_adc_channel(11); // Selecciono el canal de conversión 5
                  delay_ms( 100 );
                  valor4 = read_adc(); // El resultado de la conversión lo guarda en la variable valor.
                  delay_us(2000);
                  valor4 = read_adc(); // El resultado de la conversión lo guarda en la variable valor.
                  delay_us(2000);
                  
                  set_adc_channel(5); // Selecciono el canal de conversión 5
                  delay_ms( 100 );
                  panel1 = read_adc(); // El resultado de la conversión lo guarda en la variable panel1.
                  delay_us(2000);
                  panel1 = read_adc(); // El resultado de la conversión lo guarda en la variable panel1.
                  delay_us(2000);
                  
                  set_adc_channel(6); // Selecciono el canal de conversión 6
                  delay_ms( 100 );
                  panel2 = read_adc(); // El resultado de la conversión lo guarda en la variable panel2.
                  delay_us(2000);
                  panel2 = read_adc(); // El resultado de la conversión lo guarda en la variable panel2.
                  delay_us(2000);
                  
                  write_eeprom(posmemw, panel1);
                  posmemw++; //siguiente campo en la eeprom para no sobreescribir datos
                 
                  write_eeprom(posmemw, panel2);
                  posmemw++; //siguiente campo en la eeprom para no sobreescribir datos
                  
                  write_eeprom(posmemw, valor1);
                  posmemw++; //siguiente campo en la eeprom para no sobreescribir datos
                 
                  write_eeprom(posmemw, valor2);
                  posmemw++; //siguiente campo en la eeprom para no sobreescribir datos
                  
                  write_eeprom(posmemw, valor3);
                  posmemw++; //siguiente campo en la eeprom para no sobreescribir datos
                 
                  write_eeprom(posmemw, valor4);
                  posmemw++; //siguiente campo en la eeprom para no sobreescribir datos                  
               }   
               if (modo == 1) //led verde on y movemos servo
               {
                  LED_ON(LEDV); 
                  LED_OFF(LEDR);
                  SERVO_ON(SERVO1);
                  delay_us(2000);
                  SERVO_OFF(SERVO1);
                  delay_us(18000);
                  SERVO_ON(SERVO2);
                  delay_us(4000);
                  SERVO_OFF(SERVO2);
                  delay_us(16000);
                  
               } //encendemos led verde y movemos el servo
               
               if (modo == 2) 
               {
                  LED_OFF(LEDV); LED_ON(LEDR);
                  SERVO_ON(SERVO2);
                  delay_us(2000);
                  SERVO_OFF(SERVO2);
                  delay_us(18000);
                  SERVO_ON(SERVO1);
                  delay_us(4000);
                  SERVO_OFF(SERVO1);
                  delay_us(16000);
               } //encendemos led rojo,movemos servo y leemos eeprom
               
               if (modo == 3) //leemos de la rom y le pasamos los 4 primeros valores al ordenador
               {
                  LED_OFF(LEDV); 
                  LED_OFF(LEDR);
                  valorleidorom = read_eeprom (0);
                  resultado0 = valorleidorom;
                  valorleidorom = read_eeprom (1);
                  resultado1 = valorleidorom;
                  valorleidorom = read_eeprom (2);
                  resultado2 = valorleidorom;  
                  valorleidorom = read_eeprom (3);
                  resultado3 = valorleidorom;
                  usb_put_packet(1, envia, 4, USB_DTS_TOGGLE); //enviamos el paquete de tamaño 4byte del EP1 al PC                  
               }
         }
      }
   }
}
```
También adjunto el circuito para simular en Proteus.
Hemos visto varias soluciones a problemas parecidos en muchos foros, pero con ninguno se arregla este problema. A ver si nos podeis echar una mano...
Gracias!


----------



## Moyano Jonathan (Sep 1, 2009)

Te tenés que fijar que estén bien las conexiones es lo primero que falla. Por lo que veo no tenés errores aparentes pero habría que verlo más en detalle.


----------



## proyectista (Sep 2, 2009)

Gracias por tu respuesta Moyano. Hemos comprobado todas las conexiones bastantes veces, pero todo está bien conectado. 
1. ¿El problema puede ser incompatibilidad entre el USB 2.0 del 18f4550 y el USB 1.0 de nuestro PC? 
2. ¿Puede ser que el PC no lo reconozca por tener USB 1.0?


----------



## Moyano Jonathan (Sep 2, 2009)

La verdad que lo más probable puede ser eso por que vi tu código y la verdad que errores no tiene. Probalo en una máquina nueva.


----------



## proyectista (Sep 3, 2009)

Gracias por contestar. Lo hemos probado en una maquina nueva con puertos usb 2.0 y sigue el mismo problema.
Al meter el usb se instala un driver generico en vez del que nosotros queremos, y no nos deja instalar nuestro driver. ¿puede ser por eso?


----------



## Meta (Sep 3, 2009)

Comprueba el hardware y los cableados.


----------



## proyectista (Sep 3, 2009)

Buenas. He verificado el cableado muchas veces y nada, incluso he vuelto a soldar una conexion hembra usb distinta y realiza lo mismo.

¿puede ser un problema de corrientes?
¿problema de masas?

Gracias.l


----------



## Moyano Jonathan (Sep 3, 2009)

Puede ser problema de drivers....a mi ahora que me acuerdo me pasó. Otra cosa vos estás usando el picUSB.h por lo que tendrías que usar el driver que creó J1M. Si vos usas el driver que proporciona microchip no te va a funcionar.


----------



## proyectista (Sep 7, 2009)

Bueno pues por fin solucione el problema. Para el que le pueda ayudar el problema estaba en el oscilador. Tenia puesto uno de 48mhz y puede ser que estuviese mal, porque he puesto uno de 20 y otro de 12 y funciona bien. 

Gracias a los que habeis contestado.

Un saludo


----------



## Meta (Sep 7, 2009)

Que yo sepa el máximo se pone el 20MHz. Si quieres 48MHz debes configurarlo con el mismo oscilador externo a 20MHz.


----------



## Moyano Jonathan (Sep 8, 2009)

A menos mal. Para hacer funcionar el microcontrolador a 48Mhz , hay que configurar el PLL del PIC según el cristal que se esté usando.


----------



## noriad (Sep 10, 2009)

Jonatan ya te escribi una vez un amensaje privado y me contaste que publicara mis dudas aqui .
aqui tengo varias dudas
1- No se como configurar el pic 18f44550 para hace transferencias por el puerto USB 
2- A la SIE del PIC segun el datasheet le entra una senal de reloj , no se como configurar el pic para que esa senal de reloj este activa 
3- yo tengo el proteus 7.2 sp6 pero no si el conector USB que trae me funciona Bien , porque el proteus que tengo esta crakeado , necesito por favor un segmento de codigo que me permita comprobar su funcionamiento. si pudieras publicar un codigo en lenguaje ensamblador porque es lo que se , ya que aunque he programado en C no tengo conocimiento de algunas funciones que se utilizan para manejar el puerto usb 

MUCHAS GRACIAS por todo


----------



## rasaam (Sep 10, 2009)

Hola a todos, los felicito por su foro, está muy bueno. Yo soy algo nuevo en esto del USB, pero programo en CCS, PBP y se algo de Visual Basic. Bueno, la cuestión es que estuve probando uno de sus primeros ejemplos simulando con el proteus... va bien el primer tiro, pero luego me saca un error y me deja el socket abierto y no puedo volverlo a correr... me toca reiniciar el equipo y nuevamente lo mismo. 

Bueno, yo sé que en el foro hay muchos aportes, pero no escontré o tal vez no entendí lo que decían, algo acerca de lo que pretendo... pero bueno, estoy en camino de iniciar un proyecto en el que recibo unos 250 Bytes desde un programa VB y debo verificar que haya llegado bien, luego desconecto el USB y me debe pasar a realizar otra tarea distinta al USB. AH! me parecería muy interesante hacerlo directamente sobre USB, no VIRTUAL COM, ojalá PnP .... ya tengo algunas ideas, basándome en lo leido en el foro así:

Utilizaré un ejemplo que hay en HOBBYPIC, sólo que con PIN SENSE para poder hacer otras cosas cuando el USB no esté conectado, pienso que debería iniciar USB con usb_init_cs y además el usb_task (debo hacerle una pasada periódicamente para que esté alerta cuando conecten el USB)........ en fin, si alguno de ustedes me puede echar una manito le agradecería y publicaría los resultados a medida que vaya avanzando para que nos nutramos.

NUEVAMENTE FELICIATACIONES

Espero poder aportar algo de mis conocimientos a este gran foro

Regards,

RASAAM


----------



## Moyano Jonathan (Sep 10, 2009)

> Jonatan ya te escribi una vez un amensaje privado y me contaste que publicara mis dudas aqui .
> aqui tengo varias dudas
> 1- No se como configurar el pic 18f44550 para hace transferencias por el puerto USB
> 2- A la SIE del PIC segun el datasheet le entra una senal de reloj , no se como configurar el pic para que esa senal de reloj este activa
> ...


Toda la información que necesitas está en el hilo del foro...lee y se te van a aclarar todas las dudas.



> Hola a todos, los felicito por su foro, está muy bueno. Yo soy algo nuevo en esto del USB, pero programo en CCS, PBP y se algo de Visual Basic. Bueno, la cuestión es que estuve probando uno de sus primeros ejemplos simulando con el proteus... va bien el primer tiro, pero luego me saca un error y me deja el socket abierto y no puedo volverlo a correr... me toca reiniciar el equipo y nuevamente lo mismo.
> 
> Bueno, yo sé que en el foro hay muchos aportes, pero no escontré o tal vez no entendí lo que decían, algo acerca de lo que pretendo... pero bueno, estoy en camino de iniciar un proyecto en el que recibo unos 250 Bytes desde un programa VB y debo verificar que haya llegado bien, luego desconecto el USB y me debe pasar a realizar otra tarea distinta al USB. AH! me parecería muy interesante hacerlo directamente sobre USB, no VIRTUAL COM, ojalá PnP .... ya tengo algunas ideas, basándome en lo leido en el foro así:
> 
> ...



Todos los programas funcionan correctamente y creo que están suficientemente documentados. Igual de a poco estoy escribiendo todos los ejemplos nuevamente porque conjuntamente con mi nuevo manual sobre USB va ir incluido un archivo con todos los ejemplos mas algunos nuevos.

Por favor a todos tengame paciencia por que mis estudios me están tomando todo el tiempo posible y este año me recibo


----------



## Meta (Sep 10, 2009)

Moyano, eres el mejor. Serás pionero de un buen manual sobre VB .net con USB.


----------



## Moyano Jonathan (Sep 10, 2009)

Un usuario en el foro todopic hizo que el compilador se ahorrara un 25% de la memoria RAM en programas que involucran el puerto USB........La verdad impresionante por lo que aplicaré sus mejoras en mis programas también. Por otro lado también me conseguí el libro USB complete donde se explica todo o casi todo de este puerto , por lo que me sacaré varias dudas.
En este momento estoy creando una controladora USB para poder manejar 127 motores PAP que en cuanto la termine la voy a postear.


----------



## kriskmilo (Sep 11, 2009)

Jonathan Gracias por ese monton de aportes!!!

Estuve viendo a traves de los post el interes que tienen en implementar estas soluciones USB en Visual Basic 2008, quiero decirles que el primer codigo que usaba el MSCOMM puede funcionar en Visual Basic 2008 agregando el componente MSCOMM.
MSCOMM me parece bastante atractivo debido a que la programacion del mismo es bastante sencilla, aunque no he indagado HID en Visual Basic. NET.
Les comento que Windows 7 no soporta el IDE de Visual Basic 6 pero las aplicaciones son soportadas por el sistema operativo.

Veo tambien que desean aplicar algo de ethernet, la forma mas facil es comprar un xport que vende lantronix con un max232 y usar la comunicacion UART (serial) del microcontrolador.

http://www.lantronix.com/device-networking/embedded-device-servers/xport.html

Existen tambien muchos ejemplos para utilizar el ENC28J60, sin embargo ese no lo he utilizado aun...


----------



## Moyano Jonathan (Sep 11, 2009)

> Jonathan Gracias por ese monton de aportes!!!
> 
> Estuve viendo a traves de los post el interes que tienen en implementar estas soluciones USB en Visual Basic 2008, quiero decirles que el primer codigo que usaba el MSCOMM puede funcionar en Visual Basic 2008 agregando el componente MSCOMM.
> MSCOMM me parece bastante atractivo debido a que la programacion del mismo es bastante sencilla, aunque no he indagado HID en Visual Basic. NET.
> ...



En el manual que estoy haciendo voy a usar VB.NET VB6 no lo uso más por compatibiliadad de aplicaciones. Aparte que todo el mundo programa en VB en caso de que alguien quiera transladar o migrar los programas van a estar publicados los fuentes.

Ethernet todavía no lo menejo pero espero que para este verano lo pueda implementar.


----------



## FRYCK (Sep 13, 2009)

hola  Moyano Jonathan  se me  presento  un  inconveniente   estoy  realizando  un  termometro  que  me  muestre    la  temperatura  por  un   cuadro de dialogo   tengo  la   parte  de la  transmisión del  microcontrolador  en  ccs  y  en  el  pc  estoy  realizando  la  aplicacion  en visual   c++ 2008  no  se  por que  carajo  no  puedo realizar  la  convercion  adc  con  este  pinche  micro   y  los   valores  que  me  muestra  son   erroneos   porfavor    si  alguien  ha  realizado  esto   que  me  guien  
 gracias  de antemano.  esta  semana  colaboro  con  la placa entrenadora  para  el  4550   tengo que  hacerle  unas  pequeñas  correciones    disculpen  la  neurosis   fin  de semana  completo  perdido  para  esto  y  nada.......... pero  asi  se  aprende  
Fran Restrepo


----------



## Moyano Jonathan (Sep 14, 2009)

La verdad disculpame fryck_80 disculpame pero no tengo experiencia programando en Visual C++ 2008.


----------



## Meta (Sep 14, 2009)

Trankis, que ya lo pasaremos tod a VC++ y VC# desde VB .Net.


----------



## ketronica (Sep 14, 2009)

Que tal muy buenos ejemplos pero no los puedo simular en proteus, descargue un ejemplo de http://www.sixca.com/  que controla un motor paso a pasoy lo pude simular el software esta en delphi6 con mpusbapi.dll, ayer descague uno que controla dos motores paso a paso y tambien funciona el software esta Visual C++ 2005, ya pedi el PIC18F4550 para montarlo, si funciona subo los archivos.

Aqui hay un video.


----------



## noriad (Sep 17, 2009)

Hola a todos soy practicamente nuevo en el foro  e inicios mis trabajos con el puerto usb y tengo un problema ya que tengo el proteus 7.2 sp6 pero hace poco me di cuenta que mi licenci ano soorta trabajo con el puerto USB. que puedo a hacer de que modo puedo conseguir una, como  lo han logrado ustedes 

GRACIAS  POR su AYUDA


----------



## Moyano Jonathan (Sep 17, 2009)

Te tenes que bajar las ultimas versiones del programa


----------



## noriad (Sep 18, 2009)

si pudieras sugerirme algun link para la descarga, te explico porcuestiones de relaciones internacionales mi pais no goza  con el acceso a internet como quizas lo puedes tenes el tema de la busque da información es muy problematico por eso se me hace muy dificil  la busqueda 
realmente necesito la ayuda de ustedes que tiene  lo que yo tengo 

mi proteus el problema que tiene es la licencia como te explicaba 

ya me lei el foro completo como ya que me dijiste que mis dudas se me iban aclarar leyendolo pero todavia las tengo una de ellas te la comente en el parrafo anterior la otra es que no se como modifiocar la meria de configuracion  del 18f4550 pero  con directivas en  ensamblador 




gracias


----------



## FRYCK (Sep 19, 2009)

noriad dijo:


> si pudieras sugerirme algun link para la descarga, te explico porcuestiones de relaciones internacionales mi pais no goza  con el acceso a internet como quizas lo puedes tenes el tema de la busque da información es muy problematico por eso se me hace muy dificil  la busqueda
> realmente necesito la ayuda de ustedes que tiene  lo que yo tengo
> 
> mi proteus el problema que tiene es la licencia como te explicaba
> ...





Hola  revisa  la paguina  de mecatronika http://www.mecatronika.com/  de  aqui  puedes  dedscargar  algunos  programas  creo que  hay  esta  ese    espero   que te  sirva


----------



## electro_02006 (Sep 19, 2009)

hola a todos les escribo para saber si pueden publicar el contenido de todas las librerias que utilizan para la comunicacion pic-usb sé que moyano ha publiado algunos pero lo que pasa es que el ccs que tengo no trae todas las librerias o estan dañadas ya que no he podido hacer la comunicacion ya que no obtengo los 3.3v del Vusb y mi asesor me dice que talves el problema sean las librerias asi que agradezco de antemano toda ayuda posible


----------



## Alber Moremont (Sep 22, 2009)

Hola a todos...
Solo les quiero hacer un comentario curioso, al menos porque yo no lo sabia, pero se pueden utilizar algunos controles de LabVIEW en Visual Basic 6 (no se si en VB.NET también). Estos son: un switch, una barra de control de escala, un cuadro de para graficar y una perilla, estan muy buienos y serian utiles si se quiere tener algún objeto por ejemplo para graficar alguna variable respecto a otra...

Luego publicare los programas con C18 porque estoy algo ocupado...


----------



## Hernan83 (Sep 25, 2009)

Hola este es mi primer mensaje en el foro,buscando en la gran red vi que aca habia un seguimiento del USB,tanto en programacion como en conceptos y hoy mismo me traen mi PIC18F2550,asi me inicio en el mundo USB,pese a ser estudiante de ingenieria,desconozco bsatante este lindo protocolo,felicito a Jonhatan Moyano,por la dedicacion que le pone a cada post,y las disposicion para contestar y a su perseverancia!! Prometo aportar lo que salga e investigar en lo que pueda,gracias!!


----------



## diego_z (Sep 27, 2009)

Hola jonatan me parece barbaro tu post , estube leyendo hasta la pagina 4 y esta todo barbaro el aporte es un trabajo excelente , solo queria preguntarte algo como vez para hacer el codigo en asm , ya que de c no entiendo ni j , tal vez en la navegadas que as dado encontraste algo en assembler como para leer yo hace dias que busco y todo esta en c , no encontre siquiera un tutorial ( de ultima tendre que aprender c ) , aunque tengo muchas dudas sobre ese  lenguaje , no se si se puede simular en el ccs e ir viendo los valores de los registros y esas ventajas que tiene el mplab , bueno espero no desviar el post felicitaciones , diego


----------



## Alber Moremont (Sep 27, 2009)

Hola diego_z, 

Hay un libro que se llama "USB desing by example" LINK EDITADO en este puedes ver aplicaciones USB hechas en ensamblador pero para el uC 8051, de cuelquier manera te daras cuenta de lo complicado que es desarrollar una aplicacion tan sencilla como prender y apagar LED's en ensamblador. Lo que yo te recomendaria(y supongo que la mayoria del foro) es que aprendas C (ya sea CCS, MikroC, C18...) aqui tienes todo lo necesario para comenzar en especial con CCS. Todo se simplifica gracias a C...

Suerte

---- Edit por Chico3001 ----


> 2.9 Los usuarios no pueden publicar, solicitar ni difundir información que promueva el plagio, la piratería, la divulgación de números de serie, crack o similares, o copias no autorizadas de material protegido por derechos de autor.


----------



## Moyano Jonathan (Sep 28, 2009)

El desarrollo del protocolo USB en ASM quiza sea un tema de discusión para mas adelante ya que su complejidad es tal que tendría q empezar desde cero. Igual creo que una vez que hayamos desifrado el USB en ASM en una de esa podamos migrar el código a micros de menores prestaciones como los de la serie 16F


----------



## diego_z (Sep 29, 2009)

bueno como yo siempre soy el que va en contra de la correntada jaja, me propuce hacerlo en asm y miren que bueno ya tenemos el asm generado en el mismo ccs solo que esta sucio , digamos mesclado con codigo c y comentarios , asi que me anoche me propuce compilar algo para que limpie ese codigo , como casi la mayoria sabemos el ccs ( no se si otros programas lo hacen ) generan entre otros archivos uno con extensión .lst y es alli donde se encuentra nuestro codigo , asm , por ej 

trozo de .lst
*************************************************************
008E: MOVFF 16,FFA
0092: MOVF 05,W
0094: MOVFF 07,FE0
0098: MOVFF 06,FD8
009C: RETFIE 0
.................... // Ejercicio Nº1: Genera un COM virtual y se comunica bidireccionalmente con el a través del PIC18F2550. 
.................... 
.................... #include <18F2550.h> // Definición de registros internos. 
.................... //////// Standard Header file for the PIC18F2550 device //////////////// 
.................... #device PIC18F2550 
.................... #list 
***********************************************************
como veran esta con las direcciones antepuestas abajo hay un exe que al cargar un torzo de archivo antes guardado con extensión .txt lo limpia y queda solo el ensamblador guardando en el escritorio un txt de nombre asm , espero no me castiguen por ensuciar el post . preo creo que servira para todos aquellos como yo que creen que como el ensam.. no hay mil disculpas a yony . aclaro que solo pretendo aprender a usar el usb y como hay muy poca información o nada en asm se me ocurrio esta idea y con el c de la mano , oviamente despues de tener el asm no es que ya este listo hay mucho por recorrer para que funcione y para eso esta el mplab
EDITO: modifique el .exe porque al probarlo en otra maguina y querer guardar el generado me tirava error de ruta asi que lo guarda en C:\ASM.txt, tambien  en este caso agrega el codigo c y todos los comentarios con ; antepuestos


----------



## Moyano Jonathan (Sep 29, 2009)

diego_z: Está genial lo que haces , no estás ensuciando el post sino enriqueciendolo yo por mi parte estoy bastante preocupado por que no he podido avanzar en materia de electronica debido a mi escaso tiempo con los estudios tanto secundarios como universitarios pero en cuanto tenga tiempo me voy a volver a poner las pilas con el tema de usb terminando mi libro y viendo que hacer para que el tema de USB se vea en toda su extensión


----------



## Hernan83 (Sep 29, 2009)

Hola Jonathan,felicitaciones anoche baje lo que tenes hasta ahora de tu libro sobre USB,excelente información muy clara,estoy viendo sobre el Visual Basic 2008 que usas en los ejemplos (aclaro que soy principiante en VB) en un futuro,si se usa el protocolo en modo bulk,se estaria aprovechando mejor los recursos del micro? pague aca en buenos aires 80 pesos por el PIC18F2550 me vieron la cara? no sera mucho? gracias!


----------



## Moyano Jonathan (Sep 29, 2009)

La verdad te vieron la re cara...... el PIC18F2550 en bs as sale 10 - 11 dolares en elemon : $41,80 maximo $42,50.... acá en mendoza si está caro porque pagas envio,ganancias de la casa de electronica, etc y te lo venden a $60 pesos pero hay lugares en mendoza a donde podés pedir componentes por cantidad pero tenés que comprar encima de los 100 dolares a 150 dolares para que ellos te puedan vender y te consiguen todo a precio de costo.


----------



## mandeb48 (Sep 30, 2009)

Disculpen que retroceda tanto del post, pero intente compilar el ejemplo N1 (CDC) y me aparece la siguiente ventana:

Pass a 0 or 1 for including  NOLIST, RTF Template Filename, Project Filename and Output Filename.

De todos modos cargue el HEX que viene en el ejemplo en el PIC,  al conectar la placa  en el puerto USB  me pide el driver (hasta acá bien) pero al direccionarlo a la carpeta del driver que viene en el ejemplo, me dice que no lo encuentra.(Lo probe en otra computadora y lo mismo)

¿Alguien tiene alguna idea de que puede ser?


----------



## asherar (Sep 30, 2009)

Genial, lo de diego_z. 
Es algo parecido a tomar un HEX y pasarle un descompilador como este para obtener el ASM. Solo que a partir del LST. 
Se podría hacer algo parecido para ver cómo manejan los compiladores C el direccionamiento en los bancos de los pics ... digo. 
Saludos


----------



## diego_z (Oct 1, 2009)

hola claro el winpic 800 por ej trae esa opcion solo que genera solamente a partir de un hex el asm y en este caso separaria el hex del c y todo lo que es comentario lo antepone con ; ( el codigo c lo toma como comentario ) olvide mencionar que al final de todas las lineas hay que poner una F sino el programa no sabe cuando parar y simplemente se cierra al llegar al final y no encontrar la F . pequeño detalle jeje . tal vez intente mejorarlo para que ya  valla reemplazando las direcciones por las reales del pic


----------



## asherar (Oct 1, 2009)

diego_z dijo:


> hola claro el winpic 800 por ej trae esa opcion solo que genera solamente a partir de un hex el asm y en este caso separaria el hex del c y todo lo que es comentario lo antepone con ; ( el codigo c lo toma como comentario ) olvide mencionar que al final de todas las lineas hay que poner una F sino el programa no sabe cuando parar y simplemente se cierra al llegar al final y no encontrar la F . pequeño detalle jeje . tal vez intente mejorarlo para que ya  valla reemplazando las direcciones por las reales del pic



Yo probé tu programa con un "lst" que tengo de 42 páginas y me volví mono. 
Traduce hasta el fin de cada página y para. Ahí hay que darle "Convertir" otra vez, y ahí sigue hasta el fin de pág. y así con las 42 pág. hno:  

Yo en todo caso le haría dos opciones tipo: "Convertir próxima página" y "Convertir todo". 
O que haga todo de una vez y listo. 

Es solo una idea.  

Saludos


----------



## diego_z (Oct 1, 2009)

como es eso de dividido por paginas? el lst del primer ejemplo de este post tiene 7325 lineas y no tube problemas ,


----------



## asherar (Oct 2, 2009)

El Mplab genera los archivos LST con un paginado de masomenos unas 40-50 líneas por pág. 
Debe poner un caracter no imprimible, para indicar el fin de página a la impresora, que tu programa  interpreta como fin de archivo. Supongo.

Acá subo un LST generado con MPLAB. Lo pongo acá para no agregar un posts fuera de tema.


----------



## diego_z (Oct 2, 2009)

trabajas con c18? la verdad no se como seran los del mplab yo me bace en uno del ccs para hacer el programita subi uno lst que usas para ver como son


----------



## Moyano Jonathan (Oct 2, 2009)

Una pregunta han podido sacar algo en blanco con el tema de usb ??


----------



## diego_z (Oct 2, 2009)

yo hasta ahora nada jeje, solo pasar el archivo y despues a estudiar los registros internos data en mano y meta rosca nomas , pero que el trabajo me lleva loco , cuando tenga algo en assembler lo pongo


----------



## jokelnice (Oct 2, 2009)

esta pagina puede ayudar con respecto a usb y assembler
http://instrumentaciongz.wikispaces.com/USB+CON+ASSEMBLER


----------



## asherar (Oct 3, 2009)

Hola: 

Entre las cosas que he bajado alguna vez encontré estos proyectos con USB en assembler para pic 18F2550. 

Ahí van cuatro mas algo de información de Microchip.  Si los guardo se van a apolillar antes de que yo los aproveche. 

 Saludos y feliz fin de semana !!!

PD: Lo más probable es que los haya bajado de este mismo foro ... pero no recuerdo :-?


----------



## diego_z (Oct 3, 2009)

ale excelente , me tengo que hacer un tiempo para ver lo , casualmente anoche mirando un interfaz para la radio tx pc encontre esta pagina http://alessioandrea.altervista.org/rcjoyng2.html donde tambien tiene unos asm que no revise


----------



## Moyano Jonathan (Oct 3, 2009)

Che ale pero los ejemplos que vos posteaste no son en ASM..son en lenguaje C y BASIC.
Esta página tiene 3 proyectos que están puramente hechos en ASM con código fuente comentado en inglés. Los ejemplos son funcionales... los probé en mi entrenador USB y funcionan muy bien.

EL link: http://www.moty22.co.uk/


----------



## asherar (Oct 3, 2009)

Pero, en la carpeta PICBasicPro, tres de ellos (bidirecional, enviodedatos y TP2550) tienen un LST con el código en asembler *para atacar con el programa de diego_z*.
La idea era entender *cómo *programar directamente en asm.


----------



## Chico3001 (Oct 4, 2009)

Posiblemente esto les sirva de algo... es un proyecto realizado en assembler para AVR en el cual logran hacer una comunicacion USB de baja velocidad usando un micro que no tiene modulo USB

http://www.obdev.at/products/vusb/index.html


----------



## vikthor (Oct 9, 2009)

Alber Moremont dijo:


> Hola a todos...
> Solo les quiero hacer un comentario curioso, al menos porque yo no lo sabia, pero se pueden utilizar algunos controles de LabVIEW en Visual Basic 6 (no se si en VB.NET también). Estos son: un switch, una barra de control de escala, un cuadro de para graficar y una perilla, estan muy buienos y serian utiles si se quiere tener algún objeto por ejemplo para graficar alguna variable respecto a otra...
> 
> Luego publicare los programas con C18 porque estoy algo ocupado...



Hola, labview se enlazar con VB6 y VS2088, el programa se llama _*"Measurement Studio"*_, todos lo controles visuales de labview se los puede utilizar. es una maravilla, yo lo utilice para graficar la funciones de ecuaciones diferenciales la entrada y la salida como una especie de osciloscopio. lo busco y lo subo

les recomiendo esta pagina http://www.sandpile.org/docs/intel/usb.htm


----------



## Blacksnake84 (Oct 9, 2009)

Saludos, Jonathan he leido y hecho mi circuito controlador de reles, todo iba perfecto hasta que llego la hora de conectar el dispositivo, porque la pc no me reconoce el usb y me sale el globo de que el dispositivo no se reconoce, intente meter el driver que viene en la carpeta pero no pasa nada no lo instala y no hace nada, el pic esta bien grabado, asi que ya no se ni cual pueda ser el error, te agradecere mucho si me ayudas un poco gracias.


----------



## Hernan83 (Oct 9, 2009)

Si no te anda,fijate el orden,primero conecta el usb y despues abris es programa,a mi me paso algo parecido y fue eso,y fijate tambien los puertos COM de la pc,en administrador de dispositivos,se te agrega otro COM virtual,puede ser eso


----------



## Blacksnake84 (Oct 9, 2009)

Gracias por responder tan rapido, pues ya cheque y no me agrega puertos nuevos solo este que pongo en la imagen. 

ademas me di cuenta que las salidas desde la 23 a la 28 me da 5v de salida conectandolo sin correr programa ni nada.

las salidas 21 y 22 no tienen voltaje


----------



## Hernan83 (Oct 9, 2009)

Fijate tambien en el diagrama que me genero duda a mi,la conexion de D+ y D-,proba tambien lo de los puerts USB,de conectarlos en otro 
s tambien que tengas,y puede haber problemas tambien con la version de CCS que usas,otra cosa no sabria decirte,suerte.


----------



## Blacksnake84 (Oct 9, 2009)

gracias, te debo la vida jejejeje, si el problema estaba en el D+ y D-, ahora si ya me detecto el driver y todo, ahora ya no memanda señales de salida, supongo que me falta una fuente de corriente externa y no solo la del usb, o tu como le hisiste?, va un diodo el vcc del usb para proteger no?, gracias otra vez


----------



## Hernan83 (Oct 9, 2009)

Yo con miedito a algun corto,por ahora uso la del USB,para leds y pequeñas cosas anda bien,otra carga mayor no probe pero si,deberias usar algo externo para mayores cargas,y de nada si esta a mi alcance contesto,no hay problema!!


----------



## Blacksnake84 (Oct 10, 2009)

saludos otra vez, como sabran ya funciona mi circuito y como comentario dire que desconecte el + (positivo del usb) y coloque una fuente externa (5v) entonces quedo asi; del usb tomo (negativo, D+, D-) y de la fuente externa (-, +), y asi me evito tomar corriente del usb de mi laptop, alguien podra decirme como solucionaron el problema del retardo al pulsar los botones, gracias.

editado: el segundo programa de control de relevadores (HID) no me funciona, si lo carga en el pic, pero al conecatrlo a la pc no hace nada, y si cargo el primer programa si


----------



## Blacksnake84 (Oct 10, 2009)

pues despues de batallar un poco con el codigo y hacer las modificaciones necesarias para que me sea util ya esta funcionando a la perfeccion, gracias por el post * Jonathan* y sobre todo a *Hernan83* por las respuestas proporcinadas


----------



## atricio (Oct 12, 2009)

hola amigos disculpen la molestia pero alguien me puede dar un poco de información acerca de como hacer comunicacion usb desde lenguaje en basic si hay como en el programa microcode studio gracias y disculpando la ignoraancia


----------



## Moyano Jonathan (Oct 12, 2009)

Mikrobasic tiene ejemplos en su web


----------



## Alber Moremont (Oct 13, 2009)

vikthor dijo:


> Hola, labview se enlazar con VB6 y VS2088, el programa se llama _*"Measurement Studio"*_, todos lo controles visuales de labview se los puede utilizar. es una maravilla, yo lo utilice para graficar la funciones de ecuaciones diferenciales la entrada y la salida como una especie de osciloscopio. lo busco y lo subo
> 
> les recomiendo esta pagina http://www.sandpile.org/docs/intel/usb.htm


 
OK vikthor no lo sabia, yo solo habia podido agregar esos componentes de labview, pero esta de maravilla el poder usar todos los controles porque facilita mucho las cosas...yo tambien buscaré algo y en cuanto puerda informaciónrmar algo lo haré.

Saludos a todos los del foro!!!


----------



## Rijiru (Oct 14, 2009)

Hola, acabo de programar un convertidor de RS232 a USB pero en el simulador proteus no presenta actividad el bus USB y al finalizar me indica uno de los mensajes que D+ y D- no estan modelados.


----------



## diego_z (Oct 14, 2009)

para que funcione debes instalar los drivers del isis, inicio todos los programas


----------



## pauloss (Oct 16, 2009)

HoOla a todos soy nuevo en el foro y he ejecutado los primeros programas que se postearon(moyano) con HID y tengo un pequeño problema, me piden los drivers
segun he llevado la lectura de desde la primera pagina y primero si se pusieron los drivers pero en estos de HID no los pone por que segun son plug and play pero el administrador de dispositivos me pide el driver..podrian decirme cual es mi errror o que me hace falta..
Gracias a todos por sus aportaciones..he estado aprendiendo


----------



## pauloss (Oct 16, 2009)

Por ejemplo simulo en el proteus el ejemplo n1 de HID y me aparece en el administrador de dispositivos que falta MoyaPic_easyHID......


----------



## Moyano Jonathan (Oct 16, 2009)

Todos los ejemplos de HID solo funcionan bien en Windows XP. Muy pocos los he probado en vista y posteriores. En caso de que les pida los drivers al instalar un dispositivo HID es por que o tienen un error en windows.. o que han cometido un error de programación o conexionado del micro.

En el caso de proteus haty que instalar los drivers del USB virtual para que funcionen los proyectos del PIC18F2550.

En los casos de errores con el programa , por favor posteen los errores de programación junto con el programa en cuestión para ver el problema más de cerca.

En casos de que consideren un error en algún esquemático por favor posteen el esquemático con el error marcado.

Un saludo y espero puedan resolver sus problemas !


----------



## Armando702 (Oct 17, 2009)

Buenas! yo estoy haciendo en mi proyecto de grado un osciloscopio con un 18F4550 con el compilador CCS y para el software visual basic 6.0, encontre un programa llamado easyHID el cual genera el codigo base para la comunicacion USB en visual basic, mi problema es q no estoy obteniendo las velocidades q necesito por q tengo entendido q con Full Speed se puede tener una velocidad de transmision de 1000 paquetes de 64 byte por segundo. Genere en easyHID dos programas, uno con un intervalo de recepcion (polling) de 10ms y otro de 1ms, y de verdad q no veo donde esta la configuracion de los tiempos de recepcion. Tampoco se como modificar la libreria q trae CCS para q trabaje a su maxima velocidad. Les agradeceria todo la ayuda posible!


----------



## en_el_camino (Oct 17, 2009)

> ademas se planta en este bucle de usb.c
> 
> void usb_wait_for_enumeration(void) {
> while (USB_stack_status.curr_config == 0) {restart_wdt();}
> }


Hola Matquin, yo tenía el mismo problema y descubrí que el problema está en el orden en que se hacen los "includes". El "include" de los descriptores del USB en las ultimas versiones del CCS debe hacerse antes del pic18_usb.h
Saludos


----------



## Hernan83 (Oct 17, 2009)

Pregunta: en el CCS,en la pestaña de compile,que pongo PCH 12,14 o 16 bits?? Gracias!


----------



## Moyano Jonathan (Oct 18, 2009)

Se configura automáticamente pero tendrías que poner opcode de 16bits ....si programas para PIC18


----------



## mandeb48 (Oct 20, 2009)

Buenas: ¿quería saber si alguien intento abrir mas de un puerto virtual al mismo tiempo en los ejemplos de comunicación CDC?
Mis intentos de hacer esto como de cambiar la velocidad de transmisión han fracasado miserablemente.

Gracias


----------



## Moyano Jonathan (Oct 20, 2009)

Nunca he probado de abrir más de un puerto virtual  a la misma vez.......pero de cambiar la velocidad la tenés que hacer cuando haces el programa para el pic. En mi manual de USB que he estado posteando aparece como hacerlo. Fijate en los hilos anteriores por la página 26 en adelante


----------



## foso (Oct 25, 2009)

Hola lei que tenian armado unos manuales Meta y Moyano. De donde los puedo sacar ??? . Me interesa el tema de comunicacion po USB y me es realmente complicado. Gracias


----------



## Moyano Jonathan (Oct 25, 2009)

primero que nada empeza a leer lo que está escrito en el foro , que está en un marco más práctico. Luego podrías ir viendo el manual que se encuentra desde la página 24 del hilo en adelante.


----------



## nicolas8702 (Oct 26, 2009)

Hola  a todos los felicito por su amplia investigacion con el usb me ha ayudado mucho con el desarrollo de un proyecto  que estoy haciendo con usb y matlab  mi trabajo  ha sido realisar una targetade adquicicion con el usb bulk con tan malos resultados que solo he podido ver senales de 15 hz o inferiores no se si estare haciendo algo mal en el pic o en matlab o si es por el dichoso retardo de la mpusbapi en todo caso ahora estoy intentando con easy hid pero no secomo comunicarlo con matlab  y como para participar hay  que dejar un aporte aqui les dejo mi programa del pic y en matlab  ademas de un programa de comunicacion en labview que encontre en el foro el cual comunica el picbulk con la pc para que alguien lo aproveche

les agradezco de antemano


----------



## Clave911 (Oct 30, 2009)

Donde consigo las librerías de CDC  y como las incorporo al mpLab


----------



## Moyano Jonathan (Oct 31, 2009)

en la carpeta del programa PICC , dentro de ella se encuentra una carpeta que se llama drivers.
Los documentos al mplab se incorporan solos , lo unico que tenes que hacer es declararlo en tu codigo fuente.

Un saludo !


----------



## Clave911 (Oct 31, 2009)

Eso es lo que supuse. Sin embargo, cuando intente compilar el codigo que subiste en tu primer post de este tema, al intentar compilarlo, el usb.h no lo encontra. Soy bastante nuevo en todo.


----------



## Moyano Jonathan (Oct 31, 2009)

Fijate que versión del compilador estás usando por que las versiones viejas producen errores y depende desde que versión te va incluir las definicione para USB.


----------



## Clave911 (Nov 1, 2009)

Instale  el MPLAb v8.36 , luego el MCHPFSUSB v2.5b , más tarde cree un proyecto según como esta explicado en MPLAB-C18-Getting-Started. Sin embargo, al copiar el codigo(ejercicio_n1_174) explicado en el primer post de este tema, no me reconoce ciertos .h tales como usb.h.  
Por otro lado, note que al instalar MCHPFSUSB v2.5b, era posible encontrar las librerías que estaba necesitan en "C:\MCHPFSUSB\fw\Cdc”. 
Por lo que entonces, quería saber como hago para importarlas al mpLab para poder usarlas y que de todo lo que se encuentra en C:\MCHPFSUSB\fw\Cdc he de usar para poder probar lo que se explico en el primer post de este tema.


----------



## FRYCK (Nov 5, 2009)

hola  Moyano  me  interesa  saber  si  as  probado   estos driver  en vista  o si hay  alguno que me sirva  para este  sistema  operativo   lo que  me  produce  esa  inquietud  es que  realice   una  aplicación en  visual c++  en mfc    utilizando  unos driver  que  a  posteado  palitroques  en  algún lado   en  xp  corrió bien  pero  a la  hora  de correrlos en vista  me   reconoce  el  dispositivo  pero  los datos  me  dan erróneos  no se si fue  a  causa del driver  o  otro sea el motivo  
gracias
att Fran Restrepo

http://www.migsantiago.com/index.php?option=com_content&view=article&id=9&Itemid=10


----------



## mikepvr (Nov 5, 2009)

Hola amigos, soy nuevo en este foro, he leido desde el primer post y vaya que son bastantes  Gracias aMoyano me he sacado de muchas dudas, pero quiero concretar mis repuestas ya que no soy tan experto en la programada de PICs.
Para empezar quiero comentar que estoy elaborando un proyecto para controlar procesos de produccion. Ahora mi duda es esta... quiero hacer lo mismo como en las gasolineras que te dice la cantidad de litros que se vaciaron, la diferencia que esta sera gobernada por una PC; estoy haciendo una aplicacion en basic para obtener esos resultados. Ahora ya tengo un dispositivo que arme (medidor de flujo) que arroja "x" pulsos por cada litro, y utilizare interfaz USB para enviar los datos al ordenador, tengo a la mano el PIC18F2550, tengo el grabador y y utilizare ccs con el pwc, mi duda es la elaboracion del programa para el PIC, que configuracion tengo que tomar en cuenta tanto de los parametros como de la conexion del circuito, ia tenog la idea ,, pero si peden sugerirme que puedo tomar en cuenta para hacer mi programa.. 

Nota: La funcion es esta, en la aplicacion VB6 se escoge el tipo de recipiente  por ejemplo: 20 litros, y manda la instruccion para que el medidor de flujo solo deje pasar 20 litros y al llegar  a los 20 litros mandar a cerrar la valvula. Pero la aplicacion de basic debe de visualizar los litros que que se vaciaron o bien pasaron por el medidor en tiempo real. La cosa es migrar los pulsos a la aplicacion vb6. 

Bueno me extendi :s, espero sus aportaciones. Gracias a todos .. Saludos


----------



## vikthor (Nov 8, 2009)

Aca les dejo el uso del vb6+labview+usb




http://img266.imageshack.us/i/pantallad.jpg/




termino las prueba y el hardware y lo subo completo


----------



## Meta (Nov 8, 2009)

Que trabajo. Muy bien hecho. Ojalá aparezca algo de manual para poder por fin manejar el puerto USB algún día para aprender apagar y encender Led.


----------



## Moyano Jonathan (Nov 8, 2009)

ajjajaajja , meta pero si ese ejemplo está dentro de este hilo


----------



## Meta (Nov 9, 2009)

¿Qué tal?
Hace tiempo que no lo sigo, ejejje. Bueno, epero que el proyecto USB siga adelante. Si llega USB 3.0 en navidades llegas las nuevas placas bases y tarjetas, en temas de PIC con USB 3.0 me da que tardarán en venderlo hasta que mucha gente tenga USB 3.0.


----------



## Moyano Jonathan (Nov 10, 2009)

En temas de PIC con USB lo veo muy complicado hasta dentro de varios años.....ahora en españa veo que están llegando  muchos dispositivos con el nuevo protocolo de comunicaciones.


----------



## Meta (Nov 10, 2009)

*¿Cuál protocolos nuevos?* Si en España llegan protocolos nuevos, en resto del mundo también.


----------



## Moyano Jonathan (Nov 10, 2009)

El protocolo USB 3.0
por ejemplo Blue ray ustedes lo tienen hace ya 2 años ....cuando acá recién se está poniendo a la venta a precios altisimos.
Lo que yo te digo es el tema de la brecha digital q hay...acá por donde yo vivo es bastante complicado conseguir ciertas cosas y si las conseguis las tenés que pagar como si fueran oro.


----------



## Meta (Nov 10, 2009)

A, entiendo. En EE.UU. lo usan 5 años antes que España. muchas cosas. Hoy en día con Ebay, hay cosas que no frenan.

Vendrán rápido. Argentina vende muchos PIC que hasta creo que en España.


----------



## andrumic23 (Nov 10, 2009)

Hola Amigos del foro, les cuento que yo estoy haciendo un proyecto con un PIC18F4550 conectado vía USB, el software que utilice fue el CCS C, y el visual Basic 6.0,... El proyecto es censillo, se trata de un pequeño programa en visual Basic en el cual yo coloco en binario 4 números por ejemplo 0001 1001 0101 0111 = 1957... y la idea es que este numero 1957 aparezca en 4 displays utilizando únicamente 8 salidas del pic, por lo tanto utilizo 4 para un decodificador y las otras cuatro para manejar 4 transistores que me activan los displays.

Todo va muy bien, ya tengo la comunicación USB y ya se ven los numeros en los dislays, el problema que tengo es que los displeys prenden y apagan mucho y esto se debe a que el visual basic no es capas de hacerlo lo suficientemente rapido como para que no titilen los displays, por este motivo necesito que los datos que envia el visual basic los guarde el pic18f4550 y los muestre continuamente… y no se como hacer esto.

*Por favor una ayudita...*

Este es el programa del pic.


```
//*************************************************************************
//                            PicUSB.c
// Realizado con el compilador CCS por Andrés Felipe Gómez Rendón
// *************************************************************************
 
#include    <18F4550.h>
#fuses      HSPLL,            //CRISTAL DE ALTA VELOCIDAD
#fuses      NOWDT,            //NO TRABAJAR CON EL PERRO GUARDIAN.
#fuses      PROTECT,          //PROTEGER EL CODIGO DE LECTURAS
#fuses      EBTR,             //PROTEGER LA MEMORIA DE LECTURAS
#fuses      CPD,              //PROTEGER LA EEPROM DE LECTURAS
#fuses      CPB,              //PROTEGE EL CODIGO DE BITS DE LECTURAS
#fuses      EBTRB,            //PROTEGE LA TABLA DE LECTURAS
#fuses      NOLVP,            //NO PERMITE LA PROGRAMACION A BAJO VOLTAGE
#fuses      NODEBUG,          //LO PROTEGE DE LECTURAS
#fuses      USBDIV,           //EL RELOJ DEL PLL DE USB SE DIVIDE X 2
#fuses      PLL5,             //DIVIDE POR 5 EL OCSILADOR DE 20MHZ
#fuses      CPUDIV1,          //NO DIVIDA EL RELOJ 
#fuses      VREGEN,           //REGULADOR DE VOLTAJE USB ACTIVO
#fuses      MCLR,             //EL PIN DE MASTER CLEAR ESTA ACTIVO.
#fuses      LPT1OSC,          //EL OXILADOR CONSUME MAS ENERGIA PERO ES MAS ESTABLE AL RUIDO.
#fuses      FCMEN,            //MONITOREA EL OXILADOR Y SI DETECTA UNA FALLA PASA A RELOJ INTERNO..
 
#use        delay(clock= 20000000)                                      // Cristal de 20MHz
 
 
// =========================================================================
// Definiciones para la librería dinámica CCS. Para la configuración dinámica
// hay que definir algunos valores. Están explicados en usb.h
// =========================================================================
 
#define     USB_HID_DEVICE      FALSE                                   // Deshabilitamos el uso de las directivas HID
#define     USB_EP1_TX_ENABLE   USB_ENABLE_BULK                         // Activa EP1(EndPoint1) para las transferencias IN Bulk/Interrupt
#define     USB_EP1_RX_ENABLE   USB_ENABLE_BULK                         // Activa EP1(EndPoint1) para las transferencias OUT Bulk/Interrupt
#define     USB_EP1_TX_SIZE     4                                       // Tamaño reservado para el Buffer Tx EndPoint1
#define     USB_EP1_RX_SIZE     3                                       // Tamaño reservado para el Buffer Rx EndPoint1
 
#include    <pic18_usb.h>                                               // Microchip PIC18Fxx5x Hardware para el CCS PIC USB Driver
#include    <PicUSB.h>                                                  // Configuración del USB y los descriptores para este dispositivo
#include    <usb.c>                                                     // Handles usb ,tokens y descriptores
 
 
// =========================================================================
[/COLOR]
[COLOR=#505050]// =========================================================================
 
#define     LED7            PIN_B7                                      // PORTE.2 OUT DISPLAYS_1 DIS_4 RE7(40)
#define     LED6            PIN_B6                                      // PORTE.2 OUT DISPLAYS_1 DIS_3 RE6(39)
#define     LED5            PIN_B5                                      // PORTB.7 OUT DISPLAYS_1 DIS_2 RB5(48)
#define     LED4            PIN_B4                                      // PORTB.6 OUT DISPLAYS_1 DIS_1 RB4(37)
#define     LED3            PIN_B3                                      // PORTB.5 OUT DISPLAYS_1 BIT_3 RB3(36)
#define     LED2            PIN_B2                                      // PORTB.4 OUT DISPLAYS_1 BIT_2 RB2(35)
#define     LED1            PIN_B1                                      // PORTB.3 OUT DISPLAYS_1 BIT_1 RB1(34)
#define     LED0            PIN_B0                                      // PORTB.2 OUT DISPLAYS_1 BIT_0 RB0(33)
 
#define     LED_ON          output_high                                 // Salida en alto
#define     LED_OFF         output_low                                  // Salida en bajo
 
#define     modo            recibe[0]                                   // Byte que indica el modo de operación
#define     param1          recibe[1]                                   // Primer parámetro recibdo
#define     param2          recibe[2]                                   // Segundo parámetro recibdo
 
#define     entrada_0       envia[0]                                    // Byte a envíar en las entradas
#define     entrada_1       envia[1]                                    // Byte a envíar en las entradas
#define     entrada_2       envia[2]                                    // Byte a envíar en las entradas
#define     entrada_3       envia[3]                                    // Byte a envíar en las entradas
 
#define     APAGA_LED       0
#define     ENCIENDE_LED    1  
 
void main(void)                                                         // Función Principal
{
   int8    recibe[3];                                                  // Declaramos la variable recibe de 3 bytes
   int8    envia[4];                                                   // Declaramos la variable envía de 4 bytes
 
 
   set_tris_B(0B11111111); // Nibble bajo entradas, el alto salidas
 
   usb_init();                                                         // Inicializamos el USB
 
   usb_task();                                                         // Habilita el periferico usb y las interrupciones
   usb_wait_for_enumeration();                                         // Esperamos hasta que el PicUSB sea configurado por el PC
 
  if(usb_enumerated())                                                // Si el PicUSB está configurado
 
     while (TRUE)                                                        // Se cumple siempre (Bucle infinito)
   {
 
       if(usb_enumerated())                                            // Si el PicUSB está configurado
       {
 
           if (usb_kbhit(1))                                           // Si el EndPoint de salida contiene datos del PC
           {
               usb_get_packet(1, recibe, 3);                           // Cojemos el paquete de tamaño 3 bytes del EP1
                                                                       // y lo almacenamos en la variable recibe
 
 
               if (modo==ENCIENDE_LED)                                 // Modo Encender Leds
{
 
 
 
                   if (param1==1) {LED_ON(LED0);}                      // Encendemos led 0
                   if (param1==2) {LED_ON(LED1);}                      // Encendemos led 1
                   if (param1==3) {LED_ON(LED2);}                      // Encendemos led 2
                   if (param1==4) {LED_ON(LED3);}                      // Encendemos led 3
                   if (param1==5) {LED_ON(LED4);}                      // Encendemos led 4
                   if (param1==6) {LED_ON(LED5);}                      // Encendemos led 5
                   if (param1==7) {LED_ON(LED6);}                      // Encendemos led 6
                   if (param1==8) {LED_ON(LED7);}                      // Encendemos led 7
}
 
 
               if (modo==APAGA_LED)                                    // Modo Apagar Leds
{
 
                   if (param1==1) {LED_OFF(LED0);}                     // Apagamos led 0
                   if (param1==2) {LED_OFF(LED1);}                     // Apagamos led 1
                   if (param1==3) {LED_OFF(LED2);}                     // Apagamos led 2
                   if (param1==4) {LED_OFF(LED3);}                     // Apagamos led 3
                   if (param1==5) {LED_OFF(LED4);}                     // Apagamos led 4
                   if (param1==6) {LED_OFF(LED5);}                     // Apagamos led 5
                   if (param1==7) {LED_OFF(LED6);}                     // Apagamos led 6
                   if (param1==8) {LED_OFF(LED7);}                     // Apagamos led 7
 
}
 
 
                 }
 
 
 
               }
 
 
           }
       }
```
 
Muchas gracias.

bye.


----------



## Moyano Jonathan (Nov 10, 2009)

Y si estás usando un timer en el visual basic para que refresque los datos tendrías que ver de bajar bajar el tiempo de refresco para que muestre los datos más rápido. Me parece muy poco factible poder aumentar la velocidad de datos que envía el PIC por USB ... aunque me parece que se puede ( pero no se hacerlo ).
Un saludo !


----------



## tavo911 (Nov 12, 2009)

Saludos soy nuevo en el foro, muy buena ayuda moyano he aprendido mucho sobre programacion en pic, quisiera saber si alguien sabe como realizar el programa de adquisición no por Visual, sino por Matlab, estoy en un proyecto y no se como comunicar usb y matlab, lei el foro y *Nicolas8702*. tiene un programa que comunica usb matlab, sin embargo solo viene el programa en labview, le agradeceria mucho a *nicolas8702* si me puede ayudar.
Gracias


----------



## ChoN (Nov 14, 2009)

Hola Jonathan, no puedo más que felicitarte por tanto empeño y dedicación, y además de eso compartirlo con todo el mundo.
Te comento que yo trabaje bastante con USB en modo Bulk, enlazandolo con Visual C# y Labview, en algunos proyectos que tengo que acomodar para poder postear.
Te comento que hasta ahora no había podido solucionar el problema del modo HID, hasta que me hiciste ver la luz!
En los ejemplos que posteaste, no he podido simularlos en proteus ya que falta el archivo inf que pide windows cuando detecta el hard, ¿Cómo solucionas esto?
Desde ya muchas gracias.


----------



## Moyano Jonathan (Nov 14, 2009)

HID te lo tiene que detectar directamente windows no hace falta los drivers para la comunicación ya que utiliza el driver nativo que trae windows.


----------



## ChoN (Nov 15, 2009)

El que te comento es el ejemplo 6 de HID que posteaste, el caso de simulación bidireccional. Adjunto el archivo de simulación en proteus. Compile con CCS joya, cuando "conecto" el USB en proteus me pide si o si drivers, probe de todas formas y no hay caso . Esto en windows XP.
Saludos.

Adjunto ahora uno de mis proyectos anteriores, usa el modo BULK y Visual C# en la PC.
Esto fué realizado para un control de acceso, cuenta con una pantalla LCD, teclado, algunos LED y un Buzzer.
En los archivos adjuntos está la simulacion en proteus, el PDF con placa y esquemático, y el programa de prueba de la PC, y el código de fuente del micro para CCS.
Saludos.


----------



## noriad (Nov 16, 2009)

Tengo un pic 18f4550 montado en una placa con su oscilador  , osea todo un  hadware    con capacidad de funcionar , pero no se como programarlo.

Como lo hago , que herramientas puedo utilizar una vez que tenga el *.hex

gracias  antemano


----------



## ChoN (Nov 17, 2009)

noriad dijo:


> Tengo un pic 18f4550 montado en una placa con su oscilador , osea todo un hadware con capacidad de funcionar , pero no se como programarlo.
> 
> Como lo hago , que herramientas puedo utilizar una vez que tenga el *.hex
> 
> gracias antemano


 
Vas a necesitar un grabador, y el software correspondiente. Te aconsejo que empieces por acá: https://www.forosdeelectronica.com/f24/curso-completo-microcontroladores-pic-10113/

Saludos.


----------



## Meta (Nov 17, 2009)

Hoa a tod@s:

He encontrado más aporte sobre USB con vídeos y todo.

http://www.neoteo.com/conecta-tus-proyectos-al-puerto-usb.neo

Saludo.


----------



## Moyano Jonathan (Nov 17, 2009)

Está muy bueno el link que pasaste


----------



## Meta (Nov 17, 2009)

¿Qué tal Moyano?

Para no leer todo, ¿has puesto un tercer manual o más? Me metí en clases de programaciónde 3 años _(el 1er año no tocamos nada de programación, grgrgrgrgrgr)_, y me pegué casi tres meses sin entrar, leer todo me lleva tiempazo.

En cuando lo del enlace de arriba, me da la impresión que es un visitante de estos foros que han sacado tu idea y la amplió. ¿No te extraña? Quizás sean cosas mias.

Saludo.


----------



## ChoN (Nov 17, 2009)

Meta dijo:


> ¿Qué tal Moyano?
> 
> Para no leer todo, ¿has puesto un tercer manual o más? Me metí en clases de programaciónde 3 años _(el 1er año no tocamos nada de programación, grgrgrgrgrgr)_, y me pegué casi tres meses sin entrar, leer todo me lleva tiempazo.
> 
> ...


 
No hay tercer manual, y quedate tranquilo, que no le robe la idea a nadie. 
Pertenezco al foro mucho antes que vos y que no postee compulsivamente no quiere decir que no soy un gran lector del mismo.
Fijate la fecha de los archivos que adjunte y vas a ver que tienen más de un año. Sólo usé en su momento, la base de la DLL de microchip para enlazar con VC# que supo desarrollar otro user del foro hace tiempo (J1M).
Me interesó el tema, ya que en su momento no logre hacer funcionar el modo HID, satisfactoriamente, y el modo BULK terminó siendo impráctico por no poder trabajar por interrupción.
Se que teóricamente no se necesitan drivers, pero tube que poner manualmente en windows que era un dispositivo HID para que lo levantara correctamente. Logrado esto, probé el programa, pero se recontra tilda y no anda, probablemente sea un problema del Proteus.
Saludos.


----------



## Meta (Nov 17, 2009)

Hola ChoN:

Entonces fue cosas mías, perdón por desconfiado. En cuanto a robar, dije coger, coger es obtener una idea o parte de ella ya que el USB existe y no fuimos nosotros quien la inventó. Robar se llama, decir que es idea tuya bajo tu nombre sin permiso de su autor y procurar que nadie se entere, si se netera, lo desacredita hasta la médula, defiende la idea como si fuera suya. Robar suena un poco fuerte. He hecho manuales del puerto serie Con Visual C#, Visual C++ y Visual Basic y he cogido ideas presisamente en estos foros, otros me lo han dado ellos mismos (también en foros en inglés y web) y otras ideas me salieron cuando estaba haciendo experimento.

Disculpe usted por la mala interpretación y me alegro que seas noble..

En cuanto a la Web, buen trabajo, así de claro.

Por cierto, ¿puedo pasarlo a .pdf y ponerlo en mi blog?

PD: _Tranquilo que pongo su autor._


----------



## ChoN (Nov 17, 2009)

Bueno, en Argentina cogerse a alguien, también suena bastante fuerte!!! 
Sin problemas, estamos para compartir información y aprender todos 
Sigo con la duda del ejemplo, será proteus? Voy a probarlo con el dispositivo físico a ver que pasa.
Saludos.


----------



## Meta (Nov 17, 2009)

Por fin nos entendemos, soy español, es bueno saber otras culturas para que haya buenas interpretaciones.

Lo de proteus, a mi hermano que logró comunicar gracias a la web de J1m, (partiendo) esa idea con 18F4550 y 18F2550 bajo C++, físicamente le funciona bien, en cuanto a la virtualización del USB con Proteus a veces le funciona a veces no, tienen que mejorar bastante su funcionalidad, que pronto se acerca hasta lo snuevos PIC de USB 3.0.


----------



## Moyano Jonathan (Nov 17, 2009)

La virtualización de USB consume recursos enormes del CPU por eso se tilda y a veces no funciona. Es mejor montar un circuito en el protoboard y probar su funcionamiento ahi.


----------



## seaarg (Nov 18, 2009)

Tengo una duda existencial:

En unos ejemplos con el 18F2550 lo utilizan para transmitir info por usb a un puerto serial virtual en la PC. Despues leen esa info desde un programa visual basic, o una terminal serial (como hyperterminal). La pregunta del millon es: ¿Que configuracion de baudios, paridad, bits, etc. le ponen a el MSComm o a la terminal?

Tambien, la velocidad de transferencia tiene algo que ver con dicha configuracion? En un rs232 real obviamente que si, pero ¿en esta virtualizacion? ¿Que velocidad de transfer se puede alcanzar desde el pic a la PC?

Estoy haciendo un osciloscopio digital, version usb (ya hice uno por puerto paralelo, que captura a una memoria y despues envia todo junto)

Saludos!


----------



## noriad (Nov 20, 2009)

Para la  programacion icsp del pic 18f4550  que soft en la pc utilizan , y si me lo pueden facilitar.
gracias de antemano

PD Chon gracias por la recomendacion de veras que si


----------



## mikepvr (Nov 20, 2009)

Hola, saludos.. quiero sacar una duda, ya que he empezado un proyecto en donde utilizo usb, pero he estado investigando mas acerca de HID y  bulk transfer, pero quiero acertar mas mi respuesta.
La pregunta es, que tipo de clase me conviene usar? Mi proyecto consta de: un sensor manda la señal al pic (estados bajos) y contará la cantidad de esos estados y al llegar al numero deseado, por la salida x que desactive una valvula. Por otro lado otro sensor que active la valvula. Y una apicacion en VB que muestre el conteo de los estados bajos que emite el sensor en tiempo real. Que se sugiere utilizar?


----------



## Dolphinr2d2 (Nov 22, 2009)

Tengo una pregunta quiza un poco obvia para algunos, de antemano muchas gracias, voy a trabajar con el microcontrolador 18F14K50 se suponde que lo que voy a hacer es transmitir datos al pc y viseversa en el PC se exhiben los datos a travez de la interfaz y los datos enviados al PIC se exciben en un LCD, que cristal oscilador es recomendable utilizar para este tipo de transacciones?


----------



## comandojonh (Nov 22, 2009)

Meta dijo:


> Si sabes C, sabrás usar el Visual C++ en el cual estoy haciendo el manual.
> 
> El código para enviar tramas por fin me  salió. Ahora me falta el Visual Basic 2008.



Disculpa pero me podrias ayudar con el envio de tramas al pic 18f4550


----------



## ChoN (Nov 22, 2009)

noriad dijo:


> Para la  programacion icsp del pic 18f4550  que soft en la pc utilizan , y si me lo pueden facilitar.
> gracias de antemano
> 
> PD Chon gracias por la recomendacion de veras que si



Además del soft de la PC vas a necesitar un programador, te recomiento winpic800, buscalo en google y vas a encontrar mucha información para armarlo, y el soft, para mi el mejor freeware es icprog.

El modo BULK transfer se utiliza para transferencia masiva de información, y es inpráctico para dispositivos que envían o reciben información con poca regularidad, o poca cantidad, además no funciona de manera asíncrona. Les recomiendo el modo HID para sus aplicaciones.
Saludos.


----------



## Meta (Nov 22, 2009)

comandojonh dijo:


> Disculpa pero me podrias ayudar con el envio de tramas al pic 18f4550



Hola:

¿Con cuál lenguaje? ¿C#, C++ o Visual Basic net?

Saludo.


----------



## george.manson.69 (Nov 24, 2009)

hola!! tengo un problema con el USB y el pic18F4550. cuando conecto el cable del USB a la compu, prende el led conexion, pero no me reconnoce el PIC, estoy usando un capacidor en el pin VUSB de 47nF, pero he visto que usan 470nf, tiene que ser de afuerzas ese capacitor de 470nf?

o que mas podria ser?

estoy usando el PIN_SENSE PIN_B2...

ESTA ES EL ESQUEMA TAL COMO LO TENGO FISICAMENTE


----------



## ChoN (Nov 26, 2009)

george.manson.69 dijo:


> hola!! tengo un problema con el USB y el pic18F4550. cuando conecto el cable del USB a la compu, prende el led conexion, pero no me reconnoce el PIC, estoy usando un capacidor en el pin VUSB de 47nF, pero he visto que usan 470nf, tiene que ser de afuerzas ese capacitor de 470nf?
> 
> o que mas podria ser?
> 
> ...


 
Hola, Porque ponés la línea de Vdd del USB directo al RB2?
Yo uso 47 uF y anda bien. Ponele una R y un cap en la pata de reset.
Saludos.


----------



## george.manson.69 (Nov 27, 2009)

lo uso para detectar cuando se conecta el USB a la computadora!!!
y caundo se desconecta el USB este me detecte que se desconecto,
...
usas un capacitor electrolitico o ceramico en el pin VUSB?
estoy usando uno ceramico....como tienes el esquema..me lo podrias poner para ver que tengo mal...y si tengo una resistencia en Vpp...y un capacitor s eme olvido ponerlo en el esquema..jejejje...saludos!!


----------



## ChoN (Nov 30, 2009)

george.manson.69 dijo:


> lo uso para detectar cuando se conecta el USB
> usas un capacitor electrolitico o ceramico en el pin VUSB?
> estoy usando uno ceramico....como tienes el esquema..me lo podrias poner para ver que tengo mal...y si tengo una resistencia en Vpp...y un capacitor s eme olvido ponerlo en el esquema..jejejje...saludos!!


 
Un electrolítico de 47 uF.
Saludos.


----------



## proyectista (Nov 30, 2009)

Hola buenas, tengo el siguiente problema al realizar una interrupcion por timer con el pic 18f4550 aver si alguien puede ayudarme a encontrar el problema. El problema es que el timer interrumpe un nº muy bajo de veces (17 veces en mi caso) y se queda sin interrumpir mas,no consigue llegar al final del contador (0xff). el esquema que tengo es el siguiente:


```
int32 const num_int=0xff;
   int32 tiempo=0;
   int8 modo_sleep;

#int_timer1
void diezsegundos()
   {
      if (tiempo>num_int)
         {
            modo_sleep=false;               
            tiempo=0;
         }
      else
         {
            modo_sleep=true;
            tiempo++;
         }
      clear_interrupt(int_timer1);
   }



void main(void) 
   setup_timer_1(t1_internal | t1_div_by_8);
   set_timer1(0);
   enable_interrupts(int_timer1);
   enable_interrupts(GLOBAL);  

while (TRUE)
   {
   while (modo_sleep)
      {
         sleep();
      }

   // RESTO DE PROGRAMA

   

   }
```
Gracias de antemano.


----------



## Moyano Jonathan (Nov 30, 2009)

Este hilo habla sobre el puerto USB y sus aplicaciones , por favor si fueras tan amable de abrir un hilo de discución propio sobre tu problema.


----------



## noriad (Dic 1, 2009)

amigos me hace falta salir de una duda:que ventaja tiene programar en c para pic  y no en esamblador. mi pregunta es si puedo hacer lo mismo que hago en   ensamblador lo puedo hacer en c para pic.Yo se que en ensamblador es mas dificil  programar  el usb  pero tiene que tener sus ventajas, yo se algunas , pero necesito el criterio de algunos de ustedes. gracias de antemano.lo pregunto porque yo programo  el usb en ensamblador puro con datasheet y el standard en la mano .


----------



## Moyano Jonathan (Dic 1, 2009)

Y si tenés ejemplos hechos en ensamblador con USB bunísimo...las ventajas es que con ensamblador vos sabés y tenés control de lo que hace el micro en cada momento...aunque hay cosas muy complicadas como tratamiento de arrays...funciones matemáticas y demás cosas que en ensamblador es demasiado complejo de hacer.


----------



## zidaemon (Dic 2, 2009)

Ya eh entendido mas el concepto del C, pero tengo problemas en conseguir el CSS, no sabras donde esta disponible alguna pagina por ejemplo, Muchas gracias por el tema.


----------



## cmanl (Dic 2, 2009)

Hola, Moyano Jonathan!

En primer lugar excusa la falta de hablar español (es traducida por Google), en segundo lugar, me gustaría decirles que este post sobre HOST / USB / PIC es magnífico.
En su primer ejercicio, me di cuenta de que muchas veces si se selecciona la misma opción (por ejemplo, 'x') y luego seleccionar la opción de otra ( 'a') falta de respuesta a la primera vez (que se muestra "Se recibe el caracter x") .
¿Sabes por qué sucede esto?

Gracias,
CManl
Portugal


----------



## me109zito (Dic 3, 2009)

hola a todos, está genial este post, yo tengo buenos conocimientos de programacion pero lo que es soldar, mas bien pocos, si alguno me indica donde podría conseguir una placa para el PIC18F2550 que tenga conector usb y a poder ser algo que permita conectar facilmente un cable a los pines de e/s del pic, me interesaria poder controlar una serie de reles y recibir informacion de un par de sensores, necesito conectarlo al pc para visualizar el estado de los puertos del pic y modificar en tiempo real algunos parametros.

Les agradeceria que me dijesen donde puedo conseguir una placa de este tipo y, si hay alguien que se maneje bien con un estañador, no me importaria pagarle para que me haga la placa (que me envie un privado), repito que de soldar ando muy mal.

Un saludo a todos.


----------



## pauloss (Dic 8, 2009)

saludos moyano? he estado haciendo mas ejemplos del HID basados en tus ejemplos
pero me he encontrado con un problema y es ke solo puedo enviar 2 bytes
mi pregunta es donde tengo ke modificar los descriptores para poder enviar mas de 2 bytes


----------



## Moyano Jonathan (Dic 8, 2009)

Hola paulo , como estás los descriptores los tenés que modificar tanto en el programa del pic como en el programa para la PC...Un saludo !


----------



## Hernan83 (Dic 8, 2009)

Y Jonathan? para cuando el manual completo de USB,esta muy bueno la verdad,y sobre todo porque apuntas al Visual Basic 2009.Saludos!


----------



## Meta (Dic 9, 2009)

Eso, eso. jejeje

Cuando te sientas en su piel, te darás cuenta que también tiene obligaciones y vida social.


----------



## Hernan83 (Dic 9, 2009)

Es verdad,yo tambien ando con finales para dar,y me engancho mucho a hacer cosas que es mas divertido que estudiar a veces. Aunque sea que lo tenga para el arbolito : )


----------



## Moyano Jonathan (Dic 9, 2009)

jaajjaajj me recibí el lunes...asi que estoy mas liberado ahora....el gran tema es que se me rompió la notebook y voy a tener que usar la computadora de la familia pero buee...de a poco lo voy a ir haciendo o terminando mejor dicho.

Y si como dice meta....las obligaciones y la vida social (asados, mujer, amigos y demás) demandan un cierto tiempo. Pero no se preocupen que yo no prometo en vano si dije que lo iba a terminar lo voy a terminar


----------



## ChoN (Dic 10, 2009)

Moyano Jonathan dijo:


> jaajjaajj me recibí el lunes...asi que estoy mas liberado ahora....el gran tema es que se me rompió la notebook y voy a tener que usar la computadora de la familia pero buee...de a poco lo voy a ir haciendo o terminando mejor dicho.
> 
> Y si como dice meta....las obligaciones y la vida social (asados, mujer, amigos y demás) demandan un cierto tiempo. Pero no se preocupen que yo no prometo en vano si dije que lo iba a terminar lo voy a terminar


Enhorabuena che! Felicitaciones! Ingeniería E. no?
Saludos.


----------



## Moyano Jonathan (Dic 10, 2009)

No. me recibí de tecnico electromecánico ( Me dieron el título que lo amerita ) ....estoy estudiando para entrar en ingeniería.


----------



## Moyano Jonathan (Dic 14, 2009)

*Hola a todos 
*Como había citado antes voy a proseguir con mi manual sobre el puerto USB y el control de dispositivos mediante USB.
Como he tenido muy poco tiempo con todas las cosas q he tenido que hacer el manual quedó de lado ..pero he comenzado mis vacaciones de verano asi que voy a seguir con esto a ver si puedo terminarlo 

*Lo primero que quedó pendiente desde antes de que dejara todo fue el pasaje de todos los ejemplos de VB 2005 a VB.net y VC# 2008, Así que ahora vamos a comenzar con la ayuda de ustedes a pasar los programas uno por uno.

Como varios de mis conocimientos se borraron cuando formateé mi computadora debido a un virus que le entró a mi máquina, voy a necesitar de su ayuda para poder ver algunos tips de programación que no me acuerdo.

Vamos a empezar con el sistema de emulación CDC usando un PIC18F2550, programación en C de CCS y Programación en VC# y VB.net para la PC.

Como hardware usaré mi entrenador USB.

El programa que se desarrollará tendrá los siguientes elementos:

*- Detección automática de puertos y selección de puerto a utilizar mediante un ComBox.
- Envio y recepción de datos : Control de 8 cargas y Lectura de 8 entradas.
- Lectura de 3 entradas analógicas.
- Vizualización de datos desde el PIC: Mensajes y alertas así como debug de la programación.
- Conexión y desconexión del puerto en caliente.

Yo comenzaré desde mañana con el desarrollo del programa y de a poco lo iremos desarrollado en conjunto con toda la documentación que estará en el manual.

Luego seguiremos con las otras formas de comunicación.

Un saludo ! 

Los programas serán código abierto para que cualquiera pueda añadir sus ideas al proyecto para poder mejorarlo ...asi también los ejemplos los compilare para .net frameworck 2.0 para winXP ...también funcionará en vista  y en windows 7


----------



## Meta (Dic 14, 2009)

Me alegro que tengas tiempo y sigas adelante. En estos momentos estoy haciendo la versión V2 del PicRS232.

Voy a intentar ayudar en C# y después lo pasamos  a VB .net si le interesa.

He logrado hacer la detección del puerto serie hasta los virtuales, no se si en USB es un tema diferente.


*

El programa que se desarrollará tendrá los siguientes elementos:

 *- Detección automática de puertos y selección de puerto a utilizar mediante un ComBox.

En puerto serie lo tengo hecho. Averiguaré si USB es algo parecido.



```
#region Configurar puerto serie.

        private void SeleccionCambiada(object sender, EventArgs e)
        {

            // Deberemos añadir un control de excepciones si queremos capturar posibles errores



            // Para reasignar valores... primero cerrar el puerto
            serialPort1.Close();

            // Asignar los nuevos Settings
            serialPort1.BaudRate = Convert.ToInt32(comboBox_bits_por_segundo.Text);
            try
            {
                serialPort1.DataBits = Convert.ToInt16(comboBox_bits_de_datos.Text);
            }
            catch (FormatException)
            {
                //label_info.Visible = true;
                //label_info.Text = "No se usa este parámetro.";
            }
            serialPort1.Parity = (Parity)Enum.Parse(typeof(Parity), comboBox_paridad.Text);
            serialPort1.Handshake = (Handshake)Enum.Parse(typeof(Handshake), comboBox_control_de_flujo.Text);

            try
            {
                serialPort1.StopBits = (StopBits)Enum.Parse(typeof(StopBits), comboBox_bits_de_parada.Text);
            }
            catch (ArgumentOutOfRangeException)
            {
                // No se puede poner None.
                //label_info.Visible = true;
                //label_info.Text = "Inválido al introducir el valor 'None'.";
            }

            serialPort1.Open();


        }
        #endregion

        private void comboBox_puerto_com_SelectedIndexChanged(object sender, EventArgs e)
        {
            serialPort1.Close();
            serialPort1.PortName = comboBox_puerto_com.SelectedItem.ToString();
            serialPort1.Open();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            // Asignar las Velocidades seleccionables al Combo
            object[] Velocidades = { 300, 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200 };
            comboBox_bits_por_segundo.Items.AddRange(Velocidades);

            object[] BitData = { 8, 7, 6 };
            comboBox_bits_de_datos.Items.AddRange(BitData);

            // Asignar Paridades Seleccionables desde la enumeracion
            foreach (string s in Enum.GetNames(typeof(Parity)))
            {
                comboBox_paridad.Items.Add(s);
            }

            // Asignar Bits de datos seleccionables desde la enumeración.
            foreach (string b in Enum.GetNames(typeof(SerialData)))
            {
                comboBox_bits_de_datos.Items.Add(b);
            }

            // Asignar Paridades Seleccionables desde la enumeracion
            foreach (string p in Enum.GetNames(typeof(StopBits)))
            {
                comboBox_bits_de_parada.Items.Add(p);
            }

            // Asignar control de flujo Seleccionables desde la enumeracion.
            foreach (string c in Enum.GetNames(typeof(Handshake)))
            {
                comboBox_control_de_flujo.Items.Add(c);
            }

            // GetPortNames, nos devuelve un array con los nombres
            // de los puertos instalados en nuestro equipo.
            String[] Ports = SerialPort.GetPortNames();
            comboBox_puerto_com.Items.AddRange(Ports);


            // Seleccionar los items por defecto
            comboBox_bits_por_segundo.SelectedIndex = 4; // Empieza con el 9600 como predeterminado.
            comboBox_bits_de_datos.SelectedIndex = 0; // 8.
            comboBox_paridad.SelectedIndex = 0; // None o ninguno.
            comboBox_bits_de_parada.SelectedIndex = 2; // One o 1.
            comboBox_control_de_flujo.SelectedIndex = 0; // None o ninguno.
            comboBox_puerto_com.SelectedIndex = 0;

            // Abrir el puerto serie con los items por defecto
            SeleccionCambiada(sender, e);

            // Asignar la funcion a ejecutar por disparo de evento al cambio de indice en el combobox
            comboBox_bits_por_segundo.SelectedIndexChanged += new System.EventHandler(SeleccionCambiada);
            comboBox_bits_de_datos.SelectedIndexChanged += new System.EventHandler(SeleccionCambiada);
            comboBox_paridad.SelectedIndexChanged += new System.EventHandler(SeleccionCambiada);
            comboBox_bits_de_parada.SelectedIndexChanged += new System.EventHandler(SeleccionCambiada);
            comboBox_control_de_flujo.SelectedIndexChanged += new System.EventHandler(SeleccionCambiada);
            comboBox_puerto_com.SelectedIndexChanged += new System.EventHandler(SeleccionCambiada);

            // Cargar los datos del XML.
            Cargar_XML();
        }
```


- Envio y recepción de datos : Control de 8 cargas y Lectura de 8 entradas.

¿Te refieres con Visual C# o VB .net? En ese sentido espero que venga alguien o lo resolvemos entre todos pero debes ser más técnico.

- Lectura de 3 entradas analógicas.

No me he metido en ese campo.

- Vizualización de datos desde el PIC: Mensajes y alertas así como debug de la programación.

Explicado en la página 163 del manual. Descargar ejemplo aquí.

- Conexión y desconexión del puerto en caliente.

mmmmmmmm...

Ganas de aprender muchas, conocimientos pocos...

A ver si todos y todas aportamos algo, ese algo se convertirá en grande.

Saludo.


----------



## jokelnice (Dic 14, 2009)

me le apunto yo tambien ahora tengo tiempo , me le apunto a transferencia modo bulk , con vb.net ,c# y labview


----------



## Meta (Dic 14, 2009)

Si consiguiéramos este libro nos dará muchas ideas sobre el USB con Visual C#.







Fuente:
http://www.elektor.es/products/book...rogramming-for-electronic.264379.951869.lynkx


----------



## Moyano Jonathan (Dic 14, 2009)

Ese libro se puede conseguir....el tema es ponerse a leerlo lo cuál seguro nos llevará un tiempo más que interesante.


----------



## Meta (Dic 14, 2009)

Sólo lo del USB es un capítulo y está al final.


----------



## Moyano Jonathan (Dic 14, 2009)

*Meta te aclaro lo que resaltaste anteriormente:*

1º - Lo que quiero detectar ahora es el puerto serie en VB.net y VC# 2008 por lo que en realidad estaríamos detectando un USB virtual, esto ya me lo respondiste asi que tema aclarado 

2º - En USB la detección ya la tengo mas o menos clara usando las librerías para VB.net y VC# que tengo para el modo HID y Bulck transfer...igual habría que hacer pruebas más adelante para probar su funcionamiento.

3º - 
- Envio y recepción de datos : Control de 8 cargas y Lectura de 8 entradas.

A lo que me refiero meta es al control de 8 cargas (relés, luces, contactores, etc). Esto lo simularé mediante la utilización de LED's en mi entrenadora.
Con el tema de las entradas es lo mismo son 8 pulsadores conectados a un registro de desplazamiento que lee el PIC en forma serial.

4º - Lectura de 3 entradas analógicas:

- Yo tengo experiencia en el manejo del ADC, pero necesito más conocimiento para realizar una interfaz para visualizar los datos.

5º - 
- Vizualización de datos desde el PIC: Mensajes y alertas así como debug de la programación.

Explicado en la página 163 del manual. Descargar ejemplo aquí.

......lo voy a leer.

6º - - Conexión y desconexión del puerto en caliente.

Lo que planteo es lo siguiente: Si tenemos nuestro dispositivo trasmitiendo datos a la PC ...y lo desconectamos la aplicación tendría que generar un evento para que en caso de que el dispositivo sea conectado nuevamente la PC lo reconozca y se puedan seguir transmitiendo datos.


*La idea general sería que las aplicaciones fueran escritas en su totalidad en VC# que es al parecer el lenguaje que todos manejamos mejor. Luego se pasarán a los demás lenguajes según el nivel de complejidad que se presente.

Un saludo ! 
*


----------



## Meta (Dic 16, 2009)

Han respondido algunos enlaces, mira bien los códigos.

http://msdn.microsoft.com/es-es/library/system.io.driveinfo.aspx

http://tempuzfugit.wordpress.com/2007/06/05/deteccion-de-insercion-de-disco/

Aún siguen respondiendo algunos códigos por aquí. Atento, ejjeje.

http://social.msdn.microsoft.com/Fo...11-5045-4dd5-b757-98d18a586063/?prof=required

Saludo.


----------



## Moyano Jonathan (Dic 16, 2009)

Meta la detección de los puertos USB disponibles , estuve investigando un poco las librerías de microchip *mpusbapi.dll* y la de Mecanique.uk *easyHID.dll.* Ambas tienen funciones específicas para la detección de los dispositivos vinculados a esas funciones mediante el *VID y PID* del mismo.
Hay 1 inconveniente menor de programación que tendría que resolver antes de hacer las aplicaciones:

- mpusbapi.dll tengo ejemplos de aplicación de la librería en VC# solamente...y tengo que encontrar la forma de que trabaje también en VB.net

- easyHID.dll solamente tengo ejemplos de uso en VB.net y tendría que hacerla trabajar en VC#

*VC++ no creo que lo valla a implementar debido a que no encuentro mucha documentación de programas de control que usen VC++ , por lo que me enfocaré en VB.net y VC# por el momento hasta que aprenda más sobre las librerías de control y el programa en si mismo.*

Una mala noticia es que se me quemó mi PICKIT2 , asi que me voy a tener que armar un clon para poder proseguir con las pruebas.

*Hola a todos , me puse a diseñar la interfaz gráfica para el manejo de la entrenadora que tiene todo lo necesario para experimentar las interfaces básicas a través de USB como:

- Entradas analógicas.
- Entradas digitales.
- Salidas digitales.
- I2C.
- USB - RS232.
- Control de cargas de potencia, etc.

La interfaz que he estado diseñando Es muy básica pero quería saber si con eso basta o piensan que se le puede llegar a agregar algo más.

Está diseñada en VC# 2008.

Ventana principal:



Menú 1:



Menú 2:



Espero sus comentarios para ver que se puede agregar / sacar o modificar.

Un saludo ! 

*


----------



## Meta (Dic 16, 2009)

Moyano Jonathan dijo:


> Meta la detección de los puertos USB disponibles , estuve investigando un poco las librerías de microchip *mpusbapi.dll* y la de Mecanique.uk *easyHID.dll.* Ambas tienen funciones específicas para la detección de los dispositivos vinculados a esas funciones mediante el *VID y PID* del mismo.
> Hay 1 inconveniente menor de programación que tendría que resolver antes de hacer las aplicaciones:
> 
> - mpusbapi.dll tengo ejemplos de aplicación de la librería en VC# solamente...y tengo que encontrar la forma de que trabaje también en VB.net
> ...



Nos falta un pasito. Que raro que ya no participen más gente, o sólo venían para su propio beneficio.

*EDITO:*
Veo que has puesto fotos muy buenas.

Las imágenes están bastante bien. Lo de la licencia suele ir en "Ayuda". Pusiste *- USB - RS232, pensé que el proyecto era sólo directamente USB con el PIC 18Fx550.
*


----------



## Moyano Jonathan (Dic 16, 2009)

Hola meta acá comento y doy algunos avances: 

1 º - 





> - mpusbapi.dll tengo ejemplos de aplicación de la librería en VC# solamente...y tengo que encontrar la forma de que trabaje también en VB.net
> 
> *Lo encontraremos. También he encontrado la forma de hacerlo lo del puerto serie en los tres lenguajes express.*


Ya encontré la solución aunque todavía no es funcional..me dá un error que no encuentra la librería , cuando la librería está agregada  



2 º - 





> - easyHID.dll solamente tengo ejemplos de uso en VB.net y tendría que hacerla trabajar en VC#.
> 
> *Buscaré información sobre easyHID.dll, sólo me das ejemplos en VB .net y en los foros del MSDN nos ayudarán a programarlo.*


Fijate si te pueden dar una mano por que por más que he buscado no he encontrado nada que me ayude.

3º - 





> Una mala noticia es que se me quemó mi PICKIT2 , asi que me voy a tener que armar un clon para poder proseguir con las pruebas.
> *
> Mi mala noticia que se me quemó un circuito con mi LCD 16x2 incluido y unos cuantos PIC16F84A. ¿Es estrictamente necesario un PICKIT2 para lo que vas hacer o no tienes otras alternativas?*


No tengo alternativas para poder programar mi entrenador , ya que mis otros programadores por puerto serie y paralelo no funcionan ...ni tampocon programan al PIC18F2550.

4º - 





> Las imágenes están bastante bien. Lo de la licencia suele ir en "Ayuda". Pusiste *- USB - RS232, pensé que el proyecto era sólo directamente USB con el PIC 18Fx550.*


- Voy a cambiar lo que me decís de la licencia..

- El proyecto va a abarcar todas las formas de comunicación con USB y el PIC18F2550 primero empezaremos con CDC (USB - RS232), luego con HID (Human device class) y por último nos centraremos en el modo bulk con mpusbapi.dll


----------



## Meta (Dic 16, 2009)

Hola:

Antes que nada, dime en la pregunta para preguntarlo en los foros de MSDN sobre easyHID.dll.

Saludo.


----------



## Moyano Jonathan (Dic 16, 2009)

> Antes que nada, dime en la pregunta para preguntarlo en los foros de MSDN sobre easyHID.dll.



A que te referís ??

Te dejo un código de ejemplo para que le preguntés como hacer para poder pasar el código de VB.net a C#

https://www.forosdeelectronica.com/f26/curso-programacion-visual-c-2008-a-20865/index2.html

Lo tenés que descargar de esa dirección.....es un código que hice funcionar el año pasado


----------



## Meta (Dic 16, 2009)

jejeje, sólo es eso. Voy a prguntarlo.

Deja ver si responden por aquñi.

http://social.msdn.microsoft.com/Forums/es-ES/vcses/thread/8a6c8748-eb68-40a1-b6d5-d2c09e5e2237

Saludo.


----------



## Moyano Jonathan (Dic 16, 2009)

Gracias meta....vi los comentarios en ese foro pero ninguno da algo concreto..me parece que toca estudiar muy detenidamente el código y pasarlo uno mismo.


----------



## Meta (Dic 17, 2009)

Halo:

Algo de información te da, sólo toca buscarnos la vida con la conversión. Investigaré sobre los enlaces que nos ha dado y el .NET reactor.

Lo estuve viendo el proyecto y se ve bien. Según dice está muy a lo VB .net, por lo que les entiendo es compleja la conversión, no por ello signica que no se pueda.

Intentaré investigar.

Salu2.


----------



## ChoN (Dic 17, 2009)

Hola, ahora con tiempo puedo aportar algo, faltan sólo 2 para recibirme!
Por la experiencia que tube con USB, hay 2 tipos de funcionamiento útiles para los PIC: CDC y HID. El modo BULK, si bien es más fácil de programar, no tiene mucho uso, sencillamente ningún PIC tiene capacidad de enviar información a tal velocidad como para justificarlo. además es muy estructurado en cuanto a los tiempos y tamaños de paquetes enviados y recibidos, y fundamentalmente, no trabaja por interrupción. Además, mpusbapi.dll NO funciona en vista ni en 7. 
Creo que es preferible enfocarse en CDC (también va a haber problemas de drivers con vista y 7) para realizar un RS232 virtual, aunque lo ideal, va a seguir siendo el modo HID.
En un post en este hilo publiqué el código que utilice en VC# 2009 para trabajar en modo bulk, invocando las funciones de la .dll. Cualquier cosa estoy.
Saludos.


----------



## Meta (Dic 17, 2009)

Hola mi muy distinguido amigo.

No sabía lo del Windows 7 no es compatible, ya tenemos más problemas, de todas formas estoy con XP en este momento.

Al final hay que ponerse de acuerdo con lo que se va hacer. Este está muy bien, sólo que la idea de la interfaz será de VB .net y C#, al menos yo lo optimizaré para C# cuando se pueda hacer.

http://www.neoteo.com/conecta-tus-proyectos-al-puerto-usb.neo

Saludo.


----------



## ChoN (Dic 17, 2009)

Creo que lo ideal sería utilizar VC#, ya que permite llegar a muy bajo nivel, y es similar al lenguaje utilizado para programar el micro. 
En algún lado creo que tengo una .dll modificada que funcionaba en vista, voy a chequearla.
Saludos.


----------



## Moyano Jonathan (Dic 17, 2009)

En el foro de todopic hay una librería llamada PicWINUSB que maneja el modo bulk en vista 32 y 64 bits....no se en win 7.
Ahora lo más importante es terminar con CDC en VC# y VB.net....después veremos bien con los demás.


----------



## ChoN (Dic 17, 2009)

Esa la probé, pero funciona solamente con el ejemplo que figura junto con la librería.
Intente hacerla funcionar en windows 7 y nada .


----------



## Moyano Jonathan (Dic 17, 2009)

La verdad que entonces no me queda ninguna posibilidad.......se que hay gente que lo ha hecho funcionar en Win Vista y 7 pero creo que había que hacer unas modificaciones ...
Ahora estoy de lleno con el diseño de la placa del Pickit2 con compatibilidad con micros de 3.3v

También estoy empezando a buscar información para empezar a trabajar con los PIC24 y los famosos PIC32


----------



## Meta (Dic 17, 2009)

Estaba con un libro en Inglés del PIC32, la verdad, por lo poco que entiendo de Inglés, hice pruebas con ejemplos que te viene y me encantó el PIC32, no es tan complejo como pensaba con el lenguaje C, pero en ASM ni se te ocurre meterte en serio.

Sobre el proyecto que hiciste en VB .net, puedes hacer poco a poco o partes por partes desde la creación del form para luego pasarlo a C#. Por probar no pasa nada.


----------



## Meta (Dic 19, 2009)

A ver si puedo traducir de VB a C# estos códigos poco a poco.


```
'UPGRADE_WARNING: Event Check1.CheckStateChanged may fire when form is initialized. Click for more: 'ms-help://MS.VSCC.2003/commoner/redir/redirect.htm?keyword="vbup2075"'
    Private Sub Check1_CheckStateChanged(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles Check1.CheckStateChanged
        Dim send_buf(64) As Byte
        Dim receive_buf(64) As Byte
        
        Dim RecvLength As Integer
        
        OpenMPUSBDevice()
        
        If myOutPipe <> INVALID_HANDLE_VALUE And myInPipe <> INVALID_HANDLE_VALUE Then
            
            RecvLength = 1
            
            
            send_buf(0) = 50 '0x32
            send_buf(1) = 3
            If Check1.CheckState = 1 Then
                send_buf(2) = 1
            ElseIf Check1.CheckState = 0 Then 
                send_buf(2) = 0
            End If
            
            If (SendReceivePacket(send_buf, 3, receive_buf, RecvLength, 1000, 1000) = 1) Then
                
                If (RecvLength <> 1 Or receive_buf(0) <> 50) Then
                    MsgBox("Failed to update LED")
                End If
                
            End If
            
        End If
        
        CloseMPUSBDevice()
        
    End Sub
    
    'UPGRADE_WARNING: Event Check2.CheckStateChanged may fire when form is initialized. Click for more: 'ms-help://MS.VSCC.2003/commoner/redir/redirect.htm?keyword="vbup2075"'
    Private Sub Check2_CheckStateChanged(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles Check2.CheckStateChanged
        Dim send_buf(64) As Byte
        Dim receive_buf(64) As Byte
        
        Dim RecvLength As Integer
        
        OpenMPUSBDevice()
        
        If myOutPipe <> INVALID_HANDLE_VALUE And myInPipe <> INVALID_HANDLE_VALUE Then
            
            RecvLength = 1
            
            
            send_buf(0) = 50 '0x32
            send_buf(1) = 4
            If Check2.CheckState = 1 Then
                send_buf(2) = 1
            ElseIf Check2.CheckState = 0 Then 
                send_buf(2) = 0
            End If
            
            If (SendReceivePacket(send_buf, 3, receive_buf, RecvLength, 1000, 1000) = 1) Then
                
                If (RecvLength <> 1 Or receive_buf(0) <> 50) Then
                    
                    MsgBox("Failed to update LED")
                    
                End If
                
            End If
            
        End If
        
        CloseMPUSBDevice()
        
    End Sub
    
    Private Sub Command1_Click(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles Command1.Click
        Me.Close()
    End Sub
    
    Private Sub Command2_Click(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles Command2.Click
        End
    End Sub
    
    Private Sub Command3_Click(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles Command3.Click
        Dim send_buf(64) As Byte
        Dim receive_buf(64) As Byte
        
        Dim RecvLength As Integer
        
        OpenMPUSBDevice()
        
        If myOutPipe <> INVALID_HANDLE_VALUE And myInPipe <> INVALID_HANDLE_VALUE Then
            
            RecvLength = 4
            
            send_buf(0) = 0 '0x0 - READ_VERSION
            send_buf(1) = 2
            
            If (SendReceivePacket(send_buf, 2, receive_buf, RecvLength, 1000, 1000) = 1) Then
                
                If (RecvLength <> 4 Or receive_buf(0) <> 0) Then
                    
                    MsgBox("Failed to obtain version information.")
                Else
                    Text1.Text = "Demo Version  " & Str(receive_buf(3)) & "." & Str(receive_buf(2))
                    
                End If
                
            End If
            
        End If
        
        CloseMPUSBDevice()
        
    End Sub
    
    Private Sub Form1_Load(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles MyBase.Load
        Initialize()
        
    End Sub
End Class
```
Voy a probar a ver como queda poco a poco con este enlace.

http://www.developerfusion.com/tools/convert/csharp-to-vb/

Saludo.
*EDITO:*

Estoy haciendo pruebas y he convertido de VB a C# pero no funciona, al meno se ve el código para empezar a dar un pequeño paso.


```
using Microsoft.VisualBasic;
using Microsoft.VisualBasic.Compatibility;
using System;
using System.Collections;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.Windows.Forms;
 // ERROR: Not supported in C#: OptionDeclaration
namespace Project1
{
    //======================================================================================
    //        VB.NET Example code MPUSBAPI.DLL
    //        Free to use code supplied by www.comvcon.com
    //        Use this code at you own will and risk
    //        Please do not remove this line: www.comvcon.com
    //======================================================================================

    internal class Form1 : System.Windows.Forms.Form
    {
        #region "Windows Form Designer generated code "
        public Form1() : base()
        {
            Load += Form1_Load;
            if (m_vb6FormDefInstance == null) {
                if (m_InitializingDefInstance) {
                    m_vb6FormDefInstance = this;
                } else {
                    try {
                        //For the start-up form, the first instance created is the default instance.
                        if (object.ReferenceEquals(System.Reflection.Assembly.GetExecutingAssembly().EntryPoint.DeclaringType, this.GetType())) {
                            m_vb6FormDefInstance = this;
                        }
                    } catch {
                    }
                }
            }
            //This call is required by the Windows Form Designer.
            InitializeComponent();
        }
//Form overrides dispose to clean up the component list.
        protected override void Dispose(bool Disposing)
        {
            if (Disposing) {
                if ((components != null)) {
                    components.Dispose();
                }
            }
            base.Dispose(Disposing);
        }
//Required by the Windows Form Designer
        private System.ComponentModel.IContainer components;
        public System.Windows.Forms.ToolTip ToolTip1;
        public System.Windows.Forms.TextBox Text1;
        private System.Windows.Forms.Button withEventsField_Command3;
        public System.Windows.Forms.Button Command3 {
            get { return withEventsField_Command3; }
            set {
                if (withEventsField_Command3 != null) {
                    withEventsField_Command3.Click -= Command3_Click;
                }
                withEventsField_Command3 = value;
                if (withEventsField_Command3 != null) {
                    withEventsField_Command3.Click += Command3_Click;
                }
            }
        }
        private System.Windows.Forms.CheckBox withEventsField_Check2;
        public System.Windows.Forms.CheckBox Check2 {
            get { return withEventsField_Check2; }
            set {
                if (withEventsField_Check2 != null) {
                    withEventsField_Check2.CheckStateChanged -= Check2_CheckStateChanged;
                }
                withEventsField_Check2 = value;
                if (withEventsField_Check2 != null) {
                    withEventsField_Check2.CheckStateChanged += Check2_CheckStateChanged;
                }
            }
        }
        private System.Windows.Forms.CheckBox withEventsField_Check1;
        public System.Windows.Forms.CheckBox Check1 {
            get { return withEventsField_Check1; }
            set {
                if (withEventsField_Check1 != null) {
                    withEventsField_Check1.CheckStateChanged -= Check1_CheckStateChanged;
                }
                withEventsField_Check1 = value;
                if (withEventsField_Check1 != null) {
                    withEventsField_Check1.CheckStateChanged += Check1_CheckStateChanged;
                }
            }
        }
        private System.Windows.Forms.Button withEventsField_Command1;
        public System.Windows.Forms.Button Command1 {
            get { return withEventsField_Command1; }
            set {
                if (withEventsField_Command1 != null) {
                    withEventsField_Command1.Click -= Command1_Click;
                }
                withEventsField_Command1 = value;
                if (withEventsField_Command1 != null) {
                    withEventsField_Command1.Click += Command1_Click;
                }
            }
        }
        private System.Windows.Forms.Button withEventsField_Command2;
        public System.Windows.Forms.Button Command2 {
            get { return withEventsField_Command2; }
            set {
                if (withEventsField_Command2 != null) {
                    withEventsField_Command2.Click -= Command2_Click;
                }
                withEventsField_Command2 = value;
                if (withEventsField_Command2 != null) {
                    withEventsField_Command2.Click += Command2_Click;
                }
            }
        }
//NOTE: The following procedure is required by the Windows Form Designer
//It can be modified using the Windows Form Designer.
//Do not modify it using the code editor.
        [System.Diagnostics.DebuggerStepThrough()]
        private void InitializeComponent()
        {
            System.Resources.ResourceManager resources = new System.Resources.ResourceManager(typeof(Form1));
            this.components = new System.ComponentModel.Container();
            this.ToolTip1 = new System.Windows.Forms.ToolTip(components);
            this.ToolTip1.Active = true;
            this.Text1 = new System.Windows.Forms.TextBox();
            this.Command3 = new System.Windows.Forms.Button();
            this.Check2 = new System.Windows.Forms.CheckBox();
            this.Check1 = new System.Windows.Forms.CheckBox();
            this.Command1 = new System.Windows.Forms.Button();
            this.Command2 = new System.Windows.Forms.Button();
            this.Text = "VB MPUSBAPI Demo";
            this.ClientSize = new System.Drawing.Size(340, 151);
            this.Location = new System.Drawing.Point(4, 23);
            this.StartPosition = System.Windows.Forms.FormStartPosition.WindowsDefaultLocation;
            this.Font = new System.Drawing.Font("Arial", 8f, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, Convert.ToByte(0));
            this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
            this.BackColor = System.Drawing.SystemColors.Control;
            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.Sizable;
            this.ControlBox = true;
            this.Enabled = true;
            this.KeyPreview = false;
            this.MaximizeBox = true;
            this.MinimizeBox = true;
            this.Cursor = System.Windows.Forms.Cursors.Default;
            this.RightToLeft = System.Windows.Forms.RightToLeft.No;
            this.ShowInTaskbar = true;
            this.HelpButton = false;
            this.WindowState = System.Windows.Forms.FormWindowState.Normal;
            this.Name = "Form1";
            this.Text1.AutoSize = false;
            this.Text1.Size = new System.Drawing.Size(257, 25);
            this.Text1.Location = new System.Drawing.Point(24, 104);
            this.Text1.TabIndex = 5;
            this.Text1.Text = "Text1";
            this.Text1.Font = new System.Drawing.Font("Arial", 8f, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, Convert.ToByte(0));
            this.Text1.AcceptsReturn = true;
            this.Text1.TextAlign = System.Windows.Forms.HorizontalAlignment.Left;
            this.Text1.BackColor = System.Drawing.SystemColors.Window;
            this.Text1.CausesValidation = true;
            this.Text1.Enabled = true;
            this.Text1.ForeColor = System.Drawing.SystemColors.WindowText;
            this.Text1.HideSelection = true;
            this.Text1.ReadOnly = false;
            this.Text1.MaxLength = 0;
            this.Text1.Cursor = System.Windows.Forms.Cursors.IBeam;
            this.Text1.Multiline = false;
            this.Text1.RightToLeft = System.Windows.Forms.RightToLeft.No;
            this.Text1.ScrollBars = System.Windows.Forms.ScrollBars.None;
            this.Text1.TabStop = true;
            this.Text1.Visible = true;
            this.Text1.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
            this.Text1.Name = "Text1";
            this.Command3.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
            this.Command3.Text = "Get Version";
            this.Command3.Size = new System.Drawing.Size(129, 25);
            this.Command3.Location = new System.Drawing.Point(16, 72);
            this.Command3.TabIndex = 4;
            this.Command3.Font = new System.Drawing.Font("Arial", 8f, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, Convert.ToByte(0));
            this.Command3.BackColor = System.Drawing.SystemColors.Control;
            this.Command3.CausesValidation = true;
            this.Command3.Enabled = true;
            this.Command3.ForeColor = System.Drawing.SystemColors.ControlText;
            this.Command3.Cursor = System.Windows.Forms.Cursors.Default;
            this.Command3.RightToLeft = System.Windows.Forms.RightToLeft.No;
            this.Command3.TabStop = true;
            this.Command3.Name = "Command3";
            this.Check2.Text = "LED4";
            this.Check2.Size = new System.Drawing.Size(81, 17);
            this.Check2.Location = new System.Drawing.Point(128, 24);
            this.Check2.TabIndex = 3;
            this.Check2.Font = new System.Drawing.Font("Arial", 8f, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, Convert.ToByte(0));
            this.Check2.CheckAlign = System.Drawing.ContentAlignment.MiddleLeft;
            this.Check2.BackColor = System.Drawing.SystemColors.Control;
            this.Check2.CausesValidation = true;
            this.Check2.Enabled = true;
            this.Check2.ForeColor = System.Drawing.SystemColors.ControlText;
            this.Check2.Cursor = System.Windows.Forms.Cursors.Default;
            this.Check2.RightToLeft = System.Windows.Forms.RightToLeft.No;
            this.Check2.Appearance = System.Windows.Forms.Appearance.Normal;
            this.Check2.TabStop = true;
            this.Check2.CheckState = System.Windows.Forms.CheckState.Unchecked;
            this.Check2.Visible = true;
            this.Check2.Name = "Check2";
            this.Check1.Text = "LED3";
            this.Check1.Size = new System.Drawing.Size(81, 17);
            this.Check1.Location = new System.Drawing.Point(40, 24);
            this.Check1.TabIndex = 2;
            this.Check1.Font = new System.Drawing.Font("Arial", 8f, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, Convert.ToByte(0));
            this.Check1.CheckAlign = System.Drawing.ContentAlignment.MiddleLeft;
            this.Check1.BackColor = System.Drawing.SystemColors.Control;
            this.Check1.CausesValidation = true;
            this.Check1.Enabled = true;
            this.Check1.ForeColor = System.Drawing.SystemColors.ControlText;
            this.Check1.Cursor = System.Windows.Forms.Cursors.Default;
            this.Check1.RightToLeft = System.Windows.Forms.RightToLeft.No;
            this.Check1.Appearance = System.Windows.Forms.Appearance.Normal;
            this.Check1.TabStop = true;
            this.Check1.CheckState = System.Windows.Forms.CheckState.Unchecked;
            this.Check1.Visible = true;
            this.Check1.Name = "Check1";
            this.Command1.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
            this.Command1.Text = "Ok";
            this.AcceptButton = this.Command1;
            this.Command1.Size = new System.Drawing.Size(81, 25);
            this.Command1.Location = new System.Drawing.Point(256, 8);
            this.Command1.TabIndex = 1;
            this.Command1.Font = new System.Drawing.Font("Arial", 8f, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, Convert.ToByte(0));
            this.Command1.BackColor = System.Drawing.SystemColors.Control;
            this.Command1.CausesValidation = true;
            this.Command1.Enabled = true;
            this.Command1.ForeColor = System.Drawing.SystemColors.ControlText;
            this.Command1.Cursor = System.Windows.Forms.Cursors.Default;
            this.Command1.RightToLeft = System.Windows.Forms.RightToLeft.No;
            this.Command1.TabStop = true;
            this.Command1.Name = "Command1";
            this.Command2.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
            this.CancelButton = this.Command2;
            this.Command2.Text = "Cancel";
            this.Command2.Size = new System.Drawing.Size(81, 25);
            this.Command2.Location = new System.Drawing.Point(256, 40);
            this.Command2.TabIndex = 0;
            this.Command2.Font = new System.Drawing.Font("Arial", 8f, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, Convert.ToByte(0));
            this.Command2.BackColor = System.Drawing.SystemColors.Control;
            this.Command2.CausesValidation = true;
            this.Command2.Enabled = true;
            this.Command2.ForeColor = System.Drawing.SystemColors.ControlText;
            this.Command2.Cursor = System.Windows.Forms.Cursors.Default;
            this.Command2.RightToLeft = System.Windows.Forms.RightToLeft.No;
            this.Command2.TabStop = true;
            this.Command2.Name = "Command2";
            this.Controls.Add(Text1);
            this.Controls.Add(Command3);
            this.Controls.Add(Check2);
            this.Controls.Add(Check1);
            this.Controls.Add(Command1);
            this.Controls.Add(Command2);
        }
        #endregion
        #region "Upgrade Support "
        private static Form1 m_vb6FormDefInstance;
        private static bool m_InitializingDefInstance;
        public static Form1 DefInstance {
            get {
                if (m_vb6FormDefInstance == null || m_vb6FormDefInstance.IsDisposed) {
                    m_InitializingDefInstance = true;
                    m_vb6FormDefInstance = new Form1();
                    m_InitializingDefInstance = false;
                }
                DefInstance = m_vb6FormDefInstance;
            }
            set { m_vb6FormDefInstance = value; }
        }
        #endregion
//UPGRADE_WARNING: Event Check1.CheckStateChanged may fire when form is initialized. Click for more: 'ms-help://MS.VSCC.2003/commoner/redir/redirect.htm?keyword="vbup2075"'
        private void Check1_CheckStateChanged(System.Object eventSender, System.EventArgs eventArgs)
        {
            byte[] send_buf = new byte[65];
            byte[] receive_buf = new byte[65];

            int RecvLength = 0;

            VBMPUSBAPI.OpenMPUSBDevice();

            if (VBMPUSBAPI.myOutPipe != VBMPUSBAPI.INVALID_HANDLE_VALUE & VBMPUSBAPI.myInPipe != VBMPUSBAPI.INVALID_HANDLE_VALUE) {

                RecvLength = 1;


                send_buf[0] = 50;
                //0x32
                send_buf[1] = 3;
                if (Check1.CheckState == 1) {
                    send_buf[2] = 1;
                } else if (Check1.CheckState == 0) {
                    send_buf[2] = 0;
                }

                if ((VBMPUSBAPI.SendReceivePacket(ref send_buf, ref 3, ref receive_buf, ref RecvLength, 1000, 1000) == 1)) {

                    if ((RecvLength != 1 | receive_buf[0] != 50)) {
                        Interaction.MsgBox("Failed to update LED");
                    }

                }

            }

            VBMPUSBAPI.CloseMPUSBDevice();

        }

//UPGRADE_WARNING: Event Check2.CheckStateChanged may fire when form is initialized. Click for more: 'ms-help://MS.VSCC.2003/commoner/redir/redirect.htm?keyword="vbup2075"'
        private void Check2_CheckStateChanged(System.Object eventSender, System.EventArgs eventArgs)
        {
            byte[] send_buf = new byte[65];
            byte[] receive_buf = new byte[65];

            int RecvLength = 0;

            VBMPUSBAPI.OpenMPUSBDevice();

            if (VBMPUSBAPI.myOutPipe != VBMPUSBAPI.INVALID_HANDLE_VALUE & VBMPUSBAPI.myInPipe != VBMPUSBAPI.INVALID_HANDLE_VALUE) {

                RecvLength = 1;


                send_buf[0] = 50;
                //0x32
                send_buf[1] = 4;
                if (Check2.CheckState == 1) {
                    send_buf[2] = 1;
                } else if (Check2.CheckState == 0) {
                    send_buf[2] = 0;
                }

                if ((VBMPUSBAPI.SendReceivePacket(ref send_buf, ref 3, ref receive_buf, ref RecvLength, 1000, 1000) == 1)) {

                    if ((RecvLength != 1 | receive_buf[0] != 50)) {

                        Interaction.MsgBox("Failed to update LED");

                    }

                }

            }

            VBMPUSBAPI.CloseMPUSBDevice();

        }

        private void Command1_Click(System.Object eventSender, System.EventArgs eventArgs)
        {
            this.Close();
        }

        private void Command2_Click(System.Object eventSender, System.EventArgs eventArgs)
        {
            System.Environment.Exit(0);
        }

        private void Command3_Click(System.Object eventSender, System.EventArgs eventArgs)
        {
            byte[] send_buf = new byte[65];
            byte[] receive_buf = new byte[65];

            int RecvLength = 0;

            VBMPUSBAPI.OpenMPUSBDevice();

            if (VBMPUSBAPI.myOutPipe != VBMPUSBAPI.INVALID_HANDLE_VALUE & VBMPUSBAPI.myInPipe != VBMPUSBAPI.INVALID_HANDLE_VALUE) {

                RecvLength = 4;

                send_buf[0] = 0;
                //0x0 - READ_VERSION
                send_buf[1] = 2;

                if ((VBMPUSBAPI.SendReceivePacket(ref send_buf, ref 2, ref receive_buf, ref RecvLength, 1000, 1000) == 1)) {

                    if ((RecvLength != 4 | receive_buf[0] != 0)) {

                        Interaction.MsgBox("Failed to obtain version information.");
                    } else {
                        Text1.Text = "Demo Version  " + Conversion.Str(receive_buf[3]) + "." + Conversion.Str(receive_buf[2]);

                    }

                }

            }

            VBMPUSBAPI.CloseMPUSBDevice();

        }

        private void Form1_Load(System.Object eventSender, System.EventArgs eventArgs)
        {
            VBMPUSBAPI.Initialize();

        }
    }
}
```

Moyano. ¿Crees que te puede dar una idea para empezar desde cero con C# lo mismo que VB .net?

No tengo mucha idea de VB, aún intentaré por mi lado pasarlo desde cero a C# al menos empezando el Form1 y botones antes de poner códigos.


----------



## Hernan83 (Dic 19, 2009)

Yo apostaria por el VB.net o VB 2008 , me parece mas accesible,sencillo,pero pregunto,hay mas info disponible en VC?


----------



## Meta (Dic 19, 2009)

Yo no, MicroSoft Apuesta por el nuevo lenguaje C#, que para ello invirtió muchos millones de $$$$$$$ para su desarrollo y encima con los años quiere que se potencia C# y nos pasemos a C#. VB está porque aún se usa y no va a dejar colgado a las empresas.

Lee por San google de que M$ quiere que nos pasemos a C# y que C# tiene más ventaja que VB .net.

He notado en todo este año 2009 que la gente utiliz más C# que VB .net. En el instituto que estoy daremos C/C++, algo de VB y C# pero nos centraremos a C, en Web HP, Java, etc..

A ver si podemos hacer la conversión a C# manualmente.


----------



## Moyano Jonathan (Dic 19, 2009)

Yo como vos meta apuesto 100% al C# pero VB.net es un lenguaje un poco más accesible en su entendimiento que C# pero de a poco creo que se puede hacer desde 0 ...aunque va a llevar tiempo. El secreto para mi es como ver como interactúa nuestro programa con las librerías de control....luego ver como se utilizan las funciones y listo...ahi tenemos nuestro programa de control ..pero no todo es tan facil como parece.

He estado haciendo pruebas en C# con MPUSBAPI.dll con exitos...en XP y vista...no probé en 7.

Aún sigo diseñando un programador clon del pickit2 para trabajar ..pero creo que cuando vuelva de mis vacaciones ya va a estar terminado.


----------



## george.manson.69 (Dic 22, 2009)

Hola a todos, a ver jonathan a ver si me pudes ayudar con este problema de usar la libreria mpusbapi.dll, he estado haciendo el programa que me encontr por ahi,yo creo que algunos lo han usado,como importar, el mpusbapi.dll a visual C#, ahi encontre que hay que meterlo en carpeta donde se grabo el proyecto osea en"bin" y luego en "debug", bueno eso hice y puse lo siguiente codigo, cree una clase, y meti este codigo, que me encontre por ahi, que es para importar el DLL, pero al ejecutarlo me acaparece errores...
esta es la clase que cree!!!
es el USBAPI.CS

```
using System;
using System.Collections.Generic;
//using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
using PVOID = System.IntPtr;
using DWORD = System.UInt32;
namespace PNCHE_HID_NO_FUNCIONA
{
    class USBAPI
    {
        #region Definición de los Strings: EndPoint y VID_PID
        string vid_pid_norm = "vid_04D8&pid_0020";
        string out_pipe = "[URL="file://mchp_ep1/"]\\MCHP_EP1[/URL]";
        string in_pipe = "[URL="file://mchp_ep1/"]\\MCHP_EP1[/URL]";
        #endregion
        #region Funciones importadas de la DLL: mpusbapi.dll
        [DllImport("mpusbapi.dll")]
        private static extern DWORD _MPUSBGetDLLVersion();
        [DllImport("mpusbapi.dll")]
        private static extern DWORD _MPUSBGetDeviceCount(string pVID_PID);
        [DllImport("mpusbapi.dll")]
        private static extern void* _MPUSBOpen(DWORD instance, string pVID_PID, string pEP, DWORD dwDir, DWORD dwReserved);
        [DllImport("mpusbapi.dll")]
        private static extern DWORD _MPUSBRead(void* handle, void* pData, DWORD dwLen, DWORD* pLength, DWORD dwMilliseconds);
        [DllImport("mpusbapi.dll")]
        private static extern DWORD _MPUSBWrite(void* handle, void* pData, DWORD dwLen, DWORD* pLength, DWORD dwMilliseconds);
        [DllImport("mpusbapi.dll")]
        private static extern DWORD _MPUSBReadInt(void* handle, DWORD* pData, DWORD dwLen, DWORD* pLength, DWORD dwMilliseconds);
        [DllImport("mpusbapi.dll")]
        private static extern bool _MPUSBClose(void* handle);
        #endregion
        void* myOutPipe;
        void* myInPipe;
        public void AbrirPipes()
        {
            DWORD seleccion = 0;
            myOutPipe = _MPUSBOpen(seleccion, vid_pid_norm, out_pipe, 0, 0);
            myInPipe = _MPUSBOpen(seleccion, vid_pid_norm, in_pipe, 1, 0);
        }
        //**** FUNCION CERRAR PIPE ****
        public void CerrarPipes()
        {
            _MPUSBClose(myOutPipe);
            _MPUSBClose(myInPipe);
        }
        /**** FUNCIONES ENVIO RECEPCION DE PAQUETES ******/
        private void EnvioPaquete(byte* SendPacket, DWORD SendLength)
        {
            uint Sendelay = 1000;
            DWORD SendDataLength;
            _MPUSBWrite(myOutPipe, (void*)SendPacket, SendLength, &SendDataLength, Sendelay);
        }
        private void ReciboPaquete(byte* ReceiveData, DWORD* ReceiveLength)
        {
            uint ReceiveDelay = 1000;
            DWORD ExpectReceiveLentgh = *ReceiveLength;
            _MPUSBRead(myInPipe, (void*)ReceiveData, ExpectReceiveLentgh, ReceiveLength, ReceiveDelay);
        }
        public void envio() {
            byte* send_buf = stackalloc byte[64];
            send_buf[0] = 0x00;
            send_buf[1] = 0x01; 
            send_buf[2] = 0x03;
            EnvioPaquete(send_buf, 64);
        }
    }
}
```
 
Este es el código que uso:

```
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace PNCHE_HID_NO_FUNCIONA
{
    public partial class Form1 : Form
    {
        USBAPI usb = new USBAPI();
        public Form1()
        {
            InitializeComponent();
        }
        private void button1_Click(object sender, EventArgs e)
        {
            usb.CerrarPipes();
            usb.AbrirPipes();
            usb.envio();
        }
    }
}
```
 
Los errores aparecen en las imágenes de abajo..
Lo que trato solo es enviar los 64 bytes y que solo tres de ellos me hagan que prenda o apague un LED.
Este es el código del PIC.


```
//=============================================
//AUTOR: JORGE ARTURO RDZ HDZ
//CODE: INICILIZA USB
//DATE:30/AGOSTO/09
//=============================================
#include <18F2550.h> // Definición de registros internos del PIC18F2550.
#fuses HSPLL,MCLR,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN,NOPBADEN
// NOMCLR: No vamos ha usar el PIN MCLR, el reset se hará por soft.
// HSPLL: Vamos a usar un cristal de 20.00Mhz.
// NOWDT: No vamos a usar el perro guardian.
// NOPROTECT: Memoria no protejida contra lecturas.
// NODEBUG: No utilizamos código para debugear.
// NOLVP: No utilizamos el modo de programación con bajo voltaje.
// USBDIV: signfica que el clock del usb se tomará del PLL/2 = 96Mhz/2 = 48Mhz.
// PLL5: significa que el PLL prescaler no dividirá la frecuencia del cristal. para HS = 20Mhz.
// CPUDIV1: El PLL postscaler decide la división en 2 de la frecuencia de salida del PLL de 96MHZ, si queremos 48MHZ, lo dejamos como está.
// VREGEN: habilita el regulador de 3.3 volts que usa el módulo USB.
// NOPBADEN: Deshabilitamos el módulo conversor ADC del puerto B.
#use delay(clock=48000000)
#DEFINE USB_HID_DEVICE FALSE // NO Vamos a utilizar el protocolo HID.
#define USB_EP1_TX_ENABLE USB_ENABLE_BULK    // Definición del tamaño del buffer de salida.
#define USB_EP1_RX_ENABLE USB_ENABLE_BULK    // Definición del tamaño del buffer de entrada.
#define USB_EP1_TX_SIZE 64
#define USB_EP1_RX_SIZE 64
/*********************************************************************************************************/
// Definición de las librerías utilizadas.
#define USB_CON_SENSE_PIN PIN_C0
#include <pic18_usb.h>    // Drivers's USB del PIC18F2550.
#include <usb_desc_hid.h> // Descriptores USB.
#include <usb.c> // Funciones del USB.
/*********************************************************************************************************/
unsigned int data[64];
void main()
{
   usb_init_cs();    // Iniciamos el puerto USB y salimos.
   output_high(PIN_C6);
   output_low(PIN_C7);
   while(TRUE)
   {
            usb_task(); // Configuramos el puerto USB.
                  if (usb_enumerated()) // Si el puerto es enumerado y configurado por el host..
                  {
     output_low(PIN_C6);
     output_high(PIN_C7);
                     if (usb_kbhit(1)) 
                     {
                        usb_get_packet(1, data, 64);
      if(data[0]==1) output_toggle(PIN_A0);
      if(data[1]==2) output_toggle(PIN_A1);
      if(data[2]==3) output_toggle(PIN_A1);
                     }                                
                  }
   }
}
```
Ahora bien..he estado conectando el pic, y la laptop si lo detecta..pero me dice que no puede empezar el dispositivo..."the device cannot start (code10)"
Disculpa las molestias pero he etsado casi por un mes intentado y nada!!!!...no se si tengas un codigo en c# para probar...y empezar por ahi...
nota. uso windows xp sp3, y visual c# 2008 express. Espero con tus respuestas...


----------



## di3gosl (Dic 25, 2009)

Que tal moyano, pedazo de tutorial que estas reailzando, se te agradece. Me he leído todo el post de este tema y vaya que me he enterado de varias cosas que no tenía en cuenta, el caso es que me quedan algunas dudas que no he podido entender y no puedo avanzar en mi proyecto sin esa parte, a ver si me pueden dar una ayudadita.

Te cuento, actualmente comienzo a trabajar con el módulo USB del PIC18F4550 para la primera parte de mi tesis de carrera. En esta primera parte tengo que desarrollar la comunicacion entre el microcontrolador y la PC, utilizando Labview del lado del PC, para controlar unos cuantos servos, hasta el momento son tres pero podrían ser mas según se desarrolle el proyecto. Bueno la cuestión es que un requisito es que sea desarrollado en ASM, algo más complicado que en C. Pero bueno me he puesto a leer las especificaciones del USB 2.0 y vaya que es bastante, nada más 650 pags y en inglés!!!!! XD así que me salte una buena parte y fui directo al capítulo donde explican el Framework del USB.

Pues voy configurando los registros del USB y los descriptores(En algunos campos de los descriptores todavía tengo dudas pero creo que van bien jeje) y he aquí mi gran duda donde no he podido avanzar más, ¿Cómo va lo de la enumeración del USB o cuáles son los pasos de esta?  no lo entiendo  a ver si me pueden ayudar en este tema, mientras sigo buscando en la red y si encuentro algo lo comento para que sepan también . Y otra duda es que tipo de comunicación me convendría utilizar en este caso. Saludos.


----------



## Moyano Jonathan (Dic 25, 2009)

En este momento estoy de vacaciones pero después cuando vuelva a mi casa me pongo a revisar lo que estaba haciendo y veo como podemos solucionar los problemas que plantean


----------



## Meta (Dic 25, 2009)

mmmmmmmmmmmmmmmm, esto suena que si logro mi propósito, ya no vuelvo.

A ver si logramos poco a poco el código de antes.


----------



## Hernan83 (Dic 25, 2009)

Esta noche de navidad,ya que estoy al divino boton,me puse a armar una plaquita de entrenamiento con este PIC,y al tener un precio de 38 pesos,que es bajo teniendo en cuanta la cantidad de caracteristicas que tiene,tales como I2C,EEPROM,mucha FLASH,conversores A/D,puertos I/O,y sobre todo USB,es buena opcion como entrada a algun dispositivo mas grande,mucho mejor incluso que el famoso FTDI232  
PD: lo estoy haciendo en placa agujereada,porque tengo muuucha fiaca de hacer un PCB


----------



## ChoN (Dic 26, 2009)

Bueno aporto algo, regalito de navidad, un control de LED RGB con un 18F2550, por USB, en modo CDC (serial) con un programa hecho en Visual C# 2008. 
Saludos.

PD: Un "pequeño" manual muy interesante: http://electronicapic.iespana.es/manual/picrs232.pdf


----------



## Meta (Dic 27, 2009)

Hay ejemplos del PIC32.
http://www.johnloomis.org/microchip/pic32/resources.html

Aún experimentando con C# y USB. Espero que no se les haya parado las cosas.


----------



## MVB (Dic 27, 2009)

Bueno Sin leer todo el post. (son 37 paginas ). Alguien me puede dar alguna idea para controlar el USB desde Linux?.

Muchas Gracias


----------



## Meta (Dic 27, 2009)

Por ahora no se ha hablado ni hay proyectos en Linux con el tema del USB, pero si intenraré pasarlo a MonoDevelop con Linux cuando la versión de Windows está acabado y con el lenguaje C#.


----------



## Hernan83 (Dic 27, 2009)

Acabo de colocar al reves en el zocalo un 18F2550 no calento,pero al parecer fallecio... aunque sera que fallecio? lo estoy probando pero no se si no anda debido a eso o a que puse mal los FUSES,ustedes que opinan?


----------



## Meta (Dic 27, 2009)

He puesto al revés el 16F84A y se me cogió un calentón increible. Prueba con otro por si acaso, hay PIC muy sensibles si les lleva la contraria.


----------



## ChoN (Dic 28, 2009)

Hernan83 dijo:


> Acabo de colocar al reves en el zocalo un 18F2550 no calento,pero al parecer fallecio... aunque sera que fallecio? lo estoy probando pero no se si no anda debido a eso o a que puse mal los FUSES,ustedes que opinan?


 
Murió amigo... que descanse en paz... 
Las conecciones de VCC y masa se encuentran exactamente una frente a la otra, al conectarlo al revez muere instantáneamente.
Saludos.


----------



## mikepvr (Dic 28, 2009)

Hola que tal, comento que estoy trabajando en un proyecto de leer pulsos, pero aun no hace eso, solo mantiene comunicacion con e ordenador 
	

	
	
		
		

		
			





, ya lo he probado en proteus y fisicamente; si funciona. Pero la lectura de pulsos lo simule en Proteus para visualizarle en hyperterminal y nada.  Dejo aqui el codigo: (la comunicacion me base en los ejemplos de Jhonatan .

```
#include <18F2550.h> // Definición de registros internos.

#fuses HSPLL,NOMCLR,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN,NOPBADEN

#use delay(clock=48000000) 
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)

#include "usb_cdc.h" // Descripción de funciones del USB.
#include "usb_desc_cdc.h" // Descriptores del dispositivo USB.

#define LED_V PIN_B6
#define LED_R PIN_B7

#define ON output_high
#define OFF output_low

int1 flag_listo = 0;
int16 cont_pulsos = 0;
int16 cont_pulsos_rec;

#INT_EXT
void interrupt_ext (void)
{
cont_pulsos++;
}

#INT_RTCC
void timer0 (void)
{
set_timer0(3036);
cont_pulsos_rec = cont_pulsos;
cont_pulsos = 0;
flag_listo = 1;
}


void main(void) {

   ON(LED_R);
   OFF(LED_V);
   
   usb_cdc_init(); 
   usb_init(); 
   usb_wait_for_enumeration();
   
   OFF(LED_R);            
   ON(LED_V);
   
   set_tris_b(0x01); 
   setup_timer_0 (RTCC_INTERNAL|RTCC_DIV_16);
   ext_int_edge(H_TO_L);    
   enable_interrupts(INT_RTCC);
   enable_interrupts(INT_EXT);
   enable_interrupts(GLOBAL);
   set_tris_b (1);
   set_timer0(3036);
   do{
   if(flag_listo)
   {
   flag_listo = 0;
   printf("Pulsos: %Lu\r\n",cont_pulsos_rec);
   }}while(1);
   
   
   
   
   while(!usb_cdc_connected()) {}
   // espera a detectar una transmisión de la PC (Set_Line_Coding).
   do{
      usb_task();
      if (usb_enumerated()){  // Espera a que el dispositivo sea enumerado por el host.
         if(usb_cdc_kbhit()){ // En espera de nuevos caracteres en el buffer de recepción.
            if(usb_cdc_getc()=='x'){ //¿lo que llegó fué el caracter x?
               printf(usb_cdc_putc, "Se recibe el caracter x.\n\r");
               //si, entonces envía una cadena hacia el PC
             }
            if(usb_cdc_getc()=='a'){ //¿lo que llegó fué el caracter a?
               printf(usb_cdc_putc, "Se recibe el caracter a.\n\r");
               //si, entonces envía una cadena hacia el PC
             }
         }
        }
       }while (TRUE); // bucle infinito.
}
```



aqui adjunto los archivos de proteus y el .hex por si acaso, al compilar el .hex no me genera errores, solo se comunica pero no manda los pulsos, los pulsos los simulo con un switch, bueno espero un ayudadita para que simule bien para probarlo fisicamente.


----------



## MVB (Dic 28, 2009)

ChoN dijo:


> Murió amigo... que descanse en paz...
> Las conecciones de VCC y masa se encuentran exactamente una frente a la otra, al conectarlo al revez muere instantáneamente.
> Saludos.




Algun dia conecte un 16f84a y no le paso nada.


----------



## Meta (Dic 28, 2009)

Porque no lo dejaste mucho tiempo, me ha pasado varias veces el mismo PIC y aguanta caña.

Edito:
Ya ha hecho un AVR de USB, el primero.
http://www.elektor.es/noticias/“mi-primer-avr-usb”-tuyo-por-solo-19-95-€.1199684.lynkx


----------



## mikepvr (Dic 29, 2009)

Hola a todos, alguien que me saque de esta duda, al utilizar la clase CDC del usb con el pic18f2550, se puede mandar datos a la hyperterminal para visualizarlos de manera virtual sin conectar el pin-c6 t pin_c7 fisicamente?


----------



## Meta (Dic 31, 2009)

Feliz año nuevo a todas.

Quizás ya lo sepan, pongo un enlace que a lo mejor pueda ayudar para hacer la interfaz de USB.

http://www.migsantiago.com/index.php?option=com_content&view=article&id=9&Itemid=10




Estoy deseando crear una Interfaz similar a esta (que es RS232) para puerto USB con el *18Fx550*.

Ver el archivo adjunto 27225

Ver detalles.

Eso si, lo quiero hacer como mínimo 8 entradas y salidas digitales, entradas analógicas, etc. Similar a lo que hizo Moyano.



Anda con buen pie. A ver si avansamos un poquito más.




Fuente:
http://www.unpocodelectronica.netau.net/generador-de-inf-para-los-drivers-usb-de-microchip

http://www.youtube.com/watch?v=Q7IXtXklhOo

Saludo.





*Edito:*

He encontrado enlaces sobre 
*mpusbapi.dll*




mpusbapi.dll (I)
mpusbapi.dll (II)
mpusbapi.dll (III)
mpusbapi.dll (parte 4)
mpusbapi.dll (parte 5)
mpusbapi.dll (Primera Aplicación)
Fuente original:
http://www.unpocodelectronica.netau.net/mis-primeros-pasos-con-el-18f4550

Saludo.


----------



## Meta (Ene 2, 2010)

Viendo cosas como estas de USB que es lo que quiero hacer, todavía no he aprendido.





http://www.micropik.com/pag_puertos_usb.htm

Aunque tampoco anda mal en puerto serie.




http://www.micropik.com/pag_puertos.htm

Que es lo que estoy haciendo.


----------



## jokep (Ene 9, 2010)

hola que tal; bueno, la verdad este tema está bastante bueno, yo he estado trabajando un poco con usb cdc, seguido de algunos manuales que han hecho.
pero por alguna razón que desconozco, no se si sea por mi compu o el pic, la comunicacion por usb cdc ya no me funciona, y quería ver si me podrían ayudar, pues creo que también les podría pasar a otros. Resumo mi PROBLEMA:
uso un pic 18f4550, interfaz usb cdc, y los programas que hago para la comunicación están hechos en visual basic .net.
Cuando conecto el pic a la PC, instalo el controlador (.inf), y todo perfecto. si windows le asigna el COM3, ese puerto uso para mi programa, y no pueden entablar comunicación. Y lo que es extraño: todos los programas que he probado, siempre pueden abrir ese puerto COM3, aún aunque ya haya desconectado mi dispositivo, (y haya desaparecido del administrador de dispositivos de windows), como si windows lo mantuviera activo ocultamente. el problema no es al abrir ni cerrar el puerto en los programas, sino al enviar datos.

por cierto: aquí escribo los codigos de mis programas (en PICC y VB.net), ambos están compilados sin errores.
El pic siempre se queda en la pantalla "Iniciando...", y de ahí no pasa.
los codigos son simples, basandome en ejemplos que encontré aquí.
Lo que es mas cuirioso todavía: antes si me funcionaba, hasta un dia en la mañana que la encendí, ya no (como por arte de magia) . es algo de windows?


```
///////////////////////////////////////////////////////////////////////////////////
#include <18F4550.h> // Definición de registros internos.
#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN,NOPBADEN
// Fuses utilizados:
/*
HSPLL: utilizamos un cristal HS de alta velocidad, en conjunto con el PLL para generar los 48Mhz.
-eliminado-NOMCLR: Utilizamos reset por software, y dejamos el pin 1 del micro como entrada/salida digital.
NOWDT: No utilizamos el perro guardían.
NOPROTECT: Desactivamos la protección de código.
NOLVP: Desactivamos la programación a bajo voltaje.
NODEBUG: No entramos al modo debug.
USBDIV: signfica que el clock del usb se tomará del PLL/2 = 96Mhz/2 = 48Mhz.
PLL5: significa que el PLL prescaler dividirá en 5 la frecuencia del cristal. para HS = 20Mhz/5 = 4Mhz.
CPUDIV1: El PLL postscaler decide la división en 2 de la frecuencia de salida del PLL de 96MHZ, si queremos 48MHZ, lo dejamos como está.
VREGEN: habilita el regulador de 3.3 volts que usa el módulo USB
*/
#use delay(clock=48000000)          // Frecuencia máxima de trabajo.
#include "usb_cdc.h"                // Descripción de funciones del USB.
#include "usb_desc_cdc.h"           // Descriptores del dispositivo USB.
#define LCD_ENABLE_PIN  PIN_D2
#define LCD_RS_PIN      PIN_B2
#define LCD_RW_PIN      PIN_B3
#define LCD_DATA0       PIN_B4
#define LCD_DATA1       PIN_B5
#define LCD_DATA2       PIN_B6
#define LCD_DATA3       PIN_B7
#include <lcd.c>
void main() {
   char codigo;
 
   lcd_init();
   lcd_putc("Iniciando...");
 
   ////////////////////////////////////////////////////////////////////////////
   //CONEXION Y HABILITACION DEL USB CON LA PC
   ////////////////////////////////////////////////////////////////////////////
   usb_cdc_init();                  // Configuramos al puerto virtual.
   usb_init();                      // Inicializamos el stack USB.
   while(!usb_cdc_connected()) {}   // espera a detectar una transmisión de la PC (Set_Line_Coding).
   usb_task();
   usb_wait_for_enumeration();      // Espera a que el dispositivo sea enumerado por el host.
 
   while(TRUE){    // bucle infinito.
 
      lcd_putc("\fEsperando codigo");
      codigo=usb_cdc_getc();            //esperar codigo de la PC
      lcd_putc("\fCodigo recibido");
   }  
}
```
 

```
Imports MSCommLib
 
Public Class Form1
Public WithEvents PuertoCom As MSComm
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
PuertoCom = New MSComm
PuertoCom.CommPort = 3
PuertoCom.Settings = "9600,N,8,1"
PuertoCom.InBufferSize = 30
PuertoCom.InputLen = 1
PuertoCom.OutBufferSize = 30
While Not PuertoCom.PortOpen
Try
PuertoCom.PortOpen = True
Catch ex As Exception
End Try
End While
PuertoCom.Output = "p"
End Sub
End Class
```
 
gracias, sé que ustedes sabran cual es el problema, porque yo lo noto un tanto confuso. si no lo dejé claro, por favor pregunten

gracias
salu2


----------



## edusolano (Ene 11, 2010)

Hola a todos, soy nuevo el foro. Me llamo Edu.
Primero de todo felicitar a todo el mundo por las aportaciones que estan haciendo, me interesan muchisimo y creo que estan muy bien explicadas.

Ahora si, tengo una duda, la diferencia que existe entre el protocolo HID y el bulk transfer, donde está? en el software de control?? porque no veo ninguna diferencia entre el programa escrito en CCS de un pic con el protocolo bulk transfer y el protocolo HID.

Muchas gracias de antebraso.


----------



## Hernan83 (Ene 11, 2010)

Fijate que en los principios de este tema esta la respuesta que necesitas...


----------



## di3gosl (Ene 11, 2010)

edusolano dijo:


> Ahora si, tengo una duda, la diferencia que existe entre el protocolo HID y el bulk transfer, donde está? en el software de control?? porque no veo ninguna diferencia entre el programa escrito en CCS de un pic con el protocolo bulk transfer y el protocolo HID.



Pues mira la diferencia es precisamente el tipo de transferencia que utiliza. Las transferencias pueden ser de cuatro tipos: Control, Bulk, Interrupt e Isochronous. El protocolo HID utiliza transferencias de tipo Control e Interrupt, mientras que para el protocolo bulk transfer que comentas utiliza de tipo Control y Bulk. Para el caso de transferencias tipo Interrupt está asegurado la integridad de los datos que se envían así como el tiempo que tardan en llegar, en tipo Bulk solo está asegurado la integridad de los datos.

Otra diferencia que tiene es que el tipo Bulk no puede utilizarse en dispositivos Low-Speed, Interrupt se encuentra permitida en todas las velocidades. 

Una más es el driver que se utiliza para la comunicación. Usando para Bulk un driver específico que comunmente es proporcionado por el fabricante, en este caso la mpusbapi.dll de microchip, o bien puedes desarrollar tu propio driver. En la transferencia Interrupt para un dispositivo de la clase HID se utilizan los drivers que trae Windows.

Diferencias existen muchas más pero considero que estas son las más importantes, espero te ayude en algo. Saludos.


----------



## jokep (Ene 12, 2010)

oigan, yo tengo una dudototota. Con un amigo estamos haciendo un dispositivo que, a parte de hacer otras cosas con las que obtiene datos, se puede conectar a la PC por USB y comunicarse con un programa (para que el usuario vea ahi los datos y los pueda guardar). Si queremos venderlo, ¿qué lenguaje debemos usar para el programa de la PC, con el cual no tengamos que pagar licencia (como con Visual Basic) y que no nos metamos en problemas legales al venderlo? ¿La licencia de Java te lo permite?

salu2


----------



## Meta (Ene 12, 2010)

Con Visual C# Express, Visual C++ Express y Visual Basic .net Express no tendrás problemas.

http://www.microsoft.com/express/

Saludo.


----------



## jokep (Ene 12, 2010)

gracias meta; y por simplicidad en el código para la comunicación USB, cuál de los tres anteriores me recomiendas???
por cierto, si voy a empezar una aplicación para usb desde 0, me conviene más usar la clase CDC que la transmisión Bulk???

Salu2


----------



## Meta (Ene 12, 2010)

El mejor que sepas, si no sabes ningujo, empieza por el más fácil que es el VB y C#. Para Driver se recomienda el C++. usted elige. Personalmente me gusta más el C#, no por ello significa el mejor.


----------



## jokep (Ene 13, 2010)

y sobre usar CDC o Bulk, cuál es mejor??? realmente es mucho más fácil el CDC???
no llega a fallar???


----------



## Moyano Jonathan (Ene 13, 2010)

yo realmente te recomiendo java para la aplicación y modo Bulk para transmisión de datos


----------



## jokep (Ene 13, 2010)

oigan, y que es más facil usar: la mpusbapi.dll de  microchip o el WinUSB.
tengo entendido que ambos funcionan tanto en xp, vista y Win7


----------



## Meta (Ene 13, 2010)

Las cosas que funcionene en el Vista funcionará en el 7 porque su base es el Vista pero mejorado y llamdo 7.

Para los que quieran USB para PIC32, pueden empezar por aquí.

Son tres páginas.
http://pascual.powweb.com/curso-pic32.html

http://pascual.powweb.com/curso-pic32.html?start=1

http://pascual.powweb.com/curso-pic32.html?start=2


http://www.youtube.com/watch?v=E2lraKVckuY


----------



## loloco (Ene 18, 2010)

Antes que nada gracias a Moyano y a toda la gente que ha aportado a este foro donde he aprendido lo suficiente como para poder realizar mis primeras aventuras con el USB de los pic, por el momento estoy atorado con la comunicacion del pic y la pc usando labview, hasta ahora sólo logro que sea reconocido pero no tengo control alguno del mismo, estoy usando el ejemplo de Moyano de prender y apagar el led por medio de HID, les agradecería su ayuda.


----------



## COSMICO (Ene 19, 2010)

Moyano Jonathan...Meta
Gran labor la de ustedes, los felicito
Me le pegare para aprender y depronto hacer preguntas un poco torpes, de prinsipiante..


----------



## Moyano Jonathan (Ene 20, 2010)

Las preguntas de principiantes son bienvenidas ...lo que te pido es ser objetivo con lo que preguntas asi te podemos ayudar de igual forma.
Un saludo !


----------



## loloco (Ene 20, 2010)

Hola Moyano, tengo una serie de preguntas, espero puedas ayudarme.

He tomado el ejemplo que desarrollaste para encender y apagar un led, lo he modificado un poco para que realice lo siguiente:

1. que cuando llegue un paquete de datos al buffer de entrada del usb, lo tome y lo almacene en la variable data.
2. que el dato recibido lo muestre en el puerto b del pic.

El programa de control lo estoy haciendo en labview en el cual he visto que no tienes mucha experiencia (en eso puedo ayudarte) y hace lo siguiente:

1. envío un paquete de datos de 8 bits, el pic lo detecta pero no lo muestra en el puerto b como se supone lo he programado.

Este es el código del pic (tomado de tu diseño), podrías revisar si hay algo mal¿?

// Programa de prueba del protocolo HID (Human interface device).
// Programa: Recibe un byte del EP1, si byte = 1 prende LED.
// Programador: Moyano Jonathan.
// Fecha: 6/03/09


#include <18F4550.h> // Definición de registros internos del PIC18F2550.
#fuses NOMCLR,XTPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL1,CPUDIV1,VREGEN,NOPBADEN
// NOMCLR: No vamos ha usar el PIN MCLR, el reset se hará por soft.
// XTPLL: Vamos a usar un cristal de 4.00Mhz.
// NOWDT: No vamos a usar el perro guardian.
// NOPROTECT: Memoria no protejida contra lecturas.
// NODEBUG: No utilizamos código para debugear.
// NOLVP: No utilizamos el modo de programación con bajo voltaje.
// USBDIV: signfica que el clock del usb se tomará del PLL/2 = 96Mhz/2 = 48Mhz.
// PLL1: significa que el PLL prescaler no dividirá la frecuencia del cristal. para XT = 4Mhz.
// CPUDIV1: El PLL postscaler decide la división en 2 de la frecuencia de salida del PLL de 96MHZ, si queremos 48MHZ, lo dejamos como está.
// VREGEN: habilita el regulador de 3.3 volts que usa el módulo USB.
// NOPBADEN: Deshabilitamos el módulo conversor ADC del puerto B.
#use delay(clock=48000000)


#DEFINE USB_HID_DEVICE TRUE // Vamos a utilizar el protocolo HID.

#define USB_EP1_TX_ENABLE USB_ENABLE_INTERRUPT 
#define USB_EP1_TX_SIZE 8 // Definición del tamaño del buffer de salida.

#define USB_EP1_RX_ENABLE USB_ENABLE_INTERRUPT 
#define USB_EP1_RX_SIZE 8 // Definición del tamaño del buffer de entrada.

/*********************************************************************************************************/

// Definición de las librerías utilizadas.
#include <pic18_usb.h>    // Drivers's USB del PIC18F2550.
#include <USB_easyHID_descriptores.h> // Descriptores USB para la placa MoyaPIC_USB28 y easyHID.
#include <usb.c> // Funciones del USB.

/*********************************************************************************************************/

// Variables globales.
int8 data[8]; // Variable de 8 bytes que guardan el valor del EP1_RX.
set_trisb(0x00);
void main()
{
   usb_init_cs();    // Iniciamos el puerto USB y salimos.
   while(1)
   {
            usb_task(); // Configuramos el puerto USB.
                  if (usb_enumerated()) // Si el puerto es enumerado y configurado por el host..
                  {
                     if (usb_kbhit(1)) // Si hay un paquete de datos en el buffer lo tomamos y guardamos en la variable data.
                     {
                        usb_get_packet(1, data, 8);
                        output_b(data);
                      }                                
                  }
   }

}

Gracias


----------



## Moyano Jonathan (Ene 20, 2010)

mi ejemplo está funcionando correctamente , en una de esas tu problema está en el driver....lo que tenés que hacer es ver como tu programa se comunica con el driver HID llamado easyHID.dll. esta librería contiene todas las funciones de control que necesitas pero no tengo ni idea de como enlazarla con labview.


----------



## Meta (Ene 21, 2010)

¿Aún sigues con el proyecto de la imagen de abajo? Parece medio abandonado.


----------



## Moyano Jonathan (Ene 21, 2010)

Si pero tuve un inconveniente con un proyecto comercial con un cliente y paré todo lo mio pero en breve sigo con este ejemplo. También les quiero contar que he agregado algunas cosas al manual de USB que terminaré si dios , el trabajo y los estudios me lo permiten para este año. Además estoy desarrollando 2 entrenadores uno para PIC y otro para AVR.


----------



## COSMICO (Ene 22, 2010)

Moyano Jonathan..
Una pregunta.
Como ago para que el pic con el ejemplo que diste, en vez de escribir determinado 
caracter, al pulsar una tecla tambien determinada..
me trabaje en modo eco..lo que yo escriba me lo escriva tambien en el puerto virtual.
Perdon la ignorancia, pero lo estoy intentando y no lo logro.
Gracias..


----------



## isidromar (Ene 22, 2010)

Hola 
como puedo mandar un float por usb utilizando bulk

gracias.


----------



## Gradmaster (Ene 24, 2010)

Jonathan agradeceria si nos pudieras proporcionar la dll busque en la pagina de microchip y no encuentro mas que puras descripciones y manuales, o decir como la conseguiste, de antemano gracias.


----------



## jokep (Ene 25, 2010)

oigan; una preguntota:

uso el modo de transmisión usb bulk con la MPUSBAPI de microchip;

existe alguna función para el programa de la PC (en C#) que detecte si hay datos en el EndPoint??  (algo así como el usb_kbhit del PIC); o cómo puedo hacerle para que sólo si hay datos vaya y los lea y no vaya a lo tonto y no encuentre nada...

en realidad estoy buscando una manera de tener al pic y a la PC sincronizados, y no que el pic mande algo pero que la PC ya haya leído el buffer y no pueda encontrar nada...    tiene que ver el Time-out que viene dentro de las funciones de la MPUSBAPI???; o debo mantener los pipes abiertos???

gracias y
salu2


----------



## Meta (Ene 26, 2010)

Si no existe, al menos intentalo hacer.


----------



## COSMICO (Ene 27, 2010)

Moyano Jonathan
Amigo
Tengo un problema con tus ejemplos. Trato de simularlos en proteus
Pero no son detectados por el usb, pero si abro uno de los ejemplos 
que trae el mismo proteus si lo detecta.
Me colaboras por afavor!


----------



## picca (Ene 27, 2010)

No se donde colocar esto disculpen si esta mal pero necesito ayuda en un proyecto con el pic 18f2550, estoy haciendo un pryecto de una luces de les controladas por el protocolo dmx de iluminacion profecional.Busque algo en internet y adapte un programa, el tema es que no funciona. les adjuntaria el programa pero soy nuevo en el foro y no se como adjuntarlo, esta programado en c 
Espero su ayuda, desde ya gracias


----------



## Moyano Jonathan (Ene 27, 2010)

@COSMICO .... a mi tambien me andan mal en proteus pero en la entrenadora USB me andan perfecto.
@picca........tenes que leer en la ayuda del foro ahi sale como poner el código


----------



## jesolar (Ene 28, 2010)

Hola, soy nuevo (frase repetida  ), bueno estoy trabajando con el pic 18f2550, y solo queria agradecer a Moyano por su esfuerzo, el conocimiento es para repartirlo asi se construye, gracias.


----------



## medina jr (Ene 29, 2010)

Nose si mi mensaje es el apropiado para este tema, sino es asi decirme en cual puedo recibir la informacion.
Mi intencion es hacer *un PIC PAL TV, es decir, reproducir por television por ejemplo el tetris*, atraves del Pic, pero estaba usando el 16f84, tras un tiempo de prueba he llegado ala conclusion de que *necesito un Pic con mas memoria*, asi que queria que me ayudarais a elegir cual seria el mas apropiado de la seria 18, y si cambian mucho las instrucciones. A poder ser, yo quiero el 18f4620 que ya existen las librerias hechas y de la pagina que recibo la informacion lo hace con ese:
http://www.ucontrol.com.ar/wiki/index.php/PIC_PAL_Video_Library 
De todos modos reconozco que no se practicamente nada de esta familia

Gracias por anticipado


----------



## COSMICO (Ene 29, 2010)

Esperen me les salgo del tema amigos..
Siguiendo los pasos que se encuentran en un tuto que baje de este foro
"PROYECTOS CON PIC Y SIMULACION EN PROTEUS"
intento acoplar mi c ccs al mplab paso a paso, tal cual el tutorial
pero no me funciona cuando compilo me da un error..
y otra cosa..Alguien sabe donde puedo bajar el mplab tipo portable 
para cargarlo en una memoria usb..

Gracias por su ayuda


----------



## Moyano Jonathan (Ene 29, 2010)

MPLAB portable nunca lo he visto.....CCS se acopla al MPLAB a través de un plugin que tenés que instalar.


----------



## COSMICO (Ene 29, 2010)

Moyano Jonathan
Si eso del plugins lo se.,,
y ya lo instale..pero sigo con el problema del error..
si me pueden guiar se los agradesco..


----------



## Moyano Jonathan (Ene 29, 2010)

Ahora estoy con ubuntu ...pero sino en gogle creo que hay tutoriales de como enlazar MPLAB con CCS


----------



## ingdenis1 (Feb 1, 2010)

hola moyano,
trato de correr el software de control hecho en visual basic 6 en windows 7 y me marca error y ya le puse compatibilidad con xp, existira alguna forma de hacerlo compatible con windows 7 pues no quiero regresar a xp , pero necesito manejar leds mediante el puerto usb de la pc y con un pic.existira algun manual por ahi o cualquier informacion seria agradecida.


----------



## Moyano Jonathan (Feb 2, 2010)

mirá estoy preparando ejemplos en VB.net 2008 para que corran en WIN XP,VISTA Y 7 pero hasta el momento no puedo postear nada por que estoy con bastante trabajo y no tengo tiempo...pero como lo he dicho antes en cuanto tenga todo listo posteo.


----------



## Meta (Feb 2, 2010)

Ánimo Moyano Jonathan, tiempo al tiempo se consigue todo.


----------



## COSMICO (Feb 2, 2010)

Amigos.
Les recomiendo si tienen un tutorial de C#
No estaria de mas..
Gracias


----------



## Moyano Jonathan (Feb 3, 2010)

COSMICO googleando se consigue .....ahora si querés algo más referido al tema que estamos tratando @Meta en páginas anteriores creo que posteó un libro donde muestran un ejemplo de como hacerlo ....

Otra cosa @Meta he encontrado una posible solución a nuestros problemas con la librería HID y C# : Mike O'Brien \ Labs \ USB Hid Device Library....esta sería una posible solución pero tendría que hacer pruebas para haber si es posible usarla..en estos ejemplos se encuentra la forma de usar las librerías nativas de windows ....también estoy buscando como usar las librerías nativas de HID en LINUX como para empezar a hacer aplicaciones compatibles con ese SO.

un saludo !


----------



## COSMICO (Feb 3, 2010)

Gracias Moyano Jonathan.
Estare al tanto a ver como nos va con el tema.


----------



## jesolar (Feb 4, 2010)

Hola Moyano, te queria preguntar donde puedo buscar algo para aprender a hacer una interfaz en VB, especificamente la parte de concetar el usb o leer el usb, lo que quiero es poder hacer una interfaz para el 18f2550. se que en este foro tu has subido ejemplos con interfaces pero quiero poder saber de donde viene todo el codigo de eso. gracias.


----------



## Moyano Jonathan (Feb 4, 2010)

El código viene después de investigar bastantante .....y si querés hacer interfazes mis ejemplos son sufiencientes para aprender...
un saludo !


----------



## noriad (Feb 5, 2010)

Saludos a Todos 
Amigos alguien conoce   algun foro donde se hable de usb pero  en ensamblador, porque es lo que yo se hacer 
Gracias de antemano


----------



## traka (Feb 8, 2010)

Moyano, tras leer el pedazo de post, y digo pedazo por tamaño y calidad, felicitarte( y a lso que participan activamente), estoy empezando mi proyecto de fin de carrera de Ingenieria Informatica, y me ha sido de gran ayuda. Felicitarte y darte animoas para que continues con el manual, que puede ser de gran ayuda a los que empezamor.
Saludos!


----------



## Moyano Jonathan (Feb 8, 2010)

*Un aviso que quiero darles a todos es que el CCS ya incorpora en su versión 4.104 el stack de USB para PIC24.....eso si solo para Bulk mode....HID....y CDC...para los que quieran probar el USB host o USB OTG tendrán que experimentar en C30 que es el compilador C para esta familia de microcontroladores  de microchip.*


----------



## Meta (Feb 8, 2010)

mmmmm, siento curiosidad cuando salgan PIC ya con USB 3.0, convivirán los PIC18Fx550 del USB 2.0 con los nuevos PIC18Fxxxx para USB 3.0.

Por lo que veo tardarán unos añitos más, ya que apenas no se han implementado el standar del nuevo protocolo. En placas bases para PC se están implantando pero son poquitas.


----------



## noriad (Feb 9, 2010)

Meta tu conoces algun foro donde hablen de usb en ensamblador ,para compartir  criterios. Domino el protocolo  y algunas de sus clases pero en ensamblador para pIC .


----------



## Meta (Feb 9, 2010)

Sólo conozco uno y en Inglés. Puedes participar exactamente en este enlace.

http://www.microchip.com/forums/tt.aspx?forumid=102

Hay ejemplos en ASM y USB 2.0 en la propia www.microchip.com y lo veo complicado de entender. Más fácil es el C.

Saludo.


----------



## Moyano Jonathan (Feb 9, 2010)

como dice meta USB es más faci en C que en ASM pero si realmente querés entender que es lo que pasa a nivel fisico lo mejor es programar en ASM


----------



## breogan (Feb 11, 2010)

Hola Moyano,

Antes que nada, felicitarte por este excelente post...!

He intentado conectar un PIC18F2550 al PC (utilizando los ficheros del ejercicio #1), el Windows XP me indica que no ha podido enumerar el dispositivo.

He leido casi todo el post, me he cerciorado de que el capacitor de 470nF en Vusb esté en el circuito (uso un protoboard, no una placa PCB), he instalado el driver "mchpcdc.inf" de la carpeta "DRIVER_WINXP", he solucionado algunos problemas de compilacion (uso MPLAB con CCS)... etc, pero no consigo dar con la tecla.     :-/

¿que puede ser lo que me este fallando?

Esta es la informacion que obtengo del dispositivo usando un sniffer de USB:

===>Device Information<===---

ConnectionStatus:                  FailedEnumeration
Current Config Value:              0x00  -> Device Bus Speed: Low
Device Address:                    0x00
Open Pipes:                           0
*!*ERROR:  No open pipes!

          ===>Device Descriptor<===
*!*ERROR:  bLength of 0 incorrect, should be 18
bLength:                           0x00
bDescriptorType:                   0x00
bcdUSB:                          0x0000
bDeviceClass:                      0x00
*!*ERROR:  Device enumeration failure


Por cierto, os dejo como aporte el sniffer de USB, aqui va el link:


Gracias y un saludo.


----------



## Moyano Jonathan (Feb 11, 2010)

Hola como estás... mirá tu descripación de error aunque no lo podás creer es un error de montaje o un USB de la PC roto....te lo digo por experiencia.
Primero que nada revisa bien todo el esquemático....también proba viendo otros esquemas de otros proyectos......
el sniffer USB te muestra 0x00 en todos los parámetros por que no tenés conectado nada....un error muy frecuente es conectar los pines d+ y d- del PIC18F2550 al revez por lo que el error que te mostrará la PC será: dispositivo no enumerado...
yo te digo que he probado 1000 veces esa aplicación en WinXP y funciona de 10. Ahora estoy pasando las aplicaciones a C# y VB.net aunque me está costando bastante 

Espero que podás hacerlo andar


----------



## breogan (Feb 12, 2010)

Fue intercambiar D- con D+ y el dispositivo se ha enumerado de inmediato... muchas gracias Moyano !
Ya tengo para divertirme un buen rato con esto del PIC-USB !.


----------



## salenss (Feb 12, 2010)

Hola Moyano y a todos los que dieron su aporte al tema
Estoy como 3 horas leyendo desde la primera pagina y apenas voy a la mitad es muy interesante todo lo que aportaron seguire con la lectura aunque me tome muchos dias mas jejejejeje gracias otra vez.
Aunque la comunicacion USB la realize hace unos años atras todo esto en lenguaje asm en esa temporada me volvi loco tratando de hacer que funcione al fin lo logre con mucha dificultad y todavia tiene algunos errores. Probare en C de CCS y espero que el pic18F2550 con el que realizo pruebas todavia tenga vida util mas larga porque ya que lo explote demasiado y por el momento no me es posible conseguir otro.
Probare todo los ejemplos que subieron ah y por supuesto que tendre que recordar de nuevo y aprender lo que no se 
Saludos picmaniacos


----------



## Moyano Jonathan (Feb 13, 2010)

Hola salenss como estás 

esto del USB a mi me llevo un año completo y sigo contando para ver descubrir como poder comunicarme con ese puerto, aunque con mucho esmero tiempo y dedicación (horas de sueño perdidas ajjaj) pude lograrlo ....

PD: Si tenés ejemplos trabajando de USB en ASM serán bienvenidos


----------



## Meta (Feb 13, 2010)

Por si acaso, más información sobre puerto USB. Eso si, el autor está muy cabreado y cerró su Blog, pero dejó el resto de ayudas.

http://encaminandoc.blogspot.com

Saludo y una lástima.


----------



## Moyano Jonathan (Feb 13, 2010)

con el tema de la librería sobre HID voy a ver que cambios puedo hacer para hecharlo andar de otra forma ...por que me parece que me estoy complicando sin razon ..
voy a intentar con la librería HID nativa de windows a ver que pasa


----------



## foxterfox (Feb 14, 2010)

EXTRAORDINARIO!!!!!!!!!!!!!!!!!!
me tube q leer las 40 paginas del post para aumentar mi idea acerca del USB, me servira muxo pa mi proyecto de curso. (control duplex de velocidad y temp por RF)  si voy bien mando avances .

Realmente *muxas gracias*, Moyano, Meta.

Gran Trabajo.


----------



## breogan (Feb 15, 2010)

Aqui os dejo un link (en ingles) muy bueno:
http://www.beyondlogic.org/usbnutshell/usb5.htm#ConfigurationDescriptors

salu2


----------



## edusolano (Feb 15, 2010)

Hola a todos amigos.

Tengo alungas dudas, la primera es que en internet he visto algunos ejemplos, por ejemplo (de este foro) en los que los condensadores conectados con el cristal son de 22 pF y en el pin Vusb es de 470 nF. Mientras que en otros ejemplos de otra parte son de 15 pF y en el pin Vusb tenemos un condensador de 47 uF. Podrian explicarme las diferencias o como afecta esto al circuito? 

Y aparte, si tengo un cristal de 20 Mhz, y quiero que funcione a la velocidad determinada para USB, entonces debo poner delay clock = 48000000 y lo de los fuses no me quedo muy claro como funciona. Si pueden explicarlo un poco más y así poderlo aplicar a mi proyecto se lo agredeceria muchisimo.

Un saludo a todo el mundo!


----------



## Moyano Jonathan (Feb 15, 2010)

hola edu...
mirá mis respuestas a tus preguntas:
1º - El condensador que va en Vusb , es un condensador para filtrado y estabilización del voltaje del regulador interno de 3.3v que trae el PIC18F2550. Microchip recomienda 470nf para un buen funcionamiento (el que yo uso Y FUNCIONA PERFECTO) y otros que le ponen 47uf pero el funcionamiento no cambia..
2º - El valor de 15pf es el valor correcto para 20Mhz de cristal ...pero yo lo he usado de 22pf con el mismo cristal sin ningún tipo de problema..
3º - para la configuración de fuses tenés que poner lo siguiente:
(en caso de que programes en C de CCS):
#fuses NOMCLR,HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN,NOPBADEN

esta configuración de fusibles es para 20Mhz de cristal ...con el USB funcionando y velocidad de trabajo de 48Mhz.

Espero haberte ayudado


----------



## breogan (Feb 16, 2010)

Hola Moyano,
Tengo un problemilla, resulta que el PIC no está contestando al caracter "x" que le envia la aplicacion del ejemplo #1. ¿Que puede estar mal?, ya he visto que se conecta y se enumera, tambien he puesto unos leds (como flags) para saber por donde ha pasado y me parece que no está entrando en el if del "usb_cdc_kbhit()" pues no se enciende ese led que he puesto dentro del if.

Este es el codigo:

```
#include <18F2550.h>

#fuses HSPLL,NOMCLR,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN,NOPBADEN

#use delay(clock=48000000)

#include "usb_cdc.h"
#include "usb_desc_cdc.h"

#define Led1            PIN_A0
#define Led2            PIN_A1
#define Led_ON(x)         output_low(x)
#define Led_OFF(x)         output_high(x)

void BlinkLed(int num)
{
  switch (num)
  {
       case 1:      Led_ON(Led1);
                           delay_ms(100);
                           Led_OFF(Led1);
                           delay_ms(100);
                           break;
    case 2:       Led_ON(Led2);
                          delay_ms(100);
                          Led_OFF(Led2);
                                       delay_ms(100);        
                                       break;
   }
}

void main()
{
usb_cdc_init();
usb_init();

while(!usb_cdc_connected())
 {
 Led_ON(Led1);  // para ver si ha entrado en este while
 }
delay_ms(1000);
Led_OFF(Led1);

do
   {
   BlinkLed(1);  //flag ciclico
   usb_task();
   if (usb_enumerated())
   {
   if(usb_cdc_kbhit())
    {
    BlinkLed(2);  // para ver si ha entrado en if de usb_cdc_kbhit
       if(usb_cdc_getc()=='x')
     {
     printf(usb_cdc_putc, "z"); // respondo con un solo caracter "z"
          Led_ON(Led2);   // flag de if usb_cdc_getc
          }
    }
  }
  delay_ms(2000);
  Led_OFF(Led1);
 } while (TRUE);
}
```

He hecho unas trazas (con un programa muy bueno que se llama USBlyzer) para que veas todo el proceso (tambien tengo el fichero de la traza):








Gracias y un saludo !


----------



## Moyano Jonathan (Feb 16, 2010)

Tanto el programa como la aplicación para USB funcionan bajo windows XP..tenés que usar el firmware que puse yo al principio ..si lo modificas puede ser que no funcione correctamente....otra cosa proba con el hyperterminal.
Si usas Win Vista32 o Vista64 asi también como Win7_32 o Win7_64 pueden ver problemas de funcionamiento, los cuáles solucionare en cuanto postee las actualizaciones de los programas que van a salir en cuanto termine de solucionar algunos conflictos de programación ..


----------



## breogan (Feb 17, 2010)

Hola Moyano,
Me pasa algo muy curioso, si cargo tu fichero "PIC18F2550_CDC_USB.hex" utilizando File->Import, funciona perfectamente, pero si compilo el código usando el fichero "PIC18F2550_CDC_USB.C" (sin modificar) para crear el fichero .hex desde el MPLAB, no me funciona. Se llega a registrar y enumerar, hasta se transfieren los datos de Get Line Coding, pero no me contesta nada al pulsar "X" o "A".

¿Habrá que configurar algo más en el proyecto del MPLAB?  ¿?¿?¿?¿?

Los Headers Files que tengo en el proyecto son:
18F2550.h
ctype.h
pic18_usb.h
usb.h
usb_cdc.h
usb_desc_cdc.h
usb_hw_layer.h

Gracias y un saludo !
PD: que vergüenza no poder pasar ni del 1er ejemplo joder...


----------



## Moyano Jonathan (Feb 17, 2010)

yo modifique los descriptores del dispositivo nomás pero como decís es raro.....
por las dudas usa mi archivo de descriptores para que no te de errores...


----------



## grafisoft (Feb 21, 2010)

uy bueno este post, tiene un monton de informacion y ejemplo. Quisiera descargar el manual de Moyano Jonathan pero me es imposible descargar nada de mediafire, alguien que lo tenga y lo pueda subir a otro sitio.

Saludos y gracias


----------



## salenss (Feb 22, 2010)

Buenos señores continuare con la lectura en la que me quede, por cierto si es como dice Moyano es para mas dedicacion, tiempo y algunas noches sin dormir, pero lo malo es que en estos dias ando un poco ocupado.
Pero como dice la cancion de los amigos Kjarkas "tiempo al tiempo" jejejejejeje.
No se a que manual te refieres (sera por que aun no termine la lectura de las 41 paginas del foro jejejejeje) pero mas informacion sobre usb que tambien pude encontrar esta en http://www.usbmadesimple.co.uk/index.html, si alguien ya indico el sitio me disculpara.
Saludos picmaniacos, continuare con la lectura


----------



## breogan (Feb 23, 2010)

grafisoft dijo:


> uy bueno este post, tiene un monton de informacion y ejemplo. Quisiera descargar el manual de Moyano Jonathan pero me es imposible descargar nada de mediafire, alguien que lo tenga y lo pueda subir a otro sitio.
> 
> Saludos y gracias




Hola grafisoft,
Aquí he dejado uno que tengo en PDF, no se si será el que estas buscando:


Un saludo.


----------



## grafisoft (Feb 23, 2010)

Es la ultima version del manual que saco?? Porque yo pude ver que tenia 2 pdf pero no pude descargar ninguno, no obstante gracias breogan por subirmelo a otro sitio. 

Tiene muy buena pinta.

saludos


----------



## Moyano Jonathan (Feb 23, 2010)

Le falta pulir muchos detalles todavía al manual pero de a poco se los voy agregando


----------



## COSMICO (Feb 23, 2010)

Bueno esto del usb..
Es el mejor foro que encuentro en la web..
Con personas como ustedes; vale la pena este mundo.
Gracias amigos..


----------



## edusolano (Feb 23, 2010)

Muchas gracias por la respuesto, ahora ya me queda claro.

Por cierto, hace falta tocar algo de la configuración de bits de mplab (Configure -> Configuration bits)? lo digo porque todo esto que ponemos en los fuses, también está ahy con lo cual no se hay que tocar algo de allí o no :S .. Gracias y un saludo a todoos!


----------



## Adler (Feb 25, 2010)

Hola soy Nuevo en esto de interfazes y esas cosas, estos dias e estado leyendo este tema y de verdad que es el mas completo que hay en la web ,porlomenos yo busque harto y no encontre casi nada .
La cosa esque e estado escribiendo un codigo en Vb 2008 para la comunicacion, hasta ahora me funciona perfecto eso de seleccionar COM disponibles en el pc, tambien funciona bien esto de enviar datos al micro, pero ahi empiezan los problemas, la cosa esque usando el codigo en ccs que se subio antes para que cuando se enviara una "x" y una "y" enviara un printf confirmando que el dato volvio, use el .exe que subio moyano echo en vb 2008 lei, envia x e y perfectamente y recibe un mensaje de confirmacion, pero cuando uso mi programa envia x e y,(de echo puse para que se enviara lo introducido en un textbox) pero no recibo absolutamente nada nisiquiera en el serial monitor recibe algun dato desde el micro usando el mismo codigo en el micro que use para el exe de moyano, nose que puede ser, creo que hay un problema en el codigo de vb en la parte de recepcion de echo no funciona para nada jajaja estoy intentando usar un rich text box para la recepcion de datos, bueno me gustaria que alguien me pudiera ayudar en el codigo de vb en la parte de recepcion para ver que funcione bien esta cosa.

Adjunto lo que llevo de vb 2008 con el proyecto entero ojalaa me puedan ayudar.

Como software para monitorear el COM virtual uso "Free serial port monitor"
http://www.serial-port-monitor.com/
espero que se pueda hacer algo, gracias de antemano


----------



## ingdenis1 (Feb 25, 2010)

hola necesito una libreria para manejar un teclado matriz 4x4 para ccs c, tengo la kbd pero necesito una modificada pues la que trae kbd.c es solo para teclados 3x4, gracias de antemano


----------



## edusolano (Feb 25, 2010)

Alguien ha probado el ejemplo de colpic? está en esta pagina:

http://colpic.webcindario.com/proyectos.html

Esta página ya ha salido, por este hilo. Se trata de una conexión USB mediante el protocolo de Bulk Transfer. Simulando en proteus el ejemplo me funciona perfectamente todo, pero al probarlo en una placa no. El tema está en que el USB me detecta el hardware y claro, me sale el asistente para instalar los drivers. Yo le doy a siguiente, y que busque los drivers por él mismo, pero al final me sale un mensaje de error diciendo que no ha encontrado los drivers. Por esto les pido que si alguien ha echo una conexion USB con Bulk Transfer porfavor me diga que debo hacer para que el ordenador instale bien los drivers. Muchas gracias a todos!!


----------



## breogan (Feb 26, 2010)

Moyano Jonathan dijo:


> yo modifique los descriptores del dispositivo nomás pero como decís es raro.....
> por las dudas usa mi archivo de descriptores para que no te de errores...



Hola Moyano,
Ya he dado con la clave, yo estaba usando la version 4.093 del CCS. Hice un downgrade de la version, baje a la 4.065 y ahora si funciona cuando compilo el proyecto desde mi MPLAB. Por curiosidad, ¿que version de CCS utilizas?

No tengo muy claro porque, pero me parece que la gente de CCS ha hecho algun cambio en las librerias USB que no está bien ¿?¿?¿?.

Pues eso.. a seguir urgando ....
Un saludo

Pues si, hay un problema en la version 4.093 del CCS.

Mas info en el foro de CCS:
http://www.ccsinfo.com/forum/viewtopic.php?t=40319&highlight=093
http://www.ccsinfo.com/forum/viewtopic.php?t=40778&highlight=093

Ya sabeis... la 4.093 no esta OK.


----------



## KOX (Feb 26, 2010)

Hola a todos:
                     Pido una disculpa por salirme del tema pero estoy de hacer una interfaz con Visual c++ y HID pero no escuentro las librerias para este compilador y las instrucciones pora recibir y enviar datos al pic. Gracias y un saludo


----------



## Moyano Jonathan (Feb 26, 2010)

Adler acá en el foro hay un ejemplo igual al tuyo hecho en Visual Basic 2008.net pero no me acuerdo en que página así que lo vas a tener que buscar.

ingdenis1 perdón que te moleste pero tu pregunta está fuera de contexto ..por favor buscá en el foro con el buscador que seguro encotras mucha info sobre eso.

breogan: Las últimas versiones de CCS vinieron con muchos errores pero es cuestión de ver cuáles son en su página ....ahi ellos explican la mayoría de ellos y por desgracia uno a veces tiene que adaptar sus programas a dichos errores.
PD: Usaba con normalidad la 4.023 y no me ha traido problemas....ahora me pase a la 4.104 a ver que pasa..

KOK  buscá en internet easyHID , este programa te genera un proyecto completo para trabajar con HID y Visual C++ los ejemplos de programación para el PIC lo podés sacar desde internet o desde este mismo hilo donde uso una librería de descriptores para ese programa.


----------



## KOX (Mar 2, 2010)

Moyano he estado buscando en internet y no consigo descargarlo, tendras un link de descarga directa.

Un saludo.


----------



## Moyano Jonathan (Mar 2, 2010)

acá está ..


----------



## cho-k (Mar 5, 2010)

Saludos a todos

Soy un poco nuevo en el tema , programo en C compiler  y VB6.0...
Mi duda es la siguient :
Como hago para   enviar  datos mayores a 255 en  el protocolo de Bulk Transfer o HID....
Si alguien  me pudiera colabrar me seria de gran ayuda.....


----------



## Moyano Jonathan (Mar 6, 2010)

Yo estoy investigando lo mismo....y lo único que se me ocurre es que dividas el dato que querás enviar en 2 buffer y lo envies...y luego en la PC armes el dato de vuelta.


----------



## QuimCri (Mar 7, 2010)

Saludos a todos.

Hace rato... que no hago nada en cuanto a electrónica, y otra vez me picó el gusanito. Tengo una pregunta: ¿Es posible realizar comunicación USB entre el PIC y PC creando una interfaz en Visual Basic 2008? Si la hay, ¿qué método utilizan o que librerías habría que conseguir? Perdón si por ahi ya contestaron esto, pero es que no tendría tiempo de leer todos los post.

Gracias por cualquier respuesta


----------



## Meta (Mar 7, 2010)

Si el tiempo vuela, se hará en un principio del 2008, después el 2010. Hay que estar a la moda.


----------



## Adler (Mar 7, 2010)

breogan dijo:


> Hola Moyano,
> Ya he dado con la clave, yo estaba usando la version 4.093 del CCS. Hice un downgrade de la version, baje a la 4.065 y ahora si funciona cuando compilo el proyecto desde mi MPLAB. Por curiosidad, ¿que version de CCS utilizas?
> 
> No tengo muy claro porque, pero me parece que la gente de CCS ha hecho algun cambio en las librerias USB que no está bien ¿?¿?¿?.
> ...


Ami me pasa exactamente = uso el .hex que subio moyano para identificar x e y, usando el software que hize me funciona perfecto, peor cuando compilo el ejemplo 1 intentando que me devuelva alguna cosa nose algun printf o diferenciar si quiera datos enviados, no hacia nada.

Baje el ccs 
esa version funciona perfecto ahora todos los ejemplos funcionan sin ningun problema, asique era cosa del compilador que esta fallao


----------



## Adler (Mar 8, 2010)

QuimCri dijo:


> Saludos a todos.
> 
> Hace rato... que no hago nada en cuanto a electrónica, y otra vez me picó el gusanito. Tengo una pregunta: ¿Es posible realizar comunicación USB entre el PIC y PC creando una interfaz en Visual Basic 2008? Si la hay, ¿qué método utilizan o que librerías habría que conseguir? Perdón si por ahi ya contestaron esto, pero es que no tendría tiempo de leer todos los post.
> 
> Gracias por cualquier respuesta



Hola QuimCri, si es posible usando vb 2008 en este foro casi todos usan C o usan vb6 o 2005, yo estoy usando el vb 2008 y te digo que si es posible, usando la herramienta "SerialPort" es muy simple de usar la verdad no necesitas mayor conocimiento, adjunto el programa con el codigo junto te subo una prueba en C del un programa que reconosca bien caracteres recibidos y a demas juege con los pines del micro, lo importante bajate esta version de css 
las superiores no funcionan, porque nose , bueno aca estan los archivos ojalaa te sirva de algo, salu2


----------



## QuimCri (Mar 8, 2010)

Saludos.

Le agradezco a Adler su oportuna respuesta. La verdad no había recordado el método CDC, y la verdad es un buen comienzo. Hace ya tiempo que había trabajado con el VB6 utilizando esta estrategia para algunas cositas de la universidad, y como dice Adler, es sencillo. Tengo que ponerme a cacharrear para recordar cosillas que con el tiempo se olvidan .

No obstante también había trabajado con un programa llamado EASYHD, y de esta manera no se necesitaba instalar controlador para desarrollar la comunicación USB con la aplicación de VB6 (aunque hacer funcionar bien el sistema era arduo). Por eso quisiera saber si conocen de algún .api o librería que permita hacer llamado a subrutinas de comunicación que sirva en VB 2008, así como el EASYHD los creaba para trabajar con el VB6.

Muchas gracias a todos. Revisaré lo que encuentre y cualquier cosa también le entraré a la participación.


----------



## cho-k (Mar 8, 2010)

Moyano Jonathan dijo:


> Yo estoy investigando lo mismo....y lo único que se me ocurre es que dividas el dato que querás enviar en 2 buffer y lo envies...y luego en la PC armes el dato de vuelta.



Jonathan
Gracias por tu respuesta
Pero eso que propones podria hacerse al contrario , enviar y  luego   armarlo en el  pic


----------



## jenn_t (Mar 9, 2010)

hola cho-k yo tambien estoy investigando  lo mismo, por que no he podido enviar mas de 100bytes por USB, pero no he logrado nada, a ti como te ha ido con eso?, sera posible enviar 2000 bytes adquiridos por el conversor  A/D?, me imagino que tendria que hacer varios envios y hacer un buffer en el labview que los vaya recibiendo hasta que sean los 2000....


----------



## mecatrodatos (Mar 9, 2010)

Leer 42 paginas uhy pero que post tan interesante


----------



## Adler (Mar 9, 2010)

Hola otra vez a todos, en esta ocasión quiero hacer un humilde aporte y una petición, primero acá dejo una prueba simple usando el easyHID en vb 6 viene con el hex y el ccs ,lo que hace es enviar datos al PIC para activar diferentes pines del puerto B, ademas tiene unos flags que van mirando los estados del puerto B y va enviando al software para que las prenda o apage, en verdad es super simple ninguna maravilla pero es para que algunos que tal vez no entiendan como hacerlo enviando y recibiendo en el mismo programa usando el HID puedan entender tal vez mas.
Bueno y la petición es si alguno conoce alguna forma de usar HID en vb 2008, haber si envían algo que e buscado y no hay casi nada , bueno eso gracias.


----------



## Vegetal Digital (Mar 9, 2010)

Hola, primero tengo que felicitar a Moyano Jonathan por estos ejemplos que me tentaron y me decidi y estoy empezando con esto del usb. 
Hice un "copy and paste" del primer código para el pic que posteaste (ejercicio numero 1) y cuando lo compilo me da este error:

```
*** Error 24 "C:\ARCHIV~1\PICC\devices\18F2550.h" Line 3(9,29): Unknown device type    -- Try PCH
```
Ustedes saben que esta pasando? yo no tengo idea porque nunca me habia tirado ese error...
Gracias


----------



## jenn_t (Mar 9, 2010)

hola vegetal digital, parece ser que estas compilando el  archivo .h  que no posee ningun encabezado, cierra el programa y vuelce a abrir esta vez el archivo con extencion  .C e intenta compilarlo , debe ser eso o un problema con tu encabezado, talvez si posteas la linea donde marca este error (3), se puede concluir mejor cual es el prblema


----------



## KOX (Mar 9, 2010)

Que tal compañeros, visitando la pagina de muchotrasto me encontre con el proyecto PicCalculadoraUSB Visual C++ 6, me propuse a construir mi propio proyecto, segi las instrucciones del tutorial pero mi programa no recive los datos del pic, del cual tomo el valor del modulo A/D. En mi programa solo recivo el valor de 205 y es el mismo resultado si esta conectado o no. ¿Tienen idea de donde puede estar mi error? El programa aun no lo ternimo, me intereza primero la comunicación. Un saludo y gracias por sus aportaciones.

Les dejo los comprimidos de los proyectos tanto de visual como del pic, el driver y el descriptor los tome de los ejemplos de jim.


----------



## cho-k (Mar 9, 2010)

jenn_t dijo:


> hola cho-k yo tambien estoy investigando  lo mismo, por que no he podido enviar mas de 100bytes por USB, pero no he logrado nada, a ti como te ha ido con eso?, sera posible enviar 2000 bytes adquiridos por el conversor  A/D?, me imagino que tendria que hacer varios envios y hacer un buffer en el labview que los vaya recibiendo hasta que sean los 2000....




Hola Jenn_t
La verdad asta el momento  he trabajado tan solo con  3 bytes y labview nunk lo he manejado , y por curiosidad , para que necesitas esa cantidad de bytes....?


----------



## serch2708 (Mar 10, 2010)

Hola amigos vengo aqui a pedir ayuda para ver si alguien podria postear algun programa donde pueda mandar numero binarios a traves de las flechas y las letras del teclado no realmente configurar el numero binario que deseo pero eso lo podre editar yo pero si me gustaria que me pudiesen proporcionar un programa asi. Deseo mandar hasta el numero 512 binario si es que es posible o hasta el numero que sea posible, y necesito que se utilicen las 4 flechas y 4 teclas por lo menos, muchas gracias por su ayuda espero que me puedan ayudar estare al pendiente de ustedes y otros post para buscar mas informacion.


----------



## morgan (Mar 10, 2010)

consulta. veo que mucha agua a pasado por debajo del puente desde que se abrio este post. me pregunto (y mas que nada le pregunto a Moyano Jonathan, creador del post) si es posible hacer algun tutorial APB (a prueba de bolu... errores) para poder desde 0 hacer un dispositivo simple (un pic que prenda 1 led) comunicado por usb. esto implicaria generar desde 0:
1- un proyecto en proteus con el conector usb, el pic y demas (me parece que seria lo ideal ya que es una herramienta barbar para simular dispositivos, incluso tiene algunos ejemplos que funcionan muy bien pero son totalmente cerrados a modificaciones)
2- el hid  y demas controles para que win lo detecte
3- un programa simple en visual que tenga un boton que prenda y apague el led. 

se que parece un poco tedioso lo que pido pero creo que seria de gran ayuda para todos los que como yo hace unos meses se dio cuenta que usb es genial pero muy dificil 

para que entiendan un poco desde donde viene mi requerimiento, soy un estudiante de ing en automatizacion y control industrial en la universidad nacional de quilmes (UNQ) en buenos aires argentina, y con un compañero estamos tratando de implementar un sistema de simulacion de procesos (fisicos, quimicos, mecanicos) para poder controlarlos con algun dispositivo (micros, plc, etc), esto lo estamos tratando de implementar con un dispositivo de conversion serie-paralelo, recibiendo los datos desde la pc (a traves del puerto usb) y transformandolos a paralelo para simular los distintos sensores de la planta. espero que puedan ayudarme

saludos a todos


----------



## Moyano Jonathan (Mar 10, 2010)

@morgan como te vá ...voy a tratar de hacer eso q me pedís pero mi tiempo es escaso ...por eso a veces no estoy muy pendiente de lo que pasa en el foro...cuando me doy un tiempo nomás me pongo a hacer post sobre diversos temas. Lo que me pedís ya lo he empezado a hacer hace un año atras..pero temas de estudio lo tuve que dejar....yo este año entro a ingeniería electrónica en mendoza ( UTN ) y mi tiempo cuando entre va a ser muy escaso... por lo que mi aporte al foro va a ser escaso.
como te dije lo que vos pedís está cocinandose ...pero este fin de semana en una de esas puedo poner algún tutorial de como se hace para prender un LED...recibir una trama de sensores digitales y recibir el valor de los sensores analógicos, todo depende del tiempo q tenga....tengo muchos proyectos de electrónica propios ya sean comerciales o de aprendizaje.. tales como ETHERNET que cuando tenga los componentes que me faltan lo voy a postear con todos los lujos de detalles que sea posible, control de casas por internet que también va  a tener su post...etc.. pero todo depende del tiempo que tenga en el futuro...
Espero que me entiendas...y que sepas disculparme si no te ayudo de una manera más personalizada.
PD: Aunque parezca medio largo acá en este hilo está todo lo que vos necesitas para poder desarrollar de forma satisfactoria la comunicación USB.


----------



## morgan (Mar 10, 2010)

Moyano Jonathan muchas gracias por la onda que le pones! si te puedo ser de ayuda en algo que no sea electronica (mi carrera abarca muchos temas) avisame. 

de nuevo gracias por la onda y como pequeño aporte dejo la dire de un articulo medio viejin pero que a mi como principiante me sirvio mucho
http://www.vsj.co.uk/articles/display.asp?id=600


----------



## Vegetal Digital (Mar 10, 2010)

jenn_tgracias por tu respuesta, lo que yo hacia era compilar el archivo c y me tiraba ese error en la libreria del pic, es más, al hacer clic para que me lleve al error me abria la libreria pic18f2550.h.
Desinstale todito (eso incluye archivos en el registro) lo volvi a instalar y ahora anda...¿?
en fin, grabe el micro, lo lei y todo bien por ahora, tengo que empezar con el hardware asi que seguramente dentro de poco me tendran molestando aqui de vuelta.
Saludos y gracias nuevamente.


----------



## salenss (Mar 10, 2010)

Hola Moyano, por fin pude concluir la lectura de todas las paginas, y lo que pude notar con las disculpas del caso es que muchos ven la ultima pagina y ni siquiera se toman la molestia de leer desde la primera o simplemente leer algun manual publicado para comprender mejor bueno hasta ahi..
Esto para los que quieren mas, mas, mas y mas informacion.
Como mencione en un comentario anterior, la comunicacion usb discutimos tambien
en http://www.dynamoelectronics.com/ con algunas caracteristicas importantes como:
libreria: 	mcHID.dll
aplicacion pc: 	visual basic 6
codigo fuente micro: asm
transferencia por interrupcion HID
velocidad de transmision 12 Mbps
interface: USB 2.0
micro: pic18F2550
Todo esto con el fin de aprender un poco mas sobre interfaces usb y no tratar de desviar el tema, a codigo fuente asm, sin embargo tiene mucha razon Moyano y Meta cuando dicen que se tiene que quemar pestañas para aprender mas, sin mencionar el
tiempo invertido para leer todo el protocolo de transmision usb, que se supone que se debe tener conocimientos para la programacion en asm y desde ya les cuento que el codigo es de muchas lineas que marea y esta desarrollado sin uso de registros de interrupciones para la transmision usb.
Lo que recomiendo para comprender mejor es:
1 Leer este hilo desde la primera pagina detenidamente y los manuales.
2 Leer manual que redacto Moyano (muy bueno y resumido por cierto)
3 Leer datasheet pic18fX550 protocolo usb(terminal del extremo de la interfaz pic para programar codigo fuente)
4 Leer protocolo transmision usb (terminal pc, para uso mcHID.dll)
5 Mucha suerte de no tostar en pruebas el pic (jejeje)
Por cierto hay error en simulacion asi que tienen que armarlo en placa
Espero no haberme alargado demasiado...
Por cierto Moyano y Meta porque no vamos paso a paso como mencionaron en paginas anteriores, primero un proyecto limpio que funcione en CDC, otro en HID y otro en Bulk transfer.

Pd. Como haces para sacar tiempo al tiempo? Moyano


----------



## serch2708 (Mar 10, 2010)

Alguien por favor que me pueda ayudar a mandar 8 bits por el puerto USB pero sin utilizar el PIC :S les agradeceria mucho


----------



## Moyano Jonathan (Mar 10, 2010)

Bueno gracias por sus alagos...el tiempo sinceramente es algo que me juega en contra siempre no por la electrónica en si sino en todo ...por que siempre estoy hasta la nuca de cosas que hacer ..y cuando me canso definitivamente tengo que dejar algo de lado...todo lo que a USB se referiere lo he estudiado bastante...aprendiendo de otros usuarios en otros foros....aprendiendo de libros y manuales en inglés....y por sobre todo *mucha ....mucha practica y horas de sueño perdidas*....de ahi es donde saco mi tiempo de las horas de sueño jajajaj pero siempre valen la pena....no solo para mi ..sino también para todos los que se meten al mundo de la electrónica y no entienden ...tratar de abrirles el camino y pegarles una mano....y como siempre el objetivo mas importante , que es el que todos aprendamos.


----------



## mantenilsa (Mar 12, 2010)

Muy buenas:
Felicitaciones por el hilo y el trabajo realizado, se hecha de menos alguna actualizacion del tutorial de Moyano Jonathan pero esta claro que el tiempo no es infinito.

Tengo un serio problema, cuando estoy trabajando con el 18F2550 configurado para usb con un cristal de 8Mhz y usando #use delay(clock=48000000) las funciones Delay_us y Delay_ms no me estan funcionando correctamente.

El funcionamiento de la comunicacion usb es correcto pero estoy intentando mover un servo y las temporizaciones no las hace correctas, incluso sin usar la comunicacion solo estando configurado el pic para hacerlo y localmente teniendo que mover el servo me hace temporizaciones bastante mas largas.

Espero que alguien me pueda hechar un mano.
Hecho de menos algun post de META hace tiempo que no lo oigo.

Salu2.


----------



## Vegetal Digital (Mar 12, 2010)

Tu problema es que el pic esta programado para trabajar a 48MHz, y le en realidad esta trabajando a 8MHz, los delay, por ende, no son correctos y un servo necesita mucha precision en los tiempos. Cambia la cofiguracion o el Xtal.
saludos


----------



## mantenilsa (Mar 12, 2010)

Gracias por la respuesta.
Entonces como puedo hacer un hardware que funcionase por si mismo a 8Mhz y eventualmente pudiera conectarlo al usb para configurarlo o monitorizarlo.
Osea como se hace para funcionar tanto conectado como sin conectar y usar los Delay.


----------



## Vegetal Digital (Mar 12, 2010)

cambia a esto:

#use delay(clock=8000000) //la frecuencia se escribe en Hertz por lo tanto 8MHz= 8000000Hz

Pero nose si te va a andar el usb, posiblemente no trabaje a tan bajas velocidades, proba y contanos.


----------



## mantenilsa (Mar 12, 2010)

La comunicacion usb no funciona si no es con #use delay(clock=48000000) asi que mi duda continua, ¿no se puede utilizar la comunicacion usb con las funciones Delay_us o Delay_ms en ccs?


----------



## jenn_t (Mar 12, 2010)

el PIC tiene un  divisor interno para que la CPU trabaje de manera independiente al modulo USB, esto se configura en los Fuses, estos serian los mas comunes


#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL1,CPUDIV4,VREGEN

donde:

HSPLL: utilizamos un cristal HS de alta velocidad, en conjunto con el PLL para generar los 48Mhz. 

NOWDT: No utilizamos el perro guardían. 

NOPROTECT: Desactivamos la protección de código. 

NOLVP: Desactivamos la programación a bajo voltaje. 

NODEBUG: No entramos al modo debug. 

USBDIV: signfica que el clock del usb se tomará del PLL/2 = 96Mhz/2 = 48Mhz. 

PLL1: significa que el PLL prescaler dividirá en 1 la frecuencia del cristal. para HS = 4Mhz/1 = 4Mhz. 

CPUDIV1: El PLL postscaler decide la división en 2 de la frecuencia de salida del PLL de 96MHZ, si queremos 48MHZ, lo dejamos como está. 

VREGEN: habilita el regulador de 3.3 volts que usa el módulo USB


en tu caso, si estas trabajando con un cristal de 8Mhz y quieres que tu programa corra con esa frecuencia pero que ala vez funcione el modulo USB, debes prestar atencion a los FUSES PLL  y CPUDIV, que para tu caso seria  *PLL2* (por que como sabes se requieren 4Mhz a la entradaa del PLL para asi poder obtener los 96Mhz) y *CPUDIV4 *para dividir los 48Mhz sobre 6 (parece confuso pero las librerias del CCS estan configuradas para que cpudiv4 sea division sobre 6) y asi obtener los 8Mhz necesarios para que tu programa trabaje.

yo te recomendaria que en lugar de retardos hagas uso del modulo timer o del PWM, pues los delays no son muy exactos (esto dependiendo del codigo que tengas), solo doy ideas al aire...

te recomiendo tmbn que leas el datasheet en la partede las opciones en el oscilador del 18f..espero no confundirte mas mantenilsa jaja, ahi me comentas como te fue con ese enredo te paso esta pagina de red pic depronto te queda mas clara la idea

http://picmania.garcia-cuervo.net/conceptos.php#USB4Mhz


----------



## Moyano Jonathan (Mar 14, 2010)

Quiero dar aviso de que estoy reescribiendo los ejemplos de USB para CDC HID y BULK. Esto me llevará un buen tiempo pero de a poco los voy a ir haciendo...en cuanto los tenga a todos listos los postearé aquí en el foro.
Con respecto al manual de USB...he aprendido muchas cosas nuevas del USB asi que voy a tener que empezarlo casi desde 0 para que esté bien completo y explicado con detalle para que todos entiendan de que se trata.

Un saludo !


----------



## mecatrodatos (Mar 15, 2010)

Que tal realice el primer ejercicio de la pagina pero al compilarlo me aparece estas advertencias.

>>>Warning 203''C:\Program Files(x86)\picc\drivers\pic18_usb.h"Line523(1,1):Condition always TRUE
>>>Warning 216''USB1.c"Line48(0,1):Interrupts disable during  call to prevent re-entrancyusb_token_reset)
>>>Warning 216''USB1.c"Line48(0,1):Interrupts disable during  call to prevent re-entrancyusb_flush_out)
>>>Warning 216''USB1.c"Line48(0,1):Interrupts disable during  call to prevent re-entrancyusb_cdc_flush-out-buffer)
>>>Warning 202''C:\Program Files(x86)\PICC\drivers\usb_desc_cdc.h"Line154(16,37):variable never used:USB_CLASS_DESCRIPTORS

copie  las librerias de USB modificadas del proyecto  por nuestro amigo moyano en la carpeta de PICC y driver como lo dice el archivo adjunto "leeme", no aparece error pero si 5 advertencias que sera.


----------



## Moyano Jonathan (Mar 15, 2010)

la verdad esas lineas de advertencias no te van a traer dramas....te dicen que las interrupciones son deshabilitadas según se llaman a algunas funciones ....la que te dice condition always true ...te dice que ese bucle de programa se desarrolla de forma infinita..seguro es un while(true) o un for(;...y la de variable never used...inteta borrando la variable...aunque no te lo recomiendo...es una variable que al parecer no tiene uso pero ese warning no te va a traer drama alguno.


----------



## mecatrodatos (Mar 15, 2010)

Gracias por reponder lei el hilo completo y me parecio muy interesante, tengo pic18f4550 para realizar las practicas creo que servira, estoy migrando del BASIC al CCs Compiler, hasta el momento no me ha presentado problemas cuando me coloque a tono con el hilo vere como subir algun aporte.


----------



## Moyano Jonathan (Mar 15, 2010)

dale cualquier cosa vos posteá tus dudas


----------



## edusolano (Mar 17, 2010)

Hola,

Bueno ya lo tengo casi todo funcionando para mi proyecto USB! 
Se trata de leer las entradas RB2:RB6 del PIC y cuando una de ellas está a 0 voltios, le debe mandar un mensaje al PC. Por ejemplo, cuando el pic detecta que la pata RB5 está a 0 Voltios, le manda el valor 0x31 al PC. El software del PIC es este:

void main()

{
   int entrada;
   int confirmacion[1];
   int recibe[1];
   LED_ON(led_rojo);          //encendemos led rojo
   LED_OFF(led_verde);

   usb_init();                //inicializamos usb

   usb_task();                      //habilita periferico usb e interrupciones
   usb_wait_for_enumeration();      //


   LED_OFF(led_rojo);
   delay_ms(100);
   LED_ON(led_rojo);
   delay_ms(100);
   LED_OFF(led_rojo);        
   LED_ON(led_verde);

   confirmacion[0]=0x31;
   inicializaciones();

   if(usb_enumerated())          //si el PicUSB está configurado
   {       
      while(true)
      {

                  if(input(PIN_B6)==false)
                  {
                     entrada=1;
                     LED_ON(PIN_B7);
                  }
                  if(input(PIN_B5)==false)
                  {
                     entrada=1;
                     LED_ON(PIN_B7);
                  }
                  if(input(PIN_B4)==false)
                  {
                     entrada=1;
                     LED_ON(PIN_B7);
                  }
                  if(input(PIN_B3)==false)
                  {
                     entrada=1;
                     LED_ON(PIN_B7);
                  }
                  if(input(PIN_B2)==false)
                  {
                     entrada=1;
                     LED_ON(PIN_B7);
                  }
                  delay_ms(100);
                  LED_OFF(PIN_B7);
                  if(entrada==1)
                  {  
                     entrada=0;
                     usb_put_packet(1, confirmacion, 1, USB_DTS_TOGGLE);
                  }           
            }
      }

}  

Ahora bién, para el software de control, estoy usando visual c# 2008, usando mpusbapi.dll ..  Que instrucción es la que me permite saber cuando esta enviando información el PIC? Por ejemplo, cuando desde el PC enviamos información al PIC, usamos esta sentencia * if (usb_kbhit(1))*, para saber que el PC ha enviado datos al PIC. Pues me gustaria saber si existe la misma instruccion pero para saber que el PIC ha enviado datos al PC. 
Porque sino, cuando pongo esta instruccion *ReceivePacket(receive_buf, &RecvLength)*?
Espero que se haya entendido, sino hacedmelo saber. Muchas gracias


----------



## DAV (Mar 24, 2010)

Hola Moyano, estoy realizando un proyecto con el pic18f4550 para interactuar con matlab, el problema que tengo es con la conexion del dispositivo. Encontre un archivo para la comunicacion daqc (el cual te adjunto). Modifique el archivo como ponia y grabe este archivo en el pic18f4550. Despues me descargue el driver mchpusb, que venia con el archivo.inf y .sys.

   Conecte el dispositivo y mande con la direccion del driver al administrador, pero me sale un error que dice: el sistema no encuentra informacion sobre el software.

   ¿A que se debe esto? Te paso tambien el esquema del circuito por si te sirve para ayudarme.

    He estado leyendo en el foro sobre las librerias de usb_cdc.h y usb_desc_cdc.h, no se donde se encuentra el VID y PID para modificarlos y no se si esta ahi el problema. ¿Estas librerias deben estar en la misma carpeta que el driver?


   Gracias de antemano.

Perdón, me faltaba el esquema.


----------



## george.manson.69 (Mar 24, 2010)

Moyano disculpa, una pregunta se puede utilizar interrupcion por timer 0 usando el usb?

por ejemplo quiere que etse parpadeando cada 500 mS un led pero a la vez el PIC este conectado a la compu?

ahh otra pregunta se puede usar el CCP1 y 2 para generadores de frecuencia,...pero no afecta la conexion USB?


----------



## matv90 (Mar 25, 2010)

que tal los ejemplos estan geniales y muy bien explicador, solo tengo una pregunta: ¿Es posible que este pic detecte que lo que se envia por el puerto usb de un psp?

concretamente ¿puede este pic funcionar como maestro y el psp como esclavo?, el psp no puede ser maestro por obvias razones.


----------



## Moyano Jonathan (Mar 25, 2010)

en unos dias les respondo las preguntas...me he quedado sin pc pero pronto remontaré

Hola a todos.....tengo algo que decirles:
En mis primeros post donde puse programas hechos en VB 6.0 ..hay códigos que no son de mi autoría dentro del fuente del programa y que pertenecen al usuario Palitroquez de todopic. Esto lo digo no para decir que todo lo que he puesto es una mentira ..sino que es a partir de leer cosas de este usuario. El mismo se quejo personalmente hace unos meses ..por email...pero como nunca los leo no sabia que habia una queja presente hace 3 meses..:S quería decir esto por que no me gusta para nada que me acusen de plagio...es más muchas de las cosas que hay circulando por la red son de plagio...y aunque esto no justifica nada es una forma de decir que lo que está en la red está para utilizarse. 
Otra cosa queda explicito que nada de lo que está acá es para usos comerciales..sino puramente educativos.

Mis saludos ...
atte. Moyano Jonathan


----------



## Adler (Mar 28, 2010)

Hola a todos, tengo una duda con los buffers, lo que quiero hacer es enviar datos de 8 bits por 2 buffers o mas desde el programa en VB hacia el micro, intente en VB usar  
ejemplo:       
        dato = 2
        BufferOut(3) = Val(dato)
        Call WriteSomeData()
para usar el otro buffer, se que ese correponderia al Buffer 2 del micro, el problema lo tengo en el micro estoy seguro pero no logro encontrar por ninguna parte donde expliquen como usar y configurar 2 o mas buffers en ccs usando HID, agradeceria si alguien sabe algo si me puede explicar, gracias


----------



## denianke (Mar 29, 2010)

hola moyano, tengo una consulta que hacerte , ademas de felicitarte por el tema.

Modifique el programa del osciloscopio que viene de ejemplo en el CCS(bulk transfer), le quite todo lo que iba de más, y puse solamente que tuviera dos leds, uno para señalar el encencido y otro para mostrar cuando haya sido numerado por la pc. La cuestión es que tuve que instalar el driver especifico para esa aplicación, pero por que no me lo reconoce con el mpusbapi?

Lo unico que se me ocurre es que en el archivo de descriptors tiene un pid diferente al de microchip(me imagino que debe ser por que este programa esta diseñado para una board de desarrollador que vende CCS).

Si quisiera acceder al pic desde el pc con un programa de visual usando la libreria mpusbapi.dll le tengo que cambiar el PID al archivo de descriptor?.

una ultima cuestion el proteus me dice que no esta enumerado, pero hasta sale como un dispositivo con controlador sin problemas en el windows 7.


----------



## Moyano Jonathan (Abr 1, 2010)

Me parece que es el problema más acertado ...a mi me pasó una vez lo mismo y lo solucione de esa manera..cambiandole los PID y VID...ahora otra cosa que no sucede muy a menudo pero que puede pasar es el tema de que el polling de datos no sea el adecuado...eso también lo tenés definido en los descriptores..yo uso en comunicaciones HID 10ms de polling y con Bulk 25ms

mantenilsa: En una de esas el compilador no está reañizando las temporizaciones correctamente...probá un programa de prender y apagar un puerto del PIC y probá diferentes tiempos con un osciloscopio ...o si tenés el PICKIT2 probá los tiempos con el analizador lógico del mismo.

DAV: Veo tu problema y después te notifico...

george.manson.69: Me mataste la verdad no tengo idea...tendría que ver si el USB no lo utiliza para gestionar la comunicación ...

Adler: Hola como estás....mirá el tema no radica en configurarlos , de eso se encarga el driver USB....lo que vos tenés que hacer es declarar cuantos buffers para la comunicación vas a utilizar ....y luego vas declarando las variables usadas.. te pongo un ejemplo...


```
Definimos los buffers utilzados...
DEFINE USB_HID_DEVICE TRUE // Vamos a utilizar el protocolo HID.

#define USB_EP1_TX_ENABLE USB_ENABLE_INTERRUPT 
#define USB_EP1_TX_SIZE 8 // Definición del tamaño del buffer de salida.

#define USB_EP1_RX_ENABLE USB_ENABLE_INTERRUPT 
#define USB_EP1_RX_SIZE 8 // Definición del tamaño del buffer de entrada.


luego las varibles...

int8 data[8]; // Variable de 8 bytes que guardan el valor del EP1_RX.

void main()
{
   usb_init_cs();    // Iniciamos el puerto USB y salimos.
   while(1)
   {
            usb_task(); // Configuramos el puerto USB.
                  if (usb_enumerated()) // Si el puerto es enumerado y configurado por el host..
                  {
                     if (usb_kbhit(1)) // Si hay un paquete de datos en el buffer lo tomamos y guardamos en la variable data.
                     {
                        usb_get_packet(1, data, 8);
                        if(data[0] == 1) { // Si el paquete contiene el dato "1"
                         output_toggle(PIN_B1); // Cambiamos el valor del PIN_B1.
                        } 
                     }                                
                  }
   }

}
```


----------



## denianke (Abr 1, 2010)

otra cuestion...

no puedo llamar a la mpusbapi.dll desde el visual basic 2010... al menos no declarandola como lo hace j1m en vb6.0, lo digo por que uso windows 7; si no tendre que aprender c#...


----------



## Adler (Abr 2, 2010)

Hola moyano gracias por tu respuesta, pero mi problema continua lo que me sucede es que ahunque ponga mas buffer para usar como puse en el ejemplo para ver usando en VB esto para enviarlos:

```
Public Sub WriteSomeData()
        hidWriteEx(VendorID, ProductID, BufferOut(0))
    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        BufferOut(2) = 2
        Call WriteSomeData()
    End Sub

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        BufferOut(1) = 1
        Call WriteSomeData()
    End Sub

    Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
        BufferOut(3) = 3
        Call WriteSomeData()
    End Sub

    Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
        BufferOut(4) = 4
        Call WriteSomeData()
    End Sub
```

cuando envio datos iguales o diferentes por diferentes buffers, el programa del Uc me reconoce todos los datos de todos los buffers como si fueran enviados por el buffer 1 en el caso de este ejemplo me prende y apaga siempre el B0 ahunque envie datos por buffers apartes, y ahunque sean datos diferentes no me discrimina cual es un 1 o un 3
esa es mi duda que me tiene frenado para poder hacer mas cosas, de antemano gracias



```
#include	<18F2550.h>
#fuses NOMCLR,XTPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL1,CPUDIV1,VREGEN,NOPBADEN
#use	delay(clock=48000000)

#BYTE		PORTB=0x06

#DEFINE	USB_HID_DEVICE	TRUE

#define      USB_EP1_TX_ENABLE USB_ENABLE_INTERRUPT 
#define      USB_EP1_TX_SIZE 8

#define      USB_EP1_RX_ENABLE USB_ENABLE_INTERRUPT 
#define      USB_EP1_RX_SIZE 8

#define      USB_EP2_TX_ENABLE USB_ENABLE_INTERRUPT 
#define      USB_EP2_TX_SIZE 8

#define	USB_EP2_RX_ENABLE USB_ENABLE_INTERRUPT
#define	USB_EP2_RX_SIZE 8

#define      USB_EP3_TX_ENABLE USB_ENABLE_INTERRUPT 
#define      USB_EP3_TX_SIZE 8

#define	USB_EP3_RX_ENABLE USB_ENABLE_INTERRUPT
#define	USB_EP3_RX_SIZE 8

#define      USB_EP4_TX_ENABLE USB_ENABLE_INTERRUPT 
#define      USB_EP4_TX_SIZE 8

#define	USB_EP4_RX_ENABLE USB_ENABLE_INTERRUPT
#define	USB_EP4_RX_SIZE 8

#include	<pic18_usb.h>
#include 	<USB_easyHID_descriptores.h>
#include	<usb.c>

int8	data_buffer1[8];
int8	data_buffer2[8];
int8	data_buffer3[8];
int8	data_buffer4[8];



void	main()
{

	set_tris_b(0x00);
	output_b(0x00);
	usb_init_cs();
	while(1)
	{
		usb_task();



////////////////////////////////////////////////////////////////

		while(!usb_enumerated())	{
			output_high(PIN_A0);
			output_low(PIN_A1);
									}
			output_high(PIN_A1);
			output_low(PIN_A0);

				if(usb_kbhit(1))
				{
				usb_get_packet(2, data_buffer2 ,8);

				usb_get_packet(1, data_buffer1 ,8);

				usb_get_packet(3, data_buffer3 ,8);

				usb_get_packet(4, data_buffer4 ,8);


			if(data_buffer1[0]==1)	{
				output_toggle(PIN_B0);
							}
			if(data_buffer2[0]==2)	{
				output_toggle(PIN_B1);
							}
			if(data_buffer3[0]==3)	{
				output_toggle(PIN_B2);
							}
			if(data_buffer4[0]==4)	{
				output_toggle(PIN_B3);
							}

				}//fin kbhit
	}//fin while
}//fin main
```


----------



## Moyano Jonathan (Abr 2, 2010)

ya lo voy a ver y te digo ...me parece que tus problemas van de mano del código del PIC.


----------



## george.manson.69 (Abr 2, 2010)

Moyano paracere que al simular el timer0 como interrupcion por desbordamiento, y conectado a la compu via USB, funciona bien no interrupe la conexion...por ahora lo tengo simulado y si me da los 2 hz de parpadeo y no afecta la comunicacion usb...
solo faltaria simular el CCP1 Y 2 como generadores de frecuencia cuadrada...


----------



## Moyano Jonathan (Abr 2, 2010)

haa buenisimo entonces...yo le estoy dando unas reparaciones a mi placa entrenadora por que se me quemo un regulador por malas conexiones...y despues me pongo de nuevo con los código de USB.


----------



## minhtien (Abr 3, 2010)

Thanks all for this topic. ( I can't speak Spain , I'm vietnamese). I made and success.


----------



## Frozen Soul (Abr 3, 2010)

Hola amigo Moyano Jonathan!!.
Me fasinaron tus ejemplos!!!. Ya probe el de mandar una a y x jalan muy bien con un pic 18f4550.
Ya me quedo claro lo del firmware del pic. Donde me encuentro atorado es con el visual basic 6. Entiendo mas o menos el codigo fuente pero no se como implementarlo ya en el ambiente de bisual basic es decir como pongo los botones y se los asigno en el codigo fuente de programa. Ya que no estoy muy familiariazado con el visual ._.!!!

Podrias hecharme una mano con esto del visual basic??? o si alguien sabe tambien seria de gran ayuda....!

Saludos y gracias por compartir estos valiosos ejemplos de aplcacion usb pc. ;D


----------



## nomames (Abr 3, 2010)

Saludos.

Ando haciendo un proyecto donde un PIC18F2550 debe simular que es un raton standar y conectarse por USB. Ya utilicé los ejemplos del CCS que trae de un mouse usb generico, sin embargo la PC me detecta que el dispositivo usb tuvo un mal funcionamiento. 

Puse tu código en el PIC y si funciona. le traté de modificar los descriptores del mouse utilizando estas 3 referencias:
http://www.usbmadesimple.co.uk/ums_ms_desc_conf.htm
http://www.keil.com/forum/docs/thread15398.asp
www.usb.org/developers/devclass_docs/HID1_11.pdf

Ya probé modificar los descriptores del usb_desc_cdec, también use el archivo de CCS usb_desc_mouse y no me funciona. Yu que tienes mucha mas experiencia en el campo, como puedo hacer para que mi PC detecte a mi pic como si fuera un ratón USB genérico.

Gracias y espero me puedas ayudar ya que ando bastante desesperado con esto.
Gracias... atte: Omar


----------



## FRYCK (Abr 3, 2010)

hola para los que nos interesa esto de los usb y hemos tenido problemas con xp, vista o windows 7 hay un programita para Automatiza la Configuración de los datos para enumerar un PIC 18Fxx5x realizado por palitroquez y comentado en el siguiente foro  http://www.todopic.com.ar/foros/index.php?topic=20047.0  dejo el linck de migsantiago en donde hay un buen ejemplo  http://www.migsantiago.com/index.php...id=9&Itemid=10


----------



## jaimehuzuamki (Abr 3, 2010)

hola a todos y gracias por los manuales y las dudas resueltas, tengo una duda loq ue pasa es que necesito transmitir unos datos por usb hacia el computador, y quisiera saber por cual de deberia de hacerlo o es mejor hacerlo, simulando el puerto serial  o por la que llaman bulk?.... de antemano gracias


----------



## Meta (Abr 5, 2010)

Mejor esperar el  gran manual del año.


----------



## atricio (Abr 6, 2010)

alguien por favor me puede facilitar los manuales que todos hacen referencia por favor y el libro del amigo moyano por favor


----------



## Meta (Abr 7, 2010)

No te preocupes que ya lo harán y muy completito.


----------



## traka (Abr 8, 2010)

Hola, a ver si os ha pasado a alguien algo similar:
Estoy haciendo un proyecto de fin de carrera con un PIC 18f2550, con un cristal 20MHZ con PLL5. El proyecto es bastante grande, tiene dispositivos USB a los que acede con bastante frecuencia, usa el RS232 para controlar movil por comandos AT, y bueno, el problema es q cuando empieza a crecer el codigo, y conecto el USB al ordenador me sale que "no se reconoce el dispositivo USB", si quito algunos delay_ms (que necesito para que funcioene como tiene q ser los requisitos), la cosa empieza otra vez a funcionar. Lo asocio a que el USB_TASK(), o alguna de estas funciones tiene q ejecutarse con cierta frecuencia para que el ordenador sepa que sigue conectado... porque sino no entiendo donde esta el problema. Lo uso como CDC y tengo un bucle asi(resumiendo):

while(true){
     usb_task(); // configura el USB
     if(usb_cdc_connected()){ // Si está conectado entonces....
       if (usb_enumerated()){ // aquí se enumera el dispositivo por el host y despúes sale.
          if(usb_cdc_kbhit()){ //en espera de nuevo(s) caracter(es) en el buffer.
            //Comprobamos si queremos hacer lectura de datos o escritura
           }
        }
      //Aki el resto de codigo, que por lo menos tarda en ejecutarse 3 segundos(por los delays, y otras instruciones que hay)
}

Alguna idea de como solucionarlo??
Muchas gracias de antemano.

PD.: Muy grande tu trabajo moyano con este post


----------



## Moyano Jonathan (Abr 8, 2010)

ahora estoy en revisión de mi manual para hacerlo un poco más completo ....pero traducir del inglés al español es algo bastante complejo.


----------



## Meta (Abr 8, 2010)

Por fin leer lo que estoy leyendo.

Suerte y ánimo.


----------



## FRYCK (Abr 14, 2010)

Bien por  ti moyano  lo estamos esperando  sigue con tu entusiasmo 
saludos Fran


----------



## Moyano Jonathan (Abr 15, 2010)

ahora va a tener la teoría completa sobre la estructura interna del controlador USB del micro asi también como una breve pero funcional explicación sobre como hacer un programa de control por USB en ASM.


----------



## COSMICO (Abr 15, 2010)

Muy bueno.
Ya me pican las manos por abrir ese manual y leerlo
Felicitaciones y gracias


----------



## Moyano Jonathan (Abr 16, 2010)

Hola a todos !! 

Bueno en esta ocación les traigo un adelanto de mi libro de aplicaciones sobre el PIC18F2550 y el puerto USB. En esta entrega hay correcciones...más información y más explicación sobre como comunicarnos con el puerto USB. 
Aún me falta mucho por terminar pero con esto espero complacer momentáneamente a los más ansiosos. 

*PIC18F2550 control de dispositivos por USB V1.0 rev 0.3: *http://www.mediafire.com/?d3e542zcyw5

Bueno espero les guste 
También espero sus críticas y comentarios


----------



## Meta (Abr 17, 2010)

Buenísimo Moyano. Se tarda en leer, si encuentro algo para mejorar te doy el toque. 

Muy buen trabajo. Ánimo y adelante.


----------



## seaarg (Abr 18, 2010)

Estoy haciendo proyectos usb con este micro y baje tu manual. Solo queria darte las gracias por tu trabajo


----------



## Moyano Jonathan (Abr 18, 2010)

y todavía falta para terminarlo ...pero va a salir


----------



## alaroa (Abr 18, 2010)

Moyano Jonathan dijo:


> Hola a todos acá les traigo algo que quizas a muchos les interese. Se trata de ejemplos de control del puerto USB que traen de fábrica los pic´s de la serie 18Fxx5x. Para esto me he basado en ejemplos encontrados en la red. Los ejemplos que iré desarrollando van aplicados a las clases CDC (Comunication device class) y el control mediante la api de windows proporcionada por microchip mpusbapi.dll (bulk transfer).
> 
> El primer ejemplo establece una comunicación bidireccional con la PC, a través de la clase CDC. Por lo tanto cuando conectemos nuestro PIC (18F2550), aparecerá en el administrador de dispositivos un puerto serie que podemos controlar desde una aplicación programada previamente en un lenguaje como el Visual Basic 6.0.
> 
> ...



Hola soy nuevo en el foro. estoy muy interesado en el procedimiento que realizaste para programar el USB, pero, cuando quiero compilar me pide una librería que no tengo que es usb.h, ¿donde podría encontrarla para poder realizar modificaciones o como podría crearla? 

De antemano gracias !!!!


----------



## FRYCK (Abr 19, 2010)

Hola *alaroa* la  librería a que te refieres  esta incluida el CCS   la  verdad  no se desde que versión   pero  deberías  revisar  eso. En mi caso la versión  instalada es la 4.084 y funciona  muy bien. De todas  maneras  te  paso la  librerías  pero  te sugiero  pasarte  a una versión mas resiente. Si utilizas estas librerías le cambias extensión a los archivos a .h y .c respectivamente . 


Saludos   fran


----------



## alaroa (Abr 19, 2010)

hola y gracias por los arcivos fryck_80.


----------



## COSMICO (Abr 19, 2010)

Moyano Jonathan dijo:


> Hola a todos !!
> 
> Bueno en esta ocación les traigo un adelanto de mi libro de aplicaciones sobre el PIC18F2550 y el puerto USB. En esta entrega hay correcciones...más información y más explicación sobre como comunicarnos con el puerto USB.
> Aún me falta mucho por terminar pero con esto espero complacer momentáneamente a los más ansiosos.
> ...



Hasta el momento solo le di una ojeada, pero desde ya muchas gracias por ese esfuerzo


----------



## Meta (Abr 19, 2010)

Cierto, es muy bueno el manual. Sigue así.


----------



## atricio (Abr 19, 2010)

hola disculpen la verdad no se lo que me pasa he probado los ejemplos que moyano postea en las primeras paginas no se si soy muy lento para aprender o no entiendo nada...alguien me podria decir paso a paso si no es mucha molestia cual es el procedimiento para poder probar los ejemplos por favor la verdada he intentado y nada que ver ojala me pudieran ayudar por favor muchas gracias


----------



## MGustavo (Abr 20, 2010)

atricio dijo:


> hola disculpen la verdad no se lo que me pasa he probado los ejemplos que moyano postea en las primeras paginas no se si soy muy lento para aprender o no entiendo nada...alguien me podria decir paso a paso si no es mucha molestia cual es el procedimiento para poder probar los ejemplos por favor la verdada he intentado y nada que ver ojala me pudieran ayudar por favor muchas gracias



Aprovecho para felicitar a Moyano por el excelente tutorial!

No sé a qué se debe, no explicaste él porque, si tenés las librerías, y estás usando el compilador CCS no creo que tengas problema. En unos post más arriba postearon las librerías.

Saludos!


----------



## FRYCK (Abr 20, 2010)

hola MGustavo  dinos  tus  dudas  de una  forma  clara   en que requieres ayuda y con gusto  te la  daremos  
fran


----------



## COSMICO (Abr 20, 2010)

atricio
comenta que problema tienes para asi poder ayudarte.


----------



## Moyano Jonathan (Abr 20, 2010)

```
hola disculpen la verdad no se lo que me pasa he probado los ejemplos que moyano postea en las primeras paginas no se si soy muy lento para aprender o no entiendo nada...alguien me podria decir paso a paso si no es mucha molestia cual es el procedimiento para poder probar los ejemplos por favor la verdada he intentado y nada que ver ojala me pudieran ayudar por favor muchas gracias
```

Los ejemplos en si no tienen demasiada ciencia....lo que tendrías que hacer es grabar el firmware del ejemplo en el PIC y luego conectarlo a la PC. En los ejemplos de emulación CDC, tendrías que instalar los drivers y los de HID esperar que la máquina los instale automáticamente.
Luego de tener el enlace PC - PIC listo ...ejecuta los programas en (WinXP)....todavía no tengo listos los programas para vista y 7...
Y una vez que ejecutes los programas ..haces las pruebas pertinentes...
Podés usar mi placa USB para desarrollo : http://www.google.com.ar/url?sa=t&s...DhxLcP&usg=AFQjCNEvrHNmdiiTCsefXU7oM0Ov4ueZQQ
en conjunto con el pickit2 clone: https://www.forosdeelectronica.com/...s-puerto-usb-pickit2-clone-18080/index52.html


----------



## MGustavo (Abr 20, 2010)

fryck_80 dijo:


> hola MGustavo  dinos  tus  dudas  de una  forma  clara   en que requieres ayuda y con gusto  te la  daremos
> fran



*fryck_80*, quien estaba solicitando ayuda es *atricio*, por eso cite su mensaje. De todos modos gracias por tu interés. En el post anterior le respondió el colega Moyano de todas formas.

Saludos!


----------



## FRYCK (Abr 20, 2010)

Ok   disculpeme MGustavo yo estaba un poco despistado y  no  me  fije  
 saludos   fran


----------



## pkdos (Abr 22, 2010)

Hola a todos. Me leido el manual pero no consiguo probar los ejemplos de cdc del principio, al igual que articio. He probado muchas veces, con los pasos que ha posteado anteriormente. Me aparece sin ubicación en la pantalla del administrador. 
He visto que las conexiones están bien y he colocado el condensador en Vusb.


Gracias de antemano y estoy abierto a cualquier sugerencia.


----------



## Moyano Jonathan (Abr 22, 2010)

la verdad es que es rarísimo lo que te anda pasando ...igual a no desesperar que estoy viendo los programas nuevamente con nuevas versiones para los sistemas operativos Windows 7 y Windows Vista para que todo el mundo que tenga esas versiones del sistema operativo puedan operar sin dramas.


----------



## COSMICO (Abr 22, 2010)

A mi me paso algo igual.
Si no recuerdo mal, y con la reinstalacion de los driver para proteus se me soluciono
Recuerdo que los ejemplos del mismo isis si me funcionaban bien.
Pero los del amigo moyano no, la solucion fue esa, la verdad no se si ya probaron reinstalarlos de la siguiente forma.
Inicio, programas,proteus ? profesional,virtual usb, install usb drivers
y los buscan en la carpeta que dio el amigo moyano para estos.
Ese era mi problema y asi lo solucione.
Espero esto les ayude.


----------



## atricio (Abr 22, 2010)

hola amigos muchas gracias por responder la verdad ando en un mar de lios con esto xq los pruebo grabo el firmware en el micro y lo conecto al pc me lo reconoce pero de ahi no pasa no hace nada de nada que sera que esta pasando ??? a por sierto amigo moyano uso windows XP


----------



## Moyano Jonathan (Abr 23, 2010)

Mirá para poder ayudarte un poco mejor , posteá fotos del montaje + un esquema del mismo + el código exacto que estés usando + una foto del administrador de dispositivos 
Ahora si .....para brindarte ayuda tenés que ponerme el montaje real no en simulador por que si todas las pruebas las estás haciendo con simulador no sirve mis ejemplos tienen muchos problemas con el isis de proteus.


----------



## Adler (Abr 23, 2010)

hola moyano, oye una pregunta, pudiste saber cual era mi error en el codigo de C para el tema de los buffers que postie hace un tiempo, ojalaa puedas responderme o acordarte  si debe ser un problema muy estupido pero no logro detectarlo, gracias


----------



## Meta (Abr 23, 2010)

Prueba con el nuevo Proteus v7.7 por si acaso.


----------



## Moyano Jonathan (Abr 23, 2010)

uhhh se me paso mandame el codigo a mi mail o por mp que te lo reviso en estos dias


----------



## Adler (Abr 23, 2010)

No pude enviar PM por la cantidad de mensajes, me faltan  y el mail nose donde esta asique te pongo el codigo de nuevo aca nomas, el problema era que no me transmiten buffers diferentes al primero, y no discriminaban los valores ahunque enviara un 3 por buffer 4 me reconocia un 1 en el buffer 1, ojalaa puedas ayudarme, solo quiero enviar valores diferentes por buffer diferentes, gracias


```
#include	<18F2550.h>
#fuses NOMCLR,XTPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL1,CPUDIV1,VREGEN,NOPBADEN
#use	delay(clock=48000000)

#BYTE		PORTB=0x06

#DEFINE	USB_HID_DEVICE	TRUE

#define      USB_EP1_TX_ENABLE USB_ENABLE_INTERRUPT 
#define      USB_EP1_TX_SIZE 8

#define      USB_EP1_RX_ENABLE USB_ENABLE_INTERRUPT 
#define      USB_EP1_RX_SIZE 8

#define      USB_EP2_TX_ENABLE USB_ENABLE_INTERRUPT 
#define      USB_EP2_TX_SIZE 8

#define	USB_EP2_RX_ENABLE USB_ENABLE_INTERRUPT
#define	USB_EP2_RX_SIZE 8

#define      USB_EP3_TX_ENABLE USB_ENABLE_INTERRUPT 
#define      USB_EP3_TX_SIZE 8

#define	USB_EP3_RX_ENABLE USB_ENABLE_INTERRUPT
#define	USB_EP3_RX_SIZE 8

#define      USB_EP4_TX_ENABLE USB_ENABLE_INTERRUPT 
#define      USB_EP4_TX_SIZE 8

#define	USB_EP4_RX_ENABLE USB_ENABLE_INTERRUPT
#define	USB_EP4_RX_SIZE 8

#include	<pic18_usb.h>
#include 	<USB_easyHID_descriptores.h>
#include	<usb.c>

int8	data_buffer1[8];
int8	data_buffer2[8];
int8	data_buffer3[8];
int8	data_buffer4[8];



void	main()
{

	set_tris_b(0x00);
	output_b(0x00);
	usb_init_cs();
	while(1)
	{
		usb_task();



////////////////////////////////////////////////////////////////

		while(!usb_enumerated())	{
			output_high(PIN_A0);
			output_low(PIN_A1);
									}
			output_high(PIN_A1);
			output_low(PIN_A0);

				if(usb_kbhit(1))
				{
				usb_get_packet(2, data_buffer2 ,8);

				usb_get_packet(1, data_buffer1 ,8);

				usb_get_packet(3, data_buffer3 ,8);

				usb_get_packet(4, data_buffer4 ,8);


			if(data_buffer1[0]==1)	{
				output_toggle(PIN_B0);
							}
			if(data_buffer2[0]==2)	{
				output_toggle(PIN_B1);
							}
			if(data_buffer3[0]==3)	{
				output_toggle(PIN_B2);
							}
			if(data_buffer4[0]==4)	{
				output_toggle(PIN_B3);
							}

				}//fin kbhit
	}//fin while
}//fin main
```


----------



## Moyano Jonathan (Abr 23, 2010)

Al parecer no tenías muchos errores en el programa , pero si estábas ocupando RAM del USB al cuete....si vas a recibir 8 datos diferentes...por 8 canales diferentes...no hace falta que uses 8 endpoints..diferentes. Lo que hice es definir un arreglo de 8 bytes para obtener los 8 datos de forma independiente.
Otra cosa es que estábas poniendo mal la condición de enumeración...


```
while(|usb_enumerated())
```
 ahi lo que haces es decirle....si no está enumerado....por lo tanto si el host no lo enumera es imposible que tomés datos. 

Te paso en un adjunto el código compilado para que lo pruebes en tu aplicación, en caso de que no te funcione poné tus preguntas nuevamente.

PD: Lo próbé en proteus y funciona bien !


----------



## alaroa (Abr 24, 2010)

Hola de nuevo, discuelpen las molestias pero me surgio un problema con el controlador del primer ejemplo....
Baje el programa completo. Introdusco el archivo h en el pic que se encuentra en la carpeta y funciona mey bien, pero cuando compilo los archivos existentes en la misma carpeta la maquina no reconoce el dispositivo que puedo hacer? 

Gracias


----------



## FRYCK (Abr 24, 2010)

alaroa dijo:


> Hola de nuevo, discuelpen las molestias pero me surgio un problema con el controlador del primer ejemplo....
> Baje el programa completo. Introdusco el archivo h en el pic que se encuentra en la carpeta y funciona mey bien, pero cuando compilo los archivos existentes en la misma carpeta la maquina no reconoce el dispositivo que puedo hacer?
> 
> Gracias



Hola  alaroa  compile el ejemplo que dejo  Moyano Jonathan en su ultimo mensaje y funciono de una el  ccs  lo compila sin ningún problema   revisa  tu compilador y revisa que  de pronto sea por  una versión muy antigua ¿que  versión de ccs  utilizas?   ¿es una versión de prueba? puede ser por eso algunos de estos casos  o de mas detalles de que te entrega el compilador


----------



## alaroa (Abr 25, 2010)

De antemano fryck_08 te agradezco por responder.

El problema fue en el primer programa colocado en este blog, si puedo compilarlo y no tengo ningún problema... el problema se genera cuando programo el pic y lo conecto en la computadora, me dice que el diver que estoy conectado no sirve...


Gracias


----------



## FRYCK (Abr 25, 2010)

tienes que dar  detalles de que  sistema operativo  utilisas  xp, vista, Windows 7,puede que sea  alguna incompatibilidad de el driver


----------



## alaroa (Abr 25, 2010)

El sistema es win xp, cuando programo el pic con el h que se encuentra en el rar no tengo ningún problema, la maquina me detecta el driver... el problema se genera cuando compilo y el h creado lo coloco en el pic.

Pense que era que existía algún problema en algún parámetro, pero ya los revise todos, y cree de nuevo el driver y pasa el mismo problema 

Gracias!!


----------



## alaroa (Abr 25, 2010)

fryck_08 Gracias por tu ayuda, ya encontré el problema era solamente que en la librería usb_cdc.h el archivo llama a la librería usb_desc_cdc.h pero no el que creas, sino el que se encuentra dentro de las librerías del programador y no me había dado cuenta...

¡¡¡Gracias!!!


----------



## Adler (Abr 25, 2010)

Gracias moyano por tu pronta respuesta, voy a ver todo lo que dijiste, te agradesco tu tiempo, saludos.


----------



## §-kelvi (Abr 25, 2010)

excelete trabajo Moyano Jonathan, con el libro 18f2550 y usb!!, espero aprender mucho del tema, sera que alguien tiene informacion sobre la programacion de la pc para usar el puerto usb en basic si me la podria proporcionar les agradecere.


----------



## Moyano Jonathan (Abr 26, 2010)

esa información va a estar en el libro , pero más adelante saludos !


----------



## §-kelvi (Abr 27, 2010)

gracias por el aporte seguire en la espera !!


----------



## Sebaglio (Abr 28, 2010)

Hola !!
Quería saber si es posible me pasaran algún ejemplo de comunicación con el pic 18f4550 mediante USB con Visual C++.

Espero su respuesta.

Gracias.!!


----------



## pkdos (Abr 28, 2010)

Hola a todos.

Gracias a todos, COSMICO reinstale el driver de proteus, pero nada me ocurre lo mismo.
Para centranos, el ejemplo que estoy probando es el ejercicio_n2_127.
Para documentar más mi problema os muestro la configuración del administrador de dispositivos, así como un esquema en proteus que refleja lo que estoy probando en la protoboard.

Lo estoy probando en SO. Xp.

Saludos.


----------



## COSMICO (Abr 28, 2010)

Es raro amigo pkdos.
Estas guardando en la misma carpeta donde estan todas las librerias y driver la simulacioin, si no, prueba asi; a ver que pasa
Mira..............

Revisare las posibles fallas por las cuales no funciona en tu 
pc y estaremos en contacto..

Bueno veo que el dispositivo es detectado, pues se crea el com virtual
ahora, despues de que conectas o das a simular; te sale el asistente de instalacion de harware nuevo encontrado??

Cuando salga el asistente de harware nuevo encontrado dale instalar automaticamente 
y el buscara los drive para el dispositivo


----------



## FRYCK (Abr 28, 2010)

Hola Sebaglio   en  esta  paguina hay un ejemplo   en c++ http://www.muchotrasto.com/PICCalculadoraUSBC++.php
Saludos


----------



## RALD (Abr 28, 2010)

buen dia tengan todos los seguidores de este temas.
me disculpo si ya alguien a preguntado asi, pero he leido cerca de 10 paginas y no veo un problema similar, sin embargo aqui voy con mi problema: compre el pic18f2450 que traer hardware USB, es la primera ves que programamo el USB de un pic, estoy utilizando un cristal de 8Mhz con el PLL activo lo que genera que el clock del pic sea de 48Mhz, el USB esta configurado con el high speed y desactive el voltaje regulator, sin envargo no logro hacer que el pic sea reconocido por el PC y en proteus no veo que  este enviando datos a USB virtual, estoy utilizando el enumer_picusb para generar la informacion que requier el windows pero el driver no es reconocido por el pc, les adjunto el programa para que le hechen una ojeada y me digan si esta bien o si lo estoy haciendo mal, el programa es solo de prueba basica, lo que hace es enviar los datos del cdc para crear un puerto serie virtual y luego pasa a encender un led y apagalo esto es solo para yo llevar el control:


```
#include <18F2450.h>
#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL2,CPUDIV1, VREGEN,MCLR
#use delay(clock=48000000)

#include "usb_cdc.h"
#include "usb_desc_cdc.h"

#define LED1 (pin_c0)
#define  LED_ON  output_high
#define  LED_OFF  output_low

void main (){ 
         delay_ms (500);
         usb_cdc_init();
         usb_init();
            while(true){
               LED_ON (LED1);
               delay_ms (500);
               LED_OFF (LED1);
               delay_ms (500);}
         }
```
les agradesco si pueden ayudarme, aconsejarme o si me van a regañar jajajaja...


----------



## FRYCK (Abr 28, 2010)

Hola  rald  lamento decirle   que  en  tu codigo  no solo  por  agregar   las  librerias  de  trabajo de usb  #include "usb_cdc.h" #include "usb_desc_cdc.h"  te  va  a reconocer   el  micro  como  usb   en ningún momento  ni las  llamas,  ni utilizas  ninguna  de las  funciones que estas  traen   para tal fin,  te  recomiendo que  leas los primeros mensajes de este  hilo  que  ahí  se trabajo  esto y moyano  aporto  varios ejemplos. 
https://www.forosdeelectronica.com/f24/control-dispositivos-traves-modulo-usb-pic18f2550-17458/
si tienes  mas  dudas  nos las  comunica.
saludos


----------



## RALD (Abr 28, 2010)

gracias por tu pronta respuesa FRYCK, he leido las paginas  que explican como configurar el USB en el pic pero no entiendo a que te refieres con llamar a la libreria?? en una de las paginas habla de llamar a la libreria utilizando este comando "usb_init()" pero esos comandos ya estan en mi programa entonces no veo en que me estoy equivocando, si fueses tan amable de guiarme por donde leer te lo agradeceria....


----------



## FRYCK (Abr 28, 2010)

Hola rald  guíese del  ejemplo del cual puse el link https://www.forosdeelectronica.com/f24/control-dispositivos-traves-modulo-usb-pic18f2550-17458/   te  recomiendo  que  leas  las primeras  partes de este  hilo  en  la pagina  1  y que  te  descargues el   manual  echo por  moyano.   Búscalo esta  en  la  pagina  anterior.    el siguiente  programa  es  básico  para   comunicación por puerto serial virtual.


// Ejercicio Nº1: Genera un COM virtual y se comunica bidireccionalmente con el a través del PIC18F2550.
#include <18F2550.h> // Definición de registros internos.

#fuses HSPLL,NOMCLR,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN,NOPBADEN

// Fuses utilizados:
/*
HSPLL: utilizamos un cristal HS de alta velocidad, en conjunto con el PLL para generar los 48Mhz.
NOMCLR: Utilizamos reset por software, y dejamos el pin 1 del micro como entrada/salida digital.
NOWDT: No utilizamos el perro guardían.
NOPROTECT: Desactivamos la protección de código.
NOLVP: Desactivamos la programación a bajo voltaje.
NODEBUG: No entramos al modo debug.
USBDIV: signfica que el clock del usb se tomará del PLL/2 = 96Mhz/2 = 48Mhz.
PLL5: significa que el PLL prescaler dividirá en 5 la frecuencia del cristal. para HS = 20Mhz/5 = 4Mhz.
CPUDIV1: El PLL postscaler decide la división en 2 de la frecuencia de salida del PLL de 96MHZ, si queremos 48MHZ, lo dejamos como está.
VREGEN: habilita el regulador de 3.3 volts que usa el módulo USB
*/

#use delay(clock=48000000) // Frecuencia máxima de trabajo.

#include "usb_cdc.h" // Descripción de funciones del USB.
#include "usb_desc_cdc.h" // Descriptores del dispositivo USB.

void main() {
usb_cdc_init(); // Configuramos al puerto virtual.
usb_init(); // Inicializamos el stack USB.
while(!usb_cdc_connected()) {} 
   // espera a detectar una transmisión de la PC (Set_Line_Coding).
   do{
usb_task();
if (usb_enumerated()){  // Espera a que el dispositivo sea enumerado por el host.
         if(usb_cdc_kbhit()){ // En espera de nuevos caracteres en el buffer de recepción.
            if(usb_cdc_getc()=='x'){ //¿lo que llegó fué el caracter x?
               printf(usb_cdc_putc, "Se recibe el caracter x.\n\r"); 
               //si, entonces envía una cadena hacia el PC
             }
            if(usb_cdc_getc()=='a'){ //¿lo que llegó fué el caracter a?
               printf(usb_cdc_putc, "Se recibe el caracter a.\n\r");
               //si, entonces envía una cadena hacia el PC               
             }
         }
        }
       }while (TRUE); // bucle infinito.
}


----------



## Vegetal Digital (Abr 28, 2010)

Lo que FRYCK quiere decir es que tu programa no usa ninguna función que este en las librerias(a excepción del usb_init), podrias quitar esas lineas y funcionaria igual. Lo que tenes que hacer es incluir algunas funciones por ejemplo:

```
usb_task();

printf(usb_cdc_putc, "Conexion CDC via USB .\n\r"); 

if(usb_cdc_getc()=='a')
```

tendrias que fijarte que funcion hace lo que vos queres, existe, pero no recuerdo cuál es...

Moya te darás cuenta que estuve practicando esto del usb y la verdad sos un capo, gracias por la informacion anda todo re bien y re claro. Seguro dentro de poco me tendran molestando preguntando algo que no me salga 

saludos


----------



## Moyano Jonathan (Abr 28, 2010)

Buenisimo...a cualquiera que tenga dudas pregunte...


----------



## COSMICO (Abr 28, 2010)

Amigo pkdos.
Realice todas las pruebas y la simulacion funciona full.
Tendrias que armarlo en un protoboard y probarlo a ver como te va
depronto es algun problema con la version isis que tienes.
De todas maneras; el amigo moyano subio unos ej en modo bullk usb
intenta con con el primer ejemplo a simularlo, logicamente tienes que instalar otor drivers
y comentas los resultados.si te funciona bien; depronto tiene problemas con los otros drivers


----------



## lycans2005 (Abr 29, 2010)

Buenas, soy nuevo en esto de  pic-usb....
alguien tendra un proyecto todo mascadito?
codigo VB codigo pic y proteus

algo asi como prender un led, mover un motor, cositas asi.

de ante mano muchas gracias


----------



## Moyano Jonathan (Abr 29, 2010)

si te fijas desde la primera página hay varios proyectos completos..


----------



## FRYCK (Abr 29, 2010)

Hola *lycans2005* lea este  post  desde el comienzo  hay varios  ejemplos de los que dises  con los diferentes tipos de transmisión  así  como  un manual  realizado  por  moyano que  explica  varios  aspectos de este  modulo   si  despues de hacer  las consultas  que te mensione  te quedan dudas   las  comentas 
este  link https://www.forosdeelectronica.com/f24/control-dispositivos-traves-modulo-usb-pic18f2550-17458/

saludos


----------



## Meta (Abr 29, 2010)

*lycans2005*, ya sacará un manual con estas cosas que también las espero.


----------



## ElGiganteDeYeso (Abr 30, 2010)

Hola colegas del mundo de la electrónica,

Permitid que me presente. Me llamo Héctor y resido en Valencia, España. Tras haber cursado un Ciclo Formativo de Grado Superior de Desarrollo de Productos Electrónicos, estoy haciendo las FCT en la universidad con un proyecto en el cual requerimos de la comunicación de un PIC18F2550 con un PC para adquirir los datos de unas señales analógicas.

Antes de nada me gustaria agradecer a Moyano y demás usuarios del foro por los ejemplos dados en este hilo que me han sido de gran ayuda para poder desarrollar el firmware del PIC con la clase CDC. 

Actualmente me hallo en la tarea de portar todo el código que tenemos para CDC a la libreria EasyHID, por lo cual estoy portando la interfaz de la DLL a C# (y con un conversor seguramente también VB.NET). Tan solo me gustaría dejar por aquí la clase intefaz que he hecho (con mis escasos conocimientos de C#) con la esperanza de que también os resulte de ayuda a vosotros, además de que así podríamos ayudarnos mutuamente y mejorarla.

Por ahora las funciones básicas están implementadas y he probado un pequeño software para el PIC para comprobar que la lectura y escritura se realiza correctamente. Me falta por ver que parámetros serían los más correctos para poder recoger las strings de producto y demás, que en los proximos días trataré de averiguar.

Sin más dilación, el código de la clase es el siguiente:

```
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.ComponentModel;
using System.Runtime.InteropServices;

namespace MecaniqueUK
{
    class EasyHID
    {
        // HID specific...
        public const UInt32 VENDOR_ID       = 6017;
        public const UInt32 PRODUCT_ID      = 2000;
        public const int BUFFER_IN_SIZE     = 8;
        public const int BUFFER_OUT_SIZE    = 8;

        // HID events...
        private const int WM_APP            = 0x8000;
        public const int WM_HID_EVENT       = WM_APP + 200;
        public const int NOTIFY_PLUGGED     = 0x0001;
        public const int NOTIFY_UNPLUGGED   = 0x0002;
        public const int NOTIFY_CHANGED     = 0x0003;
        public const int NOTIFY_READ        = 0x0004;

        // HID interface...
        [DllImport("mcHID.dll")]
        public static extern bool Connect(IntPtr pHostWin);
        [DllImport("mcHID.dll")]
        public static extern bool Disconnect();
        [DllImport("mcHID.dll")]
        public static extern UInt32 GetItem(UInt32 pIndex);
        [DllImport("mcHID.dll")]
        public static extern UInt32 GetItemCount();
        [DllImport("mcHID.dll")]
        public static extern bool Read(UInt32 pHandle, IntPtr pData);
        [DllImport("mcHID.dll")]
        private static extern bool Write(UInt32 pHandle, IntPtr pData);
        [DllImport("mcHID.dll")]
        private static extern bool ReadEx(UInt32 pVendorId, UInt32 pProductId, IntPtr pData);
        [DllImport("mcHID.dll")]
        private static extern bool WriteEx(UInt32 pVendorId, UInt32 pProductId, IntPtr pData);
        [DllImport("mcHID.dll")]
        public static extern UInt32 GetHandle(UInt32 pVendorID, UInt32 pProductId);
        [DllImport("mcHID.dll")]
        public static extern UInt32 GetVendorID(UInt32 pHandle);
        [DllImport("mcHID.dll")]
        public static extern UInt32 GetProductID(UInt32 pHandle);
        [DllImport("mcHID.dll")]
        public static extern UInt32 GetVersionID(UInt32 pHandle);
        [DllImport("mcHID.dll")]
        public static extern UInt32 GetInputReportLength(UInt32 pHandle);
        [DllImport("mcHID.dll")]
        public static extern UInt32 GetOutputReportLength(UInt32 pHandle);
        [DllImport("mcHID.dll")]
        public static extern void SetReadNotify(UInt32 pHandle, bool pValue);
        [DllImport("mcHID.dll")]
        public static extern bool IsReadNotifyEnabled(UInt32 pHandle);
        [DllImport("mcHID.dll")]
        public static extern bool IsAvailable(UInt32 pVendorId, UInt32 pProductId);

		// Managed version of the read/write functions.
        public static bool Read(UInt32 pHandle, out byte[] pData)
        {
            IntPtr unmanagedBuffer = Marshal.AllocHGlobal(BUFFER_IN_SIZE);
            bool result = Read(pHandle, unmanagedBuffer);

            try { pData = new byte[BUFFER_IN_SIZE]; Marshal.Copy(unmanagedBuffer, pData, 0, BUFFER_IN_SIZE); }
            finally { Marshal.FreeHGlobal(unmanagedBuffer); }

            return result;
        }

        public static bool Write(UInt32 pHandle, byte[] pData)
        {
            IntPtr unmanagedBuffer = Marshal.AllocHGlobal(BUFFER_OUT_SIZE);
            bool result;

            try { Marshal.Copy(pData, 0, unmanagedBuffer, BUFFER_OUT_SIZE); result = Write(pHandle, unmanagedBuffer); }
            finally { Marshal.FreeHGlobal(unmanagedBuffer); }

            return result;
        }
		
        public static bool ReadEx(UInt32 pVendorId, UInt32 pProductId, out byte[] pData)
        {
            IntPtr unmanagedBuffer = Marshal.AllocHGlobal(BUFFER_IN_SIZE);
            bool result = ReadEx(pVendorId, pProductId, unmanagedBuffer);

            try { pData = new byte[BUFFER_IN_SIZE]; Marshal.Copy(unmanagedBuffer, pData, 0, BUFFER_IN_SIZE); }
            finally { Marshal.FreeHGlobal(unmanagedBuffer); }

            return result;
        }

        public static bool WriteEx(UInt32 pVendorId, UInt32 pProductId, byte[] pData)
        {
            IntPtr unmanagedBuffer = Marshal.AllocHGlobal(BUFFER_OUT_SIZE);
            bool result;

            try { Marshal.Copy(pData, 0, unmanagedBuffer, BUFFER_OUT_SIZE); result = WriteEx(pVendorId, pProductId, unmanagedBuffer); }
            finally { Marshal.FreeHGlobal(unmanagedBuffer); }

            return result;
        }
    }
}
```

Ejemplo de utilización análogo al funcionamiento del ejemplo en Visual Basic (aun incompleto, no he podido probar aún la lectura de datos del PIC):

```
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using MecaniqueUK;

namespace WindowsFormsApplication1
{
    public partial class FormMain : Form
    {
        public FormMain()
        {
            InitializeComponent();
        }

        private void FormMain_Load(object sender, EventArgs e)
        {
            EasyHID.Connect(Handle);
        }


        private void FormMain_FormClosed(object sender, FormClosedEventArgs e)
        {
            EasyHID.Disconnect();
        }

        private void OnPlugged(UInt32 handle)
        {
            if (EasyHID.GetVendorID(handle) == EasyHID.VENDOR_ID && EasyHID.GetProductID(handle) == EasyHID.PRODUCT_ID)
            {
                Console.WriteLine("Conectado al dispositivo.");
                EasyHID.SetReadNotify(handle, true);

                // Enviar dato de prueba
                byte[] test = new byte[EasyHID.BUFFER_OUT_SIZE];
                test[0] = 0;      // Report ID
                test[1] = 0x11;   // Dato aleatorio
                if (EasyHID.Write(handle, test) == true)
                {
                    Console.WriteLine("Dato enviado correctamente.");
                }
            }
        }

        private void OnUnplugged(UInt32 handle)
        {
            if (EasyHID.GetVendorID(handle) == EasyHID.VENDOR_ID && EasyHID.GetProductID(handle) == EasyHID.PRODUCT_ID)
            {
                Console.WriteLine("Desconectado del dispositivo.");
            }
        }

        protected override void WndProc(ref Message message)
        {
            // Intercept the HID message.
            if (message.Msg == EasyHID.WM_HID_EVENT)
            {
                switch (message.WParam.ToInt32())
                {
                    case EasyHID.NOTIFY_PLUGGED:
                        OnPlugged((UInt32) message.LParam.ToInt32());
                        break;
                    case EasyHID.NOTIFY_UNPLUGGED:
                        OnUnplugged((UInt32) message.LParam.ToInt32());
                        break;
                    case EasyHID.NOTIFY_CHANGED:
                        break;
                    case EasyHID.NOTIFY_READ:
                        break;
                }
            }

            // Run the base procedure.
            base.WndProc(ref message);
        }
    }
}
```

Espero que os sirva de ayuda


----------



## Meta (Abr 30, 2010)

Muchar gacias. A lo mejor aquí aprenderás C# con un manual que hice pero controlando el puerto serie y PIC16F84A.

http://www.abcdatos.com/tutoriales/tutorial/z9521.html

Saludo.


----------



## COSMICO (Abr 30, 2010)

Amigo
me parece que ya tenia ese manual desde hace tiempo, pero por si acaso
lo bajare.
Gracias como siempre


----------



## Moyano Jonathan (Abr 30, 2010)

@ElGiganteDeYeso aunque te parezca mentira me has resuelto un gran problema ...yo hasta ahora no había podido portar el código de EasyHID a VC# y me has puesto la solución ....muchas gracias !!!


----------



## Meta (Abr 30, 2010)

ME refería a @ElGiganteDeYeso

jajajaaa


----------



## COSMICO (Abr 30, 2010)

Amigos meta y moyano.
No se si pueda preguntarles aqui; pero creo que entre prueba y prueba 
de los ejemplos usb. se me crearon una cantidad de puertos virtuales 
que solo estan en uso al conectar los dispositivos. lo digo por que cuando conecto el usb
aparecen en puertos com, debe haber un poco de estos ya que al simular me aparece 
el com 110, esta el 12,11,2 y 1 es logico que del 110 para abajo deben estar
pero no los puedo ver..como hago para quitar estos puertos, sera posible con alguna aplicacion vb..
Gracias..


----------



## Moyano Jonathan (Abr 30, 2010)

@COSMICO la verdad me mataste....nunca me ha pasado eso.


----------



## Meta (Abr 30, 2010)

Vete en "Mi PC", Administrador de dispositivos HardWare, puncha en USB y vete borrando los que tienes de sobra.


----------



## alaroa (Abr 30, 2010)

Hola!!!, 

Disculpen por la molestia pero... no se como crear la interface en VB 2008 con el archivo mpusbapi.dll, me lo podrían explicar paso a paso por favor de antemano GRACIAS!!!!


----------



## ElGiganteDeYeso (Abr 30, 2010)

Edit: Ups, perdon por el post, crei que alaroa se refería al EasyHID :3


----------



## alaroa (Abr 30, 2010)

También no importa, no se como crear la interface con el .dll

Gracias


----------



## RALD (Abr 30, 2010)

Hola señores, 
tengo buenas nuevas descubri que es muy requerido el Vusb para el pic18F2450 ya le habilite el regulador y funciono de maravilla, la PC me lo reconoce como CCS RS-232 DEMO. Sin embargo mis problemas no acaban aca, estoy utilizando el enumer_picusb pero no lobro instalar el mchpcdc he seguido el manual al pie de la letra y tambien prove dando click derecho "instalar", pero igual no logro que se instale el driver, la PC me tira el siguiente mensaje "la carpeta seleccionada no contiene informacion relacionada con el hardware"... alguien sabra a que se debe esto?... de nuevo gracias por la ayuda suministrada....


----------



## Meta (May 2, 2010)

alaroa dijo:


> Hola!!!,
> 
> Disculpen por la molestia pero... no se como crear la interface en VB 2008 con el archivo mpusbapi.dll, me lo podrían explicar paso a paso por favor de antemano GRACIAS!!!!



Deja que le de tiempo acabar su gran manual sobre el puerto serie USB 2.0.


----------



## COSMICO (May 2, 2010)

RALD
Depronto al bajar se te daño el archivo
Algo parecido me paso con eso.


----------



## RALD (May 2, 2010)

hola cosmico,
gracias por el tip, pero resulta que era una mala coneccion entre los pines del pic, ya la pc me reconce el pic como cdc com 3... aunque si me pasa algo muy rato el pic esta conectado y reconocido como puerto serial, pero no me funciona con hyperterminal o con visual basic 2010, aun estoy trabajando en esto... pero si tuvieras alguna idea de por donde va ese error...  me ayudarias mucho... o si alguien mas tiene una idea de esto....


----------



## alaroa (May 3, 2010)

RALD dijo:


> hola cosmico,
> gracias por el tip, pero resulta que era una mala coneccion entre los pines del pic, ya la pc me reconce el pic como cdc com 3... aunque si me pasa algo muy rato el pic esta conectado y reconocido como puerto serial, pero no me funciona con hyperterminal o con visual basic 2010, aun estoy trabajando en esto... pero si tuvieras alguna idea de por donde va ese error...  me ayudarias mucho... o si alguien mas tiene una idea de esto....



Puede ser varias cosas, lo primero que debes revisar es que tus conexiones en el PIC sean las adecuadas, puede ser que estén invertidas D+ y D-, y después de eso revisa la velocidad en la cual estas trabajando con el PIC, también tiene que coincidir con la velocidad de las hiperterminales, puedes sufrir desconexiones seguidas, también puede ser que el controlador que estas utilizando no sea compatible, en este caso revisa tu programa para ver que si sea el correcto, cámbialo a otra conexión del USB, te pudiste echar ese puerto... revisa todo estas opciones una por una


----------



## MiremireMcFly (May 5, 2010)

Gracias por postear


----------



## Moyano Jonathan (May 6, 2010)

mirá lo que pedís es complejo y vas a tener que buscar más info de lo que querés para que te ayudemos. 
1º que nada los descriptores de dispositivo para que la PC los detecte como un puerto paralelo y después leerte bien todas las caracteristicas y especificaciones del mismo para poder implementar un firmware que emule dicho puerto.


----------



## kuropatula (May 6, 2010)

Hola Moyano, que tal. 
Tengo una duda importante, estoy en el trabajo y necesito hacer una conexion con USB, utilizo el PIC18F13K50, pero para las simulaciones en Proteus, para simplificar, utilizo el 2550. Con los ejemplos del Proteus me anda muy bien cuando conecto el simulador de USB, pero con los ejemplos que posteaste no me funciona. Probe con los de la pagina 1 y nada. 
Sabes que puede ser?
Muchas gracias de ante mano, 
Saludos
Daniel

Moyano, vi en la pagina 39 que COSMICO pregunto lo mismo que yo y le contestaste.. es dificil leer todo.... Cambio la pregunta: las librerias que posteaste en la primera pagina son un poco distintas a las que provee CCS, eso afecta en algo?
Otra pregunta si no te molesto... puedo adaptar tu codigo para el 13K50?
Muchas gracias


----------



## FRYCK (May 6, 2010)

kuropatula dijo:


> Moyano, vi en la pagina 39 que COSMICO pregunto lo mismo que yo y le contestaste.. es dificil leer todo.... Cambio la pregunta: las librerias que posteaste en la primera pagina son un poco distintas a las que provee CCS, eso afecta en algo?



Hola* kuropatula* las  librerias que  utiliza Moyano tanto la *usb_desc_scope.h*   como  *usb_desc_cdc.h*  son diferentes ya  que  la que el utiliza  tiene  algunos descriptores distintos   se han cambiado  tanto el  los nombres con los que  se muestra el  dispositivo  así como  también  el VID  y el PID  tendrías que  o remplazarlas  así  como dice  Moyano  o cambiar el PID y el VID  en  las  librerías  para  ponerle  las de tus driver o en  las  de tu driver para ponerles las de librerías que deseas  si estos valores  no coinciden  el PID y el VID  no  se reconoce el driver que se utiliza disculpa si no fui claro 
saludos


----------



## kuropatula (May 6, 2010)

Hola FRYCK, muchas gracias por la respuesta. Entendi bien lo que dijiste, fuiste claro.
Te pregunto otra cosa, utilice el ejempli que esta en la primera pagina en donde si recibe el ASCII 'a' hace un toggle. Modifique un poco el codigo para que me haga el toggle en un pin luego del kbhit y otro luego de la deteccion de la 'a'. Lo que me ocurre es que en kbhit lo detecta bien pero el caracter 'a' no. Me podrias ayudar?

Este es el codigo:

if (usb_enumerated()){ // Si el puerto ya fue enumerado por el host :	
	      if(usb_cdc_kbhit()){ // en espera de nuevo(s) caracter(es) en el buffer.
				output_toggle(PIN_C3);
	            if(usb_cdc_getc()== 'a'){ // ¿lo que llegף fuי el caracter a?
	                printf(usb_cdc_putc, "OK!.\n\r");	
					output_toggle(PIN_C4); 
	        }
}

Gracias desde ahora.

Saludos

Daniel
      }


----------



## FRYCK (May 6, 2010)

Hola *kuropatula *este programa  me   esta  haciendo  lo que dices  compara y  ve  cual era  tu error. revisa  en dispositivos que  com estas  utilizando  en  administrador de dispositivos Puertos( com & lpt)   y lo  comunicas  con el programa que estas  utilizando  para  enviar  en mi caso  es  COM4  y  utilizo  Hércules  para  comunicacion.   busco  COM4  abro puerto y escribo "a" me devuelve ok .
saludos

```
// Ejercicio Nº1: Genera un COM virtual y se comunica bidireccionalmente con el a través del PIC18F2550.

#include <18F4550.h> // Definición de registros internos.

#fuses HSPLL,NOMCLR,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN,NOPBADEN

// Fuses utilizados:
/*
HSPLL: utilizamos un cristal HS de alta velocidad, en conjunto con el PLL para generar los 48Mhz.
NOMCLR: Utilizamos reset por software, y dejamos el pin 1 del micro como entrada/salida digital.
NOWDT: No utilizamos el perro guardían.
NOPROTECT: Desactivamos la protección de código.
NOLVP: Desactivamos la programación a bajo voltaje.
NODEBUG: No entramos al modo debug.
USBDIV: signfica que el clock del usb se tomará del PLL/2 = 96Mhz/2 = 48Mhz.
PLL5: significa que el PLL prescaler dividirá en 5 la frecuencia del cristal. para HS = 20Mhz/5 = 4Mhz.
CPUDIV1: El PLL postscaler decide la división en 2 de la frecuencia de salida del PLL de 96MHZ, si queremos 48MHZ, lo dejamos como está.
VREGEN: habilita el regulador de 3.3 volts que usa el módulo USB
*/

#use delay(clock=48000000) // Frecuencia máxima de trabajo.

#include "usb_cdc.h" // Descripción de funciones del USB.
#include "usb_desc_cdc.h" // Descriptores del dispositivo USB.

void main() {
   usb_cdc_init(); // Configuramos al puerto virtual.
   usb_init(); // Inicializamos el stack USB.
   while(!usb_cdc_connected()) {} 
   // espera a detectar una transmisión de la PC (Set_Line_Coding).
   do{
      usb_task();
      if (usb_enumerated()){  // Espera a que el dispositivo sea enumerado por el host.
         if(usb_cdc_kbhit()){ // En espera de nuevos caracteres en el buffer de recepción.
         output_toggle(PIN_C3);         
            if(usb_cdc_getc()=='a'){ //¿lo que llegó fué el caracter a?
               printf(usb_cdc_putc, "OK\n\r");
            output_toggle(PIN_C4); 
               //si, entonces envía una cadena hacia el PC               
             }
         }
        }
       }while (TRUE); // bucle infinito.
}
```


----------



## kuropatula (May 6, 2010)

Gracias FRYCK, lo voy a probar pero el lunes ya que sali del trabajo y hasta el lunes no vuelvo. Te aviso como funciono, de todas formas me parece similar, creo que mi problema puede estar en otro lado. A cuantos baudios transmite? Creo que es 9600 8 N 1 verdad?

Gracias y saludos!


----------



## FRYCK (May 6, 2010)

kuropatula dijo:


> Gracias FRYCK, lo voy a probar pero el lunes ya que sali del trabajo y hasta el lunes no vuelvo. Te aviso como funciono, de todas formas me parece similar, creo que mi problema puede estar en otro lado. A cuantos baudios transmite? Creo que es 9600 8 N 1 verdad?
> 
> Gracias y saludos!



Hola *kuropatula* si  esa es la  velocidad de transmisión  depronto tu problema es el driver o el   COMx que tratas de utilizar


----------



## RALD (May 6, 2010)

Buenas caballeros,
Esta vez tengo un problemita similiar al que esta aqui arriba posteado por el compañero kuropatula, que dice que no puede recibir informacion del PC a el PIC, mi programa es muy parecido al que esta ahi pero no logro por ningun medio que el pic diferencie si resibe un 1 o un 2 o cualquier otro caracter. 


> #include <18F2450.h>
> #fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL3,CPUDIV1,VREGEN,MCLR,PUT
> #use delay(clock=48000000)
> 
> ...



como podran notar el el enumerador y el conector estan configurados para encender un par de leds cuando se conectan a la PC, esto pasa sin ningun problema, el pic envia informacion al PC la cual puedo ver en el hyperteminal. Y lo que veo es lo siguiente; cuando envio un dato recibo en el hyperterminal "caracter recibido" pero no me enciende el led igual cuando no envio datos me da un "no caracter rebido" pero no veo respuesta por parte del led, lo que me indica que el pic no esta distinguiendo los caracteres, ya he probado usando '1'  y '2', y con constantes fijas pero aun asi no logro obtener respuesta... si alguien tiene un idea de esto o si puede  guiarme le estare agradecido.... y gracias a cualquiera por sus opiniones...


----------



## FRYCK (May 6, 2010)

Hola  *RALD * seria mas  cómodo para  todos si editaras  tu mensaje y colocaras  tu código en medio de las  instrucciones code o php se hace  mas legible 
saludos


----------



## RALD (May 6, 2010)

hola FRYCK no se como hacer para que el codigo quede en un formato mas legible pero creo que lo que hice les puede ayudar, cualquier cosa si no me puedes decir como corregir el problema? gracias


----------



## FRYCK (May 6, 2010)

Hola *RALD*   en  avanzados  esta la occion code (#)  y php es mas  comodo   para leerlo  y se entiende mejor la idea  y  por otro lado si te queremos ayudar asi se facilita las  cosas 

probé  tu código y me funciono  el  único cambio fue el micro los descriptores  y los driver  si quieres te  paso  los que utilice  .

saludos


```
#include <18F4550.h> // Definición de registros internos.
#fuses HSPLL,NOMCLR,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN,NOPBADEN

#define led (pin_c0)
#define led2 (pin_c1)
#define led3 (pin_c2)
#define on output_high
#define off output_low

#use delay(clock=48000000) // Frecuencia máxima de trabajo.

#include <usb_cdc.h>
#include "usb_desc_cdc.h"

void main() {   
   on (led);
   delay_ms (1000);
   off (led);
   on (led2);
   delay_ms (1000);
   off (led2);
   on (led3);
   delay_ms (1000);
   off (led3);
   
   
   usb_cdc_init();
   usb_init();
   
   do{ 
      if (usb_cdc_connected()){
         on (led);
         if (usb_enumerated()){
         on (led2);
         do{
            usb_task(); 
            if (usb_cdc_kbhit()) {
               printf (usb_cdc_putc, "caracter recibido\n\r");
               if (usb_cdc_getc() =='1'){
                  on (led3);
                  delay_ms (1000);
               }
               else if (usb_cdc_getc() =='2'){
                  off (led3);
               }
            }
            else if (usb_cdc_kbhit() == false){
               printf (usb_cdc_putc, "no hay caracter\n\r");
               delay_ms (1000);
            }
         }while(true);
         }
         else{
         off (led2);
         }
      }
      else{
      off (led);
      }
   }while (TRUE);
}
```


----------



## RALD (May 7, 2010)

hola FRYCK, gracias por el dato apartir de ahora lo voy a usar. 
te agradeceria que me pasaras la informacion que tiengas para probarla en mi sistema por que ya te tratado con todo y hasta el momento no he tenido exito con eso...


----------



## Jhon5191 (May 7, 2010)

Hola A todos, soy nuevo en el foro!!!

En primer lugar, este es el topic mas claro que he podido encontrar en internet para tratar de comprender el protocolo de comunicación USB, con el cual no estoy muy familiarizado.  Sin embargo he estado entendiendo algunos conceptos básicos y algunos de los métodos de transferencia de datos bidireccionalmente, gracias a este topic, asi que a todos ustedes y a Moyano, muchas gracias.

Well, Tengo este proyecto que estoy desarrollando con dos amigos, usando un PIC18f2550, con el cual queremos muestrear y digitalizar una señal de audio y transmitir su equivalente digital a traves del puerto usb hacia algun tipo de software que me permita graficarla, manipularla o reproducirla, en el mejor de los casos.  Sin embargo, y debido a que no estoy familiarizado con este tipo de comunicación, me han surgido algunas dudas.

1.  En primer lugar, no estoy totalmente seguro si este pic es capaz de digitalizar una señal de audio con componentes de frecuencia de hasta 20KHz, si es asi, una vez que vaya a configurar el tiempo de muestreo del adc, es posible establecer una frecuencia de muestreo diferente a las frecuencias de muestreo establecidas para el micro, ya que quisiera muestrear a 44.1KHz para que sea compatible con los formatos de audio del pc.

2.  Tengo claro que, debido a que se trata de audio, deberia transmitir los datos por el tipo de transferencia bulk/transfer en tiempo real, lo que supone que no debo establecer el tamaño del paquete de entrege, correcto(?).  Sin embargo, no tengo idea alguna de como implementar este protocolo, ni de que librerias deberia incluir en mi proyecto (btw, yo uso el compilador CCS) ni de como modificar los firmware para escribir nuestra firma en nuestro dispositivo.

3.  Finalmente, podrian darme alguna indicación de que tipo de software o que camino deberia usar para recibir y manipular los datos que llegan al pc (he oido que labview es muy util).

Lamento molestar con tantas preguntas, y de antemano muchas gracias =)

Jhon


----------



## bernardo ovallos (May 9, 2010)

hola a todos espero que no sea tarde para preguntarles algo. es que quiero comunicar dos pics 18f2550 por medio inalambrico y los modulos q uso funcionan de la siguiente manera que los datos sean digitales y en forma serial osea tengo que programar en modo usart o serial unos de los pics pero me toca hacer conversion de los datos de analogo a digital y luego mandarlo por el usart al transmisor eñ se comunica con el receotor q despues pasa al otro pic q se encarga de comunicarse con el pc.

lo q necesito es q me ayuden a programar el 18f2550 para establecer esa comunicacion 

Moyano o Meta colaboranme porfa es q estoy corto de tiempo

hola a todos espero que no sea tarde para preguntarles algo. es que quiero comunicar dos pics 18f2550 por medio inalambrico y los modulos q uso funcionan de la siguiente manera que los datos sean digitales y en forma serial osea tengo que programar en modo usart o serial unos de los pics pero me toca hacer conversion de los datos de analogo a digital y luego mandarlo por el usart al transmisor eñ se comunica con el receotor q despues pasa al otro pic q se encarga de comunicarse con el pc.

lo q necesito es q me ayuden a programar el 18f2550 para establecer esa comunicacion


----------



## RALD (May 9, 2010)

hola bernardo ovallos,
Lei tu post y no lo veo cumplicado pero si algo difuso, que es exactamente lo que quieres hacer, lo que he interpretado es algo asi como  un PIC que envia los datos del ADC por RF al otro PIC que los recibe y los tratansmite a una PC... esta comunicacion seria por medio de RS232 o por USB?, cual integrado de RF vas a usar?


----------



## bernardo ovallos (May 9, 2010)

pero antes de que salga de ADC tiene que irse por el puerto usart y lo quiero comunicar por medio usb y los módulos son los siguientes

http://www.sparkfun.com/datasheets/Wireless/General/MO-RX3400.pdf

http://www.sparkfun.com/datasheets/Wireless/General/MO-SAWR.pdf

cualquier cosa que me puedas ayudar rald me lo mandas a mi correo *políticas@delforo.com



**Como no cumplo las Políticas del Foro. Me editaron el mensaje.*
​


----------



## kuropatula (May 9, 2010)

Hola FRYCK!!
Probe con tu codigo y con el codigo de RALD y no me funciona, lo que me parece raro que es puedo transmitir bien al PC pero no puedo recibir desde el PC, todo esto lo hago desde el Hyperterminal. Recibo el kbhit() pero no puedo distingur que tecla fue presionada y si retransmito loque recibi siempre me aparece lo mismo... un 'fi' y para que me aparezca tengo que presionar una tecla dos veces... muy raro...
Estoy usando el PIC18F13K50 y si pongo clockout veo en el osciloscopio una senal de 12MHz lo que creo que esta bien.... Tenes alguna idea?
Gracias y saludos

Daniel


----------



## Jhon5191 (May 9, 2010)

Jhon5191 dijo:


> Hola A todos, soy nuevo en el foro!!!
> 
> En primer lugar, este es el topic mas claro que he podido encontrar en internet para tratar de comprender el protocolo de comunicación USB, con el cual no estoy muy familiarizado.  Sin embargo he estado entendiendo algunos conceptos básicos y algunos de los métodos de transferencia de datos bidireccionalmente, gracias a este topic, asi que a todos ustedes y a Moyano, muchas gracias.
> 
> ...



Una cosa mas  se requiere de algun sistema operativo en especifico para realizar este proyecto? 

muchas gracias =)


----------



## FRYCK (May 9, 2010)

kuropatula dijo:


> Hola FRYCK!!
> Probe con tu codigo y con el codigo de RALD y no me funciona, lo que me parece raro que es puedo transmitir bien al PC pero no puedo recibir desde el PC, todo esto lo hago desde el Hyperterminal. Recibo el kbhit() pero no puedo distingur que tecla fue presionada y si retransmito loque recibi siempre me aparece lo mismo... un 'fi' y para que me aparezca tengo que presionar una tecla dos veces... muy raro...
> Estoy usando el PIC18F13K50 y si pongo clockout veo en el osciloscopio una senal de 12MHz lo que creo que esta bien.... Tenes alguna idea?
> Gracias y saludos
> ...


Hola *   kuropatula *si  el micro esta  siendo reconocido por el  pc  debe  haber comunicacionla verdad este  pic   PIC18F13K50 no  lo e trabajado  por eso no te  sabria decir  ¿lo estas  haciendo  simulado o lo estas probando de forma fisica?  si es simulado te  aconsejo que lo ¡ntentes con el circuito real tambien puedes intentar  con otro programa fuera  del hiperterminal  yo utilizo Hercules y funciona  bien
saludos


----------



## Moyano Jonathan (May 9, 2010)

@Jhon5191 lo que querés hacer ...es muy complejo...pero creo que se podría hacer lo único que la señal de audio la tendrías que tratar con un DSpic y luego mandar los datos por USB con el PIC18F2550. 
Ahora yo solamente te podría estar ayudando con el tema de USB....tratamiento de señales nunca he hecho....:S 
Algo que se me ocurre es que si te conseguís un dsPIC que tenga DMA , podrías sacar los datos por ahi y enviarlos por un PIC18F4550 que tiene puerto paralelo de alta velocidad ...este puerto tiene la virtud de poder comunicarse directamente con el SIE y por lo tanto si tenés que hacer muchas muestras por segundo y mandarlas por USB es la mejor manera.....otra cosa no se me ocurre.


----------



## Jhon5191 (May 9, 2010)

^ Gracias por tu respuesta Moyano  , bueno, la verdad es que en primer lugar, nosotros vamos a digitalizar una señal de un guitar pick up (o microfono de guitarra electrica, no se como se dice) cuya señal de audio es mas sencilla de trabajar, y la cual se nos pidió que fuese acondicionada con un amplificador de instrumentación cuya salida se lleva al pic18f2550.  Claro está, que me interesa mucho desarrollar como proyecto personal, el tratamiento de la señal de audio con el DSPic como tu me aconsejas.  Sin embargo creo que debo terminar este proyecto primero.

Con respecto a la comunicación USB, tengo claro algunos conceptos hasta ahora, como la enumeración por el host, el estado de la conexión y mirar si hay datos en espera en el buffer de entrada, lo que no estoy muy seguro de resolver, es el envio de los datos que estoy tratando, no se si deberia mandar dato por dato (es decir, leer el adc y mandar el dato) o llenar un arreglo con cierta cantidad de datos, y luego mandar este arreglo como un paquete.  Cual de los dos deberia implementar, y como?.

De antemano y nuevamente muchas gracias moyano


----------



## RALD (May 9, 2010)

saludos FRYCK y kuropatula,
 kuropatula al parecer tenemos el mismo problema con la transmisión de datos del PC al PIC por cdc USB, yo ya he tratado son diferentes opciones pero creo que el problema esta en el driver del puerto, tal y como dijo FRYCK en un correo anterior... ya trate con el programa hercules pero igual no logro nada... FRYCK si fueses tan amable de mandarme el nuevo driver a mi correo *políticas@delforo.com* para testearlo te lo agradecería mucho, por que, ya no se me ocurre que mas hacer para encontrar una solución.... gracias


*Como no cumplo las Políticas del Foro. Me editaron el mensaje.*​


----------



## Moyano Jonathan (May 9, 2010)

@Jhon5191 Bueno en realidad lo mejor sería mandar datos continuamente .....algo óptimo sería que en vez de que los datos sean procesados por el microcontrolador , los enviara por USB a la PC y un programa escrito en algún lenguaje gráfico los procesara....
Por ejemplo lo que podés hacer es un adaptador con amplificadores operacionales ...mandar esa señal a un ADC externo...que se comunique con el PIC18F4550 mediante el MPP....y de ahi al SIE para que transmita los datos por USB....
Te recomiendo un ADC externo debido a que podés tener más samples/seg...y más definición en bits.. que el ADC interno del PIC..

Algo que podrías hacer es crear tu propio archivo de descriptores USB para trabajar al PIC como si fuera un encoder de audio....pero tendrías que crearlos vos leyendo las especificicaciones del protocolo USB...y de ahi ver como la máquina te toma los datos y te los procesa como si fuera sonido..


----------



## FRYCK (May 9, 2010)

Hola  a todos dejo los driver  de microchip y las  dos librerías de pic c ccs * usb_cdc.h* y *usb_desc_cdc.h*  remplacen estas  dos librerias en  la carpeta  C:\Archivos de programa\PICC\Drivers  compilen el programa  de nuevo  después revisen en que  puerto se instalo el driver  en    mi_pc->propiedades -> hardware -> administrador de dispositivos -> puertos(com & lpt) ->  pic usb 4550 (com*x*)
abren ese puerto con el programa *Hércules* que  les  dejo en esta misma carpeta    que es   para comunicación serial  ojala les pueda servir    
saludos


----------



## bernardo ovallos (May 9, 2010)

hola a todos sera q alguien me puede colaborar. es que quiero comunicar dos pics 18f2550 por medio inalambrico y los modulos q uso funcionan de la siguiente manera que los datos sean digitales y en forma serial osea tengo que programar en modo usart o serial unos de los pics pero me toca hacer conversion de los datos de analogo a digital y luego mandarlo por el usart al transmisor eñ se comunica con el receotor q despues pasa al otro pic q se encarga de comunicarse con el pc.

lo q necesito es q me ayuden a programar el 18f2550 para establecer esa comunicacion


----------



## Moyano Jonathan (May 9, 2010)

Pero bernardo ovallos tendrías que abrir un nuevo hilo para exponer tu problema....igual hay muchos hilos que hablan de lo mismo y tu problema al parecer está dado por lo siguiente:
tenés 2 PIC para comunicar.... + 2 transceptores ( o emisor receptor ). + Problema de programación.
Primero ejecutar una rutina de recepción / envío RS232 es algo muy sencillo y hay amplia información en la red.
Si usas transceptores con comunicación serial limpia (libre de ruido) es aún más simple por que lo único que tenés que hacer es definir un hardware que conecte al PIC con el transceptor y teniendo el código RS232 listo no tenés que hacer más que conectar y funciona.
Ahora si usas módulos RF de bajo coste ....tu trabajo va tener que estár más enfocado en limpiar las comunicaciones por software implementando algún sistema CRC básico.
Te pido que por favor busqués en el foro y en internet que vas a encontrar seguro lo que necesitas.
Un saludo !


----------



## bernardo ovallos (May 9, 2010)

lo que pasa es q ya sustente el proyecto y lo propuse por medio del pic18f2550 usando el puerto usb y he visto q haces buenos aportes no s esi me pudes colaborar por esa parte y si tienes un enlace dond me pude guiar te agradezco


----------



## Moyano Jonathan (May 9, 2010)

Pero que querés hacer por USB ?? Es decir que datos querés enviar o recibir ??
Podrías poner Un mapa conceptual aproximado de lo que se trata tu proyecto...
Un saludo !


----------



## bernardo ovallos (May 9, 2010)

ahy te mando un adjunto o cual es tu correo y te mando el diagram de bloques


----------



## Moyano Jonathan (May 10, 2010)

Adjuntame en un archivo .rar lo que más o menos necesitas...y veo si te puedo dar una mano.


----------



## kuropatula (May 10, 2010)

Hola FRYCK, gracias por la respuesta, es bueno cuando hay ayuda....
Probe con lo que me dijiste y me sigue funcionando de la misma forma. Lo que hice fue copiar los archivos que estaban en la primer carpeta pero no encontre 'usb_cdc.h', en su lugar encontre 'usb_desc_scope' que creo que es para Bulk. 
El driver que le instale fue el que estaba en la carpeta 'drivers_cdc'... esta bien lo que hice?
Estoy haciendo todo con HW
Muchas gracias!!! espero poder resolverlo porque tengo un poco de presion ya que estoy en el trabajo.
Saludos y gracias

Hola RALD, yo sigo intentando, cuando lo solucione te aviso... lo mismo vos por favor, 
Saludos!


----------



## RALD (May 10, 2010)

hola kuropatula
estoy revisando a diestra y siniestra el asunto de los drivers en el PC, me podrias decir si tu pic en el PC aparece en el driver usbser.sys? ademas de cuales son los VID y PID  que estas usando tambien esta configurando el cdc_usb.h y cdc_desc_usb.h a mano o con el programa enumer_picusb?
gracias....


----------



## kuropatula (May 10, 2010)

Hola RALD, para peor estaba sin internet....
Reinstale los drivers y ahora no me funciona el envio desde el PIC a la PC, lo que creo que confirma que el problema si esta en los drivers.
Me fije lo de usbser.sys, no se que es pero aparece en el administrador de dispositivos del com virtual. Los PID y VID los configuro manualmente, no sabia de la existencia del programa enumer_picusb.
Mi situacion acutal es que seguramente tengo problemas en los drivers y no se que hacer.
En cdc_usb.h no aparece nada para cambiar el vid y pid, si en cdc_desc_usb.h
Los VID y PID del usb_desc_cdc.h son los mismos que en administrador de dispositivos y utilizo 04d8 y 000b

Alguna idea?
gracias por ocuparte...


----------



## FRYCK (May 10, 2010)

hola *Moyano*   me  puedes hacer un favor  estoy realizando una  maquina de CNC para taladrar mis impresos y quería saber  cual seria el mejor protocolo  para la comunicación bidireccional con el microcontrolador quiero que sea usb pero no se  que protocolo usar el programa lo estoy haciendo en c++. 
saludos


----------



## Moyano Jonathan (May 10, 2010)

@FRYCK como estás que buen proyecto que estás encarando me interesa mucho ..depende del control que quieras realizar pero por experiencia propia...la mayoría de las veces con HID basta para cualquier aplicación...
El uso del modo bulk es para cuando hay grandes volumenes de datos en juego...como dataloggers....sistema de adquisición de señales......sistema de toma de datos ininterrumpidos...etc...
pero si lo que vas a controlar no precisa de muy alta velocidad en los datos...con HID está bien....
Ahora justamente también estoy viendo el desarrollo de la comunicación USB HID via VC# en cuanto me funcione propongo una aplicación y la posteo como ejemplo.

PD: *A todo el que tenga dudas No me molesta tratar de ayudarlos , pero por favor pido lo siguiente como un método más rápido...
1 - Poner todas las dudas lo más detallada posible...( programa de la PC + programa del PIC + Esquema del circuito + foto del montaje si es posible )
2 - Por favor revisar su versión del compilador CCS y dar informe de ello...para ver si se trata de bugs del programa.
3 - Los que usen VB 6.0 por favor digan que versión de sistema usan en su PC ....algunos de los programas corren solamente en XP.
4 - Aclaro que he probado los drivers en Vista y XP y funcionan correctamente...por lo que los programas tienen que andar.
5 - Recomiendo ampliamente que todos los programadores usen VB.net 2008 express o VC# 2008 o 2010 express ya que son los que más compatibilidad de aplicaciones tiene en windows.
6 - Pregunten de forma ordenada e inteligente asi todos entendemos sus problemas y es más facil tratar de resolverlos.


Por último mi manual está momentáneamente parado debido a que estoy con muchas cosas para hacer y hacer un manual es algo complejo y que lleva tiempo. Quiero aclarar que el mismo va a ser lo más completo e informativo posible y que necesito hacer más investigaciones para terminarlo.

*Desde ya un saludo grande !
Moyano Jonathan


----------



## FRYCK (May 10, 2010)

Hola *Moyano Jonathan*  gracias por su respuesta  Estar  comentando dudas mientras tanto iré viendo el protocolo hid en c++ pues ya había utilizado el cdc  y el bulk después haré mis  aportes sobre esto.   
saludos


----------



## Meta (May 10, 2010)

Buenas:

Menos malque pusiste las reglas paraque nos entendamos pronto, no somos adivinos. Sobre el manual, se tarda mucho, ya que mientas investigas, no haces el manual,hay que hacer pruebas, si sale bien ya es otro cantar, hacer más pruebas para hacer poco a poco un buen manual. Por cierto, parece muy duro este manual y muy detallado. Posiblemente el mejor manual. Con el tiempo me encargaré de pasarlo a otros lenguajes si podemos.

Ánimo a tod@s.


----------



## bernardo ovallos (May 10, 2010)

hola Moyano Jonathan primero quiero q me ayudes en este inconveniente es que quiero mandar datos electromiograficos "que le cual es convertido de analogo digital por el mismo pic"por el puerto serie del 18f2550.

Osea si tenes un programa q facilite mandar informacion por el puerto serie vale te agradezco."con el 18f2550"

gracias por tu atencion

saludes


----------



## kuropatula (May 11, 2010)

Hola, una consulta... al usar el PIC18F13K50, como debo configurar los FUSES?
Muchas gracias!


----------



## Meta (May 11, 2010)

Mira por aquí.

PIC16F13K50

Saludo.


----------



## kuropatula (May 11, 2010)

Hola Meta!
Una consluta... el objetivo es tener 48MHz en el CPU y 48 tambien en el modulo USB?

Esto me confunde un poco... ,me podrias ayudar?
USBDIV: signfica que el clock del usb se tomarב del PLL/2 = 96Mhz/2 = 48Mhz.
PLL5: significa que el PLL prescaler dividirב en 5 la frecuencia del cristal. para HS = 20Mhz/5 = 4Mhz.
CPUDIV1: El PLL postscaler decide la divisiףn en 2 de la frecuencia de salida del PLL de 96MHZ, si queremos 48MHZ, lo dejamos como estב.
VREGEN: habilita el regulador de 3.3 volts que usa el mףdulo USB.

Se que esta cofiguracion es para el 2550 pero no se como adaptarla para el 13K...







Muchas gracias!


Otra consulta... eso es lo que puede causar que pueda transmitir datos a la PC pero no recibir? Me parece que siempre recibo un 0 decimal. Puede ser que tenga problemas con la configuracion de los endpoints? Como se utilizan? (si no es muy complicado explicar)


----------



## FRYCK (May 11, 2010)

Hola *kuropatula*  estebe revisando  y parece que  este  dispositivo no esta soportado  para  usb todavía  por pic c ccs  me  lanza el Error 119 "C:\Archivos de programa\PICC\drivers\pic18_usb.h" Line 187(8,63):  Unknown PIC device, USB not supported in this library.  tendrías que probar con c18  para ver si ese es el verdadero problema saludos


----------



## kuropatula (May 11, 2010)

Hola FRYCK, es raro porque a mi me complila, ademas puedo transmitir sin problemas al PC, el problema es que reciboun 0 siempre....
Es raro el error que te dio, yo tengo el root en Program Files en vez de archivos de p.... pero creo que eso no deberia hacer la diferencia. La version que uso es CCS V4.104
Saludos


----------



## FRYCK (May 11, 2010)

kuropatula dijo:


> Hola FRYCK, es raro porque a mi me complila, ademas puedo transmitir sin problemas al PC, el problema es que reciboun 0 siempre....
> Es raro el error que te dio, yo tengo el root en Program Files en vez de archivos de p.... pero creo que eso no deberia hacer la diferencia. La version que uso es CCS V4.104
> Saludos



ok   yo tengo la  4.084 es por eso que no me  corrió tu programa  lo que si  puedo es probarlo  con mi microcontrolador y  asegurarme  que  no es  un problema de  programación  ¿que  windows tiene instalado ?
saludos


----------



## Moyano Jonathan (May 11, 2010)

El problema Kuropatula, no está en tus fuses sino en la programación de la aplicación que no está enviando los datos...la verdad como no he trabajado con esos micros no tengo idea de cuál puede ser el problema pero dejá que lo investigue un poco a ver que podemos sacar en claro..
* 
*

Lo que he visto investigando en foros de microchip:
1º - El PIC18F13K50 es que no puede implementar 100% el protocolo USB sino que lo   hace de forma imcompleta y con algunos bugs por el momento.
2º - Hay personas que les ha funcionado el modo HID pero en C18 y no consigo ejemplos..pero lo que dicen entre líneas es que si rebajas el uso de endpoint al mínimo el programa puede funcionar bien ...ya que casi todos los errores se deben a su falta de RAM para contener las funciones de USB...
También te dejo un link para que veas como podrías optimizar tu programa para que funcione correctamente: http://www.todopic.com.ar/foros/index.php?topic=27379.0


----------



## kuropatula (May 12, 2010)

Hola FRYCK, estoy usando WP SP3, creo que eso deberia ser compatible.
Moyano, estoy leyendo ahora lo que me pasaste, voy a ver como resulta.
Adjunto por si lo quieren mi proyecto.
Saludos y gracias


----------



## Moyano Jonathan (May 12, 2010)

La verdad que es raro tu problema , lastima no tener el micro para ver tratar de probar tu ejemplo.


----------



## kuropatula (May 12, 2010)

Si, es raro. Voy a ver como lo resulevo, cuando lo haga lo posteo.
Sobre lo que me pasaste te ngo una duda, el post hable del pic18_usb.h, es muy raro que yo lo tengo como .c.
Otra cosa, que son los endpoints?
Saludos!


----------



## RALD (May 12, 2010)

hola kuropatula,
ahora que leo tus post, recorde que en microchip hay un foro de pics y por ahi lei que esos pics tienen el problema de que en las librerias se debe cambiar el titulo _PIC_4550 por otro titulo ya que si no el pic no es reconocido por el compilador pero aun asi el pic es programado... me disculpas por que no copie el link, en el momento no vi tu post... pero quizas esto te pueda ayudar


----------



## carlosmarrero (May 12, 2010)

Hola Moyano, de verdad te estoy muy agradecido ya que gracias a tus explicacones (particularmente en lo referente a HID) pude sacar adelante mi proyecto de fin de carrera, el cual consistió en una incubadora neonatal con control de temperatura ambiente, humedad relativa y lecturas de temperatura corporal, frecuencia cardíaca, frecuencia respiratoria, pulso y tensión arterial; todo ello monitoreado desde un PC con la finalidad de interfazar estos datos con una base de datos de historias médicas; el resultado fue sencillamente espectacular. Aún cuado estoy de acuerdo contigo en que la mayoría de las aplicaciones se pueden resolver mediante HID, actualmente estoy explorando CDC, ya que pienso que si me puedo comunicar con el dispositivo mediante un puerto serial virtual, es posible enviar y recibir data desde un servidor web alojado en el equipo anfitrión del dispositivo, ya que PHP es capaz de leer y escribir en puerto seriales, pero no he visto que pueda manejar los puertos USB. saludos


----------



## FRYCK (May 12, 2010)

hola  *kuropatula * la  verdad  e probado tu código y  no e tenido  ningún problema envía y recibe datos   correctamente  con el micro 18f4550  con el  tuyo no simulo con mi Proteus así que  no pude hacer mas pero si  me  sale un warning de  poca RAM. 
saludos


----------



## RALD (May 13, 2010)

hola kuropatula,
trabajando con fryck por separado repeti tu error cuando borraste el driver del sistema, descubri algo muy raro en mi circuito, que talvez tu puedas recrear, mira inverti los cables del D+ y D-, osea instala el D+ al D- y viseversa, yo estuve todo un dia tratando de que la PC reconociera el pic, otra vez, como CDC y cuando hice eso el PC lo reconocio sin problema y volvi al problema original de no poder enviar datos al PIC, he visto que la version del CCS 4.05x esta teniendo un bueno numero de bugs asi que hice un upgrade a la version 4.093, para eliminar la posibilidad de bugs, despues de trabajar con un ing en sistemas que reviso las librerias el dice que es muy posible que el error este en las librerias usb_cdc y usb_desc_cdc no en el driver... tambien, si alguien pueda confirmarme si los cables del pic van crusados o directos ( D+ a D- o D+  a D+) se los agradeseria.....


----------



## FRYCK (May 13, 2010)

hola   kuropatula  intenta  cambiando el tamaño maximo  de los paquetes   en  tu librería  *usb_desc_cdc.h*


```
//pic to pc endpoint config
#define USB_CDC_DATA_IN_ENDPOINT       2
#define USB_CDC_DATA_IN_SIZE           64  // ponlo en 16
#define USB_EP2_TX_ENABLE  USB_ENABLE_BULK
#define USB_EP2_TX_SIZE  USB_CDC_DATA_IN_SIZE

//pc to pic endpoint config
#define USB_CDC_DATA_OUT_ENDPOINT       2
#define USB_CDC_DATA_OUT_SIZE           64 // ponlo en 16
#define USB_EP2_RX_ENABLE  USB_ENABLE_BULK
#define USB_EP2_RX_SIZE  USB_CDC_DATA_OUT_SIZE
```
esto es para disminuir  los requisitos de RAM define  esos  dos registros  como 16 y  prueba  para   ver si funciona  saludos


----------



## mandeb48 (May 13, 2010)

Tengo una Consulta:
Utilizo un led para señalar que me conecte al puerto USB con este código: 
.....
 while (TRUE)
   {
      if(usb_enumerated())                      // si el Pic está configurado via USB
      {
   	LED_ON(LEDR);                                // encendemos led en Rc7 al establecer contacto con la PC
.......
, pero este se mantiene ativo cuando lo desconecto. ¿Cuál es la forma correcta de hacerlo sin recurrir a  #define USB_CON_SENSE_PIN PIN?


----------



## Jhon5191 (May 13, 2010)

Muchas gracias por tu respuesta Moyano,  la verdad estaba pensado en tener un contador de instrucciones para saver cada cuanto tiempo leer el adc y asi poder muestrear la frecuencia de 44.1KHz a 16bits como el audio del pc (btw, cual es el registro de este contador?)

Por otro lado, es posible modificar las librerias usb para no usar el sense pin, ya que la tarjeta que estamos usando no posee la configuración para dicho pin, y es alimentada por el Vbus, asi que me parece que no necesita de este pin, o ustedes que piensan al respecto?

gracias nuevamente =)


----------



## Moyano Jonathan (May 13, 2010)

La verdad no le veo sentido práctico a usar USB_sense....pero en ciertas ocaciones muy especiales como por ejemplo que en tu aplicación tengas 2 tareas 1 con USB y otra que ejecute otras cosas...entonces se usa una directiva del programa para que sense cuando el USB esté conectado ..entonces ejecuta la tarea USB....y cuando lo desconectamos ejecuta otra porción del programa...en las primeras páginas de este hilo he explicado su funcionamiento.


----------



## elmor8 (May 14, 2010)

Disculpen la molestia pero desde hace unos meses he tratado de hacer un osciloscopio por usb (En realidad empezó por ser vía rs232 con cable conversor USB/Serial). He buscado en muchas partes pero no he logrado mucho. Lo que quiero es simplemente que el PIC tome una muestra del ADC y lo mande a la PC y lo grafico. Quisiera llegar a unos 100kHz x lo menos pero para empezar me conformo con 20kHz... La parte de la PC ya funciona perfecto, el problema (como en cualquier relación) es la comunicación. Empecé configurando el PIC como HID con el asistente HID de Protón pero casi nunca lo reconocía la computadora (a lo mejor por algún error mío) y cuando lo reconocía muestreaba a 8kHz como mucho. Leyendo x ahi encontré era por algo llamado POLL (todavía no se que es pero dura 1ms haciendo eso). Después me cambié a C (con el compilador PCWHD) y logré algo pero a muy baja velocidad. Lo que les mando es la última versión con varios archivos con los que he probado. Agradezco la ayuda que me puedan brindar!!!


----------



## Jhon5191 (May 14, 2010)

^ Creo que tu y yo tenemos un problema similar


----------



## Meta (May 14, 2010)

Dejo un enlace sobre un video llamado: 
*Entre el telégrafo y el USB: Comunicación  Serie Asíncrona*


https://msevents.microsoft.com/CUI/...lture=es-AR&EventID=1032441699&CountryCode=AR

Saludo.


----------



## Moyano Jonathan (May 15, 2010)

Yo meta no veo el video...en una de esas has puesto mal el video por que no aparece ningun video...solamente el anuncio de que se va a hacer....


----------



## Meta (May 15, 2010)

Hola Moyano:

Tardé en descargarlo ya que había quehacer mil cosas antes de bajarlo. Por lo que veo el vídeo, parece que este usuario se fijó ennosotros, jajaja, sobre todo en ti. A mi lo del puerto serie y a ti sobre USB con el sensor de temperatura y visual studio .net VB .net.

Dime tu gmail y te lo paso, dura 1:12 h. son 18 MB.

Saludo.


----------



## elmor8 (May 15, 2010)

Por si a alguien le interesa Todavía no he logrado que el PIC muestree a la frecuencia que quiero y mande los datos por USB.... 

Por si a alguien le interesa encontré esto buscando en internet:

http://www.hobbypic.com/

Todavía no he probado nada de eso, pero voy a tratar de hacerlo pronto y les aviso...


----------



## alex8845 (May 15, 2010)

Me dejas asombrado me puedes recomendar donde puedo encontrar un tutorial del programa visualbasic para electronicos muchas gracias.


----------



## Meta (May 15, 2010)

Visual basic cpara electrónicos.

http://www.abcdatos.com/tutoriales/tutorial/v12.html

Saludos.


----------



## cheli (May 15, 2010)

Me mandaron a diseñar con micro generalmente el 16f87x un protectico, un monitor de 8 maquinas de soldar 

Led verde: todas encendias
Led amarillo: Maquina parada
Led rojo: todas paradas

Diagrama de flujo y lenguaje ensamblador asm. ayundenme por favor aunque sea con el diagrama de flujo.


----------



## elmor8 (May 15, 2010)

Define "Monitor"... ¿¿Es simplemente que verifique cuando se prenden y cuando se apagan??
Eso no tiene mucho que ver con "Control de dispositivos a través del módulo USB del PIC18F2550" no? Pero bueno, cada loco con su tema...

-Haz que le llegue tensión a 8 pines del pic (a través de relés u optoacopladores) cuando cada máquina esté encendida.
-Constantemente cuenta cuantos pines están en 1, si da 0 la cuenta prendes el led rojo, si da 8 prendes el led verde.
-La lectura de los 8 pines compleméntala y mándala directamente a los Led's amarillos.


----------



## COSMICO (May 15, 2010)

yo tambien quiero ver el video..META
Me paso lo mismo que al maigo moyano..


----------



## kuropatula (May 16, 2010)

Hola Ralf y Fryck, como estan! Muchas gracias por todo lo que postearon, lo voy a probar todo ahora!
Saludos y muchas gracias!


----------



## Meta (May 16, 2010)

COSMICO dijo:


> yo tambien quiero ver el video..META
> Me paso lo mismo que al maigo moyano..



ME pasas el e-mail o se lo pide a Moyano, ya se lo pasé. Usted decide. EL e-mail por privado, please.


----------



## FRYCK (May 17, 2010)

hola  meta  me  le apunto  lo podías  mandar a  mi correo también si no es mucha molestia  es que se escucha interesante  gracias


----------



## Moyano Jonathan (May 18, 2010)

La verdad está muy bueno el video muy explicativo ..ahora habla mucho sobre RS232...USB lo toca bastante por arriba pero igual muy bueno.
Yo también lo tengo cargado el video el que quiere me contacta por MP y le mando el mail


----------



## Meta (May 18, 2010)

Hello.

Ese hombre del vídeo me ha ayudado mucho en su día con el puerto serie, lo que no tiene idea de microcontroladores en el 2008. Ahora parece que se enganchó al tema.

Sólo falta que la gente siga más con estos temas del USB 2.0, el futuro 3.0 y el má futuro el y posible sustituto del USB 3.0 que no recuerdo su nombre ahora (cre que era algo de light keep y a 10GB frente al 4.8GB del USB 3.0).

Goodbye


----------



## jinirubio (May 20, 2010)

hola
he visto el foro y me parece que hay gente con muchos conocimentos y realmente buenos en el tema.
necesito desarrollar un programa en vb que me lea un dato de unos sensores via usb con el pic 18f4550, con cada sensor reproducir un sonido especifico mientras este accionado.
agradesco de antemano la ayuda que me pudan brindar.


----------



## Moyano Jonathan (May 20, 2010)

Disculpá que sea tan brusco pero por favor lee todo el hilo antes de comentar...está absolutamente todo lo que necesitas.
Un saludo !


----------



## Meta (May 20, 2010)

Hasta puedes bajar la tercera entrega v0.3 del estupendo manual que se actualiza con el tiempo.

PD: _Por cierto, ya está el Visual Studio Express 2010 en español, para los que le interesa. Es fácil pasar los proyectos del 2008 al 2010 con intentar abrirlo con el 2010 y funciona a las mil maravilla, eso es lo bueno que le veo de entrada. _


----------



## FRYCK (May 21, 2010)

hola   a todos   e estado  trabajando   la  comunicación USB con  el visual C++  pero siempre  con  la  MFC "Microsoft Foundation Class"   hace  una  semana lo  trate  de  crear como  aplicación de Windows  y no  e  podido  por  ningún  medio   alguien  a  logrado  utilizar estas  librerías   y .dll en  otro   entorno fuera de MFC 
saludos


----------



## thenot (May 22, 2010)

Hola amigo Moyano..
tenia unas consulta, o mas bien una duda, en otro post del foro usted puso un ejemplo de Usb HID con VB.net 2008 y ahora lo estoy probando y no me funciona para nada =( tengo los mismo Vendor ID y Product ID y no se que puede ser que tenga malo..
tengo un programa en Visual basic 6 (el ke entrega el microcode studio) y me funciona perfectamente, pero quiero cambiarme a vb.net y probando el codigo que posteas no me funciona.. coloque la dll en system32 como dice el .rar y nap.. no se me ocurre que pueda ser.. 

Este es el tema en donde obtuve el proyecto.

Saludos!!

---edit o agregado---

quizas ese ejemplo no es para el hid que genera Microcode Studio para PicBasic pro??


------Edit2-------------

Bueno, gracias 
ya lo solucione, encontré otro ejemplo en la web y mezcle el tuyo con ese e hice uno jajajajjajajajaj
pero al fin ya me resulto!! (me habría demorado menos, si es que me hubiese dado cuenta que nunca cambiaba el color, de algo que quería ver  pero dado a ello aprendí varias cosas jajajajjaja)
Saludos!!
PD: adjunto código pic(PicBasic Pro), proyecto vb.net + simulación proteus, el proyecto es simple, es de prueba, ve si se a conectado el usb y comprueba el estado de un pulsador en rb4 (uso bootloader de microchip )


----------



## Jhon5191 (May 22, 2010)

Hola a todos, soy yo de nuevo.

Bueno, luego de haber leido este hilo y de mucha lectura al respecto voy a comenzar mi projecto, ya tengo una idea clara de que es lo que necesito, pero para poder probarlo necesito una aplicación en el pc para poder probar y obtener resultados concretos, pero tengo un problema, ya que no he logrado incluir la libreria mpusbapi.dll o la easyHID.dll a un proyecto en visual basic 6.0.  A decir verdad no tengo ni idea de como utilizar estas librerias en este programa, y me intriga mucho el pensar como puedo hacer los drivers que necesita mi dispositivo para ser instalado, con mi propia firma virtual.  

Les agradeceria que me explicaran y de antemano muchas gracias.  La proxima semana si no hay inconvenientes, postearé resultados =)


----------



## noriad (May 24, 2010)

Jhon me he leido el forum  desde el inicio hasta el final y soy parte de el hace ya  mas de un ano aunque no escribo casi  y tu  proyecto  es el  que me ha resultado mas interesante. si me permites te puedo ayudar en lo que pueda pues tengo una concepcion del USB un poco diferente a la que se maneja en este hilo. de hecho yo no programo el USB en C sino que lo hago en ensamblador  y resulta muy interesante aunque mas complejo. la transmision de voz por el USB  ya la he  implementado. quisiera  que compartieras  tus  ideas de como hacerlo para decirte de antemano si es funcional o no y que no pierdas tu tiempo.

saludos  nauj noriad


----------



## ontty (May 24, 2010)

ola amigoss excelente en vdd... bueno tengo un problema espero y m lo puedan solucionar... cabe aclarar que estoy realizando mis pininos en usb... al leer el este excelente proyecto n el foro me di a la tarea de realizar mi proyecto usb realice un programa sencillo para checar la comunicacion con un PIC18F4455 lo estoy simulando en proteus y m sale la leyenda de instalar el driver  "CCS RS232", la pregunta es estoy haciendo algo mal en la programacion, por que segun yo en ese paso debo instalar la libreria de microchip mchpusb.dll...les agradeceria mucho su ayuda...GRACIAS y felicidades a todos los que han realizado todo este gran trabajo y de tantisisima utilidad

aaa m falto decir que ubico el instalador en la carpeta donde tengo la libreria i nada no lo instala... mi sistema operativo es win vista...espero i m puedan ayudar gracias

jajaja no s dll es .inf


----------



## Jhon5191 (May 25, 2010)

Gracias por tu oferta noriad  la verdad se nos pidíó hacerlo en lenguaje C asi que no podemos migrar al lenguaje ensamblador.  Sin embargo, si es posible que te esté molestando de vez en cuando acerca del tema hehe.

Mientras tanto, he estado encargado de otros mini proyectos pero he tenido problemas con ellos.  Tomé como base el programa en visual basic del ejemplo 1 de moyano, pero no comprendo porqué mi programa no funciona, he aqui el codigo:


```
#include <18F2550.h>


#device adc=10
#fuses HSPLL,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN,NOWDT,NOMCLR
#use delay(clock=48000000)

int16 dato1;

#include "usb_cdc.h"    //Descriptores USB
#include "usb_desc_cdc.h"
void Settings (void){
   setup_adc_ports(AN0|VSS_VDD);    //Configuraciones generales
   setup_adc(ADC_CLOCK_DIV_2);
   set_tris_c(0x00);
   output_low(PIN_C1);
   usb_cdc_init();
   usb_init();
      
}

void get_dato (void){
    dato1 = read_adc(); //Leemos el adc y guardamos el dato en la variable dato1
    dato1 /= 1023;      //que luego es escalizada de 0 a 5000
    dato1 *= 5000;
    }

void main(){
   Settings();    //llamammos settings
   while(!usb_cdc_connected()){}
   
   for(; ;){
      usb_task();
      if(usb_enumerated()){
         if(usb_cdc_getc()=='i'){   //llegó el caracter i?
         output_high(PIN_C1);       //if so, encender el led c1
         printf(usb_cdc_putc,"Temp = %4.3w.\n\r",dato1); //enviar dato
         }
         
         if(usb_cdc_getc()=='o'){   //llegó el caracter a?
         output_low(PIN_C1);        //if so, apagar el led c1
         printf(usb_cdc_putc,"Esperando ordenes.\n\r");  //enviar caracteres
         }
      }
      get_dato();    // Llamamos settings
   } //bucle
}
```

El programa lee el adc y envia el dato hacia el pc donde el valor se lee en un cuadro de texto en una aplicación de visual basic, cuando se le indica al recibir un caracter proveniente del pc

Cuando lo conecto, el pic es reconocido como puerto virtual, pero al parecer, no me recibe ni envia los datos.  Es posible que esto se deba al compilador que uso? (PCH Compiler V4.104 (CCS))? ya que no puedo recibir ni enviar datos desde la aplicación en visual basic


----------



## jesolar (May 26, 2010)

Hola Moyano en que pagina se encuentra el ejemplo de Hid y vb.net? gracias.


----------



## elmor8 (May 26, 2010)

Una pregunta Jhon5191: Al leer el valor del ADC no sería mejor almacenar la cuenta que sacas en un float y después asignarlo a una tipo int16??
Porque si por ejemplo el resultado de la conversión es 500 y lo divides entre 1023 te da 0,488 pero al asignarlo a un int16 te quedarías con 0 en la variable... Luego estarías multiplicando 0 x 5000 y obtendrías siempre 0!!!!

De la comunicación USB no tengo mucho que decir porque lo que he hecho no "Furula"!!! Me pasa lo mismo que a ti, la compu lo reconoce pero el PIC no manda nada, o la compu es la que no recibe, no se....


----------



## noriad (May 26, 2010)

Jhon claro  no quise decirte que migraras a ensamblador , ya que no es tarea facil.
pero quiero que tengas claro que ni con cdc ni hid   a mandar audio por la PC con buena calidad. te va   a ser falta mas que eso . Para mandar audio   necesitas saber de la clase audio paraque la maquina  te lo reconozca como tal . ademas las clases HID y CDC no poseen soporte para procesamiento de audio.


----------



## Jhon5191 (May 26, 2010)

@elmor8:  Mmm tienes razon, creo que es mejor usar un tipo float primero  muchas gracias por tu sugerencia.

@noriad:  Oh entiendo, amigo, y de hecho estaba pensado lo mismo hace unos dias, creo que para ello seria necesario el método bulk transfer (?) o me equivoco?; lo que implica el uso de la libreria mpusbapi.dll, que ya he conseguido.  El unico problema es que no se como usar sus funciones en X programa, llamese visual basic, labview o matlab.  Tambien estoy desorientado en la creación de los drivers necesarios para que el dispositivo funcione.  Te agradeceria muchisimo si pudieras orientarme en este sentido


----------



## ElGiganteDeYeso (May 29, 2010)

Jhon5191 dijo:


> @elmor8:  Mmm tienes razon, creo que es mejor usar un tipo float primero  muchas gracias por tu sugerencia.


No hace falta usar un float, con tan solo cambiar el orden en que realizas las operaciones sobraria:


```
dato = read_adc();
dato *= 5000;
dato /= 1023;
// o alternativamente
// dato >>= 10;
```


----------



## eramos (May 29, 2010)

Hola Jonathan y a todos desde Mexico, entre a ver esta iformacion, y ya ytengo armado el circuito del pic18F2550, usando un programador JDM por puerto serie pude cargarle un firmware que encontre en una pagina pero al conectarlo con un circuito usb este no es reconocido y no deja cargarle ningun driver,
Intente descargando tu programa en VB y ahora cargue el archivo PIC18F2550_CDC_USB.hex, pero al correr tu programa en VB6 no hace nada, soy nuevo en esto,
me supongo que las librerias usb_cdc.h y usb_desc_cdc.h tambien deben cargarse,

tendras un archivo hexadecimal que ya las traiga? para cargarle ese hexadecimal al PIC ?

saludos


----------



## Jhon5191 (May 30, 2010)

^ HOla eramos, en primer lugar, si es necesario cargar las librerias usb_cdc.h y usb_desc_cdc.h, ya que estas son las que haran que tu pic sea reconocido y usado como un dispositivo USB, para ello debes incluirlas en tu codigo y luego compilarlo.  Sin embargo, y ya que yo tuve muchos problemas con eso, te recomiendo que uses la version V4.065 o posterior, ya que yo usaba la V4.104 y no me compilaba correctamente   saludos.

@ElGiganteDeYeso:  Muchas gracias por el concejo amigo, la verdad no se me habia ocurrido, pero tiene mucho sentido


----------



## jesolar (May 31, 2010)

Bueno hola a todos, he estado un tiempo trabajando con el pic 18f2550, estoy realizando mi proyecto de titulo y la verdad me ha costado bastante, estoy ocupando el protocolo CDC en el pic, y como interfaz para el Pc ocupo Vb2008, el codigo en el pic funciona, y el codigo de la interfaz tambien, pero tengo un problema, tengo un texbox en la interfaz que recibe un string que yo le mando desde el pic, mi problema es que solo me recibe el primer dato que le mando desde el pic, luego el texbox no se me actualiza cuando lo mando otro dato, estoy simulando el pic con el proteus y es un teclado de o letras, entonces cuando le mando una letra me la recibe la interfaz, pero cuando le mando otra no me la recibe y el texbox se queda con lo primero que le mande, he mirado el buffer de salida del pic y se va llenando con las teclas que pulso, tambien he visto paso a paso en la interfaz y lo unico que puedo ver es que el evento de Datareceiver, no se dispara cuando desde el pic le mando la segunda tecla o que es lo mismo mi string. Agradeceria mucho su ayuda he buscado y buscado espero recibir ayuda, desde ya gracias.


----------



## alexhumbertoa (May 31, 2010)

Hola Moyano, quiero saber donde puedo descargar este poderoso manual que has construido, he intentado con los links de mediafire que haz puesto pero no me funcionan, también quiero preguntarte si ya te metiste con el tema del HID para controlar el mouse?, porque quiero hacer un proyecto donde se requiere el control del puntero en el pc y lo ideal es poder hacerlo con el pic18f2550. gracias!.


----------



## elmor8 (May 31, 2010)

@ElGiganteDeYeso: Insisto con el float... Con int16 se puede almacenar datos mayores a 65535?? Si lo pones así la variable se va a desbordar apenas el adc llegue a 13!!! Otra solución, creo, sería declararla más grande...

@jesolar: Puedes publicar tu código? Tanto del pic como del PC!!! Así es más fácil para que alguien te ayude y yo poder aprender más Jeje...


----------



## Moyano Jonathan (May 31, 2010)

*alexhumbertoa* : No he tenido tiempo para eso ...pero mi manual lo podés descargar de los link de mediafire. Ahora si no se puede después los subo de vuelta.


----------



## Jhon5191 (May 31, 2010)

HOla a todos, los molesto un momento

alguien sabe como recibir una cadena de caracteres proveniente del pc y visualizarla en un lcd conectado al pic. Por comunicación CDC??


----------



## ChoN (Jun 2, 2010)

Hola a todos, hace siglos que no posteo nada en este hilo, pero ahora me surgió un proyecto nuevo, para el que considero más adecuado usar modo HID.
Aun no me he puesto, pero recuerdo de la última vez, que no hubo forma de lograr enlazar el micro en modo HID con VisualC#. Esto lo hice anteriormente pero en modo BULK, y así y todo no pude hacerlo trabajar por interrupción.
Si alguno lo logró, o sabe cómo, se agradece desde ya.
Saludos.


----------



## eramos (Jun 2, 2010)

Hola a todos, descargue los archivos del proyecto en VB de Jonathan Moyano y adentro viene una carpeta FIRMWARE_PIC18F2550 esta trae un archivo hexadecimal PIC18F2550_CDC_USB,

preguntas

1.- Este archivo es todo lo que necesito grabar en el PIC18F2550 para que este pueda comunicarse por USB con la PC?

2. Cargue este archivo al PIC18F2550 usando un programador JDM, pero al conectarlo usando el circuito USB este no es reconocido, se supone que aqui me deberia de pedir el driver que viene en la carpeta DRIVER_WINXP no ?

saludos


----------



## elmor8 (Jun 2, 2010)

@ChoN: Qué es exactamente lo que quieres hacer? Tengo curiosidad... Para comunicarme con el PIC por HID yo uso una librería que me facilitó un prof en la Universidad. Yo la utilizo con VisualStudio, programando en C#. Aquí te la dejo. Espero te sirva...


----------



## Meta (Jun 2, 2010)

Gracias por la librería. 

En estos momentos estoy haciendo un buen manual sobre el puerto paralelo y revisión del serie, la verdad tarda muchísimo. Me imagino el del USB.

Ánimo moyano y gracias a tod@s por colaborar.


----------



## slash9010 (Jun 2, 2010)

ola moyano animo porfa todos confiamos en q ese manual este terminado pronto o porlomenos que lo avances un poco en cuanto a cdc o hid


----------



## Meta (Jun 2, 2010)

slash9010 dijo:


> ola moyano animo porfa todos confiamos en q ese manual este terminado pronto o porlomenos que lo avances un poco en cuanto a cdc o hid




Hola:

El manual requiere mucho tiempo y paciencia. Ya está el v0.3 que se ha de agradecer.

Me interesa aprender lo de activar y desactivar entradas y salidas digitales o analogicas por USB 2.0. Dice Moyano que es muy fácil, eso tengo que verlo ya que no me he metido por ahora el USB hasta que haga el manual.

Si tienes conocimientos de algo, puedes hacer manual y entenderás muchas cosas, de paso, comportate como te gusta leer un buen manual, así podrás entender lo que quieren los demás sobre tu manual. Trátalos como te gustaría que te tratasen.

Saludo.

PD: _Con lo que estoy tardando hacer el manual del puerto paralelo en estos momentos con los tres lenguejes, me imagino lo que se tardará el USB._


----------



## slash9010 (Jun 2, 2010)

ok perdon solo keria agradecerles ps se q han gastado mucho timepo desde hace casi dos anios y ps he leido todo el foro y para aportar primero tengo leerme e implementar todo esto ya que hasta ahora termino semestre y kiero alicar todo lo que he reunido y apenas tenga algo bien concreto de mi autoria lo voy a postear muy explicito para aportar al tema 

pd no se si lo dije mal pero era solo para alentar a moyano a q termine el manual por cierto gracias meta me sirvio mucho tu manual de rs232 con pic16f84a y c++ lo use para mi proyecto final de microcontroladores I ahora kieron entrar al otro curso sabiendo como manejar la usb del pic18 saludos


----------



## Meta (Jun 2, 2010)

Buenas:

Me da la sensación que a veces no está motivado tenga o no tiempo, me ha pasado lo mismo, pero poco a poco se logra el objetivo.

Ánimo Moyano, hay mucho interés por tus obras. ¿Cuánto crees que te falta por completar el manual?

Me refiero la cantidad de temas, cosas así.

Un saludazo.

PD: _Me alegro de que te haya servido el manual del RS232 C++, cada vez me piden el puerto paralelo por e-mail, que impaciencia hay, jajajaj._


----------



## Moyano Jonathan (Jun 4, 2010)

Bueno chicos....me ha atrapado un poco desganado y también desmotivado...lo que pasa es que tengo muchos proyectos...y revisar cada uno de ellos para que no tenga errores en todo un desafio...ademas de que estoy sin internet para poder postear....sin compu propia por que se quemo el micro (estoy casi todo el dia trabajando )......y mis asuntos personales no he tenido ni muchas ganas ni tiempo...pero yo *prometo para cumplir* asi que no se hagan problema por que el manual va a ser terminado pronto ...tengan paciencia por favor.


----------



## Meta (Jun 4, 2010)

Buenas Moyano:

Me ha pasado algo similar, tengo unos cuantos manuales que hacer y cada uno lo he dejado a medias. Hay una cosa que decidí, centrarme en una única cosa. Si me centro en varias acabo las cosas tardes y con dolores de cabeza. Ahora estoy centrado en el manual del puerto paralelo, más tarde haré el proyecto del puerto serie por internet cuando tenga dinero, etc. Si no, tardaré una eternidad en acabar algo.

Céntrate en hacer el manual o lo que desees, aunque hay épocas que tengas ganas de hacer otro proyecto, no abandones. Es duro pero no imposible.

Ánimos de nuevo, quiero aprender a controlar entradas y salidas desde el USB algún día. jeje.

Hasta otra.


----------



## COSMICO (Jun 4, 2010)

No te preocupes amigo moyano
Tomate tu tiempo, es algo voluntario no obligatorio
ya nos das mucho de tu parte..
Seguire esperando pacientemente..


----------



## FRYCK (Jun 4, 2010)

agradecemos  tu esfuerzo  sigue  adelante  *moyano*


----------



## carlos20_19888 (Jun 4, 2010)

holas he seguido todo el hilo agradecimientos a moyano por todo  quisiera saber
 si tienen un ejemplo de bulk con labview o en todo caso la comunicaicon bulk con visual basic 
 cual es la dll que solo se usa en net y no en visual


----------



## Moyano Jonathan (Jun 5, 2010)

*carlos20_19888* si buscás bien en este hilo vas a encontrar lo que buscas. Otra cosa la dll de HID...precisamente la mcHID.dll la podés llamar desde cualquier plataforma que soporte llamadas de funciones a librerías .dll para HID con esa librería que te mostré existen programas hechos en VB 6.0 Labview VB.net VC#2008....asi que tenés para desarrollar lo que si lo vas a tener que buscar en el hilo, además te conviene asi cualquier duda que tengas la comentas bien fundamentada luego por acá.


----------



## pkdos (Jun 6, 2010)

Hola a todos.
He realizado una pequeña aplicación de una conversión con representación Grafica del resultado.  Como si fuera labview utilizando la librería de NTGraph. Se puede utilizar en Visual Studio 2010 y Visual Basic …
Yo lo he probado en visual basic pues todavía no he logrado con Visual Studio 2010 comunicarme con USB con el pic.
Esta aplicación está basada en la conversión HID del MAESTRO MOYAPIC del cual sirve el Firware del Pic 18f2550 del ejercicio_n5_172.rar (se encuentra en este foro pagina 12) con los archivos que a continuación se adjuntan. Por favor antes de ejecutar la aplicación Lean el archivo Leame.txt para instalar la librería NTGraph. 
Hoy estoy probando realizarla con 10 bits, pero tengo unos problemas a la hora de concatenar los 2 bytes en VB. 

Y a acontinuación sería simular dos conversiones de 10 bits en un mismo grafico para mi proyecto.


----------



## Alber Moremont (Jun 6, 2010)

Hola a todos, hace un ratilloque no escribia en este foro y me sorprende como ha crecido, hace algunas paginas atras yo dije que iba a hacer un peueño tutorial de USB con C18, pero de vardad he estado terriblemente ocupad y no he podido, pero lo voy a mostrar para que tengamos una herramieonta mas de apoyo para este tan interesante tema. Felicidades MOYANO JONATHAN.


Por ahora espero me puedan ayudar, tengo que medir el voltaje de la linea de AC,  que aqui en México es de aproximadamente 120 volts a 60 Hz, y meterlo a  unos comparadores para activaro desactivar alguna craga según si el  voltaje este mas alto o mas bajo de la referencia. 

El detalle es que no debo de utilizar un transformador para bajar el  voltaje porque voy a tener lecturas erroneas, por lo tanto, tengo que  recificar directamente de la linea y filtrar para que me de un valor de  DC, esto es sencillo, lo que no se es como puedo bajar este voltaje "tan  alto" (de aproximadamente 150V)y meterlo a los comparadores o a un  amplificador operacional  o incluso a un PIC y transmitirlo por USB y poder controlarlo desde la PC.

Segun yo habia visto que alguien del foro habia graficado la señal  directamente de la linea de AC, por eso pregunto.


----------



## Meta (Jun 6, 2010)

No tienes tiempo par dar información pero si para pedirla, curiosa contradicción indirecta.

Puedes empezar buscando en google por aquí.

Saludo.


----------



## pkdos (Jun 7, 2010)

Hola de nuevo, tengo por fin una aplicacion en VB6 utilizando la libreria NTGraph que realiza la conversión de 10 bits. Os la adjunto aquí. 

Pero tengo complicaciones al representar dos conversiones, no se si es error por hadware o por el software. El caso es que unicamente me representa 2 bytes una conversión. También os lo adjunto, con el nombre:
Ejercicio CAD 2 10bits.

Un saludo a todos


----------



## Jhon5191 (Jun 7, 2010)

Hola pkdos, muy interesantes tus proyectos debo decir, y a decir verdad me llamó mucho la atención ya que encuentro muy util la herramienta NTgraph ya que no poseo labview y VB es un entorno mas familiar para mi.

Gran aporte.


----------



## kuropatula (Jun 13, 2010)

Hola a todos, les comento mi problema. Estoy usando el PIC18F14K50, probe con la libreria de Michochip y me funciono bien,pero en CCS no me anda, solo recibe datos pero no identifica cual, recibe siempre un 0. Para transmitir no hay problema, lo hace bien.
Ya habia posteado la misma duda pero ahora lo que hice es hacerlo funcionar con MPLAB (funciona pero prefiero CCS). La version de CCS es 4.104.
Alguien sabe que puedo cambiar para que funcione bien la recepcion de datos? Estoy usando los ejemplos de la pagina 1.

Gracias y saludos

Daniel


----------



## Meta (Jun 13, 2010)

Prueba con el C18. Siempre tienen que estar con el CCS y nadie paga por él.


----------



## kuropatula (Jun 13, 2010)

Hola Meta, es el que estoy usando ahora, pero prefiero el CCS


----------



## KR20 (Jun 14, 2010)

Q onda chavos, he logrado hacer la comunicacion USB en modo BULK con un xtal de 20 Mhz y 24Mhz pro tengo problemas para usar los cristales de 40Mhz y 48Mhz, alguien me podria ayudar a configurar los #Fuses.


----------



## Jhon5191 (Jun 14, 2010)

kuropatula dijo:


> Hola a todos, les comento mi problema. Estoy usando el PIC18F14K50, probe con la libreria de Michochip y me funciono bien,pero en CCS no me anda, solo recibe datos pero no identifica cual, recibe siempre un 0. Para transmitir no hay problema, lo hace bien.
> Ya habia posteado la misma duda pero ahora lo que hice es hacerlo funcionar con MPLAB (funciona pero prefiero CCS). La version de CCS es 4.104.
> Alguien sabe que puedo cambiar para que funcione bien la recepcion de datos? Estoy usando los ejemplos de la pagina 1.
> 
> ...



Usa la versión 4.065 y nos dices que sucedió


----------



## Moyano Jonathan (Jun 14, 2010)

yo tengo la versión 4.023 y nunca me dio dramas...


----------



## KR20 (Jun 14, 2010)

Que onda, ya he logrado hacr la comunicación USB, con un xtal de 4Mhz consigo 150 muestras en 1 segundo, con un xtal de 20Mhz consigo 280 en promedio y con un xtal de 24Mhz consigo 305 muestras por segundo en promedio, he intentado utilizar el xtal de 40Mhz y el de 48Mhz pro no he conseguido configurar bien #fuses,.
Alguien sabe de que forma lo tengo que hacer? , necesito alcanzar una mallor velocidad de muestreo.

Gracias y saludos


----------



## jaja (Jun 14, 2010)

Saludos headhead, la página que recomiendas ya esta caducada www.colpic.co.cc , porfavor, podrías poner la nueva pág donde tienes colgada la aplicacion que comunica el PC con un PIC mediante el puerto USB usando una aplicacion en C#.

Muchas gracias


----------



## elmor8 (Jun 14, 2010)

@KR20: Hey!!! Que tipo de comunicación estás implementando? Según lo que yo sé el cristal no va a hacer que varíe la frecuencia interna a la que trabaja el pic, si se configuran bien los fuses... (Que alguien me corrija si estoy equivocado x favor!!!!)

Para 48MHz la configuración debería ser algo así: ECPLL, PLL12, CPUDIV1 y el resto igual que los demás cristales.

Para 40MHz: ECPLL, PLL10, CPUDIV1, ...

Insisto: SI ME EQUIVOCO CORRÍJANME!!!


----------



## Moyano Jonathan (Jun 15, 2010)

El temas de los cristales está explicado a partir de la primera página por favor lean desde el principio 
saludos !


----------



## Adler (Jun 15, 2010)

Hola a todos, tengo un problema con enviar mas de 2 datos desde el PIC al PC, resulta que (Imagen 1) a pesar de en el PIC enviar 5 datos diferentes hacia el PC usando usb_put_packet (tengo el mismo problema si uso usb_puts) unicamente me envia 2 datos por el buffer 1 y 2 nada mas, ahunque lo configure con mas bytes en el array, no hay caso e probado mil formas y no logro apuntar a la razon, la parte de visual basic se que esta bien, incluso use otro exe que saque de otra pagina que servia para testear los datos en los diferentes buffers, pasa lo mismo, por eso dedusco que el problema esta en el micro controlador, aca esta el C del micro
	
	



```
#include <18F2550.h> // Definición de registros internos del PIC18F2550.
#fuses NOMCLR,XTPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL1,CPUDIV1,VREGEN,NOPBADEN

#use delay(clock=48000000)


#DEFINE USB_HID_DEVICE TRUE // Vamos a utilizar el protocolo HID.

#define USB_EP1_TX_ENABLE USB_ENABLE_INTERRUPT 
#define USB_EP1_TX_SIZE 5 // Definición del tamaño del buffer de salida.

#define USB_EP1_RX_ENABLE USB_ENABLE_INTERRUPT 
#define USB_EP1_RX_SIZE 5 // Definición del tamaño del buffer de entrada.

/*********************************************************************************************************/

// Definición de las librerías utilizadas.
#include <pic18_usb.h>    // Drivers's USB del PIC18F2550.
#include <USB_easyHID_descriptores.h> // Descriptores USB para la placa MoyaPIC_USB28 y easyHID.
#include <usb.c> // Funciones del USB.

/*********************************************************************************************************/

// Variables globales.
int8 data[5];

void main()
{
	data[0] = 1;
	data[1] = 2;
	data[2] = 3;
	data[3] = 4;
	data[4] = 5;
	
   usb_init_cs();    // Iniciamos el puerto USB y salimos.
   while(1)
   {
		usb_task();
		usb_put_packet(1,data,5,USB_DTS_TOGGLE);
   }

}
```

la parte de lectura HID del VB 
	
	



```
Public Sub OnRead(ByVal pHandle As Integer)

        ' read the data (don't forget, pass the whole array)...
        If hidRead(pHandle, BufferIn(0)) Then

        End If

        dat1 = BufferIn(1)
        dat2 = BufferIn(2)
        dat3 = BufferIn(3)
        dat4 = BufferIn(4)
        TextBox1.Text = dat1
        TextBox2.Text = dat2
        TextBox3.Text = dat3
        TextBox4.Text = dat4

    End Sub
```
ahi esta, no hay caso para enviar mas datos a la vez, lo necesito para poder terminar un proyecto  es lo unico que me falta, ojalaa alguien que sepa la respuesta me pueda ayudar, de antemano Gracias.

Ahi subi el VB porsiacaso, ahunque dudo que sea eso, estoy convencido de que hay algo en el micro.


----------



## mandeb48 (Jun 16, 2010)

Hola:
Tengo realicé un circuito impreso que utilizando el 18f2550 se comunica por usb, el problema es que tengo por toda la plaqueta un ruido o señal senoidal indeseable de 48MHz(que casualidad no?), para tener una idea de la magnitud de esta señal es de cerca de 20 mV que se realimenta a las entradas analógicas ¿Alguien a sufrido o solucionado esto?. Aclaro que he utilizado capacitores de desacople de: cerámica, cerámica multicapas,  de tantalio, etc. de diversos valores y no ha sido solución.


----------



## COSMICO (Jun 16, 2010)

Desacopla la fuente con un filtro pasivo pasabajos...


----------



## ChoN (Jun 17, 2010)

elmor8 dijo:


> @ChoN: Qué es exactamente lo que quieres hacer? Tengo curiosidad... Para comunicarme con el PIC por HID yo uso una librería que me facilitó un prof en la Universidad. Yo la utilizo con VisualStudio, programando en C#. Aquí te la dejo. Espero te sirva...


 
El archivo contiene un dll y otro archivo .pdb, con que usas esta librería? No se abre con visual.
Saludos.


----------



## elmor8 (Jun 17, 2010)

Ahí dije: Con VisualStudio 2008 o 2005... En realidad lo que uso es el archivo usbLibrary.dll
Le das click cn el botón derecho del mouse sobre la barra de los componentes y le das a algo que dice Agregar componente o algo así, ahí busca el dll y listo!!!

Eso me crea un componente (como un Botón o cualquier otro perolito de esos) y tiene eventos de Dispositivo conectado, Desconectado, Datos Recibidos, entre otros...

Pero sólo lo he usado con VisualStudio programando en C#


----------



## pkdos (Jun 18, 2010)

Hola Adler. 

¿Modificastes el descriptor del usb, para que el PC sepa que se le envia?. La parte que menciono es:
const char USB_CLASS_SPECIFIC_DESC[] = {...}

Mirando los aportes que dio el compañero "nonames" en este mismo foro página 44 pone unos enlaces, en los que describe a los descriptores HID:
http://www.keil.com/forum/docs/thread15398.asp
http://www.usbmadesimple.co.uk/ums_ms_desc_conf.htm

Y el que estoy utilizando yo: 
www.usb.org/developers/devclass_doc/HID1_11.pdf

Te comento que a mi me pasa eso, lo que estoy haciendo es dos conversiones de 10 bits, he probado modificar el descriptor, para que se envie 4 bytes. Ojo no me va, y no se porque:


```

```
const char USB_CLASS_SPECIFIC_DESC[] = {
      6, 0, 255,       // Usage Page = Vendor Defined
      9, 1,            // Usage = IO device
      0xa1, 1,         // Collection = Application
      0x19, 1,         // Usage minimum
      0x29, 8,         // Usage maximum

      0x15, 0x00,         // Logical minimum (-128)   0x15, 0x00,            0x80, 
      0x26, 0xFF, 0x00    // Logical maximum (127)    0x26, 0xFF, 0x03,          0x25, 0x7F, 

      0x75, 8,        // Report size = 8 (bits)
      0x95, 4,        // Report count = 16 bits (2 bytes) ///2
      0x81, 4,        // Input (Data, Var, Abs)
      0x19, 1,        // Usage minimum
      0x29, 8,        // Usage maximum
      0x75, 8,        // Report size = 8 (bits)
      0x95, 4,        // Report count = 16 bits (2 bytes) 2 /// 4
      0x91, 4,        // Output (Data, Var, Abs) 2  /// 4
      0xc0            // End Collection
   };

Saludos a todos.


----------



## Adler (Jun 18, 2010)

pkdos: pude lograr enviar 3 datos de conversores analogos por USB sin problema, te debe haber faltado el tiempo de espera de 20us para que el conversor pueda hacer su pega, bueno ahi te adjunto el C el vb y el descriptor que uso, ojalaa te sirva, saludos!


----------



## Meta (Jun 18, 2010)

Adler dijo:


> pkdos: pude lograr enviar 3 datos de conversores analogos por USB sin problema, te debe haber faltado el tiempo de espera de 20us para que el conversor pueda hacer su pega, bueno ahi te adjunto el C el vb y el descriptor que uso, ojalaa te sirva, saludos!



Hola:

Como tengo ganas de hacer eso. ejjeje. En asm es complicado.

Saludo.


----------



## ChoN (Jun 18, 2010)

elmor8 dijo:


> Ahí dije: Con VisualStudio 2008 o 2005... En realidad lo que uso es el archivo usbLibrary.dll
> Le das click cn el botón derecho del mouse sobre la barra de los componentes y le das a algo que dice Agregar componente o algo así, ahí busca el dll y listo!!!
> 
> Eso me crea un componente (como un Botón o cualquier otro perolito de esos) y tiene eventos de Dispositivo conectado, Desconectado, Datos Recibidos, entre otros...
> ...


 
Gracias! Y disculpas, no estoy a full con C# ultimamente...
Saludos.

PD: Si tenes un ejemplo en C# utilizando esta librería se agradece!!!


----------



## elmor8 (Jun 19, 2010)

Aqui dejo el ejemplo con la librería...
No lo hice yo, lo hizo el prof que me pasó la librería... Creo que una vez lo probé y me salió un error cuando trataba de enviar pero por lo menos tiene cuales son los eventos del USB y cómo manejarlos...
Espero te sirva...
P.D. Creo que el archivo solo se puede abrir con VisualStudio 2008 o posterior...


----------



## pkdos (Jun 22, 2010)

Gracias Alder, me ha servido de mucho. Voy a continuar haciendo un dattaloger con SD y USB.
Saludos y muchas gracias


----------



## tau (Jun 22, 2010)

Estoy intentando hacer una aplicación simple que reciba y envíe datos mediante HID, leí todo el thread, baje todos los ejemplos probe todas las librerías del thread y no puedo hacer que funcione en vb.net 2008 y en Windows 7 x64, si alguien tiene algún ejemplo que sepa que funcione le agradecería que lo suba, voy a ver si sigo investigando. Gracias!.


----------



## Moyano Jonathan (Jun 23, 2010)

como puse post atras todos los ejemplos son para win de 32 bits---- el funcionamiento en 64 no esta siquiera probado.


----------



## tau (Jun 25, 2010)

Lo hice funcionar con el ejemplo de http://www.lvr.com/files/generic_hid_vb_46.zip, en Windows 7 x64, el único problema que ahora tengo es que al parecer usando HID me toma algunos timers, el único que tengo libre es el TMR0, en el datasheet de microchip no dice nada acerca de que ocupe los timers voy a seguir investigando, gracias por la respuesta!.


Siguiente post ---------------------------

Lo solucione, lo que hice es poner esto en el código:

(Solo por que esta interrupción no es critica)


```
disable_interrupts(INT_TIMER1); 
usb_task(); // Configuramos el puerto USB.
    if (usb_enumerated()) // Si el puerto es enumerado y configurado por el host..
    {

    sentencias...
        
       
    }
enable_interrupts(INT_TIMER1);
```


----------



## albermillan69 (Jun 26, 2010)

He estado probando el USB CDC pero no me convense para mi proyecto! la comunicacion se cae o se cuelga casi q a cada rato (estoy usando un 18f4550) 

Alguno de ustedes sabe como usar el USB HID??

Hasta los momentos sigo confiando en el puerto serial! es demasiado estable! y no da problemas!!!


----------



## lauraCTonaC (Jun 30, 2010)

Hola, muy buenos aportes en el post, y felicidades a Moyano por su excelente trabajo!!!

Yo estoy tratando de hacer la comunicacion utilizando la mpusbapi.dll  en visual basic .net y tengo un inconveniente con las llamadas.  Pues veras, yo lo tengo funcionando con vb 6 y todo perfecto,  al intentar realizar las funciones en vb .net  tengo un inconveniente con los punteros.  

Esta es la declaracion muy parecida a como se hace en vb 6:


```
Public Declare Function MPUSBRead Lib "mpusbapi.dll" (ByVal handle As Long, ByVal pData As Long, ByVal dwLen As Long, ByRef pLength As Long, ByVal dwMilliseconds As Long) As Long

Public Declare Function MPUSBWrite Lib "mpusbapi.dll" (ByVal handle As Long, ByVal pData As Long, ByVal dwLen As Long, ByRef pLength As Long, ByVal dwMilliseconds As Long) As Long
```

Al realizar la llamada a la funcion queda de esta forma:


```
If (MPUSBWrite(myOutPipe, VarPtr(SendData(0)), SendLength, SentDataLength, SendDelay) = MPUSB_SUCCESS) Then
```

El programa no ejecuta el If, es decir no realiza la escritura en el usb.

Este dato VarPtr es utilizada en vb 6 sin problemas, para el vb.net he realizado la siguiente declaracion:


```
Public Function VarPtr(ByVal dato As Byte) As Long
        Dim GCH As GCHandle = GCHandle.Alloc(dato, GCHandleType.Pinned)
        Dim GCH2 As Integer = GCH.AddrOfPinnedObject.ToInt32
        GCH.Free()
        Return GCH2
    End Function
```

Pero aun no se si esta bien declarado.


Muchas gracias por lo que puedan aportar.


----------



## foso (Jul 2, 2010)

Hola. Una pregunta Moyano: el programa que hiciste que genera un COM virtual ( ese que está en la primer página) cuando conectas el cable USB al PC no te salta un cartel que dice que el controlador está deshabilitado y que hay que instalarlo ????, porque a mi me hace eso. Me fijo en el administrador de dispositivos y el puerto me aparece, pero con un signo de pregunta amarillo ( como que no está instalado el controlador ).
Bueno espero me den una manito con eso. Gracias.


----------



## Moyano Jonathan (Jul 2, 2010)

Bueno lo que tenés que hacer es lo siguiente...
Ir a panel de control ....sistema....administrador de dispositivos.
Ahi te va a aparecer un icono de signo de pregunta amarillo en la parte de USB....entonces le hacer doble click y pones reistalar controlador ...buscas el driver correspondiente y le das click en siguiente...entonces te va a aparecer un cartel diciendo que estos controladores no son firmados por windows entonces le das click en siguiente para proseguir.
Luego de esto te tiene que instalar los controladores correspondientes...

Un saludo y espero que lo puedas hacer funcionar.


----------



## foso (Jul 2, 2010)

Hola, gracias por contestar. Hice lo que me dijiste pero no se porque no encuentra el controlador. No se de donde sacarlo. La puse a buscar en internet y no encuenta nada.
Voy a seguir incistiendo a ver si puedo.
Saludos.


----------



## Moyano Jonathan (Jul 2, 2010)

Si trabajas con el compilador CCS y USB entonces en la carpeta DRIVER'S del compilador se encuentra el driver para emulación CDC...en caso de que estés trabajando con el stack de MICROCHIP buscalo en la carpeta driver's del Microchips Solutions....fijate que sea el más actualizado con soporte para 32 y 6 bits.


----------



## foso (Jul 2, 2010)

Bueno avance un poco mas. Encontró el driver en la carpeta Drivers de CCS pero cuando iba por la mitad de la instalación me dice que falta el archivo ccport.sys. Y no lo puedo localizar. No está ni en la carpeta de microchip ni en la de CCS. Pensé que era mas simple la cuestión. Igual gracias. 
Saludos


----------



## Moyano Jonathan (Jul 2, 2010)

che que raro eso que me marcas ..la verdad nunca me marco ese error


----------



## benelviajero (Jul 3, 2010)

jonathan podrías pasarme un programita que sea un bullk   para chechar  mi pic18f4550,  lo quize conectar por medio de la usb pero dice mi pc que es un dispositivo desconocido, me gustaría saber como  hago un driver para instalarlo y me reconosza mi pic.


----------



## albermillan69 (Jul 3, 2010)

benelviajero dijo:


> jonathan podrías pasarme un programita que sea un bullk   para chechar  mi pic18f4550,  lo quize conectar por medio de la usb pero dice mi pc que es un dispositivo desconocido, me gustaría saber como  hago un driver para instalarlo y me reconosza mi pic.




Aqui lo tienes!! y funciona perfectamente bien!!!

http://picmania.garcia-cuervo.net/usb_3_cdctransfers.php


----------



## benelviajero (Jul 3, 2010)

muchas gracias lo estoy checando, mas tarde comento como me fué...


----------



## foso (Jul 3, 2010)

Ya solucioné el problema del controlador. Le estaba errando de driver. Parecía ser el RS232 pero era el UART COM el que tenia que instalar. Ahora está andando bien. Muchas gracias Moyano.

ese ultimo post que pusieron esta bueno.    albermillan69 

Saludos.


----------



## foso (Jul 4, 2010)

Ya que pude resolver el problema estuve haciendo algunas pruebas de transmitir datos del PIC a la PC y mostrar en pantalla con un programita en visualC#. Anda bastante bien. Pero la ambición quiere mas, ja. 
La cosa es que con este puerto COM virtual y usando la funcion printf( usb_cdc_putc, ....... ) me transforma los datos con el codigo ASCII. Claro ! , porque esta función es especial para mandar carácteres. 

Si yo por ejemplo quiero mandar una tabla datos del pic a la PC y que esta los reciba sin tener que decodificarlos ¿ cómo hago ?. Alguien lo ha hecho ???

El software en C# lo hice de modo que se reciban los datos del puerto en un vector de tipo BYTE que luego transformo a string para mostrarlo en la caja de texto con la función Convert.ToString(). 

bueno mando un saludo y contento por haber echo me primer transferencia por usb .


----------



## albermillan69 (Jul 5, 2010)

foso dijo:


> Si yo por ejemplo quiero mandar una tabla datos del pic a la PC y que esta los reciba sin tener que decodificarlos ¿ cómo hago ?. Alguien lo ha hecho ???
> 
> bueno mando un saludo y contento por haber echo me primer transferencia por usb .



Estas usando el USB CDC?

No se si en tu programa haciendo algo como valor=int(recibido) te de el entero q mandaste desde el pic! Prueba a ver q tal!!!

Saludos!!!


----------



## foso (Jul 5, 2010)

en C# lo que hago es lo siguiente:

//esto va cuando se produce el evento de llegada de mensaje
byte[] mensaje = new byte[1];
SerialPort1.Read(mensaje, 0, 1); 

Desde el pic lo que hago es lo siguiente:

int valor = 32; 
printf( usb_cdc_putc, "%u" , valor); // para mandar por ejemplo el numero 32

y con esto me está llegando cualquier cosa menos el numero 32.
Tambien probé mandar numeros entre comillas pero me los manda codificados en ASCII.
Alguna sugerencia ??


----------



## benelviajero (Jul 5, 2010)

gracias albermillan69 gracias por él link de la página, funciona al 100. sobre el programa de ejemplo que viene ahí en esa pagina: http://picmania.garcia-cuervo.net/us...ctransfers.php yo tenía un crystal de 12mhz con este no  me funciona, y cambié a uno de 20Mhz con sus respectivos capacitores de 15pf. y FUNCIONA. voy a checarlo a que se debe. espero sirva esta experiencia.


----------



## albermillan69 (Jul 5, 2010)

benelviajero dijo:


> gracias albermillan69 gracias por él link de la página, funciona al 100. sobre el programa de ejemplo que viene ahí en esa pagina: http://picmania.garcia-cuervo.net/us...ctransfers.php yo tenía un crystal de 12mhz con este no  me funciona, y cambié a uno de 20Mhz con sus respectivos capacitores de 15pf. y FUNCIONA. voy a checarlo a que se debe. espero sirva esta experiencia.



Verifica el PLL!!!

Si mal no recuerdo 
PLL1 con cristal de 4MHz
PLL5 con cristal de 20MHz

y PLL3 con cristal de 12MHz

Recuerda q en el usb siempre debe haber 4MHz (para q trabaje bien) y los PLL son divisores

Y respecto al problema de FOSO creo q esta es la respuesta!! MSComm1.Output = Chr(Valor) para enviar desde el pc!!! OJO en VB6 y valor 0-255


----------



## albermillan69 (Jul 5, 2010)

BUeno asi solucione yo en VB6 tambien tenia ese inconveniente!! q facil era y no se me habia ocurrido!!!


----------



## foso (Jul 6, 2010)

Hola, bueno gracias por contestar. Lo solucioné sacando el printf y queda de esta forma:

usb_cdc_putc( valor ) ; // donde valor es un int

para mandar bytes del pic a la PC. 
Para el software en C# tuve que buscar una funcion para convertir byte a int. Ahora ya puedo mandar buena data por usb y recibirla .

Saludos.


----------



## albermillan69 (Jul 6, 2010)

foso dijo:


> Hola, bueno gracias por contestar. Lo solucioné sacando el printf y queda de esta forma:
> 
> usb_cdc_putc( valor ) ; // donde valor es un int
> 
> ...



ahhhh ok!!! no sabia q tenias problemas en el envio desde el pic! sino te lo solucionaba primero!! jejejje

Y bueno!! q bueno q ya solucionaste todo!!! yo estoy gateando todavia con el VB6 pero poco a poco voy caminando para luego correr!! jejejeje


----------



## franzrilke (Jul 7, 2010)

Moyano una consulta, en tu ejemplo ejercicio_n7_731.rar  del 26-enero del 2009 lo grabe en mi pic18f2500 con el ccs version 4.104 en la mcapeta de firmware coloque tus usb_desc_cdc.c y usb_cdc y lo compile y grabe con wl winpic800 con el grabador JDM que encontre en la web. Cuando coloco y le direcciono para que busque el driver que esta en tu carpeta que colocas ahi me sale despues un mensaje "de que no puede instaalr el hardware por que no encontro el software necesario". Eh intentado mis propios programas usando el enumerador de PalitroqueZ que tal vez conoscas...pero en fin me sale siempre lo mismo ..quisiera poder poder probar el com virtual en la pc..es windows xp servipack3. Tengo que mencionar tambien que el administrador de dispositivos aparece SERIAL DEMO, de tu programa. Como que lo encuentra pero aun asi sale ese mensaje de que no se pudo instalar. Tal vez me puedas orientar si estoy haciendo algo mal.

Gracias.

perdon es el pic18f2550..saludos a todos.. tal vez alguien me pueda orientar al respecto..saludos

El cristal que uso es de 20MHz, y por el momento no implemente el esquema que colocas ahi otensiometro,leds,etc...por que por el momento solo quiero que reconosca el pic y ya hare  despeus prender puerto,etc..


----------



## Moyano Jonathan (Jul 7, 2010)

Dejame que investigue tu problema de drivers y después te digo 
Un saludo !


----------



## franzrilke (Jul 7, 2010)

Gracias Moyano por responder; estare esperando novedades..este tema me tiene cabezon...ya probe con la api del usb y sale todo Ok, pero al probar este tema de el com virtual tengo estos inconvenientes.

Saludos


----------



## Moyano Jonathan (Jul 8, 2010)

Hola @franzrilke como estás !
Mirá anoche estuve probando las aplicaciones que había subido antes en mi entrenador USB y no tuve errores , todos los programas de emulación CDC corren perfectamente en Windows XP asi que si usas otro sistema operativo puede que te de fallas.
Otra cosa los drivers también lo podés bajar de microchip bajando la Microchip Solutions en donde viene la librería actualizada....
Hace lo siguiente :
- Conecta el PIC a la PC
- Espera que te lo reconozca.
- Anda a administrador de dispositivo - sistema
- Fijate en los puertos COM y mira si te lo detecta
- Publica una inmagen de los dispositivos conectados y del error que te presenta haber si podemos detectar de que se trata por que a mi me funciona de 10
Un saludo !


----------



## franzrilke (Jul 8, 2010)

Correcto Moyano lo estare haciendo mas tarde o que dices..pero antes quiero mencionar algo. Volvi a simular mis programas con la Api de USB de microchip; es decir no usando el com virtual. Lo hice por el procedimiento con Proteus ya que permite tambien sin estar regrabando el pic simular todo el proceso y te pide el driver. Bueno lo que paso es que me pidio mi driver antiguo de mi programa pruebba..pero automaticamente lo busco y sencillamente lo encontro; no hice el direccionamiento manual de buscar el driver en la carpeta que pongo por defectos mis drivers simplemente lo encontro. Pense que no habria rastro de nada por que imagine que desinstale todo driver; hecho por medio del programa "USB  View". Me surgen preguntas , como que al usar el mismo "_*V*endor *ID*_ y el _*P*roduct *ID*_ " en mis pruebas, y como veo no se desinstaa por completo los driver...existira conflicto ro eso? pero si fuera asi no saldria en dispostivos el iconque identifica al pic "USB Demo".Tomare imagenes de todo mi proceso con algoritmo y todo del pic para colgarlo y lo puedas ver...asi tambien puedan aprender los amigos de foro de los errores que pueda cometer.


----------



## Moyano Jonathan (Jul 8, 2010)

Ok dale subí todo asi lo vemos 
Un saludo !


----------



## albermillan69 (Jul 8, 2010)

albermillan69 dijo:
			
		

> Foso: tu lograste hacer la conversion de l byte q vienes el pic hacia en pc?? Osea de byte a una cadena de caracteres!!!
> 
> suponte q llegua al pc (65(en hexa)), en char es A, pero necesito es q me aparecezca es una cadena de caracteres 65




Solucion: asc(valor)

ejemplo: 'A'   ->  asc(A)  ->  65    

Yo pregunto y me soluciono!!!


----------



## Moyano Jonathan (Jul 9, 2010)

Hola a todos , en esta ocación les dejo las bases para desarrollar proyectos con mcHID.dll en Visual Basic.net y Visual C# 2008. Ambas carpetas tienen lo básico para poder comenzar un programa de aplicación.
Los programas ya lo pueden probar usando los firmwares anteriores del PIC18F2550 así como sus esquemáticos.
En poco tiempo voy a estar terminando la migración de mis ejemplos anteriores a estos lenguajes asi como también voy a continuar con mi libro sobre USB.

Espero que les sirva. !


----------



## Edson3003 (Jul 11, 2010)

Hola, tengo el problema que tuviste estoy intentando generar un PWM enviado con dato de la pc el problema es que el modulo ccp no funciona como veo por la fercuencia de 48MHZ  que necesita para andar el usb dime como solucionaste ese problema


----------



## ChoN (Jul 12, 2010)

Moyano Jonathan dijo:


> Hola a todos , en esta ocación les dejo las bases para desarrollar proyectos con mcHID.dll en Visual Basic.net y Visual C# 2008. Ambas carpetas tienen lo básico para poder comenzar un programa de aplicación.
> Los programas ya lo pueden probar *usando los firmwares anteriores* del PIC18F2550 así como sus esquemáticos.
> En poco tiempo voy a estar terminando la migración de mis ejemplos anteriores a estos lenguajes asi como también voy a continuar con mi libro sobre USB.
> 
> Espero que les sirva. !


 
Genial! Gracias, es lo que estaba buscando, pronto comento resultados...
Consulta, cuál firmware en particular usas? El genérico de HID en CCS sirve? 
Esto está pensado para utilizarse creando el .inf con EasyHid?
Te seque a preguntas... 
Saludos.-


----------



## franzrilke (Jul 12, 2010)

Hola Moyano ya encontre el error de este tema de los drivers. Esto es lo que entendi en todo el roblema que tuve y lo explico para los que estan en el mismo caso.

Bueno yo estoy trabajando en el windows7 de 32 bits. En mis pruebas que hacia usando el programa de "PalitroqueZ" que es paar enumerar y configurar pic-usb , todo era Ok al principio. Instalaba y desinstalaba..pero ahi habia el error por que al desinstalar por "administrador de dispositivos" como menciona el manual de "PalitroqueZ", no colocaba el "check" de "eliminar el software del controlador de este dispositivo". En lo que investigue en la red, sucede que si bien desinstala el driver..no o hace enteramente ya que es como que queda una copia en el sistema operativo, se agrega en lista de "almacen de controladores" asi es que ocurria un conflicto, por que en mis pruebas con CDC y las USB API utilizaba el mismo "Vendor ID y el Product ID " que en mi caso eran 04D8 y 000B; por eso ocurria un conflicto en los drivers.

Si cometieron el error de no poner ese check, por lo que no se desinstalo completamente, hay un procedimiento para elimarlo el cual esta en esta pagina. http://technet.microsoft.com/es-es/library/cc730875(WS.10).aspx ; por este metodo pude ver mis suuestos drivers deinstalados...ahora esta todo limpio y listo para practicar con e cdc.

Moyano en ese ejemplo que colocaste, del que te mencione, veo que el vendor id es (0x0925) y product id es (0x1231). Ya antes habia hecho una consulta en otro lugar sobre ese pnto me mencionaron que el V.I era por defecto 04D8 pr ser de Microchip y el P.I.D era uno de los 9 muesras que esta el mchpusb.inf original que viene en el de microchip.  Pero en el ejemplo veo que colocaste dos valores que no creia posble. Me podrias decir si es que los V.I yP.I.D son ag especifico o podemos poner cualquier valor.

Saludos.


----------



## Moyano Jonathan (Jul 12, 2010)

Hola chon como estás:


> Genial! Gracias, es lo que estaba buscando, pronto comento resultados...
> Consulta, cuál firmware en particular usas? El genérico de HID en CCS sirve?
> Esto está pensado para utilizarse creando el .inf con EasyHid?
> Te seque a preguntas...
> Saludos.-


Exacto esto está pensado para usar con el fimware de CCS pero con mi librería para easyHID que a fin de cuentas es la librería de descriptores base de HID de CCS pero con descriptores, VID,PID,y valores de polling cambiandos entre otras cosas. La librería está en uso en mis primeros ejemplos de USB con HID asi que podés usar esa librería para tus proyectos.

Para mis pruebas preliminares yo usé el firmware del primer ejemplo de HID que postée.

Si alguien sabe de programación más avanzada podrían portar estos ejemplos básicos a VC++ para los que programan en este lenguaje puedan desarrollar sus ejemplos.



> ´Moyano en ese ejemplo que colocaste, del que te mencione, veo que el vendor id es (0x0925) y product id es (0x1231). Ya antes habia hecho una consulta en otro lugar sobre ese pnto me mencionaron que el V.I era por defecto 04D8 pr ser de Microchip y el P.I.D era uno de los 9 muesras que esta el mchpusb.inf original que viene en el de microchip. Pero en el ejemplo veo que colocaste dos valores que no creia posble. Me podrias decir si es que los V.I yP.I.D son ag especifico o podemos poner cualquier valor.



Tanto VID y PID son identificadores únicos que deben ser usados de acorde a las normas de los que los proveen. Para usos educacionales podés llegar a usar cualquier valor que se adapte siempre y cuando no entre en conflicto con los demás controladores.
Para desarrollar ejemplos lo mejor es usar el que provee microchip.


----------



## franzrilke (Jul 13, 2010)

Ok,gracias Moyano,excelente.Una pregunta estoy viendo crear un aplicativo para el cdc; como es simplemente programar el puerto "com" es sencillo pero el problema es que cuando cambie de maquina para probar en una pc aparece  como com3 y en otro com5. Hay alguna manera de conocer de antemano o elegir con que com aparecera...asi mi aplicativo sabria cual com es el que debe abrir y realizar su labor.

saludos
gracias.


----------



## Moyano Jonathan (Jul 13, 2010)

Si te paso un aplicativo que hace eso justamente estudiá su código y fijate que podés usar:
Este proyecto es parte de la colección de actualizaciones de mis ejemplos a VB.net y VC# 2008.
Espero te sirva !


----------



## franzrilke (Jul 13, 2010)

Gracias moyano lo rpobare...por el momento tengo un problema en la transmision de mis datos....quiero ver si lo soluciono en todo caso lo colgare despues para ver si me dan un mano viendo en que fallo...saludos a todos..gracias


----------



## ignaps45 (Jul 17, 2010)

Hola Amigos!! Les cuento que estoy haciendo un programa en C# 2008 para comunicarlo con un data logger que hice para mi trabajo final de carrera de electrónica.
El tema es que recién hace una semana que empece con esto del C# y quisiera ver si alguien me puede ayudar con lo siguiente. el data logger anda por usb con emulación de puerto serie.

1_ Quisiera que se me prenda alguna luz cuando recibo datos de com port
2_Que me detecte automáticamente el pic cuando lo conecto o sino que me muestre en el index solo los puertos detectados
3_Me gustaría que se pueda guardar los datos recibidos en un archivo de texto o cvs (no tener que copiar y pegar)
4_otro problema que tengo es que quiero poner un mensaje de error cuando se pretende enviar el contenido de un textbox y el usuario no ha introducido nada o si introdujo un valor incorrecto.

*Aprovecho para agradecer infinitamente a Meta que gracias a su manual pude empezar a programar en C#*

Les muestro como se ve el programa en la foto


----------



## franzrilke (Jul 17, 2010)

Hola a todos estaba retornando a lo de la comunicacion USB por medio del mpusbapi.dll . Corri muchos ejemplos que hay por la red y son excelentes los que aportan por este foro...pero bueno estaba queriendo  hacer un sencillo programa mediante consola win32 con el vc++2008.Asi de esta manera me acostumbrare a como proceder cuando hagas mis propios programas. Use como ejemplo el PicUSBStuff en su formato de VC++ de J1M, ahi tiene el usb2550.dll que como veo adapto del mpusbapi.dll; pero  tengo problemas al jalar el mpusbapi.dll origina que viene en la carpeta de microchip solution. Podria alguien ver mi programa y decirme en que me equivoco..estoy colgando el programa incluida una imagen que me muestar el error que sale. 

La intension es que solo prenda algunos leds

Muchas gracias a todos.


----------



## jade0007 (Jul 17, 2010)

primero que todo gracias por el aporte 

lo que sucede es que necesito ayuda con un ´proyecto que desarrollo con un compañero que consiste en una manipulador robotico por medio de pc bueno con el protocolo USB y un interface grafica hecha con delphiborland.....

bueno el problema es que ya esta todo listo he simulado la aplicacion con proteus y funciona a la perfeccion sin embargo cuando lo implemento y lo conecto al puerto USB del pc el robot no hace nada es decir no funciona, no se si hay que colocar un driver especial o algo asi (por su pueto ya instale el driver virtual USB del pic y los de proteus) o talvez hay que hacer un acople, en fin no se que hay que hacer porque ya intente varias veces conectarlo al puerto y como no funciona me da miedo dañarlo.

si alguien me pudiera ayudar le agradeceria mucho.

a continuacion les dejo la imajen de las conexiones hechas en proteus y de la inteerface grafica.

http://www.imaxenes.com/imagen/simulaci_n_proteus1ea57dx.png.html
http://www.imaxenes.com/mini/simulaci_n_proteus1ea57dx.png

http://www.imaxenes.com/imagen/inte...faz_grafica_del_sistema_de_control1aa30ye.png


----------



## ignaps45 (Jul 17, 2010)

Hola jade, a primera vista te digo que la conexion   de los pines vusb, v+ u estan mal, te paso foto de lo que recomienda microchip.
Por otra parte a mi si me anduvo con capacitor de 4.7u aunque se recominenda uno de 220nf y resistencia de pull up 1.5k(fijate que pusiste la la resistencia de pull up de 100k a vcc y no a v+). Espero te sirva.
Por otra parte no aclaras que tipo de coneccion usb configuraste(hid, cdc o bulk) de acuerdo a eso necesitaras distintos drivers 
Saludos
Ah otra cosa, unifica todas las masas, las de usb y la del pic.
Una cosita mas , veo que usas el pin sense,acordate de deshabilitar mcrl (justo ahí lo pusiste!!)y la resistencia que va es de 100 K no de 1k acordate que el vcc del usb tira como 500mA o 300mA lo cual es mucho .


----------



## jade0007 (Jul 18, 2010)

muchas gracias por la ayuda ignaps lo boy a probar a ver que tal me va, cuando me funcione lo subo en el foro.


----------



## willynovi (Jul 19, 2010)

franzrilke dijo:


> Hola a todos estaba retornando a lo de la comunicacion USB por medio del mpusbapi.dll . Corri muchos ejemplos que hay por la red y son excelentes los que aportan por este foro...pero bueno estaba queriendo  hacer un sencillo programa mediante consola win32 con el vc++2008.Asi de esta manera me acostumbrare a como proceder cuando hagas mis propios programas. Use como ejemplo el PicUSBStuff en su formato de VC++ de J1M, ahi tiene el usb2550.dll que como veo adapto del mpusbapi.dll; pero  tengo problemas al jalar el mpusbapi.dll origina que viene en la carpeta de microchip solution. Podria alguien ver mi programa y decirme en que me equivoco..estoy colgando el programa incluida una imagen que me muestar el error que sale.
> 
> La intension es que solo prenda algunos leds
> 
> Muchas gracias a todos.



Estuve viendo un poco tu ejemplo, pero por arriba porque no tengo esa versión del VC++ y no he podido abrir el proyecto.

Por lo que veo en los archivos que tienes, puede que este confundiendo la forma de tener acceso a la dll. Es algo básico para que te funcione.

Existen dos formas, una es Load-time linking y Run-time linking.
Para Load-time linking necesitas el archivo mpusbapi.lib en tu proyecto, pero esto depende del compilador que uses porque creo que la que trae microchip es para borland. Para este caso debes usar el archivo _mpusbapi.h que tiene la declaracion de las funciones. Y el mpusbapi.dll debe estar en el mismo direcorio que el archivo ejecutable.

Para el Run-time linking solo necesitas el .dll, pero para esto necesitas cargar la libreria y por ahi es mas complicado. No veo por los .cpp de tu proyecto que uses algo asi como LoadLibrary() o algo asi. Para este caso necesitas usar el archivo mpusbapi.h, fijate que no tiene el "_". Y el mpusbapi.dll no necesita estar en el mismo directorio, sino puede estar en system o system32.

La otra opcion es que uses los archivos fuentes de la dll que son _mpusbapi.cpp y el _mpusbapi.h, y no necesitas la libreria dll.

Si tienes el framework, en la siguiente ruta puedes ver unos ejemplos.
C:\Microchip Solutions\USB Device - MCHPUSB - Generic Driver Demo\PC Software

Por los errores del compiladro pareciera que es eso.
Saludos y suerte.


----------



## Meta (Jul 21, 2010)

Cada vez les salen mejores.


----------



## willynovi (Jul 21, 2010)

Meta dijo:


> Cada vez les salen mejores.



Eso era para mi?


----------



## salenss (Jul 23, 2010)

Yo solo escribi para ver mi avatar jejejeje

Jejeje en un abrir y cerrar de ojos pasaron un par de meses, desde la ultima vez que escribi, es que en mi pueblo el acceso a internet todavia es un privilegio jejejeje ya me deshaogue.
Bueno en mis ratos libres probe los ejemplos de Moyano (Gracias otra vez Moyano por tu esfuerzo y tiempo y animo por el tutorial) y otros que desarrolle programando en c de ccs para el pic y vb6 para pc, el problema surgio al programar el pic18F2550 USB, con HID por interrupcion solo envia 2 Bytes del pic a pc al igual que Alder quien escribio unas paginas atras.
Por cierto revise las funciones de las librerias que utiliza ccs pic18_usb.h, usb.h, usb_desc_hid.h, que son las mismas que se utiliza en este foro, bueno con excepcion del descriptor de strings (usb_desc_hid.h) estaran de acuerdo que no es critico para el envio de mas de 2 bytes.
Alguien logro enviar 8, 16 bytes o hasta 64 bytes
Espero comprendan el problemilla amiguirijillos jejejejej ni Flanders lo dijo mejor.
Es decir puntos criticos en el pic 

#define USB_EP1_TX_ENABLE USB_ENABLE_INTERRUPT         // Habilita endpoint 1 de salida OUT
#define USB_EP1_TX_SIZE 64                              // Longitud del buffer
#define USB_EP1_RX_ENABLE USB_ENABLE_INTERRUPT         // Habilita endpoint 1 de entrada IN
#define USB_EP1_RX_SIZE 64                              // Longitud del buffer

int8 in_data[64]

La pregunta es: porque no transmite mas de 2 bytes, el problema seguro que esta en alguna linea de codigo c del pic ya que tambien al programar el pic en asm pude transmitir 8 bytes con la misma aplicacion de visual basic 6 con mcHID.dll que se utiliza en este foro
Prueben a transmitir mas de 8 bytes.
Continuare realizando pruebas con otras librerias mas y a ver que onda.

Pd. No interesa si se envia 8,9,10,11 bytes o mas la cuestion es enviar bytes hasta el rango maximo que es de 64 si no me equivoco.


----------



## Moyano Jonathan (Jul 23, 2010)

como andas salenss che me dejaste pensado yo nunca me ha hecho falta transmitir mas de 2 bytes ...pero dejame investiga el tema a ver que saco en claro..


----------



## docruzga (Jul 24, 2010)

Hola amigos, he seguido sus articulos, experimentos Moyano gran aporte.
Estoy realizando un DataLogger y al parecer por fin he logrado transmitir mas de 2 bytes 
he transmitido 8 bytes. pronto subire un ejemplo. 

Saludos


----------



## spiritbreaker (Jul 24, 2010)

Hola , no le hallo aun leer 5 bytes del pics , solo leo 3 hasta ahora ,osea quiero enviar en 5 bytes pero no se que significa esto   
envia[1] = valor1; 
envia[2] = valor2; 
envia[3] = valor3; 
envia[4] = valor4; 
envia[5] = valor5; 
  usb_put_packet(1,envia,2,USB_DTS_TOGGLE);
es el numero 2 que no se para que sirve , alguien podria desasnarme  

valor 1,2,3,4,5 son 5 registros del pic


----------



## elmor8 (Jul 24, 2010)

@spiritbreaker: usb_put_packet(endpoint, data, longitudDATA, toggle);


----------



## Vegetal Digital (Jul 24, 2010)

A ver si entendi bien...al darle "longitud data"=2 esta mandando solo los tres primeros datos del array de spiritbreaker...si es así lo solucionaria reemplazando el 2 por un 4...¿?


----------



## elmor8 (Jul 24, 2010)

No, no... Esa es la longitud total!! Si quieres mandar los Byte 0 y 1, solamente pondrías 2. Para el caso que puso "spiritbreaker" tendría que poner 5, para mandar los Byte 1,2,3,4 y 5... Pero no me crean mucho porque todavía no he podido probar un proyectico q tengo con USB Jeje...
Pero la Teoría es esa, sino busca en la ayuda del compilador!!! Yo lo saqué de ahí y de los mensajes anteriores en este mismo hilo... Revisen x ahí en este hilo, yo sé que da flojera pero le hace bien a todo el mundo!!!


----------



## spiritbreaker (Jul 24, 2010)

gracias man , ese 2 se debe aumentar , asi es  , ademas unoss retardos agregar en la lectura ,,, ya salio con 4bytes espero llegar a 8 ,, gracias vegetal tu pregunta resolvio mi pregunta


----------



## jhavitxu (Jul 27, 2010)

No tendran por si acaso el driver para Vista/7?


----------



## nietzche (Jul 28, 2010)

paso a paso como un niño tontito quisiera que alguien me explicara desde menos cero como coños funciona el modulo USB del pic, y como puedo establecer comunicacion HID, o donde viene bien explicado, thanks


----------



## Meta (Jul 28, 2010)

Hola:

¿Aún se sigue trabajando con el manual?

Desde el 2008 que me metí en el mundo del puerto serie, ahora del puerto paralelo, tengo ganas tremenda de hacer circuitos con el USB. Cad vez veo más y más en todas partes.

Quiero hacer cosas como estas que puedes ver aquí abajo.
http://www.retrovicio.com/tutoriales/tutorial-del-pac-drive-placa-controladora-led

Claro que mi objetivo es manipular 8 Relés con el puerto USB y con Visual Stuio .net. Algo tan sencillo como eso, para mi es complicado y apenas me he metido en él ya que estoy con otros puertos. Ánimo Moyano, haber si se te sube las ganas y motivación poco a poco. Ya me encrgaré de pasarlo a Visual C# a mi manera. Después haré un manual rápido sobre como hacer un circuito de control de relés por USB.

También hay más proyectos ismples y muy bueno que he visto de USB hasta entrenadores.

http://www.neoteo.com/microingenia-y-su-entrenadora-para-18f2550.neo






Se que atrás hay ejemplos, eso si, un buen manual hace falta, casi no hago el del LPT porque tenía varios proyectos juntos y no me daba tiempo. Ahora me toca hacer otras cosas, como la mejoras del puerto serie.

Un cordial saludo.


----------



## Moyano Jonathan (Jul 28, 2010)

> paso a paso como un niño tontito quisiera que alguien me explicara desde menos cero como coños funciona el modulo USB del pic, y como puedo establecer comunicacion HID, o donde viene bien explicado, thanks



Lee el hilo completo esta todo explicado..
Saludos !



> Hola:
> 
> ¿Aún se sigue trabajando con el manual?



Si meta como estás. El manual se sigue desarrollando , mi motivación sigue intacta. El tema es que quiero hacer algo completo y bien pero para esto es tiempo y mas tiempo y para colmo no es el unico proyecto que tengo por eso me tardo...

Si queres empezar con lo del USB por favor lee el hilo completo y te vas a dar cuenta que esta todo lo necesario para empezar por lo menos ...en cuanto termine mi libro lo voy a postear o por lo menos sus avances pero como te digo todo lleva su tiempo y para esto del USB se necesita aprender mucho.

Saludos y felicidades por tus manuales que cada vez estan mas interesantes !


----------



## salenss (Jul 28, 2010)

Saludos Moyano, la idea era esa picar la curiosidad para enviar mas de 8 bytes aunque no sea muy comun en nuestros proyectos utilizar, les comento que tube el mismo problema al programar en lenguaje assembler, y esta en la configuracion de la tabla de descriptores HID, Alder subio el descriptor para enviar mas de 2 bytes, bueno pic maniacos realicen modificaciones en la tabla de descriptores para enviar mas bytes.
Segui adelante con el manual usb Moyano, y en lo que pueda colaborar en la elaboracion del manual. 
A todos los foreros paciencia con el Manual USB, esto de la interfaz usb tiene un contenido amplio y me sorprende que Moyano aun tenga tiempo postear.

Lo que se es una gota de agua y lo que desconozco es un oceano!!!


----------



## LIONHEAD (Ago 3, 2010)

saludos, 

Tengo una duda... el control del puerto USB, a travez de Ubuntu? alguin posee algun material?, ando trabajando en un proyecto utilizando el puerto pero a travez de C (netbeans), e interfaz grafica (eclipse) pero he tenido problemas a la hora de utilizar el puerto, ya que no consigo saber como Ubunto lo reconoce o apunta para utilizarlo... cualquier ayuda les agrdeceria...

jorge lopez


----------



## Moyano Jonathan (Ago 3, 2010)

@lionhead hola como andas, mirá la forma más eficaz de hacer lo que necesitas es mediante la clase CDC , por lo tanto lo unico que tenes que aprender es como manejar el puerto serie en linux lo cual no lo veo complejo. 
Luego de eso podes controlar el micro desde ubuntu


----------



## LIONHEAD (Ago 4, 2010)

exacto! deberia recoconocerlo como un puerto nativo /dev/ttyUSB0, alli es donde radica el problema...
me explico mejor, poseo un equipo el cual no poseo su driver para linux, lo estoy tratando de diseñar, al conectarlo y hacer un lsusb aprace el VID y el PID algo asi:
aitdis@aitdis-desktop:~$ lsusb
Bus 005 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 003 Device 002: ID 10e5:0031  
Bus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 004 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 001 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub

en los driver para windows el lo reconoce al instalarlo como un puerto COM (serie nativo) , lo que me hace pensar que utiliza la coneccion USB pero como un puerto serie virtual, en mi programa yo poseo las lineas de comando para apuntar, direccionar y escribir pero en el puerto serial, ahora necesito ayuda es como puedo hacer para que vea el puerto como un USB-serie virtual... cualquier ayuda agradecido.


----------



## willynovi (Ago 4, 2010)

has visto estos enlaces http://www.linuxforums.org/forum/li...sb-device-drivers-userspace-using-libusb.html
y este http://www.linuxquestions.org/quest...linux-device-drivers-using-libusb-api-224021/

creo que por ahi viene la mano.
Saludos


----------



## ingdenis1 (Ago 11, 2010)

hola moyano de casualidad tendras un ejemplo de HID en visual basic.net?


----------



## Moyano Jonathan (Ago 11, 2010)

@ingdenis1 como estás , mirá mas atras en el post puse 2 ejemplos uno en VB.net 2008 y otro en VC# 2008 como ejemplos bases para que desarrolles tus propios ejemplos.
Un saludo !


----------



## ignaps45 (Ago 11, 2010)

Hola Moyano, Felicitaciones por tus fantásticos aportes y por el trabajo que vienes haciendo con tu Manual.
Animo!! lo espero con ansias.
Quisiera hacerte una consultarte si no conoces algún ejemplo o la función para c#2008  para recibir un texto en la pc , es decir ver en un textbox el texto de lo que el pic manda por bulk.

Para enviar texto   en ccs lo que estuve probando fueron estas tres formas , no se cual es la correcta:

1- debug_usb(debug_putc,"\r\n Hola Capo");

2-usb_put_packet(1, mje,1 , USB_DTS_TOGGLE);// char mje[]="Hola Capo";--> esta es la cte mje q mandaria

3-printf(usb_put_packet,"Hola Capo"); Esta me la invente yo y compila sin error pero no se si existe

bueno, espero sus consejos. Muchas gracias


----------



## solaris8 (Ago 11, 2010)

bueno primero, muchas gracias, estoy tratando de aprender un poco como es esto de las pic, y les segui las pisadas en lo que hiban posteando.....

mi interes es realizar esta interface para el auto con salida usb, usa un integrado el elm37, que no consigo por mis rumbos(navojoa,sonora,  mexico), pero buscando me dijeron que es un pic ya programado, podria ser cierto, y seria dificil de contruir?
les dejo el link  del foro  donde se esta viendo el tema.....

https://www.forosdeelectronica.com/f28/computadora-auto-construir-lector-20006/


----------



## patrom (Ago 12, 2010)

Meta dijo:


> Ojo que no se Visual Basic.
> 
> Pero si puedo pasarlo a C# buscando información. Si tienes dudas grandes, las puedes consultar aquí.
> 
> ...


muchas gracias por los aportes soy estudiante de electronica y la verdad me estoy estudiando tus ejercisios, con respecto a lo de lenguaje c y visual B, estaba mirando por ahí y encontre una web que pasa de C a visual B y de VB a C, dejo el link para que lo vean.

http://www.developerfusion.com/tools/convert/vb-to-csharp/

saludos y gracias


----------



## Moyano Jonathan (Ago 12, 2010)

@ignaps45 hola como estás 
Mirá los datos por bulck los tenés que mandar en un arreglo del tipo char const.

Ahora lo que podés tratar de implementar es lo que hiciste acá 
usb_put_packet(1, mje,1 , USB_DTS_TOGGLE);// char mje[]="Hola Capo"


----------



## ignaps45 (Ago 12, 2010)

Muchas Gracias Moyano,  un abrazo.


----------



## yeyo (Ago 12, 2010)

Hola muchachos, realmente este tema es muy interesante. Antes que nada quiero felicitar a Moyano Jonathan por su generosidad en brindar ejemplos de todo tipo y lenguajes para que podamos aprender de ellos.
Ahora a mi pregunta jaja, estoy tratando de comunicarme con C# ya que tengo una aplicacion hecha con este y necesita una conexion USB, descargue el ejemplo de C# y funciona bien, al conectarlo la ventana es verde y al desconectarlo roja, pero como hago para enviar y recibir datos con C# y HID al PIC?
Aclaro que no soy experto en nada sino un eterno aprendiz.

Saludos y gracias de antemano!


----------



## ignaps45 (Ago 12, 2010)

YEYO, fijate unos cuantos post atraz, hay dos ejemplos , uno para VB y otro para VC#, todo con hid.


----------



## yeyo (Ago 12, 2010)

Gracias ignaps45, me voy a fijar mas atras. Creo que en alguna pagina de las 58 que hay lo vi, sera cuestion de pasar 58 veces mas por este interesante hilo jaja.

Un abrazo!

Vos te referias a estos ejemplos?.

_https://www.forosdeelectronica.com/f24/control-dispositivos-traves-modulo-usb-pic18f2550-17458/index56.html#post328897_


----------



## Moyano Jonathan (Ago 12, 2010)

Si son esos los ejemplos de los que se hablan ..saludos !


----------



## yeyo (Ago 13, 2010)

Pero en el ejemplo de c# si no me equivoco no se recibe ningun dato ni se envia. Es asi?


----------



## Moyano Jonathan (Ago 13, 2010)

Si pero si te tomas tu tiempo y lees el código fuente vas a ver que están las rutinas necesarias para hacerlo.


----------



## ByAxel (Ago 13, 2010)

Hola Moyano.
Que tal si me das una manito con esto que parece que también sirve para lo que estas haciendo Open Source Framework for USB Generic HID devices based on the PIC18F and Windows, ya que el .dll usado con el EasyHID me a dado problemas al usarlo en el Win7 + .Net, en fin, el código usado esta interesante solo que no me gusta mucho la forma como lee los datos, pues seria más conveniente que genere un evento al recibir datos por el USB y no esperarlos luego de la escritura.

Ha tambien, es posible que lo conozcas pero es una herramienta mejor que el EasyHID...  el HIDMaker es excelente HIDMaker, lástima que la versión actual cueste tanto  , de esa forma no se tendria tantos problemas en hacer aplicaciones en el .NET...

Por último, conoces el WinDriver, ya que no me queda claro como se usa  , la última vez que lo probé me malogro el driver del PiCKit2  , pero parece una buena herramienta.

Saludos...


----------



## Moyano Jonathan (Ago 13, 2010)

@byaxel exelente aporte ahora me lo pongo a ver !! HIDmaker por complicaciones con el soft de version gratuita no me convenció...además 500U$S por esa aplicación....ni loco.

Después de que lo estudie un poco pongo mis preguntas .....la verdad exelente @byaxel


----------



## yeyo (Ago 13, 2010)

Hola muchachos, ahora logro enviar datos de la siguiente manera :


```
private void button1_Click(object sender, EventArgs e)
        {
              
            byte[] test = new byte[EasyHID.BUFFER_OUT_SIZE];
            test[0] = 0;      // Report ID
            
            test[7] = 170;   // Dato aleatorio
            
            if (EasyHID.WriteEx(EasyHID.VENDOR_ID,EasyHID.PRODUCT_ID,test) == true)
            {
                label1.Text = "Dato enviado con boton.";
            }
```

He intentado enviar un ascii pero no me deja, es decir por ejemplo enviando "T" asi test[7]=Convert.ToByte("T"). De que manera puedo hacerlo?.

Tampoco puedo recibir datos, para lo cual uso el siguiente codigo :enfadado::


```
private void OnRead(UInt32 handle)
        {
            //int valor;
            byte[] test = new byte[EasyHID.BUFFER_IN_SIZE];
            if (EasyHID.ReadEx(EasyHID.VENDOR_ID,EasyHID.PRODUCT_ID,out test) == true)
            {
                
                label2.Text = Convert.ToString(test[1]);
                
            }
```

Otra mas y termino, el Buffer[0] desde el PIC lo leo en el Buffer[1] de c#?
Como puedo recibir los datos correctamente?, que hago mal?.

Gracias de antemano!

De nuevo yo , he podido recibir datos desde un evento button, este es el codigo:


```
private void button2_Click(object sender, EventArgs e)
        {
            byte[] test = new byte[EasyHID.BUFFER_IN_SIZE];
            if (EasyHID.ReadEx(EasyHID.VENDOR_ID, EasyHID.PRODUCT_ID, out test) == true)
            {
                label1.Text = "Dato recibido.";
                label2.Text = Convert.ToString(test[1]);
                
            }
        }
```

Un abrazo!


----------



## salenss (Ago 16, 2010)

Interesante el aporte ByAxel, curioseare un poco en la pagina.

Hablando de otro tema pienso tambien que ya es hora de aprender .net y dejar de apoco el visual basic 6
asi que manos a la obra echare mano, de los ejemplos publicados


----------



## seaarg (Ago 18, 2010)

Buenas, vengo siguiendo este thread hace mucho tiempo pero este es mi primer consulta (creo).

Utilizando el 18F2550 en modo CDC y puerto COM virtual, ¿La velocidad limite es de 115200 bauds o 14 KBytes por segundo, como esta definida en los puerto serie reales?


----------



## ignaps45 (Ago 18, 2010)

Hola seaarg
Sin mucho respaldo teórico te puedo decir que asi es, Pensa que lo que ve la pc es un puerto serie ,Virtual pero puerto serie al fin y la maxima velocidad es de 115200 baudios, el protocolo esta hecho para trabajar a esas velocidades.
De todos modos espera que te contesten los que saben realmente que son Moyano o Meta
Corrijanme si me equivoco , saludos


----------



## Moyano Jonathan (Ago 18, 2010)

En CDC los valores de velocidad de transmisión de datos generalmente nunca alcanzan los valores máximos debido principalmente de que se trata de una emulación .....que de por cierto hay que configurar los descriptores adecuadamente para que trabajen con dentro del rango que uno quiere....es decir..no es autobandig....otra cosa es que en CDC se pueden llegar a producir perdidas de paquetes a altas velocidades.


----------



## seaarg (Ago 18, 2010)

Ok, en mi proyecto tengo que transferir paquetes de 32KBytes (osciloscopio usb) lo mas rapido posible asi que CDC queda descartado. (Obtuve cerca de 1MByte por segundo por puerto paralelo en mi primera version)

Curioso que en el proyecto de hoffman utilizan CDC.


----------



## Moyano Jonathan (Ago 18, 2010)

Fijate como lo implementó el ....creo que su proyecto lo programo en CCS....


----------



## ignaps45 (Ago 19, 2010)

Hola Moyano
Tengo una cosulta, hice un datalogger que utiliza conoxion usb tipo cdc , utilizo un cristal de 20MHZ y configure el PLL = 5 para garantizar los 48Mhz para la comunicacion usb. El reloj del micro esta funcionando tambien a 48 Mhz.

El problema de usar la frecuencia del reloj del micro a 48Mhz radica en que no puedo poner al ADC a maxima velocidad de muestreo ya que tengo que hacer TOSC/64= 750000.

Estuve leyendo el data sheet del PIC 18f4550 y aparentemente se puede usar una distinta velocidad para el micro , lo ideal seria ponerlo a 40000000 (#use delay(clock=40000000) con lo cual el ADC me estaria trabajando a TOSC/32=1250000. 

De hecho hice estos cambios y anda , pero *la pregunta seria si es correcto lo que hice o hay que seguir algunas reglas para usar diferntes frecuencias (por ejemplo 48Mhz/2 o 48Mhz/3 etc.)*

TE mando un abrazo , gracias de antemano


----------



## Moyano Jonathan (Ago 19, 2010)

La verdad que eso nunca lo he implementado..y no te sabría decir


----------



## ignaps45 (Ago 19, 2010)

Bueno Moyano, 

La verdad es que estuve leyendo el data sheet y no me quedo claro eso, seguire indagando.

Muchas gracias , un abrazo


----------



## josb86 (Ago 20, 2010)

Buenas como están, necesito ayuda con algo recién estoy comenzando con el 18f4550 estoy intentado simular el primer programa que colocaron aquí en ISIS lo primero que hice fue colocar el reloj en 48 después instale el virtual USB cuando le doy inicio a la simulación me aparece un letrero en win7 de que no se encontró el controlador, cuando me voy a administración de dispositivos me aparece un hardware con el nombre "serial demo" pero no tiene controlador he leído lo que explican aquí pero la verdad no entiendo muy bien


----------



## ByAxel (Ago 20, 2010)

josb86 dijo:


> Buenas como están, necesito ayuda con algo recién estoy comenzando con el 18f4550 estoy intentado simular el primer programa que colocaron aquí en ISIS lo primero que hice fue colocar el reloj en 48 después instale el virtual USB cuando le doy inicio a la simulación me aparece un letrero en win7 de que no se encontró el controlador, cuando me voy a administración de dispositivos me aparece un hardware con el nombre "serial demo" pero no tiene controlador he leído lo que explican aquí pero la verdad no entiendo muy bien



El emulador USB del proteus no se instala automáticamente, para eso vas al menú inicio y te diriges a "Todos los programas > Proteus 7 professional > Virtual USB", ahí le das clic a "Install USB Drivers"...dejas que termine de instalar y listo, con eso ya podrás simular el USB.

PD: Para casos prácticos no es muy necesario poner 48Mhz en el simulador (te va a consumir todo los recursos del CPU), basta con poner 4Mhz y verás que luego de un rato el USB virtual empezará a funcionar; claro con sus pro y contras.

Saludos.


----------



## josb86 (Ago 22, 2010)

ByAxel dijo:


> El emulador USB del proteus no se instala automáticamente, para eso vas al menú inicio y te diriges a "Todos los programas > Proteus 7 professional > Virtual USB", ahí le das clic a "Install USB Drivers"...dejas que termine de instalar y listo, con eso ya podrás simular el USB.
> 
> PD: Para casos prácticos no es muy necesario poner 48Mhz en el simulador (te va a consumir todo los recursos del CPU), basta con poner 4Mhz y verás que luego de un rato el USB virtual empezará a funcionar; claro con sus pro y contras.
> 
> Saludos.



sigue sin funcionar, alguna otra idea


----------



## Meta (Ago 25, 2010)

Empezar de nuevo desde cero.


----------



## Moyano Jonathan (Ago 25, 2010)

En caso de que no funcione en el proteus vas a tener que montar el circuito en el proto para desechar que sea problema del simulador.  Ahora si ya no te funciona en el proto es tu programa que no funciona o algo que has conectado mal 
saludos !


----------



## ignaps45 (Ago 27, 2010)

Hola meta ,
Veo que estas conectado y aprovecho para preguntarte una cosa.
en el manual que hiciste para c# 2008 (comunicación pic usb cdc), cuando configuras el com en particular pones BitsStop TWO, esto lo hiciste por alguna razon en particular por ejemplo la comunicación pic pc es mas estable o algo asi o solo por que en el driver del usb_cdc.h lo configuraste asi.

Saludos


----------



## Meta (Ago 27, 2010)

Sigue haciendo el manual aunque sea muy poquito, algo es mejor que nada, el tiempo ayuda mucho con poco  a poco. Please...


----------



## Moyano Jonathan (Ago 27, 2010)

Lo del manual lo estoy siguendo .....pero estoy con otrs cosas tambien....lo de los 2 bits lo configure asi por que si...no hubo una razon especifica.
saludos !


----------



## albermillan69 (Ago 28, 2010)

Tengo un problema con mi pic 18f4550!! haga lo q haga por los pines C5 y C4 no funcionan!!! siempre se mantienen en 0v (si los configuro como entrada o salida)

el codigo es este!!

#include <18f4550.h>
#FUSES XT,NOPROTECT
#use delay(clock=4M)

#USE FAST_IO(c)

VOID MAIN(){

   SET_TRIS_c(0b00000000);
   DELAY_MS(100);
   output_bit( PIN_C0, 1);
   output_bit( PIN_C1, 1);
   output_bit( PIN_C2, 1);

   output_bit( PIN_C4, 1);
   output_bit( PIN_C5, 1);

}

Espero su ayuda!!!


----------



## ByAxel (Ago 28, 2010)

albermillan69 dijo:


> Tengo un problema con mi pic 18f4550!! haga lo q haga por los pines C5 y C4 no funcionan!!! siempre se mantienen en 0v (si los configuro como entrada o salida)



Los pines C4 y C5 solo funcionan como entradas digitales y no puede funcionar como salidas digitales, además estos pines no aparecen en el TRISC. Es porque estos pines son compartidos con el USB. Lee la páginas 117 y 118 (119 y 120 en el visor pdf) del datasheet donde describen las propiedades de estos pines.

Saludos.


----------



## albermillan69 (Ago 28, 2010)

ByAxel dijo:


> Los pines C4 y C5 solo funcionan como entradas digitales y no puede funcionar como salidas digitales, además estos pines no aparecen en el TRISC. Es porque estos pines son compartidos con el USB. Lee la páginas 117 y 118 (119 y 120 en el visor pdf) del datasheet donde describen las propiedades de estos pines.
> 
> Saludos.


 

Muchas gracias por tu respuesta!!! bueno ahora ya puedo estar mas tranquilo!! aunque hasta compre otro pic pensando q los otros dos estaban dañados (nunca habia usado a c4 y c5) solo para el usb!!! ahora tengo q buscar como fue q lo hice funcionar con el usb!! 

Por cierto ese manual del q ustedes hablan donde lo puedo bajar??? si pueden coloque siempre la actualizacion en el post #1 asi ya todos sabriamos cual es la version mas actualizada!!

Muchas Gracias!!


----------



## Moyano Jonathan (Ago 28, 2010)

La proxima actualización le digo al administrador que la suba al 1º post para asi se les hace mas facil descargarlo. Mi proxima actualización va a estar dentro de 2 meses aproximadamente debido a que es complejo enfrentar un proyecto como este de forma semiprofesional y que quede acorde a las alturas de cualquier lector que se quiere implementar el USB en sus proyectos.


----------



## albermillan69 (Ago 28, 2010)

Moyano Jonathan dijo:


> La proxima actualización le digo al administrador que la suba al 1º post para asi se les hace mas facil descargarlo. Mi proxima actualización va a estar dentro de 2 meses aproximadamente debido a que es complejo enfrentar un proyecto como este de forma semiprofesional y que quede acorde a las alturas de cualquier lector que se quiere implementar el USB en sus proyectos.


 
Pero de donde lo puedo descargar Moyano?? Gracias...


----------



## Vegetal Digital (Ago 28, 2010)

Hola colegas, a ver si me pueden aclarar una duda, seguramente han visto que el puerto serie (rs232) tiene un pin RST. Queria saber si  el pic 18f2550, por el puerto usb, tiene alguna función para saber el estado de la ya mencionada pata RST.
Muchas gracias.


----------



## ByAxel (Ago 28, 2010)

Vegetal Digital dijo:


> Hola colegas, a ver si me pueden aclarar una duda, seguramente han visto que el puerto serie (rs232) tiene un pin RST. Queria saber si  el pic 18f2550, por el puerto usb, tiene alguna función para saber el estado de la ya mencionada pata RST.
> Muchas gracias.



No... eso debes de programar, que una pata del PIC lea el estado del RST.

Pero eso que tiene que ver con el USB?, son tecnologías distintas.


----------



## Vegetal Digital (Ago 28, 2010)

ByAxel dijo:


> No... eso debes de programar, que una pata del PIC lea el estado del RST.
> 
> Pero eso que tiene que ver con el USB?, son tecnologías distintas.


Gracias por hacerte presente, mi duda es, justamente esa, si puedo con el pic por usb leer el esatdo de RST, sin usar el puerto serie. 
Les explico, estoy usando un programa que se comunica con el mundo real poniendo en 0 o 1 ese pin del puerto serie. MI computadora no tiene puerto serie, y quiero saber si puedo hacer algo por usb.

En su defecto, ¿un adaptador usb-rs232 funcionará?
Gracias y saludos.


----------



## ByAxel (Ago 28, 2010)

De USB a USB solo hay traslado de datos por dos pines, nada más y los procesos que avisan alguna acción es parte del protocolo y/o el hardware del módulo interno USB que tiene el PIC.
De RS232 a RS232 debes de usar el módulo USART del PIC, obviamente para eso deberás de usar un adaptador USB-RS232 pero eso ya no tiene nada que ver con el módulo USB del pic y mucho menos lo que se trata en este tema.

En fin, eso de (por usb leer el esatdo de RST) no se puede.


----------



## yamith (Ago 29, 2010)

Moyano, gracias por la informacion sobre el majeno usb, has puesto una guia muy completa, he estado leyendo en el foro "Control de dispositivos a través del módulo USB del PIC18F2550"  al programar en el micro el .hex del primer ejemplo que dejaste se me ha presentado el siguiente problema: 

Windows dice: uno de los dispositivos usb vinculados a este equipo ha tenido un mal funcionamiento, al entrar a administrador de dispositivos y buscar el dispositivo lo muestra como dispositivo desconocido  y al mirar en los detalles muestra la siguiente informacion:
USB\VID_0C45&PID_63EE\5&1EA4540&0&6
no he dado con el chiste para solucionar el problemas. Me surge otra duda y tal vez x aqui sea la solucion, viendo en el esquematico del circuito pones dos capacitancias entre Vcc y tierra cual es el proposito de estas capacitancia? yo esto usando solo una de 10uF. De antemano te doy las gracias


----------



## willynovi (Ago 29, 2010)

lo mas probable es que sea algo del hardware, y como dices lo des los capacitores es algo de eso.
Por lo general se ponen dos capacitors, uno de 10uF y otro de 0.1uF, con esos es suficiente y bien cerca de las patas del PIC.
Si estas armando el circuito en una protoboard es probable que tengas algo de ruido. Yo iria por ese lado para solucionar el problema.


----------



## Moyano Jonathan (Ago 29, 2010)

Las capacitancias son de filtrado ....no son criticas....estoy actualizando un poco los montajes pero en si la estructura de los programas es casi la misma.
Los errores a la hora de que la PC te reconozca el dispositivo USB pueden ser las siguientes:
- Mal conexion entre los pines D+ y D-
- Capacitor Vusb no conectado.
- Mal conectada alimentacion .....cristal - capacitores.
- Problemas con la PC (Inherentes a la programación del PIC)
- Usar un sistema operativo que no sea XP (no funciona en otros por el momento)


----------



## yamith (Ago 30, 2010)

gracias a todos por las respuesta, el problema resulto ser el capacitor de filtrado (el de 10uf  que estoy usando entre Vdd y tierra) que no estaba bn conectado. es que estoy comenzando a usar elementos de montaje superficial y todavía se me dificulta un poco la soldadura.


----------



## Vegetal Digital (Ago 30, 2010)

ByAxel dijo:


> En fin, eso de (por usb leer el esatdo de RST) no se puede.


Bien, gracias por tu respuesta, busacre de otra forma.
Saludos


----------



## danko_tdq (Sep 2, 2010)

Hola,
Me estuve leyendo el hilo completo y la verdad está increible! Felicitaciones a los q trabajaron en esto!

Quería preguntar por si alguien tiene alguna idea de alguna forma de comunicar un PIC por USB usando OSX. 
Según estuve viendo está la posibilidad de usar un puerto serie virtual, eso no sería problema. Pienso usar C para programarlo. Es la mejor opción usar serie en este caso? Alguien tiene idea?

Gracias!


----------



## Moyano Jonathan (Sep 2, 2010)

No entiendo a que te referis con OSX ??


----------



## Meta (Sep 2, 2010)

Es una librería o archivo del VB 6.


----------



## seaarg (Sep 2, 2010)

Una pregunta basica sobre USB que no estoy seguro si se realizo:

Los pines D+ y D- ¿Son unidireccionales? Es decir, digamos que la PC transmite por D+ y recibe por D- y viceversa con el PIC... ¿O es que ambos pines son bidireccionales?

En caso afirmativo: ¿Sus señales son de 0 y 5 volts? (por la notacion D- pregunto).


----------



## Moyano Jonathan (Sep 2, 2010)

Son entradas diferenciales......algo parecido al RS485...no estoy muy seguro. Las señales son de 0 a 3v


----------



## Meta (Sep 2, 2010)

seaarg dijo:


> Una pregunta basica sobre USB que no estoy seguro si se realizo:
> 
> Los pines D+ y D- ¿Son unidireccionales? Es decir, digamos que la PC transmite por D+ y recibe por D- y viceversa con el PIC... ¿O es que ambos pines son bidireccionales?
> 
> En caso afirmativo: ¿Sus señales son de 0 y 5 volts? (por la notacion D- pregunto).



Moyano, pensé que sabías lo del D- y D+. Que sorpresa.


----------



## mecatrodatos (Sep 2, 2010)

Amigo seaarg mira este enlace es un documento que explica la configuración de pines del puerto USB 2.0:
http://platea.pntic.mec.es/~alopez1/web_Eldad/_gs_srca/CI/Puertos%20USB.pdf


----------



## seaarg (Sep 3, 2010)

Muchas gracias por los datos.

http://en.wikipedia.org/wiki/Differential_signaling

En ese link explica como se transmiten las señales diferenciales. Tenia curiosidad sobre esto para la posible implementacion de usb wireless, digamos mediante infrarrojos para prueba de concepto.

Dichos D+ y D- son bidireccionales no es cierto?


----------



## Moyano Jonathan (Sep 3, 2010)

El puerto USB tiene conexión tipo half duplex unidireccional diferencial para evitar ruidos en la linea  (Lo mismo que rs485) las señales D+ y D-  se mantienen flotantes y las resistencias pull - up o pull - down que tenga el dispositivo conectadas a estos pines determinarán la velocidad de comunicación.

Meta la verdad no me acordaba de este punto por eso tenia dudas.....pero en mi manual está explicado con mucho más detalle en la descripción de la capa física.

Para transmitir datos por infrarojo lo mejor es usar el protocolo IRDA que emula todo el protocolo RS232 por soft y se comunica por IR.


----------



## Meta (Sep 3, 2010)

Ok, ya decía yo. Son cosas que pasan en el mundo de muchas cosas.


----------



## seaarg (Sep 3, 2010)

Moyano Jonathan dijo:


> El puerto USB tiene conexión tipo half duplex unidireccional



¿unidireccional? voy a leer mas sobre esto. Me parece que deberia ser bidireccional sino, por ej. ¿Como el host le envia datos al dispositivo y viceversa?



Moyano Jonathan dijo:


> Meta la verdad no me acordaba de este punto por eso tenia dudas.....pero en mi manual está explicado con mucho más detalle en la descripción de la capa física.



Buen dato, ya que la mayoria de los articulos sobre usb que encontre hablan casi nada de las señales en si.
 



Moyano Jonathan dijo:


> Para transmitir datos por infrarojo lo mejor es usar el protocolo IRDA que emula todo el protocolo RS232 por soft y se comunica por IR.



Correcto, pero mas que nada era una duda conceptual que tenia. Infrarrojo, RF o lo que sea no importaria, el concepto era si es factible diseñar un "cable usb" inalambrico.


----------



## Moyano Jonathan (Sep 3, 2010)

> ¿unidireccional? voy a leer mas sobre esto. Me parece que deberia ser bidireccional sino, por ej. ¿Como el host le envia datos al dispositivo y viceversa?


 lo que quiero decir es que recibe por un canal y transmite por otro ......los puertos son unidireccionales no la comunicación.


----------



## doncorleone (Sep 5, 2010)

Moyano Jonathan


hola que tal he visto tus post de este tema y veo que sabes sobre  la comunicación entre pc- pic por usb.. y quiesiera que me orientaras un poco soy nuevo en esto.. he leido y he visto practicas ya eechas....
 no tienes algun correo msn?¿? para  que me ayudaras te agradesco y muchas gracias


----------



## Moyano Jonathan (Sep 5, 2010)

@doncorleone hola como estás. Mirá te comento que tengo msn pero no estoy muy seguido en la PC por lo que si tenés alguna duda o querés empezar con esto del USB preguntá tus dudas por acá , que tanto como yo como los demás compañeros te vamos a ayudar para que saques tu proyecto adelante. Pero sabé disculpar que el msn no estoy casi nunca y es más rápido que te ayude  por acá.

Saludos y que andes bien !


----------



## doncorleone (Sep 5, 2010)

ok muchisimas gracias por tu pronto respuesta....
pero hasta ahorita quisas no he buscado bien pero  unas de mis dudas es como creas el drivers.... he visto que usan uno de microchip. pero seria generico o no¿? por que ademas he visto que le ponen imagen al driver para el panel de control y le cambian el nombre no se si es el mismo driver de microchip...


----------



## spiritbreaker (Sep 8, 2010)

una consulta , saben con que comando en basic 6  se logra controlar  acciones del pic  usando teclas del keyboard ,osea no con botones grafico para pulsar  sino oprimiendo  las teclas por ejemplo arriba abajo m izquierda derecha ,de antemano gracias , ¿¡ es normal que se lentee el entorno grafico visual (en basic 6) cuando se deja abierto mucho rato (5 minutos)?


----------



## Meta (Sep 8, 2010)

spiritbreaker dijo:


> una consulta , saben con que comando en basic 6  se logra controlar  acciones del pic  usando teclas del keyboard ,osea no con botones grafico para pulsar  sino oprimiendo  las teclas por ejemplo arriba abajo m izquierda derecha ,de antemano gracias , ¿¡ es normal que se lentee el entorno grafico visual (en basic 6) cuando se deja abierto mucho rato (5 minutos)?



Aquí hay algo de lo que buscas.

Ver manual.

Saludo.


----------



## ChoN (Sep 10, 2010)

Hola a todos, hace rato ya que vengo renegando con usb en modo HID, les comento lo que tengo: Hardware: 18F2550 + LCD 16x2  Firmware: CCS (HID)    Software: Visual C# 2008 Express. Lo que intento en un principio es simplemente escribir dos líneas en el display.  Uno de los ejemplos que probe es el componente USB HID de C# que anda dando vueltas por acá: http://www.codeproject.com/KB/cs/USB_HID.aspx  El problema que tengo con este es que detecta correctamente el micro, pero al intentar enviar datos no sucede nada, los datos simplemente no son enviados por el método correspondiente.  Otro con el que probe es la usblibrary.dll, también publicada en este hilo, utiliza tambien api's de windows, detecta  ok el micro, pero al intentar enviar datos, no logro que envie más de 2 bytes, por más que el buffer de envío esté declarado y lleno en 32 bytes.  No quiero utilizar nada fuera de lo que son las api's nativas de windows, ni EasyHid, por una cuestión de portabilidad y licencia.  La pregunta del millon es, ¿Alguien tiene un ejemplo funcional, o pudo hacer funcionar estos para transmision de datos en modo hid con firmware hecho en CCS y visual c#???Desde ya muchas gracias.Saludos.


----------



## Moyano Jonathan (Sep 10, 2010)

> No quiero utilizar nada fuera de lo que son las api's nativas de windows, ni EasyHid, por una cuestión de portabilidad y licencia





> La pregunta del millon es, ¿Alguien tiene un ejemplo funcional, o pudo hacer funcionar estos para transmision de datos en modo hid con firmware hecho en CCS y visual c#???Desde ya muchas gracias.Saludos.



Yo estoy trabajando en hacer una librería para usar las api's de windows genericas para HID pero casi no hay documentación en español y el inglés me tiene renegando pero de a poco voy dilusidando como se hace.

Ejemplos funcionales tengo pero solo en EasyHID y se encuentran esparcidos por el foro.

Saludos !


----------



## Meta (Sep 10, 2010)

Para escapar y seguir con el manual poco a poco esto te puiede servir. http://translate.google.com/#


----------



## ChoN (Sep 10, 2010)

Bueno, estoy de a poco comprendiendo por dónde viene el problema.Antes de trabajar con HID siempre utilize Bulk o CDC, nunca me imagine el quilombo que es HID!    Bueno, el problema es que estoy usando el descriptor del ejemplo de ccs, usb_desc_HID.h    Y justamente puesto tiene este nombre, ya que acá se describen las características y propiedades del dispositivo HID que estamos conectando, y de esta forma windows interpreta "cómo" tiene que dialogar con él.     La cuestión es que modificar un descriptor no es simplemente cambiar constantes porque sí.       Nada de eso, se necesitan cargar valores hexadecimales específicos, y en un orden específico para que todo funcione como queremos.Arrancando por esta página: http://www.usb.org/developers/hidpage#Usage Tables for Physical Interface Devices     Encontramos la aplicación gratuita "USB descriptor tool" que nos facilita la tarea de tener el manual a mano, y podemos con ella ir buscqando los parametros que necesitamos cargar, hasta tiene la posibilidad de generar el archivo.     Lo más fácil es ir modificando los valores del ejemplo de ccs, para mantener el orden (y la cordura).   En este momento estoy probando, en cuanto tenga novedades comento.     Saludos.


----------



## bondadoso (Sep 11, 2010)

estoy super emocionado por tener el manual que moyano esta elaborando asi que lo apoyo a que siga con el, eres grande por toda la ayuda que ya has aportado


----------



## Moyano Jonathan (Sep 12, 2010)

Estoy dando ajustes para hacerlo más interesante y que se explique más.


----------



## Meta (Sep 13, 2010)

Tiene pinta que el manual es uno de los más completos que se está elaborando.


----------



## angelrustrian (Sep 17, 2010)

me parece muy bueno tu aporte, esta buenisimo
me comprare un PIC18F2550, y lo intentare, pero mi pregunta es la siguiente
cual grabadora de PIC debiera utilizar para este PIC, y cual seria el 
programa mas recomendable para programar este PIC, quisiera saber 
si el PIC simulator IDE, lo puede programaR?????


----------



## Moyano Jonathan (Sep 17, 2010)

Mirá todo el tutorial está hecho y basado en C de la empresa CCS. Para programar lo mejor es usar la combinación de MPLAB ide + PICkit2 clone.


----------



## ByAxel (Sep 17, 2010)

angelrustrian dijo:


> me parece muy bueno tu aporte, esta buenisimo
> me comprare un PIC18F2550, y lo intentare, pero mi pregunta es la siguiente
> cual grabadora de PIC debiera utilizar para este PIC, y cual seria el
> programa mas recomendable para programar este PIC, quisiera saber
> si el PIC simulator IDE, lo puede programaR?????



Si vas por el Pic simulator IDE creo que el 'PIC18 Simulator IDE 2.76' estaría mejor, incluso esa versión soporta el USB PIC18 USB Support . Si lo escoges nos cuentas tus avances para tener de todo en este tema, además serias un pionero en programar el USB con ese compilador


----------



## Moyano Jonathan (Sep 18, 2010)

La verdad que estaria bueno que alguien hiciera algo en BASIC.....yo estoy tratando hacerlo en ASM pero esta dificil el tema.....y para colmo en inglés...tardas el doble


----------



## karma (Sep 25, 2010)

Hola a todos... ps los sigo desde hace rato pero ps es mi primera participación en el foro. Ante todo muchísimas gracias por sus aportes son muy ilustrativos para quienes recién empezamos. 
Bueno luego de la presentación... el codigo...XD

Mi inquietud es la siguiente, resulta q necesito hacer un aplicacion en vb 2010 para manejo del puerto usb. Pero el problema radica q en el momento de realizar el llamado de las funciones de la mpusbapi.dll en visual basic me arroja el siguiente error 



A mi manera de ver creo q el error radica en q VB hace un llamado a la DLL pero para ello se emplea los puntos de entrada de la DLL, los cuales no estan hechos en C++, lenguaje en el q esta hecho la mpusbapi.dll de microchip y esto hace imposible acceder a ella.

Ahora mi inquietud es la siguiente sería posible migrar la DLL de C++ a Visual C++, y ps si alguien puede ayudarme ps se muy poco de visual C++.

Salu2 y gracias de antemano!


----------



## albermillan69 (Sep 25, 2010)

karma: en estos dias estuve con visual c# haiendo lo mismo! y no compilaba dandole a la flecha de run! sino tecleando shift+F6! me iba a la carpeta realse y ejecutaba el .exe! asi funcionaba!!

Espero te sirva...


----------



## karma (Sep 25, 2010)

No sigo igual, generando el mismo error y ps no se si la solución es recompilar la dll en visual c++


----------



## albermillan69 (Sep 25, 2010)

karma dijo:


> No sigo igual, generando el mismo error y ps no se si la solución es recompilar la dll en visual c++



Trata registrando el .dll


----------



## karma (Sep 26, 2010)

No comprendo muy bn a q haces referencia con registrar la dll. Es q hay cosas q todavia no manejo muy bn. XD


----------



## lubeck (Sep 28, 2010)

Ya voy a empezar con USB y visualbasic... 
me apunto en el tema...




> No comprendo muy bn a q haces referencia con registrar la dll. Es q hay cosas q todavia no manejo muy bn. XD



no he leido tu problema...
pero creo que si vas al dialogo de ejecutar y pones regsvr32 filename.dll se registra la libreria...


----------



## thamaphyr (Sep 28, 2010)

Bueno, me he apuntado en el tema, esta larguito, he visto tambien otras paginas, pero me he quedado en un problema casual.

Cuando conecto el micro a la USB el pc no me detecta el micro, tengo el primer ejemplo de este post, intente con el driver que propone, el archivo que contiene .cat i .inf, y sigue diciendo device unknow.
Tengo este otro controlador que practicamente es lo mismo y aun asi al intentarlo instalar como P&P no me lo detecta

he intentado con varios, incluso instale este  bueno a decir verdad casi todos los driver que he encontrado tienen este mismo archivo y con un codigo similar, pero cuando coloco actualizar controlador y coloco cualquiera de estos archivos, no me lo detecta, no se si tiene algo que ver tambien el codigo que se coloque en el pic. Interesante lo que dice  @fryck  pero aun asi no puedo ni llegar a la parte de hercules.

Alguno no tendra otro, o decirme como es que se hace, es que no he podido hacer nada a causa de ello. He intentado muchos otros programas pero ninguno se detecta. Mi sistema operativo es el windows 7 no se si en algo cambia. 
Posiblemente puede ser hardaware, pero a mi se me hace que no porque lo tengo en una pcb y es el mismo circuito que se propone al principio de este post.


----------



## thamaphyr (Sep 29, 2010)

franzrilke dijo:


> Si cometieron el error de no poner ese check, por lo que no se desinstalo completamente, hay un procedimiento para elimarlo el cual esta en esta pagina. http://technet.microsoft.com/es-es/library/cc730875(WS.10).aspx ; por este metodo pude ver mis suuestos drivers deinstalados...ahora esta todo limpio y listo para practicar con e cdc.
> 
> Saludos.


Bueno, lo que dice franzrilke es lo mas aproximado que pude encontrar a mi problema, pero aun asi no veo los drivers que pueden llegar a involucrar al PIC, el mio es un 18f4550, tengo el primer ejemplo de este foro el de moyano y no me reconoce ese driver. 

Esta fue la lista que me arrojo al ejecutar el procedimiento de franzrille, conozco la mayoria de drivers, de pronto puede llegar a ser el oem4 o oem7 o om8, aunque lo dudo, aqui dejo una imagen a ver si se familiarizan con este caso jejeje.
Ver Imagen: http://s3.subirimagenes.com:81/otros/previo/thump_5272072pnputil.jpg
de antemano muchas gracias


----------



## karma (Oct 1, 2010)

thamaphyr dijo:


> Cuando conecto el micro a la USB el pc no me detecta el micro, tengo el primer ejemplo de este post, intente con el driver que propone, el archivo que contiene .cat i .inf, y sigue diciendo device unknow.
> 
> *pero cuando coloco actualizar controlador y coloco cualquiera de estos archivos, no me lo detecta, no se si tiene algo que ver tambien el codigo que se coloque en el pic. *



Bueno espero que esto sea de ayuda para aquellos que han tenido problemas conectando el micro al pc en modo USB con simulacion de COM (CDC). 

thamaphyr, ps en vista de que a ti te sucedio lo mismo que me ocurrio, indicare la forma como yo solucione ese pequeño problemita y espero que esta info te sea de ayuda a ti y a todos los del foro que tengan ese problema. 

Para comenzar efectivamente lo que dices de que al darle actualizar no realiza nada es cierto.
Asi q en el administrador de dispositivo te debe salir asi

http://img199.imageshack.us/img199/1135/sincontrolador.jpg

Cuando me solicita el controlador simplemente selecciono *preguntarme mas tarde* luego le das click derecho en la parte donde sale *CCS RS232 DEmo*

*propiedades* *->* *controlador* *->* *actualizar controlador*

http://img64.imageshack.us/img64/5096/actualizarcontrolador.jpg

ahi seleccionas *Buscar software de controlador en el equipo* y *luego Elegir en una lista de controladores de dispositivo en el equipo* click en *usar disco* y selecciona el archivo *mchpcdc.inf* y click en siguiente. Saldra una ventana de advertencia donde se indica que el controlador no se encuentra firmado digitalmente.

http://img827.imageshack.us/img827/6421/seguridade.jpg

 y ahora si esperar que lo configure....:cabezon:

http://img291.imageshack.us/img291/4569/controladorcargado.jpg

y lo esperado...



Y listo ya esta nuestro dispositivo conectado correctamente al PC.!! 

Como dato adicional ps hay cierta info del .inf que se puede modificar para personalizar nuestro dispositivo.

http://img443.imageshack.us/img443/5926/modificandoelinf.jpg

Ahora si me ire a dormir, espero poder haber contribuido en algo. ...Salu2... God Bless!!!


----------



## Moyano Jonathan (Oct 1, 2010)

@karma exelente tu aporte !!


----------



## thamaphyr (Oct 1, 2010)

Muchas gracias karma por dedicarle tiempo a ese inconveniente. Pero mi  caso sigue siendo diferente. Creo que el error lo tengo mas atras. Voy a  explicarlo mas detalladamento como lo estoy haciendo. Lo hice de dos  maneras. La primera que indique al principio que fue al actualizar el  driver y la segunda tal y como lo explicaste tu:
 en cuentro dos diferencias de lo que te salio y lo que me salio.

 Cuando conecto el dispositivo, el pc me indica el controlador como un  dispositivo desconocido "unknow device", y no me lo coloca en la seccion  de otros dispositivos, sino en la seccion de "controladores de bus  serie universal".

http://img163.imageshack.us/i/administradork.jpg/


 No me aparece cuando dices que la ventana pregunta solicitando un controlador, bueno pero eso no creo que influya mucho. 

 Hago exactamente los pasos que tu indicaste a continuacion:

 1) boton derecho al dispositivo desconocido > Propiedades > controlador

http://img20.imageshack.us/i/controladoractu.jpg/

 tal y como esta en la imagen coloco actualizar controlador, despues me  aparece otra ventana emergente donde me da dos opciones: buscar  automaticamente el software o buscar software de controlador en el  equipo. Hago click en el segundo (buscar software en el equipo), luego  me aparecen dos opciones
http://img834.imageshack.us/i/dosopciones.jpg/

 Aqui es donde hice las dos cosas, o primero por examinar buscando el  archivo .inf, o por donde dice buscar controlador por dispositivo del  equipo que es la que propones tu karma.

 al entrar me aparece la ventana emergente donde ahi hay un boton que dice usar disco.

http://img8.imageshack.us/i/usardisco.jpg/

  hago click en el y luego otra ventana emergente aparece de nuevo.

 y en examinar ubico el driver donde se encuentran el archivo .inf 

 Voy a colocar digamos el ejemplo 1 de moyano. Ahi lo guarde en mi archivo de direccion
 D:\LCD program\targeta1_USB\intento10
 donde se encuentran las 4 carpetas del archivo comprimido.

 Despues de quemar en el micro (utilice un 18f4550, cambie en el programa  la libreria include 18f4550 en vez de 18f2550, pero utilizo el mismo  oscilador de 20mhz), ahora busco en examninar de la imagen anterior en  la direccion D:\LCD program\targeta1_USB\intento10\DRIVER_WINXP y señalo  el archivo .inf que es el driver que moyano nos facilito para ese  ejemplo

http://img412.imageshack.us/i/direccionamiento.jpg/

 pongo abrir en la ventana emergente y luego aceptar en la otra ventana. y  en teoria deberia de salir lo que te salio a ti karma. Pero a mi me  sale es esto:

http://img189.imageshack.us/i/nosepudo.jpg/


 La carpeta DRIVER_WINXP tiene estos archivos, esa no la toque para nada
http://img695.imageshack.us/i/drivero.jpg/


 y pues la modificacion que hice de micro de cambio de libreria no creo  que sea porque de lo contrario no estaria ni reconociendo el pc como un  dispositivo sin controlador.

 No se entonces, no se me ocurre mas, todos los demas foros no dicen mas,  estoy seguro que debe ser una bobada pero ni idea, si alguien la capta,  agradeceria mucho que me lo informaran, muchas gracias karma por  responderme, lo que tu posteaste y lo q yo estoy mostrandote es casi el mismo  procedimiento, pero aun sigo con el inconveniente, no tengo idea tampoco  de porque te aparece como en otros dispositivos el driver desconocido  al principio, y a mi me aparece en otro lado, quiza sea eso no se.

 Un saludo y nuevamente gracias.


----------



## karma (Oct 2, 2010)

Al parecer el problema radica en vista y en 7... ASi q me di a la tarea de buscar en la red e incontre un foro de microchip donde *chinzei* hablan del inconveniente, de sus causas y de como dar una solución provicional mientras se da una solución definitiva.

http://www.microchip.com/forums/tm.aspx?m=488342

Adicional a esto hay q hacer una pequeña modificación al .INF


```
mchpcdc.inf (y derivados)
 
 [DestinationDirs]
FakeModemCopyFileSection=12            ; <------ adicionar esta 
 DefaultDestDir=12
 
 [DriverInstall.nt]
 include=mdmcpq.inf
 ;; CopyFiles = DriverCopyFiles.nt      ; <------ incorrecta: referencia al INF file
 CopyFiles = FakeModemCopyFileSection   ; <------ Correcta: referencia a una sección en mdmcpq.inf
 AddReg=DriverInstall.nt.AddReg
 
 ;; [DriverCopyFiles.nt]                ; <------ Borrar estas lineas
 ;; usbser.sys,,,0x20                   ; <------
```

Espero q te sirva la info y puedas solucionar tu problema. De todas formas revisa tu PID&VID tanto del descriptor como los del .INF sean iguales.

La otra es q subas los descriptores q estas usando, porq es muy raro q te lo detecte asi y no como COM.


----------



## thamaphyr (Oct 3, 2010)

bueno, intente hacer eso que me dijiste, tengo una pregunta?, por que tantos .inf hay que cambiarlos, imagino que hay q reformar en este caso el de la carpeta de  DRIVER_WINXP del archivo comprimido, los reforme todos y cargue ese y nada, ahh obviamente colocando el .sys en drivers de system32. 

Por otro lado tengo aqui un pc que trabaja en xp, y realizo el mismo procedimiento posteado, y me ocurre exactamente lo mismo. yo te pregunto algo karma. Como haces para que el dispositivo te salga en la seccion de "otros dispositivos" y no en "controladoras de bus serie universal", y como haces para que el te detecte directamente con el nombre de "CCS RS232 demo" y no como un "unknow device" como me aparece. Posiblemente ahi esta mi respuesta

un saludo


----------



## electronicjohndeacon (Oct 8, 2010)

Hola que tal tengo los siguentes problemas al querer simular los ejemplos de las primeras paginas tanto el puerto virtual como HID en el primer caso me detecta el dispositivo e instalo el driver pero a la hora de ejecutar el programa para enviar algun dato me causo un error  8000 o 8002 y esto sucede cuando selecciono conectar escogo el puerto que aparece en administracion de dispositivos y sigue el error, en el segundo caso me pide driver pero he leido en el mismo foro que no debe pedir y estoy deseperado ocupo win xp alguien tuvo ese problema y cual es la solucion espero alguien me aclare el camino


----------



## karma (Oct 8, 2010)

thamaphyr dijo:


> Por otro lado tengo aqui un pc que trabaja en xp, y realizo el mismo procedimiento posteado, y me ocurre exactamente lo mismo. yo te pregunto algo karma. Como haces para que el dispositivo te salga en la seccion de "otros dispositivos" y no en "controladoras de bus serie universal", y como haces para que el te detecte directamente con el nombre de "CCS RS232 demo" y no como un "unknow device" como me aparece. Posiblemente ahi esta mi respuesta
> 
> un saludo



La verdad me parece muy curioso esto, asi q te propongo una cosa, porq no me pasas lo q estas haciendo osea, el codigo en ccs, los descriptores y la simulacion (si la hiciste), para q entre los dos analicemos el caso y ps tratar de encontrar la solución. O no se por otro medio como correo o messenger, tu diras y sino por aki por el foro! SAlu2


----------



## Moyano Jonathan (Oct 8, 2010)

La verdad que a mi me tiene atónito el problema con Windows XP por que los códigos los probé mil veces antes de subirlos y no tienen ningún error. Ahora si se les puede llegar a presentar problemas (POR PARTE DE LA PC) en caso de usar Windows 7 o Linux ya que los correspondientes INF no están desarrollados para este SO ...pero si en vista funcionan tienen que funcionar en 7...de esto ultimo no estoy del todo seguro.

*Por favor pido que antes de probar cualquier ejemplo revisen 100 veces el hardware que es la causa de la mayoría de los problemas.*


----------



## COSMICO (Oct 8, 2010)

El amigo moyano tiene razon.
Al comienzo, a mi tambiem me tomaron del pelo los ejemplos
pero despues de cacharrear con los drivers y el proteus; ma andaron bien...


----------



## electronicjohndeacon (Oct 10, 2010)

hola a todos vengo con noticias buenas tiene razon amigos en simulacion proteus no funciona solo con circuito fisico solo probe el segundo ejemplo con el com virtual y funciona en win xp  y para los que tiene problema con win 7  al conectar sale que el dispositivo no funciona correctamente bueno en administracion de dispositivos aparece el icono del com virtual pero con un icono de advertencia  le dan un click y se abre la ventanita hay tres pestañas en la de controlador buscan la opcion de actualizar controlador y luego buscar controlador en el equipo y buscan la carpeta donde esta el driver_xp  le dan siguinte y se instala bueno ahora sigue la ejecucion del programa .exe bueno como en vista o en mismo xp cuando un programa es viejo siempres esta la opcion de compatibilada 
y esta no es la exepcion solo con click derecho y en opcion "solucion de compatibilda " y la la ejecutan como xp  y despues sigue el clasica pregunta de que si quiere ejecutar blah blah y damos ok o si saldra el error de que mscomm32 no valido  en el siguiente link http://www.martin2k.co.uk/vb6/ocxs/mscomm32.zip se descarga la carpeta y ahi esta la dll y la descomprimen y copian el archivo en la c/ windows/ system y vuelve a ejecutar el programa en modo compatibilidad y listo tendran el segundo ejemplo de la paguina 2 en win 7 

espero que les sirva 
probare con los demas ejemplos y dare resultados


----------



## thamaphyr (Oct 13, 2010)

karma dijo:


> La verdad me parece muy curioso esto, asi q te propongo una cosa, porq no me pasas lo q estas haciendo osea, el codigo en ccs, los descriptores y la simulacion (si la hiciste), para q entre los dos analicemos el caso y ps tratar de encontrar la solución. O no se por otro medio como correo o messenger, tu diras y sino por aki por el foro! SAlu2



Tranquilo karma muchas gracias por tu ayuda, ya encontre el problema. Era de Hardware. En primera instancia era porque no habia buena conexion en el condensador de 47uf para el pin de VUSB y en otra era que tenia invertidas las conexiones de D+ y D-.
Me di cuenta fue montandolo en un protoboard con un 18f4550 PDIP, debi tener confusion cuando fui a conectarlo porque estoy trabajando con un 18f4550 pero con configuracion TQFP

Ya ahora si me esta funcionando, siento tanta molestia, pero bueno ahora si saben que es lo que sale en software cuando esta mal conectado el hardware (y tanto tiempo que me tomo para darme cuenta del error , asi es la vida de la electronica)

Un saludo y de ante brazo muchas gracias


----------



## ZadKiel (Oct 14, 2010)

buenas amigos,

estuve leyendo sus 62 paginas de post que llevan y guao, eh aprendido como no se imaginan, gran conversacion e ivnestigacion que han hecho los felicito grandemente, llegue aqui por recomendacion de lubeck, ya que estoy trabajando con mi tesis que es una tarjeta electronica multipuerto para la comunicacion de hardware externo con un computador personal, pero me eh dado cuenta de muchas cosas y eh visto que estaba mal encaminado, me podrian dar una mano, aun me queda harto tiempo y quiero hacer este proyecto. 

si me podrian encaminar decirme por donde inicio estaria agradecido, mi meta es crear una tarjeta electronica que al conectarla por paralelo o usb y usando una interfaz grafica amigable pueda controlar un hardware externo.

espero que me puedan ayudar un millon y estare ya suscrito aprendiendo de sus ejemplo hasta que pueda ayudar en problemas que tengan debo aprender lo que ustedes aprendieron en años en poco tiempo je.

un saludo y nos leemos


----------



## Meta (Oct 14, 2010)

Sólo falta el manual que se completará poco a poco y tenerlo en una sola pasada.


----------



## Moyano Jonathan (Oct 14, 2010)

Mirá @zadkiel acá te podemos orientar y mucho...pero nos tenés que espeficar que necesitas....en el hilo está todo lo que necesitas para tu proyecto es cuestion de leer nomas y preguntar dudas...
saludos y que estes bien !


----------



## salenss (Oct 14, 2010)

Otra vez dando una hojeada a la pagina jejeje.
ya mencione unas paginas atras pero creo que vale la pena volver a repetir, buen tiempo andube peleando con el pic y con el programa de visual basic para la transmision de mas de 2 bytes, el problema esta en la tabla de descriptores por defecto esta configurado a 2 bytes en el usb_desc_hid.h de ccs.
modificando el descriptor CLASS_SPECIFIC_DESC[], los bytes de report count, que estan en 2 modificar: ejm. cambiar a 3 para transmitir 3 bytes, o 8 para transmitir 8 bytes, verifica en el archivo de descriptores, antes de compilar.
Por cierto olvide mencionar que esto es para el modo de trasmision HID.
Esto por que alguien tubo problemas al transmitir mas bytes.
Moyano tengo una duda, lei que estas programando en asm, que es lo que estas programando? el codigo fuente para pic? aplicacion para pc o el driver?. programo algo en asm y quiza pueda darte una mano
Animo Moyano, con el manual


----------



## Moyano Jonathan (Oct 14, 2010)

Hola el manual está parado no por razones mías sino que tengo que aprender más y no les voy a dar un manual asi nomás sino que es un libro ya con sus 300 páginas...pero no sean impacientes todo va a salir en su debido momento no quiero adelantar nada más.

Para ASM estoy programando el Firmware del PIC que es compatible con easyHID , es un firmware HID.

El mismo lo estoy estudiando de a poco ya que el ASM no es 100% mi amigo ...pero lo que quiero es entender como funciona el tema de USB en forma completa...por que es muy facil crear una aplicación funcional pero a veces no se entiende como es en forma interna.


----------



## salenss (Oct 14, 2010)

Estoy de acuerdo contigo Moyano el firmware para programarlo en asm se requiere de conocimientos avanzados, hace un tiempo discutimos sobre usb en asm pero este no utiliza interrupciones, esto para el modo de transmision HID.
Por falta de tiempo no pude actualizarlo para que pueda ser usado como una libreria firmware, sin embargo funciona y es compatible con easyHID, ademas de un manual que esta en ingles.
la pagina esta en: http://dynamoelectronics.multiforos.es
espero sirva de algo.


----------



## Moyano Jonathan (Oct 14, 2010)

Mira vos las vueltas de la vida....de esta página estaba basando mi trabajo en asm


----------



## salenss (Oct 14, 2010)

Jajajajajaja, que bien estamos sobre ruedas, bueno lo que queda es pasar muchas noches quemando pestañas


----------



## Moyano Jonathan (Oct 14, 2010)

Se sabe ...pero cuando algo sale andando la sensación es indescriptible


----------



## salenss (Oct 14, 2010)

Asi, es ya recuerdo cuando encendi y apague un led por primera vez con un pic18f2550 por usb, estaba tan feliz que di brincos de alegria todo el dia.
No me conecto muy seguido a internet pero estare viendo los avances,
Saludos.. Moyano


----------



## Meta (Oct 15, 2010)

Mira por donde ya llega el libro C# 2010 que puedes ver aquí en inglés.



> Este último libro del Dr. John Allwork  apoya el desarrollo de C# empleando el reciente entorno Microsoft Visual  Studio 2010 y el sistema operativo Microsoft Windows 7.
> 
> El  objetivo de este libro es enseñar rápidamente cómo programar un PC  utilizando el conocido lenguaje de programación de alto nivel C#. La  enseñanza comienza con los tipos de datos y el flujo de programa y se  extiende a conceptos avanzados como la programación orientada a objetos,  threading, comunicación por internet y bases de datos. Todos los  ejemplos utilizados están disponibles – sin cargo alguno – en la web www.elektor.com;  puedes crear fácilmente tus propios resultados para demostrar los  conceptos explicados y reforzar tu aprendizaje en el proceso.
> 
> ...


Fuente:
http://www.elektor.es/noticias/nuev..._source=ES&utm_medium=email&utm_campaign=news

Índice del libro en PDF:
http://www.elektor.es/Uploads/Files/Product/IndiceC-2010Programming.pdf

Parece el mismo libro del C# 2008 pero más actualizado.
http://www.elektor.es/noticias/nuevo-libro-c-2008-y-net-para-ingenieros.979192.lynkx


----------



## cristian_elect (Oct 22, 2010)

Los ejemplos DE CDC USB funcionan bien con su hex que viene hay, pero al compilar los ejemplos con el ccs crea un hex que no funciona bien no recive el carácter se pasa de largo la funcion "usb_cdc_kbhit()"   pero si imprime caracteres que agrege una linia printf(usb...)para probar. 
Una pregunta hay una forma que el pic no espere que llegue un carácter al buffer "usb_cdc_kbhit()"  por que se detendría el programa solo en la espera, seria recivir caracteres por interrupción, hasta llenar un buffer creado  asi como se usa uart rx por interrupción.


----------



## Moyano Jonathan (Oct 22, 2010)

Al ser topología USB - SERIE la interrupción de la que me hablás es por USB y la implementación de eso es bastante compleja...es raro a algunos les funciona a otros no los ejemplos....quizás sea la versión del CCS yo usé la V4.025 ....y ya van por la 4.112....hay que fijarse en eso también ..quizas haya algunas funciones cambiadas.


----------



## cristian_elect (Oct 22, 2010)

Usé el ccs 4.020 lo mas cercano que encontre de la vercion que usaste este si funciona pero tengo una duda la funcion "usb_cdc_kbhit()" espera realmente ise una prueba y lo salta.
Aqui pongo una parte del codigo y agregue unas lineas.
..
...
do{
usb_task();
if (usb_enumerated()){ // Espera a que el dispositivo sea enumerado por el host.
printf(usb_cdc_putc, "El USB.\n\r");
delay_ms(200);
printf(usb_cdc_putc, "El USB 2.\n\r");
delay_ms(200);
printf(usb_cdc_putc, "El USB 3.\n\r");
if(usb_cdc_kbhit()){ // En espera de nuevos caracteres en el buffer de recepción.
if(usb_cdc_getc()=='x'){ //¿lo que llegó fué el caracter x?
printf(usb_cdc_putc, "Se recibe el caracter x.\n\r"); 
//si, entonces envía una cadena hacia el PC
}
if(usb_cdc_getc()=='a'){ //¿lo que llegó fué el caracter a?
printf(usb_cdc_putc, "Se recibe el caracter a.\n\r");
//si, entonces envía una cadena hacia el PC 
}
}
}
}while (TRUE); // bucle infinito.
..

Imprime "EL USB x " en forma imparable supuestamente deberia quedarce en la funcion "usb_cdc_kbhit()" hasta que llegue un caracter, a mi parece que esta funcion no espera solo ve si ha llegado datos.
la funcion "usb_cdc_getc()" si espera hasta recivir un caracter muy parecida a la uart.
"usb_cdc_kbhit()" siempre se activa en el trafico usb si interesar si mandaste un caracter por la hiperterminal..


----------



## anderson torres (Oct 23, 2010)

Buenas a todos¡¡
He estado trabajando USB tipo bulk, he conseguido entender el funcionamento general de este tipo de comunicacion. Estoy realizando unas pruebas con UART y me encuentro con la contrariedad de que no me transmite bien. Presumo que es por las velocidades de transmision no son las correctas. Intente comunicacion I2C y fue un fiasco completo. Es decir la comunicacion entre pic me falla cuando uno de ellos usa USB. La verdad he intentado por muchos caminos pero obtengo los mismos resultados. Alguien ha implementado estas configuracion. Seria estupendo que alguien me pudiera orientar con respecto a este tema. 
Gracias desde ya.
Salu2¡¡


----------



## Moyano Jonathan (Oct 23, 2010)

cristian_elect la verdad no se específicamente donde pueda estar tu problema , tendrías que revisar que la configuración de velocidad de tu aplicación coincida con la del firmware. La mayoría de las aplicaciones presentan errores por velocidades mal configuradas.


----------



## eviltools (Oct 23, 2010)

HOla Moyano!

llevo como un mes siguiendo el post, ya casi me vuelvo loco, peor no he podido hacer funcionar mi pic, en modo CDC todo OK! pero en modo HID no , ni uno de los ejemplos del HID me ha funcionado en real pero en proteus si, estoy usando el mismo circuito que el del CDC que si me funciono en real, tendras alguna idea que esta fallando, lo que pasa es que cuando conecto el circuito al USB este no lo reconoce tengo semanas intentando diferentes configuraciones pero nada, me siento muy frustrado no poder hechar ha correr esto pues estoy haciendo un proyecto para controlar 3 motores a pasos. Espero alguna ayuda Gracias! Saludos desde Mexico


----------



## Moyano Jonathan (Oct 24, 2010)

@eviltools: Hola como estás.

Mirá todos los ejemplos los he probado yo mismo en mi entrenadora antes de subirlos a la red y no tienen ningún error de funcionamiento. Pero quizas en el hardware si.

Antes de brindarte una solución , te recomiendo que subas inmágenes de el administrador de dispositivos para ver que mensajes te aparecen.

También tendrías que subir una foto de tu montaje y el esquema que estás usando y por último el programa junto con su firmware.

Me parece algo muy raro que te funcione el programa en proteus y no te funcione en la aplicación real.


----------



## eviltools (Oct 24, 2010)

Hola Moyano, me alegra que allas respondido.

Estoy utilizando tu ejemplo numero 2 del HID, he tomado el .hex y lo he grabado en mi pic 2550. el esquema que estoy utilizando es el que muestras en el archivo de proteus, claro con sus debidas conecciones a vcc y gnd, dejo adjunto la foto del montaje, lo raro de todo esto es que cuando grabo al pic el ejercicio CDC funciona de maravilla, "solo con los errores de que hay que pulsar multiples veces la imagen del led en el programa para que enciendan los leds".

espero y me puedas ayudar, tendras algun esquema de tu entrenadora?


----------



## Moyano Jonathan (Oct 24, 2010)

Cambia el cristal de 20Mhz que está en la placa por uno de 4Mhz.....está mal el esquema ahi muestra que es de 20Mhz cuando en el firmware es de 4Mhz.


----------



## eviltools (Oct 24, 2010)

aqui te dejo otras fotitos pero ahora del ejemplo en CDC, el mismo circuito pero ahora le grabe el ejemplo control_de_8_rels_por_usb_439, la verdad no entiendo que estara pasando, no se pq con CDC todo va Ok y con HID no , espeor y me puedas hechar la mano.

Oye amigo como solucionaste el problema del software para este ultimo ejemplo del CDC, pues cuando pulso sobre algun led en el programa no reacciona a la primera, hay q pulsar varias veces para q reaccione.  

de ante mano muchisimas graciaas!!


----------



## Moyano Jonathan (Oct 24, 2010)

Haaa si ese ejemplo tiene un error de programación ....ya voy a ver como lo soluciono.

Lo de HID te tiene que andar como te puse ateriormente....es decir vos en tu placa tenías un cristal de 20Mhz ...y el firmware está configurado para 4Mhz. No tendrías que tener problemas de hardware...por si en CDC va bien es por que el hardware está correcto como asi tambien la aplicación . tenés que leer acá:

```
#include <18F2550.h> // Definición de registros internos del PIC18F2550.
#fuses NOMCLR,XTPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL1,CPUDIV1,VREGEN,NOPBADEN
// NOMCLR: No vamos ha usar el PIN MCLR, el reset se hará por soft.
// XTPLL: Vamos a usar un cristal de 4.00Mhz.
// NOWDT: No vamos a usar el perro guardian.
// NOPROTECT: Memoria no protejida contra lecturas.
// NODEBUG: No utilizamos código para debugear.
// NOLVP: No utilizamos el modo de programación con bajo voltaje.
// USBDIV: signfica que el clock del usb se tomará del PLL/2 = 96Mhz/2 = 48Mhz.
// PLL1: significa que el PLL prescaler no dividirá la frecuencia del cristal. para XT = 4Mhz.
// CPUDIV1: El PLL postscaler decide la división en 2 de la frecuencia de salida del PLL de 96MHZ, si queremos 48MHZ, lo dejamos como está.
// VREGEN: habilita el regulador de 3.3 volts que usa el módulo USB.
// NOPBADEN: Deshabilitamos el módulo conversor ADC del puerto B.
#use delay(clock=48000000)
```

*Te dice claramente que el firmware usa un cristal de 4.00Mhz* de cristal.

Luego voy a correjir este problema que hay con el ejemplo que me pusiste mas arriba....


----------



## eviltools (Oct 24, 2010)

Mil gracias!, jejej eya funciona! dios con tanto ejemplo que tenia se me olvido por completo cambiar el bendito cristal, jejeje, dias de quemarme la pestañas y nunca se me ocurrio ver el cristal jeje, pues muchisimas, gracias, en cuanto tenga listo mi programa de los motores lo subire por aki!, sale muchos saludos


----------



## Moyano Jonathan (Oct 24, 2010)

Podés creer que yo tengo un proyecto de control de 3 o más motores por USB mediante un programa en VB.net o VC# 2008 o 2010. Ahora las especificaciones del proyecto son:

- Placa master del control:

- USB para realizar comunicaciones con la PC.
- RS232 para realizar DEBUG.
- RS485 para el control de los módulos de potencia.

Placa de potencia:

- Soporte para motores PAP bipolares o unipolares.
- Comunicación con el módulo master por RS485.

Esto es a lo que hardware se refiere....


----------



## eviltools (Oct 24, 2010)

Woraless! mnuy interesante, mira aki te dejo mis archivos con el cual controlo a los motores pap, por el momento los motores los tengo simulados con leds, en cuanto termine de armar el mega circuito de potencia (el cual haré con mocs y triacs mmm serias 12 de esos) Lo subire junto con todo. El programa de control aun no lo hago, tome prestado el que tu tienes para el ejemplo 2 HID, esta probado en real y en simulacion,

Pues apenas me iniciare con C# o VB.net, baje un ejemplo que posteaste hace tiempo poero aun no le meto mano, encuanto salga de examenes le hechare un vistazo!, y como vas con la programacion de ese proyecto?


----------



## Moyano Jonathan (Oct 24, 2010)

Bien con la programación voy perfecto , aunque tengo el proyecto al mismo nivel que el tuyo....le falta bastante aún para que haga lo que yo quiero pero de a poco se va a ir terminando.


----------



## eviltools (Oct 31, 2010)

Moyano Jonathan dijo:


> Hola a todos , me puse a diseñar la interfaz gráfica para el manejo de la entrenadora que tiene todo lo necesario para experimentar las interfaces básicas a través de USB como:
> 
> - Entradas analógicas.
> - Entradas digitales.
> ...



Maestro Moyano! quisiera pedirle de favor si tendra los archivos del firmware de este ejemplo y si tambn tiene el ejecutable de este mismo ejemplo. De ante mano muchas gracias!

Antonio ITSLP


----------



## Meta (Nov 1, 2010)

Si est´qa diseñada para C# 2008, adáptalo para el 2010 que va mejor.

Lo bueno es hacer un mini manual rápido a PDF de cómo de C# y USB de al menos como controlar o encender apagar 8 LED e incluso controlar el CAD. Así se podrá sacar una idea rápida.


----------



## Moyano Jonathan (Nov 1, 2010)

Meta Visual C# 2010 no está recomendado para nuevos diseños con USB usando los metodos hasta ahora explicado por que han cambiado muchas cosas en la sintaxis del lenguaje. Mejor usar C# 2008.
Lo de presentar un pdf para una aplicación básica me parece interesante..dejame que lo piense.


----------



## Meta (Nov 1, 2010)

No lo sabía, con razón que siempre estás con el 2008. Seguiré tu consejo. 
En cuanto al PDF rápido, si decides aventurarte, estaré contigo.


----------



## eviltools (Nov 1, 2010)

HOla! pues estaria rebonito que hicieras ese manual! .

Espero estas vacaciones hacer y modificar con fines educativos tus ejemplos! la verdad no he podido agregar mas pulsadores y que aparezca la combinacion cuando dos o mas son pulsados ala vez, pues en el ejemplo solo funciona cuando pulsas uno por vez.

ademas no se si tenbgas por ahi un ejemplo con el 4550? y he estado buscando el ejemplo del C# pero nada mas esta el codigo del programa de control pero del firmware nada, lastima que el tiempo vuele kiero hacer mil cosas pero entre la escuela y los examenes me queda muy poko, jejej, Saludos desde San Luis Potosi, Mexico! 

de su amigo, alumno y seguidor !

eviltools!


----------



## Meta (Nov 1, 2010)

Si ese manual se hace, ya que es pequeño se podrá hacer modificaciones que dices y para C# 2010 que tengo intenciones de adaptarlo.


----------



## Moyano Jonathan (Nov 1, 2010)

El manual ya lo comencé para que ustedes puedan ir haciendo las aplicaciones y modificarlas a gusto...lo que les comento es que voy a utilizar mcHID.dll por lo que la aplicación no se si correrá bien en vista o win 7.
*APLICACIONES DE CONTROL MEDIANTE VISUAL C# y VB.net 2008*Bueno como les venía diciendo hace un tiempo que vengo escribiendo un manual que contenga todos los aspectos a tener en cuenta sobre el módulo USB del PIC18F2550 y como manejar dispositivos mediante aplicaciones de control en la PC. Por motivos varios este manual aún se encuentra en desarrollo y constante cambio asi que para no aturdir a los lectores prefiero publicar algo en el momento en que crea yo que está terminado.

Como he visto que muchos usuarios del foro necesitan manejar sus dispositivos mediante USB usando los lenguajes VC# y VB.net acá voy a empezar a desarrollar un pequeño tutorial que muestra como escribir una pequeña aplicación de control base para desarrollos de proyectos mas grandes.

Como base de nuestro proyecto vamos a necesitar algunas herramientas software ya conocidas:
- *Windows XP,Vista, SEVEN.*
- *Visual Studio 2008.*
- *CCS compiler (Alguna versión estable antes de que sacaran el stack para PIC24...recomiendo ampliamente la 4.025).
- MPLAB IDE.
- Proteus VSM ( Versión que tenga USBCONN para las simulaciones con USB ).
- EasyHID
*
Con estas herramientas van a poder crear las diferentes aplicaciones de control para tu proyecto.


Como también vamos a necesitar algunas herramientas hardware:

*- Programdor PICKIT2 USB.
- Placa de desarrollo o montaje experimental para hacer las diferentes prácticas mencionadas.
- Fuente de alimentación.*
Con esto ya estamos en condiciones de empezar a desarrollar nuestras primeras aplicaciones._*|° paso: Definir una plataforma hardware:
*[/size]_Yo por mi parte ya defini que plataforma hardware usar: https://www.forosdeelectronica.com/f24/placa-desarrollo-multiprosito-usb-pic28-17281/index2.html


----------



## Meta (Nov 2, 2010)

Enlaces:

- *Visual Studio 2008.
- Foro oficial Visual Studio .NET
* - *CCS compiler (Alguna versión estable antes de que sacaran el stack para PIC24...recomiendo ampliamente la 4.025).
- MPLAB IDE.
- Proteus VSM ( Versión que tenga USBCONN para las simulaciones con USB ).
- EasyHID*

Gracias por tomas esta decisión con gran presición.


----------



## lubeck (Nov 2, 2010)

como funciona eso del vsm???
tengo el proteus 7.7 sp2, ese no lo trae??? , no lo he visto??? o es una herramienta separada???


----------



## Meta (Nov 2, 2010)

Si es la profesional si lo trae.


----------



## lubeck (Nov 2, 2010)

sip... si tengo la profesional...

y como se sabe si trae esto:
Versión que tenga USBCONN para las simulaciones con USB

ya lo encontre!!!


----------



## Meta (Nov 2, 2010)

Buenas.

Ahora la gente sabe lo que es si no lo sabían.

Lo más probable es que en el manual se explique con fotos paso a paso, más o menos como lo hago yo con mis manuales. Vamos a ver como se hará.


----------



## Moyano Jonathan (Nov 2, 2010)

*CREANDO LA APLICACIÓN PARA LA PC:
*Antes de ponernos a explicar como es por dentro la aplicación tenemos que ver cuales serán las variables de salida y cuales las de entrada. En mi placa de desarrollo USB tengo:

- 8 x salidas digitales multiplexadas.
- 8 x entradas digitales multiplexadas.
- 3 x entradas analógicas con potenciómetros.
- 1 x Memoria EEPROM I2C.
- 1 x RS232 para debug.

Con estos datos ya podemos empezar a crear nuestra aplicación.

Para nuestro primer ejemplo debemos abrir el Visual Studio y crear un formulario de aplicación para Windows.


----------



## Meta (Nov 2, 2010)

Qué rápidez, qué ilusión, que energía, que fuerza, así se hace.

No esperaba que fuera paso a paso tan rápido, es bueno hacerlo así ya que poco a poco se puede hablar partes por partes si hay esa cuestión. Al final un buen PDF de la recopilación.

Dices que las sintaxis cambia, en C# 2008 no lo se, en VB .net 2008 lo sabes usted. Intentaré hacerlo en paralelo con C# 2010 (ya lo pasaré a VB .net 2010). Me encargaré lo de las sintaxis nuevas.

Sigue así. Me estoy empezando a emocionar, y eso que cada vez hay más gente interesado con el tema del USB.


----------



## lubeck (Nov 2, 2010)

mmm.. la verdad es que lo que yo no logro hacer... es simularlo...
hago la aplicacion  en basic... y todo bien....
hago el esquema en proteus... y todo bien...
hago el archivo hex... y todo bien...
el problema es que no se enlazan... estare pendiente de esa parte....


----------



## Meta (Nov 2, 2010)

En todo este tema está bien explicado por ahí así que a buscarlo. De todas formas en el nuevo manual rápido se hará paso a paso bien explicadito. Paciencia, el manual a empezado.


----------



## lubeck (Nov 2, 2010)

> En todo este tema está bien explicado por ahí así que a buscarlo



1280 mensajes.... mmmm... me espero!!! jeje...


----------



## Meta (Nov 2, 2010)

Hay buscador. Empieza a poner palabras técnicas que en unos buenos minutos quizás encuentres. Se como te sientes, por eso aconsejé un manual rápido.

Lo bueno que tiene, todo lo que me interesa.

_- 8 x salidas digitales multiplexadas.
- 8 x entradas digitales multiplexadas.
- 3 x entradas analógicas con potenciómetros.
- 1 x Memoria EEPROM I2C.
- 1 x RS232 para debug._

Ya explicará la parte del controlador del PIC USB y lo que haga falta. jeje. Lo bueno es que es muy práctico y la gente le encanta.


----------



## Moyano Jonathan (Nov 2, 2010)

Bueno me alegro que les interese el tema , el tema se irá desarrollando paso a paso para que todo el mundo entienda como funciona todo 

Bueno como habiamos dicho antes tenemos que empezar a poner nuestros controles dentro de la aplicación.






Esta es la apariencia básica que tendría que tener el programa, como vemos tenemos las entradas analógicas, las entradas digitales y las salidas digitales dispuestas como botones.
La ventana de configuración del puerto USB y la ventana de manejo de la eeprom externa van a estar en otra pestaña que luego crearemos y configuraremos.

*meta: *Quisiera que me contaras como hiciste en esta aplicación la separación por pestañas:





Bueno hasta ahora tenemos la ventana básica, luego le agregaremos más controles para realizar más funciones.


----------



## Meta (Nov 2, 2010)

Ahora mismo lo hago con fotos. Espera por favor...


























¿Todo en orden?


----------



## Moyano Jonathan (Nov 2, 2010)

Bueno ahora voy a modificar mi aplicación para que queden más ordenado los controles , gracias meta


----------



## Meta (Nov 3, 2010)

De nada campeón. 

Sólo tienes que insertar el control de las pestañas y poner encima los elementos que ya tienes creado. Arrastrar y soltar. No tienes que escribir ni una sóla línea de código.

Vamos a ver como te queda.
Suerte...


----------



## Moyano Jonathan (Nov 3, 2010)

Bueno acá está aproximadamente lo que sería la interfaz gráfica. Si alguien tiene algo que le quisiera agregar comentelo para ponerlo.

Algo que me gustaría averiguar es como hacer el siguiente control:




Esto vendría siendo donde se carga el programa a guardar en la eeprom externa.


----------



## lubeck (Nov 3, 2010)

Mira este link...
http://www.codeproject.com/KB/edit/hexeditor.aspx
no se si sea de paga para registrarse y bajarlo...


----------



## ByAxel (Nov 3, 2010)

Genial @moyano-jonathan...



> Algo que me gustaría averiguar es como hacer el siguiente control:


Parece un GridView y lo bueno de un archivo *.Hex es que toda la info está en ASCII que fácilmente se puede leer Intel HEX; usando esa codificación puedes mostrar el archivo *.Hex en un GridView.



> no se si sea de paga para registrarse y bajarlo...


el registro es gratis.

saludos.


----------



## Meta (Nov 3, 2010)

Buenas:

Lo pregunté en el foro oficial de MSDN por si acaso nos ayude a dar con pistas.

http://social.msdn.microsoft.com/Forums/es-ES/vbes/thread/b4d43dfd-eb2a-4423-823b-de5e85d6bcb8

Saludo.

Edito:


----------



## Moyano Jonathan (Nov 3, 2010)

A mi me está funcionando bien...que raro vos usas VS2010 ?


----------



## lubeck (Nov 3, 2010)

a mi tambien me funciono bien....


----------



## Meta (Nov 3, 2010)

*Me funcionó al principio*. No tengo intslado el VB .net 2008 ni el 2010. Me salió una ventana al pinchar el proyecto y me salió una ventana que es la que vez y podía ejecutar al principio tu aplicación. Algo toqué, seguro.


----------



## Moyano Jonathan (Nov 3, 2010)

Un pregunta , bajé el proyecto ese que pusieron más arriba....en la carpeta aparece un control .OCX....como hago para utilizar el control (está hecho en VB 6.0) en mi aplicación de VB.net ?


----------



## Meta (Nov 3, 2010)

Por lo que tengo entendido, no funciona con VB .net, no tiene nada que ver. Para VB 6 si.


----------



## lubeck (Nov 3, 2010)

Sip. si funcionan los de vb6.0 en net ya sea basic o C o bueno yo he hecho ocx y si me funcionan...
solo pon en agregar componente y la ruta y listo... aparece el control


----------



## Moyano Jonathan (Nov 3, 2010)

El tema es que se puede pero nunca usé un control .OCX en VB.net...


----------



## Meta (Nov 3, 2010)

JAjaaj, es verdad. Hay que añadir este objeto en referencias y ponerle IMPORT.


----------



## Moyano Jonathan (Nov 3, 2010)

Al tratar de añadir la referencia me tiró este error:




Me parece que va a ser más sencillo usar el datagridview de vb.net..


----------



## lubeck (Nov 3, 2010)

es que no es una referencia...
en los controles dale click derecho y aparece un popup que tiene una opcion agregar elemento o algo asi...
las referencias son las librerias generalmente dll


----------



## Meta (Nov 3, 2010)

Mira esto:







http://sourceforge.net/projects/hexbox/

Saludo.


----------



## lubeck (Nov 3, 2010)

Oooopp se me olvido...
generalmente aparece una ventana  con dos pestañas es en la que dice componentes COM creo jiji hace mucho que no lo hago....
por si sirve...


----------



## Meta (Nov 3, 2010)

Estamos otra vez en épocas de investigación...

Adelante muchac@s...


----------



## Moyano Jonathan (Nov 3, 2010)

Y si queda investigar....he visto en proyectos con PIC como crean un arreglo con los datos de la memoria y los vuelcan en una matriz sin necesidad de usar ningún control específico...dejenme que vea como pueda lograr eso....
*meta: Voy a ver como implementarlo con el proyecto que subiste tambien.*


----------



## lubeck (Nov 3, 2010)

mmmm... yo no entendi eso de la matriz a que te refieres...????
que no es muy sencillo??


----------



## Meta (Nov 3, 2010)

Por lo que le entiendo, se refiere cadena de bytes en para transportar datos del .hex a la EEPROM.


----------



## lubeck (Nov 3, 2010)

mmm.... la verdad me perdi...
eso en visual????
a ver segun entiendo el micro se conecta al pc y transfiere cualquier dato no???
envias con el programa esos datos del eeprom y lo capturas en una matriz previamente definida con el DIM o estoy lejos... lejisimos


----------



## Meta (Nov 3, 2010)

La matriz de byte puede ser una cadena de byte que es la información que transportará a la EEPROM. El USB lo hace y se le conoce como tramas de datos.


----------



## lubeck (Nov 3, 2010)

mmm.. mas o menos entiendo...a ver si mas delante me queda un poco mas claro...
gracias por la aclaración meta...


----------



## Moyano Jonathan (Nov 3, 2010)

Bueno acá les dejo la interfaz gráfica final .....solo hay que hacerle retoques estéticos 

Algo que tengo que comentar sobre la funcionalidad:

- Voy a usar parte del código fuente del Pickit2 para utilizarlo en la parte de GRABACIÓN/LECTURA/BORRADO de la EEPROM (tengo que estudiar el código).

- Como actualización he decidido usar el HIDclass de Microchip como enlace de comunicaciones para tener compatibilidad en Windows 7 y Vista de 32 bits.

- La visualización del .HEX en el programa se le voy a copiar al pickit2 asi como el algoritmo de transferencia de datos.

En si la aplicación parece sencilla pero su desarrollo si lo hacemos en conjunto va a llevar algún tiempo para que funcione al 100%.

Sobre el firmware:

- Espero que las primeras versiones del firmware estén hechas sobre HID en CCS, pero espero que estudiando un poco el C18 también pueda crear la aplicación con ese compilador.

Sobre el hardware:

- En esta semana subo el esquema de la placa que uso yo para mis desarrollos con USB asi todos pueden simularla i/o armarla a su gusto.


----------



## Meta (Nov 4, 2010)

Moyano Jonathan dijo:


> Bueno acá les dejo la interfaz gráfica final .....solo hay que hacerle retoques estéticos
> 
> _Se puede mejorar al final cuando ya lo quieres pulir. Por ahora está muy bien cuando pusiste las pestañas._
> 
> ...



_No tienes que hacerme caso, es una sugerencia y te quita algo de estrés desde el inicio a parte de tener más libertad. Luego podrás aumentar sus posibilidades.

Suerte con el proyecto._


----------



## ByAxel (Nov 4, 2010)

Solo como sugerencia: El USB HID Bootloader de microchip también es de código abierto; lenguaje Visual C++. Funciona hasta en el Win7, pero no lo he probado en uno de 64bits.

PD: Si sale para el C18, lo puedo migrar al Hi-Tech C.

saludos


----------



## Meta (Nov 6, 2010)

Moyano. ¿Te ha pasado algo?


----------



## Moyano Jonathan (Nov 6, 2010)

No meta estoy probando el HIDclass de microchip y el HID de windows....tengo que hacer que me reconozca el dispositivo antes de que pueda empezar con las pruebas.
En cuanto tenga algo lo posteo ...quizás en estos días no me aparezca mucho por los estudios pero ya voy a avanzar más.


----------



## Meta (Nov 6, 2010)

Ok. Pensé que te ofendí en algo. Ya aparecerás con más avances.


----------



## Moyano Jonathan (Nov 6, 2010)

Bueno viendo un poco el ejemplo de microchip encontré que es bastante simple como lo plantea...solo es cuestión de leer:
Primero veamos un poco la interfaz...





Bueno acá muestra 3 puntos básicos dentro de la interfaz:

1° - Muestra una ventana de texto donde imprime los diferentes estados de la aplicación.
2° - Hay un botón donde al presionar enviamos datos.
3° - Hay una barra de desplazamiento donde se muestra el valor de un dato entrante, en este caso de un potenciómentro.

Ahora veamos el código fuente completo:

```
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using Microsoft.Win32.SafeHandles;
using System.Runtime.InteropServices;
using System.Threading;


namespace HID_PnP_Demo
{
    public partial class Form1 : Form
    {

        //-------------------------------------------------------------------------------------------------------------------------------------------------------------------
        //-------------------------------------------------------BEGIN CUT AND PASTE BLOCK-----------------------------------------------------------------------------------

        //Constant definitions from setupapi.h, which we aren't allowed to include directly since this is C#
        internal const uint DIGCF_PRESENT = 0x02;
        internal const uint DIGCF_DEVICEINTERFACE = 0x10;
        //Constants for CreateFile() and other file I/O functions
        internal const short FILE_ATTRIBUTE_NORMAL = 0x80;
        internal const short INVALID_HANDLE_VALUE = -1;
        internal const uint GENERIC_READ = 0x80000000;
        internal const uint GENERIC_WRITE = 0x40000000;
        internal const uint CREATE_NEW = 1;
        internal const uint CREATE_ALWAYS = 2;
        internal const uint OPEN_EXISTING = 3;
        internal const uint FILE_SHARE_READ = 0x00000001;
        internal const uint FILE_SHARE_WRITE = 0x00000002;
        //Constant definitions for certain WM_DEVICECHANGE messages
        internal const uint WM_DEVICECHANGE = 0x0219;
        internal const uint DBT_DEVICEARRIVAL = 0x8000;
        internal const uint DBT_DEVICEREMOVEPENDING = 0x8003;
        internal const uint DBT_DEVICEREMOVECOMPLETE = 0x8004;
        internal const uint DBT_CONFIGCHANGED = 0x0018;
        //Other constant definitions
        internal const uint DBT_DEVTYP_DEVICEINTERFACE = 0x05;
        internal const uint DEVICE_NOTIFY_WINDOW_HANDLE = 0x00;
        internal const uint ERROR_SUCCESS = 0x00;
        internal const uint ERROR_NO_MORE_ITEMS = 0x00000103;
        internal const uint SPDRP_HARDWAREID = 0x00000001;

        //Various structure definitions for structures that this code will be using
        internal struct SP_DEVICE_INTERFACE_DATA
        {
            internal uint cbSize;               //DWORD
            internal Guid InterfaceClassGuid;   //GUID
            internal uint Flags;                //DWORD
            internal uint Reserved;             //ULONG_PTR MSDN says ULONG_PTR is "typedef unsigned __int3264 ULONG_PTR;"  
        }

        internal struct SP_DEVICE_INTERFACE_DETAIL_DATA
        {
            internal uint cbSize;               //DWORD
            internal char[] DevicePath;         //TCHAR array of any size
        }
        
        internal struct SP_DEVINFO_DATA
        {
            internal uint cbSize;       //DWORD
            internal Guid ClassGuid;    //GUID
            internal uint DevInst;      //DWORD
            internal uint Reserved;     //ULONG_PTR  MSDN says ULONG_PTR is "typedef unsigned __int3264 ULONG_PTR;"  
        }

        internal struct DEV_BROADCAST_DEVICEINTERFACE
        {
            internal uint dbcc_size;            //DWORD
            internal uint dbcc_devicetype;      //DWORD
            internal uint dbcc_reserved;        //DWORD
            internal Guid dbcc_classguid;       //GUID
            internal char[] dbcc_name;          //TCHAR array
        }

        //DLL Imports.  Need these to access various C style unmanaged functions contained in their respective DLL files.
        //--------------------------------------------------------------------------------------------------------------
        //Returns a HDEVINFO type for a device information set.  We will need the 
        //HDEVINFO as in input parameter for calling many of the other SetupDixxx() functions.
        [DllImport("setupapi.dll", SetLastError = true, CharSet = CharSet.Unicode)]
        internal static extern IntPtr SetupDiGetClassDevs(
            ref Guid ClassGuid,     //LPGUID    Input: Need to supply the class GUID. 
            IntPtr Enumerator,      //PCTSTR    Input: Use NULL here, not important for our purposes
            IntPtr hwndParent,      //HWND      Input: Use NULL here, not important for our purposes
            uint Flags);            //DWORD     Input: Flags describing what kind of filtering to use.

        //Gives us "PSP_DEVICE_INTERFACE_DATA" which contains the Interface specific GUID (different
        //from class GUID).  We need the interface GUID to get the device path.
        [DllImport("setupapi.dll", SetLastError = true, CharSet = CharSet.Unicode)]
        internal static extern bool SetupDiEnumDeviceInterfaces(
            IntPtr DeviceInfoSet,           //Input: Give it the HDEVINFO we got from SetupDiGetClassDevs()
            IntPtr DeviceInfoData,          //Input (optional)
            ref Guid InterfaceClassGuid,    //Input 
            uint MemberIndex,               //Input: "Index" of the device you are interested in getting the path for.
            ref SP_DEVICE_INTERFACE_DATA DeviceInterfaceData);    //Output: This function fills in an "SP_DEVICE_INTERFACE_DATA" structure.

        //SetupDiDestroyDeviceInfoList() frees up memory by destroying a DeviceInfoList
        [DllImport("setupapi.dll", SetLastError = true, CharSet = CharSet.Unicode)]
        internal static extern bool SetupDiDestroyDeviceInfoList(
            IntPtr DeviceInfoSet);          //Input: Give it a handle to a device info list to deallocate from RAM.

        //SetupDiEnumDeviceInfo() fills in an "SP_DEVINFO_DATA" structure, which we need for SetupDiGetDeviceRegistryProperty()
        [DllImport("setupapi.dll", SetLastError = true, CharSet = CharSet.Unicode)]
        internal static extern bool SetupDiEnumDeviceInfo(
            IntPtr DeviceInfoSet,
            uint MemberIndex,
            ref SP_DEVINFO_DATA DeviceInterfaceData);

        //SetupDiGetDeviceRegistryProperty() gives us the hardware ID, which we use to check to see if it has matching VID/PID
        [DllImport("setupapi.dll", SetLastError = true, CharSet = CharSet.Unicode)]
        internal static extern bool SetupDiGetDeviceRegistryProperty(
            IntPtr DeviceInfoSet,
            ref SP_DEVINFO_DATA DeviceInfoData,
            uint Property,
            ref uint PropertyRegDataType,
            IntPtr PropertyBuffer,
            uint PropertyBufferSize,
            ref uint RequiredSize);

        //SetupDiGetDeviceInterfaceDetail() gives us a device path, which is needed before CreateFile() can be used.
        [DllImport("setupapi.dll", SetLastError = true, CharSet = CharSet.Unicode)]
        internal static extern bool SetupDiGetDeviceInterfaceDetail(
            IntPtr DeviceInfoSet,                   //Input: Wants HDEVINFO which can be obtained from SetupDiGetClassDevs()
            ref SP_DEVICE_INTERFACE_DATA DeviceInterfaceData,                    //Input: Pointer to an structure which defines the device interface.  
            IntPtr  DeviceInterfaceDetailData,      //Output: Pointer to a SP_DEVICE_INTERFACE_DETAIL_DATA structure, which will receive the device path.
            uint DeviceInterfaceDetailDataSize,     //Input: Number of bytes to retrieve.
            ref uint RequiredSize,                  //Output (optional): The number of bytes needed to hold the entire struct 
            IntPtr DeviceInfoData);                 //Output (optional): Pointer to a SP_DEVINFO_DATA structure

        //Overload for SetupDiGetDeviceInterfaceDetail().  Need this one since we can't pass NULL pointers directly in C#.
        [DllImport("setupapi.dll", SetLastError = true, CharSet = CharSet.Unicode)]
        internal static extern bool SetupDiGetDeviceInterfaceDetail(
            IntPtr DeviceInfoSet,                   //Input: Wants HDEVINFO which can be obtained from SetupDiGetClassDevs()
            ref SP_DEVICE_INTERFACE_DATA DeviceInterfaceData,               //Input: Pointer to an structure which defines the device interface.  
            IntPtr DeviceInterfaceDetailData,       //Output: Pointer to a SP_DEVICE_INTERFACE_DETAIL_DATA structure, which will contain the device path.
            uint DeviceInterfaceDetailDataSize,     //Input: Number of bytes to retrieve.
            IntPtr RequiredSize,                    //Output (optional): Pointer to a DWORD to tell you the number of bytes needed to hold the entire struct 
            IntPtr DeviceInfoData);                 //Output (optional): Pointer to a SP_DEVINFO_DATA structure

        //Need this function for receiving all of the WM_DEVICECHANGE messages.  See MSDN documentation for
        //description of what this function does/how to use it. Note: name is remapped "RegisterDeviceNotificationUM" to
        //avoid possible build error conflicts.
        [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
        internal static extern IntPtr RegisterDeviceNotification(
            IntPtr hRecipient,
            IntPtr NotificationFilter,
            uint Flags);

        //Takes in a device path and opens a handle to the device.
        [DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
        static extern SafeFileHandle CreateFile(
            string lpFileName,
            uint dwDesiredAccess,
            uint dwShareMode, 
            IntPtr lpSecurityAttributes, 
            uint dwCreationDisposition,
            uint dwFlagsAndAttributes, 
            IntPtr hTemplateFile);

        //Uses a handle (created with CreateFile()), and lets us write USB data to the device.
        [DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
        static extern bool WriteFile(
            SafeFileHandle hFile,
            byte[] lpBuffer,
            uint nNumberOfBytesToWrite,
            ref uint lpNumberOfBytesWritten,
            IntPtr lpOverlapped);

        //Uses a handle (created with CreateFile()), and lets us read USB data from the device.
        [DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
        static extern bool ReadFile(
            SafeFileHandle hFile,
            IntPtr lpBuffer,
            uint nNumberOfBytesToRead,
            ref uint lpNumberOfBytesRead,
            IntPtr lpOverlapped);



        //--------------- Global Varibles Section ------------------
        //USB related variables that need to have wide scope.
        bool AttachedState = false;                        //Need to keep track of the USB device attachment status for proper plug and play operation.
        bool AttachedButBroken = false;
        SafeFileHandle WriteHandleToUSBDevice = null;
        SafeFileHandle ReadHandleToUSBDevice = null;
        String DevicePath = null;   //Need the find the proper device path before you can open file handles.


        //Variables used by the application/form updates.
        bool PushbuttonPressed = false;        //Updated by ReadWriteThread, read by FormUpdateTimer tick handler (needs to be atomic)
        bool ToggleLEDsPending = false;        //Updated by ToggleLED(s) button click event handler, used by ReadWriteThread (needs to be atomic)
        uint ADCValue = 0;            //Updated by ReadWriteThread, read by FormUpdateTimer tick handler (needs to be atomic)

        //Globally Unique Identifier (GUID) for HID class devices.  Windows uses GUIDs to identify things.
        Guid InterfaceClassGuid = new Guid(0x4d1e55b2, 0xf16f, 0x11cf, 0x88, 0xcb, 0x00, 0x11, 0x11, 0x00, 0x00, 0x30); 
        //--------------- End of Global Varibles ------------------

        //-------------------------------------------------------END CUT AND PASTE BLOCK-------------------------------------------------------------------------------------
        //-------------------------------------------------------------------------------------------------------------------------------------------------------------------


        //Need to check "Allow unsafe code" checkbox in build properties to use unsafe keyword.  Unsafe is needed to
        //properly interact with the unmanged C++ style APIs used to find and connect with the USB device.
        public unsafe Form1()
        {
            InitializeComponent();

            //-------------------------------------------------------------------------------------------------------------------------------------------------------------------
            //-------------------------------------------------------BEGIN CUT AND PASTE BLOCK-----------------------------------------------------------------------------------
            //Additional constructor code

            //Initialize tool tips, to provide pop up help when the mouse cursor is moved over objects on the form.
            ANxVoltageToolTip.SetToolTip(this.ANxVoltage_lbl, "If using a board/PIM without a potentiometer, apply an adjustable voltage to the I/O pin.");
            ANxVoltageToolTip.SetToolTip(this.progressBar1, "If using a board/PIM without a potentiometer, apply an adjustable voltage to the I/O pin.");
            ToggleLEDToolTip.SetToolTip(this.ToggleLEDs_btn, "Sends a packet of data to the USB device.");
            PushbuttonStateTooltip.SetToolTip(this.PushbuttonState_lbl, "Try pressing pushbuttons on the USB demo board/PIM.");

            //Register for WM_DEVICECHANGE notifications.  This code uses these messages to detect plug and play connection/disconnection events for USB devices
            DEV_BROADCAST_DEVICEINTERFACE DeviceBroadcastHeader = new DEV_BROADCAST_DEVICEINTERFACE();
            DeviceBroadcastHeader.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE;
            DeviceBroadcastHeader.dbcc_size = (uint)Marshal.SizeOf(DeviceBroadcastHeader);
            DeviceBroadcastHeader.dbcc_reserved = 0;    //Reserved says not to use...
            DeviceBroadcastHeader.dbcc_classguid = InterfaceClassGuid;

            //Need to get the address of the DeviceBroadcastHeader to call RegisterDeviceNotification(), but
            //can't use "&DeviceBroadcastHeader".  Instead, using a roundabout means to get the address by 
            //making a duplicate copy using Marshal.StructureToPtr().
            IntPtr pDeviceBroadcastHeader = IntPtr.Zero;  //Make a pointer.
            pDeviceBroadcastHeader = Marshal.AllocHGlobal(Marshal.SizeOf(DeviceBroadcastHeader)); //allocate memory for a new DEV_BROADCAST_DEVICEINTERFACE structure, and return the address 
            Marshal.StructureToPtr(DeviceBroadcastHeader, pDeviceBroadcastHeader, false);  //Copies the DeviceBroadcastHeader structure into the memory already allocated at DeviceBroadcastHeaderWithPointer
            RegisterDeviceNotification(this.Handle, pDeviceBroadcastHeader, DEVICE_NOTIFY_WINDOW_HANDLE);
 

            //Now make an initial attempt to find the USB device, if it was already connected to the PC and enumerated prior to launching the application.
            //If it is connected and present, we should open read and write handles to the device so we can communicate with it later.
            //If it was not connected, we will have to wait until the user plugs the device in, and the WM_DEVICECHANGE callback function can process
            //the message and again search for the device.
            if(CheckIfPresentAndGetUSBDevicePath())    //Check and make sure at least one device with matching VID/PID is attached
            {
                uint ErrorStatusWrite;
                uint ErrorStatusRead;


                //We now have the proper device path, and we can finally open read and write handles to the device.
                WriteHandleToUSBDevice = CreateFile(DevicePath, GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, IntPtr.Zero, OPEN_EXISTING, 0, IntPtr.Zero);
                ErrorStatusWrite = (uint)Marshal.GetLastWin32Error();
                ReadHandleToUSBDevice = CreateFile(DevicePath, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, IntPtr.Zero, OPEN_EXISTING, 0, IntPtr.Zero);
                ErrorStatusRead = (uint)Marshal.GetLastWin32Error();

                if((ErrorStatusWrite == ERROR_SUCCESS) && (ErrorStatusRead == ERROR_SUCCESS))
                {
                    AttachedState = true;        //Let the rest of the PC application know the USB device is connected, and it is safe to read/write to it
                    AttachedButBroken = false;
                    StatusBox_txtbx.Text = "Device Found, AttachedState = TRUE";
                }
                else //for some reason the device was physically plugged in, but one or both of the read/write handles didn't open successfully...
                {
                    AttachedState = false;        //Let the rest of this application known not to read/write to the device.
                    AttachedButBroken = true;    //Flag so that next time a WM_DEVICECHANGE message occurs, can retry to re-open read/write pipes
                    if(ErrorStatusWrite == ERROR_SUCCESS)
                        WriteHandleToUSBDevice.Close();
                    if(ErrorStatusRead == ERROR_SUCCESS)
                        ReadHandleToUSBDevice.Close();
                }
            }
            else    //Device must not be connected (or not programmed with correct firmware)
            {
                AttachedState = false;
                AttachedButBroken = false;
            }

            if (AttachedState == true)
            {
                StatusBox_txtbx.Text = "Device Found, AttachedState = TRUE";
            }
            else
            {
                StatusBox_txtbx.Text = "Device not found, verify connect/correct firmware";
            }

            ReadWriteThread.RunWorkerAsync();    //Recommend performing USB read/write operations in a separate thread.  Otherwise,
                                                //the Read/Write operations are effectively blocking functions and can lock up the
                                                //user interface if the I/O operations take a long time to complete.

            //-------------------------------------------------------END CUT AND PASTE BLOCK-------------------------------------------------------------------------------------
            //-------------------------------------------------------------------------------------------------------------------------------------------------------------------
        }


        //-------------------------------------------------------------------------------------------------------------------------------------------------------------------
        //-------------------------------------------------------BEGIN CUT AND PASTE BLOCK-----------------------------------------------------------------------------------

        //FUNCTION:    CheckIfPresentAndGetUSBDevicePath()
        //PURPOSE:    Check if a USB device is currently plugged in with a matching VID and PID
        //INPUT:    Uses globally declared String DevicePath, globally declared GUID, and the MY_DEVICE_ID constant.
        //OUTPUT:    Returns BOOL.  TRUE when device with matching VID/PID found.  FALSE if device with VID/PID could not be found.
        //            When returns TRUE, the globally accessable "DetailedInterfaceDataStructure" will contain the device path
        //            to the USB device with the matching VID/PID.

        bool CheckIfPresentAndGetUSBDevicePath()
        {
            /* 
            Before we can "connect" our application to our USB embedded device, we must first find the device.
            A USB bus can have many devices simultaneously connected, so somehow we have to find our device only.
            This is done with the Vendor ID (VID) and Product ID (PID).  Each USB product line should have
            a unique combination of VID and PID.  

            Microsoft has created a number of functions which are useful for finding plug and play devices.  Documentation
            for each function used can be found in the MSDN library.  We will be using the following functions (unmanaged C functions):

            SetupDiGetClassDevs()                    //provided by setupapi.dll, which comes with Windows
            SetupDiEnumDeviceInterfaces()            //provided by setupapi.dll, which comes with Windows
            GetLastError()                            //provided by kernel32.dll, which comes with Windows
            SetupDiDestroyDeviceInfoList()            //provided by setupapi.dll, which comes with Windows
            SetupDiGetDeviceInterfaceDetail()        //provided by setupapi.dll, which comes with Windows
            SetupDiGetDeviceRegistryProperty()        //provided by setupapi.dll, which comes with Windows
            CreateFile()                            //provided by kernel32.dll, which comes with Windows

            In order to call these unmanaged functions, the Marshal class is very useful.
             
            We will also be using the following unusual data types and structures.  Documentation can also be found in
            the MSDN library:

            PSP_DEVICE_INTERFACE_DATA
            PSP_DEVICE_INTERFACE_DETAIL_DATA
            SP_DEVINFO_DATA
            HDEVINFO
            HANDLE
            GUID

            The ultimate objective of the following code is to get the device path, which will be used elsewhere for getting
            read and write handles to the USB device.  Once the read/write handles are opened, only then can this
            PC application begin reading/writing to the USB device using the WriteFile() and ReadFile() functions.

            Getting the device path is a multi-step round about process, which requires calling several of the
            SetupDixxx() functions provided by setupapi.dll.
            */

            try
            {
                IntPtr DeviceInfoTable = IntPtr.Zero;
                SP_DEVICE_INTERFACE_DATA InterfaceDataStructure = new SP_DEVICE_INTERFACE_DATA();
                SP_DEVICE_INTERFACE_DETAIL_DATA DetailedInterfaceDataStructure = new SP_DEVICE_INTERFACE_DETAIL_DATA();
                SP_DEVINFO_DATA DevInfoData = new SP_DEVINFO_DATA();

                uint InterfaceIndex = 0;
                uint dwRegType = 0;
                uint dwRegSize = 0;
                uint dwRegSize2 = 0;
                uint StructureSize = 0;
                IntPtr PropertyValueBuffer = IntPtr.Zero;
                bool MatchFound = false;
                uint ErrorStatus;
                uint LoopCounter = 0;

                //Use the formatting: "Vid_xxxx&Pid_xxxx" where xxxx is a 16-bit hexadecimal number.
                //Make sure the value appearing in the parathesis matches the USB device descriptor
                //of the device that this aplication is intending to find.
                String DeviceIDToFind = "Vid_04d8&Pid_003f";

                //First populate a list of plugged in devices (by specifying "DIGCF_PRESENT"), which are of the specified class GUID. 
                DeviceInfoTable = SetupDiGetClassDevs(ref InterfaceClassGuid, IntPtr.Zero, IntPtr.Zero, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE);

                if(DeviceInfoTable != IntPtr.Zero)
                {
                    //Now look through the list we just populated.  We are trying to see if any of them match our device. 
                    while(true)
                    {
                        InterfaceDataStructure.cbSize = (uint)Marshal.SizeOf(InterfaceDataStructure);
                        if(SetupDiEnumDeviceInterfaces(DeviceInfoTable, IntPtr.Zero, ref InterfaceClassGuid, InterfaceIndex, ref InterfaceDataStructure))
                        {
                            ErrorStatus = (uint)Marshal.GetLastWin32Error();
                            if (ErrorStatus == ERROR_NO_MORE_ITEMS)    //Did we reach the end of the list of matching devices in the DeviceInfoTable?
                            {    //Cound not find the device.  Must not have been attached.
                                SetupDiDestroyDeviceInfoList(DeviceInfoTable);    //Clean up the old structure we no longer need.
                                return false;        
                            }
                        }
                        else    //Else some other kind of unknown error ocurred...
                        {
                            ErrorStatus = (uint)Marshal.GetLastWin32Error();
                            SetupDiDestroyDeviceInfoList(DeviceInfoTable);    //Clean up the old structure we no longer need.
                            return false;    
                        }

                        //Now retrieve the hardware ID from the registry.  The hardware ID contains the VID and PID, which we will then 
                        //check to see if it is the correct device or not.

                        //Initialize an appropriate SP_DEVINFO_DATA structure.  We need this structure for SetupDiGetDeviceRegistryProperty().
                        DevInfoData.cbSize = (uint)Marshal.SizeOf(DevInfoData);
                        SetupDiEnumDeviceInfo(DeviceInfoTable, InterfaceIndex, ref DevInfoData);

                        //First query for the size of the hardware ID, so we can know how big a buffer to allocate for the data.
                        SetupDiGetDeviceRegistryProperty(DeviceInfoTable, ref DevInfoData, SPDRP_HARDWAREID, ref dwRegType, IntPtr.Zero, 0, ref dwRegSize);

                        //Allocate a buffer for the hardware ID.
                        //Should normally work, but could throw exception "OutOfMemoryException" if not enough resources available.
                        PropertyValueBuffer = Marshal.AllocHGlobal((int)dwRegSize);

                        //Retrieve the hardware IDs for the current device we are looking at.  PropertyValueBuffer gets filled with a 
                        //REG_MULTI_SZ (array of null terminated strings).  To find a device, we only care about the very first string in the
                        //buffer, which will be the "device ID".  The device ID is a string which contains the VID and PID, in the example 
                        //format "Vid_04d8&Pid_003f".
                        SetupDiGetDeviceRegistryProperty(DeviceInfoTable, ref DevInfoData, SPDRP_HARDWAREID, ref dwRegType, PropertyValueBuffer, dwRegSize, ref dwRegSize2);

                        //Now check if the first string in the hardware ID matches the device ID of the USB device we are trying to find.
                        String DeviceIDFromRegistry = Marshal.PtrToStringUni(PropertyValueBuffer); //Make a new string, fill it with the contents from the PropertyValueBuffer

                        Marshal.FreeHGlobal(PropertyValueBuffer);        //No longer need the PropertyValueBuffer, free the memory to prevent potential memory leaks

                        //Convert both strings to lower case.  This makes the code more robust/portable accross OS Versions
                        DeviceIDFromRegistry = DeviceIDFromRegistry.ToLowerInvariant();    
                        DeviceIDToFind = DeviceIDToFind.ToLowerInvariant();                
                        //Now check if the hardware ID we are looking at contains the correct VID/PID
                        MatchFound = DeviceIDFromRegistry.Contains(DeviceIDToFind);        
                        if(MatchFound == true)
                        {
                            //Device must have been found.  In order to open I/O file handle(s), we will need the actual device path first.
                            //We can get the path by calling SetupDiGetDeviceInterfaceDetail(), however, we have to call this function twice:  The first
                            //time to get the size of the required structure/buffer to hold the detailed interface data, then a second time to actually 
                            //get the structure (after we have allocated enough memory for the structure.)
                            DetailedInterfaceDataStructure.cbSize = (uint)Marshal.SizeOf(DetailedInterfaceDataStructure);
                            //First call populates "StructureSize" with the correct value
                            SetupDiGetDeviceInterfaceDetail(DeviceInfoTable, ref InterfaceDataStructure, IntPtr.Zero, 0, ref StructureSize, IntPtr.Zero);
                            //Need to call SetupDiGetDeviceInterfaceDetail() again, this time specifying a pointer to a SP_DEVICE_INTERFACE_DETAIL_DATA buffer with the correct size of RAM allocated.
                            //First need to allocate the unmanaged buffer and get a pointer to it.
                            IntPtr pUnmanagedDetailedInterfaceDataStructure = IntPtr.Zero;  //Declare a pointer.
                            pUnmanagedDetailedInterfaceDataStructure = Marshal.AllocHGlobal((int)StructureSize);    //Reserve some unmanaged memory for the structure.
                            DetailedInterfaceDataStructure.cbSize = 6; //Initialize the cbSize parameter (4 bytes for DWORD + 2 bytes for unicode null terminator)
                            Marshal.StructureToPtr(DetailedInterfaceDataStructure, pUnmanagedDetailedInterfaceDataStructure, false); //Copy managed structure contents into the unmanaged memory buffer.

                            //Now call SetupDiGetDeviceInterfaceDetail() a second time to receive the device path in the structure at pUnmanagedDetailedInterfaceDataStructure.
                            if (SetupDiGetDeviceInterfaceDetail(DeviceInfoTable, ref InterfaceDataStructure, pUnmanagedDetailedInterfaceDataStructure, StructureSize, IntPtr.Zero, IntPtr.Zero))
                            {
                                //Need to extract the path information from the unmanaged "structure".  The path starts at (pUnmanagedDetailedInterfaceDataStructure + sizeof(DWORD)).
                                IntPtr pToDevicePath = new IntPtr((uint)pUnmanagedDetailedInterfaceDataStructure.ToInt32() + 4);  //Add 4 to the pointer (to get the pointer to point to the path, instead of the DWORD cbSize parameter)
                                DevicePath = Marshal.PtrToStringUni(pToDevicePath); //Now copy the path information into the globally defined DevicePath String.
                                
                                //We now have the proper device path, and we can finally use the path to open I/O handle(s) to the device.
                                SetupDiDestroyDeviceInfoList(DeviceInfoTable);    //Clean up the old structure we no longer need.
                                Marshal.FreeHGlobal(pUnmanagedDetailedInterfaceDataStructure);  //No longer need this unmanaged SP_DEVICE_INTERFACE_DETAIL_DATA buffer.  We already extracted the path information.
                                return true;    //Returning the device path in the global DevicePath String
                            }
                            else //Some unknown failure occurred
                            {
                                uint ErrorCode = (uint)Marshal.GetLastWin32Error();
                                SetupDiDestroyDeviceInfoList(DeviceInfoTable);    //Clean up the old structure.
                                Marshal.FreeHGlobal(pUnmanagedDetailedInterfaceDataStructure);  //No longer need this unmanaged SP_DEVICE_INTERFACE_DETAIL_DATA buffer.  We already extracted the path information.
                                return false;    
                            }
                        }

                        InterfaceIndex++;    
                        //Keep looping until we either find a device with matching VID and PID, or until we run out of devices to check.
                        //However, just in case some unexpected error occurs, keep track of the number of loops executed.
                        //If the number of loops exceeds a very large number, exit anyway, to prevent inadvertent infinite looping.
                        LoopCounter++;
                        if(LoopCounter == 10000000)    //Surely there aren't more than 10 million devices attached to any forseeable PC...
                        {
                            return false;
                        }
                    }//end of while(true)
                }
                return false;
            }//end of try
            catch
            {
                //Something went wrong if PC gets here.  Maybe a Marshal.AllocHGlobal() failed due to insufficient resources or something.
                return false;    
            }
        }
        //-------------------------------------------------------END CUT AND PASTE BLOCK-------------------------------------------------------------------------------------
        //-------------------------------------------------------------------------------------------------------------------------------------------------------------------


        //-------------------------------------------------------------------------------------------------------------------------------------------------------------------
        //-------------------------------------------------------BEGIN CUT AND PASTE BLOCK-----------------------------------------------------------------------------------
        //This is a callback function that gets called when a Windows message is received by the form.
        //We will receive various different types of messages, but the ones we really want to use are the WM_DEVICECHANGE messages.
        protected override void WndProc(ref Message m)
        {
            if (m.Msg == WM_DEVICECHANGE)
            {
                if (((int)m.WParam == DBT_DEVICEARRIVAL) || ((int)m.WParam == DBT_DEVICEREMOVEPENDING) || ((int)m.WParam == DBT_DEVICEREMOVECOMPLETE) || ((int)m.WParam == DBT_CONFIGCHANGED))
                {
                    //WM_DEVICECHANGE messages by themselves are quite generic, and can be caused by a number of different
                    //sources, not just your USB hardware device.  Therefore, must check to find out if any changes relavant
                    //to your device (with known VID/PID) took place before doing any kind of opening or closing of handles/endpoints.
                    //(the message could have been totally unrelated to your application/USB device)

                    if (CheckIfPresentAndGetUSBDevicePath())    //Check and make sure at least one device with matching VID/PID is attached
                    {
                        //If executes to here, this means the device is currently attached and was found.
                        //This code needs to decide however what to do, based on whether or not the device was previously known to be
                        //attached or not.
                        if ((AttachedState == false) || (AttachedButBroken == true))    //Check the previous attachment state
                        {
                            uint ErrorStatusWrite;
                            uint ErrorStatusRead;

                            //We obtained the proper device path (from CheckIfPresentAndGetUSBDevicePath() function call), and it
                            //is now possible to open read and write handles to the device.
                            WriteHandleToUSBDevice = CreateFile(DevicePath, GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, IntPtr.Zero, OPEN_EXISTING, 0, IntPtr.Zero);
                            ErrorStatusWrite = (uint)Marshal.GetLastWin32Error();
                            ReadHandleToUSBDevice = CreateFile(DevicePath, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, IntPtr.Zero, OPEN_EXISTING, 0, IntPtr.Zero);
                            ErrorStatusRead = (uint)Marshal.GetLastWin32Error();

                            if ((ErrorStatusWrite == ERROR_SUCCESS) && (ErrorStatusRead == ERROR_SUCCESS))
                            {
                                AttachedState = true;        //Let the rest of the PC application know the USB device is connected, and it is safe to read/write to it
                                AttachedButBroken = false;
                                StatusBox_txtbx.Text = "Device Found, AttachedState = TRUE";
                            }
                            else //for some reason the device was physically plugged in, but one or both of the read/write handles didn't open successfully...
                            {
                                AttachedState = false;        //Let the rest of this application known not to read/write to the device.
                                AttachedButBroken = true;    //Flag so that next time a WM_DEVICECHANGE message occurs, can retry to re-open read/write pipes
                                if (ErrorStatusWrite == ERROR_SUCCESS)
                                    WriteHandleToUSBDevice.Close();
                                if (ErrorStatusRead == ERROR_SUCCESS)
                                    ReadHandleToUSBDevice.Close();
                            }
                        }
                        //else we did find the device, but AttachedState was already true.  In this case, don't do anything to the read/write handles,
                        //since the WM_DEVICECHANGE message presumably wasn't caused by our USB device.  
                    }
                    else    //Device must not be connected (or not programmed with correct firmware)
                    {
                        if (AttachedState == true)        //If it is currently set to true, that means the device was just now disconnected
                        {
                            AttachedState = false;
                            WriteHandleToUSBDevice.Close();
                            ReadHandleToUSBDevice.Close();
                        }
                        AttachedState = false;
                        AttachedButBroken = false;
                    }
                }
            } //end of: if(m.Msg == WM_DEVICECHANGE)

            base.WndProc(ref m);
        } //end of: WndProc() function
        //-------------------------------------------------------END CUT AND PASTE BLOCK-------------------------------------------------------------------------------------
        //-------------------------------------------------------------------------------------------------------------------------------------------------------------------




        private void ToggleLEDs_btn_Click(object sender, EventArgs e)
        {
            //-------------------------------------------------------------------------------------------------------------------------------------------------------------------
            //-------------------------------------------------------BEGIN CUT AND PASTE BLOCK-----------------------------------------------------------------------------------
            ToggleLEDsPending = true;    //Will get used asynchronously by the ReadWriteThread
            //-------------------------------------------------------END CUT AND PASTE BLOCK-------------------------------------------------------------------------------------
            //-------------------------------------------------------------------------------------------------------------------------------------------------------------------
    
        }

        private void ReadWriteThread_DoWork(object sender, DoWorkEventArgs e)
        {
            //-------------------------------------------------------------------------------------------------------------------------------------------------------------------
            //-------------------------------------------------------BEGIN CUT AND PASTE BLOCK-----------------------------------------------------------------------------------

            /*This thread does the actual USB read/write operations (but only when AttachedState == true) to the USB device.
            It is generally preferrable to write applications so that read and write operations are handled in a separate
            thread from the main form.  This makes it so that the main form can remain responsive, even if the I/O operations
            take a very long time to complete.

            Since this is a separate thread, this code below executes independently from the rest of the
            code in this application.  All this thread does is read and write to the USB device.  It does not update
            the form directly with the new information it obtains (such as the ANxx/POT Voltage or pushbutton state).
            The information that this thread obtains is stored in atomic global variables.
            Form updates are handled by the FormUpdateTimer Tick event handler function.

            This application sends packets to the endpoint buffer on the USB device by using the "WriteFile()" function.
            This application receives packets from the endpoint buffer on the USB device by using the "ReadFile()" function.
            Both of these functions are documented in the MSDN library.  Calling ReadFile() is a not perfectly straight
            foward in C# environment, since one of the input parameters is a pointer to a buffer that gets filled by ReadFile().
            The ReadFile() function is therefore called through a wrapper function ReadFileManagedBuffer().

            All ReadFile() and WriteFile() operations in this example project are synchronous.  They are blocking function
            calls and only return when they are complete, or if they fail because of some event, such as the user unplugging
            the device.  It is possible to call these functions with "overlapped" structures, and use them as non-blocking
            asynchronous I/O function calls.  

            Note:  This code may perform differently on some machines when the USB device is plugged into the host through a
            USB 2.0 hub, as opposed to a direct connection to a root port on the PC.  In some cases the data rate may be slower
            when the device is connected through a USB 2.0 hub.  This performance difference is believed to be caused by
            the issue described in Microsoft knowledge base article 940021:
            http://support.microsoft.com/kb/940021/en-us 

            Higher effective bandwidth (up to the maximum offered by interrupt endpoints), both when connected
            directly and through a USB 2.0 hub, can generally be achieved by queuing up multiple pending read and/or
            write requests simultaneously.  This can be done when using    asynchronous I/O operations (calling ReadFile() and
            WriteFile()    with overlapped structures).  The Microchip    HID USB Bootloader application uses asynchronous I/O
            for some USB operations and the source code can be used    as an example.*/


            Byte[] OUTBuffer = new byte[65];    //Allocate a memory buffer equal to the OUT endpoint size + 1
            Byte[] INBuffer = new byte[65];        //Allocate a memory buffer equal to the IN endpoint size + 1
            uint BytesWritten = 0;
            uint BytesRead = 0;

            while(true)
            {
                try
                {
                    if (AttachedState == true)    //Do not try to use the read/write handles unless the USB device is attached and ready
                    {
                        //Get ANxx/POT Voltage value from the microcontroller firmware.  Note: some demo boards may not have a pot
                        //on them.  In this case, the firmware may be configured to read an ANxx I/O pin voltage with the ADC
                        //instead.  If this is the case, apply a proper voltage to the pin.  See the firmware for exact implementation.
                        OUTBuffer[0] = 0x00;    //The first byte is the "Report ID" and does not get sent over the USB bus.  Always set = 0.
                        OUTBuffer[1] = 0x37;    //READ_POT command (see the firmware source code), gets 10-bit ADC Value
                        //Initialize the rest of the 64-byte packet to "0xFF".  Binary '1' bits do not use as much power, and do not cause as much EMI
                        //when they move across the USB cable.  USB traffic is "NRZI" encoded, where '1' bits do not cause the D+/D- signals to toggle states.
                        //This initialization is not strictly necessary however.
                        for (uint i = 2; i < 65; i++)
                            OUTBuffer[i] = 0xFF;

                        //To get the ADCValue, first, we send a packet with our "READ_POT" command in it.
                        if (WriteFile(WriteHandleToUSBDevice, OUTBuffer, 65, ref BytesWritten, IntPtr.Zero))    //Blocking function, unless an "overlapped" structure is used
                        {
                            INBuffer[0] = 0;
                            //Now get the response packet from the firmware.
                            if (ReadFileManagedBuffer(ReadHandleToUSBDevice, INBuffer, 65, ref BytesRead, IntPtr.Zero))        //Blocking function, unless an "overlapped" structure is used    
                            {
                                //INBuffer[0] is the report ID, which we don't care about.
                                //INBuffer[1] is an echo back of the command (see microcontroller firmware).
                                //INBuffer[2] and INBuffer[3] contains the ADC value (see microcontroller firmware).  
                                if (INBuffer[1] == 0x37)
                                {
                                    ADCValue = (uint)(INBuffer[3] << 8) + INBuffer[2];    //Need to reformat the data from two unsigned chars into one unsigned int.
                                }
                            }
                        }



                        //Get the pushbutton state from the microcontroller firmware.
                        OUTBuffer[0] = 0;            //The first byte is the "Report ID" and does not get sent over the USB bus.  Always set = 0.
                        OUTBuffer[1] = 0x81;        //0x81 is the "Get Pushbutton State" command in the firmware
                        for (uint i = 2; i < 65; i++)    //This loop is not strictly necessary.  Simply initializes unused bytes to
                            OUTBuffer[i] = 0xFF;                //0xFF for lower EMI and power consumption when driving the USB cable.

                        //To get the pushbutton state, first, we send a packet with our "Get Pushbutton State" command in it.
                        if (WriteFile(WriteHandleToUSBDevice, OUTBuffer, 65, ref BytesWritten, IntPtr.Zero))    //Blocking function, unless an "overlapped" structure is used
                        {
                            //Now get the response packet from the firmware.
                            INBuffer[0] = 0;
                            {
                                if (ReadFileManagedBuffer(ReadHandleToUSBDevice, INBuffer, 65, ref BytesRead, IntPtr.Zero))    //Blocking function, unless an "overlapped" structure is used    
                                {
                                    //INBuffer[0] is the report ID, which we don't care about.
                                    //INBuffer[1] is an echo back of the command (see microcontroller firmware).
                                    //INBuffer[2] contains the I/O port pin value for the pushbutton (see microcontroller firmware).  
                                    if ((INBuffer[1] == 0x81) && (INBuffer[2] == 0x01))
                                    {
                                        PushbuttonPressed = false;
                                    }
                                    if ((INBuffer[1] == 0x81) && (INBuffer[2] == 0x00))
                                    {
                                        PushbuttonPressed = true;
                                    }
                                }
                            }
                        }



                        //Check if this thread should send a Toggle LED(s) command to the firmware.  ToggleLEDsPending will get set
                        //by the ToggleLEDs_btn click event handler function if the user presses the button on the form.
                        if (ToggleLEDsPending == true)
                        {
                            OUTBuffer[0] = 0;                //The first byte is the "Report ID" and does not get sent over the USB bus.  Always set = 0.
                            OUTBuffer[1] = 0x80;            //0x80 is the "Toggle LED(s)" command in the firmware
                            for (uint i = 2; i < 65; i++)    //This loop is not strictly necessary.  Simply initializes unused bytes to
                                OUTBuffer[i] = 0xFF;        //0xFF for lower EMI and power consumption when driving the USB cable.
                            //Now send the packet to the USB firmware on the microcontroller
                            WriteFile(WriteHandleToUSBDevice, OUTBuffer, 65, ref BytesWritten, IntPtr.Zero);    //Blocking function, unless an "overlapped" structure is used
                            ToggleLEDsPending = false;
                        }
                    } //end of: if(AttachedState == true)
                    else
                    {
                        Thread.Sleep(5);    //Add a small delay.  Otherwise, this while(true) loop can execute very fast and cause 
                                            //high CPU utilization, with no particular benefit to the application.
                    }
                }
                catch
                {
                    //Exceptions can occur during the read or write operations.  For example,
                    //exceptions may occur if for instance the USB device is physically unplugged
                    //from the host while the above read/write functions are executing.

                    //Don't need to do anything special in this case.  The application will automatically
                    //re-establish communications based on the global AttachedState boolean variable used
                    //in conjunction with the WM_DEVICECHANGE messages to dyanmically respond to Plug and Play
                    //USB connection events.
                }

            } //end of while(true) loop
            //-------------------------------------------------------END CUT AND PASTE BLOCK-------------------------------------------------------------------------------------
            //-------------------------------------------------------------------------------------------------------------------------------------------------------------------
        }



        private void FormUpdateTimer_Tick(object sender, EventArgs e)
        {
            //-------------------------------------------------------------------------------------------------------------------------------------------------------------------
            //-------------------------------------------------------BEGIN CUT AND PASTE BLOCK-----------------------------------------------------------------------------------
            //This timer tick event handler function is used to update the user interface on the form, based on data
            //obtained asynchronously by the ReadWriteThread and the WM_DEVICECHANGE event handler functions.

            //Check if user interface on the form should be enabled or not, based on the attachment state of the USB device.
            if (AttachedState == true)
            {
                //Device is connected and ready to communicate, enable user interface on the form 
                StatusBox_txtbx.Text = "Device Found: AttachedState = TRUE";
                PushbuttonState_lbl.Enabled = true;    //Make the label no longer greyed out
                ANxVoltage_lbl.Enabled = true;
                ToggleLEDs_btn.Enabled = true;
            }
            if ((AttachedState == false) || (AttachedButBroken == true))
            {
                //Device not available to communicate. Disable user interface on the form.
                StatusBox_txtbx.Text = "Device Not Detected: Verify Connection/Correct Firmware";
                PushbuttonState_lbl.Enabled = false;    //Make the label no longer greyed out
                ANxVoltage_lbl.Enabled = false;
                ToggleLEDs_btn.Enabled = false;

                PushbuttonState_lbl.Text = "Pushbutton State: Unknown";
                ADCValue = 0;
                progressBar1.Value = 0;
            }

            //Update the various status indicators on the form with the latest info obtained from the ReadWriteThread()
            if (AttachedState == true)
            {
                //Update the pushbutton state label.
                if (PushbuttonPressed == false)
                    PushbuttonState_lbl.Text = "Pushbutton State: Not Pressed";        //Update the pushbutton state text label on the form, so the user can see the result 
                else
                    PushbuttonState_lbl.Text = "Pushbutton State: Pressed";            //Update the pushbutton state text label on the form, so the user can see the result 

                //Update the ANxx/POT Voltage indicator value (progressbar)
                progressBar1.Value = (int)ADCValue;
            }
            //-------------------------------------------------------END CUT AND PASTE BLOCK-------------------------------------------------------------------------------------
            //-------------------------------------------------------------------------------------------------------------------------------------------------------------------
        }


        //-------------------------------------------------------------------------------------------------------------------------------------------------------------------
        //-------------------------------------------------------BEGIN CUT AND PASTE BLOCK-----------------------------------------------------------------------------------

        //--------------------------------------------------------------------------------------------------------------------------
        //FUNCTION:    ReadFileManagedBuffer()
        //PURPOSE:    Wrapper function to call ReadFile()
        //
        //INPUT:    Uses managed versions of the same input parameters as ReadFile() uses.
        //
        //OUTPUT:    Returns boolean indicating if the function call was successful or not.
        //          Also returns data in the byte[] INBuffer, and the number of bytes read. 
        //
        //Notes:    Wrapper function used to call the ReadFile() function.  ReadFile() takes a pointer to an unmanaged buffer and deposits
        //          the bytes read into the buffer.  However, can't pass a pointer to a managed buffer directly to ReadFile().
        //          This ReadFileManagedBuffer() is a wrapper function to make it so application code can call ReadFile() easier
        //          by specifying a managed buffer.
        //--------------------------------------------------------------------------------------------------------------------------
        public unsafe bool ReadFileManagedBuffer(SafeFileHandle hFile, byte[] INBuffer, uint nNumberOfBytesToRead, ref uint lpNumberOfBytesRead, IntPtr lpOverlapped)
        {
            IntPtr pINBuffer = IntPtr.Zero;

            try
            {
                pINBuffer = Marshal.AllocHGlobal((int)nNumberOfBytesToRead);    //Allocate some unmanged RAM for the receive data buffer.

                if (ReadFile(hFile, pINBuffer, nNumberOfBytesToRead, ref lpNumberOfBytesRead, lpOverlapped))
                {
                    Marshal.Copy(pINBuffer, INBuffer, 0, (int)lpNumberOfBytesRead);    //Copy over the data from unmanged memory into the managed byte[] INBuffer
                    Marshal.FreeHGlobal(pINBuffer);
                    return true;
                }
                else
                {
                    Marshal.FreeHGlobal(pINBuffer);
                    return false;
                }

            }
            catch
            {
                if (pINBuffer != IntPtr.Zero)
                {
                    Marshal.FreeHGlobal(pINBuffer);
                }
                return false;
            }
        }
        //-------------------------------------------------------END CUT AND PASTE BLOCK-------------------------------------------------------------------------------------
        //-------------------------------------------------------------------------------------------------------------------------------------------------------------------


    } //public partial class Form1 : Form
} //namespace HID_PnP_Demo
```


Ahora veremos donde se desarrolla el código de los 3 puntos antes descriptos:

Primero vamos a ver donde se muestran los diferentes estados;
Cuando se detecta la conexión:

```
if ((ErrorStatusWrite == ERROR_SUCCESS) && (ErrorStatusRead == ERROR_SUCCESS))
                            {
                                AttachedState = true;        //Let the rest of the PC application know the USB device is connected, and it is safe to read/write to it
                                AttachedButBroken = false;
                                StatusBox_txtbx.Text = "Device Found, AttachedState = TRUE";
                            }
```
Más abajo muestra un timer que tiene como función leer continuamente si se ha presionado un botón y además lee el estado del evento de conección / desconección del USB.

```
private void FormUpdateTimer_Tick(object sender, EventArgs e)
        {
            //-------------------------------------------------------------------------------------------------------------------------------------------------------------------
            //-------------------------------------------------------BEGIN CUT AND PASTE BLOCK-----------------------------------------------------------------------------------
            //This timer tick event handler function is used to update the user interface on the form, based on data
            //obtained asynchronously by the ReadWriteThread and the WM_DEVICECHANGE event handler functions.

            //Check if user interface on the form should be enabled or not, based on the attachment state of the USB device.
            if (AttachedState == true)
            {
                //Device is connected and ready to communicate, enable user interface on the form 
                StatusBox_txtbx.Text = "Device Found: AttachedState = TRUE";
                PushbuttonState_lbl.Enabled = true;    //Make the label no longer greyed out
                ANxVoltage_lbl.Enabled = true;
                ToggleLEDs_btn.Enabled = true;
            }
            if ((AttachedState == false) || (AttachedButBroken == true))
            {
                //Device not available to communicate. Disable user interface on the form.
                StatusBox_txtbx.Text = "Device Not Detected: Verify Connection/Correct Firmware";
                PushbuttonState_lbl.Enabled = false;    //Make the label no longer greyed out
                ANxVoltage_lbl.Enabled = false;
                ToggleLEDs_btn.Enabled = false;

                PushbuttonState_lbl.Text = "Pushbutton State: Unknown";
                ADCValue = 0;
                progressBar1.Value = 0;
            }

            //Update the various status indicators on the form with the latest info obtained from the ReadWriteThread()
            if (AttachedState == true)
            {
                //Update the pushbutton state label.
                if (PushbuttonPressed == false)
                    PushbuttonState_lbl.Text = "Pushbutton State: Not Pressed";        //Update the pushbutton state text label on the form, so the user can see the result 
                else
                    PushbuttonState_lbl.Text = "Pushbutton State: Pressed";            //Update the pushbutton state text label on the form, so the user can see the result 

                //Update the ANxx/POT Voltage indicator value (progressbar)
                progressBar1.Value = (int)ADCValue;
            }
            //-------------------------------------------------------END CUT AND PASTE BLOCK-------------------------------------------------------------------------------------
            //-------------------------------------------------------------------------------------------------------------------------------------------------------------------
        }
```


----------



## Meta (Nov 6, 2010)

Muy bueno. Lo que no se cómo hiciste eso en C# sólo. ¿Está estos códigos en C# en la web de www.microchip.com?

Me has impresiionado...
...sigue así.


----------



## Moyano Jonathan (Nov 6, 2010)

Si esos códigos son de la web de microchip...pero sacando solo lo que me interesa. Lo que hay que determinar son los mensajes de los diferentes eventos del HID y ver como se transmiten y reciven los datos. 
Teniendo lo anterior en claro ya podemos implementar nuestras primeras aplicaciones.

Lo de la eeprom lo estoy revisando pero no creo que tarde mucho en descubrir como funciona.


----------



## sjuan (Nov 6, 2010)

esta muy interesante esto, saben si se puede con un jm60(un micro de motorola)???????


----------



## guillerusso (Nov 6, 2010)

Hola Moyano mil gracias por lo que nos das, sos un capo, estoy capturando datos con el CAD del micro y mandando a la PC para que los grafique, pero las lecturas son muy lentas, estoy usando un ejemplo tuyo de HID (el de los 8 rele, 3entradas y el CAD), tendrias algun ejemplo con el que pueda capturar los datos mucho mas rapido?, tengo que presentar en la U un osciloscopio, gracias


----------



## Moyano Jonathan (Nov 6, 2010)

@guillerusso hola como estás, mirá dale una mirada a este proyecto de fin de carrera: http://pablohoffman.com/cgi-bin/twiki/bin/view/Oscusb/WebHomehttps://www.forosdeelectronica.com/miembros/85276-guillerusso/

Bueno acá les pongo 2 funciones importantes dentro del programa anterior. La primera me devuelve un valor del tipo bool ( 1 o 0 ) que me dice si el dispositivo , que coincide con el VID y PID descripto en el programa está conectado fisicamente con el handler o "manejador".

```
bool CheckIfPresentAndGetUSBDevicePath()
        {
            /* 
            Before we can "connect" our application to our USB embedded device, we must first find the device.
            A USB bus can have many devices simultaneously connected, so somehow we have to find our device only.
            This is done with the Vendor ID (VID) and Product ID (PID).  Each USB product line should have
            a unique combination of VID and PID.  

            Microsoft has created a number of functions which are useful for finding plug and play devices.  Documentation
            for each function used can be found in the MSDN library.  We will be using the following functions (unmanaged C functions):

            SetupDiGetClassDevs()                    //provided by setupapi.dll, which comes with Windows
            SetupDiEnumDeviceInterfaces()            //provided by setupapi.dll, which comes with Windows
            GetLastError()                            //provided by kernel32.dll, which comes with Windows
            SetupDiDestroyDeviceInfoList()            //provided by setupapi.dll, which comes with Windows
            SetupDiGetDeviceInterfaceDetail()        //provided by setupapi.dll, which comes with Windows
            SetupDiGetDeviceRegistryProperty()        //provided by setupapi.dll, which comes with Windows
            CreateFile()                            //provided by kernel32.dll, which comes with Windows

            In order to call these unmanaged functions, the Marshal class is very useful.
             
            We will also be using the following unusual data types and structures.  Documentation can also be found in
            the MSDN library:

            PSP_DEVICE_INTERFACE_DATA
            PSP_DEVICE_INTERFACE_DETAIL_DATA
            SP_DEVINFO_DATA
            HDEVINFO
            HANDLE
            GUID

            The ultimate objective of the following code is to get the device path, which will be used elsewhere for getting
            read and write handles to the USB device.  Once the read/write handles are opened, only then can this
            PC application begin reading/writing to the USB device using the WriteFile() and ReadFile() functions.

            Getting the device path is a multi-step round about process, which requires calling several of the
            SetupDixxx() functions provided by setupapi.dll.
            */

            try
            {
                IntPtr DeviceInfoTable = IntPtr.Zero;
                SP_DEVICE_INTERFACE_DATA InterfaceDataStructure = new SP_DEVICE_INTERFACE_DATA();
                SP_DEVICE_INTERFACE_DETAIL_DATA DetailedInterfaceDataStructure = new SP_DEVICE_INTERFACE_DETAIL_DATA();
                SP_DEVINFO_DATA DevInfoData = new SP_DEVINFO_DATA();

                uint InterfaceIndex = 0;
                uint dwRegType = 0;
                uint dwRegSize = 0;
                uint dwRegSize2 = 0;
                uint StructureSize = 0;
                IntPtr PropertyValueBuffer = IntPtr.Zero;
                bool MatchFound = false;
                uint ErrorStatus;
                uint LoopCounter = 0;

                //Use the formatting: "Vid_xxxx&Pid_xxxx" where xxxx is a 16-bit hexadecimal number.
                //Make sure the value appearing in the parathesis matches the USB device descriptor
                //of the device that this aplication is intending to find.
                String DeviceIDToFind = "Vid_04d8&Pid_003f";

                //First populate a list of plugged in devices (by specifying "DIGCF_PRESENT"), which are of the specified class GUID. 
                DeviceInfoTable = SetupDiGetClassDevs(ref InterfaceClassGuid, IntPtr.Zero, IntPtr.Zero, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE);

                if(DeviceInfoTable != IntPtr.Zero)
                {
                    //Now look through the list we just populated.  We are trying to see if any of them match our device. 
                    while(true)
                    {
                        InterfaceDataStructure.cbSize = (uint)Marshal.SizeOf(InterfaceDataStructure);
                        if(SetupDiEnumDeviceInterfaces(DeviceInfoTable, IntPtr.Zero, ref InterfaceClassGuid, InterfaceIndex, ref InterfaceDataStructure))
                        {
                            ErrorStatus = (uint)Marshal.GetLastWin32Error();
                            if (ErrorStatus == ERROR_NO_MORE_ITEMS)    //Did we reach the end of the list of matching devices in the DeviceInfoTable?
                            {    //Cound not find the device.  Must not have been attached.
                                SetupDiDestroyDeviceInfoList(DeviceInfoTable);    //Clean up the old structure we no longer need.
                                return false;        
                            }
                        }
                        else    //Else some other kind of unknown error ocurred...
                        {
                            ErrorStatus = (uint)Marshal.GetLastWin32Error();
                            SetupDiDestroyDeviceInfoList(DeviceInfoTable);    //Clean up the old structure we no longer need.
                            return false;    
                        }

                        //Now retrieve the hardware ID from the registry.  The hardware ID contains the VID and PID, which we will then 
                        //check to see if it is the correct device or not.

                        //Initialize an appropriate SP_DEVINFO_DATA structure.  We need this structure for SetupDiGetDeviceRegistryProperty().
                        DevInfoData.cbSize = (uint)Marshal.SizeOf(DevInfoData);
                        SetupDiEnumDeviceInfo(DeviceInfoTable, InterfaceIndex, ref DevInfoData);

                        //First query for the size of the hardware ID, so we can know how big a buffer to allocate for the data.
                        SetupDiGetDeviceRegistryProperty(DeviceInfoTable, ref DevInfoData, SPDRP_HARDWAREID, ref dwRegType, IntPtr.Zero, 0, ref dwRegSize);

                        //Allocate a buffer for the hardware ID.
                        //Should normally work, but could throw exception "OutOfMemoryException" if not enough resources available.
                        PropertyValueBuffer = Marshal.AllocHGlobal((int)dwRegSize);

                        //Retrieve the hardware IDs for the current device we are looking at.  PropertyValueBuffer gets filled with a 
                        //REG_MULTI_SZ (array of null terminated strings).  To find a device, we only care about the very first string in the
                        //buffer, which will be the "device ID".  The device ID is a string which contains the VID and PID, in the example 
                        //format "Vid_04d8&Pid_003f".
                        SetupDiGetDeviceRegistryProperty(DeviceInfoTable, ref DevInfoData, SPDRP_HARDWAREID, ref dwRegType, PropertyValueBuffer, dwRegSize, ref dwRegSize2);

                        //Now check if the first string in the hardware ID matches the device ID of the USB device we are trying to find.
                        String DeviceIDFromRegistry = Marshal.PtrToStringUni(PropertyValueBuffer); //Make a new string, fill it with the contents from the PropertyValueBuffer

                        Marshal.FreeHGlobal(PropertyValueBuffer);        //No longer need the PropertyValueBuffer, free the memory to prevent potential memory leaks

                        //Convert both strings to lower case.  This makes the code more robust/portable accross OS Versions
                        DeviceIDFromRegistry = DeviceIDFromRegistry.ToLowerInvariant();    
                        DeviceIDToFind = DeviceIDToFind.ToLowerInvariant();                
                        //Now check if the hardware ID we are looking at contains the correct VID/PID
                        MatchFound = DeviceIDFromRegistry.Contains(DeviceIDToFind);        
                        if(MatchFound == true)
                        {
                            //Device must have been found.  In order to open I/O file handle(s), we will need the actual device path first.
                            //We can get the path by calling SetupDiGetDeviceInterfaceDetail(), however, we have to call this function twice:  The first
                            //time to get the size of the required structure/buffer to hold the detailed interface data, then a second time to actually 
                            //get the structure (after we have allocated enough memory for the structure.)
                            DetailedInterfaceDataStructure.cbSize = (uint)Marshal.SizeOf(DetailedInterfaceDataStructure);
                            //First call populates "StructureSize" with the correct value
                            SetupDiGetDeviceInterfaceDetail(DeviceInfoTable, ref InterfaceDataStructure, IntPtr.Zero, 0, ref StructureSize, IntPtr.Zero);
                            //Need to call SetupDiGetDeviceInterfaceDetail() again, this time specifying a pointer to a SP_DEVICE_INTERFACE_DETAIL_DATA buffer with the correct size of RAM allocated.
                            //First need to allocate the unmanaged buffer and get a pointer to it.
                            IntPtr pUnmanagedDetailedInterfaceDataStructure = IntPtr.Zero;  //Declare a pointer.
                            pUnmanagedDetailedInterfaceDataStructure = Marshal.AllocHGlobal((int)StructureSize);    //Reserve some unmanaged memory for the structure.
                            DetailedInterfaceDataStructure.cbSize = 6; //Initialize the cbSize parameter (4 bytes for DWORD + 2 bytes for unicode null terminator)
                            Marshal.StructureToPtr(DetailedInterfaceDataStructure, pUnmanagedDetailedInterfaceDataStructure, false); //Copy managed structure contents into the unmanaged memory buffer.

                            //Now call SetupDiGetDeviceInterfaceDetail() a second time to receive the device path in the structure at pUnmanagedDetailedInterfaceDataStructure.
                            if (SetupDiGetDeviceInterfaceDetail(DeviceInfoTable, ref InterfaceDataStructure, pUnmanagedDetailedInterfaceDataStructure, StructureSize, IntPtr.Zero, IntPtr.Zero))
                            {
                                //Need to extract the path information from the unmanaged "structure".  The path starts at (pUnmanagedDetailedInterfaceDataStructure + sizeof(DWORD)).
                                IntPtr pToDevicePath = new IntPtr((uint)pUnmanagedDetailedInterfaceDataStructure.ToInt32() + 4);  //Add 4 to the pointer (to get the pointer to point to the path, instead of the DWORD cbSize parameter)
                                DevicePath = Marshal.PtrToStringUni(pToDevicePath); //Now copy the path information into the globally defined DevicePath String.
                                
                                //We now have the proper device path, and we can finally use the path to open I/O handle(s) to the device.
                                SetupDiDestroyDeviceInfoList(DeviceInfoTable);    //Clean up the old structure we no longer need.
                                Marshal.FreeHGlobal(pUnmanagedDetailedInterfaceDataStructure);  //No longer need this unmanaged SP_DEVICE_INTERFACE_DETAIL_DATA buffer.  We already extracted the path information.
                                return true;    //Returning the device path in the global DevicePath String
                            }
                            else //Some unknown failure occurred
                            {
                                uint ErrorCode = (uint)Marshal.GetLastWin32Error();
                                SetupDiDestroyDeviceInfoList(DeviceInfoTable);    //Clean up the old structure.
                                Marshal.FreeHGlobal(pUnmanagedDetailedInterfaceDataStructure);  //No longer need this unmanaged SP_DEVICE_INTERFACE_DETAIL_DATA buffer.  We already extracted the path information.
                                return false;    
                            }
                        }

                        InterfaceIndex++;    
                        //Keep looping until we either find a device with matching VID and PID, or until we run out of devices to check.
                        //However, just in case some unexpected error occurs, keep track of the number of loops executed.
                        //If the number of loops exceeds a very large number, exit anyway, to prevent inadvertent infinite looping.
                        LoopCounter++;
                        if(LoopCounter == 10000000)    //Surely there aren't more than 10 million devices attached to any forseeable PC...
                        {
                            return false;
                        }
                    }//end of while(true)
                }
                return false;
            }//end of try
            catch
            {
                //Something went wrong if PC gets here.  Maybe a Marshal.AllocHGlobal() failed due to insufficient resources or something.
                return false;    
            }
        }
```
Luego la otra función se encarga de gestionar las interrupciones que produce windows cuando un dispositivo USB es conectado o desconectado...trabaja en conjunto con la anterior.


```
protected override void WndProc(ref Message m)
        {
            if (m.Msg == WM_DEVICECHANGE)
            {
                if (((int)m.WParam == DBT_DEVICEARRIVAL) || ((int)m.WParam == DBT_DEVICEREMOVEPENDING) || ((int)m.WParam == DBT_DEVICEREMOVECOMPLETE) || ((int)m.WParam == DBT_CONFIGCHANGED))
                {
                    //WM_DEVICECHANGE messages by themselves are quite generic, and can be caused by a number of different
                    //sources, not just your USB hardware device.  Therefore, must check to find out if any changes relavant
                    //to your device (with known VID/PID) took place before doing any kind of opening or closing of handles/endpoints.
                    //(the message could have been totally unrelated to your application/USB device)

                    if (CheckIfPresentAndGetUSBDevicePath())    //Check and make sure at least one device with matching VID/PID is attached
                    {
                        //If executes to here, this means the device is currently attached and was found.
                        //This code needs to decide however what to do, based on whether or not the device was previously known to be
                        //attached or not.
                        if ((AttachedState == false) || (AttachedButBroken == true))    //Check the previous attachment state
                        {
                            uint ErrorStatusWrite;
                            uint ErrorStatusRead;

                            //We obtained the proper device path (from CheckIfPresentAndGetUSBDevicePath() function call), and it
                            //is now possible to open read and write handles to the device.
                            WriteHandleToUSBDevice = CreateFile(DevicePath, GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, IntPtr.Zero, OPEN_EXISTING, 0, IntPtr.Zero);
                            ErrorStatusWrite = (uint)Marshal.GetLastWin32Error();
                            ReadHandleToUSBDevice = CreateFile(DevicePath, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, IntPtr.Zero, OPEN_EXISTING, 0, IntPtr.Zero);
                            ErrorStatusRead = (uint)Marshal.GetLastWin32Error();

                            if ((ErrorStatusWrite == ERROR_SUCCESS) && (ErrorStatusRead == ERROR_SUCCESS))
                            {
                                AttachedState = true;        //Let the rest of the PC application know the USB device is connected, and it is safe to read/write to it
                                AttachedButBroken = false;
                                StatusBox_txtbx.Text = "Device Found, AttachedState = TRUE";
                            }
                            else //for some reason the device was physically plugged in, but one or both of the read/write handles didn't open successfully...
                            {
                                AttachedState = false;        //Let the rest of this application known not to read/write to the device.
                                AttachedButBroken = true;    //Flag so that next time a WM_DEVICECHANGE message occurs, can retry to re-open read/write pipes
                                if (ErrorStatusWrite == ERROR_SUCCESS)
                                    WriteHandleToUSBDevice.Close();
                                if (ErrorStatusRead == ERROR_SUCCESS)
                                    ReadHandleToUSBDevice.Close();
                            }
                        }
                        //else we did find the device, but AttachedState was already true.  In this case, don't do anything to the read/write handles,
                        //since the WM_DEVICECHANGE message presumably wasn't caused by our USB device.  
                    }
                    else    //Device must not be connected (or not programmed with correct firmware)
                    {
                        if (AttachedState == true)        //If it is currently set to true, that means the device was just now disconnected
                        {
                            AttachedState = false;
                            WriteHandleToUSBDevice.Close();
                            ReadHandleToUSBDevice.Close();
                        }
                        AttachedState = false;
                        AttachedButBroken = false;
                    }
                }
            } //end of: if(m.Msg == WM_DEVICECHANGE)

            base.WndProc(ref m);
        } //end of: WndProc() function
```

Bueno acá tenemos el *nucleo principal del programa* este conjunto de instrucciones corre en un hilo de ejecución diferente al del resto del programa...esto se hace para que todas las operaciones de entrada/salida de datos se haga a mayor velocidad.....se podría intentar hacerlas correr en el mismo hilo de ejecución que el programa original pero queda a criterio del programador 


```
private void ReadWriteThread_DoWork(object sender, DoWorkEventArgs e)
        {
            //-------------------------------------------------------------------------------------------------------------------------------------------------------------------
            //-------------------------------------------------------BEGIN CUT AND PASTE BLOCK-----------------------------------------------------------------------------------

            /*This thread does the actual USB read/write operations (but only when AttachedState == true) to the USB device.
            It is generally preferrable to write applications so that read and write operations are handled in a separate
            thread from the main form.  This makes it so that the main form can remain responsive, even if the I/O operations
            take a very long time to complete.

            Since this is a separate thread, this code below executes independently from the rest of the
            code in this application.  All this thread does is read and write to the USB device.  It does not update
            the form directly with the new information it obtains (such as the ANxx/POT Voltage or pushbutton state).
            The information that this thread obtains is stored in atomic global variables.
            Form updates are handled by the FormUpdateTimer Tick event handler function.

            This application sends packets to the endpoint buffer on the USB device by using the "WriteFile()" function.
            This application receives packets from the endpoint buffer on the USB device by using the "ReadFile()" function.
            Both of these functions are documented in the MSDN library.  Calling ReadFile() is a not perfectly straight
            foward in C# environment, since one of the input parameters is a pointer to a buffer that gets filled by ReadFile().
            The ReadFile() function is therefore called through a wrapper function ReadFileManagedBuffer().

            All ReadFile() and WriteFile() operations in this example project are synchronous.  They are blocking function
            calls and only return when they are complete, or if they fail because of some event, such as the user unplugging
            the device.  It is possible to call these functions with "overlapped" structures, and use them as non-blocking
            asynchronous I/O function calls.  

            Note:  This code may perform differently on some machines when the USB device is plugged into the host through a
            USB 2.0 hub, as opposed to a direct connection to a root port on the PC.  In some cases the data rate may be slower
            when the device is connected through a USB 2.0 hub.  This performance difference is believed to be caused by
            the issue described in Microsoft knowledge base article 940021:
            http://support.microsoft.com/kb/940021/en-us 

            Higher effective bandwidth (up to the maximum offered by interrupt endpoints), both when connected
            directly and through a USB 2.0 hub, can generally be achieved by queuing up multiple pending read and/or
            write requests simultaneously.  This can be done when using    asynchronous I/O operations (calling ReadFile() and
            WriteFile()    with overlapped structures).  The Microchip    HID USB Bootloader application uses asynchronous I/O
            for some USB operations and the source code can be used    as an example.*/


            Byte[] OUTBuffer = new byte[65];    //Allocate a memory buffer equal to the OUT endpoint size + 1
            Byte[] INBuffer = new byte[65];        //Allocate a memory buffer equal to the IN endpoint size + 1
            uint BytesWritten = 0;
            uint BytesRead = 0;

            while(true)
            {
                try
                {
                    if (AttachedState == true)    //Do not try to use the read/write handles unless the USB device is attached and ready
                    {
                        //Get ANxx/POT Voltage value from the microcontroller firmware.  Note: some demo boards may not have a pot
                        //on them.  In this case, the firmware may be configured to read an ANxx I/O pin voltage with the ADC
                        //instead.  If this is the case, apply a proper voltage to the pin.  See the firmware for exact implementation.
                        OUTBuffer[0] = 0x00;    //The first byte is the "Report ID" and does not get sent over the USB bus.  Always set = 0.
                        OUTBuffer[1] = 0x37;    //READ_POT command (see the firmware source code), gets 10-bit ADC Value
                        //Initialize the rest of the 64-byte packet to "0xFF".  Binary '1' bits do not use as much power, and do not cause as much EMI
                        //when they move across the USB cable.  USB traffic is "NRZI" encoded, where '1' bits do not cause the D+/D- signals to toggle states.
                        //This initialization is not strictly necessary however.
                        for (uint i = 2; i < 65; i++)
                            OUTBuffer[i] = 0xFF;

                        //To get the ADCValue, first, we send a packet with our "READ_POT" command in it.
                        if (WriteFile(WriteHandleToUSBDevice, OUTBuffer, 65, ref BytesWritten, IntPtr.Zero))    //Blocking function, unless an "overlapped" structure is used
                        {
                            INBuffer[0] = 0;
                            //Now get the response packet from the firmware.
                            if (ReadFileManagedBuffer(ReadHandleToUSBDevice, INBuffer, 65, ref BytesRead, IntPtr.Zero))        //Blocking function, unless an "overlapped" structure is used    
                            {
                                //INBuffer[0] is the report ID, which we don't care about.
                                //INBuffer[1] is an echo back of the command (see microcontroller firmware).
                                //INBuffer[2] and INBuffer[3] contains the ADC value (see microcontroller firmware).  
                                if (INBuffer[1] == 0x37)
                                {
                                    ADCValue = (uint)(INBuffer[3] << 8) + INBuffer[2];    //Need to reformat the data from two unsigned chars into one unsigned int.
                                }
                            }
                        }



                        //Get the pushbutton state from the microcontroller firmware.
                        OUTBuffer[0] = 0;            //The first byte is the "Report ID" and does not get sent over the USB bus.  Always set = 0.
                        OUTBuffer[1] = 0x81;        //0x81 is the "Get Pushbutton State" command in the firmware
                        for (uint i = 2; i < 65; i++)    //This loop is not strictly necessary.  Simply initializes unused bytes to
                            OUTBuffer[i] = 0xFF;                //0xFF for lower EMI and power consumption when driving the USB cable.

                        //To get the pushbutton state, first, we send a packet with our "Get Pushbutton State" command in it.
                        if (WriteFile(WriteHandleToUSBDevice, OUTBuffer, 65, ref BytesWritten, IntPtr.Zero))    //Blocking function, unless an "overlapped" structure is used
                        {
                            //Now get the response packet from the firmware.
                            INBuffer[0] = 0;
                            {
                                if (ReadFileManagedBuffer(ReadHandleToUSBDevice, INBuffer, 65, ref BytesRead, IntPtr.Zero))    //Blocking function, unless an "overlapped" structure is used    
                                {
                                    //INBuffer[0] is the report ID, which we don't care about.
                                    //INBuffer[1] is an echo back of the command (see microcontroller firmware).
                                    //INBuffer[2] contains the I/O port pin value for the pushbutton (see microcontroller firmware).  
                                    if ((INBuffer[1] == 0x81) && (INBuffer[2] == 0x01))
                                    {
                                        PushbuttonPressed = false;
                                    }
                                    if ((INBuffer[1] == 0x81) && (INBuffer[2] == 0x00))
                                    {
                                        PushbuttonPressed = true;
                                    }
                                }
                            }
                        }



                        //Check if this thread should send a Toggle LED(s) command to the firmware.  ToggleLEDsPending will get set
                        //by the ToggleLEDs_btn click event handler function if the user presses the button on the form.
                        if (ToggleLEDsPending == true)
                        {
                            OUTBuffer[0] = 0;                //The first byte is the "Report ID" and does not get sent over the USB bus.  Always set = 0.
                            OUTBuffer[1] = 0x80;            //0x80 is the "Toggle LED(s)" command in the firmware
                            for (uint i = 2; i < 65; i++)    //This loop is not strictly necessary.  Simply initializes unused bytes to
                                OUTBuffer[i] = 0xFF;        //0xFF for lower EMI and power consumption when driving the USB cable.
                            //Now send the packet to the USB firmware on the microcontroller
                            WriteFile(WriteHandleToUSBDevice, OUTBuffer, 65, ref BytesWritten, IntPtr.Zero);    //Blocking function, unless an "overlapped" structure is used
                            ToggleLEDsPending = false;
                        }
                    } //end of: if(AttachedState == true)
                    else
                    {
                        Thread.Sleep(5);    //Add a small delay.  Otherwise, this while(true) loop can execute very fast and cause 
                                            //high CPU utilization, with no particular benefit to the application.
                    }
                }
                catch
                {
                    //Exceptions can occur during the read or write operations.  For example,
                    //exceptions may occur if for instance the USB device is physically unplugged
                    //from the host while the above read/write functions are executing.

                    //Don't need to do anything special in this case.  The application will automatically
                    //re-establish communications based on the global AttachedState boolean variable used
                    //in conjunction with the WM_DEVICECHANGE messages to dyanmically respond to Plug and Play
                    //USB connection events.
                }

            } //end of while(true) loop
            //-------------------------------------------------------END CUT AND PASTE BLOCK-------------------------------------------------------------------------------------
            //-------------------------------------------------------------------------------------------------------------------------------------------------------------------
        }
```


También el programa muestra un timer donde cada cierto tiempo se actualizan los estados de las diferentes variables ....se testea la conexion USB...etc.

```
private void FormUpdateTimer_Tick(object sender, EventArgs e)
        {
            //-------------------------------------------------------------------------------------------------------------------------------------------------------------------
            //-------------------------------------------------------BEGIN CUT AND PASTE BLOCK-----------------------------------------------------------------------------------
            //This timer tick event handler function is used to update the user interface on the form, based on data
            //obtained asynchronously by the ReadWriteThread and the WM_DEVICECHANGE event handler functions.

            //Check if user interface on the form should be enabled or not, based on the attachment state of the USB device.
            if (AttachedState == true)
            {
                //Device is connected and ready to communicate, enable user interface on the form 
                StatusBox_txtbx.Text = "Device Found: AttachedState = TRUE";
                PushbuttonState_lbl.Enabled = true;    //Make the label no longer greyed out
                ANxVoltage_lbl.Enabled = true;
                ToggleLEDs_btn.Enabled = true;
            }
            if ((AttachedState == false) || (AttachedButBroken == true))
            {
                //Device not available to communicate. Disable user interface on the form.
                StatusBox_txtbx.Text = "Device Not Detected: Verify Connection/Correct Firmware";
                PushbuttonState_lbl.Enabled = false;    //Make the label no longer greyed out
                ANxVoltage_lbl.Enabled = false;
                ToggleLEDs_btn.Enabled = false;

                PushbuttonState_lbl.Text = "Pushbutton State: Unknown";
                ADCValue = 0;
                progressBar1.Value = 0;
            }

            //Update the various status indicators on the form with the latest info obtained from the ReadWriteThread()
            if (AttachedState == true)
            {
                //Update the pushbutton state label.
                if (PushbuttonPressed == false)
                    PushbuttonState_lbl.Text = "Pushbutton State: Not Pressed";        //Update the pushbutton state text label on the form, so the user can see the result 
                else
                    PushbuttonState_lbl.Text = "Pushbutton State: Pressed";            //Update the pushbutton state text label on the form, so the user can see the result 

                //Update the ANxx/POT Voltage indicator value (progressbar)
                progressBar1.Value = (int)ADCValue;
            }
            //-------------------------------------------------------END CUT AND PASTE BLOCK-------------------------------------------------------------------------------------
            //-------------------------------------------------------------------------------------------------------------------------------------------------------------------
        }
```


Por último tenemos la función que lee un handler de lectura de datos y devuelve los datos leidos desde el dispositivo y nos dá un OK en caso de que la lectura fue correcta o un false en caso de error...


```
//--------------------------------------------------------------------------------------------------------------------------
        //FUNCTION:    ReadFileManagedBuffer()
        //PURPOSE:    Wrapper function to call ReadFile()
        //
        //INPUT:    Uses managed versions of the same input parameters as ReadFile() uses.
        //
        //OUTPUT:    Returns boolean indicating if the function call was successful or not.
        //          Also returns data in the byte[] INBuffer, and the number of bytes read. 
        //
        //Notes:    Wrapper function used to call the ReadFile() function.  ReadFile() takes a pointer to an unmanaged buffer and deposits
        //          the bytes read into the buffer.  However, can't pass a pointer to a managed buffer directly to ReadFile().
        //          This ReadFileManagedBuffer() is a wrapper function to make it so application code can call ReadFile() easier
        //          by specifying a managed buffer.
        //--------------------------------------------------------------------------------------------------------------------------
        public unsafe bool ReadFileManagedBuffer(SafeFileHandle hFile, byte[] INBuffer, uint nNumberOfBytesToRead, ref uint lpNumberOfBytesRead, IntPtr lpOverlapped)
        {
            IntPtr pINBuffer = IntPtr.Zero;

            try
            {
                pINBuffer = Marshal.AllocHGlobal((int)nNumberOfBytesToRead);    //Allocate some unmanged RAM for the receive data buffer.

                if (ReadFile(hFile, pINBuffer, nNumberOfBytesToRead, ref lpNumberOfBytesRead, lpOverlapped))
                {
                    Marshal.Copy(pINBuffer, INBuffer, 0, (int)lpNumberOfBytesRead);    //Copy over the data from unmanged memory into the managed byte[] INBuffer
                    Marshal.FreeHGlobal(pINBuffer);
                    return true;
                }
                else
                {
                    Marshal.FreeHGlobal(pINBuffer);
                    return false;
                }

            }
            catch
            {
                if (pINBuffer != IntPtr.Zero)
                {
                    Marshal.FreeHGlobal(pINBuffer);
                }
                return false;
            }
        }

        //-------------------------------------------------------END CUT AND PASTE BLOCK-------------------------------------------------------------------------------------
        //-------------------------------------------------------------------------------------------------------------------------------------------------------------------


    } //public partial class Form1 : F
```


*Ya teniendo esto en claro tendríamos que aplicarlo a nuestro ejemplo para tener una base y poder comenzar a trabajar con el firmware del microcontrolador.*


----------



## Meta (Nov 6, 2010)

Hola campeón:

Pedazo de información. ¿Dónde sacaste esos ejemplos de C#? A mi me sale este enlace de C PIC18 y C del PIC32.

Un cordial saludo.


----------



## Moyano Jonathan (Nov 7, 2010)

Esto lo saque del Microchip aplication library 2010 ......buscalo por google y te va a aparecer el link ...luego cuando te lo bajes instalá el paquete completo o selecciona los archivos correspondientes al framework USB.


----------



## Meta (Nov 7, 2010)

Ok.

Da la casualidad que busqué eso hace un tiempo.

http://www.migsantiago.com/index.php?option=com_content&view=article&id=9&Itemid=10

Saludo.


----------



## guillerusso (Nov 7, 2010)

Moyano muchas gracias esta muy buena esa pagina que me pasaste


----------



## Moyano Jonathan (Nov 7, 2010)

Si meta, en esa página se dan las pautas para que puedas crear una aplicación usando la dll MUSBAPI.dll en conjunto con una aplicación en C# .

He comenzado el firmware pero todavía está dando un funcionamiento erratico acá lo voy a poner...en cuanto lo tenga andando se lo muestro con un video:

```
// Aplicación de prueba USB para la entrenadora MoyaPIC_USB_28.
// Programa: Ejemplo básico para realizar programas de control a través del puerto USB.
// Programador: Moyano Jonathan.
// Fecha: Noviembre del 2010.
// Compilador: C de CCS.
////////////////////////////////////////////////////////////////////////////////////////

#include <18F2550.h> // Definición de registros internos del PIC18F2550.
#fuses NOMCLR,XTPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL1,CPUDIV1,VREGEN,NOPBADEN
// NOMCLR: No vamos ha usar el PIN MCLR, el reset se hará por soft.
// XTPLL: Vamos a usar un cristal de 4.00Mhz.
// NOWDT: No vamos a usar el perro guardian.
// NOPROTECT: Memoria no protejida contra lecturas.
// NODEBUG: No utilizamos código para debugear.
// NOLVP: No utilizamos el modo de programación con bajo voltaje.
// USBDIV: signfica que el clock del usb se tomará del PLL/2 = 96Mhz/2 = 48Mhz.
// PLL1: significa que el PLL prescaler no dividirá la frecuencia del cristal. para XT = 4Mhz.
// CPUDIV1: El PLL postscaler decide la división en 2 de la frecuencia de salida del PLL de 96MHZ, si queremos 48MHZ, lo dejamos como está.
// VREGEN: habilita el regulador de 3.3 volts que usa el módulo USB.
// NOPBADEN: Deshabilitamos el módulo conversor ADC del puerto B.
#use delay(clock=48000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7, bits=8) // Declaramos el uso del puerto serie.

#DEFINE USB_HID_DEVICE TRUE // Vamos a utilizar el protocolo HID.

#define USB_EP1_TX_ENABLE USB_ENABLE_INTERRUPT 
#define USB_EP1_TX_SIZE 64 // Definición del tamaño del buffer de salida.

#define USB_EP1_RX_ENABLE USB_ENABLE_INTERRUPT 
#define USB_EP1_RX_SIZE 64 // Definición del tamaño del buffer de entrada.

/*********************************************************************************************************/

// Definición de las librerías utilizadas.
#include <pic18_usb.h>    // Drivers's USB del PIC18F2550.
#include <USB_MICROCHIP_descriptores.h> // Descriptores USB para la placa MoyaPIC_USB28.
#include <usb.c> // Funciones del USB.
#include <74HC165.c> // Función que permite leer 8 entradas multiplexadas.
#include <74HC164.C> // Función que permite activar 8 salidas multiplexadas.

/*********************************************************************************************************/

// Variables globales.

// Declaramos las variables globales usadas por el programa.


// Definimos las funciones que se utilizan en el programa.
void config_adcon2(void); // Función que utilizamos para configurar el registro ADCON2.

void main() { // Cuerpo principal del programa.

// Variables locales del main.
int valor_bajo; // Variable que guarda la parte baja del dato leido.
int valor_alto; // Variable que guarda la parte alta del dato leido.
int envia[8]; // Variable que contiene al valor del ADC y de los pulsadores.
int recibe[1]; // Variable que contiene los datos que se van a visualizar en los led's.
long valor_adc; // Variable que contiene el valor del CAD.
int interruptores; // Variable utilizada en un contador.
// Definimos las variables locales usadas dentro del cuerpo principal del programa.

// Configuramos los puertos del microcontrolador:
set_tris_a (0b000111);   //Define el puerto A. // RA0,RA1,RA2,RA5 como entradas.....RA3,RA4 como salidas.
set_tris_b (0b11000000); //Define el puerto B. // Todo el puerto B como salida.
set_tris_c (0b01110100); //Define el puerto C. // RC2,RC4,RC5,RC6, como entradas....RC0,RC1,RC7 como salidas.

output_b(0x00); // Limpiamos el puerto B.
output_a(0x00); // Limpiamos el puerto A.
output_c(0x00); // Limpiamos el puerto C.

// Otras configuraciones:
   disable_interrupts(global);
   disable_interrupts(int_timer1);
   disable_interrupts(int_rda);
   disable_interrupts(int_ext);
   disable_interrupts(int_ext1);
   disable_interrupts(int_ext2);
   setup_spi(FALSE);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
   port_b_pullups(FALSE);    


// Configuramos el conversor analógico digital:
   setup_adc_ports(ALL_ANALOG || VSS_VDD);
   setup_adc(ADC_CLOCK_DIV_64);

/////////////////////////////////////////////////////////////////////////////////////////////////////////
// Pantalla de bienvenida:
                puts("Programa de control por USB HID DEMO v1.0");         
      puts("=========================================\n");
      puts("Programador: Moyano Jonathan.\n");
                puts("Fecha: Noviembre de 2010.\n");
                puts("VISOR DE EVENTOS POR RS232.\n");
      
//*****************************************************************************************************

puts("inicia el bus USB y sale.\n");
usb_init_cs();               // inicia el USB y sale. Va de la mano con usb_task().
puts("Configuramos el USB...\n");
usb_task();                  // Configuramos el puerto USB.
puts("Dispositivo enumerado y listo para trabajar.\n");
config_adcon2();             // Configuramos el conversor analógico digital.

   while(true) {

    if (usb_enumerated()) {
     puts("Cargamos el valor de todos los canales analógicos y enviamos dichos valores por el EP1.\n");
      set_adc_channel(0); // Selecciono el canal de conversión 0.
       puts("Selecciono el canal 0 ...\n");
        valor_adc = read_adc(); // Leemos el CAD...
          printf("Valor del CAD0:%Lu",valor_adc); // Imprimimos el valor leido en el hyperterminal.
            valor_bajo = (Valor_adc>>8); // Guardamos la parte alta y baja del dato leido del cad..
             valor_alto = (Valor_adc);
          envia[1] = valor_bajo; // Cargamos el dato al buffer de transmisión del USB.
          envia[2] = valor_alto; 
            set_adc_channel(1); // Selecciono el canal de conversión 1.
       puts("Selecciono el canal 1 ...\n");
        valor_adc = read_adc(); // Leemos el CAD...
          printf("Valor del CAD1:%Lu",valor_adc); // Imprimimos el valor leido en el hyperterminal.
            valor_bajo = (Valor_adc>>8); // Guardamos la parte alta y baja del dato leido del cad..
             valor_alto = (Valor_adc);
          envia[3] = valor_bajo; // Cargamos el dato al buffer de transmisión del USB.
          envia[4] = valor_alto; 
      set_adc_channel(2); // Selecciono el canal de conversión 2.
       puts("Selecciono el canal 2 ...\n");
        valor_adc = read_adc(); // Leemos el CAD...
          printf("Valor del CAD2:%Lu",valor_adc); // Imprimimos el valor leido en el hyperterminal.
            valor_bajo = (Valor_adc>>8); // Guardamos la parte alta y baja del dato leido del cad..
             valor_alto = (Valor_adc);
          envia[5] = valor_bajo; // Cargamos el dato al buffer de transmisión del USB.
          envia[6] = valor_alto; 
                   
                      puts("Leemos las entradas digitales..\n");
                      interruptores = read_input_expander();
                       delay_ms(500);
                        printf("Valor obtenido:%u",interruptores);
                          envia[7] = interruptores;

        usb_put_packet(1,envia,8,USB_DTS_TOGGLE);   // Enviamos los datos por USB.

      if (usb_kbhit(1)) // Si hay un paquete de datos en el buffer lo tomamos y guardamos en la variable data.
                  {
                           usb_get_packet(1, recibe, 1);

             puts("Activamos led's según dato entrante..\n");

                        switch(recibe[0]){ // vemos que el valor del dato de entrada coincida con el numero de led y cambia su estado.
                        case 1:
                        output_74HC164(0x01);
                        puts("Activamos led 1.\n");
                        break;
                        case 2:
                        output_74HC164(0x02);
                        puts("Activamos led 2.\n");
                        break;
                        case 3:
                        output_74HC164(0x04);
                        puts("Activamos led 3.\n");
                        break;
                        case 4:
                        output_74HC164(0x08);
                        puts("Activamos led 4.\n");
                        break;
                        case 5:
                        output_74HC164(0x10);
                        puts("Activamos led 5.\n");
                        break;
                        case 6:
                        output_74HC164(0x20);
                        puts("Activamos led 6.\n");
                        break;
                        case 7:
                        output_74HC164(0x40);
                        puts("Activamos led 7.\n");
                        break;
                        case 8:
                        output_74HC164(0x80);
                        puts("Activamos led 8.\n");
                        break;
                        case 9: // Si llega el valor 9...
                        output_74HC164(0x00); // Borra todos los led's.
                        puts("Llega comando 9: apagamos todos los led's.");
                        break;
                         } 
                     }                                 
                 }
  

}
}

// Funciones definidas por el usurio:

// Esta función configura el registro ADCON2.
void config_adcon2() {
   #asm
   movlw 0b10111110 ; justificacion_derecha,20Tad,Fosc/64
   iorwf 0xFC0,1    ; direccion de ADCON2.
   #endasm
}
```

Hay que poner estos descriptores:


```
// Librería de descriptores HID modificadas para funcionar con la aplicación de Microchip.

#IFNDEF __USB_DESCRIPTORS__
#DEFINE __USB_DESCRIPTORS__

#include <usb.h> // Incluimos las funciones de control del puerto USB.

const char USB_CLASS_SPECIFIC_DESC[] = {
      6, 0, 255,       // Usage Page = Vendor Defined
      9, 1,            // Usage = IO device
      0xa1, 1,         // Collection = Application
      0x19, 1,         // Usage minimum
      0x29, 8,         // Usage maximum

      0x15, 0x80,        // Logical minimum (-128)
      0x25, 0x7F,        // Logical maximum (127)

      0x75, 8,        // Report size = 8 (bits)
      0x95, 2,        // Report count = 16 bits (2 bytes)
      0x81, 2,        // Input (Data, Var, Abs)
      0x19, 1,        // Usage minimum
      0x29, 8,        // Usage maximum
      0x75, 8,        // Report size = 8 (bits)
      0x95, 2,        // Report count = 16 bits (2 bytes)
      0x91, 2,        // Output (Data, Var, Abs)
      0xc0            // End Collection
   };

   // Descriptor extra.

   const int16 USB_CLASS_SPECIFIC_DESC_LOOKUP[USB_NUM_CONFIGURATIONS][1] =
   {
   //config 1
      //interface 0
         0
   };

   // Longitud del descriptor extra.

   const int16 USB_CLASS_SPECIFIC_DESC_LOOKUP_SIZE[USB_NUM_CONFIGURATIONS][1] =
   {
   //config 1
      //interface 0
         32
   };


//////////////////////////////////////////////////////////////////
/// Configuración de los diferentes descriptores.
//////////////////////////////////////////////////////////////////

   #DEFINE USB_TOTAL_CONFIG_LEN      41  // Longitud total de los descriptores.

   const char USB_CONFIG_DESC[] = {
  
   // Descriptor de configuración.

         USB_DESC_CONFIG_LEN, 
         USB_DESC_CONFIG_TYPE, 
         USB_TOTAL_CONFIG_LEN,0, 
         1, 
         0x01, 
         0x00, 
         0xC0, 
         0x32, // Corriente que va entregar el bus: 100mA (50mA * 2) (0x32mA*2)

   // Descriptor de interface.

         USB_DESC_INTERFACE_LEN, // Longitud del descriptor.
         USB_DESC_INTERFACE_TYPE, //Constante INTERFACE (INTERFACE 0x04)
         0x00, // Numero de definición de la interface (Si tenemos más de una interfaz)
         0x00, 
         2, // Número de endpoint's.
         0x03, // Código de clase: 0x03 = HID
         0x00, // Subcódigo de clase.
         0x00, // Protocolo de clase.
         0x00, // Descriptor específico para la interfaz.

   // Descriptor de la clase HID.

         USB_DESC_CLASS_LEN, // Longitud del descriptor.
         USB_DESC_CLASS_TYPE, // Tipo de descriptor (0x21 == HID)      
         0x00,0x01, // Versión de la clase HID: 1.0
         0x00, 
         0x01, 
         0x22, // Tipo de descriptor HID.
         USB_CLASS_SPECIFIC_DESC_LOOKUP_SIZE[0][0], 0x00, // Longitud del descriptor.

   // Descriptor del endpoint de salida.

         USB_DESC_ENDPOINT_LEN, // Longitud del descriptor.
         USB_DESC_ENDPOINT_TYPE, // Constante ENDPOINT. (ENDPOINT 0x05) 
         0x81, // Número del endpoint y dirección (0x81 = EP1 IN)       
         0x03, // Tipo de transferencia (0x03 = interruptiva)
         USB_EP1_TX_SIZE,0x00, // Tamaño del buffer de salida.
         10, // Intervalo de polling = 10ms.

   // Descriptor del endpoint de entrada.

         USB_DESC_ENDPOINT_LEN, // Longitud del descriptor.
         USB_DESC_ENDPOINT_TYPE, // Constante ENDPOINT. (ENDPOINT 0x05)          
         0x01, // Número del endpoint y dirección (0x01 = EP1 OUT).      
         0x03, // Tipo de transferencia (0x03 = interruptiva)
         USB_EP1_RX_SIZE,0x00, // Tamaño del buffer de entrada.
         10 // Intervalo de polling = 10ms.
   };

   #define USB_NUM_HID_INTERFACES   1 // Definimos el número de interfaces.
   #define USB_MAX_NUM_INTERFACES   1 // Definimos el número máximo de interfaces.

   const char USB_NUM_INTERFACES[USB_NUM_CONFIGURATIONS]={1};

   const int16 USB_CLASS_DESCRIPTORS[USB_NUM_CONFIGURATIONS][1][1]=
   {
   //config 1
      //interface 0
         //class 1
         18
   };

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


//////////////////////////////////////////////////////////////////
///
///   Descriptores del dispositivo
///
//////////////////////////////////////////////////////////////////

   const char USB_DEVICE_DESC[USB_DESC_DEVICE_LEN] ={
         USB_DESC_DEVICE_LEN, // Longitud del reporte.
         0x01, // Constante del dispositivo = 1
         0x10,0x01, // Versión del USB 1.10.
         0x00, // Código de clase.
         0x00, // Código de subclase.
         0x00, // Código de protocolo.
         USB_MAX_EP0_PACKET_LENGTH, // Tamaño máximo del paquete de datos del endpoint 0 = 8 para HID.
         0xD8,0x04, // Vendor  id =  decimal(1240), hexadecimal(04d8) // Identificadores de Microchip.
         0x3F,0x00, // Product id =  decimal(63), hexadecimal(003f)
         0x00,0x01, // Número del dispositivo.
         0x01, 
         0x02, 
         0x00, 
         USB_NUM_CONFIGURATIONS  // Número de posibles configuraciones.
   };


//////////////////////////////////////////////////////////////////
/// Descriptores del fabricante
//////////////////////////////////////////////////////////////////


char USB_STRING_DESC_OFFSET[]={0,4,12};

char const USB_STRING_DESC[]={
   // Primer descriptor.
         4, // Longitud del descriptor.
         USB_DESC_STRING_TYPE, 
         0x09,0x04,   // Lenguaje id = Inglés (Definido por microsoft).
   // Segundo descriptor.
         8, // Longitud del descriptor.
         USB_DESC_STRING_TYPE, // Descriptor del compilador utilizado. (STRING) (Puede ser el nombre de la compañía)
         'C',0,
         'C',0,
         'S',0,
   // Tercer descriptor.
         34, // Longitud del descriptor.
         USB_DESC_STRING_TYPE, // Descriptor del fabricante: MoyaPIC_HID_DEMO. (STRING)
         'M',0,
         'o',0,
         'y',0,
         'a',0,
         'P',0,
         'I',0,
         'C',0,
         '_',0,
         'H',0,
         'I',0,
         'D',0,
         '_',0,
         'D',0,
         'E',0,
         'M',0,
         'O',0
};

#ENDIF
```

Y usar las siguientes librerías de control:

```
// Librería de control para un expansor de 8 entradas digitales con 74HC165.
// Librería de CCS modificada por Moyano Jonathan.


#define INPUT_ENA       PIN_A3
#define CKL_exp         PIN_A4
#define DATA_exp        PIN_A5
#define NUMBER_OF_74165 1

char read_input_expander(void) {
  int8 i,dato;

  output_high(CKL_exp);
  output_low(INPUT_ENA);      // Guarda el estado actual de las entradas.
  output_high(INPUT_ENA);

  for(i=1;i<=8;++i) {      
    shift_left(dato,1,input(DATA_exp)); // Desplaza los datos y los guarda en la variable.
    output_low(CKL_exp);
    output_high(CKL_exp);
  }
  output_low(INPUT_ENA);

return(dato);
}
```


```
// Librería de control para el expansor de 8 salidas con 74HC164.
// Programador: Moyano Jonathan
// Versión: 1.0
// Funciones:
// escribe_registro(); Muestra un valor de 0 a 255 en el puerto.

// Definiciones de los puertos utilizados en el PIC.

// Pines intercambiables según necesidades del usuario.

#define relog PIN_A3 
#define datos PIN_A2
#define reset PIN_A1

void output_74HC164(int valor); // Definimos la función.

void output_74HC164(int valor) {

int contador; // Contador para escribir los datos al registro de desplazamiento.

  output_low(relog);
  output_high(reset);
  output_low(datos);

  for(contador=0;contador!=8;contador++) {  
  output_bit(datos,bit_test(valor,contador));
   output_high(relog);
   delay_cycles(1);
   output_low(relog);
  }
output_low(relog);
delay_ms(1);
}
```


----------



## Meta (Nov 7, 2010)

Dominas muy bien el tema. Sólo te falta pulir y lo estás consiguiendo.


----------



## Moyano Jonathan (Nov 7, 2010)

Si solo me falta pulir algunos detalles y sale andando .......luego de estar toda la noche en ello ...me tiene que andar 

Ahora a seguir leyendo he investigando para poder sacar a flote el proyecto completo


----------



## atricio (Nov 7, 2010)

lamentablemente mis conocimientos en visual y C# no son buenos muy interesante poniendole ganas ojala pueda saber un poquito mas de lo que estan hablando por el momento para mi esto es un poco distante sigan asi ojala los novatos podamos aprender alguito muchas gracias por los aportes


----------



## Meta (Nov 7, 2010)

atricio dijo:


> lamentablemente mis conocimientos en visual y C# no son buenos muy interesante poniendole ganas ojala pueda saber un poquito mas de lo que estan hablando por el momento para mi esto es un poco distante sigan asi ojala los novatos podamos aprender alguito muchas gracias por los aportes



Prueba un poco por aquí y será mejor. También estoy pobre con ello.
http://electronica-pic.blogspot.com

Muy útil si tienes muchas dudas.
http://social.msdn.microsoft.com/Forums/es-es/categories/

*Edito:

*Moyano.







Puedes preguntar a esta web como hizo lo del ASCII y binarios.
http://www.sitionica.com.ar/gpic-usb-programador-download.htm


----------



## Moyano Jonathan (Nov 8, 2010)

Ya pude hacer que la interfaz me reconiera la placa de desarrollo en HID....lo bueno de usar HID nativo es que no hace falta conectar/deconectar el dispositivo.....o cargar el VID/PID....ni tampoco manejar los eventos de interrupción del USB...por que eso lo hace el sistema asi que la interfaz se simplifica mucho.

Voy a preguntarle a willy el creador de ese programador si me puede orientar en el uso del datagrid.


----------



## Meta (Nov 8, 2010)

Buenas:

Parece que has descubierto de una forma muy simplificada de hacer con el USB. Lo bueno para no liar a la gente, centrarte en endencer y apagar los led por USB e¡con entradas y salidas digitales. Lo mismo para los ADC.

Por cierto. ¿Lo estás preparando para el 18F2550 o el 18F4550 o los dos?


----------



## lubeck (Nov 8, 2010)

no me lo tomen a mal... pero yo si ya me lie.....

que si los HID de los VID/PID de nativos del no se que del USB 

me parece que si es haaaaarrrrrta tecnología para mi....
Suerte!... a ver si mas delante comprendo algo...


----------



## Moyano Jonathan (Nov 8, 2010)

Para* meta*:
Mi entrenadora USB tiene el PIC18F2550 asi que el firmware va para ese....ahora si le modificas algunas cosas básicas corre sin problemas en un PIC18F4550.
PD: La aplicación está compilada para que corra en sistemas de 32 como de 64 bits....pero habrá que probarla para que no presente fallos..

Para* lubeck*:
Hola te paso a explicar rapidamente lo que se está haciendo:

1° - Esta idea del programa surgió de meta cuando planteó la necesidad de tener algo más entendible para el programador novato y que saque con facilidad su programa de control.

2° - Luego de plantear muchas ideas...pude encontrarme con una aplicación de microchip que explica (en inglés) como implementar la comunicación con el host (PC o ordenador ) de forma nativa ( Con los drivers que trae de fábrica windows )...con esto se logra una gran compatiblidad y facilidad a la hora de programar ya que todo el "trabajo sucio" se lo lleva windows.... y nosotros solo nos encargamos de las comunicaciones.

3° - El VID/PID de un dispositivo USB es un identificador que muestra Quien fabrico el dispositivo "VID : Vendor ID" .....y un identificador de producto (PID: Product ID) para mostrarnos de que se trata...

Algo a tener en cuenta sobre el proceso de comunicación del dispositivo con el host:

1° - En primera instancia el dispositivo es enumerado por el host cargando en el registro toda la información sobre dicho dispositivo para que cuando se lo vuelva a conectar no pida continuamente drivers...sino que los pide una vez y luego cada vez que se conecta el host busca la información del dispostivo en el registro.

2° - La aplicación funciona de una manera muy sencilla:

A - A través de llamados a funciones de windows...el sistema busca un dispositivo conectado al host...por lo tanto windows genera una interrupción que es leida por la aplicación y en función del valor leído ejecuta diferentes procesos programados por el usuario.

B - Una vez que el sistema encuentra al dispositivo , crea handlers o manejadores que no son más que archivos donde una podrá leer o escribir información que será enviada al puerto USB.

C - Los handlers están asociados a buffers de comunicaciones (DONDE ENTRAMOS NOSOTROS) que nos permitirán mediante sencillas instrucciones poder enviar o recibir datos.


- Por razones de velocidad en la ejecución de datos la aplicación corre las instrucciones principales del programa ( comunicaciones con el puerto USB ) en un hilo diferente al de la aplicación central..


----------



## atricio (Nov 9, 2010)

chuta hablan en frances o algun idioma raro me pondre a estudiar para algo algo poderles seguir la pista genial eso de hacer una entrenadora con usb


----------



## Meta (Nov 9, 2010)

Se trata de hacer un buen manual para que aprendamos hacer nuestra propia Interfaz con Visual Studio .net y la comunicación del USB con el PIC y PC. Se aprenderá hacer estas cosas como dijo Moyano.

_- 8 x salidas digitales multiplexadas.
- 8 x entradas digitales multiplexadas.
- 3 x entradas analógicas con potenciómetros.
- 1 x Memoria EEPROM I2C.
- 1 x RS232 para debug._

Muy buena idea para cosas básicas y Moyano por lo que veo en todo el foro es el más que ha puesto empeño y dedicación. Por eso está el dicho. _"A las personas se les conoce por sus obras, no por sus palabras"._

Está haciendo un buen trabajo. Para que te hagas una idea, hice un manual del puerto serie y otro del puerto paralelo. Con él aprenderás paso a paso lo que necesitas saber y hacer tus proyectos.

Ahora desde el 2008, por fin hay frutos con lo que me encanta los USB gracias a Moyano y otros ayudantes.

La veradad, con las 3 pirmeras obsiones me conformo. Tampco quiero pedirle mucho, ni aprovechándome de su buena fe.

- 8 x salidas digitales multiplexadas.
- 8 x entradas digitales multiplexadas.
- 3 x entradas analógicas con potenciómetros.


----------



## lubeck (Nov 9, 2010)

Gracias Moyano Gracias Meta...

ya me encarrile de nuevo... 

sigo viendo!... sigo viendo!...


----------



## Meta (Nov 9, 2010)

Igualmente. Tengo el 18F2550 y el 18F4550. Con el tiempo se arpovechará todo lo que se pueda, eso si, primero lo primero, poco a poco. A ver si nos sale todo antes de que llegue el USB 3.0, hablando de él, he leído por ahí que el protocolo ha cambiado un poco e incluso es más fácil para los programadores. Eso hay qu everlo si es verdad.


----------



## COSMICO (Nov 9, 2010)

Felicitaciones Moyano y Meta..


----------



## Moyano Jonathan (Nov 9, 2010)

*Meta:*Te recomiendo que uses el PIC18F4550 para poder tener más pines para controlar dipositivos ....además viene con el SPP que se puede usar para transmitir datos a través de la SIE del USB directamente sin necesidad de control directo del PIC. Espero que mi nueva entrenadora USB tenga ese microcontrolador.

Bueno ya tengo la estructura principal del programa lista, como pueden ver más abajo hice todo en C# por que hay muchos más usuarios que manejan este lenguaje...aunque pasarlo a VB.net no sería tan complejo.


```
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using Microsoft.Win32.SafeHandles;
using System.Runtime.InteropServices;
using System.Threading;


namespace HID_DEMO
{
    public partial class Form1 : Form
    {
        #region // Constantes, estructuras, llamados a funciones..(SISTEMA)
        // Constantes de setupapi.h que no están permitidas añadirlas directamente
        // por tratarse de lenguaje C#.
        internal const uint DIGCF_PRESENT = 0x02;
        internal const uint DIGCF_DEVICEINTERFACE = 0x10;
        // Constante para la función CreateFile() y otras funciones de I/O.
        internal const short FILE_ATTRIBUTE_NORMAL = 0x80;
        internal const short INVALID_HANDLE_VALUE = -1;
        internal const uint GENERIC_READ = 0x80000000;
        internal const uint GENERIC_WRITE = 0x40000000;
        internal const uint CREATE_NEW = 1;
        internal const uint CREATE_ALWAYS = 2;
        internal const uint OPEN_EXISTING = 3;
        internal const uint FILE_SHARE_READ = 0x00000001;
        internal const uint FILE_SHARE_WRITE = 0x00000002;
        // Constantes que indican los diferentes mensajes WM_DEVICECHANGE.
        internal const uint WM_DEVICECHANGE = 0x0219;
        internal const uint DBT_DEVICEARRIVAL = 0x8000;
        internal const uint DBT_DEVICEREMOVEPENDING = 0x8003;
        internal const uint DBT_DEVICEREMOVECOMPLETE = 0x8004;
        internal const uint DBT_CONFIGCHANGED = 0x0018;
        // Otras definiciones...
        internal const uint DBT_DEVTYP_DEVICEINTERFACE = 0x05;
        internal const uint DEVICE_NOTIFY_WINDOW_HANDLE = 0x00;
        internal const uint ERROR_SUCCESS = 0x00;
        internal const uint ERROR_NO_MORE_ITEMS = 0x00000103;
        internal const uint SPDRP_HARDWAREID = 0x00000001;
        // Algunas estructuras utilizadas por el programa:
        internal struct SP_DEVICE_INTERFACE_DATA
        {
            internal uint cbSize;
            internal Guid InterfaceClassGuid;
            internal uint Flags;
            internal uint Reserved;
        }

        internal struct SP_DEVICE_INTERFACE_DETAIL_DATA
        {
            internal uint cbSize;
            internal char[] DevicePath;
        }

        internal struct SP_DEVINFO_DATA
        {
            internal uint cbSize;
            internal Guid ClassGuid;
            internal uint DevInst;
            internal uint Reserved;
        }

        internal struct DEV_BROADCAST_DEVICEINTERFACE
        {
            internal uint dbcc_size;
            internal uint dbcc_devicetype;
            internal uint dbcc_reserved;
            internal Guid dbcc_classguid;
            internal char[] dbcc_name;
        }
        // DLL importadas:
        // Retorna información sobre el dispositivo. Esta función la necesitamos para llamar a otras
        // funciones que se encuentran dentro de setupdixxx().
        [DllImport("setupapi.dll", SetLastError = true, CharSet = CharSet.Unicode)]
        internal static extern IntPtr SetupDiGetClassDevs(
            ref Guid ClassGuid,     //LPGUID    Entrada: Necesaria para suministrar la GUID class. 
            IntPtr Enumerator,      //PCTSTR    Entrada: Usar NULL, no es necesario para nuestros propositos.
            IntPtr hwndParent,      //HWND      Entrada: Usar NULL, no es necesario para nuestros propositos.
            uint Flags);            //DWORD     Entrada: Flag que indica que clase de filtrado se usará.

        // Nos da la "PSP_DEVICE_INTERFACE_DATA", la cual contiene la GUID específica de interfase del dispositivo (Diferente a la GUID de clase).
        // Necesitamos la GUID de interfase para encontrar la ruta de acceso del dispositivo.
        [DllImport("setupapi.dll", SetLastError = true, CharSet = CharSet.Unicode)]
        internal static extern bool SetupDiEnumDeviceInterfaces(
            IntPtr DeviceInfoSet,           // Entrada: entrega el HDEVINFO que obtuvimos de SetupDiGetClassDevs ()
            IntPtr DeviceInfoData,          // Entrada: (opcional)
            ref Guid InterfaceClassGuid,    // Entrada: 
            uint MemberIndex,               // Entrada: "Indice" de los dispositivos de los cuales queremos obtener la ruta de acceso.
            ref SP_DEVICE_INTERFACE_DATA DeviceInterfaceData);    // Salida: Esta función se encuentra en la estructura "SP_DEVICE_INTERFACE_DATA".

        // SetupDiDestroyDeviceInfoList() Libera memoria destruyendo la lista de información de dispositivo.
        [DllImport("setupapi.dll", SetLastError = true, CharSet = CharSet.Unicode)]
        internal static extern bool SetupDiDestroyDeviceInfoList(
            IntPtr DeviceInfoSet);          // Entrada: Da un identificador de una lista de información de dispositivo para cancelar la asignación de memoria RAM.


        // SetupDiEnumDeviceInfo() Guarda en una estructura "SP_DEVINFO_DATA" structure, Lo que necesitamos para SetupDiGetDeviceRegistryProperty()
        [DllImport("setupapi.dll", SetLastError = true, CharSet = CharSet.Unicode)]
        internal static extern bool SetupDiEnumDeviceInfo(
            IntPtr DeviceInfoSet,
            uint MemberIndex,
            ref SP_DEVINFO_DATA DeviceInterfaceData);

        // SetupDiGetDeviceRegistryProperty() Nos dá el ID de hardware, El cuál usamos para chequear si coincide con el VID/PID.
        [DllImport("setupapi.dll", SetLastError = true, CharSet = CharSet.Unicode)]
        internal static extern bool SetupDiGetDeviceRegistryProperty(
            IntPtr DeviceInfoSet,
            ref SP_DEVINFO_DATA DeviceInfoData,
            uint Property,
            ref uint PropertyRegDataType,
            IntPtr PropertyBuffer,
            uint PropertyBufferSize,
            ref uint RequiredSize);

        // SetupDiGetDeviceInterfaceDetail() Nos dá la ruta de acceso del dispositivo, Necesaria antes de poder usar CreateFile().
        [DllImport("setupapi.dll", SetLastError = true, CharSet = CharSet.Unicode)]
        internal static extern bool SetupDiGetDeviceInterfaceDetail(
            IntPtr DeviceInfoSet,                   // Entrada: Espera por HDEVINFO que puede ser obtenido desde SetupDiGetClassDevs().
            ref SP_DEVICE_INTERFACE_DATA DeviceInterfaceData, // Entrada: Puntero a estructura que define la interfase de dispositivo.  
            IntPtr DeviceInterfaceDetailData,       // Salida: Puntero a la estructura SP_DEVICE_INTERFACE_DETAIL_DATA, la cuál recivirá la ruta de acceso del dispositivo.
            uint DeviceInterfaceDetailDataSize,     // Entrada: Número de bytes a recuperar.
            ref uint RequiredSize,                  // Salida: (Opcional): El número de bytes necesarios para sostener toda la estructura.
            IntPtr DeviceInfoData);                 // Salida: (Opcional): Puntero a la estructura SP_DEVINFO_DATA.

        // Sobrecarga para SetupDiGetDeviceInterfaceDetail().  Necesitamos esto ya que no podemos pasar punteros NULL directamente en C #.
        [DllImport("setupapi.dll", SetLastError = true, CharSet = CharSet.Unicode)]
        internal static extern bool SetupDiGetDeviceInterfaceDetail(
            IntPtr DeviceInfoSet,                   // Entrada: Espera por HDEVINFO que puede ser obtenido desde SetupDiGetClassDevs()
            ref SP_DEVICE_INTERFACE_DATA DeviceInterfaceData, // Entrada: Puntero a estructura que define la interfase de dispositivo.  
            IntPtr DeviceInterfaceDetailData,       // Salida: Puntero a la estructura SP_DEVICE_INTERFACE_DETAIL_DATA, la cuál recivirá la ruta de acceso del dispositivo.
            uint DeviceInterfaceDetailDataSize,     // Entrada: Número de bytes a recuperar.
            IntPtr RequiredSize,                    // Salida (Opcional): Puntero a variable del tipo DWORD para decirnos el número de bytes necesarios para sostener toda la estructura.
            IntPtr DeviceInfoData);                 // Salida: (Opcional): Puntero a la estructura SP_DEVINFO_DATA.

        // Necesitamos esta función para leer todos los mensajes de WM_DEVICECHANGE.
        [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
        internal static extern IntPtr RegisterDeviceNotification(
            IntPtr hRecipient,
            IntPtr NotificationFilter,
            uint Flags);

        // Toma una ruta al dispositivo y abre un handler.
        [DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
        static extern SafeFileHandle CreateFile(
            string lpFileName,
            uint dwDesiredAccess,
            uint dwShareMode,
            IntPtr lpSecurityAttributes,
            uint dwCreationDisposition,
            uint dwFlagsAndAttributes,
            IntPtr hTemplateFile);

        // Usa un handler(Creado con CreateFile()), y nos permite escribir datos en el dispositivo USB.
        [DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
        static extern bool WriteFile(
            SafeFileHandle hFile,
            byte[] lpBuffer,
            uint nNumberOfBytesToWrite,
            ref uint lpNumberOfBytesWritten,
            IntPtr lpOverlapped);

        // Usa un handler(Creado con CreateFile()), y nos permite leer datos desde el dispositivo USB.
        [DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
        static extern bool ReadFile(
            SafeFileHandle hFile,
            IntPtr lpBuffer,
            uint nNumberOfBytesToRead,
            ref uint lpNumberOfBytesRead,
            IntPtr lpOverlapped);


        #endregion
        #region // Variables globales.
        bool EstadodeConexion = false; // Necesario para tener a vista el estado de conección del USB y asegurar un buen funcionamiento.
        bool ConectadoPeroFallido = false;
        SafeFileHandle WriteHandleToUSBDevice = null;
        SafeFileHandle ReadHandleToUSBDevice = null;
        String RutaAccesoDispositivo = null;   // Es necesario encontrar la ruta de acceso del dispositivo antes de abrir los handlers.


        // Variables usadas por la aplicación.
        bool PushbuttonPressed = false;		//Updated by ReadWriteThread, read by FormUpdateTimer tick handler (needs to be atomic)
        bool ToggleLEDsPending = false;		//Updated by ToggleLED(s) button click event handler, used by ReadWriteThread (needs to be atomic)
        uint ADCValue = 0;			//Updated by ReadWriteThread, read by FormUpdateTimer tick handler (needs to be atomic)

        //Indentificador único global(GUID) para la clase HID. Windows usa las GUID's para identificar objetos.
        Guid InterfaceClassGuid = new Guid(0x4d1e55b2, 0xf16f, 0x11cf, 0x88, 0xcb, 0x00, 0x11, 0x11, 0x00, 0x00, 0x30);
        #endregion
        public unsafe Form1()
        {
            InitializeComponent();
            // Registro para las notificaciones WM_DEVICECHANGE.Este código es usado para detectar los enventos de conección/desconección plug and play de los dispositivos USB.
            DEV_BROADCAST_DEVICEINTERFACE DeviceBroadcastHeader = new DEV_BROADCAST_DEVICEINTERFACE();
            DeviceBroadcastHeader.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE;
            DeviceBroadcastHeader.dbcc_size = (uint)Marshal.SizeOf(DeviceBroadcastHeader);
            DeviceBroadcastHeader.dbcc_reserved = 0;
            DeviceBroadcastHeader.dbcc_classguid = InterfaceClassGuid;

            // Necesario para obtener la dirección de DeviceBroadcastHeader y llamar a RegisterDeviceNotification().
            IntPtr pDeviceBroadcastHeader = IntPtr.Zero;  // Crea un puntero..
            pDeviceBroadcastHeader = Marshal.AllocHGlobal(Marshal.SizeOf(DeviceBroadcastHeader)); // asinga memoria para una nueva estructura DEV_BROADCAST_DEVICEINTERFACE y retorna la dirección.
            Marshal.StructureToPtr(DeviceBroadcastHeader, pDeviceBroadcastHeader, false);  // Copia la estructura DeviceBroadcastHeader en la memoria ya asignada a DeviceBroadcastHeaderWithPointer.
            RegisterDeviceNotification(this.Handle, pDeviceBroadcastHeader, DEVICE_NOTIFY_WINDOW_HANDLE);

            // Ahora hace un intento inicial por encontrar el dispositivo USB, en caso de ya esté conectado a la PC y enumerado por el host antes de la lanzar la aplicación.
            // En caso de que esté conectado y presente, Nosotros debemos abrir los handles de lesctura/escriturar en el dispositivo para así luego podernos comunicarnos con el.
            // Si no está conectado , tendremos que esperar a que el usuario conecte el dispositivo, y que las funciones WM_DEVICECHANGE llamen a los diferentes procesos que analizarán los
            // mensajes y luego buscarán el dispositivo.

            if (CheckIfPresentAndGetUSBDevicePath())	// Chequea y se asegura que el último dispositivo que coincide con el  VID/PID está conectado.
            {
                uint ErrorStatusWrite;
                uint ErrorStatusRead;


                // Ahora tenemos la ruta de acceso del dispositivo correcta, entonces ahora podemos abrir en el dispositivo los hanles de lectura/escritura.
                WriteHandleToUSBDevice = CreateFile(DevicePath, GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, IntPtr.Zero, OPEN_EXISTING, 0, IntPtr.Zero);
                ErrorStatusWrite = (uint)Marshal.GetLastWin32Error();
                ReadHandleToUSBDevice = CreateFile(DevicePath, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, IntPtr.Zero, OPEN_EXISTING, 0, IntPtr.Zero);
                ErrorStatusRead = (uint)Marshal.GetLastWin32Error();

                if ((ErrorStatusWrite == ERROR_SUCCESS) && (ErrorStatusRead == ERROR_SUCCESS))
                {
                    bool EstadodeConexion = true; 
                    bool ConectadoPeroFallido = false;
                    Estado_USB.Text = "Dispositivo Encontrado, Estado de conección = CONECTADO";
                }
                else // Por alguna razón el dispositivo está conectado fisicamente pero uno de los 2 handles (lectura o escritura) no se abrió correctamente.
                {
                    bool EstadodeConexion = false;		// Deja que el resto de la aplicación sepa que no hay que realizar operaciones de LECTURA/ESCRITURA.
                    bool ConectadoPeroFallido = true;	// Esperamos que ocurra el siguiente mensaje de WM_DEVICECHANGE luego podemos reintentar abrir los pipes de lectura/escritura.
                    if (ErrorStatusWrite == ERROR_SUCCESS)
                        WriteHandleToUSBDevice.Close();
                    if (ErrorStatusRead == ERROR_SUCCESS)
                        ReadHandleToUSBDevice.Close();
                }
                }
			else	// El dispositivo no debe estar conectado (O no tiene grabado el firmware correcto).
			{
				EstadodeConexion = false;
				ConectadoPeroFallido = false;
			}
                if (AttachedState == true)
            {
                Estado_USB.Text = "Dispositivo Encontrado, Estado de conección = CONECTADO";
            }
            else
            {
               Estado_USB.Text = "Dispositivo no encontrado, Estado de conección = NO CONECTADO";
            }

            ReadWriteThread.RunWorkerAsync(); // Recomienda ejecutar las opereciones de lectura/escritura en un hilo de ejecución diferente. De otra manera
										      // las operaciones de lectura/escritura van a bloquear las operaciones 
										      // de usuario y la interfase en caso de que las operaciones de IO tarden mucho tiempo en completarse.


            }

        }
```

Como verán faltan funciones por desarrollar pero de a poco las estoy metiendo dentro del programa.

En cuanto al firmware le estoy haciendo modificaciones para obtener un óptimo funcionamiento.


----------



## Moyano Jonathan (Nov 10, 2010)

Buscando por la red encontré un documento donde explica detalladamente como usar los mensajes y las interrupciones de windows para gestionar la conexion USB usando lenguaje java...se los dejo para el que lo quiera usar:


----------



## tannke (Nov 10, 2010)

Enorabuena por el post y por todo el trabajo realizado, 68 paginas ya! 2 dias he estado en leero, el manual ahun no he tenido tiempo para ojearlo pero parece muy interesante. He usado el código en c# de la libreria de EasiHid me ha ahorrado mucho trabajo. Muchas gracias por el aporte.
Bueno, deciros que en CCS no tengo ni papa pero si necesitais cualquier cosa en MikroC para pic o C# os puedo intentar ayudar en lo que sea.

Un saludo!


----------



## Meta (Nov 10, 2010)

La gente está ya por el C18. No se porque se pasan ahora del CCS al C18 de microchip. Algo le vieron.

En cuanto alcçodigo del C# a VB .net lo puedes hacer por aquí.
http://www.developerfusion.com/tools/convert/csharp-to-vb/

*Moyano*, buen trabajo.


----------



## Moyano Jonathan (Nov 10, 2010)

C18 es un standar dentro de microchip y es totalmente ANSI C .....CCS tiene cosas dentro de la estructura del compilador y su sintaxis que no cumplen totalmente con ese standar ....igual es más comodo CCS para muchas cosas y está más optimizado en algunos aspectos....
Para USB por ahora lo mejor es CCS ...si alguien le interesa probar con C18 están los ejemplos de microchip que también funcionan muy bien


----------



## Meta (Nov 10, 2010)

Cada vez se habla del C18 y la gente lo prefiere más. Así cada meses me doy cuenta. Además que hay tutoriales sobre ello.

http://www.micropic.es/index.php?op...111:tutorial-c18&catid=35:articulos&Itemid=61

Saludo.


----------



## Moyano Jonathan (Nov 11, 2010)

Si vamos a ver que pasa con el C18, es más complejo manejarlo pero no para tanto....con práctica sale.


----------



## guillerusso (Nov 11, 2010)

Hola estimado Moyano y gente del foro. Estoy tratando de cambiarme de visual basic 6.0 a visual basic.net o visual basic2010. pero me encuentro con que la funcion PSet de VB6.0 no tiene un equivalente en VB.net. La pregunta seria.....
¿Como puedo graficar el resultado de la conversion del micro en un picturebox en VB.net?

este programa en VB6.0 lo quiero pasar a VB.net






la grafica muestra la carga y descarga de un capacitor. gracias


----------



## Meta (Nov 11, 2010)

Puedes prguntar por aquí.

http://social.msdn.microsoft.com/Forums/es-es/vb56es/threads

Saludo.


----------



## guillerusso (Nov 11, 2010)

Hola Meta ya estuve mirando por ahi pero no encuentro con que hacerlo.gracias


----------



## ByAxel (Nov 11, 2010)

guillerusso dijo:


> Hola Meta ya estuve mirando por ahi pero no encuentro con que hacerlo.gracias



Dibujar en un PictureBox necesitas de la clase System.Drawing.Graphics usando GDI+
Graphics Class...
eso es lo que buscas?


----------



## Moyano Jonathan (Nov 11, 2010)

Logré que la aplicación funcionara correctamente con lo básico para la comunicación:
Bueno ya logré lo básico que el dispositivo reconozca un dispositivo conectado mediante interrupciones...
les dejo el código:

```
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using Microsoft.Win32.SafeHandles;
using System.Runtime.InteropServices;
using System.Threading;


namespace HID_DEMO
{
    public partial class Form1 : Form
    {
        #region // Constantes, estructuras, llamados a funciones..(SISTEMA)
        // Constantes de setupapi.h que no están permitidas añadirlas directamente
        // por tratarse de lenguaje C#.
        internal const uint DIGCF_PRESENT = 0x02;
        internal const uint DIGCF_DEVICEINTERFACE = 0x10;
        // Constante para la función CreateFile() y otras funciones de I/O.
        internal const short FILE_ATTRIBUTE_NORMAL = 0x80;
        internal const short INVALID_HANDLE_VALUE = -1;
        internal const uint GENERIC_READ = 0x80000000;
        internal const uint GENERIC_WRITE = 0x40000000;
        internal const uint CREATE_NEW = 1;
        internal const uint CREATE_ALWAYS = 2;
        internal const uint OPEN_EXISTING = 3;
        internal const uint FILE_SHARE_READ = 0x00000001;
        internal const uint FILE_SHARE_WRITE = 0x00000002;
        // Constantes que indican los diferentes mensajes WM_DEVICECHANGE.
        internal const uint WM_DEVICECHANGE = 0x0219;
        internal const uint DBT_DEVICEARRIVAL = 0x8000;
        internal const uint DBT_DEVICEREMOVEPENDING = 0x8003;
        internal const uint DBT_DEVICEREMOVECOMPLETE = 0x8004;
        internal const uint DBT_CONFIGCHANGED = 0x0018;
        // Otras definiciones...
        internal const uint DBT_DEVTYP_DEVICEINTERFACE = 0x05;
        internal const uint DEVICE_NOTIFY_WINDOW_HANDLE = 0x00;
        internal const uint ERROR_SUCCESS = 0x00;
        internal const uint ERROR_NO_MORE_ITEMS = 0x00000103;
        internal const uint SPDRP_HARDWAREID = 0x00000001;
        // Algunas estructuras utilizadas por el programa:
        internal struct SP_DEVICE_INTERFACE_DATA
        {
            internal uint cbSize;
            internal Guid InterfaceClassGuid;
            internal uint Flags;
            internal uint Reserved;
        }

        internal struct SP_DEVICE_INTERFACE_DETAIL_DATA
        {
            internal uint cbSize;
            internal char[] DevicePath;
        }

        internal struct SP_DEVINFO_DATA
        {
            internal uint cbSize;
            internal Guid ClassGuid;
            internal uint DevInst;
            internal uint Reserved;
        }

        internal struct DEV_BROADCAST_DEVICEINTERFACE
        {
            internal uint dbcc_size;
            internal uint dbcc_devicetype;
            internal uint dbcc_reserved;
            internal Guid dbcc_classguid;
            internal char[] dbcc_name;
        }
        // DLL importadas:
        // Retorna información sobre el dispositivo. Esta función la necesitamos para llamar a otras
        // funciones que se encuentran dentro de setupdixxx().
        [DllImport("setupapi.dll", SetLastError = true, CharSet = CharSet.Unicode)]
        internal static extern IntPtr SetupDiGetClassDevs(
            ref Guid ClassGuid,     //LPGUID    Entrada: Necesaria para suministrar la GUID class. 
            IntPtr Enumerator,      //PCTSTR    Entrada: Usar NULL, no es necesario para nuestros propositos.
            IntPtr hwndParent,      //HWND      Entrada: Usar NULL, no es necesario para nuestros propositos.
            uint Flags);            //DWORD     Entrada: Flag que indica que clase de filtrado se usará.

        // Nos da la "PSP_DEVICE_INTERFACE_DATA", la cual contiene la GUID específica de interfase del dispositivo (Diferente a la GUID de clase).
        // Necesitamos la GUID de interfase para encontrar la ruta de acceso del dispositivo.
        [DllImport("setupapi.dll", SetLastError = true, CharSet = CharSet.Unicode)]
        internal static extern bool SetupDiEnumDeviceInterfaces(
            IntPtr DeviceInfoSet,           // Entrada: entrega el HDEVINFO que obtuvimos de SetupDiGetClassDevs ()
            IntPtr DeviceInfoData,          // Entrada: (opcional)
            ref Guid InterfaceClassGuid,    // Entrada: 
            uint MemberIndex,               // Entrada: "Indice" de los dispositivos de los cuales queremos obtener la ruta de acceso.
            ref SP_DEVICE_INTERFACE_DATA DeviceInterfaceData);    // Salida: Esta función se encuentra en la estructura "SP_DEVICE_INTERFACE_DATA".

        // SetupDiDestroyDeviceInfoList() Libera memoria destruyendo la lista de información de dispositivo.
        [DllImport("setupapi.dll", SetLastError = true, CharSet = CharSet.Unicode)]
        internal static extern bool SetupDiDestroyDeviceInfoList(
            IntPtr DeviceInfoSet);          // Entrada: Da un identificador de una lista de información de dispositivo para cancelar la asignación de memoria RAM.


        // SetupDiEnumDeviceInfo() Guarda en una estructura "SP_DEVINFO_DATA" structure, Lo que necesitamos para SetupDiGetDeviceRegistryProperty()
        [DllImport("setupapi.dll", SetLastError = true, CharSet = CharSet.Unicode)]
        internal static extern bool SetupDiEnumDeviceInfo(
            IntPtr DeviceInfoSet,
            uint MemberIndex,
            ref SP_DEVINFO_DATA DeviceInterfaceData);

        // SetupDiGetDeviceRegistryProperty() Nos dá el ID de hardware, El cuál usamos para chequear si coincide con el VID/PID.
        [DllImport("setupapi.dll", SetLastError = true, CharSet = CharSet.Unicode)]
        internal static extern bool SetupDiGetDeviceRegistryProperty(
            IntPtr DeviceInfoSet,
            ref SP_DEVINFO_DATA DeviceInfoData,
            uint Property,
            ref uint PropertyRegDataType,
            IntPtr PropertyBuffer,
            uint PropertyBufferSize,
            ref uint RequiredSize);

        // SetupDiGetDeviceInterfaceDetail() Nos dá la ruta de acceso del dispositivo, Necesaria antes de poder usar CreateFile().
        [DllImport("setupapi.dll", SetLastError = true, CharSet = CharSet.Unicode)]
        internal static extern bool SetupDiGetDeviceInterfaceDetail(
            IntPtr DeviceInfoSet,                   // Entrada: Espera por HDEVINFO que puede ser obtenido desde SetupDiGetClassDevs().
            ref SP_DEVICE_INTERFACE_DATA DeviceInterfaceData, // Entrada: Puntero a estructura que define la interfase de dispositivo.  
            IntPtr DeviceInterfaceDetailData,       // Salida: Puntero a la estructura SP_DEVICE_INTERFACE_DETAIL_DATA, la cuál recivirá la ruta de acceso del dispositivo.
            uint DeviceInterfaceDetailDataSize,     // Entrada: Número de bytes a recuperar.
            ref uint RequiredSize,                  // Salida: (Opcional): El número de bytes necesarios para sostener toda la estructura.
            IntPtr DeviceInfoData);                 // Salida: (Opcional): Puntero a la estructura SP_DEVINFO_DATA.

        // Sobrecarga para SetupDiGetDeviceInterfaceDetail().  Necesitamos esto ya que no podemos pasar punteros NULL directamente en C #.
        [DllImport("setupapi.dll", SetLastError = true, CharSet = CharSet.Unicode)]
        internal static extern bool SetupDiGetDeviceInterfaceDetail(
            IntPtr DeviceInfoSet,                   // Entrada: Espera por HDEVINFO que puede ser obtenido desde SetupDiGetClassDevs()
            ref SP_DEVICE_INTERFACE_DATA DeviceInterfaceData, // Entrada: Puntero a estructura que define la interfase de dispositivo.  
            IntPtr DeviceInterfaceDetailData,       // Salida: Puntero a la estructura SP_DEVICE_INTERFACE_DETAIL_DATA, la cuál recivirá la ruta de acceso del dispositivo.
            uint DeviceInterfaceDetailDataSize,     // Entrada: Número de bytes a recuperar.
            IntPtr RequiredSize,                    // Salida (Opcional): Puntero a variable del tipo DWORD para decirnos el número de bytes necesarios para sostener toda la estructura.
            IntPtr DeviceInfoData);                 // Salida: (Opcional): Puntero a la estructura SP_DEVINFO_DATA.

        // Necesitamos esta función para leer todos los mensajes de WM_DEVICECHANGE.
        [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
        internal static extern IntPtr RegisterDeviceNotification(
            IntPtr hRecipient,
            IntPtr NotificationFilter,
            uint Flags);

        // Toma una ruta al dispositivo y abre un handler.
        [DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
        static extern SafeFileHandle CreateFile(
            string lpFileName,
            uint dwDesiredAccess,
            uint dwShareMode,
            IntPtr lpSecurityAttributes,
            uint dwCreationDisposition,
            uint dwFlagsAndAttributes,
            IntPtr hTemplateFile);

        // Usa un handler(Creado con CreateFile()), y nos permite escribir datos en el dispositivo USB.
        [DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
        static extern bool WriteFile(
            SafeFileHandle hFile,
            byte[] lpBuffer,
            uint nNumberOfBytesToWrite,
            ref uint lpNumberOfBytesWritten,
            IntPtr lpOverlapped);

        // Usa un handler(Creado con CreateFile()), y nos permite leer datos desde el dispositivo USB.
        [DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
        static extern bool ReadFile(
            SafeFileHandle hFile,
            IntPtr lpBuffer,
            uint nNumberOfBytesToRead,
            ref uint lpNumberOfBytesRead,
            IntPtr lpOverlapped);


        #endregion
        #region // Variables globales.
        bool EstadodeConexion = false; // Necesario para tener a vista el estado de conección del USB y asegurar un buen funcionamiento.
        bool ConectadoPeroFallido = false;
        SafeFileHandle WriteHandleToUSBDevice = null;
        SafeFileHandle ReadHandleToUSBDevice = null;
        String DevicePath = null;   // Es necesario encontrar la ruta de acceso del dispositivo antes de abrir los handlers.

        //Indentificador único global(GUID) para la clase HID. Windows usa las GUID's para identificar objetos.
        Guid InterfaceClassGuid = new Guid(0x4d1e55b2, 0xf16f, 0x11cf, 0x88, 0xcb, 0x00, 0x11, 0x11, 0x00, 0x00, 0x30);
        #endregion

        public unsafe Form1()
        {
            InitializeComponent();
            // Registro para las notificaciones WM_DEVICECHANGE.Este código es usado para detectar los enventos de conección/desconección plug and play de los dispositivos USB.
            DEV_BROADCAST_DEVICEINTERFACE DeviceBroadcastHeader = new DEV_BROADCAST_DEVICEINTERFACE();
            DeviceBroadcastHeader.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE;
            DeviceBroadcastHeader.dbcc_size = (uint)Marshal.SizeOf(DeviceBroadcastHeader);
            DeviceBroadcastHeader.dbcc_reserved = 0;
            DeviceBroadcastHeader.dbcc_classguid = InterfaceClassGuid;

            // Necesario para obtener la dirección de DeviceBroadcastHeader y llamar a RegisterDeviceNotification().
            IntPtr pDeviceBroadcastHeader = IntPtr.Zero;  // Crea un puntero..
            pDeviceBroadcastHeader = Marshal.AllocHGlobal(Marshal.SizeOf(DeviceBroadcastHeader)); // asinga memoria para una nueva estructura DEV_BROADCAST_DEVICEINTERFACE y retorna la dirección.
            Marshal.StructureToPtr(DeviceBroadcastHeader, pDeviceBroadcastHeader, false);  // Copia la estructura DeviceBroadcastHeader en la memoria ya asignada a DeviceBroadcastHeaderWithPointer.
            RegisterDeviceNotification(this.Handle, pDeviceBroadcastHeader, DEVICE_NOTIFY_WINDOW_HANDLE);

            // Ahora hace un intento inicial por encontrar el dispositivo USB, en caso de ya esté conectado a la PC y enumerado por el host antes de la lanzar la aplicación.
            // En caso de que esté conectado y presente, Nosotros debemos abrir los handles de lesctura/escriturar en el dispositivo para así luego podernos comunicarnos con el.
            // Si no está conectado , tendremos que esperar a que el usuario conecte el dispositivo, y que las funciones WM_DEVICECHANGE llamen a los diferentes procesos que analizarán los
            // mensajes y luego buscarán el dispositivo.

            if (CheckIfPresentAndGetUSBDevicePath())	// Chequea y se asegura que el último dispositivo que coincide con el  VID/PID está conectado.
            {
                uint ErrorStatusWrite;
                uint ErrorStatusRead;


                // Ahora tenemos la ruta de acceso del dispositivo correcta, entonces ahora podemos abrir en el dispositivo los hanles de lectura/escritura.
                WriteHandleToUSBDevice = CreateFile(DevicePath, GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, IntPtr.Zero, OPEN_EXISTING, 0, IntPtr.Zero);
                ErrorStatusWrite = (uint)Marshal.GetLastWin32Error();
                ReadHandleToUSBDevice = CreateFile(DevicePath, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, IntPtr.Zero, OPEN_EXISTING, 0, IntPtr.Zero);
                ErrorStatusRead = (uint)Marshal.GetLastWin32Error();

                if ((ErrorStatusWrite == ERROR_SUCCESS) && (ErrorStatusRead == ERROR_SUCCESS))
                {
                    bool EstadodeConexion = true; 
                    bool ConectadoPeroFallido = false;
                    Estado_USB.Text = "Dispositivo Encontrado, Estado de conección = CONECTADO";
                }
                else // Por alguna razón el dispositivo está conectado fisicamente pero uno de los 2 handles (lectura o escritura) no se abrió correctamente.
                {
                    bool EstadodeConexion = false;		// Deja que el resto de la aplicación sepa que no hay que realizar operaciones de LECTURA/ESCRITURA.
                    bool ConectadoPeroFallido = true;	// Esperamos que ocurra el siguiente mensaje de WM_DEVICECHANGE luego podemos reintentar abrir los pipes de lectura/escritura.
                    if (ErrorStatusWrite == ERROR_SUCCESS)
                        WriteHandleToUSBDevice.Close();
                    if (ErrorStatusRead == ERROR_SUCCESS)
                        ReadHandleToUSBDevice.Close();
                }
                }
			else	// El dispositivo no debe estar conectado (O no tiene grabado el firmware correcto).
			{
				EstadodeConexion = false;
				ConectadoPeroFallido = false;
			}
                if (EstadodeConexion == true)
            {
                Estado_USB.Text = "Dispositivo Encontrado, Estado de conección = CONECTADO";
            }
            else
            {
               Estado_USB.Text = "Dispositivo no encontrado, Estado de conección = NO CONECTADO";
            }

                ReadWriteUSB.RunWorkerAsync(); // Recomienda ejecutar las opereciones de lectura/escritura en un hilo de ejecución diferente. De otra manera
										      // las operaciones de lectura/escritura van a bloquear las operaciones 
										      // de usuario y la interfase en caso de que las operaciones de IO tarden mucho tiempo en completarse.


            }

        bool CheckIfPresentAndGetUSBDevicePath()
        {
           #region // Función: CheckIfPresentAndGetUSBDevicePath()

    /* Antes de que podamos "conectar" nuestra aplicación a un dispositivo UBS embebido, debemos encontrar el dispositivo en cuestión.
       en el bus USB pueden haber muchos dispositivo conectados simulatáneamente, asi que de alguna manera tenemos que encontrar nuestro dispositivo de entre todos.
       Esto se hace con el identificador de proveedor (VID) y el identificador de producto (PID). Cada línea de productos USB debe tener
       una combinación única de VID y PID.
    */

    // Función:	CheckIfPresentAndGetUSBDevicePath()
    // Propósito: Chequea si un dispositivo está conectado fisicamente en coicidencia con un  VID y PID.
    // Entrada:	Usamos los string declarados globalmente DevicePath,GUID y la constante MY_DEVICE_ID.
    // Salida:	Retorna un booleano. Verdadero cuando el dispositivo coincide con el ID/PID encontrado. Falso si VID/PID no ha sido encontrado.
    //			Cuando retorna verdadero, la globalmente accesible "DetailedInterfaceDataStructure" conetenerá la 
    //			la ruta de acceso al dispositivo USB que coincida con el VID/PID declarado.



    // Microsoft ha creado un cierto número de funciones, que son de mucha ayuda para encontrar dispositivos plug and play. La 
    // documentación sobre estás funciones puede encontrarse en la librería MSDN. Nosotros vamos a usar las siguientes funciones (funciones no administradas C):
    /*
            SetupDiGetClassDevs()					// Proveida por setupapi.dll, que viene con  Windows.
            SetupDiEnumDeviceInterfaces()			// Proveida por setupapi.dll, que viene con  Windows.
            GetLastError()							// Proveida por kernel32.dll, que viene con  Windows.
            SetupDiDestroyDeviceInfoList()			// Proveida por setupapi.dll, que viene con  Windows.
            SetupDiGetDeviceInterfaceDetail()		// Proveida por setupapi.dll, que viene con  Windows.
            SetupDiGetDeviceRegistryProperty()		// Proveida por setupapi.dll, que viene con  Windows.
            CreateFile()							// Proveida por kernel32.dll, que viene con  Windows.
     */
    // Con el fin de llamar a estas funciones no administradas, la clase Marshal es muy útil.
    // También vamos a utilizar los siguientes tipos de datos y estructuras inusuales. La documentación también se puede encontrar en la biblioteca de MSDN:
    /*
    PSP_DEVICE_INTERFACE_DATA
    PSP_DEVICE_INTERFACE_DETAIL_DATA
    SP_DEVINFO_DATA
    HDEVINFO
    HANDLE
    GUID
     */
    // El objetivo final del siguiente código es obtener la ruta de acceso del dispositivo, que se utilizará en otros lugares para obtener
    // leer y escribir controladores para el dispositivo USB. Una vez que los controladores de lectura/escritura han sido abiertos , la aplicación de la PC
    // podrá comenzar a leer/escribir el dispositivo usando las funciones WriteFile() y ReadFile().

    // Obtener la ruta del dispositivo es una ronda de varios pasos sobre el proceso, que requiere llamar una gran cantidad de funciones de 
    // SetupDixxx()proveidas por setupapi.dll.
    
     try
            {
		        IntPtr DeviceInfoTable = IntPtr.Zero;
		        SP_DEVICE_INTERFACE_DATA InterfaceDataStructure = new SP_DEVICE_INTERFACE_DATA();
                SP_DEVICE_INTERFACE_DETAIL_DATA DetailedInterfaceDataStructure = new SP_DEVICE_INTERFACE_DETAIL_DATA();
                SP_DEVINFO_DATA DevInfoData = new SP_DEVINFO_DATA();

		        uint InterfaceIndex = 0;
		        uint dwRegType = 0;
		        uint dwRegSize = 0;
                uint dwRegSize2 = 0;
		        uint StructureSize = 0;
		        IntPtr PropertyValueBuffer = IntPtr.Zero;
		        bool MatchFound = false;
		        uint ErrorStatus;
		        uint LoopCounter = 0;

               // Utilice el formato: "Vid_xxxx&Pid_xxxx" donde xxxx es un número hexadecimal de 16-bit.
               // Asegúrese de que el valor que aparece en el Parentesis coincide con el descriptor del dispositivo USB
               // qyue la aplicación está tratando de encontrar.
                String DeviceIDToFind = "Vid_04d8&Pid_003f"; // VID/PID del dispositivo.

                // En primer lugar rellena una lista con los dispositivos conectados (especificando "DIGCF_PRESENT"), que son de la clase GUID específica. 
		        DeviceInfoTable = SetupDiGetClassDevs(ref InterfaceClassGuid, IntPtr.Zero, IntPtr.Zero, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE);

                if(DeviceInfoTable != IntPtr.Zero)
                {
                    // Ahora mire a través de la lista que acabamos de rellenar. Estamos tratando de ver si alguno de ellos coincide con nuestro dispositivo. 
		            while(true)
		            {
                        InterfaceDataStructure.cbSize = (uint)Marshal.SizeOf(InterfaceDataStructure);
			            if(SetupDiEnumDeviceInterfaces(DeviceInfoTable, IntPtr.Zero, ref InterfaceClassGuid, InterfaceIndex, ref InterfaceDataStructure))
			            {
                            ErrorStatus = (uint)Marshal.GetLastWin32Error();
                            if (ErrorStatus == ERROR_NO_MORE_ITEMS)	// Alcanzamos el final de la lista de dispositivos compatibles en la tabla DeviceInfoTable?
				            {	// No pudimos encontrar el dispositivo. No debe estar conectado...
					            SetupDiDestroyDeviceInfoList(DeviceInfoTable);	// Elimina la estructura que no se usa más...
					            return false;		
				            }
			            }
			            else	// Otro error de algún tipo ha ocurrido.
			            {
                            ErrorStatus = (uint)Marshal.GetLastWin32Error();
                            SetupDiDestroyDeviceInfoList(DeviceInfoTable);	// Elimina la estructura que no se usa más...
				            return false;	
			            }

			            // Ahora devuelve desde el registro el ID de hardware. El ID de hardware contiene el VID y PID, luego chequea 
			            // si el dispositivo es el correcto o no.

			            // Inicializa la estructura SP_DEVINFO_DATA. Necesitamos esta estructura para la función SetupDiGetDeviceRegistryProperty().
                        DevInfoData.cbSize = (uint)Marshal.SizeOf(DevInfoData);
			            SetupDiEnumDeviceInfo(DeviceInfoTable, InterfaceIndex, ref DevInfoData);

                        // Primero consulta por el tamaño del identificador de hardware, para que podamos saber cuán grande tiene que ser el búfer para asignar los datos.
			            SetupDiGetDeviceRegistryProperty(DeviceInfoTable, ref DevInfoData, SPDRP_HARDWAREID, ref dwRegType, IntPtr.Zero, 0, ref dwRegSize);

                        // Asigna un búfer para el identificador de hardware.
                        // Normalmente tendría que funcionar, pero podría lanzar una excepción "OutOfMemoryException" si no hay suficientes recursos disponibles.
                        PropertyValueBuffer = Marshal.AllocHGlobal((int)dwRegSize);

			            // Devuelve el ID de hardware del dispositivo que estamos buscando. PropertyValueBuffer se rellena con 
			            // REG_MULTI_SZ (arreglo de strings nulos). Para buscar un dispositivo, solo debemos tener en cuenta los primeros string's en el buffer
			            // que es el ID de dispositivo. El ID de dispositivo es una cadena que contiene el VID/PID, en el ejemplo:
			            // "Vid_04d8&Pid_003f".

                        SetupDiGetDeviceRegistryProperty(DeviceInfoTable, ref DevInfoData, SPDRP_HARDWAREID, ref dwRegType, PropertyValueBuffer, dwRegSize, ref dwRegSize2);

			            // Ahora chequea si la primera cadena del ID de dispositivo, coincide con el ID de dispositivo USB que estamos trantando de encontrar.
			            String DeviceIDFromRegistry = Marshal.PtrToStringUni(PropertyValueBuffer); // Crea una nueva cadena, la llena con el contenido de PropertyValueBuffer

			            Marshal.FreeHGlobal(PropertyValueBuffer);		// PropertyValueBuffer ya no se necesita , libera la memoria para prevenir cuelgues potenciales.

                        // Convertir las dos cadenas a minúsculas. Esto hace que el código sea más sólido / portable a través de versiones de sistema operativo.
			            DeviceIDFromRegistry = DeviceIDFromRegistry.ToLowerInvariant();	
			            DeviceIDToFind = DeviceIDToFind.ToLowerInvariant();
                        // Ahora compruebe si el identificador de hardware que está viendo contiene los VID / PID correctos.
			            MatchFound = DeviceIDFromRegistry.Contains(DeviceIDToFind);		
			            if(MatchFound == true)
			            {
                            // El dispositivo ha sido encontrado. Con el fin de que abra los controladores de R/W, tendremos que encontrar la ruta del dispositivo en primer lugar.
                            // Podemos obtener la ruta del dispositivo llamando a la función SetupDiGetDeviceInterfaceDetail(), Sin embargo, tenemos que llamar a esta función dos veces: La primera
				            // vez para obtener el tamaño requerido de la estructura/buffer structure/buffer para contener los detalles de los datos de la interfaz, luego por segunda vez para
                            // para obtener la estructura (después de haber asignado suficiente memoria para la estructura.)
                            DetailedInterfaceDataStructure.cbSize = (uint)Marshal.SizeOf(DetailedInterfaceDataStructure);
                            // Primera llamada rellena "StructureSize" con el valor correcto
				            SetupDiGetDeviceInterfaceDetail(DeviceInfoTable, ref InterfaceDataStructure, IntPtr.Zero, 0, ref StructureSize, IntPtr.Zero);
                            // Necesitamos llamar a SetupDiGetDeviceInterfaceDetail() nuevamente, esta vez la especificación de un puntero a un buffer SP_DEVICE_INTERFACE_DETAIL_DATA con el tamaño correcto de la memoria asignada.
                            // En primer lugar necesitamos asignar el búfer no administrado y obtener un puntero a el.
                            IntPtr pUnmanagedDetailedInterfaceDataStructure = IntPtr.Zero;  // Declaramos el puntero.
                            pUnmanagedDetailedInterfaceDataStructure = Marshal.AllocHGlobal((int)StructureSize);    // Reserva parte de la memoria no administrado para la estructura.
                            DetailedInterfaceDataStructure.cbSize = 6; // Inicializar el parámetro cbSize(4 bytes para DWORD + 2 bytes para terminador nulo unicode)
                            Marshal.StructureToPtr(DetailedInterfaceDataStructure, pUnmanagedDetailedInterfaceDataStructure, false); // Copia el contenido de la estructura, a un espacio de memoria no administrado.

                            // Ahora llama por segunda vez a SetupDiGetDeviceInterfaceDetail() para recibir la ruta del dispositivo en la estructura en pUnmanagedDetailedInterfaceDataStructure.
                            if (SetupDiGetDeviceInterfaceDetail(DeviceInfoTable, ref InterfaceDataStructure, pUnmanagedDetailedInterfaceDataStructure, StructureSize, IntPtr.Zero, IntPtr.Zero))
                            {
                                // Es necesario extraer la ruta del dispositivo from de la "estructura" no administrada.  La dirección comienza en (pUnmanagedDetailedInterfaceDataStructure + sizeof(DWORD)).
                                IntPtr pToDevicePath = new IntPtr((uint)pUnmanagedDetailedInterfaceDataStructure.ToInt32() + 4);  //Add 4 to the pointer (to get the pointer to point to the path, instead of the DWORD cbSize parameter)
                                DevicePath = Marshal.PtrToStringUni(pToDevicePath); //Now copy the path information into the globally defined DevicePath String.

                                // Ahora tenemos la ruta del dispositivo adecuado, y finalmente podemos utilizar la ruta de acceso para abrir los controladores de R/W en el dispositivo.
                                SetupDiDestroyDeviceInfoList(DeviceInfoTable);	//Clean up the old structure we no longer need.
                                Marshal.FreeHGlobal(pUnmanagedDetailedInterfaceDataStructure);  //No longer need this unmanaged SP_DEVICE_INTERFACE_DETAIL_DATA buffer.  We already extracted the path information.
                                return true;    //Returning the device path in the global DevicePath String
                            }
                            else //Some unknown failure occurred
                            {
                                uint ErrorCode = (uint)Marshal.GetLastWin32Error();
                                SetupDiDestroyDeviceInfoList(DeviceInfoTable);	// Elimina la estructura que no se usa más...
                                Marshal.FreeHGlobal(pUnmanagedDetailedInterfaceDataStructure);   // Elimina la estructura que no se usa más...
                                return false;    
                            }
                        }

			            InterfaceIndex++;	
			            // Se queda buscando un dipositivo que concuerde con el VID/PID haciendo interaciónes...
			            // Sin embargo en algunos casos pueden aparecer errores no previstos, pone un ojo sobre el número de loop's ejecutados.
			            // Si el número de iteraciones es muy grande, salimos de todos modos, para prevenir de entrar en un loop infinito.
			            LoopCounter++;
			            if(LoopCounter == 10000000)	
			            {
				            return false;
			            }
		            }
                }
                return false;
            }
            catch
            {
                // Algo salío mal en este punto....falta de recursos quizás.
			    return false;	
            }
        }
            #endregion 
        protected override void WndProc(ref Message m)
       
        {
            #region // MENSAJES: WM_DEVICHANGE.
            // Esta es una función de retorno que se origina cuando un mensaje de Windows que se recibe por el formulario principal.
            // Vamos a recibir diversos tipos de mensajes, pero los que realmente queremos usar son los mensajes WM_DEVICECHANGE.
            if (m.Msg == WM_DEVICECHANGE)
            {
                if (((int)m.WParam == DBT_DEVICEARRIVAL) || ((int)m.WParam == DBT_DEVICEREMOVEPENDING) || ((int)m.WParam == DBT_DEVICEREMOVECOMPLETE) || ((int)m.WParam == DBT_CONFIGCHANGED))
                {
                    // Los Mensajes WM_DEVICECHANGE son bastante genéricos, y pueden ser causadados por una serie de diferentes
                    // fuentes, no sólo de dispositivos de hardware USB. Por lo tanto hay que averiguar si alguno de los cambios relevantes
                    // están teniendo lugar (sabiendo el VID/PID) antes de abrir o cerrar los handles/endpoints.
                    // (El mensaje podría ser totalmente ajeno al dispositivo USB o a la aplicación)

                    if (CheckIfPresentAndGetUSBDevicePath())	// Compruebe y asegúrese de que al menos un dispositivo que coincida con VID / PID esté conectado.
                    {
                        // Si se ha ejecutado el programa hasta acá , quiere decir que el dispositivo está conectado y fue encontrado.
                        // Este cófdigo se necesita para saber que hacer , en función de si el dispositivo está conectado o no.
                        if ((EstadodeConexion == false) || (ConectadoPeroFallido == true))	//Check the previous attachment state
                        {
                            uint ErrorStatusWrite;
                            uint ErrorStatusRead;

                            // Obtenemos la ruta del dispositivo correcta (Llamando a la función CheckIfPresentAndGetUSBDevicePath()), y ahora
                            // abrir los controladores de W/R del dispositivo.
                            WriteHandleToUSBDevice = CreateFile(DevicePath, GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, IntPtr.Zero, OPEN_EXISTING, 0, IntPtr.Zero);
                            ErrorStatusWrite = (uint)Marshal.GetLastWin32Error();
                            ReadHandleToUSBDevice = CreateFile(DevicePath, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, IntPtr.Zero, OPEN_EXISTING, 0, IntPtr.Zero);
                            ErrorStatusRead = (uint)Marshal.GetLastWin32Error();

                            if ((ErrorStatusWrite == ERROR_SUCCESS) && (ErrorStatusRead == ERROR_SUCCESS))
                            {
                                EstadodeConexion = true;		// Deja que el resto de la aplicación PC seba que el dispositivo USB está conectado, y es seguro para leer / escribir en él.
                                ConectadoPeroFallido = false;
                                Estado_USB.Text = "Dispositivo Encontrado, Estado de conección = CONECTADO";
                            }
                            else // Por alguna razón el dispositivo está conectado fisicamente pero uno de los 2 handles (lectura o escritura) no se abrieron correctamente.
                            {
                                EstadodeConexion = false;		// Deja que el resto de la aplicación sepa que no hay que realizar operaciones de LECTURA/ESCRITURA.
                                ConectadoPeroFallido = true;	// Esperamos que ocurra el siguiente mensaje de WM_DEVICECHANGE luego podemos reintentar abrir los pipes de lectura/escritura.
                                if (ErrorStatusWrite == ERROR_SUCCESS)
                                    WriteHandleToUSBDevice.Close();
                                if (ErrorStatusRead == ERROR_SUCCESS)
                                    ReadHandleToUSBDevice.Close();
                            }
                        }
                    }
                    else	// El dispositivo no debe estar conectado (O no tiene grabado el firmware correcto).
                    {
                        if (EstadodeConexion == true)		// Si está establecido en true, significa que el dispositivo fue desconectado en este momento.
                        {
                            EstadodeConexion = false;
                            WriteHandleToUSBDevice.Close();
                            ReadHandleToUSBDevice.Close();
                        }
                        EstadodeConexion = false;
                        ConectadoPeroFallido = false;
                    }
                }
            } 

            base.WndProc(ref m);
        }
            #endregion
        private void ActualizaciónDatos_Tick(object sender, EventArgs e)
        {
            //This timer tick event handler function is used to update the user interface on the form, based on data
            //obtained asynchronously by the ReadWriteThread and the WM_DEVICECHANGE event handler functions.

            
            if (EstadodeConexion == true) // Lee los mensajes de WM_DEVICECHANGE y opera..
            {
                // Dispositivo conectado y disponible para comuncaciones.
                Estado_USB.Text = "Dispositivo Encontrado, Estado de conección = CONECTADO";
                
             
            }
            if ((EstadodeConexion == false) || (ConectadoPeroFallido == true)) // Lee los mensajes de WM_DEVICECHANGE y opera..
            {
                // Dispositivo no disponible para comunicaciones.
                Estado_USB.Text = "Dispositivo no encontrado, Estado de conección = NO CONECTADO";
                
            }

        }


    }
}
```
Como podrán apreciar están todas las líneas comentadas en español para que puedan entender la estructura de la aplicación.

Y para los que no creen  les dejo un video de la aplicación en funcionamiento:





PD: Disculpen la calidad.....es lo que tengo para filmar


----------



## tonycop (Nov 11, 2010)

Enhorabuena.
Llevo siguiendo este hilo hace meses y les aplaudo.
Moyano, enhorabuena por este último pequeño gran paso.

Moyano, aprovecho para pedirle un consejo. Estoy realizando un proyecto en el que un sensor toma unos datos y los almacena el pic en su memoria eeprom. Hasta aqui todo funciona correcto.
Ahora quiero descargar esos datos(64K) via USB. Me gustaría hacerlo lo mas facil posible desde el punto de vista del usuario, por tanto, no quiero tener que instalar driver en windows ni nada de eso,solo ejecutar un pequeño programa en VB. Por tanto e pensado que el modo HID es lo ideal para eso,me equivoco?
Desde el punto de vista del software del PC para el modo HID estoy perdido,¿ es muy diferente al modo bulk?(esto si lo he probado y mas o menos funcionaba)

Gracias y enhorabuena de nuevo


----------



## Moyano Jonathan (Nov 11, 2010)

*tonycop:* Hola bienvenido al foro, mis avances son debido a un gran esfuerzo...pero todo de a poco va saliendo...

Mi aplicación va a grabar memorias eeprom ...pero en un futuro...lo veo complejo por ahora...ahora lo más facil que podés hacer es tomar los datos desde el PIC...mandarlos por USB y en la aplicación tener un bloc de texto donde los datos de a poco se van escribiendo...y vos tengas la posibilidad de guardar un archivo con los datos leidos..

Igual te queda investigar y ver como implementarlo....yo por ahora no he hecho nada de esas caracteristicas..

saludos !


----------



## tonycop (Nov 11, 2010)

Moyano Jonathan dijo:


> *tonycop:* Hola bienvenido al foro, mis avances son debido a un gran esfuerzo...pero todo de a poco va saliendo...


 Llevo siguiendo tus progresos hace meses y me imagino tu esfuerzo, por eso te aplaudo...



Moyano Jonathan dijo:


> Mi aplicación va a grabar memorias eeprom ...pero en un futuro...lo veo complejo por ahora...ahora lo más facil que podés hacer es tomar los datos desde el PIC...mandarlos por USB y en la aplicación tener un bloc de texto donde los datos de a poco se van escribiendo...y vos tengas la posibilidad de guardar un archivo con los datos leidos..


Seguramente implemente esa opción(que el pic envie los datos), ya que se me acaba el plazo de entrega.
Si avanzo rápido compartiré mis avances con ustedes.
saludos y ánimo!


----------



## willynovi (Nov 12, 2010)

hace un tiempo que vengo con el USB y siempre he usado C18 y la WinAPI32 en C.

Con el C18 no he tenido problemas, y si alguien necesita una ayudita que pregunte nomas, creo que ya he posteado un ejemplito.

Para el soft del lado de la PC no estoy usando una dll, si no que uso la DDK98, por ahora lo he probado en Vista32 y funciona bien, me faltaria en W7, aunque me han comentado que no deberia haber problemas si funciona bien en Vista, es cierto esto?


----------



## Moyano Jonathan (Nov 12, 2010)

Hola willy , no tendrías que tener dramas...si tu código funciona bien en vista32 tendría que funcionar en Win 7


----------



## Meta (Nov 12, 2010)

Lo que puede haber problemas con los 64 bits, habrá que probarlo.

Se está trabajando para el mini manual rápido del USB. A estudiarlo bien.

Saludos willynovi.


----------



## Moyano Jonathan (Nov 12, 2010)

Bueno viendo la página de un gran programador Suky , encontré una forma más sencilla de resolver el tema de la programación de la EEPROM: http://www.micros-designs.com.ar/practicas-en-visual-c-03/#comment-114 acá el explica como importar archivos en formato de texto plano para poder visualizarlos directamente en un Textbox...por lo que la programación va a ser mucho más sencilla.

En cuanto a a la aplicación ya he terminado lo más complicado ...solo me queda terminar de escribir el firmware del PIC y hacer unos ajustes a la interfaz.

PD: Solo haré la interfaz en Visual C# y la programación en C de CCS por el momento ya que no dispongo de mucho tiempo para los demás lenguajes..el que quiera portar luego la aplicación tendrá que hacerlo por cuenta propia..esto es debido a que tengo muchas cosas para hacer dentro y fuera de la electrónica espero que sepan entender..


----------



## Meta (Nov 12, 2010)

Hola:

Hay más información de texto en plano por aquí.
http://msdn.microsoft.com/es-es/default.aspx

Si, se hará en C# la interfaz. Bastante haz hecho en ponerte en hacer este manual y la programación para poder ser capaz novato como yo en hacer cosas en el USB y PIC de manera amena y sencilla posible.

Si sigo sin empleo, puedo dedicarme poco a poco adaptarlo a VB .net y C++. Dije poco a poco que tengo clases de programación y no es de .net, para el próximo año nos tocará bases de datos y .net, vete a saber que más.

Gracias por tu tiempo.


----------



## guillerusso (Nov 12, 2010)

tonycop dijo:


> Enhorabuena.
> Llevo siguiendo este hilo hace meses y les aplaudo.
> Moyano, enhorabuena por este último pequeño gran paso.
> 
> ...




Hola tengo un ejemplo de Moyano de HID en visual basic 6.0, modificado para mandar 64bytes desde el micro a la pc, estos bytes son los resultados del conversor.


----------



## Moyano Jonathan (Nov 13, 2010)

Les dejo el programa donde puedo leer y modificar un archivo .hex


----------



## Meta (Nov 13, 2010)

Funiona. Estás hecho un profesional.



Muchos ánimos.


----------



## Moyano Jonathan (Nov 13, 2010)

Eso es facil ahora hay que tratar como está compuesto el archivo .hex para tratar los datos y poder obtener la dirección y el dato para grabar la eeprom.
Si alguien le interesa saber como está compuesto un archivo .hex les dejo estos 2 links:
http://www.todopic.com.ar/foros/index.php?topic=23342.0
http://es.wikipedia.org/wiki/Intel_HEX


----------



## Meta (Nov 13, 2010)

Lo leí hace un buen tiempo. En las ayudas del MPLAB v8.60 explica algo parecido.


----------



## tannke (Nov 13, 2010)

Muy buenas, a principios de año cuando empecé con esto de los pic's y en asm, hice una aplicación de matriz de leds 8x8 utilizando para el almacenamiento de datos una memoria eeprom I2C. Bueno, el caso es que para generar el codigo para la eeprom con las frases que uno quisiera hice una pequeña aplicación que generaba el archivo .hex, para posteriormente ser programado con nuestro programador (en mi caso TE20 con Winpic800).

El programa esta en este hilo:
http://www.todopic.com.ar/foros/index.php?topic=24712.80

Ahí se quedó con la versión 1.3, y (antes) actualizable a la 2.1. (digo antes pq ya no tengo el servidor ftp desde donde se descargaba la actualización)

Si te puede ser de alguna utilidad te puedo pasar los fuentes del programa (que tendría que comentar un poco, que soy algo descuidado yo con esto) o necesitas alguna colaboracón avisa.

Pd. si descargais el programa deciros que para poder escribir algo antes teneis que editar los caracteres en herramientas/libreria de caracteres.

Un saludo


----------



## Moyano Jonathan (Nov 15, 2010)

Estaría bueno que postearas el código fuente para estudiarlo , ahora estoy viendo de usar en vez de la ventana de texto un datagridview para mostrar los datos como en el PICKIT2 pero de a poco se va logrando...







como verán todavía tengo un pequeño error en la gráfica y hay que correjir el código fuente para hacer más rápida la ejecución del programa..

Con respecto al PIC me falta añadir el código de las entradas digitales y salidas digitales y termino con la primera versión del firmware hasta que pueda seguir con el control de la memoria.


----------



## Meta (Nov 15, 2010)

Si que te lo haz currado.



¿Es lo que buscas?

Saludo.

Edito:

Perdón, deja la propiedad *ScrollBars en Vertica*l. Vete probando lo que hace cada opción para que te quedes con el funcionamiento.


----------



## reikomac (Nov 17, 2010)

hola moyano y meta, los felicito por sus aportes que han dado sobre el tema de USB muy bueno el aporte que han hecho en todo lo que se refiere a este tema y admiro todo el tiempo que le han dedicado, he estado leyendo sus posts hasta la pagina 15 de ahi salte a la ultima para ver en lo que trabajan ahora ultimo, mi pregunta es si en todo este tiempo hubo o hay alguien que ha desarrollado alguna conexion entre el pic y matlab? agradeceria tu ayuda o los datos que me pudieran dar o talvez se abrio un nuevo tema, de ante mano gracias.


----------



## cadcc (Nov 18, 2010)

una pregunta como hago en visual basic 2008 para hacer la conexion y desconexion en caliente del pueto serie lo he intentado y no me sale 

muchas gracias por compartir sus conocimientos
apenas boy por la primera parte de controlar 8 reles por cdc
miren esto es lo q hice lo simule en proteus y funciona perfecto


#include <18f2550.h>
#fuses HSPLL,NOMCLR,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN,NOPBADEN

#use delay(clock=48000000) // Frecuencia máxima de trabajo.
#include <usb_cdc.h> // Descripción de funciones del USB.

int d;

void noconectado(){
output_high(PIN_B0); // Función USB no detectada. (Enciende LED rojo)
output_low(PIN_B1);  // (Apaga LED verde)

}
void conectado(){
output_high(PIN_B1); // Función USB detectada.    (Enciende LED verde)
output_low(PIN_B0); //  (Apaga LED rojo)
}


void main (){
output_a(0);
output_b(0);
output_c(0);

usb_cdc_init(); // Funciones necesarias para iniciar el módulo USB.
usb_init(); // Funciones necesarias para iniciar el módulo USB.


while(!usb_cdc_connected()) té c{  // Mientras el USB no esonectado.
noconectado();   //llamo a funcion noconectado
}
conectado();   //si ya conecto llamo funcion conectado

if (usb_enumerated()){ // Si el puerto ya fue enumerado por el host :
 output_high(PIN_B2); // Enciende led de enumeración_OK.
}

do{
 if(usb_cdc_kbhit()){ // en espera de nuevo(s) caracter(es) en el buffer.
d=usb_cdc_getc();

 if(d==1){ // ¿lo que llegó fué el NUEMRO 1?
 output_toggle(pin_b3); // bascula T implementada con la función output_toggle()
 d=0;
 }
 if(d==2){
 output_toggle(pin_A0); // bascula T implementada con la función output_toggle()
 d=0;
 }
 if(d==3){
 output_toggle(pin_A1); // bascula T implementada con la función output_toggle()
 d=0;
 }
 if(d==4){
 output_toggle(pin_A2); // bascula T implementada con la función output_toggle()
 d=0;
 }
 if(d==5){
 output_toggle(pin_A3); // bascula T implementada con la función output_toggle()
 d=0;
 }
 if(d==6){
 output_toggle(pin_B4); // bascula T implementada con la función output_toggle()
 d=0;
 }
 if(d==7){
 output_toggle(pin_A5); // bascula T implementada con la función output_toggle()
 d=0;
 }
 if(d==8){
 output_toggle(pin_B5); // bascula T implementada con la función output_toggle()
 d=0;

}
}
}while (TRUE); // bucle eterno
}


----------



## Juan1221 (Nov 18, 2010)

Hola, un saludo y agradeserles el gran aporte que realizan.
Estoy intentando comunicar el pic 4550 de la serie 18, con el puerto usb de una pc, pero me temo que mis intentos no han sido suicientes, me gustaria que me pudieran ayudar, creo que no se mucho pero tengo muchas ganas de aprender.
Espero me ayuden y de antemano muchas gracias.


----------



## tannke (Nov 19, 2010)

Aqui les dejo la libreria que hice para calcular el cheksum para los archivos .hex. Si abris un archivo .hex con el blok de notas vereis todas las filas de datos, el checksum es el ultimo Byte de cada fila (los dos ultimos caracteres en hexadecimal)

Pd. Viendolo de nuevo veo que se puede optimizar mucho mas. Un saludo


----------



## Moyano Jonathan (Nov 19, 2010)

muchas gracias lo voy a leer cuidadosamente


----------



## tannke (Nov 19, 2010)

Aqui les dejo el codigo fuente del programa que les dije antes. Esta muy "desordenado" y casi sin comentar, un mal vicio que tenia, luego me di cuenta que cuando necesitaba revisar un programa antiguo te tirabas un buen rato para recordar que hacía. 

Si necesitas que explique algo de este o que te pase algun fragmento de codigo ordenado o alguna función especifica que necesites dilo. Ya que me he dado cuenta que para ordenar esto ahora mismo me puedo tirar unos dias ya que tampoco como casi todos dispongo de mucho tiempo.

Bueno un saludo.


----------



## Moyano Jonathan (Nov 21, 2010)

Luego de mucho batallar con las funciones para leer/grabar EEPROM en Visual C# a partir de un archivo .hex...ya se me han aclarado muchas dudas...pronto le vendré con más actualizaciones del programa principal para que lo vean trabajando...y en cuanto termine del "pulir" el firmware lo subo todo completo con fotos y videos...

Tannke muchas gracias por tu aporte...tu programa me va a servir para unos de mis proyectos del año 2010 - 2011 que es manejar una matriz completamente por USB.


----------



## Meta (Nov 22, 2010)

Hola Moyano:

¿En el manual pondrás esquemas eléctricos de como conectar un PIC por USB? Lo pregunto por curiosidad. Con las ganas que tengo de controlar un PIc por USB.

Un cordial saludo.


----------



## Moyano Jonathan (Nov 22, 2010)

Si estará todo explicado con el mayor detalle posible...lo que me está retrasando por el momento es la grabación/lectura de la EEPROM por USB....tratar el archivo .hex no es tan facil como parece asi que me va a llevar un tiempo....igual lo básico lo voy a subir antes cosa de que vallan practicando...luego cuando tenga la aplicación terminada subo todo.


----------



## Meta (Nov 22, 2010)

Me lo imaginaba. Por ahora puedes centrarte en activar los 8 entradas/salidas y entradas analógicas.

A partir de que sepa manejar estas cosas o lo tengo clara, me encargaré de adaptarlo a C++ y VB.


----------



## Gaby (Nov 23, 2010)

Moyano Jonathan:
Hola buen día, mi nombre es Gaby soy estudiante de ingenieria en electrononica.

Oye solo que tenemos muchas dudas yo y mi compañera de proyecto, acerca de la comunicación serial por medio de Labview y un pic 18f2550

Mira tenemos un programa que realizamos en MikroC para la comunicación utilizando un cable serial. La comunicación fue un éxito utilizando la herramienta UART que nos ofrece el MikroC, el problema aquí es que el profesor nos pidió que hiciramos el mismo programa pero ahora implementando Labview.

No somos muy buenas utilizando el Labview pero lo intentamos. Hicimos una interfaz en labview 8.6, sabemos que si envia y recibe el datos ya que conectamos el cable serial e hicimos un puente en los pines 2 y 3, con esto observamos que la comunicacion serial con los Visa si funciono, pero, al conectar nuestra placa con el pic no hace lo que queremos, se supone que tenemos programado el pic para que encienda un led medio segundo cuando haya comunicacion serial. Sabemos que si le llega algo por que enciende el led pero no sigue con el proceso que queremos que haga.

No sabemos si el problema esta en el codigo de mikroc o en la 
interfaz del labview. 
Estamos mas inclinadas al hecho de que sea el código en mikroc, debido a que no estamos muy seguras de la comparación que se hace con la ventana de mikroc donde antes realizábamos las practicas y que hemos cambiado por la interfaz creada por nosotras en labview, que en caso del serial seria en mikroc TOOLS/USART Terminal y con eso ya aparece esta ventana que reemplazamos, he de ahí donde sale la parte del código que creemos que reemplazar porque en el archivo de .h , nosotros lo llamamos UART1_Read() o en UART1_Write(), entonces para utilizar la interfaz del labview ¿cual seria?

Crees que podrias ayudarnos, te paso el código que tengo en mikroc , para que lo revises y nos digas si puedes ayudarnos.

De antemano muchisimas gracias por tu tiempo. 

_Codigo MikroC_


> char uart_rd;
> 
> void main() {
> 
> ...



:


----------



## Moyano Jonathan (Nov 23, 2010)

Disculpame gaby pero no aceptamos SPAM de mensajes...este hilo es esclusivamente para desarrollos con USB.


----------



## Gaby (Nov 23, 2010)

Perdón me equivoque.. no volverá a pasar


----------



## damian2340 (Nov 29, 2010)

Hola, soy nuevo por acá.
Estoy probando los ejemplos pero nada parece andar.
Hace un por de días que probé el primer ejemplo y me funciono perfecto después probé el ejemplo que moyano: "Joistick USB con PIC18F2550 1 analógico + 8 botones" y me funciono perfecto pero cuando trate de volver a los ejemplos de este hilo la pc me empezó a poner que no se reconoce el dispositivo. Lo raro es que si grabo el pic con el ejemplo del joystick (HID) anda perfecto.
La verdad ya se me están acabando las ideas, así que cualquier ayuda se las voy a agradecer mucho.

Saludos, Damián

PD1: Ya probé montones de valores para el capacitor de VUSB ahora estoy con uno de 10uF de tantalio.

PD2. Gracias por el tema, esta todo muy bien explicado.


----------



## Moyano Jonathan (Nov 29, 2010)

Si te ha funcionado antes , es problema de la PC no de los ejemplos. Algo que hay que tener en cuenta es cuando uno conecta un dispositivo USB la PC toma los descriptores del dispositivo y crea un archivo que guarda en el registro para que cada vez que el usuario conecte el dispositivo este no pida los drivers continuamente y se enumere de forma automatica.

El problema recae en cuando uno ha conectado y desconectado muchos dispositivos con el mismo descriptor y diferente driver o funcionamiento pueden aparecer conflictos de software. Que te soy sincero la única opción que hay es formatear la máquina o buscarte un programa para limpiar los driver's USB ...si buscas en la red seguro los encontras.

El capacitor de Vusb ha sido comentado ampliamente y te digo que no es critico siempre y cuando tenga un valor de 470nf para arriba.


----------



## Meta (Nov 30, 2010)

Hola Moyano:

Por lo que cuentas, sigues en el tema del ID y no se que más historias para no tener problemas en el futuro. Al menos que reconozca el nombre del dispositivo.

Si sigues en el mundo de la EEPROM puedes dejarlo para más adelante, ya que me encanta la parte del 8 entradas y salidas digitales, analógicas, etc.

Saludo.


----------



## Moyano Jonathan (Nov 30, 2010)

Meta yo ya tengo casi terminado el problema de las eeprom. El tema es que estoy en epoca de estudios y no tengo tiempo de nada.


----------



## Pichuquy (Nov 30, 2010)

Hola a todos. Estoy probando un programa con el PIC18F4550, para la comunicación por USB clase CDC. El programa que uso como entorno es el HYPERTERMINAL.  El programa anda muy bien en el envio de datos (PIC-PC), pero cuando intento realizar el envio de datos al reves (PC-PIC) nunca recibo los caracteres. Este es el programa. Cuando  preciono la 'x' para recibir el dato, nunca funciona. Muchas gracias. 



#include <18F4550.h>

#fuses HSPLL,MCLR,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL3,CPUDIV1,VREGEN,NOPBADEN


// Fuses utilizados:
/*
HSPLL: utilizamos un cristal HS de alta velocidad, en conjunto con el PLL para generar los 48Mhz.
NOMCLR: Utilizamos reset por software, y dejamos el pin 1 del micro como entrada/salida digital.
NOWDT: No utilizamos el perro guardían.
NOPROTECT: Desactivamos la protección de código.
NOLVP: Desactivamos la programación a bajo voltaje.
NODEBUG: No entramos al modo debug.
USBDIV: signfica que el clock del usb se tomará del PLL/2 = 96Mhz/2 = 48Mhz.
PLL5: significa que el PLL prescaler dividirá en 5 la frecuencia del cristal. para HS = 20Mhz/5 = 4Mhz.
CPUDIV1: El PLL postscaler decide la división en 2 de la frecuencia de salida del PLL de 96MHZ, si queremos 48MHZ, lo dejamos como está.
VREGEN: habilita el regulador de 3.3 volts que usa el módulo USB
*/

#use delay(clock=48000000) // Frecuencia máxima de trabajo.

#include "usb_cdc.h" // Descripción de funciones del USB.
#include "usb_desc_cdc.h" // Descriptores del dispositivo USB.



void main() {

float medicion;  
	usb_cdc_init(); 											// Configuramos al puerto virtual.
   	usb_init(); 												// Inicializamos el stack USB.

	setup_adc_ports (all_analog);            
  	setup_adc (adc_clock_internal);              				//enciende adc
  	set_adc_channel(0);                          				//elige canal a medir RA0
 	delay_us(10);


	while(!usb_cdc_connected()) {								// Mientras el USB no esté conectado.
	output_high(PIN_B6); 										// Función USB no detectada. (Enciende LED rojo)
	output_low(PIN_B7);  										// (Apaga LED verde)
} 

// espera a detectar una transmisión de la PC (Set_Line_Coding).

	output_high(PIN_B7); 										// Función USB detectada.    (Enciende LED verde)
	output_low(PIN_B6); 										//  (Apaga LED rojo)

printf(usb_cdc_putc, "Dispositivo USB_CDC\n\r");
 do{

	usb_task();			  	
    if (usb_enumerated()){  									// Espera a que el dispositivo sea enumerado por el host
//	medicion=read_adc();
//	printf(usb_cdc_putc, "Dispositivo USB_CDC\n\r"); 
//	delay_ms(2000);
//	printf(usb_cdc_putc, "Emilio D'Olivo\n\r");
//	delay_ms(2000); 
//	printf(usb_cdc_putc, "Grupo GIDE\n\r");
//	delay_ms(2000);
//	printf(usb_cdc_putc,"\r"); 
//	printf(usb_cdc_putc,"-%2.1g",medicion);
//	delay_ms(500);	


         if(usb_cdc_kbhit()){ // En espera de nuevos caracteres en el buffer de recepción.
            if(usb_cdc_getc()=='x'){ //¿lo que llegó fué el caracter x?
               printf(usb_cdc_putc, "Se recibe el caracter x.\n\r"); 
               //si, entonces envía una cadena hacia el PC
             }
            if(usb_cdc_getc()=='a'){ //¿lo que llegó fué el caracter a?
               printf(usb_cdc_putc, "Se recibe el caracter a.\n\r");
               //si, entonces envía una cadena hacia el PC               
             }
         }
        }
       }while (TRUE); // bucle infinito.
}


----------



## Meta (Nov 30, 2010)




----------



## Moyano Jonathan (Dic 1, 2010)

Me interesó lo de Linux, aunque estaría bueno que lo hiciera con gambas...entonces con mis ejemplos no hace falta modificar casi nada solo la comunicación serie.

Pichuquy: Tenés mal configurado los fuses por eso no te anda la aplicación.


----------



## Meta (Dic 1, 2010)

Todo llegará y lo tengo planeado de hacer. Mejor centrarse en una cosa o tardarás muchísimo tiempo.


----------



## Moyano Jonathan (Dic 1, 2010)

Si es verdad...ahora posteo para ayudar a algunos con los dramas que se le presenten ..por que el tiempo esta escaseando. En cuanto termine con mis estudios termino con la aplicación final y la subo para que todos la puedan probar.


----------



## Pichuquy (Dic 1, 2010)

Hola Moyano Jonathan. He revisado los fuses y no encuentro el error que me decís. El programa me anda bien, solo que en el envío de (PC - PIC) falla y no recibo lo que corresponde. No puedo encontrar porque me hace eso… Muchas Gracias.


----------



## alaroa (Dic 1, 2010)

Hola Meta!!!! 

He visto tus vídeos de ejemplo y me pregunto ¿No tienes un ejemplo similar pero para MAC???

Gracias!!!


----------



## Meta (Dic 1, 2010)

Hol Alaroa:

No son mis vídeos. No se si en Mac OS funcionará. Puedes descargar el tutorial en PDF.

Descargar PDF.

Un cordial saludo.


----------



## damian2340 (Dic 1, 2010)

Moyano Jonathan dijo:


> Si te ha funcionado antes , es problema de la PC no de los ejemplos. Algo que hay que tener en cuenta es cuando uno conecta un dispositivo USB la PC toma los descriptores del dispositivo y crea un archivo que guarda en el registro para que cada vez que el usuario conecte el dispositivo este no pida los drivers continuamente y se enumere de forma automatica.
> 
> El problema recae en cuando uno ha conectado y desconectado muchos dispositivos con el mismo descriptor y diferente driver o funcionamiento pueden aparecer conflictos de software. Que te soy sincero la única opción que hay es formatear la máquina o buscarte un programa para limpiar los driver's USB ...si buscas en la red seguro los encontras.
> 
> El capacitor de Vusb ha sido comentado ampliamente y te digo que no es critico siempre y cuando tenga un valor de 470nf para arriba.



Holas, tenias razón con los driver, de tanto cambiar el firmware windows no aguanto.
Por si a otro le pasa lo mismo tiene que ejecutar.

@echo off
set devmgr_show_nonpresent_devices=1
cd %SystemRoot%\system32
start devmgmt.msc

después se abre el administrador de dispositivos pero en ver esta la opción de mostrar dispositivos ocultos (los iconos de los drivers viejo aparecen mas claro). Yo tenia mas de 50 drivers en el USB.

Pichuquy:


Pichuquy dijo:


> Hola a todos. Estoy probando un programa con el PIC18F4550, para la comunicación por USB clase CDC. El programa que uso como entorno es el HYPERTERMINAL. El programa anda muy bien en el envio de datos (PIC-PC), pero cuando intento realizar el envio de datos al reves (PC-PIC) nunca recibo los caracteres. Este es el programa. Cuando preciono la 'x' para recibir el dato, nunca funciona. Muchas gracias.
> 
> 
> 
> ...



Si copiaste y pegaste tu código es raro que te ande bien: PLL3 es para cristales de 12MHz y además lo tenés con un espacio

Saludos y gracias por la ayuda


----------



## Pichuquy (Dic 1, 2010)

Hola damian234, gracias por contestar. Es verdad que tengo el  fuse PLL3 con espacio... pero en mi programa esta bien echo. Y lo estoy usando con un cristal de 12 Mhz. Ese codigo lo copie y lo peque desde este mismo tutorial. Yo estoy usando como programa interfaz el HYPERTERMINAL y no logro hacer que me envie datos desde la pc al pic. Tambien lo probé con el LABVIEW pero recibo cualquier caracter y no el que corresponde. No se si me explico bien. Ya no se mas que probar, estoy pensando que la libreria #include "usb_cdc.h"  quizas tenga algun error. Yo estoy usando win VISTA. Muchas gracias.


----------



## el pipo (Dic 1, 2010)

que tal felisito a todos son unos maestros de esto.
quisiera preguntarles lo siguiente:
-¿que nesesito para introducirme bien en el tema? soy estudiante de ingenieria en electromecanica pero ami me apasiona mucho la electronica. tengo conceptos en electronica analogica y en electronica digital.
-me podrian ayudar para entender la comunicacion usb. busco en internet pero no en cuentro mucha informacion.
-he leido sobre el picbasicpro se puede hacer esta aplicacion en este compilador.
les agradecere su ayuda.


----------



## Meta (Dic 1, 2010)

Puedes empezar leer desde el principio de este tema- Por la mitad encontrarás más cosas.


----------



## damian2340 (Dic 1, 2010)

Pichuquy dijo:


> ```
> #include <18F4550.h>
> #include "usb_cdc.h"				// Descripción de funciones del USB.
> #include "usb_desc_cdc.h"			// Descriptores del dispositivo USB.
> ...



Haber, yo uso MPLAB así que no te puedo ayudar mucho pero por lo que vi en los archivos de los encabezados deberia andar. Lo unico que le cambie es la forma de usar el printf(), igual no me gusta mucho eso que hace el ccs para pasar caracter por caracter. Tambien le agrege unas lineas para ver si por lo menos le llega info al pic.
Con lo poco que se de ccs y con el sueño no se me ocurre nada mas. Igual yo estoy por hacer lo mismo para controlar un ampli HI-END por la PC, así que si solucionas el problema decime.


----------



## Pichuquy (Dic 2, 2010)

Hola damian2340. Gracias por la ayuda. Me sigue asiendo lo mismo... En la foto adjunto un programa de LABVIEW que lo unico que hace es hacer de "eco" entre el pic y el pc. Pero por mas que le ingrese cualquier letra siempre me debuelve el mismo caracter que es ":" y no se como arreglarlo.. No se si alguien tubo este problema algunas ves.. gracias.


----------



## albertoxx (Dic 2, 2010)

pichuquy: Hasta donde llega la ejecucion del programa por lo menos llega a encender tu pin7? bueno aunque despues de que le haces el getc lo vuelves a encender y ya estaba previamente encendido y luego lo apagas mejor deberias de encender otro pin por lo menos para debugearlo mejor yo por lo menos este pedacito lo programaria asi

if(usb_cdc_kbhit()){ 	
  letra=usb_cdc_getc();
  output_low(PIN_B7);
  delay_ms(2000);
  output_high(PIN_B7);
  usb_cdc_putc(letra); //enviando de vuelta el caracter un eco para probar que recibio
  if((letra=='x')||(letra=='X')||
     (letra=='a')||(letra=='A')){ //¿lo que llegó fué el caracter x o el a?
               printf(usb_cdc_putc, "Se recibe el caracter %c.\n\r",letra);  //si, entonces envía una cadena hacia el PC
               // usb_cdc_putc(letra);										 //si no anda proba poniendo directamente 
  }else{
      usb_cdc_putc('?');	//para lee mal el buffer
  }
}


----------



## Meta (Dic 2, 2010)

Moyano, por curiosidad. ¿Haz probado bien si funciona las entradas analógicas por USB?

Otra cosa. Cuando conectas el PIC por USB al PC, se que te puede decir  desconocido o el nombre que le hayas puesto al PIC en su interior se ve  en administrador de dispositivos. ¿Cómo lo haz hecho?


----------



## Moyano Jonathan (Dic 2, 2010)

Si las funciones analógicas las he probado y funcionan excelente con el usb..es más usando un conversor A/D por medio del bus I2C del PIC, puedo tomar muestras de 12 bits de resolución y enviarlas al USB sin problemas.

Cuando conectamos el USB , el host busca los descriptores dentro del firmware y genera un archivo en el registro de windows para que cuando el PIC se conecte no lo enumere continuamente sino que busque el archivo y lo detecte.

Una vez conectado el dispositivo te va a aparecer en el administrador de dispositivos de 4 maneras diferentes.

1 si es CDC:               Como un puerto COM de identifación variable (COM2 a COM xx )
2 si es HID:                Como un dispositivo HID compatible.
3 si es BULK/TRANSFER Se le puede poner un ícono específico.
4 si es MSD                Como un Dispositivo de almacenamiento masivo.

Espero haberte aclarado la duda.


----------



## albertoxx (Dic 2, 2010)

Moyano has probado asi fisicamente la maxima velocidad de estas 3 HID,BULK,MSD me imagino que ha de ser bulk pero mejor te pregunto y cual sera el buffer maximo de transferencia de cada uno

Por ejemplo si el hid puede enviar digamos a 2 bytes en 0.5 ms para enviar 1 Kb se tardaria 256ms
y el bulk parecieera mas lento digamos 512 bytes en 150ms se tardaria en teoria 300 ms
pero el hid utilizo mas rutinas para cada envio de dato en este caso utilizo 512 instrucciones de envio
vs las 2 que utilizo el bulk

Cual sera la mas rapida asi ya probada?


----------



## alaroa (Dic 2, 2010)

Gracias Meta voy a revisar el contenido y ver la opción de poder utilizar mac, si tengo algo para mac lo subiré


----------



## Moyano Jonathan (Dic 2, 2010)

La forma más rápida es Bulk, pero con el código de CCS no se puede hay que modificar muchas cosas..


----------



## Meta (Dic 2, 2010)

Moyano Jonathan dijo:


> La forma más rápida es Bulk, pero con el código de CCS no se puede hay que modificar muchas cosas..



¿Y el C18?

¿Sabes algo sobre ello?

Habrá que investigar.


----------



## cadcc (Dic 2, 2010)

hola Pichuquy creo  q tuve ese problema i se soluciono utilizando esta libreria


----------



## Moyano Jonathan (Dic 2, 2010)

En C18 hay ejemplos de como hacer transmisiones Bulk a alta velocidad pero todavía no me he puesto con ese lenguaje. Aunque pronto lo voy a tener que hacer de manera obligada para poder trabajar con PIC18 de manera cómoda.


----------



## Meta (Dic 3, 2010)

El C18 es como el CSS en el lenguaje C. Lo que cambia es el IDE. Busca por Internet, antes todo el mundo quería el CSS y ahora le están dando desde hace casi un año por usar el C18 hasta hacer manuales. Por algo será. Siguen diciendo que está mejor el CSS pero no se el motivo de que usan el C18. Cuando te aprendas el C18, al pasar al C32 es muy fácil. (Incluyendo los dsPIC), al menos eso he leído en otros sitios.

Ya aprenderemos en su día.


----------



## ByAxel (Dic 3, 2010)

Meta dijo:


> El C18 es como el CSS en el lenguaje C. Lo que cambia es el IDE


No tengo nada en contra del CCS que también empece por él, pero no solo el IDE cambia, es cierto que al ser C sigue estándar o la sintaxis pero al tener muchas funciones pre-establecidas, el migrar a otro se hace confuso para el principiante (el código no es portable, no es compatible entre los dos).
Aprender el C18 es como aprender asm pero divertido , control casi total del PIC (sin bugs), uno se concentra más en el programa que estar resolviendo problemas (¿Por qué no funciona? bugs? :enfadado:). La mejor opción es el C18  y el C30/32 cuya arquitectura está adaptada para desarrollos en este lenguaje y opcional son los compiladores de Hi-Tech C que son muy buenos (hasta microchip les hace propaganda).


----------



## Meta (Dic 3, 2010)

Hola:

Como C18 es directo de www.microchip.com me quedaré con él. Leo muchos problemas de tiempos sea por timer o por retardos bajo CCS.

Eso de asm pero más fivertido, entonces no es C, será otra cosa.


----------



## Moyano Jonathan (Dic 3, 2010)

Para nuevos desarrollos con USB , creo que utilizaré C18. Mientras ahora para hacer el manual será todo en CCS...quizás en un futuro se le agreguen las funciones avanzadas de C18.


----------



## Meta (Dic 3, 2010)

El C18 avanza cada vez más.


----------



## willynovi (Dic 7, 2010)

es que el C18 está optimizado para la linea 18, y de esa forma puede explotar todos los recursos de esos micros.

Yo lo uso, y con el framework es muy simple aprenderlo desde ejemplos.


----------



## Meta (Dic 7, 2010)

Hola willynovi:

¿En qué parte de http://www.microchip.com/ encuentras el FrameWork?

Sigo opinando que cada vez se usa más el C18 que el CCS. Espero que se incluyan novedades que valgan la pena. Mucho http://www.ccsinfo.com/ que al final usarán el http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=1406&dDocName=en010014 sin pensarlo dos veces, hasta ya han hecho manuales sobre ello que puedes ver por aquí.

Saludo.


----------



## Moyano Jonathan (Dic 7, 2010)

Hola meta el Framework USB está acá: http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=2651&param=en534494


----------



## Meta (Dic 7, 2010)

Gracias y ánimos con el PIC18F2550 USB.


----------



## kYc0o (Dic 7, 2010)

Hola a todos y buen día desde méxico.
Antes que nada debo felicitarlos por el gran trabajo que han hecho en conjunto para descifrar el maravilloso mundo del USB, hasta ahorita no había hecho ningún comentario porque apenas tengo algunos meses trabajando con el USB y debo decirles que toda la información aquí descrita me ha servido en sobremanera, muchas gracias!!
Hasta ahorita he conseguido hacer funcionar el USB por medio de CDC, la verdad me interesan mucho el HID y el bulk transfer pero lamentablemente para el proyecto que estoy realizando ahorita el CDC me basta y me sobra...
Mi duda ahorita es la siguiente, no sé si alguno de ustedes la ha experimentado. Se trata de que en mi proyecto (domotización) necesito un consumo de energía mínimo para poder hacer funcionar el PIC con baterías, el detalle es que apenas habilitando los fuses para la comunicación USB (no importa si usas o no el USB) el consumo del PIC se va hasta 35mA!!! (PIC18F2550) con lo cual me es imposible montarle baterías ya que requiero una vida útil de al menos 3 meses, con ese consumo de corriente me duraría apenas 2 días.
Después de mucho investigar la verdad no encontré información en ningún sitio acerca de los consumos de corriente del PIC según las características que utilices del mismo, por lo que me decidí a ponerlo a dormir y he aquí la interrogante...
Al parecer cuando el PIC está conectado al USB nunca se duerme, no sé realmente por qué razón pero he estado investigando en las librerías del pic18_usb.h y las del CDC, aún no termino de revisarlas por completo pero lo que sí es que mi PIC no se va a la cama =/
Bueno, si alguno de ustedes tiene una pista o se ha topado con un problema similar podemos compartir algunas experiencias que he tenido aunque la mayoría no son del todo agradables...
Un saludos a todos y espero este proyecto siga creciendo como hasta ahorita, muchas felicidades otra vez!!

P.D. He realizado estudios en una escuela de la india (NIIT) acerca de la programación en C#, si de alguna manera puedo ayudarles con eso pues aquí estoy ;-).


----------



## Meta (Dic 7, 2010)

Deje que acabe lo que tiene que acabar, ya controlaras lo que el quiere hacer. 
_ https://www.forosdeelectronica.com/posts/388964/ _
Saludo.


----------



## carlos20_19888 (Dic 16, 2010)

hace mucho que no requeria la necesidad de avanzar en la usb, ando a full, bueno hace unos meses empezamos a desarrolar una interfaz en labview para usb hid, asi que decidi subir la vi para algun interesado


----------



## Meta (Dic 16, 2010)

Moyano. ¿Cómo vas con el USB y el PIC18F2550?

¿Muy ocupado con la universidad?


----------



## Moyano Jonathan (Dic 16, 2010)

Sigo ocupadisimo con la facu no ocupado ...he tenido muchos problemas de saludo tambien por eso no he posteado seguido...lo hago desde el movil estando en cama muchas veces....

Pienso que para el lunes voy a retomar con mis labores en la electrónica.


----------



## Meta (Dic 16, 2010)

Hola Moyano:

Pues primero los deberes, después los hobbys. Por ahora estoy peleando con el temporizador adaptándolo del 16F84A al 16F88, para el colmo se me quemó el primero.

Con el tiempo seguro que tendrás un poco de tiempo libre y espero que acabemos el USB.

Puede que te de ideas.
http://www.aquihayapuntes.com/indic...n-usb-pic18f4550-utilizando-la-clase-cdc.html

Graicas por responder.


----------



## Moyano Jonathan (Dic 19, 2010)

Por ahora el programa principal de mi aplicación no tendrá control de la memoria EEPROM hasta que entienda bien el manejo de los archivos hex.
Ya estoy puliendo el código del microcontrolador , pienso que en unos días más subo la aplicación para que la prueben.


----------



## Meta (Dic 19, 2010)

Buenas:

¿Funciona bien la parte del 8 in/out digitales y analógicos?

Saludo.


----------



## Moyano Jonathan (Dic 19, 2010)

Si ya está funcionando


----------



## Meta (Dic 19, 2010)

Es bueno saberlo.

¿Vas hacer un mini PDF para entender algo? Al menos los protocolo de comunicación. 

Saludo.


----------



## Moyano Jonathan (Dic 19, 2010)

Si en el PDF pongo todo , primero voy a terminar de programar la aplicación del microcontrolador y luego empiezo con el armado del PDF.


----------



## Meta (Dic 19, 2010)

Ok, estás hecho un campeón.

Ya estamos con 72 páginas, como se nota que la gente le encanta lo del USB, en el 2008 empezamos y casi nadie tenía información, ahora cada vez veo más por todas partes par publicarla aquí como he hecho otras veces.

Saludo.


----------



## spiritbreaker (Dic 25, 2010)

una pregunta , con Hid puedo enviar mas de 8 bytes o se puede enviar mas ,??  para emigrar de una vez a bulk ,, probe y probe y no puedo enviar mas de 8 bytes ni recibir mas de 8 bytes y si es ke que puede seguro es refacil modificarlo pero no le allo, es que debo enviar  10adc y graficarlas en la pc para un trabajo de la u ,   en que parte  aqui
#DEFINE USB_HID_DEVICE TRUE // Vamos a utilizar el protocolo HID.

#define USB_EP1_TX_ENABLE USB_ENABLE_INTERRUPT 
#define USB_EP1_TX_SIZE 8 // Definición del tamaño del buffer de salida.

#define USB_EP1_RX_ENABLE USB_ENABLE_INTERRUPT 
#define USB_EP1_RX_SIZE 8 // Definición del tamaño del buffer de entrada.
aqui
    int8    recibe[8];// Buffer de recepción vía usb                 
    int8    envia[8];// Habilitar en caso de necesitar
o aqui

usb_put_packet(1,envia,8,USB_DTS_TOGGLE);

Saludos


----------



## edwork (Ene 8, 2011)

espero que me puedena ayudar mi problema es el siguiente he estado haciendo algunos programas con el pic 18f4550 y la comunicación CDC y en window 7 me funciona de maravilla pero en XP no me reconoce el controlador y estoy utilizando las librerias que moyano ha hecho el favor de postear. les agradecere sus comentarios


----------



## spiritbreaker (Ene 8, 2011)

hola ,mejor usa este el hid , es el ejemplo de moyano y no se instala driver alguno ,y reconoce en xp sevenn 32 y 64 ,,,,,, 

alguien podria ayudarme en comunicacion con visual c# 2008 para enviar 3adcs desde el pic ,,solo me falta la programacion de visual c# , capaz sepàn un manual bueno de esto


----------



## edwork (Ene 11, 2011)

gracias spiritbreaker empezare ha trabajar en el


----------



## Evo x86 (Ene 13, 2011)

ke tal

hace unso dias empece a buscar tutoriales y estudiar esto de una interface pic-pc mediante el usb.
El ejemplo que puso spirit sobre el trabajo de moyano menciona qu eno se ocupa driver, tengo 2 pregutnas:

No se usa driver, porque usa el potocolo HID y windows ya tiene la slibrerias para controlar estos dispositivos?

y me podrian decir que es lo que hace el ejemplo de cero de moyano y porque utiliza el ADC del pic si solo prende leeds o lee entradas digitales, almenos eso fu elo que note viendo la aplicacion para la PC.

Saludos

por cierto felicidades, estuve leyendo el foro y han avanzado mucho entre moyano y meta en esto del usb =P


----------



## Meta (Ene 13, 2011)

Se está haciendo un manual y un programa para ello. Lo que está tardando más de la cuenta.


----------



## Moyano Jonathan (Ene 14, 2011)

Meta estoy de vacaciones....si no lo hago es porque estoy descansando


----------



## COSMICO (Ene 14, 2011)

Sii dejen descansar al hombre, el tiene derecho..eso si nos traera algo de por esos lados 
amigo Jonathan.


----------



## Meta (Ene 14, 2011)

La verdad que un buen descansito anda bien o te vuelves loco. 
Aprovecha que no ocurre todos los días, jejee.


----------



## Evo x86 (Ene 17, 2011)

ke tal, investigando he encontrado que puedo usar el easyHID que a pesar de que no genera codigo para CCS, este si se peude usar mientras el product y vendor id sean el mismo que el de la aplicaicon y es el cual proporciona easyHID que son 6017 y 2000,el problema es que  tengo win 7 y versiones anteriores de visual studio no funionan, por lo tanto no puedo abrir los proyectos que genera el easyHID ni el de VisualBasic de moyano, algun consejo para abrir o crear mi aplicacion para la pc para un visual basic mas reciente ?
Lo bueno del delphi es que si abre el codigo que genera easyHID pero ocupo algun ejemplo paar estudiarlo y analizarlo y tambien que estos usen la dll mcHID.dll ya que soy nuevo en esto del pic-USB

gracias


----------



## Moyano Jonathan (Ene 18, 2011)

EasyHID no funciona en Windows 7, solo en XP. Para versiones posteriores voy a escribir un mini manual donde muestro como crear una aplicación en VC# y CCS para el PIC18F2550, que si funciona en Win 7.


----------



## spiritbreaker (Ene 18, 2011)

saben un manual de visual c#  basicamente en controlar objetos como el text box , para displayar el valor que leo del adc del pic ,,, solo se colocarlo en baarras  (esas las verdes)   porfaa una ayuda n eso
salu2


----------



## Moyano Jonathan (Ene 18, 2011)

Y depende de como tomes el dato del PIC....en que tipo de variable lo guardas...


----------



## Meta (Ene 19, 2011)

spiritbreaker dijo:


> saben un manual de visual c#  basicamente en controlar objetos como el text box , para displayar el valor que leo del adc del pic ,,, solo se colocarlo en baarras  (esas las verdes)   porfaa una ayuda n eso
> salu2



Aquí hay algo de C# y electrónica.
Ver manual C# y PIC.

En cuanto a la barra que dices me imagino que te refieres a esto:










http://www.codeproject.com/KB/cpp/XpProgressBar.aspx





http://www.jamesarchuleta.com/post/Programming-with-the-Windows-7-Taskbar.aspx

Estoy esperando el manual de Moyano, con él haré ese tipos de cosa en C#. Colaboramos los dos y los que quieran para enriquecerlo.


----------



## saulon019 (Ene 19, 2011)

Hola moyano, tengo una duda con respecto a las etiquetas tipo string en los descriptores, tu escribiste la ultima linea con un ancho de 24, me gustaría saber como ampliar el letrero, no entiendo de  donde sacaste ese numero si solo usas 11 caracteres, gracias.


----------



## Meta (Ene 20, 2011)

spiritbreaker dijo:


> saben un manual de visual c#  basicamente en controlar objetos como el text box , para displayar el valor que leo del adc del pic ,,, solo se colocarlo en baarras  (esas las verdes)   porfaa una ayuda n eso
> salu2



Mira en la última foto de este enlace. 

¿Es lo que buscas?

http://www.migsantiago.com/index.php?option=com_content&view=article&id=9&Itemid=10

Espera que Moyano logre sacar este manual a la luz y aprendemos todos.

Ánimo Moyano.


----------



## spiritbreaker (Ene 20, 2011)

gracias por la ayudaaa Meta, 
@saulon019 //  ancho  =   (11 +1)*2
ancho = 24                    ,   si varias ese 11 tb varia el ancho  .


----------



## saulon019 (Ene 22, 2011)

muchas gracias ya había sacado esta formula con álgebra pero no estaba seguro, gracias


----------



## papixulo92 (Ene 25, 2011)

Buenas soy nuevo en el foro tengo un problema con un programa que me descargado de este link :https://www.forosdeelectronica.com/posts/143813/ 

en el cual el programa hecho en Visual Basic necesito modificarlo, pero a la hora de compilarlo me sale un error y no me lo permite.En la nota puesta por Moyano indica que el visual basic requiere el EasyHID, pero aun asi no me lo compila, no se si el EasyHID lo tengo bien instalado o me prodriais ayudar.

Este es el error que me sale :
Una expresión 'AddressOf' no se puede convertir en 'Integer' debido a que 'Integer' no es un tipo delegado.

Saludos.


----------



## Moyano Jonathan (Ene 26, 2011)

podrías poner el código completo...y donde te aparece el mensaje asi te brindaríamos una mejor ayuda.

un saludo !


----------



## Evo x86 (Ene 26, 2011)

logre hacer funcionar el easyHID con windows 7 y visual studio 2010 (visual basic 2010) y funciona a la perfeccion on el pic, con un codigo actualizado qu eencintre para el 2010 a partir del que te genera el easyHID para versiones anteriores de vb.

Tengo uan duda, yo desde mi programa puedo mandar paquetes de informacion, los cuales van desde el 1 al 7, el 0 no pke es usado pra fines d efuncionamiento del usb.Ahora en HID para cada uno d estos(1-7)
puedo mandar 16 combinaciones, es decir del 0-F(hex)?

ejemplo 1:
data=4
 BufferOut(3) = (data)
   0         1         2        3        4       5        6        7    (buffers de salida)
 (n/a)     (0)     (0)       (4)     (0)     (0)      (0)     (0)   (info contendida dentro de cada buffer)

ejemplo 2:
data=F(hex)
 BufferOut(3) = (data)
   0         1         2        3        4       5        6        7    (buffers de salida)
 (n/a)     (0)     (0)       (F)     (0)     (0)      (0)     (0)   (info contendida dentro de cada buffer)

Si quieren podri aaportar el codigo actualizado para vb 2010, solo qu eme digan como adjuntar archivos porque soi nuevo jijijijijiij.


----------



## Moyano Jonathan (Ene 26, 2011)

Estaría bueno que subas el aporte....yo he trabajado mucho con esa librería...pero no es muy funcional. Es mucho mejor trabajar con las librerías que aporta microchip ....tienen mejor soporte y tienen algunas características que superan al easyHID.

PD: Estoy viendo nuevas tecnologías de programación para poder subir el minimanual de USB. El proceso de aprendizaje es medianamente rápido (me estoy dedicando solo al USB). Espero pronto tener algo concreto.


----------



## pepechip (Ene 27, 2011)

Hola
Tengo esta duda:
Para el sistema operativo XP utilizamos el Vb6, junto con el easyHID.
Pero para windows 7 y visual studio 2010 podeis aportar la aplicacion necesaria.

un saludo


----------



## Moyano Jonathan (Ene 27, 2011)

Acá está lo que necesitas: https://www.forosdeelectronica.com/...aves-modulo-usb-pic18f2550-17458/index56.html

Es la página 56 del hilo...ahí puse 2 ejemplos en VB.net y Visual C# en donde muestro como realizar la comunicación.


----------



## saulon019 (Ene 27, 2011)

Espero con ansias el manual de usb, para cuando lo terminas?, te agradezco la información.


----------



## Meta (Ene 28, 2011)

saulon019 dijo:


> Espero con ansias el manual de usb, para cuando lo terminas?, te agradezco la información.



No se si es para VB .net, en tal caso lo adaptaré para el C#.


----------



## Moyano Jonathan (Ene 28, 2011)

> Espero con ansias el manual de usb, para cuando lo terminas?, te agradezco la información.



Te soy sincero...estoy trabajando en ello, pero no se realmente cuando voy a terminar.


----------



## pepechip (Ene 29, 2011)

Moyano Jonathan dijo:


> Acá está lo que necesitas: https://www.forosdeelectronica.com/...aves-modulo-usb-pic18f2550-17458/index56.html
> 
> Es la página 56 del hilo...ahí puse 2 ejemplos en VB.net y Visual C# en donde muestro como realizar la comunicación.


 
La verdad es que me da verguenza que tubieras que ponerme ese link, ya que por vageza por mi parte tenia que haberlo visto y no haber preguntado, pero este hilo tiene ya muchas paginas y sinceramente me has ahorrado mucho tiempo. 
Disculpame por no haber leido todas las paginas.

Ya de paso voy a ver si meto otra vez la pata:
En uno de tus ejemplos_ https://www.forosdeelectronica.com/posts/143813/ _Necesito modificarlo para utilizar el pic 18F4550 en lugar del 18F2550 ya que me estan faltando pines.
El el programa en CCS simplemente he cambiado un pic por otro y me compila bien, pero mi duda esta en que no se si el programa en VB tal y como esta me permitira la conexion con el 18F4550.

Por cierto cuando quiero entrar a este hilo solo tengo que poner en el buscador "usb moyano"
Un saludo campeon


----------



## Meta (Ene 29, 2011)

Hpla @pepechip, estabas muy desaparecido últimamente. 

Estamos esperando que haga el manual básico con 8 entradas y salidas digitales, entradas analógicas y no se que más. Muy interesante.


----------



## Moyano Jonathan (Ene 29, 2011)

Hola pepechip. En caso de usar el PIC18F4550 no vas a tener problemas ...la aplicación funciona igual.

Meta: Estaba tardando porque quería encontrar una manera limpia de conectar USB mediante HID...(Sin librería anexa)...el tema es que se complicó por el momento así que el manual estará enfocado en el uso del easyHID usando VB.net y Visual C#.

saludos !


----------



## COSMICO (Ene 29, 2011)

Excelente amigo Jonathan.
Aquí esperando con ansia a que termines


----------



## pepechip (Ene 30, 2011)

Hola Angel
Si que estoy perdido, entre el trabajo y mi mujer, no tengo tiempo para nada.
Tranquilo, ya sabras lo que es esto cuando te cases. Disfruta ahora que estas soltero.
Ademas este problema lo tienen todos los amantes a la informatica y electronica.

Yo tambien estoy ansioso a que Moyano saque este manual.

Un saludo a todos


----------



## papixulo92 (Ene 31, 2011)

Buenas Evo x86 como has conseguido hacer funcionar el easyHID con windows 7? Yo tengo el VB 2008 y no se que hacer para que me funcione, la unica solucion que e encontrado seria cambiar mi sistema operativo :S
Un saludo


----------



## Evo x86 (Feb 4, 2011)

buen di papichulo92 aki esta el codigo que encontre en un foro, es la covnersion del codigo generado por easyHID a vsiual basic . net, funciona bien en visual 2010 en *win 7 x32*, no c como ahcerlo funcioanr en x64 si alguien sabe porfavor decriem como
nota(no lo converti yo)
////////////////////////////// el codigo de la form nombre Form1.vb
Option Strict Off
Option Explicit On

Public Class Form1
    Inherits System.Windows.Forms.Form

    ' vendor and product IDs
    Private Const VendorID As Short = 6017
    Private Const ProductID As Short = 2000

    ' read and write buffers
    Private Const BufferInSize As Short = 8
    Private Const BufferOutSize As Short = 8
    Dim BufferIn(BufferInSize) As Byte
    Dim BufferOut(BufferOutSize) As Byte

    ' ****************************************************************
    ' when the form loads, connect to the HID controller - pass
    ' the form window handle so that you can receive notification
    ' events...
    '*****************************************************************
    Private Sub MainForm_Load(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles MyBase.Load
        ' do not remove!
        ConnectToHID(Me.Handle.ToInt32)
    End Sub

    '*****************************************************************
    ' disconnect from the HID controller...
    '*****************************************************************
    Private Sub MainForm_FormClosed(ByVal eventSender As System.Object, ByVal eventArgs As System.Windows.Forms.FormClosedEventArgs) Handles Me.FormClosed
        DisconnectFromHID()
    End Sub

    '*****************************************************************
    ' a HID device has been plugged in...
    '*****************************************************************
    Public Sub OnPlugged(ByVal pHandle As Integer)
        If hidGetVendorID(pHandle) = VendorID And hidGetProductID(pHandle) = ProductID Then
            ' ** YOUR CODE HERE **
            TextBox1.Text = "plugged"
        End If
    End Sub

    '*****************************************************************
    ' a HID device has been unplugged...
    '*****************************************************************
    Public Sub OnUnplugged(ByVal pHandle As Integer)
        If hidGetVendorID(pHandle) = VendorID And hidGetProductID(pHandle) = ProductID Then
            hidSetReadNotify(hidGetHandle(VendorID, ProductID), False)
            TextBox1.Text = "unplugged"
            End If
    End Sub

    '*****************************************************************
    ' controller changed notification - called
    ' after ALL HID devices are plugged or unplugged
    '*****************************************************************
    Public Sub OnChanged()
        ' get the handle of the device we are interested in, then set
        ' its read notify flag to true - this ensures you get a read
        ' notification message when there is some data to read...
        Dim pHandle As Integer
        pHandle = hidGetHandle(VendorID, ProductID)
        hidSetReadNotify(hidGetHandle(VendorID, ProductID), True)
    End Sub

    '*****************************************************************
    ' on read event...
    '*****************************************************************
    Public Sub OnRead(ByVal pHandle As Integer)
        ' read the data (don't forget, pass the whole array)...
        If hidRead(pHandle, BufferIn(0)) Then
            ' ** YOUR CODE HERE **
            ' first byte is the report ID, e.g. BufferIn(0)
            ' the other bytes are the data from the microcontroller...
            TextBox1.Text = BufferIn(1)
        End If
    End Sub
End Class


////////////////////////////////////////////////////////////el codigo del maneja de la dll nombre mcHIDInterface.vb


Option Strict Off
Option Explicit On
Imports System
Imports System.Threading
Imports System.Runtime.InteropServices


Module HIDDLLInterface
	' this is the interface to the HID controller DLL - you should not
	' normally need to change anything in this file.
	'
	' WinProc() calls your main form 'event' procedures - these are currently
	' set to..
	'
	' MainForm.OnPlugged(ByVal pHandle as long)
	' MainForm.OnUnplugged(ByVal pHandle as long)
	' MainForm.OnChanged()
	' MainForm.OnRead(ByVal pHandle as long)


	' HID interface API declarations...
	Declare Function hidConnect Lib "mcHID.dll"  Alias "Connect"(ByVal pHostWin As Integer) As Boolean
	Declare Function hidDisconnect Lib "mcHID.dll"  Alias "Disconnect"() As Boolean
	Declare Function hidGetItem Lib "mcHID.dll"  Alias "GetItem"(ByVal pIndex As Integer) As Integer
	Declare Function hidGetItemCount Lib "mcHID.dll"  Alias "GetItemCount"() As Integer
	Declare Function hidRead Lib "mcHID.dll"  Alias "Read"(ByVal pHandle As Integer, ByRef pData As Byte) As Boolean
	Declare Function hidWrite Lib "mcHID.dll"  Alias "Write"(ByVal pHandle As Integer, ByRef pData As Byte) As Boolean
	Declare Function hidReadEx Lib "mcHID.dll"  Alias "ReadEx"(ByVal pVendorID As Integer, ByVal pProductID As Integer, ByRef pData As Byte) As Boolean
	Declare Function hidWriteEx Lib "mcHID.dll"  Alias "WriteEx"(ByVal pVendorID As Integer, ByVal pProductID As Integer, ByRef pData As Byte) As Boolean
	Declare Function hidGetHandle Lib "mcHID.dll"  Alias "GetHandle"(ByVal pVendoID As Integer, ByVal pProductID As Integer) As Integer
	Declare Function hidGetVendorID Lib "mcHID.dll"  Alias "GetVendorID"(ByVal pHandle As Integer) As Integer
	Declare Function hidGetProductID Lib "mcHID.dll"  Alias "GetProductID"(ByVal pHandle As Integer) As Integer
	Declare Function hidGetVersion Lib "mcHID.dll"  Alias "GetVersion"(ByVal pHandle As Integer) As Integer
	Declare Function hidGetVendorName Lib "mcHID.dll"  Alias "GetVendorName"(ByVal pHandle As Integer, ByVal pText As String, ByVal pLen As Integer) As Integer
	Declare Function hidGetProductName Lib "mcHID.dll"  Alias "GetProductName"(ByVal pHandle As Integer, ByVal pText As String, ByVal pLen As Integer) As Integer
	Declare Function hidGetSerialNumber Lib "mcHID.dll"  Alias "GetSerialNumber"(ByVal pHandle As Integer, ByVal pText As String, ByVal pLen As Integer) As Integer
	Declare Function hidGetInputReportLength Lib "mcHID.dll"  Alias "GetInputReportLength"(ByVal pHandle As Integer) As Integer
	Declare Function hidGetOutputReportLength Lib "mcHID.dll"  Alias "GetOutputReportLength"(ByVal pHandle As Integer) As Integer
	Declare Sub hidSetReadNotify Lib "mcHID.dll"  Alias "SetReadNotify"(ByVal pHandle As Integer, ByVal pValue As Boolean)
	Declare Function hidIsReadNotifyEnabled Lib "mcHID.dll"  Alias "IsReadNotifyEnabled"(ByVal pHandle As Integer) As Boolean
	Declare Function hidIsAvailable Lib "mcHID.dll"  Alias "IsAvailable"(ByVal pVendorID As Integer, ByVal pProductID As Integer) As Boolean

    ' windows API declarations - used to set up messaging...

    Public Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Integer, ByVal hwnd As Integer, ByVal Msg As Integer, ByVal wParam As Integer, ByVal lParam As Integer) As Integer
    Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" _
                                          (ByVal hwnd As Integer, ByVal nIndex As Integer, ByVal dwNewLong As Integer) As Integer

    Delegate Function SubClassProcDelegate(ByVal hwnd As Integer, ByVal msg As Integer, ByVal wParam As Integer, ByVal lParam As Integer) As Integer
    Public Declare Function DelegateSetWindowLong Lib "USER32.DLL" Alias "SetWindowLongA" _
                                           (ByVal hwnd As Integer, ByVal attr As Integer, ByVal lval As SubClassProcDelegate) As Integer


    ' windows API Constants
    Public Const WM_APP As Integer = 32768
    Public Const GWL_WNDPROC As Short = -4

    ' HID message constants
    Private Const WM_HID_EVENT As Decimal = WM_APP + 200
    Private Const NOTIFY_PLUGGED As Short = 1
    Private Const NOTIFY_UNPLUGGED As Short = 2
    Private Const NOTIFY_CHANGED As Short = 3
    Private Const NOTIFY_READ As Short = 4

    ' local variables
    Private FPrevWinProc As Integer ' Handle to previous window procedure
    Private FWinHandle As Integer ' Handle to message window
    Private Ref_WinProc As New SubClassProcDelegate(AddressOf WinProc)

    ' Set up a windows hook to receive notification
    ' messages from the HID controller DLL - then connect
    ' to the controller
   Public Function ConnectToHID(ByVal pHostWin As Integer) As Boolean
        FWinHandle = pHostWin
        pHostWin = hidConnect(FWinHandle)
        FPrevWinProc = DelegateSetWindowLong(FWinHandle, GWL_WNDPROC, Ref_WinProc)
      End Function

    ' Unhook from the HID controller and disconnect...
    Public Function DisconnectFromHID() As Boolean
        DisconnectFromHID = hidDisconnect
        SetWindowLong(FWinHandle, GWL_WNDPROC, FPrevWinProc)
    End Function


    ' This is the procedure that intercepts the HID controller messages...

    Private Function WinProc(ByVal pHWnd As Integer, ByVal pMsg As Integer, ByVal wParam As Integer, ByVal lParam As Integer) As Integer
        If pMsg = WM_HID_EVENT Then
            Select Case wParam

                ' HID device has been plugged message...
                Case Is = NOTIFY_PLUGGED
                    MainForm.OnPlugged(lParam)

                    ' HID device has been unplugged
                Case Is = NOTIFY_UNPLUGGED
                    MainForm.OnUnplugged(lParam)

                    ' controller has changed...
                Case Is = NOTIFY_CHANGED
                    MainForm.OnChanged()

                    ' read event...
                Case Is = NOTIFY_READ
                    MainForm.OnRead(lParam)
            End Select

        End If

        ' next...
        WinProc = CallWindowProc(FPrevWinProc, pHWnd, pMsg, wParam, lParam)

    End Function
End Module
///////////////////////////////////////////////////////////////////////////////////////////////////////////

espero les sirva, solo copien y peguen estso 2 programas en block de notas, ponganle extension .vb , en visual studio vayanse a gerar elemento existente, agregan los 2,hagan su progrma y agreguen la dll del easyHID y listo

si alguien tiene idea de ocmo peudo hacer funcionar mi pic en win 7 de 64 bits c lo agradeceria mucho
saludos


----------



## el anciano (Feb 11, 2011)

Hola Moyano Jonathan, permíteme felicitarte por tus buenos alcances en USB, y sobre todo por compartirlos y enseñarlos, buena onda...

Es mi primer post, pero he seguido el tema desde hace tiempo ya, y he simulado varios de los ejemplos posteados y han sido fructíferos...

Pero he leído que el tiempo de adquisición es bajo con respecto a la primera impresi{on 1.5MB/S

Estoy trabajando en un proyectico donde necesito adquirir datos de una memoria de alta velocidad (60MSPS) y llevarlo a la PC por medio del protocolo USB utilizando Labview,  ¿Crees que en modo BulK Transfer con 64 bytes de recepción sea suficiente para graficar datos? ó estaría desperdiciando la velocidad de trabajo de la memoria de almacenamiento que trabaja a altas velocidades? Puesto que la ideas es muestrear señales  lo más rápido posible.

He leído un poco sobre el Puerto paléalo Streaming que trae el PIC18F4550 que es de alta velocidad de transferencia de datos, qué opinas acerca de esto?  La verdad ni sé por dónde empezar,  quisiera me dieras un impulso para ver si puedo avanzar en esto...

Se Aceptan sugerencia, por favor ayúdame...

Gracias por tu tiempo...


----------



## Moyano Jonathan (Feb 12, 2011)

Hola el puerto paralelo Streaming que tiene el PIC18F4550 puede comunicar datos directamente con la USI (Interfaz serial universal), sin necesidad de ejecutar un programa que gestione la comunicación...ahora no hay ejemplos o personas que lo hayan hecho....fijate en el framework de C18..aparece una aplicación que permite la comunicación de datos a alta velocidad..pero desconozco totalmente su funcionamiento.

Usando el modo HID...conozco gente que ha configurado el PIC para transmitir de manera interruptiva 50 bytes / seg... pero no más de eso....

Las comunicaciones a alta velocidad usando el módulo USB del PIC no son mi fuerte...tendrías que estudiar profundamente los ejemplos del framework de microchip  y el protocolo USB...el algo bastante complejo.


----------



## Meta (Feb 12, 2011)

Para lo que lo queremos está bien, espero que sigas con ello.


----------



## el anciano (Feb 14, 2011)

Hola Moyano Jonathan, gracias por responder me ha quedado claro, sin embargo buscaré donde has dicho a ver con que me encuentro...

Saludos

En cuanto alo del USB, es muy bueno y no lo voy a dejar...

Cualquier avance se los haré saber...


----------



## saulon019 (Feb 14, 2011)

Hola, primero quiero agradecer por la ayuda que me a dado este foro y especialmente a Moyano Jonathan con sus ejemplos del bus USB, hace poco termine un proyecto usando el modulo USB del pic18f2550 y una interfaz gráfica en LABview, es un osciloscopio básico para el análisis de señales, les dejo la información para devolver el favor jajajajaja gracias

http://superelectronicaccosciloscopio.blogspot.com/

a el anciano le recomendaría almacenar los datos en una memoria serial EEPROM y sacarlos después de manera mas lenta por el bus USB, ya que este no teda toda la capacidad que necesitas, de esta manera la tendrías organizada, sin perdidas y almacenada de forma segura, espero les sirva.


----------



## el anciano (Feb 16, 2011)

hola Colega  saulon019  gracias por la respuesta en verdad me has ayudado con esa parte del diseño, voy a mirar tu ejemplo a ver con que me puedo ayudar...

gracias...

saludos


----------



## ivanbv4 (Feb 16, 2011)

Hola me estoy iniciando con los microcontroladores y queria saber si es posible que el micro se conecte a la pc via usb y a la ves trabajar con un periferico via rs 232. Disculpen la falta de conocimientos soy nuevo en esto jeje


----------



## Meta (Feb 16, 2011)

Las dos están bien. Aquí las RS232.

http://electronica-pic.blogspot.com/2008/11/electrnica-pic.html
http://electronica-pic.blogspot.com/2009/03/manual-interfaz-vc-y-visual-basic.html

Prefiero las USB ya que es lo que se usan ahora. Están haciendo pruebas con el USB para hacer un manual pequeño de:

8 Entradas digitales.
8 Salidas digitales.
Entradas anlógicas.
etc para hacer los primeros pinitos sobre el PIC18F y USB. Ahora mismo no se si está descansando o lo dejará para más adelante.


----------



## el anciano (Feb 16, 2011)

hola ivanbv4

Con los PIC de la serie 18F, porejemplo el 18F2550 ó el el PIC18F4550, puedes trabajar un periferico emulando un puerto serie con conexion usb, esta es la clace CDC y trabajar con conexion USB ya sea  en modo  Bulk Transfer que utiliza una libreria DLL, o con conexion HID...en este mismo foro hay información muy buena para que te empalmes con el tema,  empieza desde el principio para que no te enredes...

Con respecto a tu pregunta si lo puedes trabajar al mismo tiempo creo que si, teniendo en cuenta que no sobrepases el tamaño de la RAM, puesto que con estas comunicaciones se consume mucha de esta...

Saludos


----------



## Moyano Jonathan (Feb 16, 2011)

Bueno, retomando un poco el tema del manual ( versión reducida a aplicaciones HID ) les dejo el hardware que utilizaremos. El mismo será usado para todos los ejercicios implicados en el control por USB - HID.

El diseño está hecho en Eagle ( Solo el PCB )...luego en cuanto tenga tiempo subiré el esquemático correspondiente a este diseño.

Absolutamente todos los proyectos serán desarrollados en C de CCS v4.118 pero cualquier compilador desde la versión 4.023 les servirá.

Para el lenguaje de programación de la PC usaremos VB.net 2008.


----------



## el anciano (Feb 16, 2011)

Que bueno , creo que muchos esperamos ese manual...

Si chevere que subas el esquematico tambien 
Saludo


----------



## Meta (Feb 16, 2011)

Tenías la PCB hecha. Pillín. Buen  trabajo.


----------



## mnicolau (Feb 16, 2011)

Muy muy bueno Jonathan, acabo de saltar a la línea 18F programando con CCS, así que el topic me viene bárbaro, ni hablar del manual y la placa entrenadora 

Muchas gracias por el aporte 

Saludos!


----------



## Meta (Feb 16, 2011)

mnicolau dijo:


> Muy muy bueno Jonathan, acabo de saltar a la línea 18F programando con CCS, así que el topic me viene bárbaro, ni hablar del manual y la placa entrenadora
> 
> Muchas gracias por el aporte
> 
> Saludos!



¿Cómo que ni hablar del manual y la placa entrenadora?

Llevo desde el 2008 y apollándolo para que saque un manual base y simple para todo el mundo. Al menos las 8 entradas, 8 salidas digitales y entradas analógicas me van bien.

Saludo.


----------



## mnicolau (Feb 16, 2011)

Meta dijo:


> ¿Cómo que ni hablar del manual y la placa entrenadora?



 Es una forma de decir Meta... y me refiero a que va a ser de enorme ayuda ese manual y la placa entrenadora. Yo también me sumo a la espera .

Saludos


----------



## Meta (Feb 16, 2011)

Ammmmmmmmmmm.


----------



## COSMICO (Feb 16, 2011)

Que bueno jonathan gracias.


----------



## natouio (Feb 16, 2011)

Ayuda por favor

Hola a todos, he estado leyendo varias páginas de este extenso tema y no me queda más que felicitarles por el gran aporte que están brindandol, porfavor Moyano, meta o alguien que sepa del tema ayuda.

Por otro lado soy nuevo en esto de proyectos con USB, pero algo he avanzado; justamente por lo novato que soy estoy realizando un proyecto emulando el puerto serie con  comunicación USB (CDC)(me inicio en esto porque es lo más fácil, luego iré subiendo en complejidad), de hecho gracias a sus aportes ya logro conectar el PIC a la PC y me reconoce en el puerto serial, mi inquietud es la siguiente:

Quisiera desarrollar una interfaz en visual Basic 2008 para mi proyecto, el tratamiento del puerto en VB bajo comunicación CDC es para puerto serial??? o para USB???, soy nuevo en VB; se necesita de alguna librería especial para los puertos??? o alguna dll????  
Porfa necesito su ayuda como les dije para VB 2008; si alguien tiene algún programa para este tipo de comunicación con VB2008 le agradecería mucho que los suba porfa.
muchas gracias


----------



## Meta (Feb 16, 2011)

Buenas:

La información está a lo largo de este tema. Puedes pulsar aquí para buscar. Se está preparando un buen manual básico para hacer los primeros pinitos con el USB como:



> 8 Entradas digitales
> 8 Salidas digitales
> algunas entradas analógicas



Se hará con Visual Basic .net 2008. Hemos quedado que lo pasaré al Visual C#, este lenguaje se usa cada vez más.


----------



## el anciano (Feb 17, 2011)

Buen día Moyano Jonathan  y usuarios de este foro

Tengo una pequeña inquietud la cual quisiera me ayudaran a despejar…

Según la nota 1 Datasheet dice:


El Ciclo de instrucción  (búsqueda y ejecución) del periodo  (Tcy)  es igual  a cuatro veces la frecuencia de operación  del oscilador de entrada para todas las configuraciones excepto el PLL.  Todos los valores especificados se basan en datos de caracterización para ese tipo particular de oscilador  bajo  estándar de operación para el dispositivo  en condiciones de ejecución de código. 

Exceder estos topes especificados puede dar como resultado una operación inestable del oscilador y / o un  alto consumo de corriente. Todos los dispositivos son probados para funcionar en "mínimo". 

 Valores con un reloj externo  aplicado  al pin  OSC1/CLKI. Cuando una entrada externa del reloj es usada,  "Su ciclo límite máximo de tiempo" es  “DC”, es decir, sin reloj para todos los dispositivos. 


¿Quiero saber cuánto es el tiempo de retraso para un ciclo de instrucción o mejor dicho cuantos ciclos de reloj  utiliza la ejecución de una línea de código para la serie PIC18FXXX ?

concretamente  la frecuencia del PLL se divide tambien???????


----------



## Moyano Jonathan (Feb 17, 2011)

@natouio



> Quisiera desarrollar una interfaz en visual Basic 2008 para mi proyecto,  el tratamiento del puerto en VB bajo comunicación CDC es para puerto  serial??? o para USB???, soy nuevo en VB; se necesita de alguna librería  especial para los puertos??? o alguna dll????
> Porfa necesito su ayuda como les dije para VB 2008; si alguien tiene  algún programa para este tipo de comunicación con VB2008 le agradecería  mucho que los suba porfa.
> muchas gracias



Hola como estás, la aplicación la tenés que hacer para controlar un puerto serie..ya que el PIC al conectarlo a la PC te está generando un puerto serie. En las primeras páginas del post están los programas de ejemplo que puedes probar.



> ¿Quiero saber cuánto es el tiempo de retraso para un ciclo de  instrucción o mejor dicho cuantos ciclos de reloj  utiliza la ejecución  de una línea de código para la serie PIC18FXXX ?
> 
> concretamente  la frecuencia del PLL se divide tambien???????



T = 1/F (periodo es igual a 1 divido la frecuencia) ....para una frecuencia máxima de trabajo de 48Mhz (PIC18F2550) te va a resultar un periodo de 2 x 10 e - 8 seg.

La frecuencia del PLL se divide por programación mediante un divisor de frecuencia programable....

Todo lo que necesitas saber está en la hoja de datos en la parte de configuración de reloj.


----------



## natouio (Feb 17, 2011)

hola a todos!!!, muchas gracias por tu respuesta Moyano y Meta, revisaré con más cuidado las primeras hojas del foro!!!

Saludos


----------



## nietzche (Feb 19, 2011)

Hola, soy un entusiasta de los pics y ahora me adentro en el mundo de los 18f´s y dspic´s con CCS, quiero hacer un porgama sencillo de CAD con el 18f4550 y mostrarlo en la LCD , con el proteus simulo el programa  pero he notado que cuando con el potenciometro llega a su tope y la salida es 1022 (salida binaria) al bajar de nuevo el potenciometro salen numeros muy grandes  y se van haciendo mas grandes aun, intente poner a ´0´ la variable que almacena en adc?read pero nada. saludos



#include <18f4550.h> //archivo de cabecera
#DEVICE ADC=10 // cad a 10 bits, justificación a a la derecha
#fuses XTPLL,MCLR,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL1,CPUDIV1,NOVREGEN,NOPBADEN 
#use delay(clock=48000000) // el clock que tendremos a la entrada del CPU
#include <lcd.c>

void main() {
long value=0;
lcd_init();
int ADC_ACQT_2TAD=0x1;

 setup_adc_ports( AN0 || VSS_VDD );
 setup_adc(ADC_CLOCK_DIV_64 || ADC_ACQT_2TAD );
 set_adc_channel(0);
 while(1){ // bucle infinito
 value = read_adc(); // toma el resultado del CAD
lcd_gotoxy(1,1);
 printf(lcd_putc,"Valor = %Lu",value);
 }
}


----------



## murphy9 (Feb 20, 2011)

Hola, prueba agregando espacios antes de cerrar las comillas en el printf, a mi solía pasarme algo similar, por ejemplo si mostraba el numero 1023, y luego quería bajar a 900, el lcd marcaba 9003, parece que quedaba almacenado el ultimo dígito del 1023, asi que para solucionarlo agregue un espacio, con lo que terminaba sobreescribiendolo y asi mostraba el mensaje como yo deseaba
Entonces, prueba escribiendo:

lcd_gotoxy(1,1);
printf(lcd_putc,"Valor = %Lu  ",value);


----------



## nietzche (Feb 20, 2011)

Excelente murphy9, funciona a la perfeccion muchas gracias.


----------



## MAUROCP (Feb 20, 2011)

Hola a todos!!!
he estado probando los programas de moyano y dejenme comentar que son muy buenos, pero tengo un problema, cuando compilo los programas para generar el .hex mo me funciona, creo saber cual es el problema, lo que pasa es que nose usar el CCS ya que yo programo en ASM y recien comienso a migrar al C, si alguien puede ayudarme con ese problemilla tal ves con algun tutoria le estare muy agradecido, saludos a todos.


----------



## saulon019 (Feb 20, 2011)

Ok, gracias por la info, espero tu manual con ansias.


----------



## Moyano Jonathan (Feb 20, 2011)

> Hola, saludos a todos, quisiera saber si alguien a trabajado con el  modulo reforzado ECCP del pic18f4550, quisiera saber como sacar dos  señales PWM una normal y la otra el inverso de la primera, esto es para  el control de velocidad y direccionamiento de un Robot tipo tanque que  estoy construyendo, les agradezco la ayuda que me puedan brindar.



Disculpá, pero este hilo no coincide con tu pregunta. Por favor abrí un hilo propio.

Muchas gracias y saludos !



> lo que pasa es que nose usar el CCS ya que yo programo en ASM y recien  comienso a migrar al C, si alguien puede ayudarme con ese problemilla  tal ves con algun tutoria le estare muy agradecido, saludos a todos.



En este hilo se tratan temas referente al USB solamente. Si necesitas aprender C , en el foro hay muchos manuales y tutoriales.

Saludos !


----------



## Meta (Feb 20, 2011)

Moyano. ¿Sigues con el manual  o sigues descansando?
De paso adelanto para pasarlo a C# algo. Si ya tienes de alguna manera para que funcionen las 8 In y salidas digitales más In analógicas me avisas.


----------



## Moyano Jonathan (Feb 20, 2011)

Estoy con otras cosas Meta en este momento, acuerdate: "la paciencia es una virtud". La semana que viene armo el hardware que les mostré anteriormente y comienzo con la programación.

Un saludo !


----------



## Meta (Feb 20, 2011)

AJjaaj, por Dios, me olvidé que estabas con el HardWare, disculpe usted.

Tan pronto como lo entienda, lo paso o lo pasamos a C18 que cad avez se usa más y Visual C#. Ya me encargaré del C#. Ahora mismo estoy dando Java en clase y se parece mucho a C#, en el cual me estoy reforzando mejor las sintaxis del lengueje. El próximo año daremos .net, se sospecha que con el VB .net. No me gusta mucho ese lenguaje pero por lo menos se usa mucho por internet.

En España salió en el telediario que Java es el rey indiscutible, se usa mucho en empresas. Lo que preocupa ahora que Java pertenece a una empresa privada Oracle, tiene fama de hacer desaparecer lo que compra, otras veces ponerlo de pago, por ahora le tocó MySQL y Java lo más probable que haga algo similar. Así que hay alternativas como Visual Studio de pago. 

Viendo la estructura interna y a fondo (en realidad me queda mucho que mirar), .net está por encima del Java ya que han corregido errores de otros lenguajes. De todas formas, de alguna manera o otra se peude hacer muchas cosas relacionada con la electrónica.

todavía hay gente pidiéndome que les haga un manual sobre Visual Basic 6 y puerto RS232, puse una propuesta en este tema y comprobé que no. No hay quien les entienda. Por si acaso, les traigo el tema.
https://www.forosdeelectronica.com/f26/usar-visual-basic-6-a-36801/

Muchos ánimos.


----------



## Juanlobo1 (Mar 2, 2011)

Grosso papa, llevo tiempo buscando informacion algo comprensible para quienes no conocemos mucho de comunicaciones con el pc ni de electronica, hasta que lo encontre en este post.

Muchas gracias por dedicar ese tiempo a subir toda esa valiosa informacion, que la verdad la necesitaba...


----------



## Meta (Mar 2, 2011)

Deja que aparezca el manual básico, muchos fliparán.

Saludo.


----------



## natouio (Mar 2, 2011)

buenos días a todos amigos


Tengo una inquitud, he programado ya mi PIC 18f4550 con emulación de puerto serial es decir CDC, y me va super bien en la simulación con proteus, pero cuando lo implementé ya en hardware al momento de conectarlo al puerto de la PC me sale un mensaje que dice que no se reconoce el dispositivo USC y que tiene un problema etc...; porque puede ser esto??? (ojo en la simulación si funciona), para grabarlo utilizo WINPIC800, puede ser algo de los fuses??? o que puede  ser?? porfavor necesito su ayuda los más pronto posible


----------



## Moyano Jonathan (Mar 2, 2011)

En realidad pueden ser varios los problemas, entre los más comunes podés revisar:

- Cables D+ y D- invertidos.
- Capacitor Vusb no conectado.
- Cristal erroneo o estropeado.
- *Mala configuración de los fuses , especialmente del PLL con respecto al cristal utilizado.*
- Tensión USB insufiente debido al uso de HUB's sin alimentación auxiliar.

....el problema lo más seguro que esté en el hardware. Ahora puede ocurrir que estés configurando algo mal en el winPIC800, fijate de ponerme una captura de pantalla en la configuración de los fusibles de dicho programa.

*PD: *Ya tengo montado el entrenador USB con el que haré el manual por lo que en el transcurso de la semana que viene estaría comenzando con la programación de la aplicación de control.

*Un dato importante es que la librería easyHID.dll corre bien en Windows 7 usando Visual Basic 6.0 o Visual Basic 2008....por lo que las aplicaciones tendrían que ser compatible en cualquier sistema operativo Windows.*


----------



## Meta (Mar 3, 2011)

Buenas:

¿Cuál es la Web oficial de la .dll?
http://www.google.es/#sclient=psy&hl=es&q=easyHID.dll&aq=&aqi=&aql=&oq=&pbx=1&fp=13b05f05c61e1288

Para saber la última version.
En realidad las .dll se puede usar hasta en C#.

Saludo.


----------



## mantenilsa (Mar 3, 2011)

En primer lugar felicitaciones por el trabajo.

En el Pcb que subiste, realizado con Eagle, se aprecian unos pad cerca de los potenciometros, me imagino que seran puentes pero no aparecen en lado de componentes del documento Pdf.

Por otro lado seria muy interesante que pudieras subir el esquema asi como unas fotos del prototipo terminado.

Creo que hablo por todos al decirte que estamos deseando empezar con la programacion.

Muchas gracias por tu aporte.


----------



## mantenilsa (Mar 3, 2011)

Adjunto esquema en proteus para simular el codigo de los ejemplos.
Realizado con la version 7.4 sp3.


----------



## Moyano Jonathan (Mar 3, 2011)

Buenisimo, en cuanto tenga tiempo reviso el esquema y subo las fotos del montaje terminado. 

Muchas gracias por la colaboración mantenilsa !


----------



## natouio (Mar 3, 2011)

hola a todos

muchas gracias Moyano, efectivamente los cable de d+ y d- estaban invertidos, me di cuenta del error y ahora lo tengo andando a perfección gracias!!!


----------



## albermillan69 (Mar 3, 2011)

Como esta todo por alla MOYANO??? he estado un poco alejado del foro por razones universitarias! escribo en esta oportunidad solo para saber si si puede pasar un FLOAT via USB-CDC?? como lo haria?? es decir como hago para enviar datos REALES y mayores a  8 bit?? MIl Gracias...


----------



## Moyano Jonathan (Mar 3, 2011)

Hola albermillan , como estás ?.

Mirá las funciones dentro del modo CDC son muy similares a las RS232 standar...por lo tanto tendrías que usar la función Printf() en conjunto con la función cdc_putc()....printf(cdc_putc, "valor float: %f", x) o algo similar...tendrías que investigar en los foros de CCS.

@natouio  menos mal que te funcionó !


----------



## Pax (Mar 9, 2011)

Alguien puede decirme en este LARGO tema donde puedo ubicar un ejemplo completo (codigo vb.net + codigo pic) sobre comunicacion usb para el 18f2550, ya que el unico codigo que consigo para pic es el que esta en la pagina 1 y los ejemplos que veo para descargar hechos en vb.net estan solos, sin el codigo para el micro... por favor cualqueir informacion la agradeceria...


----------



## Juanlobo1 (Mar 14, 2011)

Hola a todos, ando un poco perdido desde el primer ejemplo jejeje, quisiera saber si me pueden colaborar para lograr poner a funcionar el ejemplo de los 8 leds controlados desde usb... o sea realizo el esquema que aparece en el dibujo, pongo a correr el programa??? cuando es llamado el programa vb, se que ando muy perdido, pero la verdad necesito como salir de esas dudas para seguir adelante en este tema tan interesante.
de antemano les agradezco su atencion


----------



## albermillan69 (Mar 16, 2011)

Gracias *MOYANO*!!

Ahora necesito una ayuda para modificar unas cosas en los driver del usb_cdc! aqui te mando una imagen de lo q necesito!! 

necesito q diga algo personalizado y colocarle un icono!!

Gracias por tu gran ayuda!

OK ya solucione lo de la descripcion!! 
Cambie el VID!! No usé el de Microchip
Ahora solo me falta colocarle el icono!! como hago?? 

Gracias...


----------



## Moyano Jonathan (Mar 16, 2011)

Lo de la solución que me decís la tenés modificando los descriptores USB del proyecto. En hojas más atras se muestra como.

PD: *Para todos los que me pedían el manual de aplicaciones mediante USB, lo tendré en unos días más pero no será a gran detalle sino una explicación de como pueden crear sus propias aplicaciones. Lo mejor de todo es que termine de hacer las pruebas con el firmware - software por lo que ya está en funcionamiento la 1° aplicación ejemplo.*

*El proyecto consta de las siguientes especificaciones:*

*- Escrito en CCS para el PIC y Visual C# 2008 para la PC.*
*- Interfaz intuitiva.*
*- Control mediante HID e interrupciones.*

*- Los controles incluidos (probados):*
*- PWM.*
*- entradas digitales.*
*- entradas analógicas.*
*- salidas digitales.*

*Proximamente añadiré más controles pero será más adelante asi como también el pasaje a otros lenguajes de programación.*


----------



## Meta (Mar 17, 2011)

Que bien.  

Por fin algo de USB, ejejjeje. 

Esperando el manual honorable Moyano.


----------



## albermillan69 (Mar 17, 2011)

Moyano Jonathan dijo:


> Lo de la solución que me decís la tenés modificando los descriptores USB del proyecto. En hojas más atras se muestra como.



Gracias!!! pero sin mentira alguna revise hoja por hoja y no lo encontre!!! solo necesito agregar un icono para q aparezca en la ventana de instalacion del driver y tratar de cambiar el q trea por defector para el puerto com virtual!!

Dame una manito plis!!!


----------



## albermillan69 (Mar 17, 2011)

*UNA PREGUNTA ADICIONAL:* El metodo usb Bulk tiene interrupciones??  es q ya de tanta informacion confundo los metodos!
Osea q el micro sepa cuando se le esta enviando un dato, sin necesidad de estar siempre leyendo el buffer!!

Bueno ya investigue!!! y en CDC no se puede cambiar el icono!!


----------



## EINNER C (Mar 17, 2011)

hola a todos,,, muy bueno este post,,, 

he tenido inconvenientes con una comunicacion cdc con lcd, no funciona si dejo la lcd, es decir si no inicio y muestro nada en la lcd funciona perfecto, cuando conecto reconoce y todo, y muestra en la interfaz, vb.net,, y realiza todo muy bn, pero si no mas pongo lcd_init(); ya se traba, esto en funcionamiento real, por que en simulacion funciona perfecto,,, la verdad no se uqe sera y he trabajado todo el dia en eso pero nada que encuentro el error,,, utilizo cristal d 4mhz,, los fuses los tengo asi

#fuses XTPLL,MCLR,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL1,CPUDIV1,VREGEN,NOPBADEN

y cambie la lcd al portb ,,,, pero nada la verdad no se que sera,,, yo recuerdo haber hecho hace un tiempo una comunicacion col lcd de tipo cdc y me funciono, pero la verdad es que el disco se dano y no logre recuperar nada, y la verdad no recuerdo que estare haciendo mal,,  le agradesco de antemano su ayuda


----------



## albermillan69 (Mar 18, 2011)

EINNER C dijo:


> hola a todos,,, muy bueno este post,,,
> 
> he tenido inconvenientes con una comunicacion cdc con lcd, no funciona si dejo la lcd, es decir si no inicio y muestro nada en la lcd funciona perfecto, cuando conecto reconoce y todo, y muestra en la interfaz, vb.net,, y realiza todo muy bn, pero si no mas pongo lcd_init(); ya se traba, esto en funcionamiento real, por que en simulacion funciona perfecto,,, la verdad no se uqe sera y he trabajado todo el dia en eso pero nada que encuentro el error,,, utilizo cristal d 4mhz,, los fuses los tengo asi
> 
> ...



Coloca tu codigo!! asi te podremos ayudar mejor!!


----------



## EINNER C (Mar 18, 2011)

hola Gracias por responder, este es el codigo, esta comentado lo de la lcd y trabaja perfecto, pero si dejo lo de la lcd en simulacion sirve pero en real no,,,,,


#include <18F2550.h>
#DEVICE ADC=10
#fuses XTPLL,MCLR,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL1,CPUDIV1,VREGEN,NOPBADEN
#use delay(clock=48000000)

#define use_portb_lcd TRUE
//#define USB_CON_SENSE_PIN PIN_A4

#include <lcd.c>
#include "usb_cdc.h"

float luxsd;
long  temper,luxs;
unsigned int temp,lux[2],recib,modo=0,hini=0,hini1=0,warning=0x0f;
signed int enc=0xff;

void usb_com()
     {
     if(usb_cdc_connected())
       {
        output_high(pin_c6);
        output_low(pin_c7);
        if (usb_enumerated())
           { warning=0;
           if(usb_cdc_kbhit())
             {
              recib=usb_cdc_getc();
              if(recib==0x31)
                { 
                 usb_cdc_putc(temp);
                 usb_cdc_putc(lux[0]);
                 usb_cdc_putc(lux[1]);
                }
              if(recib==0x32)
                {
                 output_HIGH(pin_A3);
                 //lcd_putc("\fInt Luz");
                 //lcd_putc("\n Temp:    C lux");
                 enc=1;
                }
              if(recib==0x33)
                {
                 output_low(pin_A3);
                 lcd_putc("\f");
                 enc=0xff;
                }
              if(recib==0x34)
                {
                 usb_cdc_putc(0x0f);
                 usb_cdc_putc(0x0f);
                 usb_cdc_putc(0x0f);
                }
              if(recib==0x35)
                {
                 output_high(pin_c7);
                 output_low(pin_c6);
                }
              if(recib==0x36)
                {
                 /*lcd_putc("\f Inicio de Insp");
                 lcd_putc("\nen Base de Datos");
                 delay_ms(200);
                 lcd_putc("\fInt Luz");
                 lcd_putc("\n Temp:    C lux");*/
                }
              if(recib==0x37)
                {
                 /*lcd_putc("\f  Termino Insp");
                 lcd_putc("\nen Base de Datos");
                 delay_ms(2000);
                 lcd_putc("\fInt Luz");
                 lcd_putc("\n Temp:    C lux");*/
                }
              }
            }
          }
        }

void adquisicion()
     {
     set_adc_channel(0);
     delay_us(10);
     luxs = read_adc();
     delay_us(60);
     set_adc_channel(1);
     delay_us(10);
     temper = read_adc();
     delay_us(60);

     luxsd = (((0.00000000000006) * (luxs ^ 6)) - ((0.0000000002) * (luxs ^ 5)) + ((0.0000004) * (luxs ^ 4)) - ((0.0003) * (luxs ^ 3)) + ((0.119) * (luxs ^ 2)) - (26.409 * luxs) + 2632);
     temp= temper*0.48828125;

     lux[0]=make8(luxs,0);
     lux[1]=make8(luxs,1);
     /*
     if (temp>=100)
        {
         lcd_gotoxy(7,2);
         printf(lcd_putc,"%d",temp);
        }

     if (temp>=10)
        {
         lcd_gotoxy(7,2);
         printf(lcd_putc,"  %d ",temp);
        }
     else
        {
         lcd_gotoxy(7,2);
         printf(lcd_putc,"  %d  ",temp);
        }

        //if (luxs>=100000)
        // {lcd_gotoxy(9,1);
        //printf(lcd_putc,"%ld",luxs);}

     if (luxs>=10000)
        {
         lcd_gotoxy(9,1);
         printf(lcd_putc," %f",luxsd);
        }

     if (luxs>=1000)
        {
         lcd_gotoxy(9,1);
         printf(lcd_putc," %f ",luxsd);
        }

     if (luxs>=100)
        {
         lcd_gotoxy(9,1);
         printf(lcd_putc,"  %f ",luxsd);
        }

     if (luxs>=10)
        {
         lcd_gotoxy(9,1);
         printf(lcd_putc,"  %f  ",luxsd);
        }
     else
        {
         lcd_gotoxy(9,1);
         printf(lcd_putc,"   %f  ",luxsd);
         } */
      }

void main() 
     {
      set_tris_a(0x03);
      setup_adc_ports(AN0_TO_AN1);
      setup_adc(ADC_CLOCK_INTERNAL );

      output_high(pin_c7);
      output_low(pin_c6);
      output_low(pin_A3);

       /*lcd_init();//inicializamos el USB
       lcd_putc("\fLuxometroDigital");
       lcd_putc("\n  Mesalud Ltda");*/

      while(true)
           {
            if (input(pin_c0) == 1)
               {

               if (input(pin_c1) == 1)
                  {
                  if(warning==0 && hini1==1)
                    {
                     usb_cdc_putc(0xff);
                     usb_cdc_putc(0x36);
                     usb_cdc_putc(0x36);
                     warning=1;
                     }
                   /*lcd_putc("\f Desconecte USB");
                   lcd_putc("\n  o La Bateria");*/
                   delay_ms(2000);
                   /*lcd_putc("\fEl Equipo Puede");
                   lcd_putc("\n  Sufrir Danos");*/
                   delay_ms(2000);
                   hini=0;
                   enc=0xff;
                  }
               else
                  {
                   warning=0;
                   if(hini==0)
                     {
                      //lcd_putc("\fLuxometroDigital");
                      //lcd_putc("\n  Mesalud Ltda");
                     }       
                   hini=1;
                   modo=0x0f;
                  }
               }
            else
               {
                modo=0xf0;
                warning=0;
                output_low(pin_a2);
                if(hini==0)
                  {
                   //lcd_putc("\fLuxometroDigital");
                   //lcd_putc("\n  Mesalud Ltda");
                  }           
                  hini=1;
                  if(hini1==0)
                     {
                      usb_cdc_init();
                      usb_init_cs();
                     hini1=1;

                     }
                  }

             if (hini==1)
                {
                if(input(pin_c2))
                  {
                   delay_ms(200);
                   enc=enc*-1;
                   if(enc==1)
                     {
                      output_HIGH(pin_A3);
                      //lcd_putc("\fInt Luz");
                      //lcd_putc("\n Temp:    C lux");

                      usb_cdc_putc(0xff);
                      usb_cdc_putc(0x32);
                      usb_cdc_putc(11);

                      }
                   else
                      {output_LOW(pin_A3);

                       usb_cdc_putc(0xff);
                       usb_cdc_putc(0x33);
                       usb_cdc_putc(11);

                       //lcd_putc("\f");
                       }
                     }
                   }

            if(enc==1)
              {
               if (modo==0x0f)
                  {
                  output_high(pin_a2);
                   adquisicion();
                  }
                if(modo==0xf0)
                  {
                   usb_task();
                   adquisicion();
                   usb_com();
                  }
              }
            else
              {
              output_low(pin_a2);
               if(modo==0xf0)
                 {
                  usb_task();
                  usb_com();
                  }
               }
            }
       }


con solo lcd_init() ya se bloquea....

gracias y espero su ayuda............


----------



## EINNER C (Mar 18, 2011)

hola a todos,,, 

problema solucionado,,, era la lcd, estaba danada, no habia probado con otra por que no tenia a la mano, ya la cambia y funciona perfecto,,,,,,,,,,,


----------



## Moyano Jonathan (Mar 19, 2011)

> *UNA PREGUNTA ADICIONAL:* El metodo usb Bulk tiene interrupciones?? es q ya de tanta informacion confundo los metodos!
> Osea q el micro sepa cuando se le esta enviando un dato, sin necesidad de estar siempre leyendo el buffer!!
> 
> Bueno ya investigue!!! y en CDC no se puede cambiar el icono!!


 
Si el USB tiene interrupciones ....pero no están disponibles para el usuario a no ser que armes tus propias funciones de control para obtener los datos...
Lo mejor es usar la función Usb_Kbhit()....con eso vos te fijas en un momento determinado si hay o no datos...

Ahora con el tema del ícono de CDC no se puede personalizar por que windows lo reconoce como un puerto serie y le pone el icono correspondiente a ese puerto.

Un saludo !


----------



## albermillan69 (Mar 20, 2011)

Moyano Jonathan dijo:


> Si el USB tiene interrupciones ....pero no están disponibles para el usuario a no ser que armes tus propias funciones de control para obtener los datos...
> Lo mejor es usar la función Usb_Kbhit()....con eso vos te fijas en un momento determinado si hay o no datos...
> 
> Ahora con el tema del ícono de CDC no se puede personalizar por que windows lo reconoce como un puerto serie y le pone el icono correspondiente a ese puerto.
> ...



Ok Gracias Moyano!!! Cualquier cosa estamos en contaco!!


----------



## albermillan69 (Mar 20, 2011)

Otra vez yo!!! Jejejejeje como puedo hacer para aumentar la velocidad de transferencia de datos en USB_CDC?? osea superior a 9600 Baudios!!! que o donde debo modificar??? Gracias!!!


----------



## Moyano Jonathan (Mar 20, 2011)

FIjate en las primeras páginas del hilo creo que aparece...sino en mi manual ...en la última version tambien aparece.


----------



## albermillan69 (Mar 20, 2011)

Moyano Jonathan dijo:


> FIjate en las primeras páginas del hilo creo que aparece...sino en mi manual ...en la última version tambien aparece.



Q tal si colocas la ultima version del manual en el primer post del foro!! asi no estariamos buscando por todo el foro cual es el ultima version y donde esta!!!

Espero q tomes mi sugerencia y gracias!!! pronto dare mis aportes!!


----------



## EINNER C (Mar 20, 2011)

albermillan69 dijo:


> Otra vez yo!!! Jejejejeje como puedo hacer para aumentar la velocidad de transferencia de datos en USB_CDC?? osea superior a 9600 Baudios!!! que o donde debo modificar??? Gracias!!!




mira en el archivo usb_cdc.h donde se encuentra toda la configuracion del puerto...

void usb_cdc_init(void) {
   //usb_cdc_line_coding.dwDTERrate=9600;//ORIGINAL
   usb_cdc_line_coding.dwDTERrate=57600;
   usb_cdc_line_coding.bCharFormat=0;
   usb_cdc_line_coding.bParityType=0;
   usb_cdc_line_coding.bDataBits=8;
   (int8)usb_cdc_carrier=0;
   usb_cdc_got_set_line_coding=FALSE;
   usb_cdc_break=0;
   usb_cdc_put_buffer_nextin=0;
   usb_cdc_get_buffer_status.got=0;
   usb_cdc_put_buffer_free=TRUE;

alli modificas guardas y compilas y listo,,, tambn cuando se intale tu dispositivo en el pc, debes ir a administrador de dispositivos y ver configuracion del puerto del com generado,,,

alli puedes indicar el com que quieras aasignar y la velocidad que este maneja,,, e

espero te sirva, cualquier duda, con gusto..............

en cuanto a lo del manual, estoy de acuerdo Moyano, ojala publiques la ultima version


----------



## albermillan69 (Mar 20, 2011)

EINNER C dijo:


> mira en el archivo usb_cdc.h donde se encuentra toda la configuracion del puerto...



Cual seria la asignacion del com??? y gracias ya me habia puesto a ver todas las librerias y me di cuenta q tendria q crear una variable para lo de la velocidad!!

Ah ok ya entendi!!! habia leido mal!! si esa parte de la configuracion del pc lo se! pense q me hablabas q podia asignar de una vez el COM desdes el pic!! jejejeje

Gracias por tu ayuda! la sabre valoras!!! pronto doy mis aportes!!


----------



## Moyano Jonathan (Mar 21, 2011)

Con el tema del libro del USB ...voy a tardar bastante en terminarlo. En cuanto al manual de aplicaciones con el USB referido a HID va avanzado y proto van a tenerlo listo para la descarga.


----------



## dexf3 (Mar 22, 2011)

Hola! aestuve leyendo un poco ya que son bastantes paginas...y me gustaria saber si es posible llegar un poco mas alla de 1Mbit/s ya que necesito leer 1kByte desde un conversor AD (que muestrea a 400kHz) y enviarlo a la pc en menos de 7ms...si alguien me puede ayudar u orientarme les estare agradecido!


----------



## eviltools (Mar 22, 2011)

Hola moyano! Oye como puedo hacer para enviar por usb CDC una cadena y que se guarde en la eprom interna del 2550 o 4550, por tu atencion muchisimas gracias


----------



## albermillan69 (Mar 22, 2011)

eviltools dijo:


> Hola moyano! Oye como puedo hacer para enviar por usb CDC una cadena y que se guarde en la eprom interna del 2550 o 4550, por tu atencion muchisimas gracias



si mal no recuerdo en la librerias esta una funcion para ello!!! revisa las librerias!!!


----------



## Moyano Jonathan (Mar 22, 2011)

> Hola! aestuve leyendo un poco ya que son bastantes paginas...y me gustaria saber si es posible llegar un poco mas alla de 1Mbit/s ya que necesito leer 1kByte desde un conversor AD (que muestrea a 400kHz) y enviarlo a la pc en menos de 7ms...si alguien me puede ayudar u orientarme les estare agradecido!


 
Vas a tener que investigar el siguiente link: http://www.todopic.com.ar/foros/index.php?topic=25188.0


----------



## albermillan69 (Mar 24, 2011)

Moyano tengo un problemita haciendo una comunicacion USB_CDC!!!

Tengo tres led que me deberian indicar cuando el PIC:
1.No esta Conectado al PC (ROJO)
2.Cuando esta Conectado al PC (Amarillo)
3.Cuando esta Enumerado (VERDE)

el programa principal en CCS es:
void main() {
   set_tris_b(0x0F);             // Nibble bajo entradas, el alto salidas
   LED_OFF(VERDE);
   LED_OFF(AMARILLO);
   LED_OFF(ROJO);
   usb_cdc_init();               // llamadas necesarias para iniciar el módulo USB.
   usb_init_cs();                // inicia el USB y sale. Va de la mano con usb_task().
   WHILE(true){
     usb_task();                 // configura el USB.
     while(usb_cdc_connected()){    // Si está conectado entonces....
      // Espera a detectar una transmisión de la PC (Set_Line_Coding).
       WHILE (usb_enumerated()){    // aquí se enumera el dispositivo por el host y despúes sale.
         //WHILE(usb_cdc_kbhit()){ //en espera de nuevo(s) caracter(es) en el buffer.
         //}
       TITILA(VERDE);
       DELAY_MS(100);
       }
     TITILA(AMARILLO);
     DELAY_MS(100);
     }
   TITILA(ROJO);
   delay_ms(100);
   }
}

Estoy usando proteus para simular esto! resuta ser q cuando arranco la simulacion el led rojo titila (me da a entender q esta trabajando correcto), al hacer el sonido de windows  (se conecto un USB, en este el virtual de proteus), supongo que ya el led rojo debe dejar de titilar y comenzar a titilar el amarillo (no?) (pues no lo hace). una vez que hago la conexion desde VB comienza a titilar el verde (si se apaga el rojo).

Ahora cuando cierro el puerto el puerto en VB el led verde sigue titilando y los demas siguen apagados.

Preguntas:
Por que el led amarillo no enciende al conectar el dispositivo?
Por que el led rojo no titila ni se apaga el verde al cerrar el puerto en VB?

Ademas: como puedo saber en VB que se a conectado el dispositivo al puerto?

Muchas Gracias. Estare esperando tu respuesta!! OJO ra revise los ejercios anteriores!!

otra pregunta como utilizo el get_string_usb() en el ccs (para recibir cadena de caracteres)??? Gracias...


----------



## Moyano Jonathan (Mar 25, 2011)

Moyano tengo un problemita haciendo una comunicacion USB_CDC!!!



> Tengo tres led que me deberian indicar cuando el PIC:
> 1.No esta Conectado al PC (ROJO)
> 2.Cuando esta Conectado al PC (Amarillo)
> 3.Cuando esta Enumerado (VERDE)


 
*Punto 1:* Conecta el led al Vusb con una resistencia de 470R , con esto sabrás cuando estás conectado a la alimentación. (led amarillo).
*Punto 2:* Usa la función usb_wait_enumeration(){} de la siguiente manera:

enciende led rojo // Conección de alimentación pero no está enumerado.
apaga led verde // no esta enumerado.
usb_wait_enumeration(){} ....espera que se enumere.
enciende led verde // dispositivo enumerado.
apaga led rojo // USB oK....no hay error.

El código va dentro del main pero fuera del bucle infinito...

Para el código que no te funciona, mirá el post #28 de la página 2 del foro. Ahí muestra como usar la función: *usb_cdc_connected()*

*get_string_usb() , *nunca lo utilicé tendría que ver como es la función. 



> Por que el led amarillo no enciende al conectar el dispositivo?


 
Mal programada la función...la solución: Usar usb_wait_enumeration(){} o fijarse como usar el usb_cdc_coneccted() en la pagina 2.



> Por que el led rojo no titila ni se apaga el verde al cerrar el puerto en VB?


 
El host no le avisa al dispositivo cuando se cierran las comunicaciones. Uno mismo tiene que fijarse cuando no hay comunicaciones.

Cuando vos conectas el dispositivo el host lo enumera. Luego conectas el COM a la aplicación ( El dispositivo no interviene) y por último cerras la comunicación con el COM (el dispositivo no interviene)...por que digo que el dispositivo no interviene: *La aplicación en VB cierra el controlador* que se comunica con el dispositivo ....el dispositivo ni se mosquea cuando cerras la comunicación....por que sigue conectado a la PC y enumerado.



> Ademas: como puedo saber en VB que se a conectado el dispositivo al puerto?


 
Si hacemos de cuenta que el dispositivo genera un COM4 y la aplicación trata de conectarse con el controlador de dicho dispositivo. El controlador responderá de manera adecuada y nos enlazará. 

Ahora si desconectamos nuestro dispositivo y la aplicación trata de conectarse al mismo puerto (inexistente ya que hemos desconectado el dispositivo), mostrará un error que podemos procesar para mostrar "dispositivo no conectado"

También podemos hacer un pequeño subprograma en un timer que se ejecute cada 100ms aprox....o menos... enviando un comando al dispositivo al cual se tenga que hacer eco....si la aplicación no obtiene respuesta del comando...se tomo que se ha desconectado y para la comunicación....

En fin son ideas...


*PD: HE TERMINADO DE ESCRIBIR EL MANUAL DE APLICACIONES HID POR LO TANTO PROXIMAMENTE SUBIRÉ TODO PARA QUE LO VEAN.*


----------



## Meta (Mar 25, 2011)

Moyano Jonathan dijo:


> *PD: HE TERMINADO DE ESCRIBIR EL MANUAL DE APLICACIONES HID POR LO TANTO PROXIMAMENTE SUBIRÉ TODO PARA QUE LO VEAN.*



Buenísimo. 

Vamos haber como está el pedazo de manual que haz hecho. Muchos ánimos campeón.


----------



## COSMICO (Mar 25, 2011)

Gracias Moyano, que bién!
Ya me imagino la cantidad de cosas que se podran hacer.


----------



## albermillan69 (Mar 25, 2011)

Moyano Jonathan dijo:


> También podemos hacer un pequeño subprograma en un timer que se ejecute cada 100ms aprox....o menos... enviando un comando al dispositivo al cual se tenga que hacer eco....si la aplicación no obtiene respuesta del comando...se tomo que se ha desconectado y para la comunicación....
> 
> *PD: HE TERMINADO DE ESCRIBIR EL MANUAL DE APLICACIONES HID POR LO TANTO PROXIMAMENTE SUBIRÉ TODO PARA QUE LO VEAN.*



Era lo que estaba pensando hacer! Que bueno por lo del manual y Muchas gracias por tu gran ayuda!!


----------



## tablet (Mar 25, 2011)

Hola, estoy usando el programa de visual c# que proporciona microchip, la conexion con el usb me funciona, lo que no se como hacer es como enviar datos al pic desde el pc, por lo que veo en el programa tienes un boton toggleleds que este pone a true un boleano y desde el ReadWriteThread envia el dato, en este caso encender un led; mi problema principalmente es que no me entra en el ReadWriteThread, solo entra la primera vez que ejecuto el codigo, ya que si mando la orden de encendido desde el ReadWriteThread despues de la comprobacion de la conexion si que me lo enciende.
Saludos


----------



## Moyano Jonathan (Mar 25, 2011)

> Hola, estoy usando el programa de visual c# que proporciona microchip, la conexion con el usb me funciona, lo que no se como hacer es como enviar datos al pic desde el pc, por lo que veo en el programa tienes un boton toggleleds que este pone a true un boleano y desde el ReadWriteThread envia el dato, en este caso encender un led; mi problema principalmente es que no me entra en el ReadWriteThread, solo entra la primera vez que ejecuto el codigo, ya que si mando la orden de encendido desde el ReadWriteThread despues de la comprobacion de la conexion si que me lo enciende.
> Saludos


 
Estás haciendo la aplicación con CCS o C18 ? El ReadWriteThread es solo por seguridad....no hace falta que lo uses...como dice en la misma aplicación solo estás por "si se llega a colgar la aplicación principal " o por si las comunicaciones necesitan de más velocidad de ejecución del programa...


----------



## Meta (Mar 25, 2011)

tablet dijo:


> Hola, estoy usando el programa de visual c# que proporciona microchip...



¿En qué enlace viste eso de www.microchip.com?


----------



## tablet (Mar 25, 2011)

Gracias por contestar ya logre hacer titilar el led, el problema que tenia era una tonteria, por no fijarme jeje, ahora intentaré recibir datos desde el pic. El programa del pic lo hago en C18 y sobre el enlace ahora no me acuerdo de que parte de la pagina lo saque pero lo que hice fue descargarme un ejecutable y me instalo una carpeta llamada Microchip Solutions v2010-10-19 y ahi es donde esta el programa.
Saludos


----------



## albermillan69 (Mar 25, 2011)

Moyano necesito de tu ayuda nuevamente
Dato = Left$(InBuff, 3)

Con esa instruccion leo el buffer y lo limito a 4 caracteres! bien!!
Pero la cadena que manda el PIC es "Ver1.0", que es lo que quiero? comparar los tres primeros caracteres de cada cadena y luego ubicar el resto en sus respectivos lugares de la ventana del VB.

Osea:
Dato = Left$(InBuff, 3)
if Dato="Ver" then
    Dato = Left$(InBuff, 3)
    label1.caption= Dato
end if

Pero resulta q cuando leo el buffer y lo limito a 3 caracteres, el resto de los datos se borran!
o los estoy pidiendo mal? porque lo que muestra en el label1 es "Ver" y no "1.0"

De estar mal programado, como tendria que hacerlo??

hay alguna forma de pedir byte a byte?
como lo hice en CCS para armar el string (porque get_string_usb() no lo supe usar)

for (i=0;i<3;i++){
  recibo_=usb_cdc_getc();
}

y luego comparo la cadena para saber que dato es el que se va a mandar al PC

Espero de tu ayuda.... MIL GRACIAS....._


----------



## Moyano Jonathan (Mar 25, 2011)

Hola albermillán, como estás.

Mirá no conozco como trata las cadenas el Visual Basic ...pero te puedo dar alguna ayuda.

Primero tendrías que usar la función *usb_cdc_khbit()* en caso de tener datos en el buffer lo añadís al arreglo "recibo".

Algo como lo siguiente:

if(usb_cdc_khbit()){

  int x=0;

    if(x==8) {

       x=0;
    } else { x++ recibe[x]=usb_cdc_getc();}
}

Es muy básico pero lo tendrías que probar...en este caso guarda 8 datos...luego reinicia la variable x y comienza nuevamente con el guardado de datos en cuanto se reciben datos...


Con respecto a los string en VB no te hagas mucho drama:

Deja que el programa reciba datos....pero ponele un condicional.....

Como sería esto:

Leo datos del puerto serie..... (pongamosle 8).

Si por alguna casualidad recibo el caracter por ejem "s"....

Para de recibir datos y los muestra en la ventana de VB


Con esto vos no necesitarías en realidad cortar la cadena sino que recibirias los datos hasta adonde vos le decís y no más (usando un caracter de parada).

Igual si querés saber más sobre el uso de cadenas y CCS te recomiendo el siguiente enlace: http://picmania.garcia-cuervo.net/picc.php#COMBUF232

PD: Mejor usar VB.net ...el VB6.0 presenta muchos problemas de compatibilidad con los nuevos sistemas operativos.

Un saludo !



> *tablet* dijo: _
> 
> _
> Hola, estoy usando el programa de visual c# que proporciona microchip...​
> ¿En qué enlace viste eso de [URL="http://www.microchip.com?"]www.microchip.com?http://www.microchip.com?[/URL]


 
Hablaba del C18 (aplicación para el PIC)

*PD: Espero subir el manual este fin de semana. Lo que pasa es que estoy sin internet por que TELEFONICA no me arregla el telefono y dependo del internet ajeno.*

*Un saludo !*


----------



## albermillan69 (Mar 25, 2011)

Moyano Jonathan dijo:


> Hola albermillán, como estás.
> 
> if(usb_cdc_khbit()){
> 
> ...



Por aca todo bien!!

Algo asi como lo q dices es lo que tengo en el PIC.

*Ahora en VB: *
Supongo que lo que me dices es usando:

     PuertutBufferSize = 1 'tamaño del dato a transmitir.
     Puerto.InBufferSize = 6  '6 caracteres
     Puerto.InputLen = 6  ' Buffer de entrada.
     Puerto.RThreshold = 3

Pero como tal no entiendo sus funcionamientos

si me los explicas rapidamente porfa!!!

*MIL GRACIAS..........* Saludos....


----------



## Moyano Jonathan (Mar 26, 2011)

Bajate la ayuda de este enlace: http://www.recursosvisualbasic.com.ar/htm/tutoriales/control-mscomm.htm

Ahi baja hasta donde dice : descargar referencia.

Un saludo !

Bueno luego de renegar bastante con el modo HID en visual C#, he podido terminar con lo prometido hace un tiempo.

*Mi manual de aplicaciones USB 1° PARTE:* https://www.forosdeelectronica.com/...raves-modulo-usb-pic18f2550-17458/#post123010

Le puse primera parte por que aún falta mucho por explicar con respecto al USB, pero de a poco se irán mostrando diferentes formas de comunicarnos. Así como también como crear nuestros propios proyectos 

Si ven alguna falla dentro de la estructura del manual comenten para que pueda solucionar el problema 

Quisiera agradecer a los usuarios que me brindaron todo su apoyo en el desarrollo del manual y que supieron esperar pacientemente a que lo pudiera terminar.

Sin otro particular, espero lo disfruten


----------



## Moyano Jonathan (Mar 26, 2011)

Ya están los archivos en la primera página del foro.


----------



## Meta (Mar 26, 2011)

Ni más enlaces, voy a mirar el estupendo manual....çç

Gracias.


----------



## Moyano Jonathan (Mar 26, 2011)

Cualquier cosa despué comentame que te pareció. Hay cosas que quizas no están explicadas al 100% pero se entiende.

En un futuro podría agregarle el modo CDC y Bulk pero quiero se entienda esto primero para poder avanzar.


----------



## memowwe (Mar 26, 2011)

excelente  manual ¡¡

muy interesante  y  detallado, lo de vc# aunque  la parte de  VC#, mejor alli  le dejamos... vere si las  puedo hacer jalar en linux  saludo2¡¡


----------



## Meta (Mar 26, 2011)

Viendo por el aire el manual, muy detallado con capturas incluidas.

¿Se incluidrá eso que haz dicho atrás?

8 Entradas digitales
8 Salidas digitales.
Entradas analógicas.

Saludo.


----------



## Moyano Jonathan (Mar 26, 2011)

Meta , has leido mal al parecer. En el manual está todo lo que se dijo.

- Entradas analogicas.
- Entradas digitales.
- Salidas digitales.
- PWM.

un saludo !


----------



## Meta (Mar 26, 2011)

No lo he leído por ahora, lo he visto por el aire, jejeje. Vi que era 4. A leer entonces y muchas gracias por su tiempo, te mereces eso y mucho más por enseñar a los demás.


----------



## albermillan69 (Mar 26, 2011)

Moyano!!! Disculpa pero sigo teniendo problemas para leer lo datos del BUFFER en el PC

*Tengo esto en VB:*
Private Sub PuertnComm()
Dim InBuff As String
Select Case Puerto.CommEvent
    Case comEvReceive
    InBuff = Puerto.Input
    Debug.Print InBuff
    Label1.Caption = ""
    Label1.Caption = InBuff
End Select
End Sub

Pero no se como hacer para saber si los tres primeros bytes de buffer  Inbuff son "VER" y si eso es cierto leer del 4to byte hasta el ultimo!!!

Necesito ayuda!!!


----------



## albermillan69 (Mar 27, 2011)

Moyano sigo teniendo prodemas para interpretar la caden enviada por el pic hacia VB!!!

necesito leer primero los tres primeros bytes para saber donde colocar lo que viene del 4to byte hasta el ultimo!!

Leo el buffer como en los ejemplos pero cuando sigo leyendo no hace nada!!

Escucho sugerencias!! Gracias....


----------



## Moyano Jonathan (Mar 27, 2011)

Hola albermillán69. Como estás.

Por el momento no se me ocurre cuál pueda llegar a ser el error. Te recomiendo ampliamente que busques como trabajan las cadenas en VB 6.0 y C de CCS.

En un tema que quizás cueste entenderlo al comienzo pero luego se hace bastante fácil.

Te digo esto por que estás encarando el tema de una manera incorrecta (con poca información respaldandote )...por eso te recomiendo estudies un poco más a fondo esas 2 cosas y luego plantees tus dudas.

Igual cualquier cosa que te pueda ayudar o se me ocurra te comento.

Un saludo !

Acá hay algo: http://www.elguille.info/vb/vb6/stringFunctions.htm


----------



## albermillan69 (Mar 27, 2011)

Moyano ve:

Private Sub PuertnComm()
    Dim InBuff As String
    Dim Dato() As Byte
    Select Case Puerto.CommEvent
            Case comEvReceive
                InBuff = Puerto.Input
                Dato() = InBuff
            Version.Caption = ""
            For i = 0 To 3
                Version.Caption = Version.Caption & Chr(Dato(i))
                Next i
     End Select
End Sub

Mi dato enviado por el pic es de 4 Bytes, logro  leer el buffer y guardarlo en un array (Dato), pero cuando muestro el array en el label (version) solo salen 2 de los 4 bytes!!

Resulta ser que cuando paso el buffer al array lo guarda de loa siguiente forma:
El Buffer tiene: 1234
El Array tiene: 1 2 3 4

No entiendo por q se guarda con un espacio entre bytes originales!!

Bueno seguire buscando informacion!!! Gracias!!!


----------



## albermillan69 (Mar 28, 2011)

Gracias!!! ya solucione todo!!! y pude hacer un reconocimiento de puertos, para saber cuales estan disponibles!!!


----------



## seaarg (Mar 28, 2011)

He quedado desconcertado, se me quemaron los libros, a ver si a alguien le paso esto:

Hace un tiempo atras, tomando el ejemplo que hizo Moyano de comunicacion CDC, hice una aplicacion para un plotter. (con vb.NET en la compu y CCS C, copiado del ejemplo de moyano, en el PIC)

La misma funciono a la perfeccion durante mucho tiempo. Luego tuve que formatear la compu, y con ello el entorno CCS C, el driver cdc, etc.

Siguio funcionando bien, hasta que anoche tuve que hacer un cambio en la logica del programa y volver a grabar el pic.

En mi programa, los #include a las librerias provistas por moyano los encierro entre comillas (") para que los busque en una carpeta determinada y asi no sobreescribir los originales de CCS. (aclaro que esto funcionaba).

En esta nueva compilacion, me marca warnings de definiciones duplicadas. Pise los archivos originales usando los de moyano (usb_cdc_desc.c, etc) y los include los cambie por <>

Compilo sin problemas pero me encuentro que no me puedo comunicar. .NET da error de IO en el metodo open() a pesar de marcar que esta bien el puerto (en las propiedades de sistema) y a pesar de enviar y recibir (basura). Tambien, modifique para que el pic me haga simplemente un ECO del caracter que recibe, y si le envio cualquier caracter el siempre me devuelve un chr(183) La comunicacion es binaria. En .NET el objeto COM esta configurado como 9600,n,8,1 (nunca lo cambie trabajando con usb)

Buscando soluciones, magicamente CSS empezo a incluir bien los descriptores (sin warnings) que estaban originalmente en la carpeta de mi HEX. Pero el resultado es el mismo.

Cambie de PIC y lo mismo. (Excepto que el caracter que devuelve es otro, pero siempre el mismo le envie lo que le envie) Cambie los parametros de buffer de recepcion y envio en las propiedades de sistema, el error sigue.

Ya no se por donde mas buscar, ¿Alguien le paso esto o tiene una pista? Repito, todo andaba a la perfeccion hasta que dejo de andar (incluso volvi a la version anterior del programa C, que funcionaba bien).

Electricamente tampoco cambie nada!


----------



## Moyano Jonathan (Mar 29, 2011)

Si es verdad que te puede dar problemas, CCS ha actualizado la forma en que maneja todo lo respecto a descriptores "para hacerlo" mas intuitivo al usuario.

Luego subiré una guía, pero si lo necesitas urgente vas a tener que investigar los cambios que ha realizado CCS en todo el driver USB...que son bastantes.

Un saludo !


----------



## seaarg (Mar 30, 2011)

Lo que hice como solucion fue dejar de insisitir con cdc y pase la comunicacion a hid basandome en tus ejemplos. Logre enviar un A y que lo responda. Ahora es cuestion de cambiar la parte de comunicacion en mi programa vb.net

Una consulta sobre esto (hid). Aclaro que aun no estudie tus ejemplos a fondo pero... es requerimiento tener un form para que haga de host de la dll (y recibir los eventos)?

Esto lo pregunto porque me gustaria encapsular la funcionalidad de comunicacion hid dentro de un objeto clase, sin forms. Pero vi que utiliza un form como handler.


----------



## Moyano Jonathan (Mar 30, 2011)

Hola, podrías usar cualquier objeto como handler...( eso me comentaron de Microcode Studio ) ahora tendrías que ver como realizar esa tarea...yo nunca lo he probado.

En donde está explicado el tema del handler...es en el libro "USB complete" de Jan Alexon. Ahí está todo desarrollado a fondo.

Un saludo !

Con el tema del CDC....es un problema de driver's....es un problema de CCS que no se adapta al standar..y uno tiene que hacer cambios para que funcione correctamente.

*ACTUALIZACIÓN:* Ya terminé de migrar la aplicación del manual de USB a VB.net 2008.

En cuanto al manual para VB.net 2008 hay que esperar.

Un saludo !


----------



## seaarg (Mar 30, 2011)

Bien, intentare encapsular todo el hid dentro de una clase para no depender de un form (por ej: si se quisiera hacer un programa que corra como servicio o de alguna manera, que no tenga interfaz grafica)

Si lo logro, lo subo en este thread asi queda a disposicion de uds. Veremos que se puede hacer.

Sobre CDC, la version de CCS que tengo es la 4.1.x (no recuerdo ahora que mas), Creo que la que tenia antes con la cual funcionaba era 4.0.8 o algo asi. Probare bajar de version.

El driver usb de windows que uso es el que vos publicaste hace mucho y no lo cambie.

De todos modos, teniendo HID es mejor en mi caso y me puedo ir olvidando de CDC.


----------



## EINNER C (Mar 30, 2011)

hola seaarg

he estado intentando realizar una comunicacion hid desde vb.net, en el pic no he tenido problemas, pero la verdad en vb no lo he logrado, si me pudiera dar una mano te agradeceria bastante,, por otro lado ya realize cdc en pic con vb.net, cualquier cosa que necesites con gusto...

saludos...


----------



## Moyano Jonathan (Mar 30, 2011)

> hola seaarg
> 
> he estado intentando realizar una comunicacion hid desde vb.net, en el pic no he tenido problemas, pero la verdad en vb no lo he logrado, si me pudiera dar una mano te agradeceria bastante,, por otro lado ya realize cdc en pic con vb.net, cualquier cosa que necesites con gusto...
> 
> saludos...



Te dejo la aplicación para HID, luego les subo el manual dentro de unas semanas.


----------



## seaarg (Mar 31, 2011)

Bueno, me gano de mano Jonathan 

Les comento que logre hacer un encapsulado de todo lo que es HID en una clase de vb.net. Apenas me haga un tiempo la hago prolija y la subo.


----------



## Moyano Jonathan (Mar 31, 2011)

Bueno dale, la esperamos entonces


----------



## EINNER C (Mar 31, 2011)

Moyano Jonathan dijo:


> Te dejo la aplicación para HID, luego les subo el manual dentro de unas semanas.



muchas gracias Jonathan, voy a bajarlo y ver que puedo hacer,,, 



seaarg dijo:


> Bueno, me gano de mano Jonathan
> 
> Les comento que logre hacer un encapsulado de todo lo que es HID en una clase de vb.net. Apenas me haga un tiempo la hago prolija y la subo.



muy bueno, toda informacion es util, gracias por su ayuda

saludos...

hola de nuevo

tengo una duda acerca de la comunicacion serial con vb.net, hace un tiempo realize una aplicacion que subi en este post
_ https://www.forosdeelectronica.com/posts/467619/ _
y pues no tuve problemas,,,, utilize el evento datareceived, pero ya que tenia solo un form, cuando cerraba no sabia que existian problemas con el puerto, ahora que estoy realizando otra aplicacion me doy cuanta, el problema es el siguiente

tengo un aplicacion y tengo varios form, 7 en total, el de la comunicacion serial es llamdo del principal, y en el tengo un boton de desconectar en el que cierro el puerto, pero ay veces que al darle click, me genera un error y es que estaba recibiendo es decir activado el evento datareceived y se salio inesperadamente, por lo que me cierra toda la aplicacion, pensaba quitar el boton y que cerrara el puero cuando cerrara el form, pero tbn ocurre lo mismo y me lo cierra todo, la verda intente poner condiciones para entrar a recibir, y no lo logre siempre me sale ese error y la verdad no se como solucionarlo, ya que si cierro ese form, debe permanecer abierto el prinicipal para realizar otras tareas

les agradesco su ayuda,,,

saludos......


----------



## Moyano Jonathan (Mar 31, 2011)

Tenes que gestionar la recepción de datos por interrupciones...por que sino habrá colisiones de datos y la aplicación colapsará... cerrándose.

La recepción de datos se tiene que realizar en el form principal....si necesitas visualizarlos en otro formulario...guarda los datos en una variable para luego mostrar los datos...


----------



## EINNER C (Abr 1, 2011)

hola jonathan, gracias por responder

segun tengo entendido este evento(datareceived) actua como una interrupcion,aqui esta el codigo de recepcion,


```
#Region "Recepcion de Datos"
    'Al recibir los Datos
    Private Sub Recepcion(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
        'Acumula los datos recibidos en nuestro 'buffer' (integer)

        'If cerrar = 0 Then
        For i = 0 To cant
            recibidos(i) = SerialPort1.ReadByte
        Next
        'End If

        If recibidos(0) = &HFF Then
            If recibidos(1) = &H32 Then
                Me.BackgroundImage = System.Drawing.Image.FromFile("on_pant.jpg")
                band1 = 1
            End If
            If recibidos(1) = &H33 Then
                If CheckBox1.Checked = True Then
                    MsgBox("No Se Puede Apagar el Equipo, Se Esta Guardando la Base de Datos", MsgBoxStyle.Exclamation, "Base de Datos")
                    SerialPort1.Write(2)
                Else
                    Me.BackgroundImage = System.Drawing.Image.FromFile("off_pant.jpg")
                    band1 = 0
                End If
            End If
            If recibidos(1) = &H36 Then
                MsgBox("Desconecte USB o La Bateria, El Equipo Puede Sufrir Daños", MsgBoxStyle.Exclamation, "Error Posible Daño")
                Me.BackgroundImage = System.Drawing.Image.FromFile("off_pant.jpg")
                band1 = 0
            End If
            If recibidos(1) = &H37 Then
                esc = 1
                'escala.Text = "R 10000"
            End If
            If recibidos(1) = &H38 Then
                esc = 2
                'escala.Text = " R 1000"
            End If
            If recibidos(1) = &H39 Then
                esc = 3
                'escala.Text = " R 100"
            End If
            If recibidos(1) = &H40 Then
                esc = 4
                'escala.Text = " R 100"
            End If
        End If

    End Sub
#End Region
```

lo que aprecias comentado de if cerrar lo habia puesto para que cuando oprimiera el boton de deconectar, darle un valor para que la condicion no se cumpla, pero ni aasi,,,,

con estos datos realizo ciertas operaciones

a penas llega un dato lo recibe, no llamo dicha funcion en ningun lado, el automaticamente recibe, si estoy mal, me gustaria que me explicaraas,,, 

por otro lado, no entiendo por que los datos se deben recibir desde el form principal, ya que todo lo relacionado al puerto serial lo realizo en el form al que llamo, alli abro el puerto recibo y realizo todo,...

por otro lado, vi el ejemplo de hid en vb y esta muy bn, estoy un poco apretado de tiempo pero voy a ponerme a trabajar con el, por el momento quiero aclarar mis dudas acerca del serial...

gracias

saludos...


----------



## Moyano Jonathan (Abr 1, 2011)

Todos los eventos importantes los tenés que gestionar desde el form principal....luego cada formulario aparte vendrían siendo como funciones que llamas desde el main (formulario principal). Es para estructurar mejor la aplicación.

Por eso el evento "recepción de datos" lo tenes que gestionar desde el formulario principal.


----------



## seaarg (Abr 4, 2011)

Bueno, lo prometido es deuda

Aqui envio la clase HIDWrapper.vb junto con una pequeña solucion de ejemplo. Esta hecha en vb.net 2010 con framework 4 pero deberian poder adaptarla a cualquiera menor.

Lo unico que hace esta clase es tomar la comunicacion hid que nos proporciono el forista moyano johnatan y encapsularla para hacer aun mas simple su implementacion.

Ademas nos proporciona eventos de la comunicacion para hacer mas sencillo y limpio el programa.

Veran que tiene una declaracion del objeto que si o si debe hacerse con withevents y en el constructor del mismo le pasamos el vendor ID, product ID (que deben coincidir con lo definido en el programa del pic), tamaño de buffer de entrada y de salida.

Dichos buffers deben declararse del tamaño real, y no incrementar en 1 para agregar el message ID, ya que la clase se encarga de enviar siempre ese dato en 0.

Mi plotter ya esta funcionando con la misma. Bueno, que la disfruten, era para aportar un poquito.


----------



## Moyano Jonathan (Abr 4, 2011)

Está muy buena la aplicación , pero me muestra algunos errores...debidos posiblemente a que tengo Visual Studio 2008. Estuve viendo como la desarrollaste...y te quedó excelente.


----------



## seaarg (Abr 4, 2011)

Gracias! posiblemente como decis sean las versiones pero, CREO que podrias usar solo la clase en un proyecto tuyo (copiando y pegando el codigo)

No estoy seguro pero no creo que cambie la referencia de las funciones entre distintos FW

Pregunta: ¿Te parece que facilita las cosas? (ese era mi objetivo)

AH! y les cuento algo que me paso que quiza le pase a alguno: Al llamar a alguna funcion de la libreria mcHID.dll me daba error siempre de que no podia levantar la DLL.

La misma hay que copiarla dentro de la carpeta BIN, en Debug y Release del proyecto. (O sea, donde esta el exe) o en su defecto, en la carpeta windows\system32


----------



## EINNER C (Abr 4, 2011)

excelente seaarg, te felicito,,, muy buen aporte


----------



## Moyano Jonathan (Abr 4, 2011)

seaarg hola como estás.

*SI*, la función cumple con su cometido. Es más sencillo usar la librería. Otra mejora....FUNCIONA CON VB.NET 2010 (mejor para actualizarse).

Nuevamente, te felicito.


----------



## seaarg (Abr 4, 2011)

Gracias pero el credito corresponde a quien investigo e implemento mcHID.dll jeje


----------



## fycykys (Abr 6, 2011)

Hola comunidad, mi nombre es Christian, soy estudiante de ingenieria en México, este es el primer semestre que dedico de mi carrera a estudiar PIC's, me encuentro realizando una aplicación con un microcontrolador PIC 18F4550, es de la misma familia que el microcontrolador PIC 18F2550, en realidad es su hermanito mayor, el proposito del proyecto en general es realizar un control de temperatura con un registrador de datos, en realidad es cargar un control proporcional integrodiferencial al pic, conectar un lcd, y tener una conexion por usb para poder adquirir datos proporcionados por un sensor conectado al microcontrolador, el control proporcional integrodiferencial ya esta, el sensor es un termopar conectado a un compensador max 6655 este ultimo va directamente al puerto b de este micro conectado, el puerto d se utiliza para conectar un lcd en caso de que el dispositivo no tenga conexion usb y este trabajando de forma autonoma, esta parte tambien ya esta, la salida de potencia tambien ya esta solo necesito una salida pwm que tambien ya ha sido terminada, así que solo me falta la transmicion y recepcion de datos del PIC a la PC, en este caso una Laptop HP que ya no cuenta con puertos COM o RS232. Para lograr este objetivo me base sobre el reciente trabajo publicado por el gentil Jonathan Moyano llamado "Control de Dispositivos mediante puerto USB: Desarrollo de proyectos en Visual C#", he estado adecuando su codigo a mis necesidades, la parte del formulario en C# ya esta casi terminada, hasta el momento me reconoce la conexion y desconexion del dispositivo en este caso el PIC, para los que ya hayan tenido oportunidad de leer el trabajo, me refiero especificamente a la parte del boton "Conectar dispositivo", del lado del pic, les comento el control y el lcd ya trabajan perfectamente, pero al momento de declarar las variables Envia y Recibe, con el codigo del amable Jonathan el compilador CCS me marca un error, por lo tanto no existe comunicacion entre PIC y PC, aunque los dos por separado ya esten trabajando optimamente. Espero que puedan revisar mi codigo y puedan ayudarme. Este proyecto terminado me comprometo a subirlo con licencia freeware para poder seguir desarrollando nuevas aplicaciones. Muchisimas gracias por su atención y ayuda.


----------



## EINNER C (Abr 6, 2011)

hola seaarg

quiero agradecerte el aporte del hid, ya que esta excelente lo de las funciones. debido a ello y a que no pude solucionar el problema que les habia mencionada anteriormente en vb.net con el serial y pic cdc, me he pasado a hid, el codigo en pic ya lo realize, me reconoce bn el dispositivo, cambie mi interfaz en visual a hid, con ayuda de tu clase, pero pues la verdad del pc al pic, envio bn, pero del pic al pc, no llega nada, nunca entra al evento oHID_onRead, y pues la verdad no se que error este cometiendo,,, 

esta es la parte de envio en el pic

                  outbuffer[0]=0x0f;
                  outbuffer[1]=0x0f;
                  outbuffer[2]=0x0f;
                  usb_put_packet(1, outbuffer, 3, USB_DTS_TOGGLE);

habiendo definido en el pic 

#DEFINE USB_HID_DEVICE  TRUE //Tells the CCS PIC USB firmware to include HID handling code.
#define USB_EP1_TX_ENABLE  USB_ENABLE_INTERRUPT   //turn on EP1 for IN bulk/interrupt transfers
#define USB_EP1_TX_SIZE    3  //Numero de byte de envio (maximo 64 bytes)
#define USB_EP1_RX_ENABLE  USB_ENABLE_INTERRUPT   //turn on EP1 for OUT bulk/interrupt transfers
#define USB_EP1_RX_SIZE    1  //Numero de byte de Recepcion (maximo 64 bytes)

y en vb

oHID = New HIDWrapper(Me, &H4D8, &HA, 1, 3)

pues la verdad no tengo idea que sea, les agradeceria su ayuda..

nota: tengo visual basic 2008, no se si sea debido a eso, que opinan

gracias,,, saludos


----------



## seaarg (Abr 6, 2011)

EINNER C dijo:


> hola seaarg
> esta es la parte de envio en el pic
> 
> outbuffer[0]=0x0f;
> ...



Bueno, te podria decir un par de lugares donde buscar.

Lo importante es que parece que definiste bien los tamaños de buffer

1)- Verificaste que el VendorID y el ProductID correspondan exactamente a los mismos que declaras en ccs?
2)- Definiste el objeto oHID con eventos (withevents), proba poner un msgbox en el evento onplugged a ver si detecta la conexion.
3)- para que el programa del pic envie datos se requiere alguna condicion especial que quiza no se este cumpliendo?

Tambien, depende de donde en tu programa vb.net creas el objeto oHID, deberias tener conectado el pic antes de ejecutar el programa. Para simplificar, ese objeto se intenta conectar al pic en el momento de su creacion.

Ej.: En mi caso lo instancio en el form_load. Esto hace que se necesite tener el pic primero conectado. En otros ejemplos de moyano, el tenia un boton "Conectar" para poder conectarse despues.

Revisa eso y comentanos. Podrias enviar el programa completo de vb.net? (la parte de comunicacion claro)

PD: No creo que tenga mucho que ver la version de .net, ya que en realidad lo que usa es la libreria mcHID.dll


----------



## Moyano Jonathan (Abr 6, 2011)

*fycykys* tu problema ya está solucionado , gracias por postear el proyecto..esperamos los avances.

*EINNER C* como estás, hay que ver bien como trabajan las funciones de control del USB en CCS...cambian ligeramente según las versiones....cuidado con eso.

Con respecto a la aplicación si te envía bien datos...las constantes VID y PID están bien definidas

Tendrías que ver si el PIC está enviando los datos correctamente.


*seaarg* Puede ser que los problemas de compilación tengan más que ver con el .Net framework de visual Studio 2010 ? Fijate si tenés tiempo de compilar tu programa con .net framework 3.5 a ver si te presenta algún error.

Les mando un saludo !


----------



## seaarg (Abr 6, 2011)

Por lo pronto, puedo decirles que me comentaron que hay que compilar con arquitectura x86, no anyCPU.

Voy a bajar el fw 3.5 a ver que pasa si lo compilo con ese. Pero insisto, por intuicion, de que si copian el codigo y lo pegan directamente en la aplicacion que tienen en 3.5 deberia andar porque el lenguaje en si no creo que cambie mucho, y no usamos herramientas de framework en si. Creo.


----------



## EINNER C (Abr 6, 2011)

seaarg dijo:


> Bueno, te podria decir un par de lugares donde buscar.
> 
> Lo importante es que parece que definiste bien los tamaños de buffer
> 
> ...




hola

realizando lo que me dices estos son los resultados

1) si coinciden el vendor id y product id
2)el evento onplugged si se activa, ya que puse que un label dijera conectado y se viera un cuadro verde.
3)en el pic, cargue el .cof e hize el seguimiento y si llega a la instruccion de envio

por lo anterior creo que eso esta bn

lo que paso a creer es que como dices, yo cree el objeto oHid en el form load, y por eso es que cuando ejecutaba la aplicacion cuando ya estaba corriendo el proteus, me enviaba bn,  si corria primero el vb, no servia, ..

el codigo en vb es el siguiente


```
Imports System.IO.Ports
Imports System.IO

Public Class Form4

    Dim WithEvents oHID As HIDWrapper

#Region "Variables"
    Dim recibidos As Integer() = New Integer(3) {}
    Dim values As Double = 0
    'Dim band As Integer = 0
    Dim band1 As Integer = 0
    'Dim conection As Integer = 0
    Dim conect As Integer = 0
    Dim Bd As Integer = 0
    Public fic As String
    Dim rut1 As String
    Dim name1 As String
    Dim resul As Integer = 5
    Dim cant As Integer = 2
    Dim valueslux As Double
    'Dim cerrar As Integer = 0
    Dim esc As Integer = 1
    Dim outBuffer(0) As Byte

    Dim PORTS As String() = IO.Ports.SerialPort.GetPortNames()
#End Region

    Private Sub Form4_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        oHID = New HIDWrapper(Me, &H4D8, &HA, 1, 3)
    End Sub

#Region "Recepcion de Datos"
    'Al recibir los Datos

    Private Sub oHID_onRead(ByVal readedBytes() As Byte) Handles oHID.onRead

        Dim i As Integer

        For i = 0 To UBound(readedBytes)
            recibidos(i) = readedBytes(i)
        Next

        If recibidos(0) = &HFF Then
            If recibidos(1) = &H32 Then
                Me.BackgroundImage = System.Drawing.Image.FromFile("on_pant.jpg")
                band1 = 1
            End If
            If recibidos(1) = &H33 Then
                If CheckBox1.Checked = True Then
                    MsgBox("No Se Puede Apagar el Equipo, Se Esta Guardando la Base de Datos", MsgBoxStyle.Exclamation, "Base de Datos")
                    outBuffer(0) = &H32
                    oHID.writeBuffer(outBuffer)
                Else
                    Me.BackgroundImage = System.Drawing.Image.FromFile("off_pant.jpg")
                    band1 = 0
                End If
            End If
            If recibidos(1) = &H36 Then
                MsgBox("Desconecte USB o La Bateria, El Equipo Puede Sufrir Daños", MsgBoxStyle.Exclamation, "Error Posible Daño")
                Me.BackgroundImage = System.Drawing.Image.FromFile("off_pant.jpg")
                band1 = 0
            End If
            If recibidos(1) = &H37 Then
                esc = 1
                'escala.Text = "R 10000"
            End If
            If recibidos(1) = &H38 Then
                esc = 2
                'escala.Text = " R 1000"
            End If
            If recibidos(1) = &H39 Then
                esc = 3
                'escala.Text = " R 100"
            End If
            If recibidos(1) = &H40 Then
                esc = 4
                'escala.Text = " R 100"
            End If
        End If

    End Sub
#End Region

#Region "Proceso de Inspeccion"
    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick

        '      If band = 1 Then

        '     If band1 = 1 Then

        If esc = 1 Then
            escala.Text = "R 10000"
            lxlb.Text = "lux"
            FRG.Text = ""
        End If
        If esc = 2 Then
            escala.Text = " R 1000"
            lxlb.Text = "lux"
            FRG.Text = ""
        End If
        If esc = 3 Then
            escala.Text = " R 100"
            lxlb.Text = "lux"
            FRG.Text = ""
        End If

        outBuffer(0) = &H31
        oHID.writeBuffer(outBuffer)
        System.Threading.Thread.Sleep(50)

        If recibidos(0) = &HFF Then
        Else
            temp.Text = " Temp: " & recibidos(0) & " °C"
            values = (recibidos(2) * &H100) + recibidos(1)

            If esc = 1 Then
                valueslux = (10.163 * values) + 10
                values = Int(valueslux)
            End If
            If esc = 2 Then
                valueslux = (1.0071 * values) + 10
                values = Int(valueslux)
            End If
            If esc = 3 Then
                valueslux = (0.0916 * values) + 10
                values = Int(valueslux)
            End If
        End If

        If esc = 1 Or esc = 2 Or esc = 3 Then
            If values < 10 Then
                lux.Text = "   " & values
            ElseIf values < 100 Then
                lux.Text = "  " & values
            ElseIf values < 1000 Then
                lux.Text = "  " & values
            ElseIf values < 10000 Then
                lux.Text = " " & values
            ElseIf values < 100000 Then
                lux.Text = values
            ElseIf values < 200000 Then
                lux.Text = values
            End If
        Else
            lxlb.Text = ""
            lux.Text = ""
            FRG.Text = "FUERA DE RANGO"
        End If

        '    End If

        '   End If

    End Sub
#End Region

#Region "Boton On/Off"
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        If conect = 1 Then

            If band1 = 0 Then
                outBuffer(0) = &H32
                oHID.writeBuffer(outBuffer)
                Me.BackgroundImage = System.Drawing.Image.FromFile("on_pant.jpg")
                Timer1.Enabled = True
                band1 = 1
                lxlb.Text = "lux"
                If esc = 1 Then
                    escala.Text = "R 10000"
                End If
                If esc = 2 Then
                    escala.Text = " R 1000"
                End If
                If esc = 3 Then
                    escala.Text = " R 100"
                End If
            Else
                If CheckBox1.Checked = True Then
                    Beep()
                    Beep()
                    MsgBox("No Se Puede Apagar el Equipo, Se Esta Guardando la Base de Datos", MsgBoxStyle.Exclamation, "Base de Datos")
                Else
                    outBuffer(0) = &H33
                    oHID.writeBuffer(outBuffer)
                    Me.BackgroundImage = System.Drawing.Image.FromFile("off_pant.jpg")
                    band1 = 0
                    Timer1.Enabled = False
                    escala.Text = ""
                    temp.Text = " Temp: -- °C"
                    lxlb.Text = ""
                    lux.Text = "     --"
                    FRG.Text = ""
                End If

            End If
        End If
    End Sub
#End Region

#Region "Reloj"
    Private Sub Timer2_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer2.Tick
        StatusStrip1.Items(0).Text = DateTime.Now.ToLongTimeString()
    End Sub
#End Region

#Region "Opacidad"
    Private Sub NormalToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles NormalToolStripMenuItem.Click
        Opacity = 1
    End Sub

    Private Sub ToolStripMenuItem3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolStripMenuItem3.Click
        Opacity = 0.75
    End Sub

    Private Sub ToolStripMenuItem4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolStripMenuItem4.Click
        Opacity = 0.5
    End Sub

    Private Sub ToolStripMenuItem5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolStripMenuItem5.Click
        Opacity = 0.25
    End Sub

    Private Sub ToolStripMenuItem6_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolStripMenuItem6.Click
        Opacity = 0.05
    End Sub
#End Region

#Region "Dispositivio Conectado"

    Private Sub oHID_onPlugged() Handles oHID.onPlugged

        ON_USB.Text = "CONECTADO"
        USB.BackColor = Color.Green
        'band = 1
        conect = 1
        cant = 2
        'cerrar = 0

    End Sub
#End Region

#Region "Dispositivio Desconectado"

    Private Sub oHID_onUnplugged() Handles oHID.onUnplugged

        CheckBox1.Checked = False
        If band1 = 1 Then
            MsgBox("Se Recomienda Apagar el Equipo Antes de Desconectarlo, De lo Contrario El Equipo podra sufrir Danos", MsgBoxStyle.Exclamation, "Desconexion")
        End If
        band1 = 0
        conect = 0
        ON_USB.Text = "DESCONECTADO"
        USB.BackColor = Color.Red
        Me.BackgroundImage = System.Drawing.Image.FromFile("off_pant.jpg")
    End Sub

#End Region

#Region "Base de Datos"
    Private Sub CheckBox1_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CheckBox1.CheckedChanged

        If CheckBox1.Checked = True Then
            If band1 = 1 Then

                Dim rut As String = System.AppDomain.CurrentDomain.BaseDirectory()

                outBuffer(0) = &H36
                oHID.writeBuffer(outBuffer)
                MsgBox("Inicio de Inspeccion en Base de Datos", MsgBoxStyle.OkOnly, "Base de Datos")


                With SaveFileDialog1

                    .Title = "Guardar Base de Datos"
                    .Filter = "Archivos txt|*.txt"
                    .OverwritePrompt = True

                    If .ShowDialog = Windows.Forms.DialogResult.OK Then
                        Me.RichTextBox1.SaveFile(.FileName)
                    End If

                End With

                Dim resul As String = InputBox("Digite Por Favor El Tiempo Entre Muestras (min), si Descarta Este Mensaje, El Valor Sera de 5 min", "Tiempo de Muestreo")

                If resul = "" Then
                    resul = 5
                End If

                Timer3.Interval = resul * 1000

                name1 = System.IO.Path.GetFileName(SaveFileDialog1.FileName)

                rut1 = System.Environment.CurrentDirectory()
                System.Environment.CurrentDirectory = rut

                'Const fic As String 
                fic = rut1 & "\" & name1
                'Dim texto As String = "Pablito tenía una moto con un pito."

                Dim sw As New System.IO.StreamWriter(fic, True)
                sw.WriteLine("Inspeccion de Luminarias, Muestreo Cada " & resul & " min")
                sw.WriteLine(" ")
                sw.WriteLine("Hora de Inicio: " & DateTime.Now.ToLongTimeString())
                sw.WriteLine(" ")
                sw.WriteLine(" ")
                sw.Close()
                Timer3.Enabled = True


            Else
                CheckBox1.Checked = False
                MsgBox("El Equipo esta Apagado", MsgBoxStyle.Exclamation, "Base de Datos")
            End If
        Else
            If band1 = 1 Then
                outBuffer(0) = &H37
                oHID.writeBuffer(outBuffer)
                MsgBox("Terminacion De Inspeccion en Base de Datos", MsgBoxStyle.OkOnly, "Base de Datos")
                'Const fic As String 
                fic = rut1 & "\" & name1
                Dim sw As New System.IO.StreamWriter(fic, True)
                sw.WriteLine(" ")
                sw.WriteLine("Hora de Terminacion: " & DateTime.Now.ToLongTimeString())
                sw.WriteLine(" ")
                sw.Close()
                Timer3.Enabled = False
            End If
        End If

    End Sub
#End Region

#Region "Base de Tiempo Para Muestreo"
    Private Sub Timer3_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer3.Tick
        Bd = Bd + 1

        'Const fic As String
        fic = rut1 & "\" & name1
        'Dim texto As String = "Pablito tenía una moto con un pito."

        Dim sw As New System.IO.StreamWriter(fic, True)

        sw.WriteLine("Muestra #" & Bd & ", Hora de Evento: " & DateTime.Now.ToLongTimeString())
        sw.WriteLine(" ")
        sw.WriteLine("Temperatura: " & recibidos(0) & "ºC  Intensidad Luminica por Metro Cuadrado: " & values & " lux")
        sw.WriteLine(" ")
        sw.Close()
    End Sub
#End Region

#Region "Al Salir"
    Private Sub Form4_FormClosing(ByVal sender As System.Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles MyBase.FormClosing
        Timer1.Enabled = False
        cant = 0
        outBuffer(0) = &H35
        oHID.writeBuffer(outBuffer)
    End Sub
#End Region

#Region "Abrir Archivo de Base de Datos"
    Private Sub AbrirToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles AbrirToolStripMenuItem.Click

        Dim myStream As Stream = Nothing
        Dim openFileDialog1 As New OpenFileDialog()

        openFileDialog1.Filter = "Archivos txt (*.txt)|*.txt"
        openFileDialog1.FilterIndex = 1
        openFileDialog1.RestoreDirectory = True

        If openFileDialog1.ShowDialog() = System.Windows.Forms.DialogResult.OK Then
            Try
                myStream = openFileDialog1.OpenFile()
                If (myStream IsNot Nothing) Then
                    Process.Start(openFileDialog1.FileName)
                End If
            Catch Ex As Exception
                MessageBox.Show("No se pudo leer el archivo: Se genero un Error " & Ex.Message)
            Finally
                If (myStream IsNot Nothing) Then
                    myStream.Close()
                End If
            End Try
        End If

    End Sub
#End Region

End Class
```

voy a probar ubicando un boton de conectar y ver que pasa, luego les comento

por otro lado, veo que la aplicacion se me bloquea muy facil, imagino que sea por estar corriendo vb y proteus al tiempo,, ustedes que piensan...

gracias por su colaboracion,,,

hola de nuevo

ya agregue el boton y funciona bn,  no he probado desconectar el pic y volverlo a conectar sin cerrar la aplicacion haber si funciona, ya que tengo unos problemas con el proteus, pero hoy en la tarde lo monto en real y veo el funcionamiento,,,


espero subir la aplicacion completa cuando la termine de forma satisfactoria, este foro me ha colaborado bastante y espero tbn poder aportar, asi que en lo que les pueda colaborar con gusto...

gracias


----------



## seaarg (Abr 6, 2011)

Bueno, me alegro que te haya funcionado.

En mi experiencia es medio jodido correr proteus al mismo tiempo que la aplicacion y que ande todo bien (no probe lo mismo con hid, eso ya lo hice en real)

Por otro lado, lo que se podria hacer es que la linea: 

oHID = New HIDWrapper(Me, &H4D8, &HA, 1, 3)

se haga en el momento de enviar datos de esta forma:

if IsNothing(oHid) then
    oHID = New HIDWrapper(Me, &H4D8, &HA, 1, 3)
end if

De esta manera, se intentara conectar por unica vez solo al momento de enviar datos.

Ademas, estaria bueno saber si el parametro que retorna la llamada a API para conectar (un boolean) devuelve true o false si se conecto correctamente o no, para manejar esa respuesta en el codigo que mencione antes.

Asi podriamos hacer la cosa un poco mas "hot-plugged"


----------



## albermillan69 (Abr 9, 2011)

*AYUDA: TENGO UNA DUDA*

Estoy usando un cristal de 20MHz, resulta q para usar el USB tengo q hacer unos ajustes y cambiar el PLL  resulta q al modificar el PLL queda trabajando a 48MHz internamente!! 

Mi pregunta es: a la hora de configurar los timer uso 20MHz o 48MHz??

Este es el encabezado de mi programa:

#include <18F4550.h>
#fuses HSPLL,NOMCLR,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN,NOPBADEN
#use delay(clock=48000000)


----------



## Moyano Jonathan (Abr 9, 2011)

La verdad muy buena pregunta...nunca he hecho uso de los timer's a esa frecuencia de trabajo...podrías habrir un hilo propio o posterarlo en los foros de CCS.


----------



## albermillan69 (Abr 9, 2011)

OK gracias!!! la verdad estuve danle un vistazo al datasheet pero no di con la solucion


----------



## EINNER C (Abr 9, 2011)

hola a todos

de nuevo yo, pero es que he tenido inconvenientes con lo de hid,,, como les habia comentado, agregando el boton de conectar, en vb si me recibia datos, muy lento y se trababa pero los recibia,,, ahora que lo monte par ver en real que pasa, pues me reconoce todo bn, y el vb si envia datos al pic, pero del pic a vb no hay nada,, la verdad no he logrado encontrar que sera,,,  asi envio en el pic

outbuffer[0]=0xff;
                  outbuffer[1]=0x37;
                  outbuffer[2]=0x0f;
                  usb_put_packet(1, outbuffer, 3, USB_DTS_TOGGLE);

y nunca logro enviar no se que tenga mal configurado, aqui esta todo el codigo, es un poco extenso, pero la verdad quisiera que miraran lo de configuracion y eso, ya que haciendo el seguimiento con el .cof en proteus si ejecuta las instruccions de envio, pero a vb no llega nada,,,


```
#include <18F2550.h>
#DEVICE ADC=10
#fuses HSPLL,MCLR,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN,NOPBADEN
#use delay(clock=48000000)

#define use_portb_lcd TRUE
#define on_ext pin_a2
#define on_usb pin_c6
#define off_usb pin_c7
#define r_100 pin_a3
#define r_1000 pin_a4
#define r_10000 pin_a5

#define on_pin output_high
#define off_pin output_low

// CCS Library dynamic defines
#DEFINE USB_HID_DEVICE  TRUE //Tells the CCS PIC USB firmware to include HID handling code.
#define USB_EP1_TX_ENABLE  USB_ENABLE_INTERRUPT   //turn on EP1 for IN bulk/interrupt transfers
#define USB_EP1_TX_SIZE    3  //Numero de byte de envio (maximo 64 bytes)
#define USB_EP1_RX_ENABLE  USB_ENABLE_INTERRUPT   //turn on EP1 for OUT bulk/interrupt transfers
#define USB_EP1_RX_SIZE    1  //Numero de byte de Recepcion (maximo 64 bytes)

// CCS USB Libraries
#include <pic18_usb.h>   //Microchip 18Fxx5x hardware layer for usb.c
#include <hid 8-byte.h>   //USB Configuration and Device descriptors for this UBS device
#include <usb.c>
#include <math.h>
#include <lcd.c>

float luxsd,luxsf;
long  temper,luxs;
int temp,lux[2],recib[1],modo=0,hini=0,hini1=0,warning=0x0f,escn=0,FR=0,outbuffer[3];
signed int enc=0xfe;
short int ind=0,escala=0;
int32 vlux=0;

void f_escala_ext()
    {
     switch (escn)
            {
             case 0:
                 off_pin(r_100);
                 off_pin(r_1000);
                 on_pin(r_10000);
              break;
              case 1:
                  off_pin(r_100);
                  off_pin(r_10000);
                  on_pin(r_1000);
               break;
               case 2:    
                   off_pin(r_1000);
                   off_pin(r_10000);
                   on_pin(r_100);
                break;
               }
     }
     
void f_escala_usb()
     {
      switch (escn)
             {
              case 0:
                  off_pin(r_100);
                  off_pin(r_1000);
                  on_pin(r_10000);
                  outbuffer[0]=0xff;
                  outbuffer[1]=0x37;
                  outbuffer[2]=0x0f;
                  usb_put_packet(1, outbuffer, 3, USB_DTS_TOGGLE);
               break;
               case 1:
                   off_pin(r_100);
                   off_pin(r_10000);
                   on_pin(r_1000);
                   outbuffer[0]=0xff;
                  outbuffer[1]=0x38;
                  outbuffer[2]=0x0f;
                  usb_put_packet(1, outbuffer, 3, USB_DTS_TOGGLE);
                break;
                case 2:    
                    off_pin(r_1000);
                    off_pin(r_10000);
                    on_pin(r_100);
                    outbuffer[0]=0xff;
                  outbuffer[1]=0x39;
                  outbuffer[2]=0x0f;
                  usb_put_packet(1, outbuffer, 3, USB_DTS_TOGGLE);

                break;
                }
     }
     
     void vizualizar()
     {
     if (temp>=100)
        {
         lcd_gotoxy(1,2);
         printf(lcd_putc," %d °C",temp);
        }
        
     if (temp>=10)
        {
         lcd_gotoxy(1,2);
         printf(lcd_putc,"  %d °C",temp);
        }
     else
        {
         lcd_gotoxy(1,2);
         printf(lcd_putc,"  %d  °C",temp);
        }
     
        //if (luxs>=100000)
        // {lcd_gotoxy(9,1);
        //printf(lcd_putc,"%ld",luxs);}
        
     if (luxsd>=10000 && FR==0)
        {
         lcd_gotoxy(1,1);
         printf(lcd_putc,"   %ld  lux   ",vlux);
        }
        
     if (luxsd>=1000 && FR==0)
        {
         lcd_gotoxy(1,1);
         printf(lcd_putc,"  %ld lux   ",vlux);
        }
        
     if (luxsd>=100 && FR==0)
        {
         lcd_gotoxy(1,1);
         printf(lcd_putc,"    %ld   lux   ",vlux);
        }
        
     if (luxsd>=10 && FR==0)
        {
         lcd_gotoxy(1,1);
         printf(lcd_putc,"    %ld    lux   ",vlux);
        }
     else
        {
        IF(FR==0)
          {
           lcd_gotoxy(1,1);
           printf(lcd_putc,"     %ld    lux   ",vlux);
          }
        } 
    }

void adquisicion()
     {
     set_adc_channel(0);
     delay_ms(5);
     luxs = read_adc();
     delay_ms(5);
     set_adc_channel(1);
     delay_ms(5);
     temper = read_adc();
     delay_ms(5);
     luxsf=(float)luxs;
     
     if(escala==0)//autoescala
       {
       if(luxs>=984)//fuera de rango
         {
          if(escn!=0)//diferente de rango r_10000
            {
             escn=escn-1;
             if(modo==0x0f)
               {f_escala_ext();}
             else
               {f_escala_usb();}            
             delay_ms(5);
             set_adc_channel(0);
             delay_ms(5);
             luxs = read_adc();
             delay_ms(5);
            }
          else
            {
             lcd_gotoxy(1,1);
             lcd_putc(" FUERA DE RANGO ");
             FR=1;
             outbuffer[0]=0xff;
                  outbuffer[1]=0x40;
                  outbuffer[2]=0x0f;
                  usb_put_packet(1, outbuffer, 3, USB_DTS_TOGGLE);
                   
            }
         }
       else
         {FR=0;
         f_escala_usb();}
       
     if(escn==0 && FR==0)
       {    
        lcd_gotoxy(9,2);
        lcd_putc("R 10000 ");
        luxsd= (10.163*luxsf)+10;
         
        if(luxs<=100)
          {
           escn=escn+1;
           if(modo==0x0f)
             {f_escala_ext();}
           else
             {f_escala_usb();}
           
           delay_ms(5);
           set_adc_channel(0);
           delay_ms(5);
           luxs = read_adc();
           delay_ms(5);
          }
       }
         
     if(escn==1)
       {
        lcd_gotoxy(9,2);
        lcd_putc(" R 1000 ");
        luxsd= (1.0071*luxsf)+10;
         
        if(luxs<=90)
          {
           escn=escn+1;
           if(modo==0x0f)
             {f_escala_ext();}
           else
             {f_escala_usb();}
           
           delay_ms(5);
           set_adc_channel(0);
           delay_ms(5);
           luxs = read_adc();
           delay_ms(5);
          }
       }
         
     if(escn==2)
        {    
         lcd_gotoxy(9,2);
         lcd_putc("  R 100");
         luxsd= (0.0916*luxsf)+10;
        } 
     }
     else
     {}
     
     vlux=(int32)luxsd;
     temp= (int8)temper*0.48828125;
     
     lux[0]=make8(luxs,0);
     lux[1]=make8(luxs,1);
     vizualizar();
     switch (escn)
            {
             case 0:
                 lcd_gotoxy(9,2);
                 lcd_putc("R 10000 ");
              break;
              case 1:
                   lcd_gotoxy(9,2);
                   lcd_putc(" R 1000 ");
               break;
               case 2:    
                   lcd_gotoxy(9,2);
                   lcd_putc("  R 100");
                break;
               }
   }

void usb_com()
     {
        if (usb_enumerated())
           { 
           if(ind==0)
          {
           on_pin(on_usb);
           off_pin(off_usb);
          }
        else
          {
           on_pin(off_usb);
           off_pin(on_usb);
          }
           warning=0;
           
           if(usb_kbhit(1))
             {
              usb_get_packet(1, recib, 1);
              if(recib[0]==0x31)
                { 
                 adquisicion();
                 outbuffer[0]=temp;
                  outbuffer[1]=lux[0];
                  outbuffer[2]=lux[1];
                  usb_put_packet(1, outbuffer, 3, USB_DTS_TOGGLE);
                }
              if(recib[0]==0x32)
                {
                 //on_pin(r_100);
                 lcd_putc("\f");
                 enc=1;
                }
              if(recib[0]==0x33)
                {
                 //off_pin(r_100);
                 lcd_putc("\f");
                 enc=0xfe;
                }
              if(recib[0]==0x34)
                {
                outbuffer[0]=0x0f;
                  outbuffer[1]=0x0f;
                  outbuffer[2]=0x0f;
                  usb_put_packet(1, outbuffer, 3, USB_DTS_TOGGLE);
                 ind=0;
                }
              if(recib[0]==0x35)
                {
                lcd_putc("\f");
                 enc=0xff;
                 ind=1;
                }
              if(recib[0]==0x36)
                {
                 lcd_putc("\f Inicio de Insp");
                 lcd_putc("\nen Base de Datos");
                 delay_ms(2000);
                 lcd_putc("\f");
                }
              if(recib[0]==0x37)
                {
                 lcd_putc("\f  Termino Insp");
                 lcd_putc("\nen Base de Datos");
                 delay_ms(2000);
                 lcd_putc("\f");
                }
              }
            }
        }


void main() 
     {
      
      setup_adc_ports(AN0_TO_AN1);
      setup_adc(ADC_CLOCK_INTERNAL );
      set_tris_a(0x03);

      on_pin(off_usb);
      off_pin(on_usb);
      
      off_pin(r_100);
      off_pin(r_1000);
      on_pin(r_10000);
      
       lcd_init();//inicializamos el USB
       lcd_putc("\fLuxometroDigital");
       lcd_putc("\n  Mesalud Ltda");
    
      while(true)
           {
           if(input(pin_b3)==1)
              {escala=~escala;}

            if (input(pin_c0) == 1)
               {

               if (input(pin_c1) == 1)
                  {
                  if(warning==0 && hini1==1)
                    {
                    outbuffer[0]=0xff;
                  outbuffer[1]=0x36;
                  outbuffer[2]=0x0f;
                  usb_put_packet(1, outbuffer, 3, USB_DTS_TOGGLE);
                    
                     warning=1;
                     }
                   lcd_putc("\f Desconecte USB");
                   lcd_putc("\n  o La Bateria");
                   delay_ms(2000);
                   lcd_putc("\fEl Equipo Puede");
                   lcd_putc("\n  Sufrir Danos");
                   delay_ms(2000);
                   hini=0;
                   enc=0xff;
                  }
               else
                  {
                   warning=0;
                   if(hini==0)
                     {
                      lcd_putc("\fLuxometroDigital");
                      lcd_putc("\n  Mesalud Ltda");
                     }       
                   hini=1;
                   modo=0x0f;
                  }
               }
            else
               {
                modo=0xf0;
                warning=0;
                off_pin(on_ext);
                if(hini==0)
                  {
                   lcd_putc("\fLuxometroDigital");
                   lcd_putc("\n  Mesalud Ltda");
                  }           
                  hini=1;
                  if(hini1==0)
                     {
                      usb_init();
                      //usb_init_cs();
                     hini1=1;

                     }
                  }
                  
             if (hini==1)
                {
                if(input(pin_c2))
                  {
                   enc=~enc;
                   if(enc==1)
                     {
                      lcd_putc("\f");
                      lcd_gotoxy(8,2);
                      lcd_putc(" R 10000");
                      
                      if(modo==0xf0)
                        {
                        outbuffer[0]=0xff;
                  outbuffer[1]=0x32;
                  outbuffer[2]=0x0f;
                  usb_put_packet(1, outbuffer, 3, USB_DTS_TOGGLE);
                                             }
                      }
                   else
                      {
                      if(modo==0xf0)
                        {
                        outbuffer[0]=0xff;
                  outbuffer[1]=0x33;
                  outbuffer[2]=0x0f;
                  usb_put_packet(1, outbuffer, 3, USB_DTS_TOGGLE);
                        }
                       lcd_putc("\f");
                       }
                     }
                   delay_ms(200);
                   }
   
            if(enc==1)
              {
               if (modo==0x0f)
                  {
                  on_pin(on_ext);
                  delay_ms(50);
                  adquisicion();
                  }
                if(modo==0xf0)
                  {
                   off_pin(on_ext);
                   usb_task();
                   usb_com();
                  }
              }
             else
               {
                if(modo==0xf0)
                  {
                   off_pin(on_ext);
                   usb_task();
                   usb_com();
                  }
                }   
              }
          }
```

muchas gracias de antemano

saludos


----------



## Moyano Jonathan (Abr 9, 2011)

Pone la versión de CCS que estés utilizando. Y por favor lee mi manual al ultimo donde muestro como manejo los paquetes de datos


----------



## EINNER C (Abr 9, 2011)

gracias por responder

la version que manejo es la 4.104, no se que modificaciones traiga, me recomendarias devolverme un poco?

y si, manana me pongo a leer tu manual para verificar si he cometido errores

gracias

por otro lado, se me olvidad comentar algo acerca del proteus, y es que yo corro la simulacion del hid y bn, la paro y la vuel a correr y ya no sirve, me pone problema por los drivers, tengo que utilizar un programa llamado usbdeview que me enlista los dispositivos y borrar el del ejemplo para asi que vuelva a correr,,,


----------



## EINNER C (Abr 10, 2011)

hola a todos

hoy quiero dar a conocer mis resultados y dar gracias por su ayuda

ya logre hacer que el visual me comunicaria bidireccionalmente con el pic, el problema radicaba en que yo estaba definiendo el tamano del enpoint de salida como 3, y enviaba 3 datos, lo que cambie fue incrementar el tamano de dicho enpoint a 4 y listo, sirvio, por otro lado, en la interfaz se me cerraba y funcinaba lento, como habia dicho el amigo seaarg, el tamano del buffer de llegada y salida se definia con el tamano real, ya que el programa tenia en cuenta eso, pero tuve igual que colocar uno de mas, no se si es por que en el pic se envia 4 datos, o algo asi, pero ya funciono todo muchas gracias

saludos


----------



## seaarg (Abr 10, 2011)

Definir de tamaño real en el programa VB. En el programa del pic si tendrias que definirlo con 1 mas creo.


----------



## Moyano Jonathan (Abr 10, 2011)

*Un aviso :* Desde la versión 4.094 , muchos driver's de CCS han sufrido modificaciones en las funciones de control y la forma en la que definen los parámetros. Por esto puede ser que surjan problemas debido a la incompatibilidad entre las versiones.

Un saludo !


----------



## Deego (Abr 12, 2011)

Saludo Cordial a todos.  Escribo para hacerle una pregunta a moyano, baje tu aporte sobre usb HID en VB.NET, pero hay una parte del código, bueno especialmente la del principio que no puedo hacer que funcione, y es precisamente la del VID y PID del dispositivo que se conecta USB, estuve probandolo con el mouse usb que tengo, poniendole esos dos numeros pero de una me los identifica como error, es mas, no veo que el VID y PID de este dispositivo (los cuales obtuve por el administrador de dispositivos y buscando el mouse) inicien con "&", es muy diferente a como esta en tu codigo, sera que tengo que declararlos no como short sino como otro tipo de variable, estaría muy agradecido si me respondieras, debido a que quiero hacer esta comunicacion entre un pic 18f2550 y una interfaz en vb.net, pero no como CDC sino como HID.


----------



## Moyano Jonathan (Abr 12, 2011)

> pero hay una parte del código, bueno especialmente la del principio que no puedo hacer que funcione, y es precisamente la del VID y PID del dispositivo que se conecta USB,



Hola mostrame la porción de código así veo donde está el error.

Una cosa que tenés que saber: el VID y PID lo tenés que definir de la forma "&H" si usas VB.net.

*Muy importante:*EasyHID solo funciona con el VID y PID que proporciona MecaniqueUK. Por eso no te reconoce el mouse..


----------



## Deego (Abr 12, 2011)

Ummm bueno, la verdad moyano, pues baje tu codigo y crei que unicamente tocaba compilarlo poner un dispositivo, tomar el VID y el PID y reemplazarlos ahi en el codigo de vb.net, pero no se si tendré que hacer algo mas.  El easyhd no lo he utilizado, porque no se si será necesario, pues ya copie la dll que trae la carpeta en system32.  No se como convertir el VID y el PID en la fora "&H", los de mi mouse son los se ven en la imagen.

http://img69.imageshack.us/f/pantallazop.jpg/

esos números los he metido al inicio del programa y pues veo que los estoy metiendo de una forma inadecuada.  Ojalá me puedas ayudar.

Por cierto, la imagen anterior al parecer solo se puede ver por google chrome, por mozilla parece que no..

Moyano, perdon tanta preguntadera, ya vi que era &H, era lo que me suponía, pero no estaba seguro, es decir, significa que el dato que sigue está en Hexadecimal, pero estos datos que botan los PID y VID de los dispositivos está en decimal cierto?? y pues ahi pasarlos a hexadecimal pues primero a binarios y luego a decimal o sino con una calculadora cientifica sale.. es así moyano, o tengo que hacer otra cosa mas con esos PID y VID??

Moyano, buenas noticias, estaba haciendo una estupidez.  Bueno te  cuento, estaba tomando los VID y PID de mi mouse, y estaba reemplazando  por estos completamente al que estaba en el codigo por defecto, es  decir, estaba borrando la parate &H, ahora si conecto y desconecto  el mouse y la aplicación cambia de color, que por lo visto eso era lo  esencial del programa.  Ahora espero modificar algo el código para  manejar el pic 18f2550.  Voy a seguir contando por acá como me va, tanto  para ver si me resuelves las dudas que salgan como para ayudar a otros  que de pronto se les presenten los mismos problemas que a mi.  Saludos!!!

***************************************************
Moyano sigo escribiendo, pero pues parece que mis diversos mensajes se están juntando en uno solo.  Ya el panorama se me aclara mucho mas, pero a la vez me surgen mas dudas, como por ejemplo, ya se para que se utiliza el easyHID, es precisamente para darle el VID y el PID al PIC y esa vaina, ya vi, incluso un ejemplo que publicaste el de "Control de dispositivos por USB [ HID + Visual C#], vi el código en CCS y precisamente encontrjé el archivo en ccs llamado "Descriptor_easyHID", el cual creo que se ha generado precisamente con el easyHID (corrígeme si estoy mal), pero resulta que en este computador tengo es windows 7 y vi que en un post anterior decías que este software no servía en este sistema operativo sino solo en XP.  Habrá alguna posbilidad de editarlo unicamente ya que el archivo está generado?? y si es asi, que partes son las fundamentales para editar?? eso lo hiciste con un 18f2550 cierto?? de nuevo gracias por tus respuestas, me disculpo por ser tan intenso pero a medida que entiendo más el tema me empieza a interesar.


----------



## Moyano Jonathan (Abr 12, 2011)

Hola Deego. Te voy a responder en la última pregunta fusionada así evitamos confuciones.



> precisamente encontrjé el archivo en ccs llamado "Descriptor_easyHID", el cual creo que se ha generado precisamente con el easyHID (corrígeme si estoy mal)


 
Si estás equivocado. El descriptor , es un archivo modificado de la carpeta de ejemplos de CCS. NO lo tenés que modificar salvo el descriptor de dispositivo en donde está "MoyaPIC_EasyHID"....si no sabes como modificar esa parte te lo subo luego.



> pero resulta que en este computador tengo es windows 7 y vi que en un post anterior decías que este software no servía en este sistema operativo sino solo en XP.


 
He hecho nuevas pruebas más precisas con la librería mcHID.dll y es compatible al 100% con Windows XP en adelante.



> eso lo hiciste con un 18f2550 cierto??


 
Si todos los proyectos están desarrollados con el PIC18F2550 , pero podés portarlo a cualquier PIC con USB ...sin mayores inconvientes.


----------



## Deego (Abr 13, 2011)

Gracias Moyano, estaría muy agradecido si puedes subir lo que tengo que modificar.  Ahora tengo otra duda, es que he visto varios ejemplos de como enviar bits de vb.net a el pic, pero no se como enviar una variable, como pro ejemplo 'a', he visto este post en el cual también comentas  https://www.forosdeelectronica.com/...aves-modulo-usb-pic18f2550-17458/index44.html  pero cuando voy a vb.net y escribo 

BufferOut(0)='a' en seguida sale un error, veo que es porque BufferOut está definida como bits, pero no se entonces como enviar ese char desde vb.net al PIC.


----------



## seaarg (Abr 13, 2011)

Usa BufferOut(0) = Asc("a")

Corrijo: Vi que hablas de vb.net. Ahi no recuerdo pero debe ser una funcion parecida.


----------



## Deego (Abr 13, 2011)

Hola seaarg, efectivamente es algo parecido, estuve buscando y la funcion que me sirvio fue la siguiente
BufferOut(0) = CByte(Asc("a"))
TextBox1.Text = CStr(BufferOut(0))

Queria ver que valor tomaba BufferOut(0) poniendo su valor en un TextBox y toma el valor de 97 que es del a en ASCII.  El problema es que no he podido hacer que el PIC reaccione ante esto.  No se si tu o moyano puedan ayudarme con esto, tengo la siguientes líneas:


 if (usb_enumerated()){ // Si el puerto ya fue enumerado por el host :
      output_high(PIN_A1); // Enciende led amarillo de enumeración_OK.
     if(usb_kbhit(1)){ // en espera de nuevo(s) caracter(es) en el buffer.
            usb_get_packet(1,data,1);
              if  (data == 97)      { // ¿lo que llegó fué el caracter a?
              output_high(PIN_A3); // Se activa el OPTOACOPLADOR

              delay_ms(3000);
              output_low(PIN_A3);
              output_low(PIN_A2)



                   }

a la variable data la he definido como int8 data[1];  y en la función  usb_get_packet(1,data,1) he puesto los valores de 1,data,1 mas que sabiendo ha sido guiandome de otros ejemplos, parece ser que el ultimo 1 indica el numero de bytes que va a recibir el pic, en este caso solo estoy enviando uno que es a, pero no se si alguna parte de este código haga que no reciba este valor.  

Otra duda que tengo, lo probé en proteus, y lo reconoció (a pesar que se demoró como cinco minutos en reconocer el dispositivo, no se porque se demorará tanto), y programé el PIC con ese código y al conectarlo me dice que el dispositivo no se reconoce, no se que pasará que en proteus lo reconoce pero en el pic real dice que el dispositivo no se reconoce.  Tengo varias dudas en eso.

Ahh por cierto, los corchetes algunos no están cerrados, olvidé tomar el resto de programa en donde si cierran, es decir, el programa me compila normalmente pero en el momento de probarlo me presenta los problemas que dije anteriormente.  De antemano, muchas gracias por la ayuda tanto a moyano como a todos los que puedan resolver estas dudas.


----------



## nietzche (Abr 13, 2011)

Hola, mi duda es la que sigue: segun Moyano Jonathan la velocidad maxima del PIC es 64 Kbps o algo asi.
esto es una payasada, porque con PICS bien equipados, tienen UART que alcanzan mas velocidades que esa cosa.
hay otra forma de controlar al PIC y que realmente alcanze o se aproxime a los 12 Mbps que dice el fabricante que tiene?.
Diganme si se alcanzan esas velocidades para no perder el tiempo y estudiar mas del PIC, o si no lo alcanzan para bnuscar otro micro que si lo haga. gracias


----------



## Deego (Abr 13, 2011)

Se me presenta ahora otro problema, ademas de no reconocerme el dispositivo con HID, cambie la programación del PIC para la clase CDC y oh sorpresa!! me los sigue reconociendo como un dispositivo HID, ya no como antes como un COM virutal, es decir, no se que pasará porque ya miré la programación de CDC y está bien, no tiene nada de HID.  Mi objetivo no es la clase CDC sino la HID, pero debería funcionar perfecto con esa clase CDC.  Ahora si estoy mas confundido que nunca.  :s


----------



## Deego (Abr 13, 2011)

Malas noticias, ahora ni me reconoce el PIC ni CDC y ni HID, estuve leyendo un post anterior de seaarg, creo que me pasó algo parecido.  Me pasó desde esta mañana, desde que le cambié el firmware de cdc por un HID, cuando le puse HID, decía que el dispositivo era desconocido, cosa que no pasaba al simularlo en proteus.  Ahora, intenté cambiarle el firmware otra vez para que funcionara de nuevo cdc y tampoco lo reconoció (Antes servia full en CDC).  No se ahora que será, no se si será que se dañó el PIC, aunque el programador lo reconoce tal cual como 18f2550, lo lee, se puede verificar, incluso escribir.  Ahora si estoy mas confundido que antes.  Necesito una ayuda urgente


----------



## seaarg (Abr 13, 2011)

Probaste enchufarlo, eliminar los drivers, desenchufarlo y darle otra vez?

O mejor aun, tambien cambiando de puerto usb? Esto es mas probable que sea windows que otra cosa el problema (intuyo)


----------



## Deego (Abr 13, 2011)

Si seaarg, los probe en todos los puertos y en ninguno.  Los drivers del PIC hid donde quedan ubicados, eso si no lo he hecho, pense de pronto en eso, pero no estab seguro de donde quedan ubicados, igual fui a administrador de dispositivos y no encontre nada del PIC, pues a simple vista


----------



## seaarg (Abr 13, 2011)

Dispositivos de interfaz de usuario, vas a ubicar cual es mediante el VID y PID


----------



## Deego (Abr 13, 2011)

mmm si seaarg, ya vi por ahi pero solo sale le mouse usb que tengo conectado, el otro, el pic ni me lo reconoce, ni suena ni nada :s, antes funcionaba por lo menos en cdc, ahora ni en cdc ni en HID, ni si quiera suena ni lo toma ni si quiera dice que eldispositivo no se reconoce nada, es como si no se conectara nada al puerto.  Ya intenté en todos los puertos del computador, incluso lo probe en un computador con xp  y nada.  Pienso que de pronto es el PIC pero no se porque el programador lo reconoce normalmente..

No, ya me cansé de mirar que mas cosas, probé de todo y nada, voy a comprar otro PIC , porque al parecer lo más posible es que esté dañado.  Ojalá sea solo eso.  Seguiré informando por acá.


----------



## Deego (Abr 14, 2011)

Que tal, otra vez yo, ahora por aca.  Me pregunto si se necesita algún  driver para que reconozca el PIC, porque en proteus si me lo reconoce,  tal vez por el driver que toca instalar, pero ya utilizando el PIC real,  dice que el dispositivo no ha sido reconocido.  En system32 ya puse el  dll mcHID pero no se que más tocará realizar, para que el computador  reconozca el PIC, probe en todos los puertos, en varios computadores y  sigue saliendo el mismo mensaje, que el dispositivo no es reconocido por  el HOST.  Alguna sugerencia amigos??  PDTA: el problema anterior si era el PIC, lo cambié y de una por lo menos detecta un dispositivo con el sonidito de windows, pero sale el letrero de No se reconce el dispostivio, no se que hacer, es como si pidiera un driver.

VENGO CON BUENAS NOTICIAS!!! Por fin pude hacer la comunicación, mejor dicho ya solucioné mis problemas.  El host no me reconocia el PIC por un problema con el VID y PID, cambie el VID y funciono de una, además que me faltaban algunos fuses. Tal vez lo del PID y VID pasaba porque creaba un conflicto por la simulación en proteus, bueno en realidad no se, lo único que se es que deje para simular en proteus un VID y PID diferente a los que tengo para probarlos con el PIC real.  Mejor dicho TODO A LAS MIL MARAVILLAS  ... muchas gracias a todos, moyano, seaarg, ojalá todo siga funcionando bien.  Dejo un link el cual  me sirvió mucho, no se si se pueda dejar en estos foros, pero igual, es de buena información. 

http://www.xbot.es/ezkybel/hid-1/

Saludos a todos.  Cualquier problema que tenga, por acá estaré de nuevo molestándolos


----------



## EINNER C (Abr 16, 2011)

hola a todos

he leido que tienen problemas con los drivers, o con que no reconoce el dispositivo, y eso de borrarlo del registro y de la carpeta inf en windows, es canson, asi que utilizo el gestor usbdeview que enlista todos los dispositivos y los podes borrar automaticamente.............

saludos


----------



## Larva93 (Abr 17, 2011)

Hola, queria saber si habia alguna solucion para poder hacer que el software que controla los 8 reles sea un poco mas rapido..

Desde ya muchas gracias.


----------



## Moyano Jonathan (Abr 17, 2011)

> Hola, queria saber si habia alguna solucion para poder hacer que el software que controla los 8 reles sea un poco mas rapido..



A que te referís ?


----------



## Larva93 (Abr 17, 2011)

Moyano Jonathan dijo:


> A que te referís ?



es que cuando envio un dato al pic, tarda un cierto tiempo en llegar o aveces tengo que apretar mas de una vez para que este llegue.


----------



## Moyano Jonathan (Abr 17, 2011)

Algo debes tener mal en la aplicación, estás siguiendo al pie de la letra las indicaciones que hago en el manual del principio del hilo ? Que sistema operativo usas ?
En fin , la aplicación funciona correctamente. Quizás alguna modificación que le realizaste hicieron que no funcione con la velocidad que deseas...

Posteá código, programa , capturas de pantalla y todo lo que nos pueda ayudar a ayudarte


----------



## Jhon5191 (Abr 18, 2011)

Hola a todos, hace mas o menos un año que no venia y ahora encuentro 40 paginas mas, excelente.  Desde la ultima vez que vine a este hilo solo sabia usar el protocolo cdc, ahora me he metido de lleno al HID y estoy muy satisfecho con los resultados.  He usado la aplicación Easy HID para generar mis proyectos en visual basic y hasta ahora todo ha sido impecable, sin embargo, ya que recientemente he adquirido el Visual Studio 2008, me gustaria migrar (o traducir) mis proyectos de visual basic 6.0 a esta plataforma.  Tengo entendido que en alguna parte de este hilo hay algunos ejemplos pero no logro encontrarlos.

Asi que les pregunto, es posible que alguien me pueda orientar en esta cuestion?

De antemano muchas gracias y saludos a todos


----------



## Larva93 (Abr 18, 2011)

Bueno, solucione el problema del soft, ahora tengo otro . ... el tema es que me detecta todo perfectamente, pero, se conecta y desconecta solo cada 5 segundos... no se cual puede ser el problema.

Pienso que por ahi es por algun tema de alimentacion, pero no se, si me podrias detallar bien las conexiones.. te lo agradeceria mucho.


----------



## Moyano Jonathan (Abr 18, 2011)

> sin embargo, ya que recientemente he adquirido el Visual Studio 2008, me gustaria migrar (o traducir) mis proyectos de visual basic 6.0 a esta plataforma.



En la primera página del foro está subido el manual. Fijate si te sirve (hecho para VC# 2008). Ahora si necesitas para VB.net 2008, luego subiré el manual....estoy un poco falto de tiempo con la facu.



> Bueno, solucione el problema del soft, ahora tengo otro . ... el tema es que me detecta todo perfectamente, pero, se conecta y desconecta solo cada 5 segundos... no se cual puede ser el problema.



Si se desconecta del host....(no lo reconoce más)....es problema de software. Tendrías que subir el firmware para que lo veamos..


----------



## Larva93 (Abr 19, 2011)

Moya, gracias por tu gran preocupacion...ya resolvi el problema .... era problema de firmware... muchisimas gracias.


----------



## Jhon5191 (Abr 19, 2011)

Moyano Jonathan dijo:


> En la primera página del foro está subido el manual. Fijate si te sirve (hecho para VC# 2008). Ahora si necesitas para VB.net 2008, luego subiré el manual....estoy un poco falto de tiempo con la facu.



Oh, no sabia que ya habias terminado el manual, aunque sea para VC# 2008 igualmente puede ser util, a pesar de que si lo necesitaba para VIsual studio 2008.  Igualmente, muchas gracias moyano


----------



## Meta (Abr 19, 2011)

Hola:

Lo he adaptado del Visual C# 2008 al Visual C# 2010 sin ningún error en el cambio automático. Pasarlo a Visual basic lo haré con el tiempo a mano.


Por cierto Moyano, buen trabajo con el manual. No te cortes un pelo si tienes que actualizar o ampliarlo en el futuro con nuevas funciones, etc.

Saludo.


----------



## Moyano Jonathan (Abr 19, 2011)

Muchas gracias por pasarlo a Visual C# 2010, para tener todo actualizado. Lo de VB (Aplicación) ya está hecha y probada. Me falta terminar el manual.

Un saludo !


----------



## Meta (Abr 20, 2011)

Hola:

Prefiero que alguien lo pruebe y nos confirmen si funciona realmente todo.

 ¿Algún candidato?

Descargar

Saludo.


----------



## josb86 (Abr 20, 2011)

buenas como estan miren he comprado mi primer 18f4550 pero no entiendo algo he visto en el datasheet que hablan de colocar un resistencia de 1.5k entre Vusb y el pin D+ ademas de esto un caparacitor de 220 nF entre Vusb y tierra. el problema radica en que he visto varios montajes y en casi ninguno utilizan esta resistencia mi pregunta es ¿esta resistencia no es necesaria? ¿o es que hay que habilitar las pull-up internas para no tener que colocar esto?


----------



## Moyano Jonathan (Abr 21, 2011)

Hola josb86, como estás.

Para usar el USB, necesitas lo siguiente:

- Las líneas D+ y D- se colocan de forma directa, sin resistencias, a las líneas D+ y D- del PIC.

- En el Pin Vusb necesitas un capacitor de 470nF ...220nF, lo he probado y falla.

- Para USB, se usan las PULL - UP internas.


----------



## Meta (Abr 21, 2011)

Moyano Jonathan dijo:


> - En el Pin Vusb necesitas un capacitor de 470nF ...220nF, lo he probado y falla.
> 
> .



¿Exactamente que es lo que te falla?


----------



## Moyano Jonathan (Abr 21, 2011)

A mi no me enumera....es raro porque solo es un capacitor de filtrado ....igual tiene que ser 470nF o más.

Un saludo !


----------



## josb86 (Abr 21, 2011)

Meta dijo:


> ¿Exactamente que es lo que te falla?



pues la verdad a mi no me falla nada todavía apenas estoy montando el circuito pero fui a lo que decía el manual pero si he visto en varios foros este comentario del capacitor de 220nf


----------



## murphy9 (Abr 21, 2011)

Hola a todos, antes que nada deseo agradecerte Moyano Jonathan por haber subido el manual. Ahora bien, les comento los problemas que estoy teniendo al querer hacer funcionar el proyecto. El primero de ellos es que al conectar el pic a la pc, ésta no puede reconocerlo (aparece el cuadro de dialogo que dice "no se pudo reconocer dispositivo"), el otro es con visual c#, al ejecutar el programa todo parece andar bien, sin embargo al presionar el botón "conectar el dispositivo" aparece el siguiente error: 
Excepción no controlada del tipo 'System.BadImageFormatException' en USB Visual C [sharp] HID.exe
Información adicional: Se ha intentado cargar un programa con un formato incorrecto. (Excepción de HRESULT: 0x8007000B).

por favor si alguien puede decirme como solucionar estos problemas se los agradeceré. Por cierto, tengo windows seven ultimate de 64 bits y visual studio 2010


----------



## Meta (Abr 21, 2011)

Hola:

BadImageFormatException

Lee bien, bien, cuando digo bien, es bien.

http://msdn.microsoft.com/es-es/library/system.badimageformatexception(v=VS.100).aspx

También los ejemplos.

Saludo.


----------



## murphy9 (Abr 21, 2011)

Muchísimas gracias por el dato Meta, efectivamente, pude solucionar el problema de c# con la información que me pasaste


----------



## Meta (Abr 22, 2011)

Por si tienes dudas y quieres controlar el error.

http://msdn.microsoft.com/es-es/library/0yd65esw(v=VS.100).aspx

Saludo.


----------



## murphy9 (Abr 22, 2011)

Hola Meta, como te  dije con la pagina que me pasaste solucioné el problema, o creo haberlo hecho, ya que el error dejó de aparecer al ejecutar el programa de c#, lo solucioné cambiando el destino de la plataforma del proyecto a x86. Sin embargo sigo sin poder probar el proyecto, ya que la pc todavía no reconoce al pic como un dispositivo hid. Probandolo en otra computadora con el mismo sistema operativo,  esta si lo reconoce, por lo que por lo menos puedo concluir que las conexiones están bien hechas y no es problema de la placa. Es posible que tenga un problema de drivers o algo por el estilo?


----------



## Meta (Abr 22, 2011)

Me creo más problemas de los driver del USB, ya sabes, coges el CD de la placa bas ey instalas sus drivers.


----------



## murphy9 (Abr 24, 2011)

Listo, pude solucionarlo, gracias por tu ayuda meta


----------



## nietzche (Abr 24, 2011)

Hola, mi duda es la que sigue: segun Moyano Jonathan la velocidad maxima del PIC es 64 Kbps o algo asi.
esto es una payasada, porque con PICS bien equipados, tienen UART que alcanzan mas velocidades que esa cosa.
hay otra forma de controlar al PIC y que realmente alcanze o se aproxime a los 12 Mbps que dice el fabricante que tiene?.
Diganme si se alcanzan esas velocidades para no perder el tiempo y estudiar mas del PIC, o si no lo alcanzan para bnuscar otro micro que si lo haga. gracias


----------



## Meta (Abr 24, 2011)

Si lo alcanza. Buscas ejemplos en www.microchip.com
Esta idea de la interfaz no hace falta velocidades tan altas, es para controlas relés, no pasar archivos como si fuera un PenDrive.

A la próxima mide tus palabras a dirigirte a la gente del foro.


----------



## Moyano Jonathan (Abr 24, 2011)

> esto es una payasada, porque con PICS bien equipados, tienen UART que alcanzan mas velocidades que esa cosa.



1º - No hace falta expresarse de esa manera...
2º - Las velocidades de 64KB....se deben a restricciones de protocolo NO de hardware.



> hay otra forma de controlar al PIC y que realmente alcanze o se aproxime a los 12 Mbps que dice el fabricante que tiene?.



NO, por restricciones de protocolo no se puede...aunque hay gente que ha logrado unos 2Mbps, usando Bulk...aunque sencillamente no se como lograron esa velocidad....es una cuestión de descriptores y las funciones de comunicaciones que hayas implementado.



> Diganme si se alcanzan esas velocidades para no perder el tiempo y estudiar mas del PIC, o si no lo alcanzan para bnuscar otro micro que si lo haga



Habla de tu proyecto en concreto...no podemos recomendarte nada si no nos planteas tus dudas.

Un saludo !


----------



## Meta (Abr 24, 2011)

nietzche dijo:


> Diganme si se alcanzan esas velocidades para no perder el tiempo y estudiar mas del PIC, o si no lo alcanzan para bnuscar otro micro que si lo haga. gracias



Prueba con los PIC32.

Por aquí puedes comentar sobre estos temas.

Participa tus proyectos de USB en www.mypic32.com.

Hay más marcas para controlar USB, más todo tipo de microcontroladores, estoy seguro que hay incluso más que la pequeña lista de abajo.



ARM
Atmel
Cypress
Diodes
Ember
Energy Micro
Fairchildsemi
FreeScale
FTDIchip
Fujitsu
Hitachi
Holtek
IDT
Infineon
Intersil
JMicron
LSI
Maxim-IC
Micrel
Microchip
Microsemi
National
NEC
Nuvoton
Oki
On Semi
Parallax
Philips
Picaxe
Rabbit
Renesas
Rohm
Samsung
Semtech
Silabs
STMicroelectronics
TI
Toshiba
Winbond USA
Xmos



Saludo.


----------



## Ardogan (Abr 24, 2011)

nietzche dijo:


> Hola, mi duda es la que sigue: segun Moyano Jonathan la velocidad maxima del PIC es 64 Kbps o algo asi.
> esto es una payasada, porque con PICS bien equipados, tienen UART que alcanzan mas velocidades que esa cosa.
> hay otra forma de controlar al PIC y que realmente alcanze o se aproxime a los 12 Mbps que dice el fabricante que tiene?.
> Diganme si se alcanzan esas velocidades para no perder el tiempo y estudiar mas del PIC, o si no lo alcanzan para bnuscar otro micro que si lo haga. gracias



Hola, quería aclarar algunas confusiones. La limitación no es de 64kbps sino de 64 bytes/ms, es decir, 64x8 = 512kbps.
Esto vale para la clase de dispositivo USB estandar llamada CDC (communication device class). En USB hay otras clases estandar como el MSD (mass storage device), HID (human interface device), etc. También se puede definir una interfaz USB no estandar usando la cantidad/tipo de endpoints que uno especifico, son las "Vendor class" o clases propietarias.

La clase CDC en particular utiliza endpoints del tipo INT, que para USB2.0 tiene un tiempo de polling mínimo de 1 milisegundo. En USB el maestro pregunta a intervalos de tiempo regulares o no si el esclavo - nuestro PIC por ejemplo - tiene algo para transmitir. Si los intervalos de tiempo son o no regulares depende del tipo de endpoint: INT/BULK/ISO (no sé si hay alguno más). Se supone que la ventaja de usar INT es que uno tiene asegurado (en teoría) que el dispositivo esclavo es interrogado siempre cumpliendo con el tiempo especificado.

Por eso si uno usa endpoints bulk - donde no se asegura que el esclavo sea interrogado cada cierto tiempo, sino que se interrogará cuando el maestro pueda - esa limitación de tiempo no está. El esclavo se interrogará en intervalos de tiempo que dependerán de cuantos otros dispositivos hayan conectados al mismo bus. De todas formas no creo que interrogue a intervalos menores de 1ms, lo que sí puede pasar es que con bulk el esclavo le puede responder "tengo 256 bytes para enviarte" y esa transacción se puede llevar a cabo si el maestro no está cargado en el milisegundo que dura la transacción. Entonces en vez de transmitir 64 bytes que son el máximo para un endpoint INT (que se utilicen en clases CDC), puede transmitir una cantidad de información mayor; pero no hay garantía de que esa información llegue en el próximo milisegundo, o en los próximos 100 milisegundos. Todo dependerá de que otros dispositivos haya conectados al bus USB.

Bueno, seguramente hay imprecisiones en lo que dije antes, pero quería dar una idea general del por qué de las velocidades y limitaciones.
Siempre podés intentar definir una clase propietaria, pero se te va a complicar el diseño. Usando las clases estandar te asegurás que el día de mañana tu dispositivo no debería tener problemas en ser reconocido por Windows, Linux, MacOS, etc - porque los drivers ya los incorpora el sistema operativo debido a que son estandares ampliamente reconocidos. En cambio si haces un clase propietaria vas a tener que buscar drivers que funcionen para cada SO. En tal caso probá con libusb / libusb-win32 que al menos podría funcionar con Windows/Linux.
Saludos.


----------



## nietzche (Abr 25, 2011)

Ok perdon por alterarme pero estoy algo nervioso, pues lo queria para basicamente mandar señal de voz por USB al Labview, y pues las especificaciones son las mismas: 8 bits de resolucion  @ 8Ksps, que son 64 Kbps, pero no se si se manden datos continuos o algo asi, porque entendi de la explicacion de Ardogan que no.
Por otro lado si me dicen que el PIC32 es bueno en eso del USB pues le dare una leida.
Bueno espero que no se hayan enojado conmigo y gracias a todos por sus respuestas


----------



## Meta (Abr 25, 2011)

No se de cabeza decirte lo del USB 2.0, cuando sea muy estander el USB 3.0 y la otra tecnología, este si que será del diez.


----------



## Moyano Jonathan (Abr 26, 2011)

nietzche, como estás.

Te recomiendo que busques en los ejemplos de microchip, los leas y trates de entender poco a poco....a mi me tardó 2 años para poder sacar algo en claro con el USB....por eso te digo..si tienes paciencia lo vas a poder lograr. En este hilo del foro no creo que se te pueda ayudar por que está dirigido al control de dispositivo más que a las comunicaciones de alta velocidad para voz y datos....igual en lo que podamos te vamos a dar una mano.


----------



## nietzche (Abr 29, 2011)

muchas gracias Moyano Jonathan, la verdad es que el profesor nos esta enseñando el uso del labview con el 18f4550, ahora pues controlamos cosas sencillisimas, pero claro que necesito entenderle muy bien a este micro, si, estaba bastante emocionado de cambiar de rs-232 a USB. entonces me surgieron muchas ideas locas como velocidades grandes, ahora comprendo que es poco a poco, jajajajajaja. 
Bueno de todas maneras gracias por el apoyo y paciencia.


----------



## Meta (Abr 29, 2011)

Ya nos enseñarás por aquí la snuevas ideas.


----------



## autotronico (Abr 30, 2011)

Que tal buen tema pero tengo una consulta alguno ha maneja led o matrix de led por usb, para que me presten asesoría.

ldc o motores pap con teclado matrixal desde pc a traves de puerto usb.


----------



## Moyano Jonathan (Abr 30, 2011)

Mostrá tu problema para que te podamos ayudar.

Un saludo !


----------



## autotronico (Abr 30, 2011)

En el documento adjunto es lo he hecho hasta el momento deseo realizar algo parecido a esto:






Pero he tenido problemas con la comunicación Pc a pic en velocidad muy lento


----------



## Moyano Jonathan (Abr 30, 2011)

Entiendo, pero te pregunto de nuevo...cuál es tu problema ? de programación para la PC, de programación del microcontrolador ?


----------



## autotronico (Abr 30, 2011)

de recepcion del pic puesto que el programa de control de pc esta en visual C++ te dejo el codigo del pic:


> #include <18F4550.h>
> #device ADC=10
> #fuses HSPLL,USBDIV,PLL5,PUT,CPUDIV1,VREGEN,NOWDT,NOPROTECT,NOLVP,NODEBUG,NOMCLR
> #use delay(clock=48000000)
> ...



perdón ya encontré la falla en los descriptores del include <USB_Konfigurasyon.h>, lo había configurado mal.


----------



## al1984 (Abr 30, 2011)

Moyano Jonathan dijo:


> Mostrá tu problema para que te podamos ayudar.
> 
> Un saludo !


 saludos,  me gustaria que me ayudaras a lograr funcionar un programa hecho en visual basic para puerto paralelo con el puerto usb con el pic 18f4550 .Es un proyecto ya viejito pero bueno de unos estudiantes


----------



## mikele (May 1, 2011)

hola moyano que tal, espero q me puedas ayudar, he revisado todo el contenido de usb en el foro, quisiera saber si tal ves tiene un programa hecho en visualbasi 6.0 para la comunicacion usb bulk usando api, tengo hecho uno en C# pero me baso desde ahi para poder hacer los modulos en basic 6.0 pero me salen errores a la final no encuentro nada jejeje... espero q me puedas ayudar, de ante mano agradesco la ayuda..


----------



## Moyano Jonathan (May 1, 2011)

> saludos, me gustaria que me ayudaras a lograr funcionar un programa hecho en visual basic para puerto paralelo con el puerto usb con el pic 18f4550 .Es un proyecto ya viejito pero bueno de unos estudiantes



Te podrías guiar de mi manual para hacer tu aplicación. Lo descargas de la primera página del hilo.



> hola moyano que tal, espero q me puedas ayudar, he revisado todo el contenido de usb en el foro, quisiera saber si tal ves tiene un programa hecho en visualbasi 6.0 para la comunicacion usb bulk usando api, tengo hecho uno en C# pero me baso desde ahi para poder hacer los modulos en basic 6.0 pero me salen errores a la final no encuentro nada jejeje... espero q me puedas ayudar, de ante mano agradesco la ayuda..



Todavía no me pongo a experimentar con el puerto USB usando Bulk , además todas las pruebas las he hecho con C#. Más adelante quizás haga ejemplos en VB.net y C# con el protocolo Bulk, pero será luego de que termine el manual con HID.

Un saludo !


----------



## Larva93 (May 9, 2011)

Hola, bueno les planteo mi problema...resulta que estaba haciendo el 2do ejemplo de la primera pagina, pero me aparece dispositivo desconocido...No se si es problema circuital o que puede ser...por un momento pense que tenia los cables d+ y d- cambiados, pero no era asi...

les dejo una foto de la Protoboard con el circuito armado.

http://imageshack.us/f/851/dsc00800m.jpg/

PD:Tengo una duda tambien, si el cristal externo es de 20MHZ  el firmware tambien debe tener 20MHZ?


----------



## Moyano Jonathan (May 9, 2011)

El problema puede estar en los fuses, por favor revisá tu configuración.

Un saludo !


----------



## Larva93 (May 9, 2011)

Gracias por tu pronta respuesta!

Mira te cuento, uso el quemador ART2003 (anda bien) y winpic800 .... Como tendria que configurarlo para poder el 2do ejemplo.

desde ya muchas gracias.


----------



## aguirre (May 17, 2011)

Moyano Jonathan dijo:


> Muchisimas gracias meta voy a revisar tu código. A ver como es la nueva forma de programar de vb.net ya que nunca lo he utilizado al igual que visual c (sharp).
> 
> pd: Estoy preparando una explicación más detallada de lo que hacen las librerías de CDC (comunication device class) para que se le saque más provecho y ahora que estoy de vacaciones , le voy a meter mano a esto del USB. Tambíen estoy terminando con los toques finales al clon del pickit2 y a la placa de desarrollo para micros de 28 pines , que me parece que al final va estar enfocada más al PIC18F2550 que a otra cosa.




este programa tambien se puedo ocupar para el pic 18f4550 y 16f877A,,espero tu repuesta gracias1!!


----------



## Moyano Jonathan (May 17, 2011)

Para el PIC18F4550 si (TIENE USB). Pero para el PIC16F877 No....NO tiene hardware USB incorporado.

Un saludo !


----------



## Meta (May 17, 2011)

Moyano Jonathan dijo:


> Te podrías guiar de mi manual para hacer tu aplicación. Lo descargas de la primera página del hilo.
> 
> 
> 
> ...



Moyano:

Mejor centrarse en una cosa y completar el manual con HID cargado de detalles, que hacer dos manuales con falta de información y no bien explicado.

Por cierto, sobre el manual que hiciste de C#, muy impresionante.

El otro:

Caballero, ya se pasará a VB .net, por ahora no lo he hecho porque me queda menos de un mes de clase con JAVA y redes. Es sólo intentar adaptar de un lenguaje a otro, se hace poco a poco, ten paciencia.

Saludo.


----------



## Larva93 (May 17, 2011)

Hola de nuevo...Ya logre hacer andar todo..pero ahora tengo otro problemita, no se si es por problema de masa o algun capacitor de filtro, pero se me conecta y desconecta solo a cada rato. (2do ejercicio cdc)


----------



## Dear (May 18, 2011)

Moyano Jonathan dijo:


> Hola a todos
> 
> Despues de una torticolis que me hizo desmayar del dolor , me puse las pilas para terminar un pequeño pero funcional ejemplo de comunicación bajo el protocolo HID.
> 
> ...




Hola antes que nada quiero agradecerles ya que este foro y los temas me han sido de gran ayuda se que estoy regresando mucho pero me he quedado con una duda muy grande y es por la cual no he podido avanzar.

Porque el 1 que se envía desde el pc al pic se compara con la posición 0 del array data???

Si quisiera encender mas leds como lo haria?? Saludos.

Estoy trabajando con el pic 18f4550 y la interfaz del pc en java.


----------



## Moyano Jonathan (May 18, 2011)

Hola como estás.



> Porque el 1 que se envía desde el pc al pic se compara con la posición 0 del array data???



Por que es el primer byte de datos....el host usa el byte 0 como byte de control y comienza la trama de datos a partir del byte 1. En el pic....el arreglo comienza en 0....por lo tanto recibe el byte y lo guarda allí....



> Si quisiera encender mas leds como lo haria?? Saludos.


 Lee el manual que está en la primera página...el capítulo del firmware para el PIC...y te vas a dar cuenta.


----------



## Dear (May 18, 2011)

Acabo de leer tu respuesta mientras me encontraba analizando ejemplos de aqui y por alla y he hallado una solucion tal vez no lo suficiente buena para un programador pero lo he solucionado y les quiero dar las gracias porque gracias a este foro se aclararon muchas dudas. Seguire leyendo y descargando los manuales para continuar en este mundo de los pic´s que en lo personal me interesa mucho. Saludos moyano jhonatan por tomarte la molestia de contestar y sigan asi que ayudan bastante. Saludos


----------



## Moyano Jonathan (May 19, 2011)

Estamos para ayudarte, en las vacaciones de invierno pienso que voy a terminar con el manual de HID...y seguiré con Bulk....entre otras cosas interesante que tengo para mostrar.

Un saludo !


----------



## leonardo19 (May 19, 2011)

Moyano Jonathan dijo:


> ya me voy a descargar el vb 2008 .net y te pregunto dudas.
> 
> pd: estoy haciendo un programa de control de 8 relés por puerto usb utilizando lo aprendido en los 3 ejemplos anteriores.




buenos dias, jonattan, si yo cambio el pic18f2550 por el pic18f4550 es si no cambiarle el include #include <18F2550.h> a #include <18F4550.h>


----------



## Moyano Jonathan (May 19, 2011)

Necesariamente en el software no cambia nada. Solo los pines usados para la comunicación.


----------



## leonardo19 (May 19, 2011)

Muchas gracias, tengo otra pregunta estoy haciendo el trabajo en pcwh v4.088, a la hora de compilar lo hace todo bien pero al generar los archivos de salida, el .hex lo pone como ICD, y a la hora de programar en el pickit2 me muestra este mensaje "Warning: No configuration words in hex file in MPLAB use File-Export to save hex with config", y el pic no quema bien, que podra ser??, De antemano muchas gracias


----------



## gelitojr (May 20, 2011)

Que tal!

antes que nada quiero agradecer por el tiempo y dedicación de todas sus aportaciones, y también felicitarlos por su buen trabajo, sobre todo con los manuales y ejemplos. Actualmente realizo un proyecto en el que planeo controlar un robot cartesiano mediante un PIC comunicado con la PC por medio de USB. Estoy comenzando a leer el manual de C# y dice que funciona con W7, pero mi pregunta es si no hay problema si el windows que tengo es de 64 bit?, por si acaso me descargue la maquina virtual para correr el XP sobre windows 7, que precisamente tiene compatibilidad con aplicaciones que corren en sistemas de 32 bit. 
Espero que me puedas aclarar ese detalle. Nuevamente muchas felicidades y si en algo puedo ayudar por el momento es con traducciones de inglés técnico e incluso en alemán sobre este tema, pues con todo gusto.
Saludos desde Mexico!


----------



## jackonegro (May 20, 2011)

Hola, saludos a todos los que dedican un tiempo en leer y resolver nuestras dudas, agradezco los aportes con respecto a la comunicacion USB que tanto el serñor Moyano como otros nos han dejado con mucha dedicacion. He logrado transmitir desde labview un caracter como uds lo han enseñado, pero yo deseo transmitir un archivo .txt el cual contiene en una linea coordenadas X e Y separadas por espacio, he usado la funcion get_string_usb() pero no consigo en separar los valores para poder manipularlos, la idea es que cada par de coordenadas sean ingresadas en un modelo cinematico que controlan 3 motores. Les agradezco de antemano y espero que sigan generando grandes aportes como hasta ahora lo han hecho.

Jackson Angulo


----------



## Moyano Jonathan (May 20, 2011)

> Muchas gracias, tengo otra pregunta estoy haciendo el trabajo en pcwh v4.088, a la hora de compilar lo hace todo bien pero al generar los archivos de salida, el .hex lo pone como ICD, y a la hora de programar en el pickit2 me muestra este mensaje "Warning: No configuration words in hex file in MPLAB use File-Export to save hex with config", y el pic no quema bien, que podra ser??, De antemano muchas gracias


 Disculpame, no entiendo tu problema. Se un poco más gráfico.




> Que tal!
> 
> antes que nada quiero agradecer por el tiempo y dedicación de todas sus aportaciones, y también felicitarlos por su buen trabajo, sobre todo con los manuales y ejemplos. Actualmente realizo un proyecto en el que planeo controlar un robot cartesiano mediante un PIC comunicado con la PC por medio de USB. Estoy comenzando a leer el manual de C# y dice que funciona con W7, pero mi pregunta es si no hay problema si el windows que tengo es de 64 bit?, por si acaso me descargue la maquina virtual para correr el XP sobre windows 7, que precisamente tiene compatibilidad con aplicaciones que corren en sistemas de 32 bit.
> Espero que me puedas aclarar ese detalle. Nuevamente muchas felicidades y si en algo puedo ayudar por el momento es con traducciones de inglés técnico e incluso en alemán sobre este tema, pues con todo gusto.
> Saludos desde Mexico!



Si tendría que funcionar en máquinas de 64bits. Yo compilé los programas para X32/X64.....


----------



## Dear (May 23, 2011)

Hola que tal regreso una vez mas, bueno resulta que estoy haciendo un proyecto de domótica muy basico que sera solo de encender leds mediante una interfaz en java y con el pic 18f4550 via USB, todo va muy bien solo que he decidido que este mini sistema tenga un espacio de seguridad tengo pensado usar diodos infrarrojos y fototransistor para crear una barrera pero necesito que el pic me detecte cuando esta sea interrumpida y mande una señal al programa en java. Saludos espero puedan ayudarme


----------



## Moyano Jonathan (May 23, 2011)

> necesito que el pic me detecte cuando esta sea interrumpida y mande una señal al programa en java



En tú consulta está la respuesta , usá interrupciones del microcontrolador. Lo mejor es que uses la interrupción por cambio de estado en RB4 - RB7.

Un saludo !


----------



## drago109 (May 28, 2011)

Amigo Moyano Jonathan te felicito por tus aportes y por ayudar a los compañeros del foro.
La verdad me quito el sombrero ante ti. Eres el genio de los USB en pic.

Dime cuando terminas tu manual PIC18F2550 y USB Desarrollo de aplicaciones o si ya lo terminaste ya que yo lo tengo solo asta la pagina 125 y de verdad me a ayudado bastante pero no termino en concreto.

El tema es que me encuentro haciendo una estacion de reballing y aca pueden ver lo que llevo adelantado. http://www.reballing.es/viewtopic.php?f=31&t=1431 pero harora lo quiero modificar para que trabaje por usb y es lo que no se de programacion en ccs y tampoco se del visual basic ya que apenas lo estoy empezando a usar.

Dime amigo para cuando puedo tener completo tu manual y haci aprender a trabajar los pic por usb.

Saludos amigo espero tu ayuda.


----------



## Moyano Jonathan (May 28, 2011)

> Amigo Moyano Jonathan te felicito por tus aportes y por ayudar a los compañeros del foro.
> La verdad me quito el sombrero ante ti. Eres el genio de los USB en pic.



Muchas gracias, es solo estudio...me falta mucho para ser un genio como vos decís....



> Dime cuando terminas tu manual PIC18F2550 y USB Desarrollo de aplicaciones o si ya lo terminaste ya que yo lo tengo solo asta la pagina 125 y de verdad me a ayudado bastante pero no termino en concreto.



Ese manual está en construcción pero por razones de tiempo y técnicas (falta de información concreta)....no va a estar por lo menos hasta el año que viene.



> El tema es que me encuentro haciendo una estacion de reballing y aca pueden ver lo que llevo adelantado. http://www.reballing.es/viewtopic.php?f=31&t=1431 pero harora lo quiero modificar para que trabaje por usb y es lo que no se de programacion en ccs y tampoco se del visual basic ya que apenas lo estoy empezando a usar.
> 
> Dime amigo para cuando puedo tener completo tu manual y haci aprender a trabajar los pic por usb.



Ya hay un manual para trabajar con USB en la primera página del hilo (es un manual práctico).


----------



## Dear (May 29, 2011)

Hola que tal he regresado una vez mas ya he hecho el circuito fisico con el 18f4550 y la interfaz en java pero tengo problemas con las ordenes. Simulandolo en proteus me funciona de maravilla pero real solo me cumple la primera instruccion que le doy.
Tengo botones en java que indican el encendido y apagado de leds pero solo me enciende el primero que selecciono y despues ya no ejecuta ninguna accion. Espero puedan ayudarme sospecho un poco de la programacion


----------



## Alexjs30 (May 31, 2011)

Hola amigo, estoy en la misma situacion con el tema de la comunicacion con un pic 18f4550, vos me darias una mano? no tengo idea como hacer, tenes documentacion o un ejemplo de comunicacion?


----------



## Dear (May 31, 2011)

Bueno les digo que ya he solucionado mi problema y no hay nada mal en la programacion del pic ni la interfaz en java al parecer es mi version de windows vista home basic la que impide la comunicacion correcta porque ya lo he hecho en windows seven y corre de maravilla saludos


----------



## leonardo19 (May 31, 2011)

Buenas tardes tengo una pregunta, como hago para escoger el tiempo de muestreo de la señal, he estado mirando pero no entiendo. Muchas ggracias


----------



## Larva93 (May 31, 2011)

Bueno, antes que nada queria agrecerles a todos los que aportaron en este post y queria mostrarles como quedo este proyecto.






Para programar el pic use el quemador ART2003 y winpic800 .. y el firmware es el del control de 8 reles, solo que yo use 4.


----------



## Moyano Jonathan (May 31, 2011)

> Bueno, antes que nada queria agrecerles a todos los que aportaron en este post y queria mostrarles como quedo este proyecto.


 Felicitaciones, además con AC/DC de fondo !


----------



## leonardo19 (Jun 1, 2011)

Buenas noches, jonatan como hago para saber el tiempo de muestreo de la señal analogica. Gracias


----------



## Moyano Jonathan (Jun 1, 2011)

En la hoja de datos explica exactamente como calcular los tiempos. En los PIC18F tenés velocidad de adquisición programable.

Saludos !


----------



## Deego (Jun 1, 2011)

*Hola gente, de nuevo yo.  Me ha surgido un problema cuando quiero leer desde vb.net los datos que provienen del PIC.  En la programación del pic, realizada en CCS, estoy definiendo un dato de salida como int output_data[8] y despues en el código he puesto las siguientes dos lineas  
    out_data[0]=0x10;  // out_data[0]= 0×55
    usb_put_packet(1, out_data, 8, USB_DTS_TOGGLE);

se supone que esto lo envía al buffer de salida en la posición 0 y en VB.net lo tengo que recibir en la posición 1, de la siguiente manera BufferIn(1) y mas concretamente con estas lineas..

If BufferIn(1) = &H10 Then      ' Si lo que envio el PIC es "0x55"
            Label6.Text = "Dato Recibido"
        Else
            Label6.Text = "No hay datos"
        End If

estoy utilizando el text de label para ver que el cambio se realiza cuando se envia algo del PIC a la PC.  La función que habilita el buffer de entrada es la que creo todos tenemos en la información que poseemos de HID que es la siguiente 

  Public Sub OnRead(ByVal pHandle As Integer)
        ' read the data (don't forget, pass the whole array)...

        If hidRead(pHandle, BufferIn(0)) Then
            ' ** YOUR CODE HERE **

            ' first byte is the report ID, e.g. BufferIn(0)
            ' the other bytes are the data from the microcontroller...
        End If
    End Sub

Pero despues de esto, no logro leer  nada porque el Label no cambia.  He metido el codigo de los label dentro de la función de OnRead y no funciona; he creado una función leer, pongo el codio y la llamo desde un boton y tampoco.  El objetivo es que mientras una entrada del Pic sea alta, entonces se cambie el label en vb.net , pero no he logrado conseguirlo.  Lo mas curioso, es que realizo el experimento en Proteus y me va de maravilla, pero en la aplicación real no me funciona.  Estaría agradecido si alguien me ayudara, ya sea moyano, meta, seaarg o cualquiera de uds que puedan sacarme de este lío. 
*


----------



## sjuan (Jun 2, 2011)

ola, disculpen el programador  PICkit2 de orto foro que hay por hay, tambien programa este PIC?


----------



## Moyano Jonathan (Jun 2, 2011)

> ola, disculpen el programador PICkit2 de orto foro que hay por hay, tambien programa este PIC?


 Disculpá no entiendo tu pregunta...vos decís si programa el PIC18F2550 ? En caso de que así fuese...SI lo programa.

Un saludo !


----------



## sjuan (Jun 3, 2011)

moyano, podrias poner el pcb del entrenador en pcb wizard, es que no se como pasar a negativo la imagen del pdf (yo realizo el pcb por fotograbado y necesito el negativo)


----------



## jackonegro (Jun 4, 2011)

Hola, alguien me podria ayudar para realizar una interrupcion que lea la linea de un archivo txt y guardarla en la memoria del pic18f4550? mi comunicacion es usb CDC.


----------



## Moyano Jonathan (Jun 4, 2011)

> Hola, alguien me podria ayudar para realizar una interrupcion que lea la linea de un archivo txt y guardarla en la memoria del pic18f4550? mi comunicacion es usb CDC.



No se lee por interrupciones, si usas una memoria SD, vas a tener que implementar el protocolo FAT16/32. En cuanto puedas leer/escribir archivos te puedo ayudar con tu consulta. Un saludo !


----------



## jackonegro (Jun 4, 2011)

Hola, gracias por la pronta respuesta, disculpa no me supe explicar yo tengo un archivo de texto (contiene coordenadas X e Y en una linea y son alrededor de 300 lineas) que trato en labview y a traves de este software envio datos al pic (linea por linea) entonces quisiera realizar una interrupcion para saber cuando el pic reciba cada linea y esta guardarla en la memoria y poder leer los datos desde ahi. creo que de esta manera podria sincronizar los datos y darle tiempo al pic de procesarlos y realizar las tareas que se requieren con los mismos.

Un saludo.


----------



## Moyano Jonathan (Jun 4, 2011)

Lo que andas buscando de manera exacta no lo podés tratar con interrupciones...debido a que USB - CDC no se maneja de esa manera...solo está implementado el polling (busqueda constante de datos). Al margen de esto podés implementar una rutina de tratamiento de datos seriales como lo hace el maestro RedPIC en su página: http://picmania.garcia-cuervo.net/picc.php#COMBUF232


----------



## alizarraga (Jun 6, 2011)

Jonathan.:
Buen Día. Soy un principiante en el tema de los PIC´s y tomé este ejemplo que publicaste y lo trato de compilar con el CCS 4.084 que conseguí en la internet, para cambiarle el PIC18F2550 al PIC18F4550 que es el que tengo.
Y me arroja unos errores de compilación tales como .:
***Error 45 "APLICACION_HID.c" Line 74[35,36]:Subscript out of range

Aunque no es único error que arroja, sino que también lo hace en.:
Line 75, 87, 88,89, 92,93, 979 98, 105,106,107,108,110, etc,etc.

Es como si no tomara algunos de los archivos de definiciones.

Y al hacer doble click sobre el erro me lleva a la línea en donde se produce tal error y esta indicando que se produce en la definición de la variable.

Podrás ayudarme a ver que puede estar pasando.?
Gracias por tu ejemplo y por tu tiempo.

Atte
Fernando Lizarraga
Córdoba
Argentina


----------



## Moyano Jonathan (Jun 6, 2011)

> Buen Día. Soy un principiante en el tema de los PIC´s y tomé este ejemplo que publicaste y lo trato de compilar con el CCS 4.084



Ahí está el error, vas a tener que compilar tu proyecto con la versión 4.114, de lo contrario no te va a funcionar. Hay muchas diferencias entre versiones del mismo compilador.

Un saludo !


----------



## lleon95 (Jun 8, 2011)

Muy util. He andado buscando esto por todos lados =)
Gracias por tu aporte


----------



## gelitojr (Jun 14, 2011)

Que tal, he leido porfin las 85 pags que tiene este tema y descargue muchos de los ejemplos. Leí también por completo la guía que esta en la primera página y comence a probar el ejemplo de aplicación. Transcribi los 2 codigos (CCS y C#) para ver que es lo que hacían y entender que funcion se realizaba, sin embargo no logré que me compilara el de C#, por lo que use los mismos archivos que vienen en el paquete y de nuevo tuve problemas con el codigo en C#. Por lo que me cambié de computadora a una con XP de 32 bit(la que uso normalmente tiene W7 de 64 bit) y la compilación por fin resultó. Después me puse a armar en protoboard el circuito que viene, con los mismos valores y todo tal cual viene indicado con la excepción de que yo uso el 18F4550. Finalmente llego la hora de la prueba, grabé el archivo .hex original del paquete y lo compilé modificando unicamente la libreria para usar el 18F4550. Entonces ya me prepare para conectar a la computadora y sorpresa! me dice que el dispositivo no es reconocido:

http://imageshack.us/photo/my-images/708/nofunciona1.png/

y me manda lo siguiente en el apartado de configuracion:

http://imageshack.us/photo/my-images/263/nofunciona2.png/

entonces lo desconecte y probe a ver si eran los cables D+ y D- los que me arojaban el error y nada. Borre el Pic y volvi a grabarlo, pero no resulto. Revisé las conexiones y no encontré error.
Entonces aqui pongo las suposiciones de lo que creo que puede estar fallando y les pido por favor que me den su opinion al respecto:

1. Cambiar el 18F4550 por un 18F2550
2. Cambiar la configuración del VID/PID (aunque leí por ahí que no debe ser ya que EasyHID funciona con estos datos provistos por Mecanique)
3. Implementar la parte del conector ICSP, ya que no la tengo en el protoboard, primero por espacio y segundo porqe según yo solamente es para evitar montar y desmontar el PIC para grabar los programas.

Espero que me puedan ayudar con este problema... desde luego yo seguiré intentando solucionar este problema, leyendo para informarme sobre lo que puede estar sucediendo.

Les agradezco a todos los que han colaborado en este Foro y sobre todo a Moyano y Meta con los manuales que me han ayudado bastante, en verdad se les agradece.


----------



## Moyano Jonathan (Jun 14, 2011)

Decime por favor que versión del compilador estás usando...tenés que usar si o si la versión 4.114 para que te funcione.


----------



## Deego (Jun 14, 2011)

Hola gelitojr.  Yo tenía al principio el mismo problema, y resulta que en mi caso era tu segunda suposición, los valores de VID/PID .  Simplemente lo que hice fue ir a la librería correspondiente, cambiar tan solo un valor en cualquiera, ya sea en el VID o en el PID (creo que cambié un 0 por un 1 o viceversa) y listo.  Al parecer a mi me creaba conflicto porque ese VID/PID ya lo utilizaba proteus en las pruebas que estaba haciendo.  Yo probé eso, y ahora me funciona a las mil maravillas, tanto que era para proyecto para la universidad y está funcionando full.  Claro está, que yo lo hice con el 18f2550 pero no tienen muchas diferencias.


----------



## gelitojr (Jun 14, 2011)

@Moyano: Respecto a la versión del compilador que uso, es la 4.108  voy a tratar de conseguir la versión que me comentas (4.114) y si no la consigo pues me tirare a un pozo  jeje te agradezco la aclaración en ese sentido.

@Deego: mmm si se me ocurrió poner los que tiene microchip, solo que no lo hice por lo que comenté antes. Me gustaría saber a que te refieres con cambiarle cualquier número. Por ejemplo: el PID en el archivo de CCS es 0x1781 y el VID, 0x07D0. Me sugieres que a cualquiera de esos le cambie cualquier digito ?, ahora ese mismo digito tendría que modificarlo en el archivo de C#,no es así? 

Otro detalle que se me paso decir es que estoy corriendo la aplicación de C# en visual 2010 profesional pero creo que no hay inconveniente respecto a eso... y en ese sentido, quisiera saber que es mejor o que se recomienda más, el C# o el VB ? ya que aun no he probado esos ejemplos de VB (los de los Leds y reles) en protoboard ni en codigo y pienso hacerlo para ver que no sean las benditas conexiones, que aunqe ya las revise varias veces pueden ser el factor de falla.

Saludos y gracias!


----------



## Moyano Jonathan (Jun 15, 2011)

> @Deego: mmm si se me ocurrió poner los que tiene microchip, solo que no lo hice por lo que comenté antes. Me gustaría saber a que te refieres con cambiarle cualquier número. Por ejemplo: el PID en el archivo de CCS es 0x1781 y el VID, 0x07D0. Me sugieres que a cualquiera de esos le cambie cualquier digito ?, ahora ese mismo digito tendría que modificarlo en el archivo de C#,no es así?



Tenés que usar si o sí los descriptores que se usan en mi proyecto, el driver que se usa en C# detecta solo el VID y PID que se describen en ese proyecto.




> Otro detalle que se me paso decir es que estoy corriendo la aplicación de C# en visual 2010 profesional pero creo que no hay inconveniente respecto a eso... y en ese sentido, quisiera saber que es mejor o que se recomienda más, el C# o el VB ? ya que aun no he probado esos ejemplos de VB (los de los Leds y reles) en protoboard ni en codigo y pienso hacerlo para ver que no sean las benditas conexiones, que aunqe ya las revise varias veces pueden ser el factor de falla.
> 
> Saludos y gracias!



Mis pruebas están basadas en Vstudio 2008 ..no en el 2010. Puede ser que tengas un problema en el framework.


----------



## gelitojr (Jun 15, 2011)

Que tal,

pues voy a intentar con todo idéntico, es decir: con el 18F2550, visual 2008, Windows XP, CCS 4.114 y mismo circuito. A ver si el problema es la configuración que estoy usando (visual 2010, ccs 4.108 y 18f4550). Una cosa moyano... si grabe el .hex que viene tal cual en tu proyecto de aplicación del manual usb hid con c#, porque necesitaría la versión 4.114 de CCS, si no la compilé ? solo es una duda... en fin, ya comentaré como me fue probando con la configuración original. Gracias!


----------



## wampiro (Jun 15, 2011)

hola, soy nuevo y en la escuela me pidieron seguir tu manual como practica para mi calificacion, tengo el codigo bien pero tengo una duda:
¿Se tiene que definir In_handle como UInt32 o es error mio que me aparezca "In_handle no aparece en el contexto actual"?
si me pudieras responder mi duda te lo agradeceria


----------



## Moyano Jonathan (Jun 15, 2011)

> ¿Se tiene que definir In_handle como UInt32 o es error mio que me aparezca "In_handle no aparece en el contexto actual"?


 Es una variable y tiene que estar definida como tal. En este caso es del tipo UInt32.

Si lees en el manual , en donde está explicado el software de control, aparece como va definido.

Un saludo !

*gelitojr*


> Una cosa moyano... si grabe el .hex que viene tal cual en tu proyecto de aplicación del manual usb hid con c#, porque necesitaría la versión 4.114 de CCS, si no la compilé ?



Hay sutiles diferencias en las funciones de control y las tablas de descriptores. También yo incluí algunas modificaciones en dichas tablas como se muestra en los descriptores del ejemplo que viene con el manual.


----------



## alizarraga (Jun 16, 2011)

En principio, tal cual baje el proyecto propuesto por Jonathan, en el firmware del PIC, sólo le modifiqué el PIC18F2550 a PIC18F4550, y luego lo compilé tal cual me aconsejó Jonathan en su respuesta a mi consulta, con el  CCS 4.114 y compiló correctamente.
Con respecto al proyecto de Visual C#, tengo Visual 2010 y cuando abrí la solución con el VC2010 , me sugirió convertirlo a VC2010 en forma automática. Luego lo compilé con el VC2010 y lo probé.
Todo funciona bien.
Estoy trabajando en una portable con Win 7 32bits.
Afortunadamente no tuve más inconvenientes.
Gracias por el aporte Jonathan y por contestar rápidamente a mi consulta.
A todos los que participan de este hilo, un cordial saludo.

Atte
Fernando Lizarraga
Córdoba
Argentina


----------



## Moyano Jonathan (Jun 16, 2011)

> Todo funciona bien.
> Estoy trabajando en una portable con Win 7 32bits.
> Afortunadamente no tuve más inconvenientes.
> Gracias por el aporte Jonathan y por contestar rápidamente a mi consulta.
> A todos los que participan de este hilo, un cordial saludo.



Me alegro mucho de haberte ayudado, espero que salgas adelante con tu proyecto. Un saludo !


----------



## wampiro (Jun 17, 2011)

Hola que tal, tengo otra vez varias dudas, como es mi primer proyecto con visual c# es un poco complicado para mi, bueno mi duda son:

*¿Es necesario que este conectado el dispositivo para que el programa funcione? lo que pasa es que cuando lo corro sin dispositivo y muevo una barra PWM me sale este error "No se puede cargar el archivo DLL 'mcHID.dll': No se puede encontrar el módulo especificado. (Excepción de HRESULT: 0x8007007E)", ya agregue mcHID.dll al proyecto y a la carpeta donde esta.

*¿Como se pone el IN 1,IN 2, el min y el max? no viene en el tuto ya lo busque 

*En el codigo de las barras PWM en el tuto aparece esto:
"private void PWM_CONTROL_1_ValueChanged"
pero en mi codigo me aparece asi:
"private void PWM_CONTROL_1_Scroll"
¿Con cual de los 2 lo dejo?


----------



## Moyano Jonathan (Jun 17, 2011)

> *¿Es necesario que este conectado el dispositivo para que el programa funcione? lo que pasa es que cuando lo corro sin dispositivo y muevo una barra PWM me sale este error "No se puede cargar el archivo DLL 'mcHID.dll': No se puede encontrar el módulo especificado. (Excepción de HRESULT: 0x8007007E)", ya agregue mcHID.dll al proyecto y a la carpeta donde esta.


 Es un error común, tenés que agregar la .dll a la carpeta System32 de Windows. Con respecto a si el dispositivo tiene que estar conectado o no: El control por USB tiene 2 partes o elementos principales, el dispositivo USB (PIC) y el programa de control en visual C#.
Por lo antes dicho, es imprescindible que conectes el dispositivo para probar el programa.



> *¿Como se pone el IN 1,IN 2, el min y el max? no viene en el tuto ya lo busque



No entiendo tu pregunta, por favor sé mas específico.



> "private void PWM_CONTROL_1_ValueChanged"
> pero en mi codigo me aparece asi:
> "private void PWM_CONTROL_1_Scroll"
> ¿Con cual de los 2 lo dejo?



A fines prácticos es lo mismo, pero podes usar "private void PWM_CONTROL_1_ValueChanged".


----------



## wampiro (Jun 18, 2011)

Muchas Gracias, el programa ya esta completo y funcional, lo de IN 1,IN 2, min y max ya vi que eran labels solo para darle mejor apariencia =P.
Gran tutorial, te felicito.


----------



## Moyano Jonathan (Jun 18, 2011)

> Muchas Gracias, el programa ya esta completo y funcional, lo de IN 1,IN 2, min y max ya vi que eran labels



Menos mal, espero que salgas adelante con tu proyecto.

Un saludo !


----------



## wampiro (Jun 19, 2011)

¿Qué archivo hay que grabarle al pic? APLICACION_HID.hex de la carpeta "Aplicación USB CCS" o Detección del HOST_CDC.hex del ejercicio_n2??

Otra cosa, le puse de firmware el del ejercicio 2 y si prende con el de conexion en caliente pero con el de USB HID no detecta que el dispositivo esta conectado, alguna idea de por que no manda nada :'(

Una cosa mas, el VID de mi pic es 04d8 y el PID es 000B
lo pase a decimal y me salio VID 1240 y PID 11
cambie de easyHID.cs:
        public const UInt32 VENDOR_ID = 6017;
        public const UInt32 PRODUCT_ID = 200;
por:
        public const UInt32 VENDOR_ID = 1240;
        public const UInt32 PRODUCT_ID = 11;
para ver si asi funcionaba, pero aun asi no detecta el dispositivo, mira te dejo mi codigo:

```
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Diagnostics;             //Mensajes referentes a advertencias, errores, etc.
using System.Windows.Forms;
using System.Runtime.InteropServices; //Clase para poder comunicarnos con el dll.
using MecaniqueUK;

namespace Visual_C_sharp__HID_Demo
{
    public partial class USB_HID : Form
    {//Variables globales declaradas por el usuario
        UInt32 controlador;
        UInt32 ADCValue1;
        UInt32 ADCValue2;
        public USB_HID()
        {
            InitializeComponent();
        }
        protected override void WndProc(ref Message message)
        {
            //Interceptamos los mensajes de windows.
            if (message.Msg == EasyHID.WM_HID_EVENT) //Si ha ocurrido algún evento...
            { //Intercepta el mensaje y opera segun el valor recibido...	
                switch (message.WParam.ToInt32())
                {
                    case EasyHID.NOTIFY_PLUGGED:
                        //Se ha conectado un dispositivo.
                        Dispositivo_Conectado((UInt32)message.LParam.ToInt32());
                        break;
                    case EasyHID.NOTIFY_UNPLUGGED:
                        //Se ha desconectado un dispositivo.
                        Dispositivo_Desconectado((UInt32)message.LParam.ToInt32());
                        break;
                    case EasyHID.NOTIFY_READ:
                        //Hay datos en el buffer de entrada.
                        Lee_Dispositivo((UInt32)message.LParam.ToInt32());
                        break;
                }
            }
            base.WndProc(ref message);
        }
        private void Dispositivo_Conectado(UInt32 handle)
        {
            if (EasyHID.GetVendorID(handle) == EasyHID.VENDOR_ID && EasyHID.GetProductID(handle) == EasyHID.PRODUCT_ID)
            {
                //Si el handler ha encontrado un dispositivo conectado que coincida con el VID/PID
                //Declarado en el programa...
                EasyHID.SetReadNotify(handle, true); //Activa el sistema de notificacion para saber
                //cuando se reciben datos desde el dispositivo.

                controlador = handle;                //Asignamos a controlador el handle de salida.
            }
        }
        private void Dispositivo_Desconectado(UInt32 handle)
        {
            if (EasyHID.GetVendorID(handle) == EasyHID.VENDOR_ID && EasyHID.GetProductID(handle) == EasyHID.PRODUCT_ID)
            {
                deshabilita_controles();
                MENSAJES_USB.Items.Add("Dispositivo USB Desconectado.");
                CONECTAR_DISPOSITIVO.BackColor = Color.Red;
                CONECTAR_DISPOSITIVO.ForeColor = Color.White;
                CONECTAR_DISPOSITIVO.Text = "CONECTAR DISPOSITIVO";
                EasyHID.Disconnect();
            }
        }
        private void Lee_Dispositivo(UInt32 In_handle)
        {
            byte[] BufferINP = new byte[EasyHID.BUFFER_IN_SIZE]; //Declaramos el buffer de entrada.
            if ((EasyHID.Read(In_handle, out BufferINP)) == true) //Si hay datos los procesamos.
            {  //Segun se haya presionado un pulsador, indicara el evento de forma grafica y textual.
                if (BufferINP[1] == 0x01)
                {
                    IN_DIGITAL_1.BackColor = Color.GreenYellow;
                    MENSAJES_USB.Items.Add("Boton 1 Presionado.");
                }
                else { IN_DIGITAL_1.BackColor = Color.SeaGreen; }

                if (BufferINP[2] == 0x01)
                {
                    IN_DIGITAL_2.BackColor = Color.GreenYellow;
                    MENSAJES_USB.Items.Add("Boton 2 Presionado.");
                }
                else { IN_DIGITAL_2.BackColor = Color.SeaGreen; }

                if (BufferINP[3] == 0x01)
                {
                    IN_DIGITAL_3.BackColor = Color.GreenYellow;
                    MENSAJES_USB.Items.Add("Boton 3 Presionado.");
                }
                else { IN_DIGITAL_3.BackColor = Color.SeaGreen; }

                if (BufferINP[4] == 0x01)
                {
                    IN_DIGITAL_4.BackColor = Color.GreenYellow;
                    MENSAJES_USB.Items.Add("Boton 4 Presionado.");
                }
                else { IN_DIGITAL_4.BackColor = Color.SeaGreen; }
            }
            ADCValue1 = (uint)(BufferINP[5] << 8 + BufferINP[6]);
            ADCValue2 = (uint)(BufferINP[7] << 8 + BufferINP[8]);
            ADC1_VALUE.Value = (int)ADCValue1;
            ADC2_VALUE.Value = (int)ADCValue2;
        }
        private void CONECTAR_DISPOSITIVO_Click(object sender, EventArgs e)
        {
            habilita_controles();
            try
            {
                EasyHID.Connect(Handle); //conectamos la aplicacion al controlador
                if (EasyHID.IsAvailable(EasyHID.VENDOR_ID, EasyHID.PRODUCT_ID) == true)
                { //Si el dispositivo está conectado
                    MENSAJES_USB.Items.Add("Dispositivo conectado.");
                    CONECTAR_DISPOSITIVO.Text = "DISPOSITIVO CONECTADO";
                    CONECTAR_DISPOSITIVO.BackColor = Color.GreenYellow;
                    CONECTAR_DISPOSITIVO.ForeColor = Color.Black;
                }
                else
                {
                    MENSAJES_USB.Items.Add("Dispositivo no encontrado, controlador conectado.");
                    CONECTAR_DISPOSITIVO.Text = "CONTROLADOR CONECTADO";
                    CONECTAR_DISPOSITIVO.BackColor = Color.Blue;
                    CONECTAR_DISPOSITIVO.ForeColor = Color.White;
                }
            }//En caso de no poder enlazar al controlador
            catch { MENSAJES_USB.Items.Add("Imposible conectar al controlador."); }

        }
        private void OUT_DIGITAL_1_Click(object sender, EventArgs e)
        {
            byte[] BufferOUT = new byte[EasyHID.BUFFER_OUT_SIZE];
            BufferOUT[0] = 0;    //Report ID
            BufferOUT[1] = 0x0A; //Primero enviamos un comando de control al dispositivo.
            //0x0A Conando de Salidas.
            BufferOUT[2] = 0x10; //Luego enviamos los datos de control de los LEDs.
            EasyHID.Write(controlador, BufferOUT); //Envia los datos.
            MENSAJES_USB.Items.Add("Cambia estado: Salida 1.");
        }
        private void OUT_DIGITAL_2_Click(object sender, EventArgs e)
        {
            byte[] BufferOUT = new byte[EasyHID.BUFFER_OUT_SIZE];
            BufferOUT[0] = 0;    //Report ID
            BufferOUT[1] = 0x0A; //Primero enviamos un comando de control al dispositivo.
            //0x0A Conando de Salidas.
            BufferOUT[2] = 0x20; //Luego enviamos los datos de control de los LEDs.
            EasyHID.Write(controlador, BufferOUT); //Envia los datos.
            MENSAJES_USB.Items.Add("Cambia estado: Salida 2.");
        }
        private void OUT_DIGITAL_3_Click(object sender, EventArgs e)
        {
            byte[] BufferOUT = new byte[EasyHID.BUFFER_OUT_SIZE];
            BufferOUT[0] = 0;    //Report ID
            BufferOUT[1] = 0x0A; //Primero enviamos un comando de control al dispositivo.
            //0x0A Comando de Salidas.
            BufferOUT[2] = 0x30; //Luego enviamos los datos de control de los LEDs.
            EasyHID.Write(controlador, BufferOUT); //Envia los datos.
            MENSAJES_USB.Items.Add("Cambia estado: Salida 3.");
        }
        private void OUT_DIGITAL_4_Click(object sender, EventArgs e)
        {
            byte[] BufferOUT = new byte[EasyHID.BUFFER_OUT_SIZE];
            BufferOUT[0] = 0;    //Report ID
            BufferOUT[1] = 0x0A; //Primero enviamos un comando de control al dispositivo.
            //0x0A Comando de Salidas.
            BufferOUT[2] = 0x40; //Luego enviamos los datos de control de los LEDs.
            EasyHID.Write(controlador, BufferOUT); //Envia los datos.
            MENSAJES_USB.Items.Add("Cambia estado: Salida 4.");
        }
        private void PWM_CONTROL_1_ValueChanged(object sender, EventArgs e)
        {
            byte[] BufferOUT = new byte[EasyHID.BUFFER_OUT_SIZE];
            BufferOUT[0] = 0;    //Report ID
            BufferOUT[1] = 0x0B; //Primero enviamos un comando de control al dispositivo.
            //0x0B Comando de Salidas.
            BufferOUT[3] = Convert.ToByte(PWM_CONTROL_1.Value);
            EasyHID.Write(controlador, BufferOUT);
        }
        private void PWM_CONTROL_2_ValueChanged(object sender, EventArgs e)
        {
            byte[] BufferOUT = new byte[EasyHID.BUFFER_OUT_SIZE];
            BufferOUT[0] = 0;    //Report ID
            BufferOUT[1] = 0x0C; //Primero enviamos un comando de control al dispositivo.
            //0x0C Comando de Salidas.
            BufferOUT[4] = Convert.ToByte(PWM_CONTROL_2.Value);
            EasyHID.Write(controlador, BufferOUT);
        }
        private void USB_HID_Load(object sender, EventArgs e)
        {
            timer1.Enabled = true;
            deshabilita_controles();
        }
        private void USB_HID_FormClosed(object sender, FormClosedEventArgs e)
        {
            EasyHID.Disconnect();
        }
        private void habilita_controles()
        {
            OUT_DIGITAL_1.Enabled = true;
            OUT_DIGITAL_2.Enabled = true;
            OUT_DIGITAL_3.Enabled = true;
            OUT_DIGITAL_4.Enabled = true;
            PWM_CONTROL_1.Enabled = true;
            PWM_CONTROL_2.Enabled = true;
            IN_DIGITAL_1.Enabled = true;
            IN_DIGITAL_2.Enabled = true;
            IN_DIGITAL_3.Enabled = true;
            IN_DIGITAL_4.Enabled = true;
            ADC1_VALUE.Enabled = true;
            ADC2_VALUE.Enabled = true;
            MENSAJES_USB.Enabled = true;
        }
        private void deshabilita_controles()
        {
            OUT_DIGITAL_1.Enabled = false;
            OUT_DIGITAL_2.Enabled = false;
            OUT_DIGITAL_3.Enabled = false;
            OUT_DIGITAL_4.Enabled = false;
            PWM_CONTROL_1.Enabled = false;
            PWM_CONTROL_2.Enabled = false;
            IN_DIGITAL_1.BackColor = Color.Gray;
            IN_DIGITAL_1.Enabled = false;
            IN_DIGITAL_2.BackColor = Color.Gray;
            IN_DIGITAL_2.Enabled = false;
            IN_DIGITAL_3.BackColor = Color.Gray;
            IN_DIGITAL_3.Enabled = false;
            IN_DIGITAL_4.BackColor = Color.Gray;
            IN_DIGITAL_4.Enabled = false;
            ADC1_VALUE.Value = 0;
            ADC1_VALUE.Enabled = false;
            ADC2_VALUE.Value = 0;
            ADC2_VALUE.Enabled = false;
            MENSAJES_USB.Enabled = false;
        }
        private void salirToolStripMenuItem_Click(object sender, EventArgs e)
        {
            EasyHID.Disconnect();
            this.Close();
        }
        private void acercaDeHIDToolStripMenuItem_Click(object sender, EventArgs e)
        {
            MessageBox.Show("USB HID en Visual C#\n\n Version Beta\n\n" +
                            "Basado en el tuto de Moyano Jonathan\n" +
                            "Creador del programa Erick Santiago Gómez (Wampiro)\n" +
                            "Equipo con Atl Odin Vanegas Santoyo (Arbol)\n" +
                            "Diseño PCB Angel Martinez Zabala (Fraile, Abelardo)\n" +
                            "Carrera Técnico en mecatrónica     Grupo 201\n" +
                            "CBT No.1 \"Dr. Donato Alarcón Segovia\"", "Acerca del Programa:",
                            MessageBoxButtons.OK, MessageBoxIcon.Information);
        }
        private void webDelProyectoToolStripMenuItem_Click(object sender, EventArgs e)
        {
            MessageBox.Show("No hay web por ahora ¬¬ no se vaya a enojar el profe :P", "Web del Proyecto:",
                MessageBoxButtons.OK, MessageBoxIcon.Information);
        }
        private void manualDeUsuarioToolStripMenuItem_Click(object sender, EventArgs e)
        {
            try
            {
                Process.Start("Control de dispositivos USB.pdf");
            }
            catch (Win32Exception)
            {
                MessageBox.Show("No se encuentra el archivo \"Control de dispositivos USB.pdf\". \n" +
                                "asegurate que el nombre es correcto y/o se \n" +
                                "encuentra en la misma ubicación que la aplicación.\n", "Aviso:",
                                MessageBoxButtons.OK, MessageBoxIcon.Warning);
            }
        }
        private void timer1_Tick(object sender, EventArgs e)
        {
            statusStrip1.Items[0].Text = DateTime.Now.ToLongTimeString();
        }
        private void toolTip1_Popup(object sender, PopupEventArgs e)
        {
            MENSAJE_TOOL.SetToolTip(this.CONTENEDOR_ANALOGICAS,
            "Barras de progreso que muestran el valor medido en el CAD.");
            MENSAJE_TOOL.SetToolTip(this.CONTENEDOR_PWM,
            "Control en el cual variamos el ciclo de trabajo de los PWM.");
            MENSAJE_TOOL.SetToolTip(this.CONTENEDOR_SALIDAS,
            "Control en el cual cambiamos el estado logico de los LEDs de salida.");
            MENSAJE_TOOL.SetToolTip(this.CONTENEDOR_IN_DIGITALES,
            "Control que muestra el estado de los diferentes pulsadores.");
            MENSAJE_TOOL.SetToolTip(this.CONECTAR_DISPOSITIVO,
            "Boton que nos permite enlazar el dispositivo al controlador.");
            MENSAJE_TOOL.SetToolTip(this.MENSAJES_USB,
            "En está ventana van apareciendo los diferentes sucesos ocurridos en la aplicación.");
        }
    }
}
```

Por Ultimo como puedo mandar las señales al COM1???

Eso es todo
Porfavor ayuda


----------



## Moyano Jonathan (Jun 19, 2011)

> ¿Qué archivo hay que grabarle al pic? APLICACION_HID.hex de la carpeta "Aplicación USB CCS" o Detección del HOST_CDC.hex del ejercicio_n2??


 No entiendo tu consulta, va a depender que tipo de conexión quieras hacer: CDC o HID.



> Otra cosa, le puse de firmware el del ejercicio 2 y si prende con el de conexion en caliente pero con el de USB HID no detecta que el dispositivo esta conectado, alguna idea de por que no manda nada :'(



Esto es debido a que has modificado algo en el código , no estás usando la misma versión que usé yo para compilar el código (v4.023) o tenés un problema de drivers en la PC.. hay muchas variantes al problema que me planteas.



> Una cosa mas, el VID de mi pic es 04d8 y el PID es 000B
> lo pase a decimal y me salio VID 1240 y PID 11


 No son decimales , son enteros de 32 bits. Si lo cambias el funcionamiento es erróneo.

*el problema de detección:*Puede estar dado por varias razones que te detallo a continuación (las más usuales). Puede haber más razones que no te especifico ...pero lo vas a tener que investigar:

- Mala gestión de la comunicación USB. Debido principalmente a la modificación errónea del código o utilización de un compilador viejo.
En mi manual utilizo el compilador V4.114 por lo que te vas a tener que conseguir esa versión.

- Errores hardware relacionados con el PIC.....mala alimentación, capacitor Vusb erróneo, etc....lo tenés que investigar.

- Errores en la PC debido a los drivers....controlador USB dañado...etc.




> Por Ultimo como puedo mandar las señales al COM1???




No entiendo la razón de la consulta, se más específico !


----------



## wampiro (Jun 19, 2011)

Moyano Jonathan dijo:


> va a depender que tipo de conexión quieras hacer: CDC o HID.


Quiero hacer HID (en realidad solo debo hacer que prenda un led del entrenador usando el programa que acabo de hacer con base en el tutorial), porque tengo entendido que CDC es como emular el puerto serie, ¿¿entonces tengo que usar el archivo "APLICACION_HID.hex" de la carpeta "Aplicación USB CCS" para hacerlo HID??



Moyano Jonathan dijo:


> Esto es debido a que has modificado algo en el código , no estás usando la misma versión que usé yo para compilar el código (v4.023) o tenés un problema de drivers en la PC.. hay muchas variantes al problema que me planteas.


Estoy usando la misma version que tu (v4.114) y no he modificado el codigo, use los .hex del ejercicio_n2 y del hex que viene en el tutorial.



Moyano Jonathan dijo:


> No son decimales , son enteros de 32 bits. Si lo cambias el funcionamiento es erróneo.


Entonces lo tengo que dejar como VID 6017 y PID 2000??



Moyano Jonathan dijo:


> *El problema de detección:*Puede estar dado por varias razones que te detallo a continuación (las más usuales). Puede haber más razones que no te especifico ...pero lo vas a tener que investigar:


Esto lo descarto xq ya vi que el entrenador si sirve.

Creo que ya se de donde podria venir el error, gracias por responder Moyano.


----------



## Moyano Jonathan (Jun 19, 2011)

> ¿¿entonces tengo que usar el archivo "APLICACION_HID.hex" de la carpeta "Aplicación USB CCS" para hacerlo HID??


 Estás entendiendo mal el concepto. El tema es de la siguiente manera:

1º - Decidís si usar HID o CDC.
2º - Creas la aplicación en CCS, en base a las funciones de control y los descriptores de cada tipo de comunicación.
3º - Creas la aplicación de control para la PC. En HID, usas una librería con las funciones de control ...por ejemplo HID.dll. En cambio para CDC, usas el control de puerto serie que te viene junto con el editor de programación.
4º - Cargas tu .hex al micro con la aplicación de CCS. Luego conectas el micro al puerto USB / instalás los driver's.
5º - Haces las pruebas correspondientes.


----------



## adrimadeo (Jun 22, 2011)

hola Moyano Jonathan, soy nuevo en el foro y en el tema d los pics con usb; queria saber si me podes dar una mano con el tema d mandar datos a traves del usb para en el pic poder guardarlos en la eeprom. por favor lo necesito en vb6. desde ya muchas gracias.


----------



## MOTRIL (Jun 26, 2011)

necesito implementar un voltimetro con pic en  ccs comunicacion usb y mostrar el voltaje en un interfaz creado en c# en el pc y crear un panel de control que detecte que puerto ha sido activado en el pic


----------



## ldswfyl (Jun 27, 2011)

Muchas gracias por la ayuda que nos brindan, de no ser por ustedes seria muy dificil iniciarnos en el bello mundo de la programacion


Saludos LdSwFyL


----------



## Moyano Jonathan (Jun 27, 2011)

> necesito implementar un voltimetro con pic en ccs comunicacion usb y mostrar el voltaje en un interfaz creado en c# en el pc y crear un panel de control que detecte que puerto ha sido activado en el pic


 Existe un proyecto exactamente como el que mencionas, pero hecho en VB 6.0 y con programación para el PIC en ASM...buscalo en la web.



> Mojano Jonathan, leo todos los hilos del foro en lo posible, pero tengo escaso tiempo, trabajo en una fabrica textil, y estoy terminando ing electronica, es muy dificil,. dentro de unas semanas rindo control discreto en el tiempo con el clasico ogata. y estoy repasando,. ya aprobe control continuo en el tiempo con el clasico ingenieria de control moderna con el ogata. todas estas ultimas las materias, la estoy rindiendo libres y es muy dificil por mi trabajo.
> yo programe para la fabrica ,no para mi los 16f877, ya obsoletos con la llegada de los de la linea 18. yo programo en assembler.
> 
> pero muy interesante este hilo como todos los del foro.
> ...



Hola como estás. El tema de la programación en ASM...no te la recomiendo ya principalmente por que los compiladores y vienen bastante optimizados y se consiguen muy facilmente en la Web. Si vas a empezar con la serie PIC18F..te recomiendo el PIC18F2550 o el PIC18F4550 que tiene más cantidad de pines.



> Muchas gracias por la ayuda que nos brindan, de no ser por ustedes seria muy dificil iniciarnos en el bello mundo de la programacion
> 
> 
> Saludos LdSwFyL



Muchas gracias por el comentario.


----------



## borodelostoldos (Jun 28, 2011)

> Los ejemplos que iré desarrollando van aplicados a las clases CDC (Comunication device class) y el control mediante la api de windows proporcionada por microchip mpusbapi.dll (bulk transfer).



Pregunta: cual es la diferencia entre el protocolo HDI y bulk. Es indistinto usar uno y otro? En que caso se utiliza cada uno? 
El el proyecto del Joistik usas HDI y me gustaría conocer las diferencias y porque tomaste esa decisión.
Muchas gracias!


----------



## Moyano Jonathan (Jun 28, 2011)

> Pregunta: cual es la diferencia entre el protocolo HDI y bulk. Es indistinto usar uno y otro? En que caso se utiliza cada uno?


 En cuanto a comunicaciones la velocidad. HID hasta 64Kbps (teórico) y 1.2 Mbps en Bulk (Teórico). En casi todos los casos podés usar HID....casi nunca vas a usar un enlace que requiera más de 64Kbps...en velocidad. Bulk (No está totalmente implementado en CCS...si en C18) Sirve para transmisiones que usen muy alta tasa de datos...



> El el proyecto del Joistik usas HDI y me gustaría conocer las diferencias y porque tomaste esa decisión.
> Muchas gracias!


 Usé HID debido a que es el standar y que además no transferís grandes cantidades de datos.

Un saludo !


----------



## gelitojr (Jun 30, 2011)

Que tal, pues soy yo de nuevo. Aun sigo con problemas ya que no puedo tener comunicacion con el PIC desde la PC. Uso el 18f2550, compilo en CCs 4.114, el código es de visual C# 2008 y corro la aplicacion en Windows XP de 32 bit... y nada  anteriormente me detectaba que no estaba bien conectado, pero era un problema de conexión, lo resolví y ahora no hace nada, no detecta que esté conectado el PIC. 
No se si pueda ser el problema la conexión, ya que use un conector hembra de USB al que le soldé las señales del PIC y de ahí conecté con la PC con un cable, sin embargo no pasó nada. Ahora intento con un cable USB que corté, para conectar las señales del PIC directamente a cada alambre interno del cable pero aun no logro comunicarme. 
Además, estuve trabajando con algunos ejemplos que vi por aquí para hacer parpadear un led y me encontré con algo curioso, ya que la frecuencia a la que se suponía debía de encender y apagar era curiosamente 48 veces más que la que indicaba en la programación y la única solución que encontre fue variar el parametro "use delay(clock = 48000000)" por "use delay(clock = 1000000)". Esto lo digo porque tal vez no haya comunicación por la frecuencia que no se logra en el PIC, la verdad me pareció muy raro.
Espero que me puedan ayudar, porque se me acaban las ideas jeje. Les agradezco cualquier comentario. Saludos!


----------



## kYc0o (Jul 1, 2011)

Hola! Buen día a todos.
Usando la funcionalidad USB me topo con un problema que no sé si a todos les ha tocado. Se trata de la cantidad de corriente que usa el PIC al funcionar en modo USB. Según mediciones que he hecho la máxima corriente que he observado es de 32mA aproximadamente, lo que necesito es ver si hay alguna manera de hacer que la funcionalidad USB sólo se active cuando esté conectado el USB, ya que en mi aplicación ocupo que sea de muy bajo consumo de energía, además de que el pic permanece dormido y despierta cada medio minuto. Estoy pensando en directivas #IF - #ENDIF para reacomodar los fuses, ya que cuando quito los que ocupa el USB el consumo de corriente baja hasta los 6mA. Si alguien tuviera alguna idea se lo agradeceré ;-)

Saludos!


----------



## Moyano Jonathan (Jul 2, 2011)

> No se si pueda ser el problema la conexión, ya que use un conector hembra de USB al que le soldé las señales del PIC y de ahí conecté con la PC con un cable, sin embargo no pasó nada. Ahora intento con un cable USB que corté, para conectar las señales del PIC directamente a cada alambre interno del cable pero aun no logro comunicarme.


 Por favor analizá el hardware que estás usando, puede ser que el problema radique ahí. Te recomiendo que armes el entrenador que está adjunto al manual, para que te puedas guiar en tu diseño.



> Además, estuve trabajando con algunos ejemplos que vi por aquí para hacer parpadear un led y me encontré con algo curioso, ya que la frecuencia a la que se suponía debía de encender y apagar era curiosamente 48 veces más que la que indicaba en la programación y la única solución que encontre fue variar el parametro "use delay(clock = 48000000)" por "use delay(clock = 1000000)"



Tiene que ser si o si "use delay(clock = 48000000)" caso contrario no funcionará. Antes de modificar el código que muestro en mi aplicación, te recomiendo mires su estructura para no perderte al momento de modificarlo. En versiones futuras de mi manual seré más claro en su descripción pero no es dificil guiarte.
Ahora si es el primer proyecto que afrontas con este protocolo de comunicación, te recomiendo que leas más al respecto.



> Hola! Buen día a todos.
> Usando la funcionalidad USB me topo con un problema que no sé si a todos les ha tocado. Se trata de la cantidad de corriente que usa el PIC al funcionar en modo USB


 La corriente se programa en los descriptores de dispositivo, en todos mis ejemplos uso un descriptor para 100mA max. Teóricamente el bus puede entregar hasta 500mA ...pero no es recomendable usar más de 1/2 de la capacidad máxima de corriente...por un tema de hardware propio del PC/Notebook que estés usando.



> lo que necesito es ver si hay alguna manera de hacer que la funcionalidad USB sólo se active cuando esté conectado el USB,


 Eso lo hace de forma transparente al programador, no hace falta tocar nada.



> Estoy pensando en directivas #IF - #ENDIF para reacomodar los fuses


 Los fuses no son configurables en tiempo de aplicación , documentate sobre el tema.


----------



## kYc0o (Jul 4, 2011)

Muchas gracias Moyano por tu pronta respuesta.
Creo que no me expliqué muy bien sobre el problema que estoy teniendo. Estoy utilizando el pic en modo USB - CDC para cargarle datos mediante la computadora, no tengo ningun problema en que el PIC me consuma mucha corriente (como tu comentaste, hasta 100mA) mientras lo conecto al puerto USB, más bien lo que me gustaría es que esos 32mA no se consuman cuando lo tengo en "modo de operación", en el cual está conectado a una fuente sin transformador de muy baja potencia (alrededor de 50mA máximos). En la documentación del CCS vienen las funciones para inicializar el USB pero no encontré ninguna respecto a "apagar" el USB. De cualquier manera creo que incrementaré el tamaño de la fuente para que eso no sea un problema, aunque el espacio que ocupa aumenta bastante.

Saludos!


----------



## Deego (Jul 13, 2011)

Moyano tu trabajo de "PIC 18F2550 y USB desarrollo y aplicaciones" fue de gran ayuda para mi tesis de grado, te voy a poner de referencia respetando los debidos derechos de autor.  Ese lo publicaste en el 2010 cierto?? necesito esa fecha para la cita bibliográfica.  Muchas Gracias!


----------



## Moyano Jonathan (Jul 13, 2011)

Luego te paso los datos , un saludo !


----------



## gongonni (Jul 20, 2011)

Hola, Hace varias semanas que empecé con el USB. Lo entiendo todo  bastante bien, pero no puedo avanzar debido a que el PC no me reconoce  el PIC. Si me pudieras hechar una mano y resolver alguna duda estaría  agradecidisimo! pues estoy atrancado y ya no sé qué hacer.

El PC no me reconoce el dispositivo. Al menos, detecta que algo está conectado.
¿Los drivers para el PC del PIC, son solo para establecer un puerto COM  virtual? Es decir, si uso el PIC en modo CDC, los necesitaria. Pero si  uso el PIC en modo HID, ¿tambien los necesitaria?

¿Qué drivers deberia usar si tengo Windows 7? ¿Dónde se modifica el VID i  PID en el microcontrolador? ¿Puede ser problema de esto?

Mil gracias de antemano! Me ha sorprendido mucho éste post. Introducís a  la gente al USB de modo muy práctico. Yo primero queria ver el USB y  hacer el programa en Visual C. Pero parece que me lo dais a modo de  tutorial. ESTO VALE ORO!  Gracias a vosotros!


----------



## Moyano Jonathan (Jul 20, 2011)

> Lo entiendo todo  bastante bien, pero no puedo avanzar debido a que el PC no me reconoce  el PIC.


Es un problema muy comentado en el foro y se puede deber a muchos casos , principalmente relacionados con el hardware que estés usando para probar tus programas.
Revisá los capacitores del cristal, el capacitor Vusb, la configuración de los fuses, los pines D+ y D- , etc.
SI detectas que no es problema del hardware del dispositivo, puedes tener conflictos con los controladores USB de tu PC....y ahí lo único que soluciona el problema por lo general es reinstalar el sistema operativo.



> ¿Los drivers para el PC del PIC, son solo para establecer un puerto COM virtual? Es decir, si uso el PIC en modo CDC, los necesitaria. Pero si uso el PIC en modo HID, ¿tambien los necesitaria?



Los drivers siempre son necesarios tanto en CDC, HID y Bulk.



> ¿Qué drivers deberia usar si tengo Windows 7? ¿Dónde se modifica el VID i PID en el microcontrolador? ¿Puede ser problema de esto?



Si el problema puede llegar a venir por ese lado. Yo he probado todos los programas para que funcionen con un VID/PID determinado. Esto es por que el driver para la PC venía configurado de esa manera y no toqué nada.
Conclusión: NO modifiques el VID/PID.



> Mil gracias de antemano! Me ha sorprendido mucho éste post. Introducís a la gente al USB de modo muy práctico. Yo primero queria ver el USB y hacer el programa en Visual C. Pero parece que me lo dais a modo de tutorial. ESTO VALE ORO!  Gracias a vosotros!



Muchas gracias por tus palabras. El hecho está en aprender con elementos prácticos y no volvernos locos con la teoría...aunque en algunos casos es muy necesaria.
Más adelante seguiré con los manuales sobre USB, pero ahora estoy viendo más la teoría para seguir con el libro que estoy escribiendo sobre este puerto.

Un saludo !


----------



## gongonni (Jul 20, 2011)

Moyano Jonathan dijo:


> Revisá los capacitores del cristal, el capacitor Vusb, la configuración de los fuses, los pines D+ y D- , etc.
> SI detectas que no es problema del hardware del dispositivo, puedes tener conflictos con los controladores USB de tu PC....y ahí lo único que soluciona el problema por lo general es reinstalar el sistema operativo.


Estoy algo confundido con el capacitador de Vusb. En algunos sitios leo 470nF, en otros lugares 47uF. Pero si leo el datasheet del PIC18F2550 me encuentro que debe de ser de 220nF. Los he probado todos con el mismo resultado. Los capacitadores del cristal son de 22pF para un cristal de 16Mhz. Tambien lo tuve en cuenta con los fuses. en especial al PLL.

Lo he probado en: Win7-32bit, Win7-64bit, WinXP-32bit.
Exactamente, ¿qué archivo debo instalar (driver) en el PC para el pic? Desesperado, descargué "Microchip Application Libraries" que traía controladores para USB entre otras cosas... Y dudo entre instalar el "mchpusb.inf" de las librerias de Microchip o el "mchpcdc.inf" de tu carpeta "Driver_XP". ¿Debo ir cambiando los drivers según sea CDC, Bulk o HID?



Moyano Jonathan dijo:


> Conclusión: NO modifiques el VID/PID.


OK! Solo queria saber si los VID/PID eran correctos (que no fueran diferentes y por eso diese error).



Moyano Jonathan dijo:


> Muchas gracias por tus palabras. El hecho está en aprender con elementos prácticos y no volvernos locos con la teoría...aunque en algunos casos es muy necesaria.
> Más adelante seguiré con los manuales sobre USB, pero ahora estoy viendo más la teoría para seguir con el libro que estoy escribiendo sobre este puerto.


La esperaré como agua bendita! 
Saludos!


----------



## Moyano Jonathan (Jul 20, 2011)

> Estoy algo confundido con el capacitador de Vusb. En algunos sitios leo 470nF, en otros lugares 47uF. Pero si leo el datasheet del PIC18F2550 me encuentro que debe de ser de 220nF. Los he probado todos con el mismo resultado. Los capacitadores del cristal son de 22pF para un cristal de 16Mhz. Tambien lo tuve en cuenta con los fuses. en especial al PLL.


Tiene que ser de 470nF. Es el que siempre uso.



> Lo he probado en: Win7-32bit, Win7-64bit, WinXP-32bit.
> Exactamente, ¿qué archivo debo instalar (driver) en el PC para el pic? Desesperado, descargué "Microchip Application Libraries" que traía controladores para USB entre otras cosas... Y dudo entre instalar el "mchpusb.inf" de las librerias de Microchip o el "mchpcdc.inf" de tu carpeta "Driver_XP". ¿Debo ir cambiando los drivers según sea CDC, Bulk o HID?



Para el caso de CDC en mis prácticas incluyo el driver (probado solo en Windows XP y algunas prácticas preliminares en Windows 7). Para el caso de HID no necesitas ningún driver especial solo el que trae windows...por eso la instalación de dispositivos HID se realiza de manera automatica.

La verdad vas a tener que investigar más tu problema para así te podemos dar respuestas más detalladas.


----------



## 2cool2you (Jul 21, 2011)

Hola a todos, quería saber que es lo que está mal en este código en C++. Tengo un PIC18F4550 conectado por USB en modo HID, totalmente funcional con una aplicacion en VB. Ahora, el problema surge cuando intento armar la aplicacion, pero en C++. Logro inicializar la DLL, obtener su versión, y ver la cantidad de dispositivos conectados, pero al intentar abrir las pipes, nada pasa. Siempre me devuelve INVALID_HANDLE_VALUE (-1), y no logro pasar de ahi. Intenté varias cosas, cambiar el VID_PID de mayúsculas a minúsculas, lo mismo con el EndPoint, pero NADA.
Adjunto acá el código.


```
#include <windows.h>
#include <stdio.h>
#include <iostream>
using namespace std;

typedef DWORD		(__cdecl *MPUSBGetDeviceCount)	(string pVID_PID); 
typedef void*		(__cdecl *MPUSBOpen)			(DWORD instance, string pVID_PID, string pEP, DWORD dwDir, DWORD dwReserved);
typedef DWORD		(__cdecl *MPUSBRW)				(void* handle, void* pData, DWORD dwLen, DWORD* pLength, DWORD dwMilliseconds);
//typedef DWORD		(__cdecl *MPUSBWrite)			(void* handle, void* pData, DWORD dwLen, DWORD* pLength, DWORD dwMilliseconds);		//Se utiliza MPUSBRW
typedef DWORD		(__cdecl *MPUSBReadInt)			(void* handle, DWORD* pData, DWORD dwLen, DWORD* pLength, DWORD dwMilliseconds);
typedef bool		(__cdecl *MPUSBClose)			(void* handle);

void ConvertirVersion(DWORD VerGET, BYTE* VerPARSE);
void SendPacket(BYTE* SendData, DWORD SendLength);
void ReceivePacket(byte* ReceiveData, DWORD* ReceiveLength);
void AbrirPipes(void);
void CerrarPipes(void);
bool ErrorHandler(DWORD dwCodigo);
//Declaraciones globales
	BYTE				VersionDLL[4];				//Variable para la version de la DLL.
	DWORD				err;						//Contador de errores.
	HINSTANCE			hDLL;						//HANDLE a la DLL.
	void*				hUSB_DeviceOut;				//HANDLE al dispositivo USB (Salida)
	void*				hUSB_DeviceInp;				//HANDLE al dispositivo USB (Entrada)
	FARPROC				USB_GetDLLVersion;			//Funcion
	MPUSBGetDeviceCount USB_GetDeviceCount;			//Funcion
	MPUSBOpen			USB_Open;					//Funcion
	MPUSBRW				USB_Read;					//Funcion
	MPUSBRW				USB_Write;					//Funcion
	MPUSBReadInt		USB_ReadInt;				//Funcion
	MPUSBClose			USB_Close;					//Funcion
	string VID_PID  =	"vid_0925&pid_1231";		//VID y PID del dispositivo
	string out_pipe =	"\\MCHP_EP1";				//EndPoint de salida a usar
	string inp_pipe =	"\\MCHP_EP1";				//EndPoint de entrada a usar

int main(int argc, char* argv[])
{
	hDLL = LoadLibrary(L"mpusbapi");

	if(hDLL != NULL)
		cout << "Dll cargada con exito" << endl;
	else
		ErrorHandler(GetLastError());
	
	USB_GetDLLVersion  = (FARPROC)				GetProcAddress(HMODULE (hDLL), "_MPUSBGetDLLVersion");
	USB_GetDeviceCount = (MPUSBGetDeviceCount)	GetProcAddress(HMODULE (hDLL), "_MPUSBGetDeviceCount"); 
	USB_Open	=		 (MPUSBOpen)			GetProcAddress(HMODULE (hDLL), "_MPUSBOpen"); 
	USB_Read	=		 (MPUSBRW)				GetProcAddress(HMODULE (hDLL), "_MPUSBRead"); 
	USB_Write	=		 (MPUSBRW)				GetProcAddress(HMODULE (hDLL), "_MPUSBWrite"); 
	USB_ReadInt =		 (MPUSBReadInt)			GetProcAddress(HMODULE (hDLL), "_MPUSBReadInt"); 
	USB_Close   =		 (MPUSBClose)			GetProcAddress(HMODULE (hDLL), "_MPUSBClose"); 
#ifdef DEBUG-DLL
	cout << "1 - " << USB_GetDLLVersion << endl;
	cout << "2 - " << USB_GetDeviceCount << endl;
	cout << "3 - " << USB_Open << endl;
	cout << "4 - " << USB_Read << endl;
	cout << "5 - " << USB_Write << endl;
	cout << "6 - " << USB_ReadInt << endl;
	cout << "7 - " << USB_Close << endl;
#endif
	
	ConvertirVersion(USB_GetDLLVersion(), VersionDLL);
	printf("MPUSBAPI.DLL version: %u,%u,%u,%u\r\n",VersionDLL[0],VersionDLL[1],VersionDLL[2],VersionDLL[3]);
	system("pause");

#ifdef VER-ERR
	cout << "Verificando ultimo error..." << endl;
	err = GetLastError();
	if(err != NULL)
		ErrorHandler(err);
	else
		cout << "No hay errores.\n" << endl;
	system("pause");
#endif
	
	cout << "Intentando verificar cantidad de dispositivos\nVID: 0925\nPID: 1231" << endl;
	int tmp = USB_GetDeviceCount(VID_PID);
	cout << "Cantidad de dispositivos: " << tmp << "\n" << endl;
	
	system("pause");
#ifdef VER-ERR
	cout << "Verificando ultimo error..." << endl;
	err = GetLastError();
	if(err != NULL)
		ErrorHandler(err);
	else
		cout << "No hay errores.\n" << endl;
#endif
	cout << "Intentando abrir el dispositivo..." << endl;
	AbrirPipes();
	

	//*********FINALIZAR************
	system("pause");
	cout << "Liberando DLL..." << endl;
	::FreeLibrary(hDLL);
	ErrorHandler(GetLastError());


	system("pause");
	return 0;

}

void ConvertirVersion(DWORD VerGET, BYTE* VerPARSE){
	
	memset(VerPARSE, 0, 4);
	VerPARSE[1] = static_cast<BYTE>(VerGET >> 24);
	VerPARSE[0] = static_cast<BYTE>(VerGET >> 16);
	VerPARSE[3] = static_cast<BYTE>(VerGET >> 8);
	VerPARSE[2] = static_cast<BYTE>(VerGET);
}

void AbrirPipes(void){

	
	hUSB_DeviceOut = USB_Open(0, VID_PID, out_pipe, 0, 0);
    hUSB_DeviceInp = USB_Open(0, VID_PID, inp_pipe, 1, 0);
	if(hUSB_DeviceOut == INVALID_HANDLE_VALUE || hUSB_DeviceOut == INVALID_HANDLE_VALUE)
		cout << "Error al iniciar la conexion\n" << endl;
}

void CerrarPipes(void){
	
	USB_Close(hUSB_DeviceOut);
	USB_Close(hUSB_DeviceInp);

}

bool ErrorHandler(DWORD dwCodigo){
	switch(dwCodigo){
			case 0:
				cout << "Exito" << endl;
				cout << endl;
				return true;
				break;
			case 5:
				cout << "Acceso denegado. (Error 5)" << endl;
				break;
			case 8:
				cout << "El sistema no tiene memoria suficiente para realizar la tarea. (Error 8)" << endl;
				break;
			case 126:
				cout << "No se ha encontrado la libreria especificada. (Error 126)" << endl;
				break;
			case 127:
				cout << "No se ha encontrado el procedimiento en la libreria DLL.\nVerifique que la version de la libreria sea la correcta y\nque esta se encuentre en el directorio de la aplicacion. (Error 127)" << endl;
				break;
			case 182:
				cout << "Esta aplicacion no admite esta version de Windows. Actualize su sistema operativo." << endl;
				break;
			case (-1):
				cout << "Error desconocido. Codigo: -1." << endl;
				break;
			default:
				cout << "Error desconocido. Codigo: 0x" << hex << uppercase << dwCodigo << endl;
				break;
	}	
	cout << endl;
	system("pause");
	exit((-1));
}
```

Aviso que cualquiera puede usar este código, sin restricción alguna, pero haciendo que funcione, jaja.

Bueno, espero, puedan ayudarme.


----------



## sjuan (Jul 25, 2011)

buenas compañeros, tengo en mente un proyecto, se trata de comunicar dos computadores inalambricamente, seria algo asi 


y la parte del puente azul seria algun tipo de intercomunicador rf, solo quiero saber si es posible pues me gustaria hacerlo pero no cuento con el dinero y con el tiempo, pero quiero ir avanzando en el tema,  ¿ la transmison de datos que podría obtener seria de 12 Mbit / s? eso dice la hoja de datos, pero con lo que quiero hacer, aun se puede?

respecto al transmisor por si alguien me pudiera orientar, sería finalmente de 4Km (si, soñar no cuesta nada ) pero podría ser de unos metros para comenzar, el transmisor tendría que transmitir en 2.4Ghz cierto? y si, ya se que están los XBEE y que ya tienen todo listo, pero no es mi intención hacerlo a la facil (asi me cueste ) y se puede trabajar con menos frecuencia si trabajo un conexión de 1.5 Mbps?


----------



## Moyano Jonathan (Jul 26, 2011)

> Hola a todos, quería saber que es lo que está mal en este código en C++. Tengo un PIC18F4550 conectado por USB en modo HID, totalmente funcional con una aplicacion en VB. Ahora, el problema surge cuando intento armar la aplicacion, pero en C++. Logro inicializar la DLL, obtener su versión, y ver la cantidad de dispositivos conectados, pero al intentar abrir las pipes, nada pasa. Siempre me devuelve INVALID_HANDLE_VALUE (-1), y no logro pasar de ahi. Intenté varias cosas, cambiar el VID_PID de mayúsculas a minúsculas, lo mismo con el EndPoint, pero NADA.



Por que no usas el código de ejemplo que te dá easyHID...y te guías desde ahí. Es mucho más sencillo que tratar de desarrollar el código desde 0...y más en este tipo de aplicaciones.

Sjuan: Lo que comentas es posible....ahora depende de que tipo de datos vas a transmitir. Tenés que ser más específico con tu proyecto.


----------



## saulon019 (Jul 26, 2011)

Hola, tengo un problema con un dispositivo CDC que construí, bajo ninguna circunstancia puedo leer datos enviados desde el PC, no entiendo cual es el problema, ya probé la comunicación con el pc enviando datos (interfaz en Labview), pero no puedo leerlos, si alguien puede ayudarme y decirme cual es el problema lo agradecería mucho, agrego mi programa en c.


```
#include <18F2550.h>


#fuses HSPLL,NOMCLR,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN,NOPBADEN

#use delay(clock=48000000)

#include <usb_cdc.h> // DRIVER COM VIRTUAL.
#include <usb_desc_cdc.h> // DESCRIPTORES DEL MODULO USB.
#include <STDLIB.h> // INCLUIR LIBRERIA DE CONVERSION "ITOA"

#define LED_AMARILLO PIN_B5// DEFIRIR SALIDA LED AMARILLO

#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)

CHAR ARTICULACION;

void main()
{
                     usb_cdc_init(); // INICIALIZAR USB.
                     usb_init(); //INICIALIZAR MODULO USB
                     usb_wait_for_enumeration();//ESPERAR ENUMERACION DEL HOST.
                     
                     OUTPUT_HIGH(LED_AMARILLO );//ENCENDER LED AMARILLLO
                     
                     
    WHILE(!usb_cdc_connected()) 
    { }
    
    WHILE(1)
    {
                     usb_task();//PERMITIR RESET DE LA PILA Y EL MODULO USB SI SE DESCONECTA.

                           WHILE(usb_enumerated())//MIENTRAS EL USB ESTE ENUMERADO ENVIA DATOS AL PC
                           {  
                           
                                 if (usb_cdc_kbhit()) 
                                 {
                                       OUTPUT_LOW(LED_AMARILLO );
                                       ARTICULACION = usb_cdc_getc();
                                       
                                             IF(ARTICULACION=='1')
                                             {
                                                   PUTC('1'); 
                                             }
                                             
                                             IF(ARTICULACION=='2')
                                             {
                                                   PUTC('2'); 
                                             }
                                             
                                             IF(ARTICULACION=='3')
                                             {
                                                   PUTC('3'); 
                                             }
                                             
                                             IF(ARTICULACION=='4')
                                             {
                                                   PUTC('4'); 
                                             }
                                             
                                             IF(ARTICULACION=='5')
                                             {
                                                   PUTC('5'); 
                                             }
                                             
                                             IF(ARTICULACION=='6')
                                             {
                                                   PUTC('6'); 
                                             }
                                             
                                             IF(ARTICULACION=='7')
                                             {
                                                   PUTC('7'); 
                                             }
                                             
                                             IF(ARTICULACION=='8')
                                             {
                                                   PUTC('8'); 
                                             }
                                             
                                             IF(ARTICULACION=='9')
                                             {
                                                   PUTC('9'); 
                                             }
                                             
                                             IF(ARTICULACION=='0')
                                             {
                                                   PUTC('0'); 
                                             }
                                             
                                       DELAY_MS(50);
                                       OUTPUT_HIGH(LED_AMARILLO );
                                       DELAY_MS(50);
                                       
                                       /*WHILE(1)
                                       {
                                       
                                          ARTICULACION="456";
                                          printf(usb_cdc_putc,ARTICULACION);
                                       }
                                      
                                       //PUTC(ARTICULACION);*/
                                }
                              
                           }
                           
                                    IF(!usb_enumerated())// HAY TENSION EN EL BUS PERO EL EQUIPO NO ESTA EN FUNCIONAMIENTO
                                    {
                                       DELAY_MS(400);//PARPADEO DE LEDS SI EL HOST(PC) ES DESHABILITADO(POR REINICIO, HIBERNACION,SUSPENCION,ETC)
                                    
                                       OUTPUT_HIGH(LED_AMARILLO );
                                       
                                       DELAY_MS(400);
                                       
                                       OUTPUT_LOW(LED_AMARILLO );
                                    }
                                    
    }

}
```


----------



## Moyano Jonathan (Jul 26, 2011)

Me parece que tenés mal estructurado tu programa, revisá los primeros post del hilo y te vas a dar cuenta como tenés que operar..

A mi forma de ver tu programa tendría que ser así:

```
#include <18F2550.h>


#fuses HSPLL,NOMCLR,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN,NOPBADEN

#use delay(clock=48000000)

#include <usb_cdc.h> // DRIVER COM VIRTUAL.
#include <usb_desc_cdc.h> // DESCRIPTORES DEL MODULO USB.
#include <STDLIB.h> // INCLUIR LIBRERIA DE CONVERSION "ITOA"

#define LED_AMARILLO PIN_B5// DEFIRIR SALIDA LED AMARILLO

#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)

CHAR ARTICULACION;

void main()
{
                     usb_cdc_init(); // INICIALIZAR USB.
                     usb_init(); //INICIALIZAR MODULO USB
                     
                     
    WHILE(!usb_cdc_connected()) {}

    
    do {
                     usb_task();//PERMITIR RESET DE LA PILA Y EL MODULO USB SI SE DESCONECTA.

                          if(usb_enumerated())//MIENTRAS EL USB ESTE ENUMERADO ENVIA DATOS AL PC
                           {  
                                 if (usb_cdc_kbhit()) 
                                 {
                                       OUTPUT_LOW(LED_AMARILLO );
                                       ARTICULACION = usb_cdc_getc();
                                       
                                             IF(ARTICULACION=='1')
                                             {
                                                   PUTC('1'); 
                                             }
                                             
                                             IF(ARTICULACION=='2')
                                             {
                                                   PUTC('2'); 
                                             }
                                             
                                             IF(ARTICULACION=='3')
                                             {
                                                   PUTC('3'); 
                                             }
                                             
                                             IF(ARTICULACION=='4')
                                             {
                                                   PUTC('4'); 
                                             }
                                             
                                             IF(ARTICULACION=='5')
                                             {
                                                   PUTC('5'); 
                                             }
                                             
                                             IF(ARTICULACION=='6')
                                             {
                                                   PUTC('6'); 
                                             }
                                             
                                             IF(ARTICULACION=='7')
                                             {
                                                   PUTC('7'); 
                                             }
                                             
                                             IF(ARTICULACION=='8')
                                             {
                                                   PUTC('8'); 
                                             }
                                             
                                             IF(ARTICULACION=='9')
                                             {
                                                   PUTC('9'); 
                                             }
                                             
                                             IF(ARTICULACION=='0')
                                             {
                                                   PUTC('0'); 
                                             }
                                             
                                       DELAY_MS(50);
                                       OUTPUT_HIGH(LED_AMARILLO );
                                       DELAY_MS(50);
                                       
                                       
                                }
                              
                           }
                           
                                    
                        }while(true);
                     }
```

Probá de esa manera , luego le vas añadiendo código.


----------



## 2cool2you (Jul 26, 2011)

Moyano Jonathan: el easyHID no lo pude instalar, pero, de todas formas, estuve viendo ejemplos de codigo, y el easyHID lo arma para VB6 y con la DLL mcHID.dll. Yo estoy trabajando con la DLL MPUSBAPI.DLL, y en C++. Intenté en otros lenguajes con la misma librería, y sí pude establecer una conexión, pero al intentar hacerlo en C++, NADA.


----------



## saulon019 (Jul 26, 2011)

Muchas gracias por responder Moyano Jonathan, ya probé con la configuración que me sugeriste pero sigue igual, ya revisé las configuraciones que hay al comienzo del hilo y me parecen prácticamente la misma que tengo, no se si es un problema con las librerías del ccs, con el driver o con la versión del programa, no se que es realmente, puedo escribir datos fácilmente en la interfaz de labview pero no soy capaz de leerlos de ésta, ya tengo los circuitos construidos y he podido hacer algunas pruebas, si se te ocurre alguna otra cosa te agradezco tu ayuda.


----------



## Moyano Jonathan (Jul 27, 2011)

> Moyano Jonathan: el easyHID no lo pude instalar, pero, de todas formas, estuve viendo ejemplos de codigo, y el easyHID lo arma para VB6 y con la DLL mcHID.dll. Yo estoy trabajando con la DLL MPUSBAPI.DLL, y en C++. Intenté en otros lenguajes con la misma librería, y sí pude establecer una conexión, pero al intentar hacerlo en C++, NADA.


 Haa...pequeño detalle. Las librerías de microchip MPUSBAPI.dll no funcionan correctamente en transmisiones interruptivas...ellos tienen una librería dedicada para eso..mirá esta página y luego me decís...
http://www.micros-designs.com.ar/practicas-en-visual-c-05/



> Muchas gracias por responder Moyano Jonathan, ya probé con la configuración que me sugeriste pero sigue igual, ya revisé las configuraciones que hay al comienzo del hilo y me parecen prácticamente la misma que tengo, no se si es un problema con las librerías del ccs, con el driver o con la versión del programa, no se que es realmente, puedo escribir datos fácilmente en la interfaz de labview pero no soy capaz de leerlos de ésta, ya tengo los circuitos construidos y he podido hacer algunas pruebas, si se te ocurre alguna otra cosa te agradezco tu ayuda.



Pueden ser los causantes de tus problemas:

- Que sigas cometiendo errores en la comunicación. Hay que revisar a fondo el código.
- Que la versión de CCS...te esté dando errores de funcionamiento (probable).
- Que tu programa de labview no esté funcionando correctamente...etc.

Por favor revisá la lógica de tu programa para el PIC y la PC...y como se comunican entre ellos...allí me parece que está el error.


----------



## Meta (Jul 27, 2011)

Buenas Moyano.

Aún veo gente con muchas dudas. ¿tienes pensado en el fututo mejorar o ampliar el manual?



Saludo.


----------



## Moyano Jonathan (Jul 27, 2011)

Si pero un futuro...tengo 1000 cosas que hacer por ahora..es más estuve avanzando en la parte teórica de mi libro sobre el USB. De a poco se va avanzando.


----------



## 2cool2you (Jul 27, 2011)

Bueno, con la DLL que aparece ahí ("HID class.DLL"), ni siquiera logré detectar el dispositivo, no sé si es que estoy pasando mal los parámetros, aunque lo dudo. Con MPUSBAPI.DLL mando el Vid y Pid como string "Vid_0925&Pid_1231" y en HID class.DLL los paso como: (0x0925, 0x1231, 5). Al intentar ver la cantidad de dispositivos con MPUSBAPI me devuelve que hay un solo dispositivo, en cambio, con HID class al preguntar si IsConnected(), me devuelve siempre false.


----------



## Moyano Jonathan (Jul 27, 2011)

La verdad es raro lo que comentas....mirá te dejo el ejemplo para easyHID que genera el mismo software:
http://www.mediafire.com/?0ilrzfidol73f42


----------



## 2cool2you (Jul 27, 2011)

Sigo sin resultados, con la aplicación que me pasaste, no logré nada. Cambie el Vid y Pid por los mios, intenté pasandolos como hexadecimal y como octal, pero nada, siempre me responde Unplugged. Estuve mirando el USBDeview y ahí me aparece el dispositivo como desconectado también, pero probando con el soft en C# puedo enviar y recibir datos perfectamente.


----------



## Moyano Jonathan (Jul 27, 2011)

Que raro...ya voy a estudiar mejor el código de C++...es cuestión de ponerse nomás.


----------



## Meta (Jul 27, 2011)

¿El C++ o el C?


----------



## gongonni (Jul 28, 2011)

Pregunta tonta, pero... ¿tiene algo que ver que sean Samples de la web? Quizás deberia comprarse? :/


----------



## Moyano Jonathan (Jul 28, 2011)

> ¿El C++ o el C?


 C++ , visual estudio trabaja con ese lenguaje.



> Pregunta tonta, pero... ¿tiene algo que ver que sean Samples de la web? Quizás deberia comprarse? :/


 No entiendo tu consulta.


----------



## gongonni (Jul 28, 2011)

Es decir, tengo los PIC18F2550 pedidos como muestras gratuitas de internet en microchip. Es posible que al ser muestras tengan defectos o cosas similares y que por eso no vayan "bien" ?


----------



## Moyano Jonathan (Jul 28, 2011)

La verdad no creo que sea por eso...es un problema software ....o algo relacionado con el hardware que rodea al PIC18F2550.


----------



## Meta (Jul 28, 2011)

Moyano Jonathan dijo:


> C++ , visual estudio trabaja con ese lenguaje.
> 
> No entiendo tu consulta.



Visual Studio también se trabaja con C a parte del C++. Puedes escoger el que desees.


----------



## Moyano Jonathan (Jul 28, 2011)

No, hay diferencias muy grandes..

C es un lenguaje libre estandarizado por ISO MUY PEQUEÑO que admite programación estructurada (la de toda la vida), nada más. Útil en programación de microchips, sistemas operativos, drivers y programación web... Poco más.

C++ es un lenguaje libre estandarizado por ISO MUY GRANDE, que admite: Programación estructurada (la de toda la vida), la totalidad de la POO (objetos, herencia simple, herencia múltiple, polimorfismo, upcasting, downcasting, RTTI, interfaces, clases abstractas, clases amigas, operadores, sobrecarga... y mil cosas más avanzadas), programación genérica (plantillas, STL, conceptos de contenedores, estructuras de datos genéricas, <b>metaprogramación</b>... es una programación que no dispone ningún otro lenguaje mayoritario por el momento)... y otras características más avanzadas como los punteros inteligentes, programación lambda, programación "física"... También se usa como programación por eventos (MFC, Qt, Gtk y otras GUIs). Se usa para cualquier cosa, desde sistemas operativos hasta los juegos 3D de última generación pasando por servidores, pasando por las típicas aplicaciones de escritorio o un Office o OpenOffice, un reproductor WinAMP y Windows Media Player, un explorador web (Internet Explorer, Mozilla, Firefox...), un cliente eMule, un cliente Torrent.

No podés crear aplicaciones Win32 en C.

Un saludo !


----------



## ecasillas (Jul 28, 2011)

nesesito un ejemplo en visual studio ya se el 2008 o el 2010 para comunicacion usb usando HID ya que no entinedo como se dectecta el micro
por ejemplo la compu ya me detecta el micro pero la parte de visual no la entiendo bien


----------



## Moyano Jonathan (Jul 28, 2011)

> nesesito un ejemplo en visual studio ya se el 2008 o el 2010 para comunicacion usb usando HID ya que no entinedo como se dectecta el micro
> por ejemplo la compu ya me detecta el micro pero la parte de visual no la entiendo bien



Por favor lee el primer post del hilo y vas a poder bajar justo lo que necesitas.

Un saludo !


----------



## v17h0r (Jul 28, 2011)

Moyano Jonathan dijo:


> No, hay diferencias muy grandes..
> 
> C es un lenguaje libre estandarizado por ISO MUY PEQUEÑO que admite programación estructurada (la de toda la vida), nada más. Útil en programación de microchips, sistemas operativos, drivers y programación web... Poco más.
> 
> C++ es un lenguaje libre estandarizado por ISO MUY GRANDE, que admite: Programación estructurada (la de toda la vida), la totalidad de la POO (objetos, herencia simple, herencia múltiple, polimorfismo, upcasting, downcasting, RTTI, interfaces, clases abstractas, clases amigas, operadores, sobrecarga... y mil cosas más avanzadas),




El C++, quiere decir evolución del C, ++ quiere decir incrementar, cuando le pones a una variable por ejm:
i=1;
i++; //lo que tiene en i = 2.

Si se puede hacer uso del C para win32, en Visual C++, pero te complicas la vida un montón no tienes todas las virtudes del c++, como es el POO. lo que puedes hacer con el C++ en pocas lineas de código se te convertirán en cientos de lineas con el C.


----------



## Meta (Jul 29, 2011)

Amigo, el C y C++ se nota muchísimo, hay mucha expliación por Internet sobre los dos, si no se nota mucho, no lo harían. 

Por eso, desde hace años la comunidad Linux, quieren que pase de C a C++ para el sistema operativo, porque es más eficiente. El creador dejó claro que odia el C++, está acostumbrado al C.

Por otra parte, el C/C++ estandar no se actualiza desde el 1998 y las empresas crea muchas librerías para ellas mismas. ¿Qué es lo que quieres hacer ahora?
Muchos países se están poniendo de acuerdo para sacar una nueva normativa del nuevo C/C++ más actualizado.

http://freedevel.sibbuc.com/2009/01/nuevo-estandar-de-c-para-este-ano/

Este año empezaré un buen pie con Visual Basic Express en clase. No me gusta ese lenguaje para programar, pero aprendo algo.

Saludo.


----------



## vini0712 (Jul 29, 2011)

hola tengo el pic 18f4550 progrmado en mikrobasic el computador me reconoce como hid debo hacer un interfaz en *java* para comunicarme con el pic  si me pueden orientar como hacerlo de java no se mucho


----------



## Meta (Jul 30, 2011)

Es que aquí no se trata de Java, a pesar de que se parece mucho a C#, buscas las librerías de Java sobre comunicación del puerto USB que están por ahí.


----------



## Moyano Jonathan (Jul 30, 2011)

> hola tengo el pic 18f4550 progrmado en mikrobasic el computador me reconoce como hid debo hacer un interfaz en java para comunicarme con el pic si me pueden orientar como hacerlo de java no se mucho



En este hilo aparece justo lo que necesitas: http://www.ucontrol.com.ar/forosmf/tutoriales-guias-y-cursos-en-ucontrol/tutorial-java-pic-usb-(primeros-pasos)/


----------



## 2cool2you (Jul 30, 2011)

Bueno, no sé como seguir con esto. Voy a intentar armar un dispositivo HID desde cero (con este hilo) y ver que pasa. Gracias por la ayuda, y cualquier cosa volveré a preguntar.


----------



## Moyano Jonathan (Jul 31, 2011)

> Bueno, no sé como seguir con esto. Voy a intentar armar un dispositivo HID desde cero (con este hilo) y ver que pasa. Gracias por la ayuda, y cualquier cosa volveré a preguntar.


Disculpá que no te haya podido ayudar con C++ no es mi fuerte...si querés hacerlo en C# mi manual te va a servir como guía.
Un saludo !


----------



## Meta (Jul 31, 2011)

ejercicio_n1_174.rar (47,8 KB (Kilobytes), 4820 visitas)  	
	

	
	
		
		

		
		
	


	


Control de dispositivos por USB [ HID + Visual C# ].part01.rar (1,91 MB (Megabytes), 940 visitas)  	
	

	
	
		
		

		
		
	


	


Control de dispositivos por USB [ HID + Visual C# ].part02.rar (1,91 MB (Megabytes), 611 visitas)  	
	

	
	
		
		

		
		
	


	


Control de dispositivos por USB [ HID + Visual C# ].part03.rar (1,91 MB (Megabytes), 569 visitas)  	
	

	
	
		
		

		
		
	


	


Control de dispositivos por USB [ HID + Visual C# ].part04.rar (1,91 MB (Megabytes), 566 visitas)  	
	

	
	
		
		

		
		
	


	


Control de dispositivos por USB [ HID + Visual C# ].part05.rar (1,91 MB (Megabytes), 546 visitas)  	
	

	
	
		
		

		
		
	


	


Control de dispositivos por USB [ HID + Visual C# ].part06.rar (1,91 MB (Megabytes), 564 visitas)  	
	

	
	
		
		

		
		
	


	


Control de dispositivos por USB [ HID + Visual C# ].part07.rar (1,91 MB (Megabytes), 563 visitas)  	
	

	
	
		
		

		
		
	


	


Control de dispositivos por USB [ HID + Visual C# ].part08.rar (1,91 MB (Megabytes), 559 visitas)  	
	

	
	
		
		

		
		
	


	


Control de dispositivos por USB [ HID + Visual C# ].part09.rar (1,91 MB (Megabytes), 555 visitas)  	
	

	
	
		
		

		
		
	


	


Control de dispositivos por USB [ HID + Visual C# ].part10.rar (1,91 MB (Megabytes), 551 visitas)  	
	

	
	
		
		

		
		
	


	


Control de dispositivos por USB [ HID + Visual C# ].part11.rar (740,2 KB (Kilobytes), 570 visitas)


----------



## COSMICO (Jul 31, 2011)

Que gran trabajo.
Felicitaciones, y gracias por todos sus aportes.
Estoy migrando de vb6 a C#, y esto me cae muy bien..
Gracias Amigo moyano y meta..


----------



## danyel126 (Ago 2, 2011)

Hola gente del foro, me pregunto si alguna vez hicieron algo con usb y algun PIC pero que el programa del lado de la pc sea el Matlab ya que posee una gran cantidad de funciones para el manejo de señales como implementacion de filtros digitales, modulacion de señales, transformadas de fourier, graficas y la posibilidad de escuchar señales de audio, entre otras. Ademas posee la posibildad de importar librerias como por ejemplo alguna dll para trabajar la coneccion USB con el PIC.

Bueno me surguio esa duda ya que el Matlab lo usan mucho en ingenieria.

Un abrazo y saludo a la gente de este gran foro.


----------



## Moyano Jonathan (Ago 2, 2011)

Por ahora no hay nada, pero podrías ir haciendo algo como para experimentar.


----------



## mnicolau (Ago 2, 2011)

danyel126 dijo:


> Hola gente del foro, me pregunto si alguna vez hicieron algo con usb y algun PIC pero que el programa del lado de la pc sea el Matlab ya que posee una gran cantidad de funciones para el manejo de señales ...



Hola Daniel, yo estoy haciendo la comunicación PIC-Labview vía USB (modo Bulk).
Labview también tiene todo tipo de funciones para tratar señales y además incorpora la posbilidad de usar código de Matlab. Por otro lado, tiene la ventaja de poder armar la interfaz gráfica de manera más sencilla e intuitiva que mediante Matlab.

PD: un consejo a aquellos que se inicien en C#, no se olviden de "ofuscar" el ejecutable al compilarlo, sino cualquiera va a poder acceder al código fuente del mismo (siempre y cuando no deseen que esto suceda).

Saludos


----------



## Meta (Ago 2, 2011)

Hay muchos temas de obfuscación del ejecutable y dll en el .net. Aún así se puede saber el código fuente porque se puede hacer la ingeniería inversa, sólo que cuesta más. Es bueno obfuscar, claro que no será al 100 % efectivo. El que quiera tu código lo tendrá, sobre todo si es pequeño, ejjee.


----------



## mnicolau (Ago 2, 2011)

Meta dijo:


> Es bueno obfuscar, claro que no será al 100 % efectivo. El que quiera tu código lo tendrá, sobre todo si es pequeño, ejjee.



Sip, sin dudas que sigue siendo posible, pero al menos no es tan sencillo y directo obtenerlo.

Saludos


----------



## Meta (Ago 3, 2011)

Frenará a los menos abispados. Con los años, espero que mejoren.


----------



## LeAding (Ago 3, 2011)

Hace poco estube buscando por la web algun ejemplo de matlab con USB y encontre estos ejemplos en la pagina de Matlab hechos por el Ing. Gabriel Pool, creo si mal no recuerdo eran para una catedra. Yo lo unico que hice fue la simulacion para Proteus de ambos ejemplos y alguna modificacion minima en el codigo, ambos funcionan bien, salvo el ejemplo 1 que a veces me reinicia la PC y no se a que se debe. Ambos trabajan con la mpusbapi de microchip.
Queria pasar estos ejemplos al modo HID, lo del codigo del PIC ya lo pude hacer; pero la parte de matlab no encuentro la forma de usar las funciones de la mcHID.dll o la HID.dll, no se como pasar las funciones desde matlab, me tira error la funcion *calllib* de matlab cuando quiero ejecutar GetVendorID por ejemplo. Supongo que debe ser porque le estoy pasando mal los parametros ya que no se bien que pasarle, o porque no se si lleva la libreria *.h como estos ejemplos.
Un abrazo a la gente del foro.
Si logro algo lo subo.


----------



## arias887 (Ago 5, 2011)

Tengo un problema...
Estoy intentando confugurar un 18F4455 para que trabaje a 48MHz con un cristal de 4MHz, pero no me funciona....

esta es la confuguracion que le tengo en CCS 4.114 para prender y apagar los puertos con intermitencia de un segundo, pero cuando lo simulo en proteus y lo monto en protoboard con el cristal de 4MHz ese segundo pasa a ser 12 segundos....


```
#include <18F4550.h>

#FUSES NOWDT                     //No Watch Dog Timer
#FUSES WDT128                    //Watch Dog Timer uses 1:128 Postscale
#FUSES PLL1                      //No PLL PreScaler
#FUSES CPUDIV1                   //No System Clock Postscaler
#FUSES USBDIV                    //USB clock source comes from PLL divide by 2
#FUSES XT                        //Crystal osc <= 4mhz for PCM/PCH , 3mhz to 10 mhz for PCD
#FUSES FCMEN                     //Fail-safe clock monitor enabled
#FUSES IESO                      //Internal External Switch Over mode enabled
#FUSES NOPUT                     //No Power Up Timer
#FUSES NOBROWNOUT                //No brownout reset
#FUSES BORV27                    //Brownout reset at 2.7V
#FUSES VREGEN                    //USB voltage regulator enabled
#FUSES NOPBADEN                  //PORTB pins are configured as digital I/O on RESET
#FUSES LPT1OSC                   //Timer1 configured for low-power operation
#FUSES MCLR                      //Master Clear pin enabled
#FUSES STVREN                    //Stack full/underflow will cause reset
#FUSES NOLVP                     //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES ICPRT                     //ICPRT enabled
//#FUSES NOXINST                   //Extended set extension and Indexed Addressing mode disabled (Legacy mode)
#FUSES NODEBUG                   //No Debug mode for ICD
#FUSES NOPROTECT                 //Code not protected from reading
#FUSES NOCPB                     //No Boot Block code protection
#FUSES NOCPD                     //No EE protection
#FUSES NOWRT                     //Program memory not write protected
#FUSES NOWRTC                    //configuration not registers write protected
#FUSES NOWRTB                    //Boot block not write protected
#FUSES NOWRTD                    //Data EEPROM not write protected
#FUSES NOEBTR                    //Memory not protected from table reads
#FUSES NOEBTRB                   //Boot block not protected from table reads

#use delay(clock=48000000)
//#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8,stream=PORT1)
```
Que sera lo que estoy haciendo mal????


----------



## bondadoso (Ago 5, 2011)

tienes que activar el PLL4 me parece....


----------



## Moyano Jonathan (Ago 5, 2011)

Tenés mal configurado el fusible: No es XT...es XTPLL para que trabaje en conjunto con el PLL.


----------



## arias887 (Ago 5, 2011)

Nada, da igual, sigue con los 12 segundos....

Aca les dejo los archivos para Proteus 7.7 SP2 y CCS C 4.114 para que lo puedan ver mejor...


----------



## Moyano Jonathan (Ago 5, 2011)

Que raro...puede ser un bug del compilador....a mi me ha pasado. Fija de no usar el PLL, hace programas de prueba con delay's de 1 seg para ver como te responde. Quizás haya algun fusible que no estés configurando.


----------



## arias887 (Ago 5, 2011)

Eso es lo que estoy haciendo en el "ejercicio" que adjunte arriba " 	[18F4455] Osc de 4MHz para 48MHz.rar", encender todos los puertos durante un segundo y apagarlos otro segundo y se repite...
Pero se demora 12 segundos cada "accion"....


----------



## fedep7 (Ago 13, 2011)

Hola Jonathan te hago una consulta tengo una placa con un modulo gsm y un pic 18F14K50 y no logro vincularlo con la compu por el USB, sabes si el generador de INF de palitroquez soporta este tipo de pic?


----------



## Moyano Jonathan (Ago 13, 2011)

Trabajas con la placa GSM de MCelectronics ? Si es así, te comento que CCS en su v4.114 tiene las librerías listas para trabajar con el módulo USB de dicho microcontrolador.
En cuanto al generador de inf de palitroquez lo tendrías que probar. Quizás funcione...igual mejor trabaja con CDC o HID y usá los drivers genéricos que te vienen con windows.
Cualquier consulta decime.

Un saludo !


----------



## Meta (Ago 14, 2011)

Desde que empecé a trabajar y estudiar a la vez, no he probado el manual a fondo. Ahora este día quiero aprovecharlo y hacer los primeros pinitos.

A pesar del manual, en mucho timepo veo que hay muchas dudas, habrña que ampliar ese pedazo de manual donde la gente tiene muchas dudas de siempre, con el tiempo se hará.

Saludo y buen trabajo. Menuda guerra da el USB.


----------



## Moyano Jonathan (Ago 14, 2011)

Lo que pasa meta...es que casi siempre si te ponés a leer aparecen las mismas dudas...la gran mayoría con respecto al hardware otro tanto con la programación y por último comentarios con respecto a la arquitectura del protocolo.
El manual está creciendo a paso lento por que estoy bastante ocupado con la facultad ...mis proyectos personales de electrónica y demás.

Un saludo !


----------



## Meta (Ago 14, 2011)

Buenas Moyano.

Si es casi siempre lo mismo, ahí es donde puedes atacar el problema resolviendo esa parte tan molesta de la gente. 

Si el manual sigue creciendo aunque sea a paso lento, el manual crece y es buena señal, lo que no lo he notado. Si aportas a la comunidad y se nota.

Ahora, el problema de falta de tiempo ahí está la cuestión, estás haciendo el gran esfuerzo de tu vida y es de agradecer personas como usted.

Me tocó un trabajo de muchas horas, paga poco, trabajas como un negro, no quiere pagarme, la empresa está para irse a la quiebra, no tengo tiempo para hacer cosas de PIC y menos después cuando empiece a programar por las tardes. Estudiar y trabajar a la vez es casi imposible, por no nombrar los hobbies de PIC a parte.

La verdad que te entiendo muy bien, cuando te toque el tiempo para mejorar el manual o ampliar cosas, es de agradecer, ya lo harás en el futuro cuando puedas. 

Gracias por tu tiempo. 





...y buen trabajo.


----------



## Meta (Ago 14, 2011)

Otra cosa.

Cada vez veo más el uso del C18, hasta ya lo podremos usar en Linux y MacOS.

Se que salió hace poco la versión MPLAB IDE v8.76 , sigue siendo para Windows. Mirando el Windows del C18. *¿Puedes adaptar los trabajos del CCS a C18?* No digo que lo hagas, sino que se puede hacer.Cada vez más, siento ansias de usar el C18 que el propio _supestamente_ superior como el CCS.

Saludo.


----------



## Moyano Jonathan (Ago 14, 2011)

> Se que salió hace poco la versión MPLAB IDE v8.76 , sigue siendo para Windows. Mirando el Windows del C18. ¿Puedes adaptar los trabajos del CCS a C18?


 La respuesta es sí. El tema es que alguien lo haga....yo por mi lado trabajo con CCS...tendría que empezar a trabar con C18...pero me interesa aprender más de AVR-GCC.

Un saludo !


----------



## 2cool2you (Ago 15, 2011)

Estuve viendo tu simulación en Proteus, y vi que tenes configurado el clock del PIC en 4Mhz. Tenes que configurarlo a la frecuencia máxima a la que trabaja, igual que en CCS, es decir, si en CCS pusiste 48M, en Proteus tenes que poner 48Mhz. La frecuencia del cristal se configura en las propiedades del cristal, aunque en Proteus, es igual que el cristal esté o no.


----------



## Deego (Ago 17, 2011)

Hola amigos. Tengo una pregunta, como borro el VID y el PID de los dispositivos USB?? es que ultimamente la tarjeta que desarrolle con el PIC 18F2550 me está generando problemas, porque ni si quiera detecta que hay un dispositivo HID conectado, me empezó a pasar esta mañana, y no se a que se deba, pienso borrar los VID y los PID, pero como si ni si quiera los reconoce?? en que parte puedo ver un registro de los VID y los PID que tiene el computador y borrarlos?? Estaría agradecido si me sacaran de esas dudas que tengo.


----------



## ferdaube (Ago 18, 2011)

Porque borraron mi publicacion? :S no entiendo? viole alguna norma?



> Hola amigos. Tengo una pregunta, como borro el VID y el PID de los dispositivos USB?? es que ultimamente la tarjeta que desarrolle con el PIC 18F2550 me está generando problemas, porque ni si quiera detecta que hay un dispositivo HID conectado, me empezó a pasar esta mañana, y no se a que se deba, pienso borrar los VID y los PID, pero como si ni si quiera los reconoce?? en que parte puedo ver un registro de los VID y los PID que tiene el computador y borrarlos?? Estaría agradecido si me sacaran de esas dudas que tengo.



Bueno mientras espero mi respuesta puedo ir ayudando...... amigo los VID y PID de los pic se encuentran en el archivo USB_DESC_CDC.H alli en ese archivo casi al final esta esta funcion:


```
const char USB_DEVICE_DESC[USB_DESC_DEVICE_LEN] ={
      //starts of with device configuration. only one possible
         USB_DESC_DEVICE_LEN, //the length of this report   ==0
         0x01, //the constant DEVICE (DEVICE 0x01)  ==1
         0x10,0x01, //usb version in bcd  ==2,3
         0x02, //class code. 0x02=Communication Device Class ==4
         0x00, //subclass code ==5
         0x00, //protocol code ==6
         USB_MAX_EP0_PACKET_LENGTH, //max packet size for endpoint 0. (SLOW SPEED SPECIFIES 8) ==7
         0xD8, 0x04, //vendor id       ==9, 10
         0x0A, 0x00, //product id, don't use 0xffff       ==11, 12
         USB_CONFIG_VERSION & 0xFF, ((USB_CONFIG_VERSION >> 8) & 0xFF), //device release number  ==13,14
         0x01, //index of string description of manufacturer. therefore we point to string_1 array (see below)  ==14
         0x02, //index of string descriptor of the product  ==15
         0x00, //index of string descriptor of serial number  ==16
         USB_NUM_CONFIGURATIONS  //number of possible configurations  ==17
   };
```


date cuenta de estas 2 lineas:

         08, 0x04, //vendor id       ==9, 10
         0x0A, 0x00, //product id, don't use 0xffff       ==11, 12

alli estan los VID y PID, pero no te recomiendo que los cambies, ya que esos son los codigo que proporciona la microchip! creo que si colocas otro no te funcionara!

yo te recomendaria que reinstales el dispositivos, vete al administrador de dispositivos de la pc y busca el dispositivo usb del pic y dale desinstalar y vuelve a instalarlo... ten a la mano el driver, osea el archivo mchpcdc.inf si tienes problemas en la instalacion vuelve a crear el driver! si todavia tienes problemas avisa y con mas detalles!


----------



## Chico3001 (Ago 18, 2011)

ferdaube dijo:


> Porque borraron mi publicacion? :S no entiendo? viole alguna norma?



Por que la pregunta la hacias sobre RS232 que no tiene nada que ver con USB


----------



## ferdaube (Ago 18, 2011)

Chico3001 dijo:


> Por que la pregunta la hacias sobre RS232 que no tiene nada que ver con USB



Pero este foro habla sobre el pic 18f2550 y usb, y pues yo estoy trabajando con eso y tengo dudas, ya que el USB al parecer me da problemas con el rs232. 

bueno igual abrí otro foro con ese tema :/ quise aprovechar que aquí hay bastante gente relacionada con el tema!


----------



## fedep7 (Ago 19, 2011)

Si Jonathan estoy trabajando con esa placa y resulta que me genera el COM virtual pero me da el famoso error 10, sospecho que sea una mala configuracion del reloj del pic. Voy a bajar esa versiòn de CCS  que me recomendas.

Un saludo. Gracias.


----------



## gelitojr (Ago 22, 2011)

Que tal, estuve leyendo el comentario de arias 887, tuve el mismo problema y la verdad no supe como resolverlo hasta que cambié de compilador al C18. La verdad no se que es lo que pasa porque estuve usando la misma versión de CCS que sugiere Moyano para su ejemplo de comunicación por USB, cambié a configuración de los fusibles, probé con cristales de distintas frecuencias y simplemente no pude hacer que ese factor de 12 que comenta arias887  desapareciera para una prueba que quise realizar de parpadeo de un LED. Lo que te recomiendo es que intentes con C18 de Microchip, que leas el Manual y los archivos de "getting started" y el de librerías que vienen incluidos al instalar el MPLAB y el C18. Cuesta poco acostumbrarse (así como con el CCS), pero a mi me funcionó el ejemplo de parpadeo a la primera. Hice varias pruebas y funcionó con cualquier cristal y configuración de fuses. Además encontré un ejemplo de comunicación HID por USB con el 18F4550 y también me funcionó, por lo que me cambié a C18 totalmente y ahora estoy trabajando sobre el proyecto que te comento. Aquí lo puedes encontrar-> http://goo.gl/xep4t, usan el compilador HI-TECH para C18, que también es gratuito de Microchip, igualmente puedes bajar la información y/o buscarla en los documentos en la carpeta de instalación. Espero que te sea de ayuda y que les pueda servir a todos los que están intentando hacer proyectos de USB usando un PIC, el ejemplo se me hace muy sencillo (aunque no tan bien explicado como el del amigo Moyano) y creo que hay mucho para poder trabajar en base a este proyecto que les comento. Un saludo!
P.D. Todo esta en inglés, si tienen problemas al respecto solo diganme y con gusto ayudaré con dudas de traducción. Espero al final de mi proyecto postear lo que hice traducido al español.


----------



## Meta (Ago 23, 2011)

Buenas:

Habrá que hacer un tuto para el C18. Aún hay un poco de manual sobre el C18 por ahí.

http://www.micros-designs.com.ar/tutorial-mplab-c18/

Saludo.


----------



## Moyano Jonathan (Ago 23, 2011)

Hola a todos, los ejemplos de la página están todos probados con la versión de CCS v4.093. Como CCS modifica las librerías de vez en cuando ...no es posible deducir si los ejemplos van a funcionar en todas las versiones del compilador.
Actualmente trabajo con la versión 4.114, que hasta el momento me ha resultado bastante estable. El manual que está en la primera página del hilo, está desarrollado con esta versión y está 100% probado.

Con respecto al C18, en el futuro habrá un manual pero actualmente el colega Suky ha propuesto varios manuales con respecto al uso de perifericos avanzados:
http://www.micros-designs.com.ar/aplicaciones-avanzadas-en-c18/

Con respecto al tema en general del USB, se va a seguir desarrollando a lo largo del año pero antes tengo que seguir haciendo pruebas y seguir trabajando con lo que ya tenemos para entenderlo totalmente.

Un saludo !


----------



## aladarck (Ago 31, 2011)

hola manes...

soy nuevo aqui pero he leido y probado cada ejemplo que han posteado; pero para mi total descontento ninguno me funciono por lo que les queria pedir su concepto sobre mi problema.

y pus como ven en la imagen utilizo el usb view yno me aparece ninguna decripcion del descriptor del dispositivo.
estoy utilizando el ccs 4,114 en windows 7 de 64 bits.


----------



## Meta (Ago 31, 2011)

Como el C18 está para Windows, Linux y MacOS, la versión nueva de MPLAB X claro, incluido 32 y 64 bits ya que funciona bajo netbeans de Java.

http://www.microchip.com/en_US/family/mplabx/index.html

Saludo.


----------



## sjuan (Sep 5, 2011)

ola compañeros, me podrian ayudar?
la cuestion es la siguiente, tengo que hacer una interfaz tal que al oprimir un led se muestre una señal gráfica en un pc, son 12 pulsadores, ya tengo el codigo en C que cambia el valor de unas variables (12 s1, s2...) segun el pulsador que oprima y también tengo el tentrenador de moyano funcionando, trate de hacer el progama desde cero con el pdf del tutorial pero no me resulto, creo que es por que yo tengo visual estudio 2010 (fue el único legal que conseguí  en la U ) y pues bueno, no se programar en visual basic, estoy tratando de aprender a encender leds por el puerto paralelo y seguir avanzando y quisiera me indicaran que puede hacer para lograr mi cometido (aparte de seguir estudiando VB )

gracias.
salu2


----------



## foso (Sep 9, 2011)

Moya una pregunta, no se si lo han aclarado ya. En el ejemplo que está al principio de este post en PDF. La aplicación en C# con tu placa entenadora: hay un objeto en el programa de C# que se llama MENSAJES_USB y no veo en que parte lo declarás ni se a que clase pertenece.

A ver si me podes aclarar eso. No hace falta decir que te has pasado con toda esa información que compartís. 

Saludos.

Listo ya está lo encontré. Es el nombre del ListBox.

Saludos.


----------



## Moyano Jonathan (Sep 11, 2011)

> ola compañeros, me podrian ayudar?
> la cuestion es la siguiente, tengo que hacer una interfaz tal que al oprimir un led se muestre una señal gráfica en un pc, son 12 pulsadores, ya tengo el codigo en C que cambia el valor de unas variables (12 s1, s2...) segun el pulsador que oprima y también tengo el tentrenador de moyano funcionando, trate de hacer el progama desde cero con el pdf del tutorial pero no me resulto, creo que es por que yo tengo visual estudio 2010 (fue el único legal que conseguí en la U ) y pues bueno, no se programar en visual basic, estoy tratando de aprender a encender leds por el puerto paralelo y seguir avanzando y quisiera me indicaran que puede hacer para lograr mi cometido (aparte de seguir estudiando VB )
> 
> gracias.
> salu2



Cuál es tu duda específica ??


----------



## foso (Sep 11, 2011)

Moya vos instalaste algun driver en la PC cuando probaste tu tarjeta entrenadora HID ?

Te cuento: yo me armé una mucho mas resumida, solo 2 leds y 2 pulsadores.

La pc me la reconoce y la enumera. En el administrador de dispositivos me aparece como dispositivo HID. Pero no logro que la interfaz de C# haga contacto con la tarjeta.

Por ahora en el programa del PIC no puse ninguna función de enviar o recibir datos. Solo puse:

usb_init(); 
usb_task(); 
while( TRUE )
   {
      if( usb_enumerated() )
      {
         output_bit(LED_ENUM,1);   //enciende led de enumeraion USB si está enumerado
         delay_ms(50);

      }
   }
... ademas de configurar los puertos y los #FUSES.

Entonces yo compruebo la enumeración cuando se enciende el led. De hecho lo hace bien.

En la interfaz de C#, dentro de la función  "Dispositivo_Conectado(UInt32[/SIZE] handle)" le pongo que haga alguna cosa que me muestre a mi que está conectado. Pero no pasa nada. O sea que nunca entra en esta función. Puse un boton CONECTAR con la misma rutina tuya, pero tampoco se comunica.Por eso te pregunto de los drivers. Tengo la versión 4.114 del CCS.
Saludos.

Estoy viendo que puede llegar a ser un problema con el agregado de la dll. Yo la copié en el directorio del proyecto de C#  luego la agregé con ----> Proyecto----->Agregar elemento existente.

Estará bien de esa forma ???

Cuando intento agregar la libreria dll como referencia me tira un error :

"No se puede agregar una referencia (ubicacion de la dll). Asegurese de que tiene acceso al archivo y de que es un ensamblado o compoente COM válido"

  

Bueno me vengo solucionando las cosas yo solo. Pero no importa, estoy contento porque anda ahora !

Aclaro lo que me pasó por si le sirve a alguien: la dll hay que copiarla también en el directorio Debug y en el directorio Release del proyecto de C#.

Saludos.


----------



## Moyano Jonathan (Sep 12, 2011)

Foso, con respecto a tu problema es una cuestión de .dll

- HID tiene librerías nativas en todos los sistemas operativos, por lo tanto no necesitas instalar drivers.

- La librería mcHID.dll la tenés que instalar en la carpeta System32 de windows. Una vez que la librería está en esa carpeta cualquier aplicación que escribas va a poder trabajar con ella.

Un saludo y felicidades por poder solucionar tus problemas !!


----------



## swash (Sep 15, 2011)

Hola moyano, quiero convertir el programa de ccs para el 18f4550.


```
Mas concretamente tener mas entradas y salidas, ya hice los cambios pero para compilar, ccs no encuentra los archivos pic18_usb y usb.h, le he puesto algunos de internet y me ha provocado error, le he puesto los de la carpeta de CCS y me ha dado erro, me podrias indicar como hacerle para compilar bien? tengo la versión 4.12 y la verdad que no me esta sirviendo.
Saludos.
```

bueno no encontre el formato de tachar, ya pude compilarlo, ahora a levantar el icsp de mi brenner, muchas gracias por el thread moyano!


----------



## arias887 (Sep 19, 2011)

Gracias por el tuto moyano...
Logre realizarlo con exito funciona de 10, el unico problema es que no me deja ponele un icono a la "forma" pero no importa asi esta bien...

Me di cuenta que se pueden cambia los #'s de ID como para hacer que un "progama" funcione y/o sea compatible con un solo "cxto"...

Tengo una pregunta...

Como hago para que el programa desde windows, osea el que uno hace en VS 2008, envie los datos al microcontrolador al oprimir el boton N y no al soltarlo...
Es decir...
que los envie al dar clic y no al soltarlo...
ya que note que cuando das clic en cualquiera de los botones de salida, si sostienes el clic el boton se queda apretado pero no envia nada y cuando sueltas el clic el boton sume y ay si enbia los datos...

Es para hacer que se mantenga en "1" X pines de X puertos del pic mientas se mantiene el clic presionado y cuando se suelte el clic se mantengan en "0"...

EJM:
Clic sostenido= 0b00110011 (pueto b) y 0b11001100 en (puerto d)...
Clic suelto= ambos puertos en 0 (0b00000000)...

Bueno segure cacharriandole esto y si algo despues te pregunto algo, si no es molestia...

Gracias...


----------



## arias887 (Sep 19, 2011)

Bueno ya pille una forma...

-En las propiedades del boton XX vamos al cuadrito que tiene un rayito (eventos) y vamos a ver que aparecen un monton de cosas en "blanco" y aparece una que dice:*

Click= boton_XX_click*

Mas abajo hay otro que se llama "MouseDown", a ese le ponemos:

*MouseDown= **boton_XX_click*

Osea el mismo nombre del de arriba...

despues de eso nos aparece el pedaso de codigo para el "MouseDown" y hacemos sai...


```
//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--        
        private void limpiar_()
        {
            // Limpia los puetos del PIC
            byte[] BufferOUT = new byte[EasyHID.BUFFER_OUT_SIZE];
            BufferOUT[0] = 0;      // Report ID
            BufferOUT[1] = 0x00;   // Primero enviamos un comando de control al dispositivo: 
            EasyHID.Write(controlador, BufferOUT); // Envía los datos.
        }
        //--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--

        //--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--
        private void [B]boton_XX_click[/B](object sender, EventArgs e)//Suelto clic
        {
            limpiar_();
        }
        private void [B]boton_XX_click[/B](object sender, MouseEventArgs e)//Presiono clic-->MouseDown
        {
            byte[] BufferOUT = new byte[EasyHID.BUFFER_OUT_SIZE];
            BufferOUT[0] = 0;      // Report ID
            BufferOUT[1] = 0x01;   // Primero enviamos un comando de control al dispositivo: 
            EasyHID.Write(controlador, BufferOUT); // Envía los datos.
        }
        //--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--//--
```
Y hacemos lo mismo para los demas botones...

y en PIC C o CCS C, como lo quieran llamar, copiamos:


```
#include "Prueba USB 1.0.h"

//-------------------------------------------------------------------------------> Incluimos librerías utilizadas por la aplicación.
#include "pic18_usb.h"                //----------------------------------------------> Drivers's USB del PIC18F2550.
#include "APLICACION_HID.h"      //----------------------------------------------> Definición de funciones y hardware utilizado en el programa.
#include "Descriptor_easyHID.h"  //----------------------------------------------> Descriptores HID del proyecto.
#include "USB.c"                 //----------------------------------------------> Funciones del USB.
//-------------------------------------------------------------------------------> 

#bit        rc6=        0xf82.6            //----------------------------------------------> Led Error al enumerar.
#bit        rc7=        0xf82.7            //----------------------------------------------> Led USB_OK al enumerar.

int    recibe[USB_EP1_RX_SIZE];        //-------------------------------------------> Declaramos la variable recibe de 32 bytes. 
int    envia[USB_EP1_TX_SIZE];      //-------------------------------------------> Declaramos la variable envía  de 32 bytes.  

void USB_debug()
    {
    rc6= 1;                             //----------------------------------------------> Enciende el led error y apaga el led USB_OK.
    rc7= 0;
    usb_wait_for_enumeration();  //----------------------------------------------> Espera a ser enumerado por el host.
    rc6= 0;                             //----------------------------------------------> Enciende el led USB_OK y apaga el led USB_ERROR.
    rc7= 1;  
    }

void main()
{

   setup_adc_ports(NO_ANALOGS|VSS_VDD);
   setup_adc(ADC_CLOCK_DIV_2|ADC_TAD_MUL_0);
   setup_wdt(WDT_OFF);
   setup_timer_0(RTCC_INTERNAL);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
//Setup_Oscillator parameter not selected from Intr Oscillator Config tab

   // TODO: USER CODE!!

set_tris_a (0x00);
set_tris_b (0x00);
set_tris_c (0x00);
set_tris_d (0x00);
set_tris_e (0x00);

porta= 0x00;
portb= 0x00;
portc= 0x00;
portd= 0x00;
porte= 0x00;

usb_init();                  //--------------------------------------------------> Inicializamos el stack USB.
usb_task();                  //--------------------------------------------------> Habilita el periferico usb y las interrupciones.
USB_debug();                 //--------------------------------------------------> Nos muestra el estado de conección del USB. 

while (1)
    {
     if(usb_enumerated())      //-------------------------------------------------> Si el dispositivo está configurado...
        {
         usb_put_packet(1, envia, USB_CONFIG_HID_TX_SIZE, USB_DTS_TOGGLE);//-------> Enviamos el paquete de datos por USB.

            if (usb_kbhit(1))                        //----------------------------------> Si hay un paquete de datos del host.. en el buffer lo tomamos y guardamos en la variable data.
               {
              usb_get_packet(1, recibe, USB_CONFIG_HID_RX_SIZE);//----------------> En el buffer lo tomamos del EP1 y lo guardamos en la variable recibe....

                if (recibe[0]==0x00)         //----------------> Este es el de limpiar puerto
                  {portb= 0b0000;}
                if (recibe[0]==0x01)         //----------------> Este es el de poner el pueto en tal combinacion...
                  {portb= 0b0101;}
              }
        }
    }
}
```
Y ya...
Esta la unica forma que he logrado hacer lo que les dije en el comentario anterior...

Y ya tengo otra duda...


> Como hago para asignarle una tecla a un boton....
> Es decir...
> Que se habra el programa y que tales y que ese boton lo puedsa controlar con teclado...
> EJM:
> Que el "boton 1" se active/pulse y desactive/despulse cuando, respectivamente, presione y suelte la tecla "a"o la "b" o la que sea...


Espero les sirva de algo y espero que esto no sea Repost
Que descansen ya me voy a dormir que aca ya son las 5:31 a.m.


----------



## Moyano Jonathan (Sep 19, 2011)

> Como hago para asignarle una tecla a un boton....
> Es decir...
> Que se habra el programa y que tales y que ese boton lo puedsa controlar con teclado...
> EJM:
> Que el "boton 1" se active/pulse y desactive/despulse cuando, respectivamente, presione y suelte la tecla "a"o la "b" o la que sea...



No se específicamente a que te referís....por favor explícamelo más gráficamente.

Con respecto a tus logros, felicitaciones !!


----------



## Meta (Sep 19, 2011)

Hace un tiempo he intentado hacer eso y me daba problemas. Es escaneo de letras del teclado y que lo reconozca el Form1 principa. Más adelante conseguiré el código en C#.


----------



## bondadoso (Sep 22, 2011)

alguien tiene un ejemplo en c18 de bulk transfer?

lo pido porque necesito implementarlo en un pic32 pero prefiero empezar probando con un pic18, gracias


----------



## arias887 (Sep 22, 2011)

Meta dijo:


> Hace un tiempo he intentado hacer eso y me daba problemas. Es escaneo de letras del teclado y que lo reconozca el Form1 principa. Más adelante conseguiré el código en C#.



Estare esparando....


----------



## albertoxx (Sep 23, 2011)

A ver si le entiendo a arias887 si lo que quieres es que cuando alguien presione la tecla "A" del teclado haga lo mismo que haria presionando un boton X, si es asi entonces lo mas facil es poner un edit box y alli escribir en el evento que dispare el otro ej. 

private void Edit_01_KeyDown(object sender, ... //los parametros no me acuerdo 
{
  Boton_XX_click(sender...); //ejecuta el codigo como q si hubieras presionado un boton
} 
==============================
Ahora con una mi duda, para Moyano: en uno de tus primeros post subiste un pdf sobre la teoria del funcionamiento del modulo de conversion analogo digital del pic alli escribiste que usando la velocidad
de 48Mhz y un 64 Tosc da 1.33 us quiere decir que:

//de aqui
dato = read_adc();
//hasta aqui han pasado 1.33 us?

Y con que otra configuracion se logra el tiempo minimo de 700ns


----------



## Moyano Jonathan (Sep 23, 2011)

> Ahora con una mi duda, para Moyano: en uno de tus primeros post subiste  un pdf sobre la teoria del funcionamiento del modulo de conversion  analogo digital del pic alli escribiste que usando la velocidad
> de 48Mhz y un 64 Tosc da 1.33 us quiere decir que:



Eso es teorico usando ASM. Los tiempos en C suben bastante..ahora si necesitas velocidad en la conversión podrias usar un conversor externo.  Todo depende de la aplicación que quieras realizar.
Otra opción seria usar una función embebida (hecha en ASM) que trabaje bajo un código fuente hecho en C, para poder obtener los valores del conversor de manera más eficiente...pero todo depende de la aplicación ..quizas no te haga falta tanta velocidad.

Un saludo !


----------



## albertoxx (Sep 23, 2011)

Si tenes razon disminuye mucho por tanto codigo extra que mete el compilador para muestreos rapidos si creo que es necesario solo puro asm, y 100% mejor un ADC externo, solo era duda eso de los tiempos que se tarda la conversion que esta un poco dificil de entender el datasheet del pic


----------



## arias887 (Sep 25, 2011)

albertoxx dijo:


> A ver si le entiendo a arias887 si lo que quieres es que cuando alguien presione la tecla "A" del teclado haga lo mismo que haria presionando un boton X, si es asi entonces lo mas facil es poner un edit box y alli escribir en el evento que dispare el otro ej.
> 
> private void Edit_01_KeyDown(object sender, ... //los parametros no me acuerdo
> {
> ...



albertoxx no te entendi muy buen por lo que faltan "parametos", pero al fin al cabo ya estoy avanzando en esto...

Hay que usar el KeyPreview, el KeyPress y el KeyUp en la "Forma" principal...

en cuanto aclare unas  dudas le subo la info...


----------



## foso (Sep 26, 2011)

Moya: tenés idea si esa librería dll de la empresa MecaniqueUK es libre y gratuita ?? tengo curiosidad de donde la sacaste. EN realidad me gustaría aprender a armar algo así, pero ya el lenguaje se hace muy específico de windows y se pone dificil.

Otra cosa, si es una librería específica para dispositivos HID, debería poder utilizarce con cualquier otro micro ( no de Microchip ) también. No?


----------



## Moyano Jonathan (Sep 26, 2011)

> Moya: tenés idea si esa librería dll de la empresa MecaniqueUK es libre y gratuita ?? tengo curiosidad de donde la sacaste. EN realidad me gustaría aprender a armar algo así, pero ya el lenguaje se hace muy específico de windows y se pone dificil.



La librería no aplica a fines comerciales, tendrías que armar algo en base a la librería genérica de windows.



> Otra cosa, si es una librería específica para dispositivos HID, debería poder utilizarce con cualquier otro micro ( no de Microchip ) también. No?



En si la librería lo que hace es gestionar las comunicaciones entre windows y el controlador USB que se comunica con el dispositivo. Podés crear una aplicación por ejemplo con ATMEL y usar la librería sin ningún problema.


----------



## foso (Sep 27, 2011)

Gracias por la info. Saludos.


----------



## arias887 (Oct 1, 2011)

Hoda de nuevo...

Aca les dejo un tipo de 2° tutorial para el control por puerto usb con VS 2008 y CCS C para enviar los dato al opimir la teclas del teclado dela PC (que era lo que yo queria hacer)...

Es muy cortico pensado para los que ya nos leimos la promera parte...

Me parece que seria bueno que Moyano Jonathan lo pusiera en la 1° respuesta jinto al primer tutorial...

Espero les sirva de algo...


----------



## Deego (Oct 2, 2011)

Por fin, por fiiiiiiiiiiiiiin  91 páginas leídas,  sigo vivo!!.  Me disculpo por mis primeras intervenciones en este hilo, cuando no lo había leído completo y me surgían muchas dudas.  Claro, aún tengo varias, las tengo que aclarar bien y luego las postearé.  Aunque, ahora se me viene una así rápida a la cabeza.  Estoy utilizando HID con la librería mcHID.dll y es para una aplicación que va a quedar implementada en mi universidad, y pues leí que algunos dll no tenían fines comerciales, tendré problemas con esta dll en mi proyecto en cuanto a este tema??? Gracias de antemano.


----------



## Moyano Jonathan (Oct 2, 2011)

> Estoy utilizando HID con la librería mcHID.dll y es para una aplicación que va a quedar implementada en mi universidad, y pues leí que algunos dll no tenían fines comerciales, tendré problemas con esta dll en mi proyecto en cuanto a este tema???



Si la aplicación es sin fines de lucro no tendrías que tener problemas.

Un saludo y esperamos tus aportes !


----------



## arias887 (Oct 3, 2011)

Esoty intentando hacer que el pic (18F4450) haga cosas cuando este desconectado del host, peo no lo logro...
Lo tengo con alimentacion externa a 5V, para que detecte la connecion por hardware usando el SENSE_PIN en la para 8 (re0)...
Cuando lo conecto a los 5V se enciende el led de "no enumerado" pero no hace nada mas, deberia hacer una secuencia en el purto B, pero nada...
y ciando lo conecto al USB, se enciende el led de "enumerado", pero cuando lo voy a trabaja desde la aplicacion hecha en visual es como si no ubiera nada conectado...

No se que hacer, el codigo que estou usando es el siguente:


```
#include "Conección USB.h"    //-------------------------------------------> Aca estan todos los FUSES.

//-------------------------------------------------------------------------------> Incluimos librerías utilizadas por la aplicación.
#include "pic18_usb.h"                //----------------------------------------------> Drivers's USB de los PIC18F [ original ].
#include "Descriptor_easyHID.h"  //----------------------------------------------> Descriptores HID del proyecto.
#include "USB.c"                 //----------------------------------------------> Funciones del USB [ original ].
//-------------------------------------------------------------------------------> 

#byte        porta=    0xf80
#byte        portb=    0xf81
#byte        portc=    0xf82
#byte        portd=    0xf83
#byte        porte=    0xf84

#bit        ra0=        0xf80.0
#bit        ra1=        0xf80.1
#bit        ra2=        0xf80.2
#bit        ra3=        0xf80.3
#bit        ra4=        0xf80.4
#bit        ra5=        0xf80.5

#bit        rb0=        0xf81.0
#bit        rb1=        0xf81.1
#bit        rb2=        0xf81.2
#bit        rb3=        0xf81.3
#bit        rb4=        0xf81.4
#bit        rb5=        0xf81.5
#bit        rb6=        0xf81.6
#bit        rb7=        0xf81.7

#bit        rc0=        0xf82.0
#bit        rc1=        0xf82.1
#bit        rc2=        0xf82.2
#bit        rc6=        0xf82.6            //----------------------------------------------> Led Error al enumerar.
#bit        rc7=        0xf82.7            //----------------------------------------------> Led USB_OK al enumerar.

#bit        rd0=        0xf83.0
#bit        rd1=        0xf83.1
#bit        rd2=        0xf83.2
#bit        rd3=        0xf83.3
#bit        rd4=        0xf83.4
#bit        rd5=        0xf83.5
#bit        rd6=        0xf83.6
#bit        rd7=        0xf83.7

#bit        re0=        0xf84.0          //----------------------------------------------> Usado para "USB_CON_SENSE_PIN"
#bit        re1=        0xf84.1
#bit        re2=        0xf84.2

#define USB_CON_SENSE_PIN re0
//#define USB_CONFIG_HID_TX_SIZE   32 //------------------------------------------->  Definimos el tamaño del endpoint de salida.
//#define USB_CONFIG_HID_RX_SIZE   32 //------------------------------------------->  Definimos el tamaño del endpoint de entrada.

int    recibe[USB_EP1_RX_SIZE];        //-------------------------------------------> Declaramos la variable recibe de 32 bytes. 
int    envia[USB_EP1_TX_SIZE];      //-------------------------------------------> Declaramos la variable envía  de 32 bytes.  

void secuencia ()
    {
     rb0= 1;
     delay_ms (250);
     rb1= 1;
     delay_ms (250);
     rb2= 1;
     delay_ms (250);
     rb3= 1;
     delay_ms (250);
     portb= 0x00;
    }

void secuencia_0 ()
    {
     rb0= 1;
     delay_ms (100);
     rb1= 1;
     delay_ms (100);
     rb2= 1;
     delay_ms (100);
     rb3= 1;
     delay_ms (100);
     portb= 0x00;
    }

void USB_debug()
    {
    rc6= 1;                             //----------------------------------------------> Enciende el led error y apaga el led USB_OK.
    rc7= 0;
    usb_wait_for_enumeration();  //----------------------------------------------> Espera a ser enumerado por el host.
    rc6= 0;                             //----------------------------------------------> Enciende el led USB_OK y apaga el led USB_ERROR.
    rc7= 1;  
    }

void main()
{
    setup_adc_ports(NO_ANALOGS|VSS_VDD);
   setup_adc(ADC_CLOCK_DIV_2|ADC_TAD_MUL_0);
   setup_wdt(WDT_OFF);
   setup_timer_0(RTCC_INTERNAL);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
//Setup_Oscillator parameter not selected from Intr Oscillator Config tab

   // TODO: USER CODE!!

set_tris_a (0x00);
set_tris_b (0x00);
set_tris_c (0x00);
set_tris_d (0x00);
set_tris_e (0x00);

porta= 0x00;
portb= 0x00;
portc= 0x00;
portd= 0x00;
porte= 0x00;

     usb_init();                  //--------------------------------------------------> Inicializamos el stack USB.
     USB_debug();                 //--------------------------------------------------> Nos muestra el estado de conección del USB.

while (1)
    {
     usb_init_cs();
     usb_task();                   //--------------------------------------------------> Habilita el periferico usb y las interrupciones.

if (usb_attached())
{
     if(usb_enumerated())      //-------------------------------------------------> Si el dispositivo está configurado...
        {
         usb_put_packet(1, envia, USB_CONFIG_HID_TX_SIZE, USB_DTS_TOGGLE);//-------> Enviamos el paquete de datos por USB.

            if (usb_kbhit(1))                        //----------------------------------> Si hay un paquete de datos del host.. en el buffer lo tomamos y guardamos en la variable data.
               {
              usb_get_packet(1, recibe, USB_CONFIG_HID_RX_SIZE);//----------------> En el buffer lo tomamos del EP1 y lo guardamos en la variable recibe....
               if (recibe[0]==0x00) {secuencia();}
              }
         }
}
    if (!usb_attached())
        {
         secuencia_0();
        }
    }
}
```
*#define USB_CONFIG_HID_TX_SIZE   32*   y *#define USB_CONFIG_HID_RX_SIZE   32* estan comentariadas porque me sale que stan repetidas cuando lo compilo e igual me funciona el programa cuando no uso el SENSE_PIN, *#define USB_CON_SENSE_PIN re0* tambien me dice que esta repedido pero lo dejo porque se "necesita", y no me sale ningunn error...

Enn fin, si me pueden ayudar les estaria muy agradecido...


----------



## Deego (Oct 3, 2011)

Bueno, les aviso que me di cuenta en estos días que la versión 4.120 de CCS ya ha salido para que la busquen, claro, si es que ya no la tienen instalada. Saludos!!


----------



## Deego (Oct 4, 2011)

Una pregunta señores, la librería mcHID.dll , es cierto que está hecha en C++ ???.  Me gustaría conocerla más a fondo debido a que de pronto alguna vez quiera utilizar más funciones de esta entonces solo sería mirarla y tratar de entenderla.  Me dijeron que la única forma de abrir una dll es llamándola desde el programa desde el cual fue creado.


----------



## Ivan Martinez (Oct 7, 2011)

Primero que nada muchisimas gracias por este hilo que abriero me a servido de mucho en mi proyecto y me a ido de maravilla hasta hoy, tengo un pequeño inconveniente deseo controlar 3 displays de 4 digitos cada uno mi problema es.

mando un dato de control en un buffer y en el siguiente el dato del numero pero no funciona entra en el primer if pero no en el siguiente?


```
void main(void)                                                         // Función Principal.
{
    // Variables globales.

    int8    recibe[USB_EP1_RX_SIZE];                                    // Declaramos la variable recibe de 32 bytes.
    
                               
  
    // Configuraciones varias.

    set_tris_b(0xF0);                                                   // Nibble bajo salidas, el alto entradas.
    output_b(0x00);                                                     // Inicializamos las salidas a 0.
    set_tris_c(0b00111000);                                             // RC0,RC1,RC2,RC6,RC7,como salidas. Las demás
                                                                        // RC4,RC5, como entradas.


    usb_init();                                                         // Inicializamos el stack USB.

    usb_task();                                                         // Habilita el periferico usb y las interrupciones.
                           


    while (TRUE)                                                        // Bucle infinito.
    {
        if(usb_enumerated())                                            // Si el dispositivo está configurado...
        {
                   

            if (usb_kbhit(1))                                           // Si hay un paquete de datos del host.. en el buffer lo tomamos y guardamos en la variable data.
            {
                usb_get_packet(1, recibe, USB_CONFIG_HID_RX_SIZE);      // En el buffer lo tomamos
                  output_toggle(pin_b1); // Enciende porque hay datos
                                                     
                if(recibe[0]==0x0A){ 
			output_toggle(pin_b1);  // Enciende porque mande el comando de control
                     		if(recibe[1]==0x0A){
					
					output_toggle(pin_b0);
                                                         //Deveria encender  porque tambien le mande el dato de control desde el c# 
				}
                        
                         }
                    }
                
                
            }
        }
    }
}
```

Como viene en las lineas comentadas en el ultimo if no entra siendo que yo le mando los numeros de control para que entren en los if y no lo hace solo en el primero siendo que deveria encender los 3 leds que le coloque para verificar que este recibiendo los datos y al parecer el del solo recibe o solo compara uno de ellos le e probado de varias maneras pero no entra en el if  (las pruebas fueron en el prototipo fisico)

¿porque no lee todos los buferss?


de antemano gracias


----------



## Deego (Oct 7, 2011)

Ivan Martinez dijo:


> Primero que nada muchisimas gracias por este hilo que abriero me a servido de mucho en mi proyecto y me a ido de maravilla hasta hoy, tengo un pequeño inconveniente deseo controlar 3 displays de 4 digitos cada uno mi problema es.
> 
> mando un dato de control en un buffer y en el siguiente el dato del numero pero no funciona entra en el primer if pero no en el siguiente?
> 
> ...




Amigo, creo que te falta una llave para cerrar. Intenta cerrando el penúltimo IF y después si abriendo el otro IF aparte.  Tal vez sea por eso porque ese último está dentro de la primera condición que es cuando te enciende y luego cuando intentas enviarle datos con la última condición esta no se cumple porque para que se cumpla primero se tiene que cumplir la del penúltimo IF.  Espero que me haya hecho entender.  En resumen, y como dije al principio, intenta cerrando el penúltimo if con una llave de cierre y luego si escribiendo el último.


----------



## Ivan Martinez (Oct 7, 2011)

Deego dijo:


> Amigo, creo que te falta una llave para cerrar. Intenta cerrando el penúltimo IF y después si abriendo el otro IF aparte.  Tal vez sea por eso porque ese último está dentro de la primera condición que es cuando te enciende y luego cuando intentas enviarle datos con la última condición esta no se cumple porque para que se cumpla primero se tiene que cumplir la del penúltimo IF.  Espero que me haya hecho entender.  En resumen, y como dije al principio, intenta cerrando el penúltimo if con una llave de cierre y luego si escribiendo el último.



Gracias por contestar

Las llaves estan bien me equivoque al pasarlo aqui pero les di una revisada de nuevo y no funciona ademas la otra forma que trate de comprovar si esta correcto es de que el primer if de control le puse el buffer[3] que lo comparara y no entra en el if pero si le pongo 1 o 2 si lo compara y en el c# le mando el codigo de control en diferentes buffers 
pero cuando lo trato de leer en el pic no lo lee solo asta el numero 2

buffer[1]=Contorl


buffer[2]=Contorl


buffer[3]=Contorl


buffer[4]=Contorl


buffer[5]=Contorl

Ay que meditar jejej


----------



## Deego (Oct 7, 2011)

Pues al parecer el código de CCS está bien, no será problema en la programación de c# ?  Pues está muy raro tu problema, hay un ejemplo de moyano en donde utiliza varios buffers para activar varios relés, al parecer funciona perfectamente, no se si ya lo hayas visto.


----------



## Ivan Martinez (Oct 7, 2011)

Ya funciono pero hasta el 2 nivel de los if, el de moyano si lo vi pero solo utiliza 2 buffers.

Despues escribo porque estoy con el telefono posteando esto y es incomodo jeje

gracias por la ayuda

el proyecto que estoy realizando es un control de una matriz de 10 caracteres y 3 visualizadores con 4 digitos los primeros 2 y de 5 el ultimo y por eso necesito usar varios bufers


----------



## Deego (Oct 7, 2011)

Pues el que yo vi que hizo moyano utiliza 4 buffers.  Y estoy seguro porque en este momento lo estoy viendo.


----------



## Ivan Martinez (Oct 9, 2011)

Hola de nuevo ya cheke mi codigo y esta funcionando pero al tratar de guardar los datos del buffer no ay nada. Desde la pc le mando una serie de numeros en los buffer y si lo manda pero al momento de leerlo en el pic no funciona solo puedo obtener el valor del 1 y del 2 en adelante no ay nada.siendo que la pc si lo manda porque ago cambios y el buffer 1 si cambia pero los demas no 

que estara pasando?

Ademas para leer los buffer le ago igual que el buffer uno pero nada esta extraño 

ojala me puedan ayudar?

Gracias por su atencion


----------



## Ivan Martinez (Oct 9, 2011)

Deego dijo:


> Pues el que yo vi que hizo moyano utiliza 4 buffers.  Y estoy seguro porque en este momento lo estoy viendo.



este es el codigo:


```
// Versión de la plantilla para cristal de 4.00Mhz.
#include <18F4550.h> // Definición de registros internos del PIC18F4550.
#fuses NOMCLR,XTPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL1,CPUDIV1,VREGEN,NOPBADEN
#use delay(clock=48000000) // Trabajamos a 48.00Mhz.

// Definiciones del USB:
#DEFINE USB_HID_DEVICE TRUE // Vamos a utilizar el protocolo HID.
#define USB_EP1_TX_ENABLE USB_ENABLE_INTERRUPT 
#define USB_EP1_TX_SIZE 8 // Definición del tamaño del buffer de salida.
#define USB_EP1_RX_ENABLE USB_ENABLE_INTERRUPT 
#define USB_EP1_RX_SIZE 8 // Definición del tamaño del buffer de entrada.

// Definiciones varias:
#define ON  output_high

#define OFF output_low

// Definicion de control
#define CARTON   170  //Comando para activar visualizador

// Salidas de uso general.
#define LED1 PIN_B0 

//Registro 4094
#define DATA   PIN_B1
#define CLOCK  PIN_B2
#define STROBE PIN_B3

/*********************************************************************************************************/
// Definición de las librerías utilizadas.
#include <pic18_usb.h>    // Drivers's USB del PIC18F4550.
#include <USB_easyHID_descriptores.h> // Descriptores USB para la placa MoyaPIC_USB28 y easyHID.
#include <usb.c> // Funciones del USB.

   //0 1 2 3 4 5 6 7 8 9
 INT const segmentos[10]={0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90};
void escribir(INT caracter);

/**********************************************************************************************************/
void main() 
{
   //Cuerpo principal del programa.
   //Variables locales del main.
   CHAR recibe[8];//Variable que contiene los datos que se van a visualizar en los led's.
   CHAR dcarton[5];
   INT t;

   //Configuramos los puertos del microcontrolador:
   //set_tris_a(0x00);//Define el puerto A.//RA0, como entrada
   set_tris_b(0x00);//Define el puerto B.//Todo el puerto B como salida.
   //set_tris_c(0b00000000);
   //set_tris_d(0b00000000);
   //set_tris_e(0b00000000);
   output_b(0x00);//Limpiamos el puerto B.
   output_b(0xff);
   delay_ms(500);
   output_b(0x00);

   //Otras configuraciones:
   disable_interrupts(global);
   disable_interrupts(INT_timer1);
   disable_interrupts(INT_rda);
   disable_interrupts(INT_ext);
   disable_interrupts(INT_ext1);
   disable_interrupts(INT_ext2);
   setup_spi(FALSE);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
   port_b_pullups(FALSE);
   usb_init_cs();//inicia el USB y sale. Va de la mano con usb_task().
   WHILE(true)
   {
      
      usb_task();//Configuramos el puerto USB.
      IF(usb_enumerated())//Si el puerto es enumerado y configurado por el host..
      {
         IF(usb_kbhit(1))//Si hay un paquete de datos en el buffer lo tomamos y guardamos en la variable data.
         {
            usb_get_packet(1, recibe, 8);
            output_toggle(LED1);
            delay_ms(200);

            IF(recibe[0]==CARTON)
            {
       [B][COLOR="Red"] // Aqui esta el error[/COLOR][/B]
               dcarton[0]=recibe[1];[COLOR="Lime"] //funciona[/COLOR]
               delay_ms(50);
               dcarton[1]=recibe[2];[COLOR="rgb(65, 105, 225)"]//no funciona[/COLOR]
               delay_ms(50);
               dcarton[2]=recibe[3];[COLOR="rgb(65, 105, 225)"]//no funciona[/COLOR]
               delay_ms(50);
               dcarton[3]=recibe[4];[COLOR="rgb(65, 105, 225)"]//no funciona[/COLOR]
               delay_ms(50);
               dcarton[4]=recibe[5];[COLOR="RoyalBlue"]//no funciona[/COLOR]
               delay_ms(50);
               output_toggle(LED1);
               delay_ms(50);
            }
         }

      }

      
      //Visualizadores
      
      FOR(t=0; t<5; t++)
      {
         escribir(dcarton[t]);
         delay_ms(500);
      }
   }
}

   
void escribir(INT caracter)
{
   INT c;
   OFF(PIN_B1);
   OFF(STROBE);
   OFF(CLOCK);
   FOR(c=0; c<8; c++)
   {
      output_bit(DATA, bit_test(segmentos[caracter], c));
      ON(CLOCK);
      delay_cycles(1);
      OFF(CLOCK);
   }

   OFF(CLOCK);
   ON(STROBE);
   delay_cycles(1);
   OFF(STROBE);
}
```

todo funciona lo unico es en la parte donde obtiene los valores del buffer donde el buffer[1] si lo lee y lo guarda en dcarton y los demas buffer no los guarda o no contienen nada [2],[3]....
no se que pasa.

y en el software esta correcto porque el buffer uno lo mando igual que los demas y lo ago por partes osea que no puse un for.

el software
:


```
private void UPDATE_USB_Tick(object sender, EventArgs e)
        {

            
            int num1;
            //Datos a enviar al pic
            byte[] BufferOUT = new byte[EasyHID.BUFFER_OUT_SIZE];
            BufferOUT[0] = 0x0;    // Report ID
            BufferOUT[1] = 0xAA;   // Primero enviamos un comando de control 0x0A (CARTON).

            char MYCARACTER;
            string mystr = CARTON.Text;

            int i;

            for (i = 0; i < 5; i++)
            {

                MYCARACTER = mystr[i];
                // COMO CONVIERTO DE CHART A INT
                num1 = (Convert.ToInt32(MYCARACTER)) - 48;

                switch (num1)
                {

                    case 0:
                        dato = 0x00; break;
                    case 1:
                        dato = 0x01; break;
                    case 2:
                        dato = 0x02; break;
                    case 3:
                        dato = 0x03; break;
                    case 4:
                        dato = 0x04; break;
                    case 5:
                        dato = 0x05; break;
                    case 6:
                        dato = 0x06; break;
                    case 7:
                        dato = 0x07; break;
                    case 8:
                        dato = 0x08; break;
                    case 9:
                        dato = 0x09; break;

                }

                BufferOUT[i + 2] = dato;


            }
            
            

            EasyHID.Write(controlador, BufferOUT); // Envía los datos.
            
        }
```

manda los datos cada 5 segundo y los toma de un textbox los 5 digitos y los convierte para mandarlos al pic



espero me puedan ayudar

muchas gracias por su atencion

espero una solucion si no tendre que hacer maravillas con el buffer que funciona jejeje


----------



## Moyano Jonathan (Oct 9, 2011)

Bueno perdón por no poder responder todas sus preguntas a la brevedad ...las he leido..pero no he tenido tiempo para analizar lo que les pasa 

Les explico algunos puntos para que tengan en cuenta:

Las transferencias que yo he realizado siempre las realicé usando 1 solo buffer con un tamaño máximo máximo de 64 bytes.

Esto es una limitación física ya que por endpoint no podemos manejar más de 64 bytes...según lo que dice la hoja de datos del PIC18F2550.

Según la arquitectura del PIC18F2550 podemos manejar hasta 15 endpoint's (16 tomando en cuenta el de control).

El PIC puede realizar transferencias usando el modo PING - PONG....usando toda la capacidad del microcontrolador para comunicarse....el problema está en que hay definido 1 solo endpoint para trabajar con la librería de CCS...cosa que no ocurre en el driver de C18..con lo cual nuestro buffer puede tener un tamaño máximo de 64 bytes de entrada y 64 bytes de salida.

En su momento encontré un modo de acceder a más endpoint...según lo que hizo un usuario de otro foro...pero nunca lo implementé.

*AHORA LO IMPORTANTE:*

El error que se muestra más arriba es por los cambios que ha relizado CCS en sus librerías a partir de la versión 4.093....es por esto que a los usuarios han tenido problemas al manejar sus programas...debido a que no he posteado las diferencias que encontré.

Ahora *SI* expuse las diferencias en el manual que realicé sobre el puerto USB ...(que cabe mencionar, no está terminado)..ahí se muestra en el firmware los cambios que hice, por lo que es cuestión de analizar el código e implementarlo en sus propios programas.

Un saludo !


----------



## Ivan Martinez (Oct 10, 2011)

Moyano Jonathan dijo:


> Bueno perdón por no poder responder todas sus preguntas a la brevedad ...las he leido..pero no he tenido tiempo para analizar lo que les pasa
> 
> Les explico algunos puntos para que tengan en cuenta:
> 
> ...




Primero que nada muchisimas gracias por toda la informacion que a puesto en este hilo.

El problema que tenia ya lo resolvi el descriptor que tengo declarado en el codigo fue lo que cambie por otro y funciono correctamente.

Al parecer el archivo del descriptor no estaba bien configurado.

Muchas gracias por su ayuda


----------



## guillerusso (Oct 13, 2011)

> Primero que nada muchisimas gracias por toda la informacion que a puesto en este hilo.
> 
> El problema que tenia ya lo resolvi el descriptor que tengo declarado en el codigo fue lo que cambie por otro y funciono correctamente.
> 
> ...



Hola Ivan Martinez, me podrias pasar el codigo o el descriptor para transmitir mas de dos buffer, gracias.


----------



## Moyano Jonathan (Oct 14, 2011)

> El problema que tenia ya lo resolvi el descriptor que tengo declarado en el codigo fue lo que cambie por otro y funciono correctamente.
> 
> Al parecer el archivo del descriptor no estaba bien configurado.



El problema no es que el descriptor esté mal configurado ..sinó que en las versiones posteriores a la 4.093 de CCS...el descriptor lo estructuran de otra manera...por lo cuál da errores en las comunicaciones.

Un saludo !


----------



## sjuan (Oct 14, 2011)

Ola moyano, muchas gracias por ese aporte que le diste al foro, quiero aprender a programar, y quiero seguri los ejemplos que has dado en el comienzo del post, pero cuando voy a abrir el software del primer ejemplo, el de VB me sale un mensaje
 "el componente MSCOMM32.OCX o uno de sus archivos dependientes no esta registrado correctamente: falta un archivo o esta dañado" 
sabes que puede ser, estoy trabajando en win7 32 bits sera eso?


----------



## Moyano Jonathan (Oct 14, 2011)

> Ola moyano, muchas gracias por ese aporte que le diste al foro, quiero aprender a programar, y quiero seguri los ejemplos que has dado en el comienzo del post, pero cuando voy a abrir el software del primer ejemplo, el de VB me sale un mensaje
> "el componente MSCOMM32.OCX o uno de sus archivos dependientes no esta registrado correctamente: falta un archivo o esta dañado"
> sabes que puede ser, estoy trabajando en win7 32 bits sera eso?



Es un archivo de VB 6.0...tenés que tener instalado el VB 6.0 y te va a desaparecer.


----------



## guillerusso (Oct 14, 2011)

Hola Moyano como siempre impresionante lo tuyo, te queria consultar de como puedo lograr que el micro mande datos a la PC o mas especificamente a Visual Basic 6.0 ya que en tus ejemplos prendo los led, pero no puedo leer el conversor ni las entradas digitales, esto solo me sucede con windows 7 64bits, ya que en XP funciona perfecto, gracias.

Ha me olvidaba un ejemplo tuyo (el del gamepad) si funciona bien en windows 7


----------



## Moyano Jonathan (Oct 14, 2011)

> Hola Moyano como siempre impresionante lo tuyo, te queria consultar de como puedo lograr que el micro mande datos a la PC o mas especificamente a Visual Basic 6.0 ya que en tus ejemplos prendo los led, pero no puedo leer el conversor ni las entradas digitales, esto solo me sucede con windows 7 64bits, ya que en XP funciona perfecto, gracias.



En el manual que está en la primera página te muestro como hacerlo. Un saludo !


----------



## MatheusLPS (Oct 18, 2011)

Olá pessoal.

Soy do Brasil. Não falo espanhol/castelano....

I will write in english, ok?

So, I just download this fabulous HID project. 

Now I am reading it to learn how to modify it and make my owns projects...

But I have an strange problem. I just opened the *APLICACION_HID.c* file and tried to compile it, but have some errors on the beginning of the file.

The error is on this 2 variables:

int8    recibe[USB_EP1_RX_SIZE];
int8    envia[USB_EP1_TX_SIZE];

The image with the error:

http://img.photobucket.com/albums/v222/ahhh/Eletronica/erro_hid.jpg

But, if I simulate with the .hex that came with the project, this works like a charm.

Simulating the project with Virtual Box + Windows 7 32 bits + Proteus:

http://img.photobucket.com/albums/v222/ahhh/Eletronica/funcionando.jpg

May someone help me?

bye

Abraços

Matheus Lopes
Brasil


----------



## Moyano Jonathan (Oct 18, 2011)

Hola Matheus como estás ?

Mirá es un error muy común...debido principalmente a la versión del compilador. Bajate e instala la versión 4.114 del CCS.
Con eso tendrías que solucionar el problema. Un saludo grande desde argentina y que estés bien !


----------



## MatheusLPS (Oct 19, 2011)

Hola Moyano Jonathan, 

Problem solved.

I Installed the version 4.114 and it is working now. 

I was using the version 4.057.

Obrigado.

Saludo!!!!


----------



## spiritbreaker (Oct 23, 2011)

Felicitaciones Moyano por tus aportes son de gran ayuda!!!


----------



## sirias52 (Oct 24, 2011)

Hola que tal a todos, tengo una pregunta. Con usb bulk se puede usar la opcion de pinsense?


----------



## MatheusLPS (Oct 24, 2011)

I modified the code from CCS and the C#.

Now I can count pulses that arrive on the CCP PIN.

Testing:

http://img.photobucket.com/albums/v222/ahhh/Teste_Projeto_Joo_Procopio.jpg

Very good the project!!!!

Really usefull!!

Thanks!


----------



## Moyano Jonathan (Oct 24, 2011)

> Hola que tal a todos, tengo una pregunta. Con usb bulk se puede usar la opcion de pinsense?



Esa opción es ajena al tipo de conección...depende del driver hardware del USB. Por lo tanto si podés usar la opción de que se fije cuando el dispositivo se ha conectado.



> I modified the code from CCS and the C#.
> 
> Now I can count pulses that arrive on the CCP PIN.



Felicitaciones por el avance de tu proyecto. Me alegra saber que te haya servido.

Un saludo !


----------



## seaarg (Oct 24, 2011)

He terminado de construir un osciloscopio digital con un ADC + memoria sram 32K + 18f2550 para la transferencia usb.

Estoy usando el protocolo HID en CCS C que me ha funcionado perfectamente en otros casos pero en este no (o no muy bien).

Mi constante USB_CONFIG_HID_TX_SIZE es 64, la idea es enviar 512 paquetes de 64 bytes a la PC. Trabajo a 48mhz, no uso WDT

Funciona, pero tarda al menos 10 segundos en enviar los 32K de datos a la PC, otras veces la PC no reporta que haya terminado la transferencia (sin embargo el pic no se cuelga, si le envio un dato desde la PC empieza a responder de nuevo enviando mas caracteres)

Segun mis calculos, 64 bytes cada 1ms (timeframe del usb hid) deberian ser 512 ms, digamos 2 segundos como mucho, cierto?

Preguntas:
1)- ¿Es normal que tarde tanto en HID para enviar 32KB? Aclaro que la PC no hace ningun proceso que pudiera demorar mientras espera datos.
2)- ¿Hay algo hecho con bulk? he mirado las paginas pero entiendo que aun no esta estudiado

Esta instruccion:
     while(usb_tbe(1) == FALSE);
La puse porque me pasaba que la instruccion usb_puts() devolvia false luego de varios envios (indicando que el buffer de salida aun no estaba vacio)

Esta otra:
      usb_task();
La puse porque he visto en foros que cada cierto tiempo hay que ejecutarla (no estoy muy convencido pero sin ella tengo los mismos resultados)

¿Usando usb_put_packet() habra diferencia?

Pongo aqui la parte conflictiva del codigo.


```
p = 0;
   for(i=0;i < 32768;i++) {
   
      // Esperar buffer de endpoint vacio
      while(usb_tbe(1) == FALSE);
      // Habilita el periferico usb y las interrupciones.
      usb_task();

      respuesta[p] = input_b();
      p++;
      if (p == 64) {
         p = 0;
         usb_puts(1, respuesta, USB_CONFIG_HID_TX_SIZE, 0);
      }
   
      // Avanzar el contador
      output_high(OUT_CLK_LOWSPD);
      output_low(OUT_CLK_LOWSPD);

   }

}
```


----------



## Moyano Jonathan (Oct 25, 2011)

> ¿Es normal que tarde tanto en HID para enviar 32KB? Aclaro que la PC no hace ningun proceso que pudiera demorar mientras espera datos.



Para el Driver de CCS..si puede tardar eso...lo que vos comentas de 64 bytes a 1ms...es un caso ideal...y hay que hacer varias modificaciones para poder llegar a esa tasa de transferencia.

Un usuario del foro todopic lo pudo realizar y mostró algunos de los cambios que le hizo para lograr una transferencia de 50 bytes cada 1 ms.

http://www.todopic.com.ar/foros/index.php?topic=25188.40


----------



## seaarg (Oct 25, 2011)

Haciendo pruebas, logre transferir 512 paquetes de 64 bytes en 4 segundos. Aun es poco... voy a investigar la info que pusiste. Gracias!


----------



## seaarg (Oct 25, 2011)

Sin modificar nada de las librerias de CCS, usando el ejemplo HID tuyo moyano (el que siempre use) hice el siguiente #define

#define USB_CONFIG_HID_TX_SIZE   64 // Definimos el tamaño del endpoint de salida.
#define USB_CONFIG_HID_TX_POLL   1
#define USB_CONFIG_HID_RX_SIZE   2  // Definimos el tamaño del endpoint de entrada.

Donde el valor de USB_CONFIG_HID_TX_POLL era 10ms en el easyHID, y lo estoy "pisando" con un polling de 1ms.

Aparentemente, ahora esta transfiriendo los 32KB en menos de 1 segundo (asumo que debe ser 0.5segs mas o menos) y los datos estan en VB.net

Aun no he verificado que los datos esten correctos (no tengo mucha forma de hacerlo tampoco). ¿Puede ser que haya logrado esa velocidad sin modificar nada mas que el polling time? O tiene que haber algo que no este bien?


----------



## Moyano Jonathan (Oct 25, 2011)

> Sin modificar nada de las librerias de CCS, usando el ejemplo HID tuyo moyano (el que siempre use) hice el siguiente #define
> 
> #define USB_CONFIG_HID_TX_SIZE 64 // Definimos el tamaño del endpoint de salida.
> #define USB_CONFIG_HID_TX_POLL 1
> #define USB_CONFIG_HID_RX_SIZE 2 // Definimos el tamaño del endpoint de entrada



Yo siempre usé polling time de 10ms...pero nunca he tenido que transferir grandes paquetes de datos...quizás esa sea la modificación definitiva.

Un saludo !


----------



## seaarg (Oct 26, 2011)

Bien, veremos que pasa cuando haga una verificacion de los datos (como son desde un ADC, los desconozco)

Cualquier cosa comento, pero dejo asentado aqui: Modificar en el easyHID_descriptors ese parametro (o mejor, establecer el #define antes de la inclusion del mismo)

Aun puedo mejorar la velocidad, ya que en VB.net mi rutina de obtencion de datos hace un traspaso de vectores para eliminar el primer elemento del mismo (obligatorio en hid, es el message ID y no es un dato "desde" el pic).

La modificare para no hacer ese traspaso de vectores y seguro que mas velocidad le saco. Me lei todo el thread que me pasaste de foropic, me resulta extraño que esa persona tuvo que hacer tantas cosas para obtener esta velocidad y en mi caso solo tuve que cambiar el polling.

Posiblemente sea porque el necesitaba esa velocidad y encima constante durante bastante tiempo. (ademas el tenia que atender el ADC mientras transmitia) En mi caso son rafagas de 32KB.


----------



## josej (Oct 27, 2011)

buen dia, me estoy iniciando en la comunicacion pc-pic por usb, realice la comunicacion cdc del primer ejemplo del post y me aparece el problema de que puedo enviar caracteres del pic al pc pero no viceversa. he tratado todo, revise mil veces el hardware y firmware y nada que funciona. si alguno tuvo un problema similar y encontro solucion me seria de gran utilidad.. por cierto excelente trabajo con todos sus aportes! espero colocar mi granito de arena tambien cuando tenga mas experiencia..


----------



## arias887 (Oct 28, 2011)

Una pregunta que creo que es muy importante....



> Si yo tengo o diseño [osea elgo propio] un cxto, una interfas grafica y la programacion del pic haciendo uso del driver "mcHID.dll", teniendo en cuenta que el dicho driver no es mio...
> 
> ¿¿¿ Puedo "vender" esa "aplicacion" siempre y cuando respete los derechos de autor del driver, osea, espesificando que el driver es de "Juanito" y no mio y por lo tando el driver no entraria en "la factura"...
> 
> Osea cobrar solo el cxto y la interfas grafica mas no el driver ???? ....


Gracias...


----------



## josb86 (Oct 28, 2011)

la la respuesta anterior creo que por ética no se debería cobrar el driver (aunque nadie se va a dar cuenta), pero si por el costo de componentes y mano de obra.


----------



## Deego (Nov 4, 2011)

Tengo varias inquietudes, en realidad ahora estoy algo confundido acerca de la dll mcHID.dll, y es que, pues veo que esta es generada por el esayHID pero, esa que genera el easyHID no es para visual basic 6?? o también sirve para visual basic.net??, ahora, esta no sirve para utilizarla con C# cierto??, entonces si no sirve con C#, como hicieron para modificarla?? En que lenguaje está esta dll??  Estaría muy agradecido por sus respuestas, la verdad, estudiar esta librería es parte importante para el trabajo que estoy desarrollando, y googleando solo se encuentra que esta es generada por el esayHID, no mas.


----------



## phenix (Nov 10, 2011)

Hola moyano disculpa la molestia, para saber si es posible que puedas hacer una aplicación con usb para vb 2008, estoy tratando de enviar datos al pic desde vb 2008 y no logra conectar o un pequeño ejemplo para poder guiarme ya que estoy haciendo mi tesi  dirigida a un laboratorio de instrumentación y control.


----------



## Moyano Jonathan (Nov 10, 2011)

> Hola moyano disculpa la molestia, para saber si es posible que puedas hacer una aplicación con usb para vb 2008, estoy tratando de enviar datos al pic desde vb 2008 y no logra conectar o un pequeño ejemplo para poder guiarme ya que estoy haciendo mi tesi dirigida a un laboratorio de instrumentación y control.



La segunda parte de mi manual habla de como comunicarse con USB usando el PIC18F2550 en VB.net ...pero todavía no la termino. Calculo que para diciembre estará lista...pero no puedo adelantarte nada por que no está terminado...y el programa todavía tiene algunos bugs importantes.

Un saludo !


----------



## Jhon5191 (Nov 11, 2011)

Hola a todos, hace rato que no paso por este hilo.  Queria saber si alguien me podría ayudar con un inconveniente al usar el protocolo HID y el pic 18f4550.  Busqué a través de todo el hilo, y lo único que encontré fue alguien con la misma inquietud...



QuimCri dijo:


> Gracias por la colaboración.
> 
> Cuando me refiero a llenar el buffer es que, según entiendo, easyHID crea en VB una clase de array que define el número de Bytes que se pueden enviar en un paquete (máx 64). Yo utilicé el buffer de 8 bytes que pone easyHID. Si se fija en el programa, lo que se hace es ubicar un dato en cada uno de los bloques o posiciones del array BufferOut_ con 1<= i <= 8,  y eviarlo al PIC. En el pic hay otro array DatoRx que los debe recibir.
> 
> ...


_

Al igual que en la cita anterior, cuando yo envio un paquete de 8 bytes hacia el pic, el micro solo lee los primeros 2, y los demas son nulos, ya intenté usar la funcion usb_gets() pero sigo teniendo los mismos resultados.  

De antemano muchas gracias_


----------



## Moyano Jonathan (Nov 11, 2011)

> Al igual que en la cita anterior, cuando yo envio un paquete de 8 bytes hacia el pic, el micro solo lee los primeros 2, y los demas son nulos, ya intenté usar la funcion usb_gets() pero sigo teniendo los mismos resultados.
> 
> De antemano muchas gracias



Tenés que usar la versión 4.114 del compilador CCS...los descriptores de versiones viejas no funcionan con las últimas versiones del compilador...además hay muchas funciones que se han mejorado i/o modificado...por lo que tenés que revisar el código.

Un saludo !


----------



## Jhon5191 (Nov 11, 2011)

Muchas gracias Jonathan, ya cambie por la versión 4.114, sin embargo, ahora el problema que presenta es que los bytes a partir del 3ro son números al azar, cuando envio 8 bytes en 0 hacia el pic, el parece recibir otra cosa. Adjunto una porción del código:


```
/*********************************************************************************************************/
/*                                        Definición de funciónes                                        */
/*********************************************************************************************************/


void Settings (void){
   set_tris_a(0x2F);
   set_tris_b(0xFF);
   set_tris_c(0x00);
   set_tris_d(0x00);
   set_tris_e(0x9);
   usb_init();
}

void get_data_axis_motion (void){
   usb_get_packet(1,data_in,8);
   x_axis = data_in[1];
   y_axis = data_in[3];
   z_axis = data_in[5];
   FLAGS = data_in[0];
   X_MSB = data_in[2];
   Y_MSB = data_in[4];
   Z_MSB = data_in[6];
   JOG = data_in[7];
   x=0;
   y=0;
   z=0;
   output_bit(SPINDLE_ENABLE,FLAGS.spindle);
   output_bit(PIN_D6,FLAGS.enable_x);
   output_bit(PIN_D7,FLAGS.enable_y);
   output_bit(PIN_E2,FLAGS.enable_z);
   output_bit(X_AXIS_DIR,bit_test(X_MSB,7));
   output_bit(Y_AXIS_DIR,bit_test(X_MSB,7));
   output_bit(Z_AXIS_DIR,bit_test(X_MSB,7));
   
   while(!((x_axis == 0) & (y_axis == 0) & (z_axis == 0))){
      if(x_axis != 0){
         output_toggle(X_AXIS_PULSE);
         x += 1;
         x_axis -= 1;
      }
      if(y_axis != 0){
         output_toggle(Y_AXIS_PULSE);
         y += 1;
         y_axis -= 1;
      }
      if(z_axis != 0){
         output_toggle(Z_AXIS_PULSE);
         z += 1;
         z_axis -= 1;
      }
      delay_ms(200);
   }
}
```

la unica información correcta que recibo es la de FLAGS y x_axis

Muchas gracias de antemano

A proposito, el main del programa es el siguiente


```
#include <18F4550.h>                                     // Definición de registros internos del PIC18F4550.
#fuses HSPLL,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN,NOWDT,NOMCLR
#device adc = 8
#use delay(clock=48000000)

#define SPINDLE_ENABLE PIN_E1

#define USB_HID_DEVICE TRUE                              //Utilizamos el protocolo HID de USB

#define USB_EP1_TX_ENABLE USB_ENABLE_INTERRUPT 
#define USB_EP1_TX_SIZE 8                                // Definición del tamaño del buffer de salida.

#define USB_EP1_RX_ENABLE USB_ENABLE_INTERRUPT 
#define USB_EP1_RX_SIZE 8                                // Definición del tamaño del buffer de entrada.

/*********************************************************************************************************/
// Definición de las librerías utilizadas.
#include <pic18_usb.h>                                   // Drivers's USB del PIC18F4550.
#include "USB_easyHID.h"                                 // Descriptores protocolo HID USB
#include <usb.c>                                         // Funciones del USB.
#include "CNC_settings.c"

/*********************************************************************************************************/
/*                                           Programa principal                                          */
/*********************************************************************************************************/

void main(){

   Settings();                                           //Llamamos a settings
   while(1){
      usb_task();                                        // Configuramos el puerto USB.
      if (usb_enumerated()){                             // Si el puerto es enumerado y configurado por el host..
         if (usb_kbhit(1)){                              //Si hay datos esperando en el buffer de entrada...
            get_data_axis_motion();
         }
      }
   }  //Fin del while
}  //Fin del main
```


----------



## Moyano Jonathan (Nov 12, 2011)

La verdad no veo razón para que no te funcione. Fijate aumentando el buffer de recepción y de envío haber que sucede...también puede ser que estes teniendo problema con el archivo de descriptores.

Un saludo !


----------



## Jhon5191 (Nov 12, 2011)

^ Muchas Gracias por el consejo Jonathan, la verdad aun así no funcionó.  Aumenté el tamaño de los buffers, revise los descriptores detalladamente, revisé el proyecto VB6 que genera el EasyHID, y no encontré solución.  Yo sospecho que puede ser por el software de visual, ya que estoy casi seguro que el programa del pic está en orden.  Sin embargo, pude recibir los 8 bytes provenientes del PC con un pequeño arreglo en ambos programas...


```
while(i<5){
            if (usb_kbhit(1)){
               usb_get_packet(1,data_in,2);
               switch (i) {
                  case 1    :   FLAGS = data_in[0];
                                x_axis = data_in[1];
                  break;
     
                  case 2    :   X_MSB = data_in[0];
                                y_axis = data_in[1];
                  break;
     
                  case 3    :   Y_MSB = data_in[0];
                                z_axis = data_in[1];
                  break;
     
                  case 4    :   Z_MSB = data_in[0];
                                JOG = data_in[1];
                  break;
               }
               i += 1;
            }
         }
```

Y en visual...


```
BufferOut(1) = na
BufferOut(2) = CByte(Text1.Text)
WriteSomeData
BufferOut(1) = CByte(Text5.Text)
BufferOut(2) = CByte(Text2.Text)
WriteSomeData
BufferOut(1) = CByte(Text6.Text)
BufferOut(2) = CByte(Text3.Text)
WriteSomeData
BufferOut(1) = CByte(Text7.Text)
BufferOut(2) = CByte(Text4.Text)
WriteSomeData
```

Disculpenme otra vez, es posible que este problema se deba a estos Warnings del Pic c a la hora de compilar?


```
Interrupts disabled during call to prevent re-entracy (usb_token_reset)
Interrupts disabled during call to prevent re-entracy (usb_flush_out)
Interrupts disabled during call to prevent re-entracy (usb_tbe)
Interrupts disabled during call to prevent re-entracy (usb_flush_in)
```

ya que las funciones que se listan ahi, segun lo que leí en la documentación de los descriptores de pic c (usb.h, usb.c, pic18_usb.h, usb_hw_layer.h) estas funciones son indispensables para preparar los buffers antes y/o despues de enviar o recibir datos.  Es posible que al ser deshabilitados, esto me impida recibir y/o enviar paquetes de datos de 2 o mas bytes?

De ante mano muchas gracias por su opinion


----------



## cristian76 (Nov 23, 2011)

hola moyano gracias por tu esfuerzo , me llegue ah armar la placa que se encuentra en el primer post
Control de dispositivos por USB [ HID + Visual C# ].part01.rar... me baje las 11 partes pero a la hora de grabar el hex al pic me sale error , es necesario grabarlo con el pickit? yo uso un grabador jdm , estare agradecido con los consejos que me des , mañana subo una foto de la placa .


----------



## Moyano Jonathan (Nov 24, 2011)

> a la hora de grabar el hex al pic me sale error , es necesario grabarlo con el pickit? yo uso un grabador jdm , estare agradecido con los consejos que me des , mañana subo una foto de la placa



Hola como estás. El programador puede ser cualquiera que soporte el PIC18F2550, en si mismo el error que te aparece puede ser de hardware...intentá probar con otro grabador haber que sucede.

Un saludo !


----------



## cristian76 (Nov 24, 2011)

hola moyano ,gracias por la respuesta tan rapida, intente grabarlo con un pickit que un amigo mio tiene y me da un mensaje (error level voltaje)pese ah que el pickit reconoce el pic , el grabador jdm con el que cuento logre grabar varias cosas en el pic 18f2550 sin ningun problema pero a la hora de grabar el hex del proyecto me sale error, quise compilarlo yo mismo usando las librerias que dejastes yo uso la v 4.114 y me da 9 errores mejor dicho warning, alo mejor sera eso oh quizas no pero aun haci dejo estos datos . y si en el peor de los casos fuera el hardware tendrias la amabilidad de pasarnos los archivos para poder armarnos un grabador jdm eh buscado en el foro y hay una gran cantidad de aportes , entonces creo que mejor seria una recomendacion si tubieras tiempo q grabador jdm me recomendarias.


----------



## Jhon5191 (Nov 24, 2011)

^ yo tuve el mismo problema la primera vez, y tuve que hacer un downgrade del CCS, intenta compilarlo con un 4.088


----------



## bondadoso (Nov 24, 2011)

que VID y PID debo poner en los descriptores para que el driver de la pc lo reconosca? en modo bulk transfer, tengo puesto VID 0461 y PID 0003 pero el driver de microchip no reconoce el pic y la pc si. que sera?


----------



## cristian76 (Nov 24, 2011)

gracias por el dato jhon5191 , estare bajando esa version y la compilare , bueno soy muy novato en lo que es programacion pero quiero aprender . mi pregunta seria como hago un downgrade del CCS , igualmente gracias .

este es el mensaje que me da el programa a la hora de grabarlo , alguien me podria decir que significa ese mensaje .
http://imageshack.us/photo/my-images/835/errorti.png/


y una ultima consulta ,en esta imagen hay algun error en la configuracion?,aun haci muchas gracias a los que desinteresadamente me dan sus consejos


http://imageshack.us/photo/my-images/829/configuracion.png/


----------



## INSERT64 (Nov 24, 2011)

Hola amigos, espero y me puedan ayudar con un problema que tengo, estoy haciendo comunicación USB con LabVIEW y puedo activar 4 salidas del pic18f4550 las salidas van a un optoacoplador 4N25 y del otro lado los opto transistores activan 4 relevadores de CD a 5v ( hasta este punto puedo energizar y desenergizar cada rele las veces que quiera desde LabVIEW el problema empieza cuando) en los contactores de un  rele conecto otro relevador de 24V pero de CA y en los contactores de este rele se conecta un motor trifásico de 330V, ahora el problema surge cuando activo este rele el motor funciona correctamente 2 ó 5 paros y arranques pero en un momento dado la secuencia en el pic se cógela y no puedo accionar más este rele y ninguno de los otros 3, esto solo pasa al conectar el rele de 24v de CA antes de eso los 4 rele de CD se activan y desactivan desde LabVIEW las veces que se desee.


----------



## ban3ro (Nov 27, 2011)

Disculpen no tienen algun programa en c++ para el uso de comunicacion de pc con puerto ya sea serie, paralelo o de preferencia usb, si lo tienes y de mas preferencia que sea de control y monitoreo, como el que mencionaste en el post anterior sobre uno de usb.

Soy algo nuevo en esto de programar, asi en C++, se lo basico pero hasta ahi, encuanto a programar el pic o lo que se ocupe, tambien cuento con una GAL, nose si eso ayude, asi mismo, un programador tambien para tal cosa, el cual lo ocupamos en la universidad, de momento mañana les digo que marca es el programador y si es usable para tal funcion.


----------



## elflamen (Nov 27, 2011)

Hola amigos,
he estado visitando las 93 apasionantes páginas de este foro con todo este excelente material acerca del usb y les hago llegar mis mas sinceras felicitaciones por tratar este tema con altura y excelente nivel profesional. Muchas gracias por las colaboraciones principalmente de los amigos Jonathan y Meta entre otros. Cordiales saludos desde Uruguay. Elflamen


----------



## rca (Nov 28, 2011)

hola amigo moyano estaba le*y*endo bastante de tu material de usb+pic18f2550  .....bueno la duda o problema que tengo es q*ue* en el ejemplo numero 1 el sofware de control no me funciona o esq*ue* tengo q*ue* instalar algo antes............. gracias de antemano


----------



## alizarraga (Nov 28, 2011)

Buenas tardes.
Te consulto acerca de los pic32mx, tuvistes alguna experiencia.?
Por favor si la tuviste, me indicarías donde las publicastes.?
Gracias.
Atte
Fernando Lizarraga


----------



## ban3ro (Nov 28, 2011)

Bueno el programador que tengo es  TOP2007 nose si sirva para programar el PIC para el uso mediante la comunicacion mediante USB. Saludos.


----------



## elflamen (Nov 30, 2011)

Hola amigos,

Hace unos días llevé a cabo el proyecto que presentó el amigo Moyano Jonathan sobre el entrenador USB V.01 sobre comunicación HID USB con el pic18F2550 y les comento que me funcionó de maravillas.
Excelente manual y muy didáctico por cierto todo, a quien agradezco mucho el esfuerzo realizado.
*Quiero aportar sobre algunos problemillas que tropecé antes de hacerlo funcionar para evitar que a algún otro amigo le pase lo mismo.*

En principio yo estaba usando la versión V4.068 del compilador C CCS y para ver si podía compilar (pensando en futuros proyectos) sin tocar nada volví a recompilar el archivo "APLICACION_HID.c" y me tiró una cantidad de errores! 
Después de identificar y "remendar" la línea del error, compiló OK y grabé el PIC, con la sorpresa de que al enumerarse me reiniciaba siempre la PC... enumeraba nuevamente y reiniciaba y así en un loop !!!!

Ya muy desanimado, vi que Jonathan usaba la versión V4.114 del C CCS y nació otra esperanza!
En su lugar pude conseguir la V4.105, rehice todo Y EL FIRMWARE SE ENUMERÓ CORRECTAMENTE !!!
Como tarjeta entrenadora, hace unos años yo había hecho una similar, que había publicado J1M en otro foro, pero los pines de los puertos estaban cambiados, así que corregí eso en el firmware, ejecuté la aplicación del C#
Y FUNCIONÓ TODO A LA PERFECCION !!!

Ahora bien, yo en C# nunca trabajé, en cambio en Visual Basic he hecho algunas cosillas, así que intenté ejecutar la misma aplicación del ejemplo en Visual Basic.NET y me tiró una excepción... *no encontraba "mcHID.dll"*
*El problema era que para VBasic la dll debe estar en la carpeta BIN\DEBUG*
Al ponerla allí, pude probar de forma excelente el funcionamiento de la tarjeta con la aplicación desde VBasic tal como se podía ver en los videos del ejemplo !!!
Muchas gracias nuevamente por compartir todo este material !!


----------



## Moyano Jonathan (Nov 30, 2011)

Muchas felicitaciones por hacerlo funcionar !!


----------



## Risslock (Nov 30, 2011)

Hola Moyano, yo estoy trabajando en una comunicacion pic-pc por usb en modo bulk, pero cuando instalo el driver me dice al final que el dispositivo no puede iniciarse codigo 10... sabes que puede ser?? el descriptor y el programa me compilan perfectamente.


----------



## francofallen (Nov 30, 2011)

Moyano Jonathan, la verdad sos un groso. Este tema me ayudo, y me esta ayudando mucho. 
Tu programa en VB para los ocho reles me gusto mucho, ya que es muy sencillo y facil de entender}
este mes voy a intentar comandar 50 salidas, con el usb. Voy a intentar modificar tu codigo, para que el numero que le inrgese me lo represente en binario de 8 bits. 
Si lo has intentado cuentame, sino luego mostrare como me fue.


----------



## erockerito (Dic 1, 2011)

Que tal!
Soy nuevo en esto y quisiera solamente conectar un led en el pic 18f2550 para controlar el encendido y apagado del led con un programa hecho en visual... algunos foros hacen que paresca facil, pero no especifican como se hace... y que materiales usar... solo eso gracias


----------



## francofallen (Dic 1, 2011)

erockerito dijo:


> Que tal!
> Soy nuevo en esto y quisiera solamente conectar un led en el pic 18f2550 para controlar el encendido y apagado del led con un programa hecho en visual... algunos foros hacen que paresca facil, pero no especifican como se hace... y que materiales usar... solo eso gracias



te referis a visual basic?, pues el programa seria bastante sencillo...despues lo puedes complejizar para que se vea lindo. 
En cuanto a la programacion del pic, depende en que lenguaje programes.
Si no lo tienes decidido, empieza con el primer ejemplo prouesto en este tema, que es muy bueno.
Luego, ve avanzando


----------



## Risslock (Dic 1, 2011)

Ya pude arreglar el problema de los drivers, simplemente no querian funcionar en mi portatil...

pero ya se me presenta otro problema en labview:
Cuando lo pongo en modo paso a paso funciona perfectamente, pero cuando lo pongo a correr continuo me sale error de timeout!
Otro problema que he tenido es que cuando vario la entrada al conversor analogo digital me sale "Could not perform operation because I/O error." en labview

Alguna sugerencia?


----------



## MatheusLPS (Dic 1, 2011)

Does this project work on windows 7 64bits?

bye


----------



## elflamen (Dic 2, 2011)

erockerito dijo:


> Que tal!
> Soy nuevo en esto y quisiera solamente conectar un led en el pic 18f2550 para controlar el encendido y apagado del led con un programa hecho en visual... algunos foros hacen que paresca facil, pero no especifican como se hace... y que materiales usar... solo eso gracias



erockerito,
En la primera página del foro hay un excelente material publicado por Moyano Jonathan "Control de Dispositivos por USB" que tiene un tutorial sobre el proyecto, el firmware para el PIC18F2550 escrito con el compilador C CCS, el software de la aplicación escrito en Visual Studio 2008 C# y videos que muesran el funcionamiento. En fin, todo el material para llevarlo a cabo.
En otras páginas mas adelante podrás encontrar también la misma aplicación del proyecto pero escrita en Visual Basic.NET.
Saludos.


----------



## elflamen (Dic 7, 2011)

Moyano Jonathan dijo:


> Muchas felicitaciones por hacerlo funcionar !!



Muchas gracias Jonathan!
Quiero hacerte una consulta sobre el código de la aplicación en visual basic.net, por ejemplo en el código del botón de encender los leds:

Private Sub OUT_DIGITAL_1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles OUT_DIGITAL_1.Click

*Dim BufferOUT As Byte() = New Byte(BufferOutSize) {}
*
        BufferOUT(0) = 0      ' Report ID.

        BufferOUT(1) = &HA    ' Primero enviamos un comando de control al dispositivo: 
        		      ' &HA (COMANDO_SALIDAS).

        BufferOUT(2) = &H10   'Luego enviamos los datos de control de los LED'S.

        hidWrite(controlador, BufferOUT(0)) ' Envía los datos.

        MENSAJES_USB.Items.Add("Cambia estado: SALIDA1.")

End Sub

No me queda claro el significado de la sintaxis de 
Dim BufferOUT As Byte() = New Byte(BufferOutSize) {}
principalmente los corchetes {}
y BufferOUT(1) = &HA.



Muchas gracias por tu aporte y cordiales saludos!!!
Elflamen


----------



## Moyano Jonathan (Dic 8, 2011)

> Cuando lo pongo en modo paso a paso funciona perfectamente, pero cuando lo pongo a correr continuo me sale error de timeout!
> Otro problema que he tenido es que cuando vario la entrada al conversor analogo digital me sale "Could not perform operation because I/O error." en labview
> 
> Alguna sugerencia?



Hay un hilo específico del foro en donde se explica detalladamente como llevar a cabo la comunicación con Labview.
Específicamente: https://www.forosdeelectronica.com/f26/usb-labview-entre-otros-18338/

Saludos !



> Does this project work on windows 7 64bits?
> 
> bye



Si, el proyecto funciona perfectamente en Windows 7 de 64 bits.

Saludos !

Para: 

```
Dim BufferOUT As Byte() = New Byte(BufferOutSize) {}
```

Crea un arreglo en tiempo de ejecución. Los corchetes no estoy seguro a que se refieren; podrías consultar la ayuda de microsoft MSDN.


```
y BufferOUT(1) = &HA
```
 Es el código del botón presionado para que el micro reconozca el comando. En este caso el botón está marcado como "A".
Para entenderlo mejor vas a tener que revisar el firmware del microcontrolador, donde están declarados todos los comandos.

Un saludo !

Gente. Si ven que no les contesto a la brevedad es por que estoy trabajando y estudiando al mismo tiempo ...y dada las circunstancias la electrónica por ahora no le estoy prestando la debida atención.

Sepan disculpar las tardanzas.


----------



## elflamen (Dic 8, 2011)

Para: 

```
Dim BufferOUT As Byte() = New Byte(BufferOutSize) {}
```

Crea un arreglo en tiempo de ejecución. Los corchetes no estoy seguro a que se refieren; podrías consultar la ayuda de microsoft MSDN.


```
y BufferOUT(1) = &HA
```
 Es el código del botón presionado para que el micro reconozca el comando. En este caso el botón está marcado como "A".
Para entenderlo mejor vas a tener que revisar el firmware del microcontrolador, donde están declarados todos los comandos.

Un saludo !

Gente. Si ven que no les contesto a la brevedad es por que estoy trabajando y estudiando al mismo tiempo ...y dada las circunstancias la electrónica por ahora no le estoy prestando la debida atención.

Sepan disculpar las tardanzas. [/QUOTE]

Muchas gracias Jonathan,
Lo seguiré estudiando un poco más.
Abrazo.


----------



## francofallen (Dic 9, 2011)

Moyano, tengo una duda ya que en C nunca he escrito nada... Desde ya muchas gracias por hacer un programa tan pero tan explicativo. 
En la linea 
if(usb_cdc_getc()=='1'){ // 

el caracter que resive en el buffer, no puede ser de dos digitos? por ejemplo 89 ???

Tal vez es de mi ignorancia pero estuve leyendo bastante y no logro encontrar una respuesta.
Si la respuesta es no, hay alguna forma de que sea posible hacerlo?

por ejemplo me gustaria hacer una cosa como esta

usb_task();
      if (usb_enumerated()){ // Si el puerto ya fue enumerado por el host :
      usb_enumerado(); // Enciende led de enumeración_OK.
      if(usb_cdc_kbhit()){ // en espera de nuevo(s) caracter(es) en el buffer.
        if(usb_cdc_getc()=='23'){ // 
              output_toggle(PIN_B3); // Cambia de estado el pin b3

Gracias por todo... espero no ser una molestia 

Moyano, tengo una duda ya que en C nunca he escrito nada... Desde ya muchas gracias por hacer un programa tan pero tan explicativo. 
En la linea 
if(usb_cdc_getc()=='1'){ // 

el caracter que resive en el buffer, no puede ser de dos digitos? por ejemplo 89 ???

Tal vez es de mi ignorancia pero estuve leyendo bastante y no logro encontrar una respuesta.
Si la respuesta es no, hay alguna forma de que sea posible hacerlo?

por ejemplo me gustaria hacer una cosa como esta

usb_task();
      if (usb_enumerated()){ // Si el puerto ya fue enumerado por el host :
      usb_enumerado(); // Enciende led de enumeración_OK.
      if(usb_cdc_kbhit()){ // en espera de nuevo(s) caracter(es) en el buffer.
        if(usb_cdc_getc()=='23'){ // 
              output_toggle(PIN_B3); // Cambia de estado el pin b3

Gracias por todo... espero no ser una molestia


----------



## Moyano Jonathan (Dic 9, 2011)

> el caracter que resive en el buffer, no puede ser de dos digitos? por ejemplo 89 ???



Si por supuesto que se tendría que poder. Ahora hay que ver como lo interpreta la función...por que quizás te lo toma como un código ascii o como un entero decimal...hay que tener cuidado..pero de poder se puede.

Un saludo !


----------



## Meta (Dic 10, 2011)

Cuanto tiempo no paso por aquí desde que empecé con un trabajo, ya que se acabó el contrato, espero estar más por aquí.

A estas alturas de la vida. ¿Harás un revisión del manual?

Veo que tienes más soltura que antes en estos temas. La revisión es ampliar más contenidos o explicar más temas, etc..


----------



## elflamen (Dic 10, 2011)

Meta dijo:


> Cuanto tiempo no paso por aquí desde que empecé con un trabajo, ya que se acabó el contrato, espero estar más por aquí.
> 
> A estas alturas de la vida. ¿Harás un revisión del manual?
> 
> Veo que tienes más soltura que antes en estos temas. La revisión es ampliar más contenidos o explicar más temas, etc..



Hola Gente!
He intentado bajar el manual desde mediafire y no he podido, parece que mediafire no funciona, no se puede acceder...
Se podrá subir aquí mismo en pdf de la misma manera en que se han subido el resto de los ejemplos y experimentos?
Muchas gracias y un abrazo, Elflamen


----------



## francofallen (Dic 10, 2011)

Moyano Jonathan dijo:


> Si por supuesto que se tendría que poder. Ahora hay que ver como lo interpreta la función...por que quizás te lo toma como un código ascii o como un entero decimal...hay que tener cuidado..pero de poder se puede.
> 
> Un saludo !



Claro, pero cuando quiero compilar me dice como error qu es un caracter invalido. Solo me deja hasta el 9. Si me explicaras como puedo hacer te lo agradeceria.


----------



## Pablochin (Dic 13, 2011)

Estimados amigos del Foro he leido casi todos los comentarios viendo los usos de los puertos usb, quisiera saber si me podrian ayudar, ya que tengo un proyecto, el cual es controlar un carrito por control remoto mediante la computadora, entonces mi plan es dejar el carrito sin hacerle nada y modificar solo el control, ya que solo tiene 4 direcciones Adelante, Atras , Derecha e izquierda, y eso lo quisiera manejar con un programa, actualmente estoy aprendiendo NetBeans pero veo que tiene  demasiada experiencia con Visual, yo lo he usado pero no tanto, bueno regresando a mi pregunta es que si m apoyarian explicandome o enviandome como puedo lograr controlar esas cuatro direcciones con la salida USB. he leido muchos foros donde explica con puerto paralelo pero mi laptop no tiene el puerto, sin embargo tengo 4 salidas USB y quisiera que me  ayudaran a como lograr manejar esas direcciones , en pocas palabras es los movimientos que hace el control realizarlo con la computadora, usando la placa del control, de hecho tiene un Pic y pienso que de ahi se podrian manejar las funciones... amigos espero me puedan orientar.. Gracias y Buenas noches


----------



## elflamen (Dic 13, 2011)

Pablochin dijo:


> Estimados amigos del Foro he leido casi todos los comentarios viendo los usos de los puertos usb, quisiera saber si me podrian ayudar, ya que tengo un proyecto, el cual es controlar un carrito por control remoto mediante la computadora, entonces mi plan es dejar el carrito sin hacerle nada y modificar solo el control, ya que solo tiene 4 direcciones Adelante, Atras , Derecha e izquierda, y eso lo quisiera manejar con un programa, actualmente estoy aprendiendo NetBeans pero veo que tiene  demasiada experiencia con Visual, yo lo he usado pero no tanto, bueno regresando a mi pregunta es que si m apoyarian explicandome o enviandome como puedo lograr controlar esas cuatro direcciones con la salida USB. he leido muchos foros donde explica con puerto paralelo pero mi laptop no tiene el puerto, sin embargo tengo 4 salidas USB y quisiera que me  ayudaran a como lograr manejar esas direcciones , en pocas palabras es los movimientos que hace el control realizarlo con la computadora, usando la placa del control, de hecho tiene un Pic y pienso que de ahi se podrian manejar las funciones... amigos espero me puedan orientar.. Gracias y Buenas noches



Hola Pablochin,
Vas bien rumbeado en este foro. Te recomiendo que te bajes el material que publicó Jonathan en la primera página. Ahí tenés un ejemplo completo que puede serte útil para sacar ideas de como hacerlo.
Por lo que describis supongo que en el carro tendrás 2 motores de contínua con ambas marchas, con lo que hace que vas a necesitar 4 órdenes (avance/retro) mas 2 para prender cada uno.
En total 6 comandos si/no. El carro deberá tener un PIC con interfase USB el cual recibirá esos 6 comandos por el USB desde una aplicación en un PC escrita en .NET (C# o VisualBasic).
Fijate en ese ejemplo que viene con un manual, videos y los pasos para construir la tarjeta demo que te va a servir para hacer los experimentos.
En mi caso preferí el programa del PC en Visual Basic.NET porque ya había hecho un curso de programación en ese lenguaje. El ejemplo en Visual basic está en unas páginas mas adelante, no recuerdo cual...
Después tenés que conseguir el compilador C CCS v4.114 para programar el PIC, que se hace en lenguaje C. Yo utilicé la versión 4.105 y funcionó perfectamente. (Ojo que con versiones anteriores puede no funcionar...)
Buena suerte! Saludos


----------



## francofallen (Dic 17, 2011)

Pablochin dijo:


> Estimados amigos del Foro he leido casi todos los comentarios viendo los usos de los puertos usb, quisiera saber si me podrian ayudar, ya que tengo un proyecto, el cual es controlar un carrito por control remoto mediante la computadora, entonces mi plan es dejar el carrito sin hacerle nada y modificar solo el control, ya que solo tiene 4 direcciones Adelante, Atras , Derecha e izquierda, y eso lo quisiera manejar con un programa, actualmente estoy aprendiendo NetBeans pero veo que tiene  demasiada experiencia con Visual, yo lo he usado pero no tanto, bueno regresando a mi pregunta es que si m apoyarian explicandome o enviandome como puedo lograr controlar esas cuatro direcciones con la salida USB. he leido muchos foros donde explica con puerto paralelo pero mi laptop no tiene el puerto, sin embargo tengo 4 salidas USB y quisiera que me  ayudaran a como lograr manejar esas direcciones , en pocas palabras es los movimientos que hace el control realizarlo con la computadora, usando la placa del control, de hecho tiene un Pic y pienso que de ahi se podrian manejar las funciones... amigos espero me puedan orientar.. Gracias y Buenas noches



Te recomiendo que pases por este post de T!, ya que un amigo mio hizo exactamente lo que buscas  . Luego puedes modiificar la interfaz visual a tu gusto. Aunque creo que no estan los codigos , no me he fijado.

http://www.taringa.net/posts/imagenes/13031813/Mi-robot-comandado-por-la-PC_.html

ESTE POST.....olvide poner el link


----------



## Moyano Jonathan (Dic 17, 2011)

Muy bueno el robot de taringa !


----------



## checoeltio (Dic 28, 2011)

hola Moyano Jonathan disculpa que te moleste pero veo que entendes mucho de la comunicacion usb con pic 18f4550. vos sabes que tengo un problema estoy desarrollando una comunicacion usb cdc y visual c# lo que hago es tomar es tomar 9 mediciones obtenidas por medio del conversor ad y enviarlas a la pc,  previamente le envio un caracter desde visual todo esto funciona de 10. ahora lo siguiente necesito medir rpm por medio de interrupciones de tmr0 pero no me funciona. 
O sea el programa funciona con todo lo demas pero no logro contar las interrupciones y leyendo un poco en el foro dicen que el usb desabilita las demas interrupciones. te paso lo que tengo echo a ver si le podes dar una mirada y por ahi pasarme alguna solucion o idea.. un saludo


```
#include <18F4550.h>           // Usamos el PIC 18F4550
#device adc=16
#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN  // Cristal a 20MHz.
                                        
#use delay(clock=48000000)     // El PLL interno siempre ha de ser de 48MHz. (No es el cristal)
                                      
#include "usb_cdc.h"           // Librería para la clase CDC

//#use fast_io(c)                                    
#Byte PortA = 0xF80            // Dirección del puerto A para la familia 18Fxx5x.
#Byte PortB = 0xF81            // Dirección del puerto B para la familia 18Fxx5x.
#Byte PortC = 0xF82            // Dirección del puerto C para la familia 18Fxx5x.
#Byte PortD = 0xF83            // Dirección del puerto D para la familia 18Fxx5x (Sólo 40/44 pines).
#Byte PortE = 0xF84            // Dirección del puerto E para la familia 18Fxx5x.
//#define resolucion (2.5/1024.0)                                       
// ------ Variable Global ------     
// Int16 x = 0;                    // Declaramos el valor de X como Word (16 bits). Esta variable
float  temp=0,temp2=0,tension1=0,corriente1=0, tension2=0,tension3=0,corriente2=0,corriente3=0;
float  a=0,b=0,c=0,d=0,e=0,f=0,g=0,i=0,j=0,k=0,w=0,h=0,count=0,counter=0;
//float  r1=0,r2=0,r3=0,r4=0,r5=0,r6=0,r7=0,r8=0,r9=0,r10=0,rt=0;
//float  r11=0,r12=0,r13=0,r14=0,r15=0,r16=0,r17=0,r18=0,r19=0,r20=0;
//float  r21=0,r22=0,r23=0,r24=0,r25=0,r26=0,r27=0,r28=0,r29=0,r30=0;
// ------- Interrupción --------
// 
#int_TIMER1 
void TIMER1_fsr(void)
{
counter=get_timer0();         //lectura contador TMR0
count=(counter*2*120);      //
set_timer0(0);                //reinicia cuenta
                              //count=(counter*2*120)/24;
set_timer1(3036);             //recarga a 0.5 s 3036
count=counter;
}




void main() 
{
   setup_adc_ports(AN0_TO_AN8|VSS_VDD);
   setup_adc(ADC_CLOCK_INTERNAL);
   setup_wdt(WDT_OFF);
   Setup_spi(SPI_SS_DISABLED);
   setup_timer_0(rtcc_ext_l_to_h|RTCC_DIV_2);
   setup_timer_1(T1_internal|T1_DIV_BY_8);      //configuración TMR1
   set_timer0(0);                                //reinicia cuenta
   set_timer1(3036);
   disable_interrupts(int_timer1);
   disable_interrupts(global);    
   Setup_timer_2(T2_DISABLED,0,1);
   Setup_comparator(NC_NC_NC_NC);
   Setup_vref(FALSE);
                
   

   
  // Set_Tris_A(0b11111111);      // Puerto A todo entradas (en este caso no usamos el Puerto A).
 //  Set_Tris_B(0b11111111);      // Puerto B todo entradas (sólo usamos las entradas RB0 y RB1).
 //  Set_Tris_C(0b11111111);      // Puerto C todo entradas (en este caso no usamos el Puerto C).
 //  Set_Tris_D(0b11111111);      // Puerto D todo entradas (en este caso no usamos el Puerto D).
 //  Set_Tris_E(0b11111111);      // Puerto E todo entradas (en este caso no usamos el Puerto E).
       

  
 //......................... INICIO USB...............................................................       
     
   usb_cdc_init();              // Iniciar el modo CDC (Puerto virtual de comunicaciones).
   usb_init();                  // Iniciar el manejo del USB.
   
    
      usb_task();
      usb_wait_for_enumeration();
      
  if (usb_enumerated())
      do{
      {
         if(usb_cdc_kbhit()){ //en espera de nuevo(s) caracter(es) en el buffer
         if(usb_cdc_getc()=='t')       //¿lo que llegó fué el caracter t?
        
            {
     
//........................Medicion de las 3 tensiones...............
   READ_ADC(ADC_START_ONLY );
   delay_us(10);
   set_adc_channel(0);
   delay_us(30);
   tension1=READ_ADC();
   a= 513*tension1/65535;
  
     
   READ_ADC(ADC_START_ONLY );
   delay_us(10);
   set_adc_channel(1);
   delay_us(30);
   tension2=READ_ADC();
   b= 508*tension2/65535;
  
        
   READ_ADC(ADC_START_ONLY );
   delay_us(10);
   set_adc_channel(2);
   delay_us(30);
   tension3=READ_ADC();
   c= 530*tension3/65535;
  
// ..............................Medicion de las 3 Corrientes.............        
   READ_ADC(ADC_START_ONLY );
   delay_us(10);
   set_adc_channel(3);
   delay_us(30);
   corriente1=READ_ADC();
   d= abs((corriente1*0.0022889)-75);
  
         
   READ_ADC(ADC_START_ONLY );
   delay_us(10);
   set_adc_channel(4);
   delay_us(30);
   corriente2=READ_ADC();
   e= abs((corriente2*0.0022889)-75);
   
   
   READ_ADC(ADC_START_ONLY );
   delay_us(10);
   set_adc_channel(5);
   delay_us(30);
   corriente3=READ_ADC();
   f= abs((corriente3*0.0022889)-75);
   
 // .................................... promedio corrientes..............                
   i=(((d/10)+(e/10)+(f/10))/3);
   w=(i*10);     
// ......................................R.P.M.............................

    
 //.................................Medicion de las temperaturas...........     
     READ_ADC(ADC_START_ONLY );
     delay_us(10);
     set_adc_channel(7);
     delay_us(20);
     temp=READ_ADC();
     g= ((temp*230)*1.22)/38553;  //((b*270)*1.2)/150;  temp cancamo
     //delay_ms(1);
      delay_us(100);
      
     READ_ADC(ADC_START_ONLY );
     delay_us(10);
     set_adc_channel(8);// ver que adc utilizo!!!
     delay_us(20);
     temp2=READ_ADC();
     j= ((temp2*238)*1.22)/38553; // temp ambiente
     //delay_ms(1);
      delay_us(100);
 // .............................. diferencia de temperatura..................     
      k=((g-j));
//.............. FIN TOMA DE DATOS..........................................      

// ...............................envio de cadena de datos por usb............................................
     
printf(usb_cdc_putc, "L1= %01.0fV!L2= %01.0fV!L3= %01.0fV!C1= %01.1fA!C2= %01.1fA!C3= %01.1fA! %01.0fC! %01.0f! %01.1fA!%01.0fC!%01.1fC!",a,b,c,d,e,f,g,count,w,j,k );
     
            }
 //           delay_us(150);
   
 //............................SALIDA AUXILIAR..........................          
    if(usb_cdc_getc()=='x')         //¿lo que llegó fué el caracter x?
   
       { 
          output_high(PIN_B7);
          delay_ms(300);
          output_low(PIN_B7);
          }
         }
        }
       }while (1); // bucle infinito
}
```


----------



## Moyano Jonathan (Dic 28, 2011)

Hola como estás.

Antes que nada quiero decirte que no es por ser mala onda ni nada por el estilo pero programas de una manera poco estructurada por lo cuál es complejo mirar tu programa.

Luego de eso te digo lo siguiente:

1° - Probar la comunicación USB en CDC y enviar bytes de pruebas. Es decir probar primero que nada la comunicación bilateral con la PC.
2° - Probar todas las funciones de lectura de datos por separado. No mezclar nada con el USB...hacer debug con puerto serie y ver exactamente que tipos de datos tomás. 
Lo bueno de la comunicación CDC es que no tenés que convertir los tipos de datos...la función printf hace todo por vos.
3° - Probar las interrupciones con cosas sencillas incluyendo el manejo del puerto USB. A veces las interrupciones no las recomiendo en USB por que generan problemas en la comunicación...pero si se pueden usar...probá generando una señal cuadrada de 1Khz usando el timer0 y USB ....SOLO ESAS 2 COSAS...probá como funciona la comunicación cuando se está generando el tren de pulsos..para ver si la interrupción no te está acarreando problemas de enumeración del USB.
4° - Tenés que estudiar desde el primer post del hilo de usb para ver la estructura que tienen los programas ...de ahí seguí la estructura para armar tu programa. 

Mucho más no te puedo guiar, podrías fijarte de hacer una lectura cíclica de los datos del sensor de RPM ....en ese caso no intervendrías con el uso de interrupciones.

En fin, son ideas


----------



## checoeltio (Dic 28, 2011)

si solo hice un par de programas algunas veces pero nada en usb por lo que voy a tratar de extructurarlo un poco mejor mirando todo el post desde el principio....
y siempre fui un poco desordenado en la programacion je je..:
vos sabes que no te entiendo cuando me pones que haga una lectura ciclica para evitar el uso de interrupciones lo que estoy usando es un sensor optico que me envia un pulso al ser reflejado como haria la lectura ciclica que me pones?


----------



## vistroni (Dic 29, 2011)

Hola, he leído muchas partes de este hilo porque quisiera comunicar al 18f2550 o el 4550 por USB. Ya he realizado y armado algunos pequeños proyectos con el 16F84A con la ayuda del libro del forista Meta y me han funcionado muy bien. Ahora, para intentar utilizar este otro PIC me bajé la versión de prueba del CSS y quise seguir el manual que amablemente nos compartes,  Moyano Jonathan, pero no encuentro las librerías usb.h, usb_desc_scope.h, usb_cdc.h, usb_desc_cdc.h, usb_desc_hid.h y usb.c, que según tengo entendido son necesarias para manejar ese puerto. La pregunta es si sólo en la versión de pago se pueden obtener esos archivos. Gracias por la respuesta.


----------



## wansi (Dic 29, 2011)

vistroni dijo:


> Hola, he leído muchas partes de este hilo porque quisiera comunicar al 18f2550 o el 4550 por USB. Ya he realizado y armado algunos pequeños proyectos con el 16F84A con la ayuda del libro del forista Meta y me han funcionado muy bien. Ahora, para intentar utilizar este otro PIC me bajé la versión de prueba del CSS y quise seguir el manual que amablemente nos compartes,  Moyano Jonathan, pero no encuentro las librerías usb.h, usb_desc_scope.h, usb_cdc.h, usb_desc_cdc.h, usb_desc_hid.h y usb.c, que según tengo entendido son necesarias para manejar ese puerto. La pregunta es si sólo en la versión de pago se pueden obtener esos archivos. Gracias por la respuesta.




Mira, en este enlace 

https://www.forosdeelectronica.com/f26/usb-labview-entre-otros-18338/

 puedes leer tambien acerca de estos archivos, incluso puedes descargarlos, hay unos en los que los puedes generar como el desc_scope.h, lee esto:

http://www.unpocodelectronica.netau.net/generador-de-inf-para-los-drivers-usb-de-microchip

Muy buenos tutos..


----------



## vistroni (Dic 30, 2011)

Muchas gracias, wansi voy a ver la información que me dices.
De hecho se me hace muy raro que en varios sitios de Internet dicen que han hecho esto o lo otro, pero la verdad no se ve claro a la hora de tratar de hacerlos y puede deberse a que no se mencionan todos los recursos que se necesitan. Digo, si es que se supone que la idea es que aprenda quien tiene curiosidad pero no tiene a la mano un maestro que le enseñe. Yo no tengo mucha experiencia con pics, aunque he hecho algunos proyectos y los tengo funcionando, y estoy seguro de que sé seguir los pasos cuando quiero realizar un proyecto (para después hacer otros yo y es una satisfacción lograrlo) y eso es lo que estoy buscando en el tema del pic USB. Voy a revisar los temas que me dices y te agradezco nuevamente. Si logro encontrar lo que busco, pienso comentarles cómo me va en eso. Saludos.


----------



## wansi (Dic 30, 2011)

vistroni dijo:


> Muchas gracias, wansi voy a ver la información que me dices.
> De hecho se me hace muy raro que en varios sitios de Internet dicen que han hecho esto o lo otro, pero la verdad no se ve claro a la hora de tratar de hacerlos y puede deberse a que no se mencionan todos los recursos que se necesitan. Digo, si es que se supone que la idea es que aprenda quien tiene curiosidad pero no tiene a la mano un maestro que le enseñe. Yo no tengo mucha experiencia con pics, aunque he hecho algunos proyectos y los tengo funcionando, y estoy seguro de que sé seguir los pasos cuando quiero realizar un proyecto (para después hacer otros yo y es una satisfacción lograrlo) y eso es lo que estoy buscando en el tema del pic USB. Voy a revisar los temas que me dices y te agradezco nuevamente. Si logro encontrar lo que busco, pienso comentarles cómo me va en eso. Saludos.



Gracias.... Que bueno que te interese, no hace mucho termine un proyecto tambien de control  de procesos por USB en labview ( un SCADA casero ,  )... en el primer link que te mencione, tambien publicaron varios links de apoyo, si puedes leerlo para entenderle mejor al proceso de transferencia de datos por USB..
Este es otro link, las bases para control por USB pero en VIsual Basic: 

http://www.neoteo.com/conecta-tus-proyectos-al-puerto-usb

Y otro ejemplo muy bueno: http://www.unrobotica.com/usbcon.htm


----------



## martinmp (Dic 30, 2011)

Hola a todos:

Espero que alguien pueda resolver mi duda:

Baje el manual que publico Moyano en algun lado de PICC con PC-C# y weno probe y funciona de 10 (http://www.mediafire.com/download.php?6z97s7ta3g4rwhy) Prendo y apago leds con la PC, controla la luminosidad con el PWM por software etc. Ahora lo que quiero hacer es ejecutar un bucle (digamos 5 veces) cada que hago click en mi programa:

C#:


```
private void TALADRAR_Click(object sender, EventArgs e)
        {
            byte[] BufferOUT = new byte[EasyHID.BUFFER_OUT_SIZE];
            BufferOUT[0] = 0;      // Report ID
            BufferOUT[1] = 0x0C;   // 
            EasyHID.Write(controlador, BufferOUT); // Envía los datos.
        }
```

PICC:


```
while (TRUE)    // Bucle infinito.
{
   if(usb_enumerated())   // Si el dispositivo está configurado...
   {
       if(recibe[3]==valorPWM2)
       {
           for(loop_tala;loop_tala<5;++loop_tala)
           {
              LED_ON(PWM2);
              delay_ms(50);
              LED_OFF(PWM2);
              delay_ms(50);
           }
           recibe[3]=0x00;
       }

  
       if (usb_kbhit(1)) // Si hay un paquete de datos del host...
       {
         usb_get_packet(1, recibe, USB_CONFIG_HID_RX_SIZE); 

         if(recibe[0]==PWM_CONTROL2)   // Si recibimos el comando de control PWM2..
          {valorPWM2=recibe[3];} // Tomamos el dato y lo procesamos.
                   
        }
         
   }
      
}
```
 
Simplemente no lo logro, el led parpadea 5 veces la primera vez q hago click en el boton taladrar pero luego ya no mas...
Pense que era posible que perdiera comunicacion con el host debido a la demora del bucle, pero ya lo probe controlando la luminosidad en otro led y va de 10 el otro led...
Espero sus comentarion/respuestas... gracias!


----------



## vistroni (Dic 31, 2011)

wansi dijo:


> Gracias.... Que bueno que te interese, no hace mucho termine un proyecto tambien de control  de procesos por USB en labview ( un SCADA casero ,  )... en el primer link que te mencione, tambien publicaron varios links de apoyo, si puedes leerlo para entenderle mejor al proceso de transferencia de datos por USB..
> Este es otro link, las bases para control por USB pero en VIsual Basic:
> 
> http://www.neoteo.com/conecta-tus-proyectos-al-puerto-usb
> ...



Muy bien, wansi, te comento que ya había visto estas dos páginas y siguiendo la recomendación de neoteo, bajé el protón, pero era la versión de prueba y no traía el EasyHID. Y me quedé con la idea de que viene con la versión de pago integrado.
Y ahora que revisé de nuevo en los links que pusiste, en la página de unrobotica encontré la descarga directa del EasyHID sin tener que poner el protón completo.

Muchas gracias, ahora ya podré seguir probando por ese lado tanto con lo de neoteo como con lo de unrobotica.

Y también estoy leyendo los temas que me pusiste en la respuesta anterior.

Saludos y gracias de nuevo. wansi, qué buena ayuda me has dado con esos tips. Espero ir comentando lo que vaya viendo.


----------



## darkangeluz (Ene 2, 2012)

el problema es el siguiente
for(loop_tala;loop_tala<5;++loop_tala)

y debe ser asi
for(loop_tala=0;loop_tala<5;++loop_tala)

la primera vez te funciona porque la variable loop_tala es cero, al terminar las repeticiones la variable queda con el valor de 5, y hay que ponerla nuevamente en cero.

prueba con esto y veras como se soluciona tu problema


----------



## vistroni (Ene 5, 2012)

Pues ya está, ya lo tengo, pero no con CCS. Los tengo como me recomendaste, wansi. Seguí la pista que me diste con lo de unrobotica y una cosa me llevó a otra, neoteo, etc. Me bajé el Amicus que es gratis y viene muy completo para manejar sólo dos pics, pero lo analizé bien, me aprendí la forma de programarlos y una vez que entendí que ese "Amicus" sólo era para dos pics en particular, me puse a buscar el compilador que los maneja todos y lo encontré... Paso siguiente: Proceder como aprendí con el Amicus pero ahora con el otro. Obviamente ahora manejando el EasyHID y todo fue como mantequilla. Ya tengo dos proyectos pic USB sencillos *hechos por mí*, tanto con el 18f2550 y como el 18f4550 con todo y sus .hex. Y de paso hasta los he probado con el Proteus, todo perfecto, obviamente dandome unos cuantos topes cada vez que había que entender algo que tenía que hacer, pues hay cosas que no son muy obvias y las tienes que ir descubriendo, pues son detalles que no explican. Pero todo muy bien, ahora voy a programarlos en circuito real y les cuento cómo me fue.
Muchas gracias a wansi por su guía y sobre todo por el empujón que me dio al contestar mi pregunta.


----------



## arias887 (Ene 8, 2012)

Hola a todos...
Les traigo alogo que les puede interesar...

Se trata de una aplicación para ponerle contraseña y darle sierto toque de seguridad a nuestras aplicaciones...

Lo saque de un "Videotutorial" de YouTube de un usuario que hace llamar *TheDarkJoker094* y su aplicacion se llama *UltimatePasswordProtection* la mia la nombre *App Pass v1.0*...

Son 5 videos y esta hecho en *VS2010 [C#]*, yo lo hice en *VS2008 [C#]* e igual funciona y se podria aplicar en caso tal que nuestro micro este controlando un actuador que Cierre\Abra la puerta del cajon donde tenemos guardos nuestros *DVD's XXX* para que solo nosotros tengamos acceso a ellos o algo asi...

Caratersticas de esta aplisacion:

*1)* Si se ejecuta por 1° ves, se pide que ingrese una Nueva Contraseña...
*2)* Se puede cambiar la contraseña cuando quiera pero pide la actual para poder hacerlo...
*3)* La contraseña queda *ENCRIPTADA!!!* en nuetro registro de Windows...
*4)* Depues de *n* intentos erroneos la aplicacion quedara bloqueada por *x* minutos...

No siendo mas les dejo un 1° .rar con mi aplicacion *Sola* y otro 2° .rar con el proyecto completo en *VS2008 [C#]* para que lo puedan ver y un .txt dentro de este 2° .rar con los link de los videos...

Espero que les sea de utilidad...



> *NOTA:*
> El proyecto se habre desde el archivo *App Pass v1.0.csproj*
> Ya entrariamos a programar para el micro y las cuetiones del usb en la Form2 *(*En este caso se vera a mi bella, hermosa y difunta gata *)* que se abre despues de introducir la contraseña correcta...


----------



## Meta (Ene 14, 2012)

arias887 dijo:


> Hola a todos...
> Les traigo alogo que les puede interesar...
> 
> Se trata de una aplicación para ponerle contraseña y darle sierto toque de seguridad a nuestras aplicaciones...
> ...




Por lo que entiendo, en una aplicación C#, que el programa quede protegido con una contraseña. Pues vete a mirar como se desemcripta, se puede hacer y no es tan eficaz como crees. Pero es interesante.


----------



## jorom (Ene 27, 2012)

Estou tentando compilar el :
Programa: Control de dispositivos por USB.
Descripción: HID - DEMO, programa para mostrar el uso del puerto USB 
             en proyectos de control.
Programador: Moyano Jonathan.
Hardware necesario: USB - PIC trainer v0.1 + PicKit2 clon.
Año: 2011

Mas sempre que tento da um erro " subscript out of the range" sou novo nesta programação e gostaria de trocar algumas portas. mesmo sem fazer qualquer alteracao dá este erro alguem pode me ajudar?

Thanks

Zeca 
Brazil


----------



## DSP (Ene 31, 2012)

A Moyano Jonathan:

Gracias por compartir tu trabajo, hace tiempo que queria usar el puerto USB y la informacion que necesitaba la encontré aqui. Al principio no queria leer el montonal de posts que tiene este tema pero ahora puedo decir que valió la pena ya que pude empezar a usar este puerto. Felicitaciones y saludos.


----------



## Meta (Ene 31, 2012)

Solo falta ampliar o mejor el manual y ejemplos para que la gente haga menos preguntas o tenga las cosas más claras casi a la primera. Versión 2.00 del manual.


----------



## DSP (Ene 31, 2012)

Oye, que acostumbrado estaba al vc++ 6 que tenia cierta resistencia a cambiarme al c#, y resultó mas simple en muchos aspectos. Se que también tu: Meta, estuviste compartiendo mucha info. y se los agradezco a ustedes y a quienes hayan participado.


----------



## Moyano Jonathan (Ene 31, 2012)

> Mas sempre que tento da um erro " subscript out of the range" sou novo nesta programação e gostaria de trocar algumas portas. mesmo sem fazer qualquer alteracao dá este erro alguem pode me ajudar?
> 
> Thanks
> 
> ...



Zeca por favor probá con la versión 4.114 del compilador de CCS. Con esa versión no te tendría que traer ningún problema con la compilación.

Un saludo !


----------



## jade0007 (Feb 7, 2012)

Hola, he visto que han desarrollado barias aplicaciones con USB y micro y  parecieron muy interesantes. ya hace un tiempo trabaje con PIC C++ y Delphy Borland e hice un pequeño proyecto.

Ahora necesito hacer este tipo de coneccion (USB) pero utilizando el software Qt creator y np se como hacerlo, es decir las instrucciones para el envío de datos al PIC serian las mismas a Delphy o a las que ustedes sutilizan en visual C++ ? o de que forma se puede hacer con Qt? la verdad es que necesito utilizar este programa ya que pienso hacer un proyecto basado en procesamiento digital de imágenes y bueno Qt es software libre y trabaja bastante bien con las librerías de OpenCv para este tipo de aplicaciones.

Así que si alguien me puede ayudar o darme una luz para empezar a trabajar con este proyecto le agradecería mucho.


----------



## syryus (Feb 8, 2012)

Hola Moyano, muchísimas gracias por el aporte.

¿Finalmente hiciste otro tutorial pata VB.net y PICBASIC?


----------



## Moyano Jonathan (Feb 8, 2012)

> Hola, he visto que han desarrollado barias aplicaciones con USB y micro y parecieron muy interesantes. ya hace un tiempo trabaje con PIC C++ y Delphy Borland e hice un pequeño proyecto.
> 
> Ahora necesito hacer este tipo de coneccion (USB) pero utilizando el software Qt creator y np se como hacerlo, es decir las instrucciones para el envío de datos al PIC serian las mismas a Delphy o a las que ustedes sutilizan en visual C++ ? o de que forma se puede hacer con Qt? la verdad es que necesito utilizar este programa ya que pienso hacer un proyecto basado en procesamiento digital de imágenes y bueno Qt es software libre y trabaja bastante bien con las librerías de OpenCv para este tipo de aplicaciones.
> 
> Así que si alguien me puede ayudar o darme una luz para empezar a trabajar con este proyecto le agradecería mucho



Yo por mi lado ni idea de como usar esos lenguajes para hacer lo que querés...vas a tener que investigar por tu cuenta.



> Hola Moyano, muchísimas gracias por el aporte.
> 
> ¿Finalmente hiciste otro tutorial pata VB.net y PICBASIC?



Estoy en eso, espero poder terminarlo pronto pero no tengo mucho tiempo para dedicarle.


----------



## arthas1888 (Feb 9, 2012)

hola moyano me pareces re capo en este soy un noob en esto de pic usb, me descargue tu tutorial de control de dispositivos hago la simulacion en proteus y me anda de una, pero cuando lo monto en mi proto el windows me dice dispositivo no reconocido, no se q es; el condensador de 100n debe ser ceramico o electrolito y el MCLR se puede conectar a una resistencia de 10k a vcc o tiene q ser con el diodo ?? ahh y el condensador q sale de vusb debe ser ceramico o electrolito? muchas gracias por tu interes en estos temas tan grosos


----------



## Moyano Jonathan (Feb 9, 2012)

Hola como estás. En el manual está el esquema del entrenador que usé para hacer el manual, ahí está como se conecta todo.

Un saludo !


----------



## arthas1888 (Feb 10, 2012)

mmm oks, ya solucione el problema era mala conexion, mira me puse a hacer el programa de visual c# desde ceros y cuando le doy run y clickeo el boton de conectar dispositivo me aparece el siquiente error en EasyHID.Connect(Handle);---->Unable to load DLL 'mcHID.dll': No se puede encontrar el módulo especificado. (Exception from HRESULT: 0x8007007E), ya intente de todo y nose q es haber si me colaboras  o me dices que puede ser...ahhh y otra cosa q pena molestarte tanto quiero hacer una aplicacion wifi con pic la idea es hacer el programa con el modulo rs232 o pic y comprar un modulo conversor de usb o serial a wifi haber si tu tienes informacion sobre eso o algun consejo o una idea, estaria agradecido contigo....exitos en tus actividades

igualmente un saludo!!


----------



## Moyano Jonathan (Feb 10, 2012)

> mmm oks, ya solucione el problema era mala conexion, mira me puse a hacer el programa de visual c# desde ceros y cuando le doy run y clickeo el boton de conectar dispositivo me aparece el siquiente error en EasyHID.Connect(Handle);---->Unable to load DLL 'mcHID.dll': No se puede encontrar el módulo especificado.



Es un error común. Pasa por que el sistema no encuentra la dll, tenes que copiar mcHID.dll en la carpeta de windows system32.


----------



## oeg2 (Feb 11, 2012)

Buenas a todos! he visto MUCHA información pero yo tengo un par de dudas todavia sobre USB (gracias a esto he aprendido BASTANTE porque lo he aprendido por mi cuenta).

*Yo tengo que hacer un proyecto que me cuente los pulsos de 3 cosas (en 3 terminales y 3 variables) y que los mande a la PC cada minuto.
*
mis problemas son:
- primera vez que programo en CCS y también en C.
- no se como configurar un temporizador para que me de una señal o puldo o desborde cada minuto para  mandar el dato de mis 3 variables cada minuto por eso lo iba a poner con otra cosa que me generar el pulso cada minuto y lo metia a la interrupcion B0 y los pulsos los quiero leer en 3 terminales del puerto B.
- no se como ir sumando a cada variable y lo que mas me detiene:
- NO SE CUAL ES LA INSTRUCCION O COMANDO PARA MANDAR INFO AL PC CON UNA VARIABLE DE palabra (16 bits).

si alguien me guiara o me mandara un simple codigo (que se que no esta dificil porque he programado en otros lenguajes y se como hacerlo en los otros pero no en C y tampoco conozco las instrucciones)

Tengo el siguiente programa que he ido construyendo poco a poco:
---------------------------------------------------------------------------------
#include <18F4550.h>           // Usamos el PIC 18F4550, pero puedes declarar cualquiera de los 18Fxx5x

#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN  // Cristal a 20MHz.
                               // * Haz clic aquí para ver otras configuraciones del cristal.           
#use delay(clock=48000000)     // El PLL interno siempre ha de ser de 48MHz. (No es el cuarzo)

#include "usb_cdc.h"           // Descripción de funciones del USB.    
#include "usb_desc_cdc.h"      // Descriptores del dispositivo USB.

#Byte PortA = 0xF80            // Dirección del puerto A para la familia 18Fxx5x.
#Byte PortB = 0xF81            // Dirección del puerto B para la familia 18Fxx5x.
#Byte PortC = 0xF82            // Dirección del puerto C para la familia 18Fxx5x.
#Byte PortD = 0xF83            // Dirección del puerto D para la familia 18Fxx5x (Sólo 40/44 pines).
#Byte PortE = 0xF84            // Dirección del puerto E para la familia 18Fxx5x.

// ------ Variable Global ------     
Int16 contador_1 = 0;                    // Declaramos el valor de X como Word (16 bits). Esta variable
Int16 contador_2 = 0;                    // ha de ser global porque su valor lo usaremos en la interrupción y 
Int16 contador_3 = 0;                    // en el programa principal. Por tanto declaramos esta variable antes
                                          // de la interrupción y de "void main". 

// ------- Interrupción --------      
#INT_EXT                        // Interrupción Externa por RB0: Decodificación de Encoder.
Void IntRB0()                       
{                                    
   // CCS se encarga de desactiva automáticamente cualquier interrupción.
   // No hace falta guardar contextos de registros.

   If (Bit_Test(PortB, 0))      // Si RB0 se ha puesto a 1 (flanco de subida),
   {                                  
       Ext_Int_Edge(H_TO_L);    // entonces activar la siguiente interrupción para flanco de bajada. 

       //mandar mis datos de las 3 variables a la PC.
       //y resetear mis variables. 

   }

   // Al finalizar la interrupción CCS se encarga de volver a poner automáticamente
   // la badera INTF = 0 ---> borra la interrupción para poder permitir la siguiente;
   // no hemos de hacer nada por nuestra parte.
}

void main() 
{
   Port_B_Pullups(FALSE);       // Configuración para el PIC 18F4550.
   Setup_ADC_Ports(NO_ANALOGS); // Sin comparadores ni ADCs, todo digital, etc...
   Setup_adc(ADC_CLOCK_DIV_2);
   Setup_spi(SPI_SS_DISABLED);
   Setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   Setup_timer_1(T1_DISABLED);
   Setup_timer_2(T2_DISABLED,0,1);
   Setup_comparator(NC_NC_NC_NC);
   Setup_vref(FALSE);

   Ext_Int_Edge(L_TO_H);        // Inicialmente detectar interrupción por flanco de subida.
   Enable_Interrupts(Int_Ext);  // Activar Interrupción Externa a través de RB0.
   Enable_Interrupts(GLOBAL);   // Interrupciones Generales Activadas. 

   Set_Tris_A(0b11111111);      // Puerto A todo entradas (en este caso no usamos el Puerto A).
   Set_Tris_B(0b11111111);      // Puerto B todo entradas (sólo usamos las entradas RB0 y RB1).
   Set_Tris_C(0b11111111);      // Puerto C todo entradas (en este caso no usamos el Puerto C).
   Set_Tris_D(0b11111111);      // Puerto D todo entradas (en este caso no usamos el Puerto D).
   Set_Tris_E(0b11111111);      // Puerto E todo entradas (en este caso no usamos el Puerto E).

   usb_cdc_init();              // Carga el modo CDC (Puerto virtual de comunicaciones).
   usb_init();                  // Carga el manejo del USB.

   char Buffer[20];             // Declaramos (sobradamente) un buffer de 20 bytes.

   while(!usb_cdc_connected())  // El PIC espera hasta enlazar con el PC a través del USB.
   {
   //QUISIERA ENCENDER UN LED CUANDO YA CONECTO EN ALGUN PIN DEL PUERTO B
   }

   while (TRUE)
   {
      usb_task();

      if (usb_enumerated())
      {
      If (Bit_Test(PortB, 1))      // Pulso del contador_1,
      {
         contador_1++              //aumenta en 1 por cada pulso que recibe.
      }
      If (Bit_Test(PortB, 2))      // Pulso del contador_2,
      {
         contador_2++              //aumenta en 1 por cada pulso que recibe.
      } 
      If (Bit_Test(PortB, 3))      // Pulso del contador_3,
      {
         contador_3++              //aumenta en 1 por cada pulso que recibe.
      } 
                                    // al PC a través del USB.
   }   
}

No tienen idea cuanto les agradeceria su ayuda (Y ESTOY SEGURO QUE SE PUEDE SIMPLIFICAR EL CODIGO )
GRACIAS


----------



## arthas1888 (Feb 15, 2012)

oye ven moyano tu no tienes informacion acerca de conectar un pic a una red wifi, serias muy cordial y te lo agradeceria muchisimo sobre ese tipo de informacion, y bueno men gracias por todo y sos muy grosso


----------



## Moyano Jonathan (Feb 15, 2012)

> oye ven moyano tu no tienes informacion acerca de conectar un pic a una red wifi, serias muy cordial y te lo agradeceria muchisimo sobre ese tipo de informacion, y bueno men gracias por todo y sos muy grosso



Hola no tengo dicha información. No es el hilo adecuando tampoco.


----------



## arthas1888 (Feb 15, 2012)

oks muchas gracias igualmente me sirvio mucho tu tuto te cuidas exitos


----------



## loquillo3600 (Feb 15, 2012)

buenas, que pena soy nuevo en este foro, mi pregunta es la siguiente, he descargado un programa de coneccion PIC + USB para principiantes (lo pueden buscar de esta manera en google), instalo el driver programo el pic con el programa que se encuentra en la careta de desacrga y hasta hay todo bien, pero al correr el programa de C# me dice que "No se puede cargar el archivo DLL 'mpusbapi.dll': No se puede encontrar el módulo especificado. (Excepción de HRESULT: 0x8007007E)", me he leido la mayor parte de tutoriales en internet sobre el tema de USB PIC y C# y no encuentro uno que me colabore con este tema, entre las soluciones que han dado se encuentra copiar la libreria en la system32 al hacerlo el programa corre pero no recibe datos es como si no se conectara el dispocitivio, le agradeceria al que me diera la solucion.


----------



## Meta (Feb 16, 2012)

Hola:

Si no recuerdo mal, tienes que indicar el archivo mpusbapi.dll en referencias de C#, a parte de dejar esa dll en alguna ubicación en concreto.

Saludo.


----------



## loquillo3600 (Feb 16, 2012)

hola Meta, realice lo que me dijiste y no me dejo me decia que la ubicacion no era valida o que el archivo no era valido, preguntando en otro foro me dijeron que tenia que agregarla el dll en la carpeta debug que se encuantra dentro bin de la carpeta del proyecto, realice esto y listo me copilo el archivo a la perfecion, muchas gracias por tu ayuda.


----------



## Meta (Feb 16, 2012)

loquillo3600 dijo:


> hola Meta, realice lo que me dijiste y no me dejo me decia que la ubicacion no era valida o que el archivo no era valido, preguntando en otro foro me dijeron que tenia que agregarla el dll en la carpeta debug que se encuantra dentro bin de la carpeta del proyecto, realice esto y listo me copilo el archivo a la perfecion, muchas gracias por tu ayuda.



lo que te dijeron es lo que me refería, ejeje.


----------



## isaacivan (Feb 17, 2012)

Alguien sabe de por que no me detecta el pic18f2550 con el hid, tome el primer ejemplo del hid y lo monte en proteus y hay si anda de maravilla pero el problema ya es al momento de conectar el pic a la pc me dice que no se reconoce el dispositivo USB alguien me podria ayudar T_T


----------



## Meta (Feb 19, 2012)

Hola Moyano:

Hace tiempo se propuso hacer un mini manual como el esquema de arriba con C#, USB y PIC16Fx550. A lo mejor lo tienes hecho y no lo se.







http://www.circuitvalley.com/2011/09/pic-18f-usb-io-board-with-analog.html

- 8Entradas digitales
- 8 Salidas Digitales
- Entradas analógicas
- LCD 20x4
- USB

No te digo ahora, si cuando estés preparado. ¿Hacemos una Interfaz de C# con esas características?

Cada vez veo a mucha gente con el USB por todas partes, jejeje. Espero que a estas altura tengas ya soltura con el USB y los PIC para controlar dicha salidas y entradas. Cuando estés y estén dispuestos avisa, soy todo oídos y te ayudaré en la parte de la Interfas. Los demás pueden aportar.

Un cordial saludo.


----------



## dinoelectro (Feb 24, 2012)

hola meta, segun veo la figura se trata de una tarjeta DAQ.. yo construi una y la postee en este foro puedes revizarla en en el siguiente link

https://www.forosdeelectronica.com/f24/daq-usb-pic-18f4550-63931/

aunque de antemano te digo que no me gusta mucho su rendimiento; ya que la velocidad de adquisicion es lenta y ademas la comunicacion CDC se pierde.. seria bueno pensar en construir una parecida utilizando HID... yo me apunto para lo que pueda colabolarles.. saludos!!


----------



## Meta (Feb 24, 2012)

dinoelectro dijo:


> https://www.forosdeelectronica.com/f24/daq-usb-pic-18f4550-63931/



Muy bueno.

Claro que este PIC para lo que quiero le faltan un puerto más para el manejo del LCD. Habrá que usar un PIC de 60 pines o un PCF8574 o el PCF8574A para tener más pines con el mismo PIC.


----------



## dinoelectro (Feb 24, 2012)

haz considerado el controlador de LCD con un solo pin que publico unas dias atras arrivaelobo?.. talves ahi te ahorras ese microcontrolador


----------



## Meta (Feb 24, 2012)

Si lo tuviera a mano y fácil de conseguirlo si. ejjejeje.Los que consigo son del típico de siempre. 4 bits config y 3 máspara control del LCD. El del PIN es con el RS232 tengo entendido y funciona de maravila.


----------



## dinoelectro (Feb 24, 2012)

Tecnico 93 ha publicado un DAQ de tipo HID muy bueno y una tarjeta PCB que es una belleza merece la pena que lo revicen

https://www.forosdeelectronica.com/f26/activar-entras-digitales-salidas-analogas-pic-18f4550-69917/


----------



## albermillan69 (Feb 27, 2012)

dinoelectro dijo:


> aunque de antemano te digo que no me gusta mucho su rendimiento; ya que la velocidad de adquisicion es lenta y ademas la comunicacion CDC se pierde.. seria bueno pensar en construir una parecida utilizando HID... yo me apunto para lo que pueda colabolarles.. saludos!!



Dinoelectro, sera que estas haciendo algo malo en la configuracion del CDC o en la adquisición de los datos, porq la verdad yo utilizo frecuentemente en mis proyecto el CDC y funciona perfecto, claro yo hago mi interfaz visual con Visual Basic 6, y donde si debo estar muy pendiente es en leer el o borrar el buffer del PIC antes que se sature, asi si pierde conexion o no funciona adecuadamente.

Revisa tu programacion, cualquier cosa por aca siempre estamos a la orden, el HID es la conexion mas lenta en USB, solo q no necesitas dirver para instalar, en caso tal si lo q quieres es aumentar tu comunicacion, puedes usar el BUlk, la verdad es muy bueno, pero tiene sus ventajas y desventajas tambien.

Saludos desde Venezuela. y podemos crear un buen grupo de trabajo entre varios miembros del foro, para desarrollar nuevos proyectos.


----------



## oeg2 (Feb 27, 2012)

A mi nunca me respondieron


----------



## dinoelectro (Feb 27, 2012)

albermillan69 dijo:


> Dinoelectro, sera que estas haciendo algo malo en la configuracion del CDC o en la adquisición de los datos, porq la verdad yo utilizo frecuentemente en mis proyecto el CDC y funciona perfecto, claro yo hago mi interfaz visual con Visual Basic 6, y donde si debo estar muy pendiente es en leer el o borrar el buffer del PIC antes que se sature, asi si pierde conexion o no funciona adecuadamente.
> 
> Revisa tu programacion, cualquier cosa por aca siempre estamos a la orden, el HID es la conexion mas lenta en USB, solo q no necesitas dirver para instalar, en caso tal si lo q quieres es aumentar tu comunicacion, puedes usar el BUlk, la verdad es muy bueno, pero tiene sus ventajas y desventajas tambien.
> 
> Saludos desde Venezuela. y podemos crear un buen grupo de trabajo entre varios miembros del foro, para desarrollar nuevos proyectos.



estas en lo cierto, la comunicacion CDC, es buena y segura.. en muchos proyectos me ha funcionado a la perfeccion,.. yo me referia a este proyecto del DAQ con 18F4550, que me descargue de www.sixca.com. ahi no dan el codigo solo el *.hex, el daq funciona pero hay veces que la comunicacion se corta...

yo sabia que HID es mas rapido que CDC... almenos eso es lo que investigado

saludos amigo.


----------



## albermillan69 (Feb 27, 2012)

oeg2 dijo:


> A mi nunca me respondieron



Cual fue tu pregunta? y disculpa!!

Dinoelectro: Ahhh ok asi si... pero yo siempre he tenido entendido q el CDC es el de media velocidad


----------



## oeg2 (Feb 27, 2012)

Que solo queria hacer un prograra con CDC (que no lo pude utilizar) en PIC C que contara los pulsos de entrada por minuto de tres pines (o tres cosas) y lo mandara a usb cada minuto. Gracias y saludos, en la pestaña número 96 creo que esta el programa que "habia intentado hacer" pero no pude y lo hice con HID, pero queria aprender con CDC.


----------



## albermillan69 (Feb 27, 2012)

oeg2 dijo:


> Que solo queria hacer un prograra con CDC (que no lo pude utilizar) en PIC C que contara los pulsos de entrada por minuto de tres pines (o tres cosas) y lo mandara a usb cada minuto. Gracias y saludos, en la pestaña número 96 creo que esta el programa que "habia intentado hacer" pero no pude y lo hice con HID, pero queria aprender con CDC.



El CDC es mas facil q el HID, solo debes saber hacer la configuracion correcta como en todo lo q se haga en un PIC, aqui puedes encontrar una muy buena explicacion sobre como hacerlo.

http://picmania.garcia-cuervo.net/usb_3_cdctransfers.php

Recuerda que uno aprende a caminar es gateando y luego perfecciona la tecnica, que quiero decir con esto? que si consigues a alguien q te haga el programa, tu no vas a aprender a hacerlo ni a resolver los problemas q se te presenten posteriormente, por eso es mejor, aprender por si mismo, pero si se te presentan dudas, aqui en este tema, al comienzo, estan las explicaciones de la comunicación CDC, te lo digo porq es el foro y la pag q busco cuando se me olvida como hacerlo, porq me la paso programando a diario!!

Yo considero q la comunicación CDC es mas fácil de configurar que la HID, por eso se te debe hacer mas fácil ahora la programación!!! Saludos... Cualquier cosa, has la pregunta mas directa!! no decir q no funciona!! porque sino seria mas difícil darte respuesta!!

Espero que con mis palabras no ofenda a nadie, pero el gran valor de la programación va es en el conocimiento que cada programa nos deja!!!


----------



## oeg2 (Feb 27, 2012)

Gracias Albermillan69! es que me urgía un poco por eso habia puesto el código de lo que habia echo, voy a probar ya que si deces que la CDC es mas facil que HID me imagino que es demasiado fácil, ya que la HID no sentí que fuera tan dificil (solo horas y horas de lectura y practica) pero a la hora de entender muy facil, gracias y lo que quería era correción de mi código que puse en la pestaña 96, y si en caso tienes algun material de apoyo te agradeceria enormemente, saludos!!


----------



## albermillan69 (Feb 27, 2012)

oeg2: Yo habia leido tu mensaje, pidiendo la ayuda, pero la verdad estaba muy ocupado, aun lo estoy un poco, pero como te dije, la informacion estan en la pag q te pase y en el principio de este foro, a diferencia del HID con el CDC debes tener un driver, que te va hacer la comunicacion entre el PC y el PIC, por eso quizas vez mas facil el HID, porq es la interfaz humana, como un Mouse, que tu no instalas los driver sino el solo lo hace!!! es mas practico el HID en ese sentido, pero con CDC puedes hacer mas!!

En fin, ya que ahora tienes mas tiempo para aprender, te invito a que trates de hacer la comunicacion CDC y nos avisas como te fue, aqui te voy a dejar partes del ultimo programa q realice con CDC, funciona perfecto!!

Programa:
//Este es para un cristal de 20MHz
#include <18f4550.h>
#FUSES HSPLL, NOPROTECT, BROWNOUT, BORV28, NOPUT, NOCPD, NOLVP, LPT1OSC, NOPBADEN, USBDIV, PLL5, CPUDIV1, VREGEN
#use delay(clock=48000000) 

//Librerias
#include "usb_cdc.h"             // Descripción de funciones del USB.
#include "usb_desc_cdc.h"        // Descriptores del dispositivo USB.

//luego dentro del Void main() colocas
//Configura el USB
   usb_cdc_init();
   usb_init();

//Y tu ciclo infinito va a ser algo asi
   While(true){
      usb_task();

      //Si esta conectado al HUT
      while(usb_cdc_connected()){
         //OFF(Rojo);
         //ON(Verde);
         delay_ms(500);
         //Si el dispositivo NO esta enumerado
         while(!usb_enumerated()){}
         //Si se envia algun dato
         car=0;
         while(usb_cdc_kbhit()){    //Mientras exista algo en el Buffer de entrada


OJO: son partes de la logica del programa que yo realice, asi me funciona perfectamente, las librerias son las que trae el CCS, pero ya las mias están personalizadas!! el driver, creo q tambien lo trae el CCS.

Cualquier cosa, pega un grito!!! Saludos desde venezuela, de donde eres tu??


----------



## oeg2 (Feb 27, 2012)

Gracias albermillan69! voy a ver un poco de esto y te cuento, gracias por tu interés y saludos desde el país de la eterna primavera, Guatemala! voy a ver un poco y si puedes mandarme un saludito a mi correo para tenerte en mis contactos, saludos!


----------



## dinoelectro (Feb 27, 2012)

hay una plantilla que se instala en visual basic 2005/2008/2010 para realizar proyectos con HID; no la he utilizado pero apenas tenga tiempo les comento; por ahora dejo el link para que la bajen

http://helmpcb.com/software/usb-hid-template-for-visual-basic-2005


----------



## cristiancrm (Mar 17, 2012)

Hola, buenas noches.

Muy buen code!
Estoy tratando de hacer unas modificaciones y me encuentro con un problema. A ver si pueden ayudarme:
Resulta que el HEX que nuestro compañero nos compartió, funciona de maravillas. El problema me aparece cuando compilo con mi CCS y crea el nuevo HEX. El código compilado está tal cual lo compartió nuestro amigo. Por algún motivo Windows no me reconoce el PIC y lo registra como "Dispositivo Desconocido". Me fijé en las propiedades y veo que el VID&PID llegan con 0000. En adjunto les dejo las capturas de cómo Windows registra uno y otro. 
Lo que me parece raro es que el código está compilado tal cual nos lo compartió nuestro compañero. No sé si se puede tratar de una configuración mala del CCS o, incluso, de la versión. Probé con la 4.068 y la 4.104, y en ambas obtuve el mismo resultado.

A alguien le pasó algo similar?

Agradezco de antemano su ayuda.

Saludos!


----------



## oeg2 (Mar 17, 2012)

cristiancrm dijo:


> Hola, buenas noches.
> 
> Muy buen code!
> Estoy tratando de hacer unas modificaciones y me encuentro con un problema. A ver si pueden ayudarme:
> ...



Talvez te esta agarrando un driver que ya tenias, eso me paso a mi, habia echo pruebas con un ejemplo de J1M algo asi ya no recuerdo, despues compilé con otro VID y otro PID y me seguia jalando ese driver, prueba en otro puerto usb o desinstala todos los contralores que habias instalado para ese tipo de pruebas de CDC con tu PIC (por lo que veo que estas trabajando) y siempre revisa en el archivo usb_desc_cdc.h de tu libreria de CCS si no esta diferente, esto esta en las primeras lineas de código como:

#define  USB_CONFIG_PID       0x000A ( estos son en mi caso )
#define  USB_CONFIG_VID       0x04D8 ( estos son en mi caso )

mira y estaremos al pendiente.
Saludos desde Guatemala!


----------



## cristiancrm (Mar 17, 2012)

Hola, Oeg2. Gracias por tu ayuda!

Mira, yo estoy haciendo las pruebas desde Proteus, simulando USB. Hice lo que me dijiste, pero aún sigue pasando lo mismo. 
La versión 4.104 de CCS es la que estoy usando, y las librerías que integra tiene los dos #defines que mencionas. 

Voy a hacer unas pruebas y luego te comento como me fue.

Muchas gracias y saludos desde Argentina.
Cristian.



Hola de nuevo.

He borrado los drivers desde el administrador de dispositivos, luego cargué en Proteus el HEX compilado en mi PC y sigue apareciendo como desconocido . Evidentemente algo raro hay en la PC o en la versión de CCS. 
Qué versión de CCS usas en tu caso? 

Gracias de antemano.
Saludos,
Cristian.


----------



## cristiancrm (Mar 18, 2012)

Hola.

Bueno, no hay caso. Intenté con una versión más reciente de CCS con sus propias librerías modificando el VID&PID, pero no pasa nada . En el asistente de instalación de Drivers me sigue apareciendo como "Desonocido" (ver adjunto).
Hice una comparación con el HEX que sí funciona, y lo llamativo es que, apenas conecto el PIC al USB, me aparece el Nombre del dispositivo rápidamente. En cambio, con el HEX compilado con mi CSS, directamente aparece "Desconocido". 

Bueno, si a alguien se le ocurre alguna sugerencia, les agradeceré muchísimo.

Saludos cordiales,
Cristian.


----------



## Meta (Mar 18, 2012)

En vez de tanto CCS. 
¿Han probado el C18 de Microchip?

Lo pregunto porque ya viene muchos ejemplos sobre 18F y USB con sus driver incluidos.


----------



## cristiancrm (Mar 18, 2012)

Hola.
No aún, personalmente no probé en C18. 
Voy a instalarlo para validar si realmente funciona. 
Creo que también se puede usar el compilador CCS en el MPLAB, pero supongo que el resultado será el mismo.
Voy a probar y te comento en un rato.

Gracias y saludos!
Cristian.


----------



## arielrodolfodiaz (Mar 21, 2012)

Moyano Jonathan dijo:


> Hola como andas aguevara, las respuestas a tus dudas son las siguientes:
> 
> - El archivo  mpusbapi.dll es el archivo encargado , junto con el driver correspondiente que viene incluido con el de gestionar la comunicación PC - PIC . Ahora bien este archivo no se carga al pic sino que un programa escrito por ejemplo en Visual Basic 6.0 llama a las funciones de esa librería y establece comunicacion con el PIC.
> 
> ...



hola Moyano Jonathan, ha pasado mucho tiempo de que hicieron este tema, realmente esta muy bueno, es realmente un tutorado de los pic 18f2550. Le agradesco todo su aporte y el averlo echo publico.


----------



## Moyano Jonathan (Mar 21, 2012)

> hola Moyano Jonathan, ha pasado mucho tiempo de que hicieron este tema, realmente esta muy bueno, es realmente un tutorado de los pic 18f2550. Le agradesco todo su aporte y el averlo echo publico



Muchas gracias, igual faltan muchos temas por cubrir. Con lo de USB por ahora no lo he seguido desarrollando por que considero que hay otros temas que por ahora me llaman más la atención.
En estos momentos estoy desarrollando temas como ETHERNET, microcontroladores AVR, robótica, GSM, RF, etc. Igual el tema de USB todavía no lo he dado por terminado y en cuanto tenga más tiempo libre lo voy a seguir desarrollando.

Un saludo  !


----------



## arthas1888 (Mar 22, 2012)

buenas muchachos trate de hacer los ejemplos de usb_ cdc pero la verdad no me funcionan ninguno, estoy compilando en picc compiler version 4.109 no se q es a la hora de descargar las paquetes completos en proteus subo el archivo .hex y me funciona a la maravilla, pero cuando le doy compilar al archivo c q viene en carpeta de nuevo pongo el .hex y no funciona en windows lo reconoce como si fuera un dispositivo hid desconocido, he probado con todos los ejemplos y la misma cosa no funka sin compilar si funka pero compilo y nada q ver, tu Jonathan en las caspetas entregas las librerias hasta la de pic18usb modificada pero veo q la extension es .h pero a la hora de abrir el archivo en la cabecera dice pic18_usb.c entonces es .h o .c no se cual es el error, si pongo tus librerias de una me bota error a la hora de compilacion y si dejo las de por defecto q vienen en c, como te digo el pc las reconoce como un dispositivo hid desconocido; espero me puedas ayudar o si puedes mandarme todo el paquete completo de librerias usb.c usb.h bueno y todas las demas q demende la aplicacion en cdc usb  te lo agradeceria bastante si alguien tiene ese problema y ya lo soluciono pues q podria ser....
un saludo!!
y sos un capo


----------



## Moyano Jonathan (Mar 22, 2012)

> buenas muchachos trate de hacer los ejemplos de usb_ cdc pero la verdad no me funcionan ninguno, estoy compilando en picc compiler version 4.109


Tenés que usar la versión 4.023 para que te compile bien, o modificar todos los archivos de descriptores.



> no se q es a la hora de descargar las paquetes completos en proteus subo el archivo .hex y me funciona a la maravilla, pero cuando le doy compilar al archivo c q viene en carpeta de nuevo pongo el .hex y no funciona en windows lo reconoce como si fuera un dispositivo hid desconocido



Estás usando el modo HID o CDC...me confundís en esa parte.


----------



## arthas1888 (Mar 22, 2012)

el modo cdc ese estoy usando sino q el compu lo reconoce como si fuera un dispositivo hid desconocido, otra pregunta donde me bajo esa version de picc..



una pregunta como hago para enviar varios datos en el mismo buffer mediante usb cdc asi como hiciste en usb hid y recepcionarlos uno por uno en visual c# como si fuera un com serie normal, lo unico q he podido es recepcionar un solo dato o me llega todo el buffer de una y la idea es separar los datos q lleguen del mismo buffer ya q tienne informacion de entradas analogas y digitales


----------



## Moyano Jonathan (Mar 22, 2012)

> el modo cdc ese estoy usando sino q el compu lo reconoce como si fuera un dispositivo hid desconocido, otra pregunta donde me bajo esa version de picc..



Estás configurando algo mal. Para HID tenés mi guía que publiqué en la primer página del post, ahí está todo lo que necesitas saber para hacer una aplicación con CCS v4.114 y Visual Studio 2008. Para CDC en los primeros post, están todas las funciones que la librería soporta.....es cuestión de que te pongas a leer y hacer pruebas.

Algo que te tengo que decir al respecto es que no uses proteus para probar el USB. En caso de que lo uses...mejor armate una placa de desarrollo con el PIC18F2550...o en el protoboard.



> una pregunta como hago para enviar varios datos en el mismo buffer mediante usb cdc asi como hiciste en usb hid y recepcionarlos uno por uno en visual c# como si fuera un com serie normal, lo unico q he podido es recepcionar un solo dato o me llega todo el buffer



Tenés que tomar los caracteres entrantes y guardarlos en un buffer...luego podés tratar el buffer como si fuera una cadena y filtrar los datos. Eso lo vas a tener que investigar por tu cuenta.

Ahora...fuera de contexto...que experiencia tenés programando ? Has leído todo el hilo del USB ?..se que es largo pero se te van a aclarar un montón de dudas.

En fin disculpa por no ser más conciso con la respuesta, pero quiero animarte a que lo investigues en el desarrollo del hilo...no por egoísta...si no por que se te van a disipar muchas dudas.


----------



## arthas1888 (Mar 22, 2012)

mmm veo claro tienes toda la razon; hasta ahora me he comido las primeras 20 pags del hilo estoy haciendo las pruebas primero del usb cdc pero como te digo el pc me reconoce como si fuera un dispositivo usb hid desconocido; voy a compilar entonces con la version 4.023 oye y tu no tienes todos las librerias y descriptores de usb cdc q utiliza esa version de picc para no tener q descargar uno nuevo y eliminar el q tengo instalado....
y respecto a lo de filtrar e intentado y no puedo coger dato por dato e aqui lo q he hecho y pues esto es para una aplicacion rs232 y sirve igual para usb cdc; bueno estamos en contacto igualmente sos muy grosso lo q he leido hasta ahora me dejas sin palabras
saludos


----------



## Moyano Jonathan (Mar 22, 2012)

> mmm veo claro tienes toda la razon; hasta ahora me he comido las primeras 20 pags del hilo estoy haciendo las pruebas primero del usb cdc pero como te digo el pc me reconoce como si fuera un dispositivo usb hid desconocido;



Eso está mal...vas a tener que pasarme el programa que estás usando para que lo vea. 



> voy a compilar entonces con la version 4.023 oye y tu no tienes todos las librerias y descriptores de usb cdc q utiliza esa version de picc para no tener q descargar uno nuevo y eliminar el q tengo instalado....



Esa versión del compilador no la uso más...ahora estoy usando la versión 4.114 para mis proyectos...y hay que cambiar muchas cosas en los descriptores para que funcione.


----------



## arthas1888 (Mar 22, 2012)

o sea q para probar el usb cdc toka exclusivamente con esa version??
de lo contrario toka cambiar los descriptores de manera general?? 
veo...
sirve la version 4.013? para los ejemplos del principio del post...
muchas gracias por todo compa, ahi en el archivo rar q adjunte hay algo de tomar el buffer y descomponerlo solo q es inestable no se si tu puedes colaborarme con aquello
estamos en contacto gente tan abierta como tu hace de la electronica una vision mas clara


----------



## Moyano Jonathan (Mar 22, 2012)

> o sea q para probar el usb cdc toka exclusivamente con esa version??
> de lo contrario toka cambiar los descriptores de manera general??
> veo...


 Te conviene cambiar de versión y modificar los descriptores. 



> muchas gracias por todo compa, ahi en el archivo rar q adjunte hay algo de tomar el buffer y descomponerlo solo q es inestable no se si tu puedes colaborarme con aquello



Sinceramente no tengo tiempo de ver tu programa y modificarlo, vas a tener que ver la mejor forma de implementarlo por tu cuenta. Igual en esta página hay mucha información sobre como leer datos de RS232: http://picmania.garcia-cuervo.net/index.php Cuestión de que investigues y veas como hacerlo.

PD: Te recomiendo cuides la ortografía para que no te moderen el mensaje. Es importante escribir correctamente para que los demás te entiendan.
Un saludo y que estés bien !


----------



## arthas1888 (Mar 23, 2012)

mmm oks tendre en cuenta tu recomendación de todas maneras muchas gracias por todo, te comento que cambie de version y ya me funciono era solo los descriptores; una pregunta alguna vez has trabajado con el modulo wifly?
cordial saludo y exitos en todas tus actividades!!


----------



## Moyano Jonathan (Mar 23, 2012)

> cambie de version y ya me funciono era solo los descriptores;


 Buenisimo, espero puedas avanzar con tu proyecto.



> una pregunta alguna vez has trabajado con el modulo wifly?


 Si te referís al WIFI, no he trabajado todavía con el ...pero este año lo tengo que usar para un proyecto de robótica.

Saludos !


----------



## arthas1888 (Mar 23, 2012)

pues al wifi si, pero me refiero al modulo wifly GSX por ahi tengo un proyecto tambien de robotika y pues encontre este modulo y me parece especial para la aplicacion espero q tambien te sirva... para lo tuyo a penas saque el proyecto subo informacion..estamos en contacto
saludos!


----------



## Meta (Mar 23, 2012)

Hola:

De las opciones para usar en los PIC control de entradas y salidas digitales. ¿Cuál es la más adecuada y por qué en los enlades de abajo?       
	

	
	
		
		

		
			



El USB Desencadenado : Bulk Transfers USB o la        transferencia bidireccional masiva de información.                    
	

	
	
		
		

		
		
	


	


El USB        Desencadenado : HID USB o los dispositivos de interfaz humana.                           
	

	
	
		
		

		
		
	


	


El USB        Desencadenado : CDC USB o la clase de dispositivos de comunicación.                            
	

	
	
		
		

		
		
	


	




 El USB        Desencadenado : MSD USB o los dispositivos de almacenamiento masivos. (En        estudio)Por ejemplo, quiero buscar en www.microchip.com ejemplos, driver, librerías del PIC18F4550 para USB. Me cuesta el Inglés. Me imagino que será esta. Si me meto me sale USB para PIC24F y PIC32. Está bien PIC32 en USB proque será más cómodo de programarlo, en tal caso, prefiero usar el PIC18F4550 que está tan usado últimamente.

http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=1486&redirects=USB

Hasta otra.


----------



## Moyano Jonathan (Mar 23, 2012)

Meta cuál es más adecuado depende de la aplicación de destino. Si vas a prender y apagar luces quizás con CDC lo soluciones facilmente sin necesidad de estudiar tanto el protocolo. Si vas a mostrar datos que se actualizan más o menos rápido..y que necesitas un ancho de banda mediano..con HID lo podés solucionar. Ahora si necesitas adquirir datos a gran velocidad y con un ancho de banda mediano a grande ...lo mejor es usar transferencias tipo Bulk o utilizar el acceso directo a la SIE mediante puerto paralelo del microcontrolador.

Un saludo !

PD: Microchip tiene un framework con todos los ejemplos que necesitas para poder desarrollar proyectos con USB. Es cuestión de que te lo bajes y veas que contiene para sacar lo que necesites.


----------



## Meta (Mar 23, 2012)

Precisamente controlar 8 salidas y 8 entradas digitales. Puede quehasta una entra analógica par aponer un LM35. El DS1820 es digital.

Pensaba que el HID era para ello.

No sabía que Microchio tenga un buen framework para ello.

¿Por casualidad es este enlace?

Saludo.


----------



## Moyano Jonathan (Mar 23, 2012)

> Precisamente controlar 8 salidas y 8 entradas digitales. Puede quehasta una entra analógica par aponer un LM35. El DS1820 es digital.
> 
> Pensaba que el HID era para ello.



Lo podés hacer HID, no habría problema con ello.



> No sabía que Microchio tenga un buen framework para ello.
> 
> ¿Por casualidad es este enlace?
> 
> Saludo.



Lo tiene y el enlace es este: http://ww1.microchip.com/downloads/en/softwarelibrary/microchip-application-libraries-v2012-02-15-windows-installer.exe

Te aviso que los ejemplos que trae microchip a veces pueden resultar un poco complejos de enteder, pero con tiempo quizás puedas sacar algo en claro.

Un saludo !


----------



## Meta (Mar 23, 2012)

Gracias, traduciendo poco a poco puede que entienda algo, así espero programar los PIC con USB sin tener que usar otras herramientas externas y no muy compatible con 64 bits.

Una pregunta tonta, beo que son 220 MB.
¿En qué enlace lo sacaste?
Por saber y no amarrarme con ese enlace siempre, ya que podríahaber más actualizaciones en el futuro.

Gracias por la información.


----------



## resident2488 (Mar 24, 2012)

Hola
ya yo he trabajando con visual basic y el pic 18f4550 en ccs
pero me falta ahcer un aplicacion para util18f4550 pero con una comunicacion usb hid para que visual basic lo pueda leer
algien tienes alguna ayuda???????


----------



## Moyano Jonathan (Mar 24, 2012)

> Hola
> ya yo he trabajando con visual basic y el pic 18f4550 en ccs
> pero me falta ahcer un aplicacion para util18f4550 pero con una comunicacion usb hid para que visual basic lo pueda leer
> algien tienes alguna ayuda???????



En el desarrollo del hilo está la aplicación que necesitás, vas a tener que fijarte, sinó en la primer página está el tutorial para realizar una aplicación de control en Visual C# y CCS con el PIC18F2550.


----------



## jnatera (Mar 24, 2012)

amigos estoy nuevo en esto baje 	USBProject.rar (434,9 KB (Kilobytes), 678 visitas) pero como puedo probarlo de manera virtual sin cargarlo al programador??
gracias de antemano


----------



## Moyano Jonathan (Mar 24, 2012)

Usando el proteus. Por favor te pido que uses el hardware que aparece en el manual para poder ver el funcionamiento del program... ya que si tenés problemas relacionados con la simulación, no voy a poder ayudarte.

Un saludo !


----------



## jnatera (Mar 25, 2012)

Amigos alguien tendra el driver de PIC18F4550 para windows xp estoy tratando de probarlo virtualmente con proteus?? les agradecería mucho eso, no soy de la carrera de electronica sino de sistema y no tengo muchos conocimientos en electronica. gracias a ustedes que son exṕerto en la rama de electronica.


----------



## Meta (Mar 25, 2012)

Mira aquí.
http://ww1.microchip.com/downloads/...n-libraries-v2012-02-15-windows-installer.exe

http://picmania.garcia-cuervo.net/usb_0_desencadenado.php

http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=2680&dDocName=en537044

Saludo.


----------



## eoth (Mar 25, 2012)

Moyano Jonathan dijo:


> Hola a todos acá les traigo algo que quizas a muchos les interese. Se trata de ejemplos de control del puerto USB que traen de fábrica los pic´s de la serie 18Fxx5x.



Saludos! Excelente aporte  , solo una pregunta, yo con los pic tengo poca experiencia porque no tengo programador. Quiere decir que los 18Fxx5x ya traen el firmware para usar directamente con USB? o siempre hay que programarlo?


----------



## Moyano Jonathan (Mar 25, 2012)

> Saludos! Excelente aporte  , solo una pregunta, yo con los pic tengo poca experiencia porque no tengo programador. Quiere decir que los 18Fxx5x ya traen el firmware para usar directamente con USB? o siempre hay que programarlo?



Hay que programarlos para poder conectarse con el puerto USB. El programador lo podés comprar o fabricarlo vos mismo: https://www.forosdeelectronica.com/f24/programador-microcontroladores-pic-memorias-puerto-usb-pickit2-clone-18080/


Saludos !


----------



## Meta (Mar 25, 2012)

Si lo compras te apuñalan si sólo es para grabar PIC.







Información.
http://es.scribd.com/doc/37078715/PICkit2-PICkit3-charla

A raíz de la salida del Pickit 3 de Microchip aparentemente no se ha  visto gran mejoría respecto a la versión 2. Una persona llamada David L.  Jones hizo un review bastante directo y criticó fuertemente los muchos  defectos del pickit.

La página web en donde publicó un video de Youtube es...
http://www.eevblog.com/2009/10/21/eevblog-39-pickit-3-programmerdebugger-review/

Y el video de Youtube...







Detalles que critica en el video...
+ 10 USD más caro que el v2
+ Menos amplio rango de voltajes (aunque luego se corrige él mismo ya que sí los tiene)
+ No hace falta contar con el pickit3 para los nuevos PICs, la v2 puede con ellos
+ v2 entregaba voltaje al detectar que no había fuente, el v3 no lo hace
+ v3 no indica automáticamente que chip está siendo conectado
+ v3 programa más lento que v2 a pesar de que cuenta con un PIC24 internamente
+ la luminosidad de los leds de la v3 es bajísima
+ Al cambiar un pic en un programa de mplab es necesario cambiar el firmware del v3, el v2 no lo hacía
+ v2 contaba con un analizador lógico y la v3 no cuenta con tal software
+ v3 no soporta Programmer to go aún

Inmediatamente  la gente de Microchip vio el blog y generó un video cómico-realista de  los cambios que hay que hacer al pickit3 como respuesta directa al video  de David.

Según el blog de David le sorprendió que la gente de  Microchip respondiera con un video y no con un grupo de abogados listos  para actuar legalmente en contra de él.

La respuesta de Microchip...







En  el video se muestra a los ingenieros de Microchip discutiendo con el  jefe Mr. Dick Head que supuestamente cuenta con un MBA (Maestría en  Administración). A él solo le interesa vender más... aún si el pickit3  cuenta con leds reciclados (refurbished) y no se ve bien.

Al  final del video todos se ponen de acuerdo y hablan sobre las mejoras que  vendrán para el pickit3... posteriormente se ve como le dan cuello a  Mr. Dick Head jejeje

Así que la gente de Microchip se equivocó esta vez pero ya están trabajando en la mejora del pickit v3.

Y bueno... la página web del pickit3...
http://www.microchip.com/stellent/i...deId=1406&dDocName=en538340&redirects=pickit3

Un saludo.


----------



## eoth (Mar 25, 2012)

Gracias @moyano-jonathan y @meta, ahora ya tengo por donde empezar, aunque mi inquietud realmente era si es posible construir un programador de PIC sin necesidad de otro programador?


----------



## Meta (Mar 25, 2012)

Pues tienes que tener un PIC programado para hacer de programador, incluido el famoso por su tiempo el http://www.winpic800.com//index.php?option=com_content&task=blogcategory&id=19&Itemid=88

Ahora la gente le dieron por meterse con el clone del PIckit 2, en mi caso compré un entrenador con el clone dl pickit 2 incluiso que puedes ver una análisis que le hice.

El más sencillo de toda la vida para grabar PIC es el TE20x o el TE20 SE para el PIC16F84A, 16F628A, 16F88, 16F876A, 16F886, 18F2550 y algunos más.






Su programas para grabar es el www.ic-prog.com y el www.winpic800.com con sus manuales del ic-prog y winpic800.

Antes lammoda era esa, luego se puso con el GTP-USB [ plus ] sólo un tiempo, luego la moda más moderna y aún duradera es el PicKit 2 clone que puedes ver hasta aquí.






http://sergiols.blogspot.com.es/2009/02/pickit-2-clone-reloaded.html

Un saludo.


----------



## jnatera (Mar 25, 2012)

Gracias amigo, voy a revisar todo, ayer estuve probando pero no me fululo, lo que necesitaba hacer era correr un programa en vb.net virtualmente, no habia estado en un foro le estare comentando como me va



Meta dijo:


> Mira aquí.
> http://ww1.microchip.com/downloads/...n-libraries-v2012-02-15-windows-installer.exe
> 
> http://picmania.garcia-cuervo.net/usb_0_desencadenado.php
> ...


----------



## josb86 (Mar 27, 2012)

afprog dijo:


> Hola muchachos y picmaniacos llevo varios meses experimentando con el puerto usb y los pic 18f 2550 y 18f4550 he logrago manejarlos en dos de sus formas (cdc y bulk) de transferencia estoy en busca de realizar una aplicacion   con hid en c/c++ o java.
> cualquier avance sera reportado a ustede y si tienen alguna información se la agradesco.
> si les puedo ayudar en algo con mucho gusto, ya desarrolle transferencia de paquetes (bulk) en c/c++ standart y compilado en dev-c++




hola como estas mira hece un tiempo encontre una guia para trabajar con _mpusbapi.h y mpusbapi.dll en matlab y funciono perfecto. pero el problema con matlab es que no se puede utilizar en todos partes y bueno se algo de devc++ quisiera saber si tienes algun ejemplo. lo que he visto es que en matlab cargan esta librarias y se crean unas variables. sera que si yo subo el ejemplo tu me podrias ayudar ha hacer como un paralelo entre los dos osea en matlab cargas de esta manera en devc++ lo hecs de esta otra o algo asi



otra cosa alguien me podria decir que son los endpoints?
he visto que casi siempre los colocan igual a uno, pero encontre en la capeta Microchip Solutions v2010-10-19 una aplicacion llamada "microchip usb OTG configuration tool" la cual no se para que sirve exactamente pero en la parte de CDCtiene la opcion de configurar dos endpoints


----------



## jnatera (Mar 27, 2012)

Buenas amigos, ya probe un ejemplo dcorriendo vb6 por puerto usb virtual, pero quiero utilizar visual basic.net sera que hay una libreria parecida a mcHID.dll y Inpout32.dll para visual b.net 2010 o se utiliza la misma?? gracias amigos con conocimientos en el area??


----------



## Moyano Jonathan (Mar 27, 2012)

> Buenas amigos, ya probe un ejemplo dcorriendo vb6 por puerto usb virtual, pero quiero utilizar visual basic.net sera que hay una libreria parecida a mcHID.dll y Inpout32.dll para visual b.net 2010 o se utiliza la misma?? gracias amigos con conocimientos en el area??



Si buscas en el desarrollo del hilo, hay una versión hecha para el VB.net, usando mcHID.dll. Inpout32.dll no tienen nada que ver con el puerto USB.
Tengo que aclarar que mcHID.dll no está soportada en WIN7 de 64 bits, para esto, estoy experimentando con una nueva librería que funciona tanto en 32 bits como en 64 bits.
Saludos !


----------



## jnatera (Mar 27, 2012)

Baje uno pero no me corre y utiliza las misma librerias que vb6 y me di cuenta que las mismas instrucciones? una pregunta funcionan también en asp.net??? deberia funcionar ya que es de visual estudio.


----------



## Moyano Jonathan (Mar 27, 2012)

> Baje uno pero no me corre y utiliza las misma librerias que vb6 y me di cuenta que las mismas instrucciones? una pregunta funcionan también en asp.net???


 Lamentablemente yo no puedo probar los programas que usan mcHID.dll por que tengo WIN7 de 64 bits...no tengo idea si funcionan en ASP.net.


----------



## hfaalaniz (Mar 31, 2012)

GENIAl y ESPECTacular trabajo el desarrollado hasta el momento con este hilo Jonathan, hace poco comence a seguirte tu trabajo y debo decir que aprendi muchissssimo y en verdad te lo agradezco, aprovecho la ocasion para preguntarte como conecto un sensor piezoelectrico a la placa PIC18F25550.



perdon puse un 5 de mas


----------



## Moyano Jonathan (Mar 31, 2012)

> como conecto un sensor piezoelectrico a la placa PIC18F25550.


 Es un sensor de vibraciones ?

Si es así: http://www.hmangas.com/Electronica/Datasheets/IC/MiniSense%20100%20Analog%20PCB_172.pdf
http://www.hmangas.com/Electronica/Datasheets/IC/MiniSense_100.pdf


----------



## hfaalaniz (Abr 3, 2012)

tal cual, un sensor de vibraciones, pero ninguno de los que estan alli, es decir, construirlo yo mismo desde cero, cual es la idea? detecto la vibracion con un buzzer piezoelectrico la ingreso a uno o dos,.... amplificadores operaciones, le coloco un filtro pasabajos entre 0hz y 1khz y luego otro entre 1khz y 30khz, esa señal la ingreso al PIC18F2550 utilizando 2 canales (2 sensores), luego enviandola a la pc y visualizando la señal en dos pictures uno para mostrar la señal como entra en bruto y en otra el espectro de frecuencias, tengo algo hecho, si no te molesta avisame a si te lo paso por mail.
Cordiales Saludos


----------



## Moyano Jonathan (Abr 3, 2012)

> si no te molesta avisame a si te lo paso por mail.


 En realidad no tengo tiempo para revisar tu programa...estoy con mil cosas a la vez. Lo que si te digo es que no tengo experiencia en el análisis de señales, por lo tanto lo que si te puedo llegar a ayudar es con la comunicación USB y más adelante de como obtener gráficas en visual C# mientras lees datos del USB. Igual como te digo por ahora no tengo tiempo de ponerme a analizar tu proyecto, pero creo que las pautas a seguir serían las siguientes:
- Si ya tenés el sensor y algo del programa hecho para el PIC y la PC, lo próximo es ver como discretizar las señales.
- Crear toda la comunicación por USB (Hay un manual de esto en la primera página del hilo).
- Ver como realizar las gráficas...(yo estoy analizando como ver gráficas de sensores en visual C#, pero todavía estoy en proceso de investigación).
- Integrar el análisis de la señal con el programa de comunicaciones y gráficas.

En fin espero puedas avanzar con tu proyecto.

Saludos !


----------



## khristophercm (Abr 4, 2012)

hola que tal disculpen alguno de ustedes me podria ayudar con la programaciond e un pic18f2550 por medio del compilador ccs?? la verdad es que me urge muchisimo para una tarea y hasta ahora no logro entender el compilador y la programacion en c me seria muy util si alguien pudiera apoyarme por ahora solo quiero hacer parpadear un led, espero su apoyo y respuesta se los agradecere enormemente gracias


----------



## hfaalaniz (Abr 4, 2012)

ok jonathan, en realidad lo que me escribiste ya está hecho, los sensores, el programa en visual basic la graficación de la señal, algo del pic y la comunicación usb, me faltan los filtros y comenzar a probar seriamente, me surge la idea de colocarlo en este hilo para mejorarlo y lograr hacer un producto comercial pero con licencia abierta, es decir, entre todos los mejoramos y lo pulimos, conservar la idea original del autor, pero a la vez cada uno que quiera podrá disponer del sistema gratuitamente para hacer lo que quiera, de paso logramos algo desarrollado en nuestro pais pero con una idea mas altruista y de buena calidad. posiblemente mas adelante elija utilizar visual c, por ahora y por cuestiones de tiempo el mas manejo es el visual basic 6.0, tambien me gustaría invitar a todos los de este foro/hilo a desarrollar productos competitivos y que no solamente sean de aprendizaje. 
Cordiales Saludos y gracias por contestar.


----------



## alexhumbertoa (Abr 4, 2012)

hola Moyano y demás integrantes de este foro, estoy implementando una comunicación usb cdc con un pic18f4550, como sabemos y según la librería de microchip los buffer de entrada y salida  son máximo de 64 bytes, el programa del pc con el que trato de comunicarme me envía mas de 64 bytes y se me pierden los bytes que llegan luego del numero 64. si quisiera recibir mas de 64 bytes, como debo hacer?,  ya que aun cuando vuelvo y hago lectura del puerto usb ya no se ven los últimos bytes que llegaron luego del numero 64.


----------



## Mushito (Abr 5, 2012)

hola Moyano, gracias por tu grandioso aporte al conocimiento cientifico.
99 paginas y no vi la guia en pdf (de be a bä) para empezar con los ejemplos en pic basic y easyHId, en VB60, etc. Tus promesas aun son deuda.


----------



## Moyano Jonathan (Abr 5, 2012)

> para empezar con los ejemplos en pic basic y easyHId, en VB60, etc



Nunca dije que hiba a poner una guía para pic basic y easyHID, en VB 6.0. En la primera página del hilo está un tutorial de como armar aplicaciones con Visual C# y CCS.
El manual es probable que lo termine para fin de año, pero nunca he dicho que lo voy a hacer para una fecha específica, tengo demasiadas cosas para hacer.

Saludos !


----------



## venturl (Abr 10, 2012)

Hola estoy haciendo un proyecto fin de carrera, el cual consiste en mover dos servos y ver una web cam mediante labview, con un 18f2550 y por el momento tengo la placa montada similar a esta:








Este es el programa:



> #include <18F2550.h>#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL1,CP UDIV1,VREGEN
> #use delay(clock=48000000)//frecuencia del reloj
> #include ".\libreria\usb_cdc.h"
> #rom int 0xf00000={1,2,3,4}
> ...



Igualmente he editado los archivos necesarios 




> [SourceDisksNames]
> 
> 
> [DeviceList]
> ...






> ;------------------------------------------------------------------------------
> ; String Definitions
> ;------------------------------------------------------------------------------
> 
> ...


y el picUSB_CDC.h




> 0x10,0x01, //usb version in bcd ==2,3
> 0x02, //class code. 0x02=Communication Device Class ==4
> 0x00, //subclass code ==5
> 0x00, //protocol code ==6
> ...


y




> 8, //length of string index
> USB_DESC_STRING_TYPE, //descriptor type 0x03 (STRING)
> 'C',0,
> 'D',0, // modificable
> ...



Esto es lo que ocurre
La compilación no da ningun error, la programacion es correcta.
A partir de este momento debería iniciarse el administrador de dispositivos cada vez que conectemos el pic a cualquier ordenador, sin embargo no ocurre.

Muchas Gracias, *estoy desesperado.*


----------



## Mushito (Abr 10, 2012)

Hola, estoy preparando mi proyecto de grado y en el diseño necesito trabajar con comunicación serial a 9600 baudios,N,8,1, etc. Emulando el puerto serial por USB (CDC) con el pic 18F2550. Buscando en la WEB, encontré a http://www.muchotrasto.com/EmulacionCDCRS-232USB.phpEl problema es que no puedo modificar nada de su firmware, necesito bajar su velocidad de 19200 a 9600 baudios, tengo el CCScompiler 4,104. Cada vez que intento cambiarle algo, el driver ya no instala.Por favor ayúdenme.


----------



## ospidera (Abr 12, 2012)

Buena tarde para todos, bueno aquí ya es tarde, soy nuvo preguntando en el foro (ya habia visto muchos aportes interesantes), tengo una pregunta que la verdad no se si el el hilo para hacerla y adicionalmente por tiempo no he podido chekar mas el foro, entiendo bastantes coas de la comunicación usb para pic pero me falta lo mas importante, quiero hacer la comunicación virtual para visualizar en proteus pero me encuentro con un problema del driver, he tratado de buscar en la web y la verdad enuentro muchas cosas hechas pero quiero entenderla.

1°) como hago para el driver?? tengo que hacerlo??
2°) hay que modificar los descriptos y he probado varias versiones de CCS y la verdad hay variaciones y no se en donde modificarlo ¡¿que gano l modificarlo? y donde encuentro la lista de los códigos por fabricante??
3°)hablan de muchas cosas como por ejemplo un archivo .inf para que sirve???

La verdad quiero entender muy bien esto pero requiero de su ayuda.


----------



## Mushito (Abr 13, 2012)

Revisa esta pagina tal ves te ayude
http://protonbasic.wordpress.com/usb/usb-hid/


----------



## Moyano Jonathan (Abr 13, 2012)

Muchas gracias Mushito por el enlace, excelente aporte.



> 1°) como hago para el driver?? tengo que hacerlo??
> 2°) hay que modificar los descriptos y he probado varias versiones de CCS y la verdad hay variaciones y no se en donde modificarlo ¡¿que gano l modificarlo? y donde encuentro la lista de los códigos por fabricante??
> 3°)hablan de muchas cosas como por ejemplo un archivo .inf para que sirve???
> 
> La verdad quiero entender muy bien esto pero requiero de su ayuda





> pero me encuentro con un problema del driver, he tratado de buscar en la web y la verdad enuentro muchas cosas hechas pero quiero entenderla.



El driver depende del modo de comunicación que uses. Vos no especificas nada del protocolo que estás usando. 



> 1°) como hago para el driver?? tengo que hacerlo??


 Por lo general el driver está hecho para la mayoría de las aplicaciones...ahora si tu dispositivo es muy específico..quizás necesites un driver personalizado...pero no creo que sea el caso.



> hay que modificar los descriptos y he probado varias versiones de CCS y la verdad hay variaciones y no se en donde modificarlo ¡¿que gano l modificarlo? y donde encuentro la lista de los códigos por fabricante??



Tenés que seguir los códigos de ejemplo de CCS que vienen en la carpeta examples. Ahora si querés entender a fondo...cuestión de que te pongas con el driver USB para PIC18F que te da el fabricante de CCS y la hoja de datos del PIC18F2550...para poder entender cada función...



> hablan de muchas cosas como por ejemplo un archivo .inf para que sirve



El archivo .inf es el driver para la PC. Es lo que te pide al conectar el dispositivo USB.



> Hola, estoy preparando mi proyecto de grado y en el diseño necesito trabajar con comunicación serial a 9600 baudios,N,8,1, etc. Emulando el puerto serial por USB (CDC) con el pic 18F2550. Buscando en la WEB, encontré a http://www.muchotrasto.com/EmulacionCDCRS-232USB.php
> El problema es que no puedo modificar nada de su firmware, necesito bajar su velocidad de 19200 a 9600 baudios, tengo el CCScompiler 4,104. Cada vez que intento cambiarle algo, el driver ya no instala.
> Por favor ayúdenme.



Si lees desde la primer página del hilo, te vas a dar cuenta de lo que necesitas.


----------



## Mushito (Abr 13, 2012)

Gracias Moyano, pero ya he intentado modificar los archivos de descarga modificando el descriptor, hasta ahi todo ok, pero cuando recompilo el programa en C modificando el baud rate, recompila todo, pero cuando lo conecto a mi maquina e instalo del driver ya no lo reconoce al pic. Porfavor podrias intentar y subir el los archivos para un baud rate de 9600 bps.
Gracias nuevamente


----------



## martinillou (Abr 16, 2012)

Hola me gustaría hacer algo parecido a lo tuyo, tengo una UVkit con un pic18f2550 y tengo este programa:


```
/********************************************************************
Ejemplo. Conversión A/D. Sin interrupciones. Consulta de estado.
Realizar un programa para el UVkit muestree la tensión en el potenciometro
conectado a la entrada AN2 y muestre el valor del mismo en la barra de leds 
usando 8 bits (se ajustará el conversor para utilizar los bits de mayor peso) 
y que avise cuando el valor de éste sea superior a 134 activando el bit de alarma
que corresponderá con el bit RC2. 
Recordar que el reloj del sistema es de 48Mhz y que utilizaremos el 
reloj interno de 1 MHz del conversor A/D.
********************************************************************/

#include <delays.h>
#include <p18f2550.h>


	//These are your actual interrupt handling routines.
	#pragma interrupt YourHighPriorityISRCode
	void YourHighPriorityISRCode()
	{

	}	//This return will be a "retfie fast", since this is in a #pragma interrupt section 
	#pragma interruptlow YourLowPriorityISRCode
	void YourLowPriorityISRCode()
	{
	}	//This return will be a "retfie", since this is in a #pragma interruptlow section

/** VECTOR REMAPPING ***********************************************/
	#define REMAPPED_RESET_VECTOR_ADDRESS			0x1000
	#define REMAPPED_HIGH_INTERRUPT_VECTOR_ADDRESS	0x1008
	#define REMAPPED_LOW_INTERRUPT_VECTOR_ADDRESS	0x1018

	
	extern void _startup (void);        // See c018i.c in your C18 compiler dir
	#pragma code REMAPPED_RESET_VECTOR = REMAPPED_RESET_VECTOR_ADDRESS
	void _reset (void)
	{
	    _asm goto _startup _endasm
	}

	#pragma code REMAPPED_HIGH_INTERRUPT_VECTOR = REMAPPED_HIGH_INTERRUPT_VECTOR_ADDRESS
	void Remapped_High_ISR (void)
	{
	     _asm goto YourHighPriorityISRCode _endasm
	}
	#pragma code REMAPPED_LOW_INTERRUPT_VECTOR = REMAPPED_LOW_INTERRUPT_VECTOR_ADDRESS
	void Remapped_Low_ISR (void)
	{
	     _asm goto YourLowPriorityISRCode _endasm
	}

#pragma udata

volatile unsigned char valor, Umbral; 


void leds(unsigned char c); // Declaración de procedimiento

#pragma code

void main()
{
    Umbral= 134;
	valor=0;
	ADCON0=0b0001001;		// Enciende A/D ADON=1 y selecciona el canal 2
	ADCON1=0x0A;		// Todos los bits de A son analógicos y los de B digitales
	ADCON2=0b00100011;	// ADFM=0; justificación izquierda
						// ACQT2:ACQT0=100 => 8TAD	tiempo de adquisicion (8 us)
						// ADCS2:ADS0=011  => TAD= Trc (1/1Mhz)= 1 us
	TRISA|=0x0F;		// Porta A(3:0) de entrada y resto de salida
    TRISCbits.TRISC2=0; // RC2 de salida
 	while (1)
 	{
		ADCON0bits.GO_DONE=1;		//Inicio
		while (ADCON0bits.GO_DONE); //Consulta de estado 
		valor=ADRESH;				//Lectura del valor descargado
		if (valor > Umbral) PORTCbits.RC2=1; else PORTCbits.RC2=0; // Alarma
		leds(valor);				// Visualización
	}
	

}//end main
/*Procedimiento de visualización en la barra de LEDs*/
void leds(unsigned char c)
 {
  ADCON1=0x0f; 
  TRISA&=0b11001111;
  TRISB&=0b11000011;
  TRISC&=0b11111000;
  PORTAbits.RA4= (c&0b00000001)?1:0;
  PORTAbits.RA5= (c&0b00000010)?1:0;
  PORTBbits.RB2= (c&0b00000100)?1:0;
  PORTBbits.RB3= (c&0b00001000)?1:0;
  PORTBbits.RB4= (c&0b00010000)?1:0;
  PORTBbits.RB5= (c&0b00100000)?1:0;
  PORTCbits.RC0= (c&0b01000000)?1:0;
  PORTCbits.RC1= (c&0b10000000)?1:0;
 }

/**********************************************
Ejercicios: 
Ejercicio 1 (dificultad: media): Modificar el programa para que utilice interrupciones 
en vez de consulta de estado.
Ejercicio 2 (dificultat: media): Modificar el programa para que utilice el sensor de temperatura
 y que el bit de alarma se active cuando la temperatura supere los 30 ºC. Utilizar consulta de 
estado.
Los grupos pares haran el Ej.1 y los impares el Ej.2
Finalmente combinar las dos parte para que cimplan las dos condiciones.

***********************************************/
```

Los ejercicios y lo que dice el ejercicio me da lo mismo. Teniendo esto me gustaría saber que es lo que debo de hacer para poder utilizar el sensor de temperatura y mandar la información a través de un R232 a un terminal del putty y que me aparezca en él, los datos que recoje el sensor de temperatura. ¿Cómo puedo hacer esto? ¿Qué debo añadir a este programa?

Muchas gracias de antemano!


----------



## Meta (Abr 16, 2012)

Hola:

Por curiosidad, para eso la parte del código usas Swicth, ¿no?

```
/*Procedimiento de visualización en la barra de LEDs*/ void leds(unsigned char c)  {   ADCON1=0x0f;    TRISA&=0b11001111;   TRISB&=0b11000011;   TRISC&=0b11111000;   PORTAbits.RA4= (c&0b00000001)?1:0;   PORTAbits.RA5= (c&0b00000010)?1:0;   PORTBbits.RB2= (c&0b00000100)?1:0;   PORTBbits.RB3= (c&0b00001000)?1:0;   PORTBbits.RB4= (c&0b00010000)?1:0;   PORTBbits.RB5= (c&0b00100000)?1:0;   PORTCbits.RC0= (c&0b01000000)?1:0;   PORTCbits.RC1= (c&0b10000000)?1:0;  }
```


----------



## martinillou (Abr 16, 2012)

no te entiendo, ¿dices que tengo que utilizar un switch?? o me preguntas si habria que poner un switch? si el lo primero avisame y lo intento, si es lo segundo: no tengo ni idea!


----------



## Meta (Abr 16, 2012)

Te lo pregunto, ejjejee.


----------



## venturl (Abr 17, 2012)

Al instalar el driver me da este error...





Alguna idea?

Y un par de dudas:
1.- que valor de BaudRate usais?
En usb:cdc.h
void usb_cdc_init(void) { 
usb_cdc_line_coding.dwDTERrate=19200; //BaudRate que vamos a usar 
usb_cdc_line_coding.bCharFormat=0;
usb_cdc_line_coding.bParityType=0;
usb_cdc_line_coding.bDataBits=8;

2 el final nuestro es 0001 en mchpcdc.inf
[DeviceList] 
%DESCRIPTION%=DriverInstall, USB\VID_04D8&PID_000*A*
ó
%DESCRIPTION%=DriverInstall, USB\VID_04D8&PID_000*1*


----------



## BeToR (Abr 17, 2012)

Disculpen si me salgo un poco del tema, pero hay alguien que me pueda orientar sobre como enviar un numero entero mayor de  255 por USART de MikroC, estoy haciendo una trasmision PIC a PIC con un  16f877a y un 18f4620. Lo que busco es enviar un numero de 16bits por Tx y  que lo reciba en Rx, se que hay forma de enviarlo en dos Bytes de 8bits  y unirlos despues en el pic receptor para formar nuevamente el numero  de 16bits.

El plan original era enviar el dato por USART a un PIC18F4550 para despues comunicarlo por USB a una PC, pero presente problemas con la transmision, solo recibia el numero 254 y el 255 siempre sin importar el numero que enviara, cambie el mismo programa al 18f4620 y no tuvo ningu problema, segun yo solo es una mala configuracion de los fuses del f4550. Pero ya despues me encargo de buscar la forma de solucionar eso, de momento ya tengo comunicacion con el 16f877a y el 18f4620 pero quiero enviar un numero mayor de 255.

Alguien lo ha realizado en MikroC o algun otro compilador de C, o sabe las bases para conseguir los dos grupos de 8 bits?  y cual seria el metodo para volver a unirlos en el PIC receptor?

Gracias


----------



## hfaalaniz (Abr 18, 2012)

Jona, Meta, estoy un poco confundido con el 18F2550, es decir, quiero leer 4 entradas analógicas simultáneamente con una resolución de 10 bits a la máxima velocidad de operación del pic, el problema es que analizé todos los ejemplos, pero como en C todavía no estoy empapado me cuesta algo, en VB6 no tengo problemas, si pueden orientarme en algo les voy a agradecer, todo a traves del USB.

Respecto del conector ICSP, ya hice la placa y momentaneamente quedará así hasta que termine esta parte por la cual le hago las consultas.

Cordiales Saludos.



Como para que vayan mirando algo les paso unas capturas del software balanceador, por ahora probado enviando y leyendo señales ingresadas y leidas por la tarjeta de sonido.

Cordiales Saludos


----------



## dinoelectro (Abr 20, 2012)

se trata de un frecuencimetro.. esta funcionando perfecto utilizando la clase CDC... lo que quiero es pasarlo para que funcione con HID..

el lenguaje de programacion que uilice es CCS... el cristal del microcontrolador es de 20MHz y la senal de frecuencia entra por pin RC0...

gracias de antemano amigos foreros


----------



## mariacontenis (Abr 21, 2012)

Como puedo hacer un Tacometro con el 18F4550 trabajando a 48Mhz. No he encontrado la manera de hacerlo ya que no puedo configurarbien el timer1 para contar un segundo exacto como base de tiempo. AYYYUUUUDAAAAA!!!!


----------



## albermillan69 (Abr 21, 2012)

mariacontenis dijo:


> Como puedo hacer un Tacometro con el 18F4550 trabajando a 48Mhz. No he encontrado la manera de hacerlo ya que no puedo configurarbien el timer1 para contar un segundo exacto como base de tiempo. AYYYUUUUDAAAAA!!!!



Utiliza una fraccion de segundo y luego multiplicas los pulsos contados o acumulados por la cantidad necesaria para que te de RPS y luego por 60 para q te de RPM y listo.... No necesariamente debe ser un segundo, ademas los saltos de unidades cada segundo serian muy bruscos, por lo tanto se verian feos a la vista.... Espero haberte ayudado.... Saludos desde VENEZUELA...


----------



## Moyano Jonathan (Abr 21, 2012)

Voy a responder por partes:



> Como puedo hacer un Tacometro con el 18F4550 trabajando a 48Mhz. No he encontrado la manera de hacerlo ya que no puedo configurarbien el timer1 para contar un segundo exacto como base de tiempo. AYYYUUUUDAAAAA!!!!



No es el hilo correcto para preguntar eso. El mismo trata solamente sobre el puerto USB y los problemas que surgen con los desarrollos relacionados.



> se trata de un frecuencimetro.. esta funcionando perfecto utilizando la clase CDC... lo que quiero es pasarlo para que funcione con HID..
> 
> el lenguaje de programacion que uilice es CCS... el cristal del microcontrolador es de 20MHz y la senal de frecuencia entra por pin RC0...
> 
> gracias de antemano amigos foreros



Que problemas específicos tenés al tratar con HID ? Para saber la estructura del programa para realizar una comunicación mediante HID, está el manual que puse en la primer página del foro.



> Jona, Meta, estoy un poco confundido con el 18F2550, es decir, quiero leer 4 entradas analógicas simultáneamente con una resolución de 10 bits a la máxima velocidad de operación del pic, el problema es que analizé todos los ejemplos, pero como en C todavía no estoy empapado me cuesta algo, en VB6 no tengo problemas, si pueden orientarme en algo les voy a agradecer, todo a traves del USB.
> 
> Respecto del conector ICSP, ya hice la placa y momentaneamente quedará así hasta que termine esta parte por la cual le hago las consultas.
> 
> Cordiales Saludos.



Al no tener experiencia en lenguaje C, la verdad no te recomiendo que encares de una el tema de USB...hay que hacer algunos proyectos en C, antes de ponerse a tono.



> Disculpen si me salgo un poco del tema, pero hay alguien que me pueda orientar sobre como enviar un numero entero mayor de 255 por USART de MikroC, estoy haciendo una trasmision PIC a PIC con un 16f877a y un 18f4620. Lo que busco es enviar un numero de 16bits por Tx y que lo reciba en Rx, se que hay forma de enviarlo en dos Bytes de 8bits y unirlos despues en el pic receptor para formar nuevamente el numero de 16bits.
> 
> El plan original era enviar el dato por USART a un PIC18F4550 para despues comunicarlo por USB a una PC, pero presente problemas con la transmision, solo recibia el numero 254 y el 255 siempre sin importar el numero que enviara, cambie el mismo programa al 18f4620 y no tuvo ningu problema, segun yo solo es una mala configuracion de los fuses del f4550. Pero ya despues me encargo de buscar la forma de solucionar eso, de momento ya tengo comunicacion con el 16f877a y el 18f4620 pero quiero enviar un numero mayor de 255.
> 
> ...



Lo que vos planteas es un problema de programación. En el hilo no se manejan las comunicaciones usando MikroC, sinó CCS. 
Como al parecer no has podido hacerlo con el puerto serie...te recomiendo que investigues del tema, soluciones la comunicación serie con la PC y luego te embarques al USB.
Una de las primeras vías por la cuál podrías investigar es la guía de aplicaciones con MikroC que viene en la ayuda del compilador. Ahí viene explicado como hacer las conexiones y un programa de ejemplo que podés modificar a tus necesidades, sinó, meterte en los foros de MikroElectrónica y ver como podés solucionar tu problema.


----------



## dinoelectro (Abr 22, 2012)

hola moyano... el problema es que el valor de la frecuencia que envia al microcontrolador hasta el PC es un numero de 32 bits.. pero utilizando HID solo puedo enviar datos de 8 bits

gracias moyano por interesarte.. saludos cordiales.

PD; para hacer este frecuencimetro me base en el ejemplo FREQC que viene con CCS


----------



## Moyano Jonathan (Abr 22, 2012)

Si querés enviar los datos de 32 bits por HID podés dividir el dato entre 4 y luego en la aplicación de la PC los volvés a unir. OJO..siempre y cuando sea un entero de 32 bits.


----------



## hfaalaniz (Abr 22, 2012)

OK jona, seguir estudiando es la única opción, volveré al principio del hilo, en cuanto tenga alguna duda te consulto y lo que descubra lo agrego al hilo.
Cordiales Saludos
HFA



en principio el puerto paralelo fue la opcion y la que manejo, pero encontre algunos problemas en la conmutación del puerto lo cual hizo que me decidiera pasar a USB, aunque no funcionaba mal.


----------



## Moyano Jonathan (Abr 22, 2012)

> en principio el puerto paralelo fue la opcion y la que manejo, pero encontre algunos problemas en la conmutación del puerto lo cual hizo que me decidiera pasar a USB, aunque no funcionaba mal.



Entiendo, lo que pasa es que no es como pasarte de un tipo de puerto al otro...el USB es todo un mundo totalmente diferente al puerto paralelo.
Saludos !


----------



## venturl (Abr 23, 2012)

Finalmente solucione los problemas con el driver y la placa funciona correctamente.

Tengo este codigo metido en el pic:

#include <18F2550.h>
#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL1,CPUDIV1,VREGEN
#use delay(clock=48000000)
#include ".\libreria\usb_cdc.h"
#rom int 0xf00000={1,2,3,4}
#define led PIN_A0
void main() {
   int8 x;
   set_tris_b(0x0);
   output_b(0);
   usb_cdc_init();
   usb_init(); 

     while(!usb_cdc_connected()) {} 
		 do{usb_task();
		    if (usb_enumerated()){ 
            if(usb_cdc_kbhit()){
                x=usb_cdc_getc();
                output_b(x);
				output_high(led);

              }
             }
       }while (TRUE); // bucle infinito.
       //// jokelnice_cdc_enviar
}


Mediante labview tengo un .vi con unos simples pulsadores de dirección (arriba, abajo...) y por el puerto B sale 0000 0000 sin embargo, al arrancar el labview (run) la combinacion por el puerto B continuamente es (0110 1101) incluso sin haber pulsado nada (tan solo iniciando el labview y RUN). Y no cambia sea cual sea lo que pulsemos.

P.D. el led se enciende al hacer run en el labview.


----------



## piposon (Abr 23, 2012)

Saludos Moyano Jonathan;

Soy nuevo en este foro y estoy tratando de aprender C# + USB HID + PIC. Este tema tiene más de 100 páginas y tomó una semana para leer todo. En primer lugar quiero darle las gracias por su esfuerzo y ejemplos publicados. Ellos son muy buenos y he aprendido de ellos. Ahora puedo enviar bytes al PIC y ver ellos en una pantalla LCD, pero no puedo ver el byte enviado por él para la pantalla del ordenador.

Yo estoy tratando de hacer la comunicación con PIC + USB HID desde su modelo, pero estoy teniendo dificultades para enviar y recibir 'strings' o 'arrays'. Envío de una imagen del programa que estoy trabajando y un archivo rar, que es la modificación de su modelo. Si usted puede pasar el tiempo que muestra cómo debe ser el código para enviar y recibir 'strings' o 'arrays'. Muchas gracias de antemano.

Pido disculpas por lo que escribo porque he usado Google Translator. Sé que tiene errores en la escritura. No puedo escribir en español, pero he leído poco a poco.

Saludos a todos!


----------



## dinoelectro (Abr 23, 2012)

Moyano Jonathan dijo:


> Si querés enviar los datos de 32 bits por HID podés dividir el dato entre 4 y luego en la aplicación de la PC los volvés a unir. OJO..siempre y cuando sea un entero de 32 bits.



bueno esa seria una de las soluciones...  pero ya lo solucione; lo que hice fue convertir el numero en un "string" luego envio al PC

garacis moyano por tu interes!!!


----------



## hfaalaniz (Abr 23, 2012)

Ok Jona, recién termino de construir tu placa USB Trainer, en la pág. 51 de tu manual, ante último párrafo, escribes que el conector ICSP es solo para ser usado con el PicKit2, pero he cotejado los pines del PicKit3 y tienen la misma disposición, es decir, vale lo mismo para los dos, es correcto? mi otra pregunta es respecto del conector ICSP en si, porque es de doble hilera de pines?

Por último, si, tienes razón, son dos mundos diferentes y actualmente estoy en el medio.

leyendo un poco lo de dinoelectro, porque se debe convertir a un String?, siendo esta una variable de cadena consume mas memoria que un Integer

Cordiales Saludos
HFA


----------



## hfaalaniz (Abr 23, 2012)

Jona, no encuentro la versión 4.114 de CCS, tengo la versión 3.249 y la 4.57, con cual me quedo para que sea mas compatible con la que tu usaste.

Cordiales Saludos
HFA


----------



## ospidera (Abr 24, 2012)

Mushito dijo:


> Revisa esta pagina tal ves te ayude
> http://protonbasic.wordpress.com/usb/usb-hid/



Bueno Moyano y Mushito, muchas gracias por su tiempo y aportes, pues la verdad lamento no haber sido mas concreto con mi aplicación. Es que hasta ahora estaba trabajando con esto y pues cuando uno arranca siempre tiene un universo que va conociendo poco a poco, efectivamente quiero aprender esto de pelos, y estoy lea que lea sobre toda esta aplicacion, ahí he aprendido algunas cosas, la verdad no habia podido ingresar antes pues estaba ocupado con otras cosas pero en este momento voy a retomar lo de USB

Cualquier cosa los seguiré molestando


----------



## piposon (Abr 24, 2012)

dinoelectro dijo:


> bueno esa seria una de las soluciones...  pero ya lo solucione; lo que hice fue convertir el numero en un "string" luego envio al PC
> 
> garacis moyano por tu interes!!!




Hola dinoelectro,
ya que este es el mismo tema, que podría enseñarme cómo almacenar una cadena y enviarlo al microcontrolador? Esto es lo que estoy tratando de hacer y no tengo éxito.
Gracias por su atención, saludos!


----------



## venturl (Abr 26, 2012)

Hola, hago una simulación con el ordenador (sin conectar el pic ni nada) que me han asignado para el proyecto y me da este error:







Sin embargo en el ordenador del profesor no hay ningun problema, que puede estar fallando? el paquete de visa???

P.D. esta la orden de atras pulsada, pero falla tmb sin ella.


----------



## Moyano Jonathan (Abr 26, 2012)

> Ok Jona, recién termino de construir tu placa USB Trainer, en la pág. 51 de tu manual, ante último párrafo, escribes que el conector ICSP es solo para ser usado con el PicKit2, pero he cotejado los pines del PicKit3 y tienen la misma disposición, es decir, vale lo mismo para los dos, es correcto? mi otra pregunta es respecto del conector ICSP en si, porque es de doble hilera de pines?



Si es correcto podés usarlo con el pickit2 o el pickit3. Lo de la doble hilera de pines vas a tener que hacer un pequeño adaptador...pero es cuestión de ver como están dispuestos los pines. No tiene mucha complicación.



> leyendo un poco lo de dinoelectro, porque se debe convertir a un String?, siendo esta una variable de cadena consume mas memoria que un Integer



No siempre es necesario...depende de la aplicación en particular.



> Jona, no encuentro la versión 4.114 de CCS, tengo la versión 3.249 y la 4.57, con cual me quedo para que sea mas compatible con la que tu usaste.
> 
> Cordiales Saludos
> HFA



la 4.57 es la más nueva...pero te recomiendo que te consigas una versión más nueva...el tutorial que hice lo planteé con el 4.114, por lo que vas a tener que hacer algunas modificaciones. Te vas a tener que poner a investigar en los ejemplos de CCS los cambios que te digo.



> Hola dinoelectro,
> ya que este es el mismo tema, que podría enseñarme cómo almacenar una cadena y enviarlo al microcontrolador? Esto es lo que estoy tratando de hacer y no tengo éxito.
> Gracias por su atención, saludos!



En las últimas versiones de CCS se ha incluido en las librerías la posibilidad de enviar paquetes tipo string por USB. Es cuestión de que leas la documentación que te da el fabricante para poder implementar la función en tu proyecto.


----------



## hfaalaniz (Abr 26, 2012)

Hpola Jona, conecte el usb trainer y... Dispositivo Desconocido, te comento, a la aplicación del pic no le modifique nada, es mas, utilizé el .exe y .hex que tu compilaste justamente, encontré que hay diferencias entre los valores de algunos capas que figuran en el esquemático pero que en la serigrafía del lado componentes figuran otros, grabé la aplicación del pic con el pickit3, la verifiqué, desconecte todo, volví a conectar usb trainer al programador he hice una lectura de lo grabado en el pic, aparentemente estaría todo bien, que podrá ser? o algo me está faltando en este nuevo mundo.

Cordiales Saludos
HFA


----------



## Moyano Jonathan (Abr 26, 2012)

Si cargaste el mismo ejemplo que probé yo el problema está en el hardware. Acabo de revisar mi entrenador y hay un error en el esquemático, pero el PCB está bien.
Si vos mismo diseñaste una placa según el esquemático, los pines D+ Y D- están al revés. Ahora si usaste mi PCB, tiene que estar bien.

Si usaste mi PCB:
- Revisar todas las soldaduras y el montaje en general.
- Los capacitores importante son los del cristal que tienen que ser de 22pf y el de Vusb que tiene que ser de 470nF para arriba.

Por lo demás no entiendo por que te puede estar fallando.

Saludos !


----------



## venturl (May 1, 2012)

venturl dijo:


> Finalmente solucione los problemas con el driver y la placa funciona correctamente.
> 
> Tengo este codigo metido en el pic:
> 
> ...




He hecho una simulacion del .vi y los datos que envia por el puerto B son los correctos, sin embargo los puertos que leo en el puerto B con el multimetro no lo son, y siguen siendo 0110 1101. ¿Podria ser que muestre la direccion de la memoria en lugar de lo que hay en ella?


Estoy desesperado, necesito solucionar este problema o mi proyecto de fin de carrera se vera comprometido y con ello mi graduacion. El profesor no nos está ayudando...

*MUCHAS GRACIAS*


----------



## Kyle (May 2, 2012)

Hola a todo el mundo, es increible la capacidad de asimilacion de conceptos que teneis.
Primero dar las gracias a Moyano por los ejercicios y el manual, he sacado algunas cosas en limpio de la enorme cantidad de informacion que hay en este hilo, pero hay cosas que se me escapan que estoy seguro que son superfaciles, pero no logro dar con la tecla para hacerlas funcionar.

Estoy tratando de hacerme un joystick USB con un 18f2550 y que windows lo reconozca como tal y me aparezca como dispositivo de juego.
Esta parte la he conseguido modificando el ejemplo del raton HID que viene con el compilador CCS.
Lo que hago es que con el programa HID Descriptor Tool, abro el ejemplo que trae para joystick y este descriptor es el que uso para la base de mi joystick.

Este joy de ejemplo trae un eje acelerador, analogico, unos ejes X e Y, analogicos, 4 botones y un HAT switch, que basicamente son otros cuatro botones.

Con esta configuracion he conseguido hacer el input analogico del eje acelerador, activando el conversor analogico/digital del pic en el pin AN0 y poniendo este pin como entrada.

Conseguido esto y cuando ya creia que tenia todo mas o menos encaminado, me he atascado completamente, ya que si eleminos elementos del descritor, como por ejemplo el HAT switch, el dispositivo deja de funcionar y la entrada del pin AN0 deja de realizarse correctamente, no recive señal por esta patilla.
Esto me deja bastate limitado, ya que yo lo que quiero es hacer un joy con 4 ejes y ningun boton, por lo menos por ahora.
Tambien he intentado crear mi propio descriptor desde cero con el HID Descriptor Tool, de forma que tenga un eje acelerador, otro freno, otro embrague y otro wheel, pero lo mas que he coseguido es que aparezcan solo los elementos acelerador y freno en las propiedades del dispositivo y ninguno de los dos acepta entradas, no se por que.

Creo que el problema que tengo es en la variacion del tamaño del descriptor, pero no veo mas alla.

Lo tengo montado en una placa de prototipado y no uso programas de simulacion, cada vez que modifico algo, lo compilo, lo grabo en el pic y lo pruebo.

Creo que en este foro encontre las instrucciones para que en el administrador de dispositovos aparezcan los que no estan conectados y cada ver que desenchufo mi dispositivo lo elimino de la lista para que no interfiera en las pruebas, cosa que me paso al pricipio.

Aqui les dejo el codigo que voy probando y que no consigo evolucionar

Joy.c
*


		Código:
	

  #include <18F2550.h>
  #DEVICE ADC=10
  //~~~ 20MHZ OSCILLATOR CONFIGS ~~~//
  //// FULL SPEED
  #fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN
  #use delay(clock=48000000)

#DEFINE USB_HID_DEVICE  TRUE  //Tells the CCS PIC USB firmware
                              //to include HID handling code.

//turn on EP1 for IN interrupt transfers.  (IN = PIC -> PC)
#define USB_EP1_TX_ENABLE  USB_ENABLE_INTERRUPT
#define USB_EP1_TX_SIZE 8     //max packet size of this endpoint

#include <pic18_usb.h>   //Microchip PIC18Fxx5x hardware layer for usb.c
#include <usb_desc.h>    //USB Config and Device descriptors for this USB device
#include <usb.c>        //handles usb setup tokens and get descriptor reports


/////////////////////////////////////////////////////////////////////////////
//
// usb_debug_task()
//
// When called periodically, displays debugging information over serial
// to display enumeration and connection states.  Also lights LED2 and LED3
// based upon enumeration and connection status.
//
/////////////////////////////////////////////////////////////////////////////
void usb_debug_task(void) 
{
   static int8 last_connected;
   static int8 last_enumerated;
   int8 new_connected;
   int8 new_enumerated;

   new_connected=usb_attached();
   new_enumerated=usb_enumerated();


   last_connected=new_connected;
   last_enumerated=new_enumerated;
}

void main(void) 
{

   int8 out_data[4];


   set_tris_a(0b000001);  //Configuro el pin AN0 del puerto A como entrada
   set_tris_b (0b00000000); 
   set_tris_c (0b00000000); 

   SETUP_ADC(ADC_CLOCK_DIV_64 || VSS_VREF);
   SETUP_ADC_PORTS(AN0);
   usb_init_cs();

   while (TRUE) 
   {
      usb_task();
      usb_debug_task();
      if (usb_enumerated()) 
      {
         SET_ADC_CHANNEL(PIN_A0);
         out_data[0]=read_adc();
         out_data[1]=0x00000000;
         out_data[2]=0x00000000;
         out_data[3]=0x00000000;
         usb_put_packet(1,out_data,4,USB_DTS_TOGGLE);
       }
   }
}

*
usb_desc.h
*


		Código:
	

#IFNDEF __USB_DESCRIPTORS__
#DEFINE __USB_DESCRIPTORS__

///////// config options, although it's best to leave alone for this demo /////
#define  USB_CONFIG_PID       0x0022
#define  USB_CONFIG_VID       0x0461
#define  USB_CONFIG_BUS_POWER 100   //100mA  (range is 0..500)
#define  USB_CONFIG_VERSION   0x0200      //01.00  //range is 00.00 to 99.99
//////// end config ///////////////////////////////////////////////////////////



#DEFINE USB_HID_DEVICE  TRUE  //Tells the CCS PIC USB firmware
                              //to include HID handling code.

//turn on EP1 for IN interrupt transfers.  (IN = PIC -> PC)
#define USB_EP1_TX_ENABLE  USB_ENABLE_INTERRUPT 

#define USB_EP1_TX_SIZE 8     //max packet size of this endpoint

#include <usb.h>

   //////////////////////////////////////////////////////////////////
   ///
   ///  HID Report.  Tells HID driver how to handle and deal with
   ///  received data.  HID Reports can be extremely complex,
   ///  see HID specifcation for help on writing your own.
   ///
   ///  This examples configures HID driver to take received data
   ///  as mouse x, y and button data.
   ///
   //////////////////////////////////////////////////////////////////

   const char USB_CLASS_SPECIFIC_DESC[] = 
   {
      0x05, 0x01,                    // USAGE_PAGE (Generic Desktop)
      0x15, 0x00,                    // LOGICAL_MINIMUM (0)
      0x09, 0x04,                    // USAGE (Joystick)
      0xa1, 0x01,                    // COLLECTION (Application)
      0x05, 0x02,                    //   USAGE_PAGE (Simulation Controls)
      0x09, 0xbb,                    //   USAGE (Throttle)
      0x15, 0x00,                    //   LOGICAL_MINIMUM (0)
      0x26, 0xff, 0x00,                    //   LOGICAL_MAXIMUM (255)
      0x75, 0x08,                    //   REPORT_SIZE (10)
      0x95, 0x01,                    //   REPORT_COUNT (1)
      0x81, 0x02,                    //   INPUT (Data,Var,Abs)
      0x05, 0x01,                    //   USAGE_PAGE (Generic Desktop)
      0x09, 0x01,                    //   USAGE (Pointer)
      0xa1, 0x00,                    //   COLLECTION (Physical)
      0x09, 0x30,                    //     USAGE (X)
      0x09, 0x31,                    //     USAGE (Y)
      0x95, 0x02,                    //     REPORT_COUNT (2)
      0x81, 0x02,                    //     INPUT (Data,Var,Abs)
      0xc0,                          //   END_COLLECTION
      0x09, 0x39,                    //   USAGE (Hat switch)
      0x15, 0x00,                    //   LOGICAL_MINIMUM (0)
      0x25, 0x03,                    //   LOGICAL_MAXIMUM (3)
      0x35, 0x00,                    //   PHYSICAL_MINIMUM (0)
      0x46, 0x0e, 0x01,              //   PHYSICAL_MAXIMUM (270)
      0x65, 0x14,                    //   UNIT (Eng Rot:Angular Pos)
      0x75, 0x04,                    //   REPORT_SIZE (4)
      0x95, 0x01,                    //   REPORT_COUNT (1)
      0x81, 0x02,                    //   INPUT (Data,Var,Abs)
      0x05, 0x09,                    //   USAGE_PAGE (Button)
      0x19, 0x01,                    //   USAGE_MINIMUM (Button 1)
      0x29, 0x04,                    //   USAGE_MAXIMUM (Button 4)
      0x15, 0x00,                    //   LOGICAL_MINIMUM (0)
      0x25, 0x01,                    //   LOGICAL_MAXIMUM (1)
      0x75, 0x01,                    //   REPORT_SIZE (1)
      0x95, 0x04,                    //   REPORT_COUNT (4)
      0x55, 0x00,                    //   UNIT_EXPONENT (0)
      0x65, 0x00,                    //   UNIT (None)
      0x81, 0x02,                    //   INPUT (Data,Var,Abs)
      0xc0                           // END_COLLECTION 
    };

   //if a class has an extra descriptor not part of the config descriptor,
   // this lookup table defines where to look for it in the const
   // USB_CLASS_SPECIFIC_DESC[] array.
   //first element is the config number (if your device has more than one config)
   //second element is which interface number
   //set element to 0xFFFF if this config/interface combo doesn't exist
   const int16 USB_CLASS_SPECIFIC_DESC_LOOKUP[USB_NUM_CONFIGURATIONS][1] =
   {
   //config 1
      //interface 0
         0
   };

   //if a class has an extra descriptor not part of the config descriptor,
   // this lookup table defines the size of that descriptor.
   //first element is the config number (if your device has more than one config)
   //second element is which interface number
   //set element to 0xFFFF if this config/interface combo doesn't exist
   const int16 USB_CLASS_SPECIFIC_DESC_LOOKUP_SIZE[USB_NUM_CONFIGURATIONS][1] =
   {
   //config 1
      //interface 0
      sizeof(USB_CLASS_SPECIFIC_DESC)
   };



//////////////////////////////////////////////////////////////////
///
///   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      34 //config+interface+class+endpoint

   const char USB_CONFIG_DESC[] = {
   //IN ORDER TO COMPLY WITH WINDOWS HOSTS, THE ORDER OF THIS ARRAY MUST BE:
      //    config(s)
      //    interface(s)
      //    class(es)
      //    endpoint(s)

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

   //interface descriptor 1
         USB_DESC_INTERFACE_LEN, //length of descriptor      =10
         USB_DESC_INTERFACE_TYPE, //constant INTERFACE (INTERFACE 0x04)       =11
         0x00, //number defining this interface (IF we had more than one interface)    ==12
         0x00, //alternate setting     ==13
         1, //number of endpoints, except 0     ==14
         0x03, //class code, 03 = HID     ==15
         0x01, //subclass code //boot     ==16
         0x02, //protocol code      ==17
         0x00, //index of string descriptor for interface      ==18

   //class descriptor 1  (HID)
         USB_DESC_CLASS_LEN, //length of descriptor    ==19
         USB_DESC_CLASS_TYPE, //dscriptor type (0x21 == HID)      ==20
         0x00,0x01, //hid class release number (1.0) (try 1.10)      ==21,22
         0x00, //localized country code (0 = none)       ==23
         0x01, //number of hid class descrptors that follow (1)      ==24
         0x22, //report descriptor type (0x22 == HID)                ==25
         USB_CLASS_SPECIFIC_DESC_LOOKUP_SIZE[0][0], 0x00, //length of report descriptor            ==26,27

   //endpoint descriptor
         USB_DESC_ENDPOINT_LEN, //length of descriptor                   ==28
         USB_DESC_ENDPOINT_TYPE, //constant ENDPOINT (ENDPOINT 0x05)          ==29
         0x81, //endpoint number and direction (0x81 = EP1 IN)       ==30
         USB_ENDPOINT_TYPE_INTERRUPT, //transfer type supported (0x03 is interrupt)         ==31
         USB_EP1_TX_SIZE,0x00, //maximum packet size supported                  ==32,33
         10  //polling interval, in ms.  (cant be smaller than 10 for slow speed devices)     ==34
   };


   //****** 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   1

   //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};

   //define where to find class descriptors
   //first dimension is the config number
   //second dimension specifies which interface
   //last dimension specifies which class in this interface to get, but most will only have 1 class per interface
   //if a class descriptor is not valid, set the value to 0xFFFF
   const int16 USB_CLASS_DESCRIPTORS[USB_NUM_CONFIGURATIONS][USB_NUM_HID_INTERFACES][1]=
   {
   //config 1
      //interface 0
         //class 1
         18
   };


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


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

   const char USB_DEVICE_DESC[] = {
      //starts of with device configuration. only one possible
         USB_DESC_DEVICE_LEN, //the length of this report   ==1
         0x01, //the constant DEVICE (DEVICE 0x01)  ==2
         0x10,0x01, //usb version in bcd (pic167xx is 1.1) ==3,4
         0x00, //class code ==5
         0x00, //subclass code ==6
         0x00, //protocol code ==7
         USB_MAX_EP0_PACKET_LENGTH, //max packet size for endpoint 0. (SLOW SPEED SPECIFIES 8) ==8
         USB_CONFIG_VID & 0xFF, ((USB_CONFIG_VID >> 8) & 0xFF), //vendor id       ==9, 10
         USB_CONFIG_PID & 0xFF, ((USB_CONFIG_PID >> 8) & 0xFF), //product id, don't use 0xffff       ==11, 12
         USB_CONFIG_VERSION & 0xFF, ((USB_CONFIG_VERSION >> 8) & 0xFF), //device release number  ==13,14
         0x01, //index of string description of manufacturer. therefore we point to string_1 array (see below)  ==15
         0x02, //index of string descriptor of the product  ==16
         0x00, //index of string descriptor of serial number  ==17
         USB_NUM_CONFIGURATIONS  //number of possible configurations  ==18
   };

   #if (sizeof(USB_DEVICE_DESC) != USB_DESC_DEVICE_LEN)
      #error USB_DESC_DEVICE_LEN not defined correctly
   #endif


//////////////////////////////////////////////////////////////////
///
///   start string descriptors
///   String 0 is a special language string, and must be defined.  People in U.S.A. can leave this alone.
///
//////////////////////////////////////////////////////////////////

//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};

//number of strings you have, including string 0.
#define USB_STRING_DESC_COUNT sizeof(USB_STRING_DESC_OFFSET)

// Here is where the "CCS" Manufacturer string and "CCS USB Mouse" are stored.
// Strings are saved as unicode.
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
         28, //length of string index
         USB_DESC_STRING_TYPE, //descriptor type 0x03 (STRING)
         'C',0,
         'C',0,
         'S',0,
         ' ',0,
         'U',0,
         'S',0,
         'B',0,
         ' ',0,
         'M',0,
         'o',0,
         'u',0,
         's',0,
         'e',0
};

*

Como podeis ve el archivo descriptor es practicamente igual que el del ejemplo del ratin que viene con el compilador, por que como he dicho solo he modificado la parte de la descripcion del despositivo, pero no se si me falta por modificar mas cosas, ni que cosas deberia modificar cuadno le añado mas ejes y le quito los botones a la descripcion des dispositivo.

Esta parte de la modificacion de los desciptores y todo lo que conlleva, por desgracias no esta explicado en el gran manual de moyano sobre este pic y el USB


----------



## Moyano Jonathan (May 2, 2012)

Hola como estás kyle. En el foro hay varios hilos que tratan sobre el tema..es cuestión de que los busques para poder analizar mejor el tema...tu problema está en los descriptores...vas a tener que investigar más sobre como es su estructura para poder crear tu programa.

Saludos !


----------



## Mushito (May 3, 2012)

Hola Moyano:Necesito de tus sabios consejos…Estoy haciendo un medidor de distancia según la siguiente pagina.http://www.rentron.com/Micro-Bot/IR_Sonar.htmLa variable es….Distance  VAR WORD  ¿Cómo podría enviar este valor a la PC (laptop) por USB HID (mejor si lo hago con easyDriver y VB60)Gracias de antemano.
Saludos


----------



## Moyano Jonathan (May 3, 2012)

Si lo que necesitas es enviar una variables de 16 bits...podés dividir en dato por 2 enviarlo por USB y luego en una aplicación en la PC lo armas nuevamente.


----------



## elflamen (May 15, 2012)

Hola mis amigos!
Les consulto por un problemita que tal vez le haya sucedido a alguien.
Hace unos meses pude hacer funcionar el proyecto que publicó Moyano para comunicar
una tarjeta entrenadora de la comunicación USB HID en visual basic.net usando el PIC
18F2550 y fue todo un éxito!
El ejecutable de la aplicación .NET fue compilado en Windows7 de 32 bits.
Ahora bien, al copiar ese ejecutable .exe y la dll que tiene las funciones HID en una carpeta aparte
en otra máquina con Windows7 de 64 bits, no funcionó, me arroja una excepción...
Pregunto que debería hacer para que funcione bajo 64 bits y si la dll puede funcionar también bajo 64 bits.
Muchísimas gracias y espero ansioso alguna ayudita.
Elflamen.


----------



## Moyano Jonathan (May 15, 2012)

> Pregunto que debería hacer para que funcione bajo 64 bits y si la dll puede funcionar también bajo 64 bits.
> Muchísimas gracias y espero ansioso alguna ayudita.
> Elflamen.



Probá con 2 cosas:

- Copiando la DLL a la carpeta WOW64 de windows.
- Recompilando el proyecto en la máquina con windows de 64 bits.


----------



## elflamen (May 15, 2012)

Muchas gracias Moyano, 
Para la primera opción, no me queda claro dónde ubicar la carpeta WOW64 de windows?
No obstante voy a probar de recompilarlo en la máquina de 64 bits.
Cordiales saludos,
Elflamen.


----------



## Moyano Jonathan (May 16, 2012)

> Para la primera opción, no me queda claro dónde ubicar la carpeta WOW64 de windows?



Perdón..sysWOW64..queda en la carpeta de windows en máquinas x64


----------



## elflamen (May 16, 2012)

Bien, muchas gracias nuevamente!
Voy a probar y te comento.
Abrazo, Elflamen


----------



## elflamen (May 16, 2012)

Ref. proyecto de comunicación por USB usando HID
-------------------------------------------------
Hola Moyano,
Finalmente, seguí ambas indicaciones y en la máquina con Windows7 de 64 bits no funcionó...
Primeramente puse la dll en la carpeta syswow64, sin resultados y después instalé el Visual Studio 2008, compilé el proyecto para 64 bits y tampoco funcionó.
La excepción que salta se refiere al código: pHostWin = hidConnect(FWinHandle) en la función:

-------------------------------------------------------------------
Public Function ConnectToHID(ByRef targetForm As Form) As Boolean
        ' Activa las notificaciones de windows para recibir mensajes del controlador HID,
        ' luego nos conectamos a dicho controlador.

        Dim pHostWin As Integer = targetForm.Handle.ToInt32
        FWinHandle = pHostWin
        pHostWin = hidConnect(FWinHandle)
        FPrevWinProc = DelegateSetWindowLong(FWinHandle, GWL_WNDPROC, Ref_WinProc)
        HostForm = targetForm
    End Function
-------------------------------------------------------------------

Me tiene bastante desorientado.

Hice otra prueba cargando el proyecto PicUSB que publicó J1M en otro foro, que utiliza transferencia tipo Bulk empleando el driver "mchpusb" y la dll "mpusbapi" proporcionada por Microchip y tampoco funciona bajo 64 bits, me salta una excepción parecida.
Me pregunto ahora si estas dll's pueden funcionar bajo 64 bits, o de lo contrario si existe alguna forma de hacerlas funcionar. S.O.S. Please!


----------



## Moyano Jonathan (May 16, 2012)

> Hice otra prueba cargando el proyecto PicUSB que publicó J1M en otro foro, que utiliza transferencia tipo Bulk empleando el driver "mchpusb" y la dll "mpusbapi" proporcionada por Microchip y tampoco funciona bajo 64 bits, me salta una excepción parecida.
> Me pregunto ahora si estas dll's pueden funcionar bajo 64 bits, o de lo contrario si existe alguna forma de hacerlas funcionar. S.O.S. Please!



A mi se me solucionó recompilando el proyecto en la máquina que tenía windows de 64 bits...la verdad me tiene preocupado el tema de esta librería...quizás haya que aprender a usar algo más genérico.


----------



## elflamen (May 16, 2012)

Bueno, voy a seguir haciendo mas pruebas mañana y te tengo al tanto.
Muchas gracias por tu disposición y por tu gran aporte sobre este tema tan apasionante.
Abrazo.


----------



## elflamen (May 17, 2012)

Hola Moyano,
Te comento que al final pude correr la aplicación HID que había sido compilada en una máquina de 32 bits, desde una máquina de 64 bits !! Para ello tuve que setear el compilador en la opción x86 y santo remedio!
En la máquina de 64 bits pegué el ejecutable junto con la dll en una carpeta única y funcionó.
También probé de colocar la dll en la carpeta syswow64 y también funcionó.
El detalle era setear la opción x86 en el compilador del visual studio.
Ahora respiro hondo, muchas gracias y a seguir con los proyectos!! Abrazo.


----------



## Moyano Jonathan (May 18, 2012)

> Te comento que al final pude correr la aplicación HID que había sido compilada en una máquina de 32 bits, desde una máquina de 64 bits !! Para ello tuve que setear el compilador en la opción x86 y santo remedio!



Te felicito por los logros, ahora a realizar aplicaciones !!!


----------



## edsmind (May 26, 2012)

Buenos dias a todos.

Estoy intentantado realizar un proyecto basado en el pic 18f2550.
se trata de conectarlo mediante usb a un pc y desde el pc poder controlar el duty_cicle del modulo pwm del pic. 
Solo me hace falta que sea el pc el que envie las comuncaciones, no necesito respuesta del pic.
El montage ya lo tengo realizado, con un cristal de 20mhz, los condensadores resistencias y demas... tengo el monage preparado para poder debugear por ICD3, ya que podre disponer de uno.

Estube buscando mucha información y ralice una primera versión del codigo en C para el pic:

_
#include<18f2550.h>

#fuses NOMCLR,NOWDT,NOPROTECT,NOLVP,DEBUG,CPUDIV1,NOPBADEN,HSPLL,PLLDIV5,USBDIV2,
VREGEN,UPUEN

/*Fuses utilizados
NOMCLR: Reset por software
NOWDT: Desactivamos el watchdog
NOPROTECT: desactivamos la protección del codigo
NOLVP: Desactivamos la programación a bajo voltage
DEBUG: Activamos modo debug para icd3
NOPBADEN: PortB entradas o slaidas digitales
HSPLL: Cristal High Speed
PLLDIV5: Dividimos entre 5 la frecuencia del cristal, para conseguir los 
96Mhz en el PLL, ya que los da a una entrada de 4Mhz
USBDIV2: Como queremos usb High-speed (48Mhz) dividimos el PLL/2
CPUDIV1:96 Mhz del PLL/ 2
VREGEN: Activamos el regulador de 3.3V para el módulo USB
UPUEN: Activamos las resistencias internas de PULL-UP 
*/

#use delay(clock=48000000)//Frecuencia maxima de trabajo

#include"usb_cdc.h" // funciones del usb
#include"usb_desc_cdc.h" //descriptores del usb
#include "pwm.h" // funciones del pwm

void main() {

char periodo=00; 
unsigned char outputconfig=0,outputmode=0,config=0; 
unsigned int duty_cycle=0; 

   usb_cdc_init(); // Configuramos al puerto virtual.
   usb_init(); // Inicializamos el stack USB.
   OpenTimer2(TIMER_INT_OFF & T2_PS_1_4 & T2_POST_1_1); // Habilitamos y configuramos
   periodo = 95; 
   OpenPWM1(periodo);//inicializacion pwm 

   while(!usb_cdc_connected()) {} 
   // espera a detectar una transmisión del PC (Set_Line_Coding).
   do{
      usb_task();
      if (usb_enumerated()){ //Espera a que el dispositivo sea enumerado por el host.
         if(usb_cdc_kbhit()){//En espera de nuevos caracteres en el buffer de recepción. 
		duty_cycle = get_int_usb() // duty_cycle = 10 bits (0 -1024) %
	  }
      }
      SetDCPWM1(duty_cycle); // configura el duty_cycle 
      outputconfig = SINGLE_OUT; 
      outputmode = PWM_MODE_1; 
      SetOutputPWM1( outputconfig, outputmode);   //output PWM
   }
while (true); //bucle infinito.
}_



El problema esta en que estaba trabajando con MPLAB en C18, pero las librerias que incluyo en mi proyecto para el manejo del usb no son compatibles con C18. Al parecer son de CCS.

Me he descargado la ultima versión del CCS desde su pagina web, pero no se como funciona... y no se como haria funcionar luego el ICD3 desde CCS.

El siguiente paso, que tampoco tengo muy calro, es el tema de los drivers para que el pc recnozca mi dispositivo.

Alguien que sepa mas que yo (cosa muy facil) podria horientarme un poco en como realizar mi proyecto con CCS, como utilizar ICD3 y el tema de los drivers. 

De antemano muchas gracias.


----------



## patryksim (May 28, 2012)

hola moyano una pregunta a ver si me puedes ayudar en algo
estoy programando el usb de un pic 18f4550 en mikrobasic v.5.4.0 y he tratado de probar el ejemplo que se encuentra en la libreria del programa, lo he montado igual a la sugerencia del ejemplo pero la computadora no me reconoce el cable usb ni siquiera por el HID TERMINAL del mikrobasic. 
tienes idea a que se deba este error?


----------



## Moyano Jonathan (May 28, 2012)

> El problema esta en que estaba trabajando con MPLAB en C18, pero las librerias que incluyo en mi proyecto para el manejo del usb no son compatibles con C18. Al parecer son de CCS.
> 
> Me he descargado la ultima versión del CCS desde su pagina web, pero no se como funciona... y no se como haria funcionar luego el ICD3 desde CCS.



Si ya sabes usar C18, no tiene sentido que migres al CCS por el USB. En este link se explica como realizar una aplicación con USB usando C18: http://www.micros-designs.com.ar/aplicaciones-avanzadas-en-c18/



> El siguiente paso, que tampoco tengo muy claro, es el tema de los drivers para que el pc recnozca mi dispositivo.



Si lo haces con el protocolo HID, no te van a hacer falta los drivers.



> hola moyano una pregunta a ver si me puedes ayudar en algo
> estoy programando el usb de un pic 18f4550 en mikrobasic v.5.4.0 y he tratado de probar el ejemplo que se encuentra en la libreria del programa, lo he montado igual a la sugerencia del ejemplo pero la computadora no me reconoce el cable usb ni siquiera por el HID TERMINAL del mikrobasic.
> tienes idea a que se deba este error?



En cuanto a software no te puedo ayudar por que nunca he usado Mikrobasic. En cuanto al hardware puede ser por problemas de hardware...posteá el hardware que estás usando así vemos donde puede estar el problema.

Saludos !


----------



## hfaalaniz (May 29, 2012)

Hola Jonathan:

Después de estar un tiempo alejado del foro por cuestiones laborales retomo nuevamente el proyecto usb pic trainer, te comento, el único problema que tenía era el conector USB-B de la placa, en realidad yo puse un conector USB-A cambiando la distribución de pines porque no tenía otro, ahora ya esta solucionado y se conecta perfectamente.
Tengo dos salvedades para hacerte, en el PCB no figuran dos jumper, es decir del lado serigráfico, la primera es la alimentación de los dos potes multivueltas y la segunda es la masa también de los mismos.
Por otro lado, todo funciona OKaaaaaaaa!!!!!



Por ultimo, al utilizar una conexión USB con la PC ¿que tipo de protocolo es mas rápido el USB-HID o USB-CDC? por favor corrígeme si me equivoco.

Cordiales Saludos
Fabian


----------



## Moyano Jonathan (May 29, 2012)

> Por ultimo, al utilizar una conexión USB con la PC ¿que tipo de protocolo es mas rápido el USB-HID o USB-CDC? por favor corrígeme si me equivoco.



Ese dato no lo tengo muy en claro nunca he realizado pruebas específicas para medir la velocidad de transmisión de datos..la velocidad te va a afectar dependiendo de la aplicación..para mi nunca ha sido un factor determinante.

Saludos !


----------



## arias887 (May 30, 2012)

Muchachos creo que esto es un poco Off-Topic...
Alguno sabe si existen cxtos rf para transmitir datos directamente desde el puero USB para poder conectar el pic al usb atraves de ese enlace RF...

Por ejempro asi como esos mouses inalambricos que trean un disposotivo que se conecta el puerto usb y hace un vinculo rf con el mouse...

Seria bueno trabajar los uC de esa manera....
O no???....


----------



## hfaalaniz (May 30, 2012)

Hola arias887 me parece interesante tu idea, se trataría de un enlace RF, de hecho en el mercado hay varios módulos RF que permiten hacerlo, te paso algunos datos:

http://www.msebilbao.com/tienda/pro...id=41&osCsid=c4a05791e8b34851f9196b5642e341a2

http://www.electronicaestudio.com/rfestudio.htm

entre otros...espero te sea de utilidad.

Cordiales Saludos
Fabian


----------



## hfaalaniz (May 30, 2012)

Hola Jona:

Estuve probando el pic trainer y encontré lo siguiente:
Cuando deslizas cualquiera de los dos o, los dos controles PWM al máximo y presionas cualquiera de los botones de entrada digital, los leds PWM se apagan.
Cordiales Saludos
Fabian


----------



## arias887 (May 30, 2012)

hfaalaniz dijo:


> Hola arias887 me parece interesante tu idea, se trataría de un enlace RF, de hecho en el mercado hay varios módulos RF que permiten hacerlo, te paso algunos datos:
> 
> http://www.msebilbao.com/tienda/pro...id=41&osCsid=c4a05791e8b34851f9196b5642e341a2
> 
> ...



Si al parecer ai que usar esos tales Xbee...
Gracias...


----------



## Moyano Jonathan (May 31, 2012)

> Hola Jona:
> 
> Estuve probando el pic trainer y encontré lo siguiente:
> Cuando deslizas cualquiera de los dos o, los dos controles PWM al máximo y presionas cualquiera de los botones de entrada digital, los leds PWM se apagan.
> ...



Si, eso ocurre por que el control de los PWM es por software y corre en el mismo hilo que el algoritmo de detección de botón pulsado...por lo tanto si apretas un botón el ciclo de control de los PWM no se ejecuta y apaga los leds.

Para que eso no suceda, tendrías que usar PWM por hardware usando los módulos CCP.

Un saludo !


----------



## hfaalaniz (Jun 3, 2012)

Hola jona:

tengo un problema con la instalación vstudio 2008 y ya estoy con las bls llenas, "el error es por la carga de un ensamblado que no se carga, se entiende? Microsoft.Buil.Engine, deberia encontrarse en c:\Windows\Assembly y no lo tengo, te pido por favor si puedes pasarme de alguna manera ese bendito archivo. Todo comenzó por un formateo forzado que tuve que hacer producto de un virus que mssecurity no detecto y me daño la tabla de ubicacion de ficheros, para cuando reinicié ya era tarde, no pude hacer un fix del mbr, perdí algo de archivos, al igual que el sistema en desarrollo, es decir, las ultimas actualizaciones, porque en otro disco tengo un backup de archivos importantes.
Te agradecería enormemente si me pudieras pasar ese bendito archivo.

Cordiales Saludos
Fabian


----------



## Moyano Jonathan (Jun 3, 2012)

> Te agradecería enormemente si me pudieras pasar ese bendito archivo.


 No tengo idea del nombre y extensión que tiene el archivo. Además tengo Visual Studio 2010, cualquier cosa decime el nombre completo del archivo y extensión y la ubicación.


----------



## hfaalaniz (Jun 4, 2012)

Waho, logre hacer funcionar el mocosoft vs2008 y no era por la instalación del office, ademas, tambien tengo funcionando el vb6 en W7 ultimate reconociendo incluso OCX's de terceros, ya estaba bastante molesto por el tema.
Gracias por contestar jona

Cordiales Saludos.
HFA


----------



## emersonmayon (Jun 4, 2012)

hola  amigos del  foro  tengo una duda en caso de descriptor me  dice que  en ccs debo modificar el vis/pid entonces  lo uqe  encuentro en algunos probleas es asi:  08,0X0X04 EN VID  SERA  IGUAL  QUE 08XD8,0X04  POR  FAVOR EXPLIQUEN CUAL SERIA  LO CORRECTO;
el  otro es al instalar  el drivers al momneto de conectar  el pic18xx     no  instala para  nada utilizo  sistema operativo windows 7 o  como  instalo el  driver ya lo  intente por hdwwiz y nda  gracias por su respuestas


----------



## juanchi2009 (Jun 8, 2012)

Colegas necesito una gran ayuda..!!!! Estoy intentando hacer una interfaz USB.. pude lograr la conectividad y el reconocimieneto del hardware con windows 7 pero ahora mi objetivo es establecer una conexion con MATLAB.. he probado muchos programas.. y al compilarlo con matlab me salta este error:

??? Error using ==> loadlibrary at 279
Microsoft Visual C++ 2005 or 2008 is required to use this feature.

Error in ==> usb at 22
loadlibrary mpusbapi _mpusbapi.h alias libreria

.. he guardado las librerias donde corresponde.. y el Microsoft Visual C++ 2005 or 2008 los tengo.. me parece q es un problema de compatibilidad con windows 7.. pero no le encuentro solución.. si alguien sabe cual es se lo re agradeceria.

Saludos


----------



## emersonmayon (Jun 9, 2012)

bueno  es  interesante  la comunicacion usb  - matlab  yo  hace pocos  dias  logre  la  comunicacion usb matlab con pic18f4550 mi objetivo  fue  procesamiento de imagen por matlab  via usb y lo logre  pero  tuve  que  pasarme  noches y noches ... al  respecto tu pregunta::::::::: estas  seguro que  los  archivos _mpusbapi.h  y mpusbapi.dll  estan en  tu  directorio de trabajo de  matlab?¿?  si no esta  alli te muestra  el  herror como te lo aparece tiene  k  estar  en el mismo  archivo las  librerias mensionados  haber  si pruebas  eso  salu2  para  alguna  consulta sigue  escribiendo  



la  compatibilidad  nada tiene  k ver  igual  yo  tengo  so  windows 7

descargate  de  aqui:::  http://www.mathworks.com/matlabcent...e-matlab-y-pic-de-microchip-usando-puerto-usb
  luego  tu  haces  tus  modificaciones  de  acuerdo a tu nescesidad 
ç



en caso  tu  problemna  no lo esta cargando el:::loadlibrary mpusbapi _mpusbapi.h alias libreria

eso es  tu problema  ahora de  esa  paginba  te lo descargas y  pruebalo


----------



## juanchi2009 (Jun 10, 2012)

emersonmayon gracias por contestar, sisi estoy mas que seguro que los archivos _mpusbapi.h y mpusbapi.dll  están donde deben estar.. o sea.. los puse en la misma carpeta q tengo el archivo.m (usb.m) de matlab.. y los archivos necesarios para realizar la interfaz usb justamente los baje de sea pagina q me pasaste.. asiq ya no tengo idea de q puede estar pasando..  :S.. cabe aclarar q he probado distintos programas en matlab sacados d la web y todos me tiran ese mismo error..



Corrijo lo anteriormente dicho.. lo he pegado en el directorio de trabajo C:\Program Files\MATLAB\R2010b\bin y por si acaso ya lo he pegado en todos lados... en todas las carpetas donde tengo los archivos.m y sigue sin funcionar.. je :S


----------



## jimbo123 (Jun 11, 2012)

genial proyecto si alguien lo tiene configurado con 10  botones se les agradece


----------



## Lithiumrd (Jun 13, 2012)

Buenas, espero que alguno pueda ayudarme, estoy intentando hacer transferencia bulk HID entre un 18f4550 y C#. Me he estado ayudando del programa que Moyano Jonathan que esta en el primer post, de la pagina de http://picmania.garcia-cuervo.net/usb_2_hidtransfers.php y otros sitios que he encontrado.

Estoy intentando utilizar la la mpusbapi.dll que ofrece microchip de manera gratuita y segun creo he entendido bien el funcionamiento de la misma y su integracion con windows. El pic lo estoy programando en CCS.

Mi problema es el siguiente, cuando ejecuto la aplicacion de C#, tenga o no el hardware conectado el visual C# me entrega el error que muestra la imagen. 


Ya intenteinstalando las librerias de microchip actualizadas y el error persiste.

Este es el codigo del archivo de la api. Esta practicamente como lo encontre solo he hecho unas pequeñas modificaciones

```
using System;
using System.Collections.Generic;
using System.Windows.Forms;
using System.Runtime.InteropServices; // Clase para importar DLL

using PVOID = System.IntPtr;
using DWORD = System.UInt32;




namespace AppUSBv1
{
    unsafe public class PicUSBAPI
    {
        #region Definición de los Strings: EndPoint y VID_PID
        string vid_pid_norm = "vid_04d8&pid_000B";

        string out_pipe = "\\MCHP_EP1";
        string in_pipe = "\\MCHP_EP1";
        #endregion

        #region Funciones importadas de la DLL: mpusbapi.dll
        [DllImport("mpusbapi.dll")]
        private static extern DWORD _MPUSBGetDLLVersion();
        [DllImport("mpusbapi.dll")]
        private static extern DWORD _MPUSBGetDeviceCount(string pVID_PID);
        [DllImport("mpusbapi.dll")]
        private static extern void* _MPUSBOpen(DWORD instance, string pVID_PID, string pEP, DWORD dwDir, DWORD dwReserved);
        [DllImport("mpusbapi.dll")]
        private static extern DWORD _MPUSBRead(void* handle, void* pData, DWORD dwLen, DWORD* pLength, DWORD dwMilliseconds);
        [DllImport("mpusbapi.dll")]
        private static extern DWORD _MPUSBWrite(void* handle, void* pData, DWORD dwLen, DWORD* pLength, DWORD dwMilliseconds);
        [DllImport("mpusbapi.dll")]
        private static extern DWORD _MPUSBReadInt(void* handle, DWORD* pData, DWORD dwLen, DWORD* pLength, DWORD dwMilliseconds);
        [DllImport("mpusbapi.dll")]
        private static extern bool _MPUSBClose(void* handle);
        #endregion

        void* myOutPipe;
        void* myInPipe;

        /*static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new AppUSBv1());
        }*/

        public void OpenPipes()
        {
            DWORD selection = 0;

            myOutPipe = _MPUSBOpen(selection, vid_pid_norm, out_pipe, 0, 0);
            myInPipe = _MPUSBOpen(selection, vid_pid_norm, in_pipe, 1, 0);
        }
        public void ClosePipes()
        {
            _MPUSBClose(myOutPipe);
            _MPUSBClose(myInPipe);
        }
        private void SendPacket(byte* SendData, DWORD SendLength)
        {
            uint SendDelay = 1000;

            DWORD SentDataLength;

            OpenPipes();
            _MPUSBWrite(myOutPipe, (void*)SendData, SendLength, &SentDataLength, SendDelay);
            ClosePipes();
        }
        private void ReceivePacket(byte* ReceiveData, DWORD *ReceiveLength)
		{
			uint ReceiveDelay=1000;

			DWORD ExpectedReceiveLength = *ReceiveLength;

			OpenPipes();
            _MPUSBRead(myInPipe, (void*)ReceiveData, ExpectedReceiveLength, ReceiveLength, ReceiveDelay);
            ClosePipes();
        }

/*        public void SumaPIC(uint sumando1, uint sumando2)
        {
            byte* send_buf = stackalloc byte[3];
            
            send_buf[0] = 0x00;             // Código de Entrada a Modo_Suma
            send_buf[1] = (byte)sumando1;
            send_buf[2] = (byte)sumando2;
            SendPacket(send_buf, 3);
        }
*/
/*        public uint ResultadoPIC()
        {
            uint result = 0;
            byte* receive_buf = stackalloc byte[1];

            DWORD RecvLength = 1;

            ReceivePacket(receive_buf, &RecvLength);
            result = receive_buf[0];

            return result;
        }
*/        
/*        public void LedPIC(uint led)
        {
            byte* send_buf = stackalloc byte[2];

            send_buf[0] = 0x01;             // Código de Entrada a Modo_Led
            send_buf[1] = (byte)led;    
            SendPacket(send_buf, 2);
        }
*/
        public void Enviar(byte led1)
        {
            byte* send_buf = stackalloc byte[2];

            send_buf[0] = led1; //Notifica al pic que ha de modificar puerto B
            //send_buf[1] = salida; //Dato a sacar por puerto B
            SendPacket(send_buf, 2); //Envío 2 bytes de información
        }
    }
}
```


GRACIAS DE ANTEMANO


----------



## mnicolau (Jun 13, 2012)

Otro ejemplo para que leas Lithiumrd:

https://www.forosdeelectronica.com/f26/aporte-interfaz-control-usb-bulk-labview-c-76934/

Saludos


----------



## Lithiumrd (Jun 13, 2012)

Gracias Mnicolau, le voy a hechar un ojo.

En lo que tenga avances del proyecto en el que estoy trabajando iré posteando información, estoy haciendo el sistema de control realimentado de un brazo robótico autonomo y el control y programación va a ser por medio del USB y una aplicacion en C#

==========================================================================

Amigos la verdad no se que pueda estas sucediendo, no se si sea porque estoy utilizando la version gratuita de c# o que, pero el codigo que compartio el amigo Mnicolau esta exactamente igual al mio y entrega el mismo error....

Alguna idea??????
:S


----------



## pablorichard (Jun 14, 2012)

Moyano Jonathan dijo:


> Hola a todos.
> 
> Bueno siguiendo con el tema de mpusbapi.dll, veremos como utilizar las funciones *usb_put_packet() y usb_get_packet()*. Las cuales permiten enviar datos por el usb o recibir datos.
> Bien una descripción breve de las mismas es la siguiente:
> ...



Buenos dias soy nuevo en el foro le queria hacer una consulta tengo una aplicacion q me manda datos de mi pic a mi pc por usb en forma correcta, mi duda es si quiero enviar este dato en un intervalo de tiempo el buffer cuando envia se limpia solo hoy hay q limpiar el buffer antes de q se llene? Como se limpia el buffer


----------



## Moyano Jonathan (Jun 14, 2012)

> Buenos dias soy nuevo en el foro le queria hacer una consulta tengo una aplicacion q me manda datos de mi pic a mi pc por usb en forma correcta, mi duda es si quiero enviar este dato en un intervalo de tiempo el buffer cuando envia se limpia solo hoy hay q limpiar el buffer antes de q se llene? Como se limpia el buffer



El buffer del PIC, automáticamente se refresca en caso de que estés enviando por ejemplo el valor de un conversor AD, no hace falta limpiar al buffer. Ahora si querés hacer pruebas, en el driver de CCS, está la función 
	
	



```
usb_flush_out(int8 endpoint, USB_DTS_BIT tgl)
```

Yo nunca la he usado, pero la función existe en la librería usb_pic18.c y la documentación en usb_pic18.h

Saludos !


----------



## grcarlos (Jun 19, 2012)

Hola a todos,

Después de leer 103 paginas (ahora si las leí todas ), para ver si alguien se le había ocurrido lo mismo que a mi, vi que en efecto en este foro todavía no sucede.
Moyano y meta (Que son los nombres que mas he identificado desde el comienzo del tema), les agradezco muchísimo todo lo que han hecho por esta comunidad y gracias a ustedes pude entender y hacer funcionar un proyecto de comunicación PIC USB por HID.  Adecue mi proyecto para que utilizara todos los puertos libres y controlar luces, detectores de movimiento, detectores de humo y aires acondicionados de un lugar.  
Después de realizar con éxito lo anterior, me di a la tarea de agregar un poco de código a mi aplicación en Visual C# 2010 para que pudiera ver en la misma Form una cámara web.
El hecho es que cuando doy click en "conectar dispositivo" y despues quiero iniciar la cámara web la aplicación me manda un error que dice lo siguiente:
"vshost.32.exe dejó de funcionar"
y le doy en detalles y me aparece lo siguiente


 Nombre del evento de problema:	APPCRASH
  Nombre de la aplicación:	Prueba4IMAG.vshost.exe
  Versión de la aplicación:	10.0.30319.1
  Marca de tiempo de la aplicación:	4ba2084b
  Nombre del módulo con errores:	ntdll.dll
  Versión del módulo con errores:	6.1.7601.17725
  Marca de tiempo del módulo con errores:	4ec49b8f
  Código de excepción:	c0000005
  Desplazamiento de excepción:	0003259a
  Versión del sistema operativo:	6.1.7601.2.1.0.768.3
  Id. de configuración regional:	2058
  Información adicional 1:	e8ad
  Información adicional 2:	e8adce1c2b9e7be834b4063ac3c53863
  Información adicional 3:	e8ad
  Información adicional 4:	e8adce1c2b9e7be834b4063ac3c53863

Cabe mencionar que estoy trabajando con NET.Framework4
Y volví a realizar la aplicación desde cero ahora con Framwork 3.5, me vuelve a cerrar la aplicación, pero ahora nada mas cambia el .exe que deja de funciar

Vshost32.clr2.exe dejó de funcionar.

Espero que alguien tenga conocimiento de esto, ya que no puedo ocupar las dos aplicaciones al mismo tiempo, ese error solo me lo da cuando las quiero correr las dos al mismo tiempo, es decir, cuando conecto el dispositivo y le doy click a "Iniciar" en la parte de la cámara web.

Gracias a todos por sus comentarios y nuevamente agradezco que compartan sus conocimientos de esta manera.  En cuanto termine mi proyecto yo también lo quisiera compartir.


----------



## rencor (Jun 21, 2012)

TE TRAIGO UN RETO AMIGO MOYANO, AS TRATADO DE HACER COMUNICACION INALAMBRICA DE UN 18F4550 A 16F877A, me pidieron este proyecto para un curso en la universidad, la mentablemente falle en el intento y tuve ke hacerlo con dos de gama media, pruebalo tu que tienes mas experiencia trabajando con los de gama alta. SUERTE Y gracias por todos tus trabajo e aprendido bastante.


----------



## Moyano Jonathan (Jun 21, 2012)

> pruebalo tu que tienes mas experiencia trabajando con los de gama alta. SUERTE Y gracias por todos tus trabajo e aprendido bastante.



Disculpame, si necesitás que yo te arme la comunicación inalámbrica, lo puedo hacer sin problemas; por supuesto tiene su precio.
Ahora si necesitas que alguien te ayude en tu proyecto, también lo podemos hacer sin problemas pero vas a tener que tener en cuenta 2 cosas:

1 - Crear un hilo propio ya que estás haciendo la pregunta en un hilo donde manejamos comunicaciones USB (alámbricas).
2 - Incentivar a que te ayudemos proponiendo vos primero una idea de proyecto, montaje inicial y pruebas para que nosotros podamos partir de una base más sólida y brindar una respuesta más adecuada.

Saludos !


----------



## rencor (Jun 21, 2012)

1.Pero solo te dije ke lo probaras no ke lo hagas.
2.muy buena respuesta,aunke algo presurada.


----------



## gilberto (Jun 22, 2012)

Buenas tardes, Moyano Jonathan

e estudiado este hilo sobre la comunicacion usb y el pic18f2550, la verdad es que mis respetos hacia ti
ya que poco a poco fuiste creciendo en informacion.
Pudieras subir algun proyecto reciente tuyo, que sea bidireccional entre visual basic 6 y pic18f2550 en comunicacion USB HID, por ejemplo 4 datos entrantes y 4 salientes o algo parecido, al ver el codigo ya lo podria adecuar a mi necesidad, de ante mano muchas gracias por toda tu ayuda.


----------



## alaroa (Jun 22, 2012)

Hola a todos, 

No he visto si tienen esto en el foro pero espero que sea mi aportación.

La conexión en MAC es mas facil realizarla con HID porque si no se hace así la programación se complica, y si que se complica, existe en la pagina http://www.signal11.us/oss/hidapi/hidapi/doxygen/html/index.html una librería que facilita la conexión.

Este es el programa que yo hice de ejemplo, es solo un contador y una entrada analógica y para la salida son digitales por el puerto B, el programa esta echo en xcode. Espero que les sirva de algo.


----------



## Moyano Jonathan (Jun 22, 2012)

> La conexión en MAC es mas facil realizarla con HID porque si no se hace así la programación se complica, y si que se complica, existe en la pagina http://www.signal11.us/oss/hidapi/hi...tml/index.html una librería que facilita la conexión.



Se podrá exportar esa librería para windows ? Esta excelente el aporte, nunca había visto aplicaciones de control para MAC. No conozco nada de esa arquitectura.

Un saludo !


----------



## alaroa (Jun 22, 2012)

si, de hecho esta librería esta para mac, pc y linux y solo tendrías que cambiar el archivo hid.h


----------



## Lithiumrd (Jun 24, 2012)

Buenas amigos, como ya han visto anteriormente, estoy trabajando en un proyecto, el cual es un poco complejo... en lo que tenga avances relevantes postearé por aquí o no se si cree un hilo nuevo. La ayuda de Moyano Jonathan  y de META ha sido inmensa gracias a los codigos y la información que han compartido.

Por el momento solucione la comunicación, aunque con respecto a eso voy a seguir trabajando mas adelante. 

Ahora tengo otro pequeño detalle, el proyecto en el que estoy trabajando deberá funcionar sin necesidad de estar conectado al puerto usb, en CCS estoy inicializando con la respectiva funcion usb_init_cs(), por la información que he encontrado en diferentes post el micro tiene por medio del sense pin detectar dicha conexión

Haciendo una simple funcion para encender un led led cuando el pic este conectado usando este código

if(usb_enumerated()){
    output_high(PIN_C6);
}else{
    output_low(PIN_C6);
}

pero si desconecto el puerto USB el micro no apaga el pin, es decir, según entiendo el mismo queda enumerado, he intentado con información de varias fuentes y nada, eso si, apenas vuelvo a conectar, observo como el led se apaga y vuelve a encender, es decir, pierde la enumeracion y la vuelve a obtener.

La pregunta es como puedo hacer que esto funcione, porque me preocupa el hecho de que al desconectar el micro del PC, no haga el cambio a las rutinas que necesito.

Gracias de antemano...


----------



## Moyano Jonathan (Jun 24, 2012)

> usb_init_cs(), por la información que he encontrado en diferentes post el micro tiene por medio del sense pin detectar dicha conexión



Es muy importante usar el sense pin. Para poder hacer esto tenes que utilizar alimentación externa para tu circuito y usar Vusb con un divisor de voltaje realizado con 2 resistencias de 100K. La salida de dicho divisor de voltaje la conectas al sense pin.

Entonces una vez que desconectes el USB, Sense PIN va a tomar un valor lógico 0 y va a ejecutar la aplicación que tenías prevista ..podrías probar con parpadear un led cada 1 segundo.

En las primeras páginas del hilo se encuentra explicado esto que te digo.

Saludos !


----------



## Lithiumrd (Jun 24, 2012)

Muchas gracias, volveré a pasar por las primeras paginas.

Con respecto a lo de crear un nuevo hilo o postear aquí que me recomiendan??

El proyecto que estoy desarrollando el es sistema de control de un brazo robótico, con aprendizaje de rutinas de movimientos, y su programacion por medio de una aplicación hecha en CCS.

GRACIAS.

Tambien estoy empezando a desarrollar un blog sobre instrumentacion electronica y robótica, esta aun un poco crudo pero avanzando a paso firme.... para los interesados aqui dejo el link al mimsmo


----------



## rencor (Jun 26, 2012)

que fue!! moyano lograste la comunicacion inalambrica utilizando el de gama alta y un gama media.


----------



## felipe0805 (Jul 21, 2012)

Necesito ayuda con el #include <pic18_usb.h>. Una vez que compilo el archivo en el CCS C, me sale 
error en la compilaciòn.
Dònde lo encuentro please??


----------



## GuilhermeAlaia (Jul 30, 2012)

Hola a todos,
Esta es la primera vez que he utilizado este foro, por lo que me perdones y me corrija si me equivoco.

Tengo una pregunta acerca de este artículo, Control de dispositivos a través del módulo USB del PIC18F2550.

Puede utilizar este circuito en Windows 7 64 bits?
Cuando se conecta un circuito de PIC en el puerto USB,
el mensaje "Este dispositivo no puede iniciar. (Código 10)" y no se conecta con el programa hecho en Visual C #.

Los archivos relacionados con el "Dispositivo de entrada USB", y son Hidclass.sys Hidusb.sys Hidparse.sys contenidos en la carpeta System32.

Gracias,
Guilherme.


----------



## manolo159753 (Jul 30, 2012)

lo que podrias revisar primero es el id de hardware de tu dispositivo tal vez por ahi va el problema que no te reconoce el micro por el VID  y PID incorrecto chequea esas opciones en el administrador de dispositivos en las propiedades


----------



## Moyano Jonathan (Jul 30, 2012)

> Necesito ayuda con el #include <pic18_usb.h>. Una vez que compilo el archivo en el CCS C, me sale
> error en la compilaciòn.
> Dònde lo encuentro please??



Ese archivo es de CCS, lo trae el mismo compilador. No se lo tenés que pedir a nadie.



> Puede utilizar este circuito en Windows 7 64 bits?
> Cuando se conecta un circuito de PIC en el puerto USB,
> el mensaje "Este dispositivo no puede iniciar. (Código 10)" y no se conecta con el programa hecho en Visual C #.
> 
> Los archivos relacionados con el "Dispositivo de entrada USB", y son Hidclass.sys Hidusb.sys Hidparse.sys contenidos en la carpeta System32.



A veces funciona y a veces no en Windows 7 de 64 bits. El código de Visual C# lo tenés que ejecutar como AnyCPU, dentro de la configuración del proyecto. Por el momento estoy investigando de hacer funcionar todas mis aplicaciones con la DLL de windows nativa, que es HID.dll


----------



## miborbolla (Jul 31, 2012)

Bueno, yo dejo aquí mi aporte en cuanto al asunto de utilizar la libreria nativa de windows "HID.DLL" que funciona en todos los Windows desde el win98 hasta el windows 7 pasando por 16,32 y 64 bits.

es una hoja de excel, y para accesar a la dll se utilizo el visual basic que viene embebido en el propio office.

Yo lo hice así, por que mi necesidad era manipular los datos desde excel.

Un saludo y hasta pronto.


----------



## GuilhermeAlaia (Ago 9, 2012)

Hola muchachos,
Gracias por la ayuda Moyano, manolo159753 y miborbolla!
Yo estaba de formatear mi disco duro e instalar Windows XP 32-bit, por lo que tarde a agradecerles.

Conseguí hacer la comunicación!

Gracias a todos,
Guilherme.


----------



## rafaelsniper (Ago 14, 2012)

Hola soy nuevo en el foro, necesito ayuda con un problema que tengo con modulo usb:

He leido casi todas las paginas de este hilo y no he podido aclarar mi duda. A pesar de que en este hilo se insiste en que se compilen los firmwares con la version CCS 4.114 a mi me dan problemas. He compilado con exito solo los ejemplos que trabajan con la clase HID. En CDC y BULK a sido un total fracaso. He puesto correctamente los respectivos VID y PID haciendolos coincidir con los del .inf en cada driver y nada, no logro que trabajen correctamente, simplemente cuando sale el asistente de nuevo hardware detectado no reconoce el driver. Estoy pensando que es un problema de la version del compilador puesto que en versiones mas viejas como, la 4.057 o la 4.068 no tengo problema alguno y funcionan perfectamente. Entonces quisiera aclarar si es un problema mio o del compilador.

Muchas gracias de antemano.


----------



## Moyano Jonathan (Ago 14, 2012)

> Entonces quisiera aclarar si es un problema mio o del compilador.
> 
> Muchas gracias de antemano.



En general casi todos los problemas que resultan de preguntas frecuentes..se deben al compilador...no todos los ejemplos están actualizados debido a mi falta de tiempo para hacerlo.
En general todos los ejemplos de CDC (mios), está realizados con la versión 4.023 de CCS.

Saludos !


----------



## rafaelsniper (Ago 15, 2012)

Hola, quisiera antes que todo agradecer su pronta respuesta, Moyano, su participacion en el foro ha sido activa y mas que valiosa. Soy cubano, recien graduado de Ingenieria en Automatica, mi nombre es Rafael y los felicito a todos por abordar un tema tan interesante.
Para mi es un poco contradictorio que tantas versiones de CCS, especificamente de la version 4.114 en adelante tengan tantos problemas, cuando ese software no es gratis y la licencia no es nada barata. Moyano si puedes orientarme con usb bulk transfer te lo voy a agradecer, te explico lo que me pasa:
Yo uso la version 4.068, hasta ahora no he tenido problemas, pero especificamente con usb bulk transfer cuando conecto mi pic a traves del simulador proteus y le instalo el correspondiente driver de microchip, en el administrador de dispositivos me sale un cartel que dice:
El dispositivo no se puede iniciar (codigo 10).
Yo he probado con varias versiones del compilador y nada, no he logrado ningun resultado, por favor le pido orientacion en este aspecto. El firmware que tengo es el mismo que pubicaste en las primeras paginas, solo para probar que la pc me reconozca el dispositivo. Por otro lado quisiera tambien alguna orientacion de como trabajar con la dll de microchip para este modo bulk transfer, pero no en C# sino en C++, si tienes algo por ahi sobre ese tema, le agradecere que me aclare mi duda.

Otra vez gracias y saludos a todos.


----------



## MIYAGUI1 (Ago 19, 2012)

Buen dia 

en primer lugar soy nuevo en este tema y me interesa saber muy bien como controlar la comunicacion usb para elcender un led y variarle la intensidad con visual c#


estoy trabajando c# 2010 y windows 7, lo que he realizado hasta el momento no me ha quedado igual que el archivo sumistrado por ud en la opcion de agregar las librerias


mcHID.dll (Librería de control). 
easyHID.cs (Clase con las funciones de control definidas). 

entonces no se que hacer, en la opcion de agregar nuevo elemento  dentro de c# es igual al 2008.

Buen dia 

en primer lugar soy nuevo en este tema y me interesa saber muy bien como controlar la comunicacion usb para elcender un led y variarle la intensidad con visual c#


estoy trabajando c# 2010 y windows 7, lo que he realizado hasta el momento no me ha quedado igual que el archivo sumistrado por ud en la opcion de agregar las librerias


mcHID.dll (Librería de control). 
easyHID.cs (Clase con las funciones de control definidas). 

entonces no se que hacer, en la opcion de agregar nuevo elemento  dentro de c# es igual al 2008.



aca  tome una imagen lo que estoy obteniendo respecto a la implementacion de dicho proyecto


----------



## Jhon5191 (Ago 25, 2012)

Hola a todos, hace tiempos estuve por acá opinando con respecto a la comunicación USB con easyHID, y ahora que me encuentro realizando un proyecto con ello en mi trabajo, me surge un pequeño inconveniente al respecto.  Resulta que cuando trato de cerrar mi aplicación ya sea desde Visual Basic 6.0 o desde el ejecutable, y el micro aun se encuentra conectado al pc, el sistema entra en una especie de error o algo por el estilo.  Al parecer es un problema con la función DisconnectFromHID en visual basic pero no estoy seguro.  Así que pregunto, alguno de ustedes sabe como solucionar este inconveniente?.

De antemano muchas gracias por su atención y ayuda



Ya resolví el problema haciendo esta pequeña modificación


```
'*****************************************************************
' disconnect from the HID controller...
'*****************************************************************
Private Sub Form_Unload(Cancel As Integer)
   While DisconnectFromHID = False
   Wend
End Sub
```

Sin embargo, temo que pueda generar un loop infinito o un desbordamiento si sucede algo


----------



## rafaelsniper (Ago 27, 2012)

Por favor necesito que me ayuden con mi problema, no logro que me trabaje correctamente ninguna aplicacion con usb bulk transfer, cada vez que intalo el driver, me sale un cartel que dice:
el dispositivo no se puede iniciar (codigo 10). Estoy parado con este problema desde hacer como 2 semanas, no logro resolverlo, por favor respondanme lo antes posible.
Saludos y gracias de antemano


----------



## darkhack (Sep 5, 2012)

hola a todos hace tiempisimos no escribo pero esta vez ando con tiempo de sobra,
asi que me gustaria aprender a usar el usb del pic 18f2550 para posteriormente hacer un conversor de usb a lpt para usar mi viejo programador y para hacer un sitema de control...
agradeceria q me facilitaran informacion nombre de un libro o una guia o curso donde pueda empezar a aprender gracias gente.


----------



## Moyano Jonathan (Sep 6, 2012)

> Por favor necesito que me ayuden con mi problema, no logro que me trabaje correctamente ninguna aplicacion con usb bulk transfer, cada vez que intalo el driver, me sale un cartel que dice:
> el dispositivo no se puede iniciar (codigo 10). Estoy parado con este problema desde hacer como 2 semanas, no logro resolverlo, por favor respondanme lo antes posible.
> Saludos y gracias de antemano



La solución está a lo largo del desarrollo del hilo, vas a tener que leer. Caso contrario es mejor busca a fondo en internet. Revisá que no tengas problemas de hardware y que tu implementación en CCS esté bien hecha.



> agradeceria q me facilitaran informacion nombre de un libro o una guia o curso donde pueda empezar a aprender gracias gente



El proyecto que vos planteas no tiene un libro específico de donde puedas guiarte, pero si hay 2 libros que por separado pueden darte una orientación...

http://www.lvr.com/parprtib.htm

http://www.lvr.com/usbc.htm


----------



## alfonsogustavo (Sep 6, 2012)

Gracias por haber subido el manual en pdf con los videos y el código, actualizando el tema, me salvastee la vida, con un proyecto de instrumentación virtual, gracias.


----------



## Lithiumrd (Sep 9, 2012)

Hola, ya casi terminando con mi proyecto del brazo robotico y para el cual este post y Moyano ya sido mas que de ayuda.

Resulta que ya en las ultimas lineas de programación, programe unas interrupciones en el pic, especificamente RB0 y RB4-RB7, y resulta que cuando tengo las interrupciones activas, el pic no establece la comunicación USB, un amigo me comento que cuando se trabaja con USB no se pueden utilizar interrupciones, a alguien mas le a sucedido esto??, alguna manera de solucionarlo, porque tengo forma de evitar las interrupciones para este proyecto, pero siempre son utilies y para aplicaciones futuras.

Gracias de antemano y de poder solucionar este detalle entre todos seria un GRAN aporte para el tema.


----------



## pablorichard (Sep 9, 2012)

Buenas queria pedir si alguien me puede facilitar los codigos fuentes de mchpusb.dll o mpusbapi.dll  ;o decirme donde lo puedo bajar


----------



## Lithiumrd (Sep 9, 2012)

hola pablorichard, en la pagina de microchip los puedes descargar


----------



## pablorichard (Sep 9, 2012)

me podrias pasar el enlace ya q no lo puedo encontrar!! lo q nesecito es ver los codigos fuentes todas las librerias! desde ya muchas gracias!


----------



## Lithiumrd (Sep 9, 2012)

debes descargar el pac de librerias de microchip, pera al rededor de 260MB, luego de eso, lo instalas y buscas la dll en la carpeta que se instala

este es el link http://www.microchip.com/mymicrochip/filehandler.aspx?ddocname=en559375


----------



## Meta (Sep 9, 2012)

Lithiumrd dijo:


> debes descargar el pac de librerias de microchip, pera al rededor de 260MB, luego de eso, lo instalas y buscas la dll en la carpeta que se instala
> 
> este es el link http://www.microchip.com/mymicrochip/filehandler.aspx?ddocname=en559375




¿Esas librerías son solo para USB?


----------



## Lithiumrd (Sep 10, 2012)

pues es todo un Framework de librerias que ofrece microchip 

http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=2680&dDocName=en537044

ahi esta la pagina, aunque mas que todo esta orientado para las herramientas introductorias de la empresa pero sirve.

Meta, has experimentado el error con las interrupciones al utilizar el modulo USB del PIC??? estoy usando un 18f4550, mira lo que postee mas arriba xfa.

este es el enlace a lo que postee
https://www.forosdeelectronica.com/posts/707438/


----------



## murphy9 (Sep 10, 2012)

Hola a todos, estoy realizando una comunicación USB bulk entre un pic 18f4550 y la pc y una comunicación usart entre el  mismo pic 18f4550 y un 18f2550. Mi problema es la configuración de los fuses. Deseo usar cristales de 4 o 20 MHz. Probando con los de 4 MHz, configuré ambos micros de la siguiente manera:

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

#use rs232(baud=9600,xmit=pin_c6,rcv=pin_c7,bits=8,parity=e)

El problema como les dije antes es que la comunicación usart no se lleva a cabo. Sé que el firmware funciona bien, dado que al hacerlo correr con el oscilador interno el envío y recepción de datos es perfecto, pero al cambiar los fuses todo deja de funcionar. Alguien ya paso por esto y pudo resolverlo? Si pueden ayudarme les estaré muy agradecido


----------



## Moyano Jonathan (Sep 10, 2012)

> Probando con los de 4 MHz, configuré ambos micros de la siguiente manera:




```
#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL2,CP UDIV1,VREGEN,MCLR,NOPBADEN
#use delay(clock=48000000)
```
Los fusibles están mal configurados para un cristal de 4mhz. La configuración correcta es la siguiente:
#fuses XTPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV1,PLL1,CPUDIV1,VREGEN,MCLR,NOPBADEN

Saludos !


----------



## rafaelsniper (Sep 10, 2012)

Hola foreros, logre resolver mi problema, a continuacion les comento para que no les suceda a ustedes.
A pesar de que en este foro esta muy bien abordado el tema de usb, la solucion a mi problema la encontre en otro foro y la comento enseguida.

Yo habia realizado correctamente mi firmware (usb bulk transfer )y tenia el hardware adecuadamente conectado, (aclaro mi aplicacion era simulada en proteus), tenia, instalados los drivers usb de proteus, aparentemente todo estaba en orden pero cuando conectaba el dispositivo e instalaba el driver de microchip me salia un cartel en el administrador de dispositivos que decia: "su dispositivo no se puede iniciar"(codigo 10). El problema era la version de proteus! yo tenia instalada la ultima version de proteus, la 7.10, al probar con la version 7.7sp2 todo funciono perfectamente, he escuchado que con la 7.6 tambien funciona, asi que ya saben! las ultimas versiones de proteus tienen problemas con el usb

Saludos a todos!!


----------



## Moyano Jonathan (Sep 10, 2012)

> Yo habia realizado correctamente mi firmware (usb bulk transfer )y tenia el hardware adecuadamente conectado, (aclaro mi aplicacion era simulada en proteus), tenia, instalados los drivers usb de proteus, aparentemente todo estaba en orden pero cuando conectaba el dispositivo e instalaba el driver de microchip me salia un cartel en el administrador de dispositivos que decia: "su dispositivo no se puede iniciar"(codigo 10). El problema era la version de proteus! yo tenia instalada la ultima version de proteus, la 7.10, al probar con la version 7.7sp2 todo funciono perfectamente, he escuchado que con la 7.6 tambien funciona, asi que ya saben! las ultimas versiones de proteus tienen problemas con el usb



Por que no probás el circuito fisicamente para ver si realmente está funcionando, yo no confio para nada en el proteus para simular microcontroladores, muchas veces problemas que aparecen en la simulación no aparecen en la realidad y viceversa..

saludos !


----------



## murphy9 (Sep 11, 2012)

Muchas gracias por tu pronta respuesta Moyano Jonathan. Probé lo que me dijiste y funcionó a la perfección. Muchas gracias nuevamente por tu ayuda


----------



## MuchachoRyuuya (Sep 14, 2012)

Hola a todos soy nuevo y les comento mi problema, necesito hacer un dispositivo que sirva de controlador para una aplicación en Java o Visual C#, el dispositivo tiene que ser con sensores; así como tipo touchpad y que se conecte vía USB a la computadora. Lo que pasa es que no conozco mucho de PIC C Compiler y por tiempo no quiero usar el ensamblador, además solo se que se tiene que iniciar el USB con usb_init(), inciar las tareas con usb_task() y asignar un numero al dispositivo; pero de ahí no se nada si alguien me podría ayudar, se lo agradecería mucho. Mi problema es en la programación en si, ya tengo experiencia armando dispositivos; pero nunca he programado PIC's con C solo en VHDL y ensamblador.


----------



## josb86 (Sep 27, 2012)

tengo una pregunta en los descriptores del primer ejercicio en comunicación cdc hay alguna variable que diga que puerto virtual es el que creo el PIC? para hacer un programa que siempre abra ese mismo puerto ó hay que hacer una rutina ara el programa de pc que pregunte que a todos los puertos hasta que de con el del pic?


----------



## braser13 (Sep 27, 2012)

karma dijo:


> Bueno espero que esto sea de ayuda para aquellos que han tenido problemas conectando el micro al pc en modo USB con simulacion de COM (CDC).
> 
> thamaphyr, ps en vista de que a ti te sucedio lo mismo que me ocurrio, indicare la forma como yo solucione ese pequeño problemita y espero que esta info te sea de ayuda a ti y a todos los del foro que tengan ese problema.
> 
> ...



Le agradezco mucho casi no lo logro instalar, muchas pero muchisimas gracias.


----------



## zerek (Sep 30, 2012)

Hola compañeros,
He seguido los tutoriales de encender led desde la Pc y me funciona de maravilla, ahora lo que quiero es mandar datos del pic a la PC.
solo quiero mandar dos datos, el primero que se muestre en un textbox y el segundo en otro textbox distinto.
He probado a mandar el primer dato con una letra "a" al principio y el segundo dato con un letra "b", y cuando llegue a la pc, que me los distinga para ponerlos en distintos textbox, pero unas veces funciona y otras no.
Estoy usando CCS para el pic (es un 18f4550)
y visual basic 2010 para la aplicacion en la pc.

En CCS hago lo siguiente:

```
int i,j,cociente,resto;
...
i=180;  //los datos como maximo van a ser de 3 digitos
j=320;
while(1){
usb_task();
if(usb_enumerated()){

   //mando primer dato en dos partes
   cociente=i/10;
   resto=i%10;
   printf(usb_cdc_putc,"a%d\n\r",cociente);
   printf(usb_cdc_putc,"a%d\n\r",resto);
   
   delay_ms(1000);

   //mando segundo dato en dos partes
   cociente=j/10;
   resto=j%10;
   printf(usb_cdc_putc,"b%d\n\r",cociente);
   printf(usb_cdc_putc,"b%d\n\r",resto);
}
}
```

En visual basic 2010 hago lo siguiente:


```
Dim dataIn as String = string.Empty
...
(esto lo pongo dentro del timer, Interval 1000)
if(serialPort1.isOpen = true then
   dataIn = serialPort1.readExisting
   if dataIn <> sting.empty then
      if dataIn.startsWith('a') then
         textbox1.text += dataIn
      end If
      if dataIn.startsWith('b') then
         textbox2.text += dataIn
      end If
   end if
end if
```
 
Hay algo que debe estar mal, tal vez veais una forma mas facil de hacer lo que quiero.


----------



## netma (Oct 5, 2012)

Antes de nada decir que este post es impresionantemente bueno, muchisimas gracias Moyano!!

Por otra parte comentar que ando un poco despistado con el tema del USB. Estoy haciendo mis primeras practicas en este tema y queria realizar un esquema de reles controlado por USB desde un codigo en visual basic 2008. Lo que es la programacion del firmware del pic lo voy entendiendo, la programacion... tambien, pero la union "virtual" entre el proteus y visual basic 2008.... no se por donde agarrarla.
-Tengo que crear un dispositivo virtual y añadirle los drivers.. pero he visto tantos drivers por ahi que no se cual coger.
No tendreis por ahi el pack completo de los reles de Moyano, con todos los archivos y drivers. 

Muchas gracias de antemano y ya ire poniendo fallos que tengo para que no caigan otros en mis errores.


----------



## josb86 (Oct 5, 2012)

hola netma, mira el controlador si quieres hacer comunicación cdc que es en la cual se crea un puerto COM virtual es el mismo para todos es el que coloco en ele primer ejemplo . lo unico es quea mi no me funcionaba la conexcion por que el VID y PID no coincidía con el que aparecía en el pic, yo abrí el archivo mchpcdc como si fuera un .txt y lo modifique, ademas de esto el nombre con el cual aparace el micro cuando lo conectas



; Windows USB CDC ACM Setup File
; Copyright (c) 2000 Microsoft Corporation
; Copyright (C) 2007 Microchip Technology Inc.

[Version]
Signature = "$Windows NT$"
Class = Ports
ClassGuid={4D36E978-E325-11CE-BFC1-08002BE10318}
Provider=%MFGNAME% 
LayoutFile = layout.inf
CatalogFile=%MFGFILENAME%.cat
DriverVer=22/11/2008,1.0.0.0

[Manufacturer]
%MFGNAME%=DeviceList, NTamd64

[DestinationDirs]
DefaultDestDir = 12

;------------------------------------------------------------------------------
;   Windows 2000/XP/Vista-32bit Sections
;------------------------------------------------------------------------------

[DriverInstall.nt]
include=mdmcpq.inf
CopyFiles=DriverCopyFiles.nt
AddReg=DriverInstall.nt.AddReg 

[DriverCopyFiles.nt]
usbser.sys,,,0x20

[DriverInstall.nt.AddReg]
HKR,,DevLoader,,*ntkern
HKR,,NTMPDriver,,%DRIVERFILENAME%.sys 
HKR,,EnumPropPages32,,"MsPorts.dll,SerialPortPropPageProvider"

[DriverInstall.nt.Services]
AddService=usbser, 0x00000002, DriverService.nt

[DriverService.nt] 
DisplayName=%SERVICE%
ServiceType=1
StartType=3
ErrorControl=1
ServiceBinary=%12%\%DRIVERFILENAME%.sys 

;------------------------------------------------------------------------------
;  Vista-64bit Sections
;------------------------------------------------------------------------------

[DriverInstall.NTamd64] 
include=mdmcpq.inf
CopyFiles=DriverCopyFiles.NTamd64
AddReg=DriverInstall.NTamd64.AddReg 

[DriverCopyFiles.NTamd64]
%DRIVERFILENAME%.sys,,,0x20

[DriverInstall.NTamd64.AddReg] 
HKR,,DevLoader,,*ntkern 
HKR,,NTMPDriver,,%DRIVERFILENAME%.sys 
HKR,,EnumPropPages32,,"MsPorts.dll,SerialPortPropPageProvider"

[DriverInstall.NTamd64.Services] 
AddService=usbser, 0x00000002, DriverService.NTamd64

[DriverService.NTamd64] 
DisplayName=%SERVICE% 
ServiceType=1
StartType=3
ErrorControl=1
ServiceBinary=%12%\%DRIVERFILENAME%.sys 


;------------------------------------------------------------------------------
;  Vendor and Product ID Definitions
;------------------------------------------------------------------------------
; When developing your USB device, the VID and PID used in the PC side
; application program and the firmware on the microcontroller must match.
; Modify the below line to use your VID and PID.  Use the format as shown below.
; Note: One INF file can be used for multiple devices with different VID and PIDs.
; For each supported device, append ",USB\VID_xxxx&PID_yyyy" to the end of the line.
;------------------------------------------------------------------------------
[SourceDisksFiles]
[SourceDisksNames]
[DeviceList]
%DESCRIPTION%=DriverInstall, USB\VID_04D8&PID_000B

[DeviceList.NTamd64] 
%DESCRIPTION%=DriverInstall, USB\VID_04D8&PID_000B


;------------------------------------------------------------------------------
;  String Definitions
;------------------------------------------------------------------------------
;Modify these strings to customize your device
;------------------------------------------------------------------------------
[Strings]
MFGFILENAME="mchpcdc"
DRIVERFILENAME ="usbser"
MFGNAME="Josb86PIC_USB"
INSTDISK="Microchip Technology, Inc. Installation Disc"
DESCRIPTION="Josb86_USB_CDC"
SERVICE="USB RS-232 Emulation Driver"


----------



## netma (Oct 5, 2012)

pero para conectar el proteus al software tengo que hacerlo asi??

La verdad es que mi intencion no es simular un COM serie, sino que si es posible meterlo como usb, aunque todavia no tengo decidido el modo de transferencia, como es para control de unos reles no creo que importe mucho.


----------



## josb86 (Oct 5, 2012)

la forma mas fácil es esta, es como si hicieras comunicación rs232 normal: esta forma es si tienes el pic físico por simulación no lo he intentado nunca pero se que proteus tienen su propio controlador


----------



## netma (Oct 5, 2012)

entonces seguire intentandolo por rs232 virtual, a ver que tal se me da la noche que me me da que va a ser larga,jeje.


----------



## netma (Oct 5, 2012)

Nada, no consigo instalar el driver.
Como se que VID and PID debo usar? se lo que es pero no lo localizo puesto que es un 18f4550 en el proteus.



bueno, son mas de las 3am a si que vale por hoy.
el resultado es que aun no he conseguido instalar el serial demo de proteus ni nada por el estilo


----------



## netma (Oct 6, 2012)

Añado informacion;
He estado estudiando el tema VID y PID, 

dentro del archivo "inf" tengo la siguiente informacion :

```
;------------------------------------------------------------------------------
;  Vendor and Product ID Definitions
;------------------------------------------------------------------------------
; When developing your USB device, the VID and PID used in the PC side
; application program and the firmware on the microcontroller must match.
; Modify the below line to use your VID and PID.  Use the format as shown below.
; Note: One INF file can be used for multiple devices with different VID and PIDs.
; For each supported device, append ",USB\VID_xxxx&PID_yyyy" to the end of the line.
;------------------------------------------------------------------------------
[SourceDisksFiles]
[SourceDisksNames]
[DeviceList]
%DESCRIPTION%=DriverInstall, USB\VID_04D8&PID_000B

[DeviceList.NTamd64] 
%DESCRIPTION%=DriverInstall, USB\VID_04D8&PID_000B


;------------------------------------------------------------------------------
;  String Definitions
;------------------------------------------------------------------------------
;Modify these strings to customize your device
;------------------------------------------------------------------------------
[Strings]
MFGFILENAME="mchpcdc"
DRIVERFILENAME ="usbser"
MFGNAME="MoyaPIC_USB"
INSTDISK="Microchip Technology, Inc. Installation Disc"
DESCRIPTION="MoyaPIC_USB28_CDC"
SERVICE="USB RS-232 Emulation Driver"
```

Hasta ahi todo correcto. 
Supuestamente el archivo usb_desc_cdc.h contiene la informacion del VID y el PID, 

```
const char USB_DEVICE_DESC[USB_DESC_DEVICE_LEN] ={
      //starts of with device configuration. only one possible
         USB_DESC_DEVICE_LEN, //the length of this report   ==0
         0x01, //the constant DEVICE (DEVICE 0x01)  ==1
         0x10,0x01, //usb version in bcd  ==2,3
         0x02, //class code. 0x02=Communication Device Class ==4
         0x00, //subclass code ==5
         0x00, //protocol code ==6
         USB_MAX_EP0_PACKET_LENGTH, //max packet size for endpoint 0. (SLOW SPEED SPECIFIES 8) ==7
         USB_CONFIG_VID & 0xFF, ((USB_CONFIG_VID >> 8) & 0xFF), //vendor id       ==9, 10
         USB_CONFIG_PID & 0xFF, ((USB_CONFIG_PID >> 8) & 0xFF), //product id, don't use 0xffff       ==11, 12
         USB_CONFIG_VERSION & 0xFF, ((USB_CONFIG_VERSION >> 8) & 0xFF), //device release number  ==13,14
         0x01, //index of string description of manufacturer. therefore we point to string_1 array (see below)  ==14
         0x02, //index of string descriptor of the product  ==15
         0x00, //index of string descriptor of serial number  ==16
         USB_NUM_CONFIGURATIONS  //number of possible configurations  ==17
   };


//////////////////////////////////////////////////////////////////
///
///   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)
///
//////////////////////////////////////////////////////////////////

#if !defined(USB_STRINGS_OVERWRITTEN)
//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.
char USB_STRING_DESC_OFFSET[]={0,4,12};

// Here is where the "CCS" Manufacturer string and "SERIAL DEMO" are stored.
// Strings are saved as unicode.
// These strings are mostly only displayed during the add hardware wizard.
// Once the operating system drivers have been installed it will usually display
// the name from the drivers .INF.
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
         24, //length of string index
         USB_DESC_STRING_TYPE, //descriptor type 0x03 (STRING)
         'C',0,
         'D',0,
         'C',0,
         '_',0,
         'U',0,
         'S',0,
         'B',0,
         '_',0,
         'P',0,
         'I',0,
         'C',0,
};
```

por mas que lo cambio, lo trasteo, lo compilo y lo cargo al pic 18f4550 del proteus, cuando inicio la simlacion me detecta un dispositivo con el nombre "serial demo", que era el que trae por defecto la libreria de proteus, y no consigo instalar el driver de ninguna manera. 

Sabeis por donde pueden ir los tiros??


----------



## josb86 (Oct 6, 2012)

hola, mira el driver que instalas por pimrraves es el que siempre va a buscar el pc, yo lo que hice fue irme al administrador de dispositivos y desinstalar el equipo y reinicie el pc después conecte el pic nuevamente y le di la ruta manual de donde tenia el nuevo controlador. pero todo con pic físico


----------



## netma (Oct 7, 2012)

No se como ni porque, pero acabo de encontrar un driver que si me reconoce el usb del proteus.

```
[Version]
Signature="$Windows NT$"
Class=Ports
ClassGuid={4D36E978-E325-11CE-BFC1-08002BE10318}
Provider=%CCS%
LayoutFile=layout.inf
CatalogFile=cdc_NTXPVista.cat
DriverVer=01/15/2010

[Manufacturer]
%CCS%=CCS,NTamd64

[CCS]
%CCS_CDC%=Reader, USB\VID_0461&PID_0033
%CCS_CDCBOOT%=Reader, USB\VID_0461&PID_0034

[CCS.NTamd64]
%CCS_CDC%=Reader, USB\VID_0461&PID_0033
%CCS_CDCBOOT%=Reader, USB\VID_0461&PID_0034

[Reader_Install.NTx86]
;Windows2000

[DestinationDirs]
DefaultDestDir=12
Reader.NT.Copy=12

;------------------------------------------------------------------------------
;  Windows 2000/XP/Vista-32bit Sections
;------------------------------------------------------------------------------
[Reader.NT]
Include=mdmcpq.inf
CopyFiles=Reader.NT.Copy
AddReg=Reader.NT.AddReg

[Reader.NT.Copy]
usbser.sys

[Reader.NT.AddReg]
HKR,,DevLoader,,*ntkern
HKR,,NTMPDriver,,usbser.sys
HKR,,EnumPropPages32,,"MsPorts.dll,SerialPortPropPageProvider"

[Reader.NT.Services]
AddService = usbser, 0x00000002, Service_Inst.NT

[Service_Inst.NT]
DisplayName = %Serial.SvcDesc%
ServiceType = 1 ; SERVICE_KERNEL_DRIVER
StartType = 3 ; SERVICE_DEMAND_START
ErrorControl = 1 ; SERVICE_ERROR_NORMAL
ServiceBinary = %12%\usbser.sys
LoadOrderGroup = Base
```


----------



## dcgt (Oct 7, 2012)

holas estoy haciendo un proyecto donde tengo que mandar datos desde una aplicacion de escritorio (estoy usando Visual studio) hacia el PIC 18f4550, en el programa del PIC estoy usando la clase CDC, todo me funciona bien, la PC reconoce al pic mi programa VB se conecta al puerto sin problema, pero al momento de enviar un dato no pasa absolutamente nada ya hice varios programas y vi varios tutoriales y no encontre cual es el problema , si alguien sabe como solucionarlo estaria muy agradecido


----------



## netma (Oct 7, 2012)

Si pones un archivo con el proyecto de visual y otro con el circuito y el Ccs se puede echarte una mano. Un saludo


----------



## dcgt (Oct 7, 2012)

Gracias netma
bueno aqui te dejo el archivo con los codigos y el circuito que saque de varios foros y tutoriales para hacer la prueba talves hasta se te haga conocido, estaria muy agradecido ya voy una semana en esto y ya me pisa el tiempo, es basicamente un circuito que prende y apaga leds,y desde el visual envia numeros al pic para prender cierto led , pero el pic no recive estos numeros


----------



## netma (Oct 8, 2012)

El codigo a mi me da muchos errores, lo mejor es que lo programes entero.

Yo veo fallos en el vb como por ejemplo nombres de variables mal escritos y todo, es normal que no lo hagas funcionar.


Aprovechando la respuesta, tengo una duda tonta.

Estoy enviando un "1" desde el VB, el pic lo recive perfectamente con un getc y por ejemplo, hago un toggle_b(1), la cosa está en que si vuelvo a mandar un "1", no me hace el toggle. 

Puede ser debido a los Timer? (no los he configurado)


----------



## dcgt (Oct 8, 2012)

bueno mil disculpas, ya arregle lo del VB esque elimine dos botones y me olvide borrar el codigo por eso salia error, pero bueno me sigue sin funcionar


----------



## josb86 (Oct 8, 2012)

el dia de hoy me use ha hacer lo de netma de simular CDC desde proteus y me funciono ero había un problema el ic enviaba caracteres sin problema ero no recibía nada del pc después de darle un rato decidí compilar con la versión 4.108 de ccs y listo me comenzó a recibir las teclas que tecleaba en la terminal del PC.
la versión con la que compilaba era la 104


----------



## netma (Oct 8, 2012)

A mi si que me transmite. El problema es que a los 10 segundos aproximadamente deja de hacer nada. Lo he probado en el pic directamente y hace lo mismo. Creo que el problema esta en el firmware. Mañana lo colgare para que lo veáis.


----------



## josb86 (Oct 8, 2012)

aqui esta mi circuito en isis y el achivo de ccs


----------



## dcgt (Oct 9, 2012)

Holas 
Bueno pues ya solucione mi problema, utilice el driver que publico netma y asi ya me envia los datos, muchas gracias!, ahora ya puedo empezar con mi proyecto.

y bueno ahora se me viene otra duda , para mi proyecto necesito enviar numeros grandes como 4000 del pic al pc y viceversa y yo me imagino enviar esto como string , entonces mi pregunta es si se puede enviar strings con cdc, por q veo en muchos ejemplos q solo envian caracteres


----------



## netma (Oct 9, 2012)

Os paso el codigo de mi ccs, funciona perfectamente durante 5 segundos o asi, luego no responde a los envios de datos.


```
#include <18f4550.h>
#fuses HSPLL,MCLR,NOWDT,NOLVP,NOPROTECT,NODEBUG,USBDIV,PLL1,CPUDIV1,VREGEN,NOPBADEN
#use delay(clock=48000000)
#include "usb_cdc.h"
#include "usb_desc_cdc_mod.h"

void usb_conectado(void){
output_high(PIN_A0);
output_low(PIN_A1);}

void usb_desconectado(void){
output_high(PIN_A1);
output_low(PIN_A0);
}

void usb_enumerated(void){
output_high(PIN_A2);}


void main()

{
disable_interrupts(global);   // desactivando interrupciones globales
setup_adc_ports (NO_ANALOGS|VSS_VDD); // desactivando puertos analogicos    
set_tris_a(00000000);
set_tris_b(00000000);
output_low(PIN_B0);
output_low(PIN_B1);
output_low(PIN_B2);
output_low(PIN_B3);
output_low(PIN_B4);
output_low(PIN_B5);
output_low(PIN_B6);
output_low(PIN_B7);
setup_adc(ADC_OFF);
setup_spi(SPI_SS_DISABLED);
setup_wdt(WDT_OFF);
/*setup_timer(RTCC_INTERNAL);
setup_timer1(T1_DISABLED);
setup_timer2(T2_DISABLED,0,1);
setup_timer3(T3_DISABLED|T3_DIV_BY_1);*/
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);


usb_cdc_init();
usb_init();

while(!usb_cdc_connected()){
usb_desconectado();
}

usb_conectado();
if (usb_enumerated()){
   usb_enumerated();}
do{
usb_task();
   
   
   if (usb_cdc_getc()=='1'){output_toggle(PIN_B0);}
   if (usb_cdc_getc()=='2'){output_toggle(PIN_B1);}
   if (usb_cdc_getc()=='3'){output_toggle(PIN_B2);}
   if (usb_cdc_getc()=='4'){output_toggle(PIN_B3);}
   if (usb_cdc_getc()=='5'){output_toggle(PIN_B4);}
   if (usb_cdc_getc()=='6'){output_toggle(PIN_B5);}
   if (usb_cdc_getc()=='7'){output_toggle(PIN_B6);}
   if (usb_cdc_getc()=='8'){output_toggle(PIN_B7);}

}while (1);

}
```


----------



## josb86 (Oct 9, 2012)

dgct divide el numero en cifras y las enviás independientes después las vuelves a unir


----------



## netma (Oct 11, 2012)

Os adjunto todo, es un diseño de 8 leds pero sigo sin dar con el kit de la cuestion y a los 5 segundos ya no me responde. a que puede deberse??
Gracias


----------



## murphy9 (Oct 11, 2012)

Hola a todos nuevamente. Tengo un programa en el que manejo usb y ademas visualizo datos en un lcd. Tengo el programa corriendo a 48MHz. Mi problema es que a tan alta frecuencia la longitud del cable que conecta al lcd produce que en este no se visualicen bien los datos. Quisiera saber si alguien puede ayudarme a configurar los fuses para que tenga los 48 MHz necesarios para llevar a cabo la comunicación usb y que el cpu corra a una velocidad mucho menor, desde 4MHz hasta 20MHz. Tengo los fuses configurados como aparece en la hoja anterior y utilizo un cristal de 4MHz. Alguien puede ayudarme?. Desde ya muchas gracias

fuses XTPLL,USBDIV,PLL1,PUT,CPUDIV1,VREGEN,NOWDT,NOPROTECT,NOLVP,NODEBUG
#use delay(clock=48000000)


----------



## netma (Oct 11, 2012)

pues para un cristal de 4 si quieres usar 48Mhz por narices tienes que tener el PLL a 1 y el CPUDIV1, lo tienes bien. (desde mi punto de vista)


----------



## murphy9 (Oct 11, 2012)

Gracias por tu respuesta netma. Te comento mejor mi situación. Mi idea es tener 48MHz pero solo para la comunicación usb. Deseo tener el cpu del micro corriendo a una velocidad mas baja. Según estuve viendo en esta pagina: http://picmania.garcia-cuervo.net/conceptos.php#USB4Mhz, eso es posible, la idea seria  desde el oscilador principal seguir el camino del pll para el modulo usb y luego mediante una correcta elección de CPUDIV y los bits FOSC3:FOSC0 (segun el diagrama que aparece en la pagina antes mencionada) conseguir otra frecuencia de trabajo para el pic. Mi problema radica en que no se como configurar los bits FOSC3:FOSC0 desde los fuses de ccs


----------



## netma (Oct 12, 2012)

Bua, eso ya se me escapa, siento no poder ayudarte ;(


----------



## Moyano Jonathan (Oct 12, 2012)

> Gracias por tu respuesta netma. Te comento mejor mi situación. Mi idea es tener 48MHz pero solo para la comunicación usb. Deseo tener el cpu del micro corriendo a una velocidad mas baja. Según estuve viendo en esta pagina: http://picmania.garcia-cuervo.net/conceptos.php#USB4Mhz, eso es posible, la idea seria desde el oscilador principal seguir el camino del pll para el modulo usb y luego mediante una correcta elección de CPUDIV y los bits FOSC3:FOSC0 (segun el diagrama que aparece en la pagina antes mencionada) conseguir otra frecuencia de trabajo para el pic. Mi problema radica en que no se como configurar los bits FOSC3:FOSC0 desde los fuses de ccs



Para que necesitas que el micro corra a una velocidad diferentes que la del puerto USB ?


----------



## murphy9 (Oct 12, 2012)

Necesito bajar la frecuencia del cpu ya que con esa frecuencia el lcd no muestra nada y es debido a la longitud del cable ya que pude comprobar montándolo en protoboard que a esa velocidad el display funciona bien y al trabajar a una frecuencia menor con el mismo cable el lcd también funciona perfectamente. Lamentablemente tengo que trabajar con una longitud grande de cable, y preferiría no tener que acortarlo


----------



## ospidera (Oct 12, 2012)

ospidera dijo:
			
		

> Bueno, agradezco a todos por sus aportes, por fin he logrado conectar el puerto virtual de proteus para simular mi programa y por fin entendí el funcionamiento del los dercriptos y su relación con el driver que proporciona microchip, descargen los driver sirven a la perfección para win7 sin tener que hacer mas que lo que moyano y otros han aprotado, agradezco enormemente su colaboración y tiempo




Si tienen dudas con gusto yo tambien les podré colaborar!!!





ospidera dijo:


> Buena tarde para todos, bueno aquí ya es tarde, soy nuvo preguntando en el foro (ya habia visto muchos aportes interesantes), tengo una pregunta que la verdad no se si el el hilo para hacerla y adicionalmente por tiempo no he podido chekar mas el foro, entiendo bastantes coas de la comunicación usb para pic pero me falta lo mas importante, quiero hacer la comunicación virtual para visualizar en proteus pero me encuentro con un problema del driver, he tratado de buscar en la web y la verdad enuentro muchas cosas hechas pero quiero entenderla.
> 
> 1°) como hago para el driver?? tengo que hacerlo??
> 2°) hay que modificar los descriptos y he probado varias versiones de CCS y la verdad hay variaciones y no se en donde modificarlo ¡¿que gano l modificarlo? y donde encuentro la lista de los códigos por fabricante??
> ...




Bueno, agradezco a todos por sus aportes, por fin he logrado conectar el puerto virtual de proteus para simular mi programa y por fin entendí el funcionamiento del los dercriptos y su relación con el driver que proporciona microchip, descargen los driver sirven a la perfección para win7 sin tener que hacer mas que lo que moyano y otros han aprotado, agradezco enormemente su colaboración y tiempo  Si les puedo colaborar con algo con mucho gusto


----------



## Moyano Jonathan (Oct 12, 2012)

> Necesito bajar la frecuencia del cpu ya que con esa frecuencia el lcd no muestra nada y es debido a la longitud del cable ya que pude comprobar montándolo en protoboard que a esa velocidad el display funciona bien y al trabajar a una frecuencia menor con el mismo cable el lcd también funciona perfectamente. Lamentablemente tengo que trabajar con una longitud grande de cable, y preferiría no tener que acortarlo



Te digo que la librería del LCD no tiene nada que ver con la velocidad del microcontrolador, las temporizaciones para visualizar los datos las determinas vos..y el compilador las calcula en función de la frecuencia.


----------



## murphy9 (Oct 15, 2012)

Finalmente pude solucionar mi problema acortando un poco los cables, sin embargo debo reconocer que poniendo en los fuses:
#fuses XTPLL,USBDIV,PLL1,PUT,CPUDIV4,VREGEN,NOWDT,NOPROTECT,NOLVP,NODEBUG
#use delay(clock=24000000)
La pc seguía reconociendo al dispositivo usb aunque no hice pruebas para saber si el cpu del micro realmente trabajaba a una frecuencia mas baja


----------



## netma (Oct 15, 2012)

Alguien ha probado los archivos que subi el otro dia?? sigo con el mismo problema, solo responde los primeros segundos de conectarlo.



Si antes lo digo antes lo apaño. Era por el usb_cdc_getc() no lo estaba usando bien.


----------



## dcgt (Oct 19, 2012)

Buenas

tengo un problema en la comunicacion CDC al momento de enviar datos, en mi programa tengo un vetor  int distance[6] que me contiene numeros enteros y eso lo quiero enviar a la PC y lo intente enviar de diferentes maneras por ejemplo: usb_cdc_putc(distance), printf(usb_cdc_putc,distance), hasta incluso creando un ciclo que envie el dato de cada posicion uno por uno, pero mi aplicacion de escritorio se cuelga. solo me recive cuando envio una palabra asi printf(usb_cdc_putc,"hola")
y bueno quisiera alguna sugerencia de que puedo hacer

Que tal, bueno me dado cuenta que estado usando mal el putc guiandome en un ejemplo de moyano lo he hehco de esta manera printf(usb_cdc_putc,"%Lx",distance[0]) prara recivir el primer numero per de todos modos se me cuelga el VB ahora pienso que talves el problema sea del VB aqui les pongo el codigo de VB de la parte donde recive el dato

 Private Sub Leer_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Leer.Click
        Dim uno As Char
        Dim lectura As String
        uno = "a"
        SerialPort1.Write((uno))
        lectura = SerialPort1.ReadLine()
        Distancia.Text = lectura
    End Sub


----------



## volthor (Oct 20, 2012)

saludos apreciados foristas:

felicitaciones a Moyano Jonathan por su gran trabajo, quisiera tu me ayudaras con un proyecto que estoy realizando sobre una prototipadora 3d, la idea es controlar 4 motores paso a paso bipolares a traves de puerto usb y reconozca una interfaz grafica que son estadar en estas maquinas como la rep rap
( interfaz grafica de makerbot o la interfaz grafica pronterface). No se por donde empezar, como hago para que el pic 18f4550 o el 18f2550 reconozaca la interfaz grafica pronterface y ejecute toda las intrucciones que le envie a los motores paso a paso, gracias por su ayuda


----------



## alberto0265 (Nov 26, 2012)

netma dijo:


> Alguien ha probado los archivos que subi el otro  dia?? sigo con el mismo problema, solo responde los primeros segundos de  conectarlo.
> 
> 
> 
> Si antes lo digo antes lo apaño. Era por el usb_cdc_getc() no lo estaba usando bien.


Soy nuevo por estos lares,mi consulta es para Netma si puedes subir el código funcionando para poder entender el error ,desde ya muchas gracias


----------



## braser13 (Nov 26, 2012)

Tengo un problema y es que en proteus me sirve pero a la hora de montar el circuito no me sirve, el pc no me reconoce el pic cuando lo conecto a un puerto usb, alguien me podría ayudar


----------



## netma (Nov 29, 2012)

Hola alberto, el problema que estaba teniendo yo era que no me hacia a la idea de que si mandaba varios bytes desde el pc  de esta manera:

(vb)
SerialPort1.Write(1)
SerialPort1.Write(2)

A la hora de leerlos debia hacerlo tambien asi desde el pic:

(CCS)
dato1=usb_cdc_getc();
dato2=usb_cdc_getc();


Ahora comentar que soy incapaz de mandar datos del pic al pc, he probado mil maneras y soy incapaz.
Supuestamente tengo este codigo en ccs:

int8 envio[];
envio[0]=8;
usb_put_packet(1,envio,1,USB_DTS_TOGGLE);


Y el VB 2008 tengo lo siguiente:

Dim prueba() As Byte
prueba(0) = SerialPort1.ReadByte

y se queda a la espera de recibir datos pero no recive nada de nada.
he probado con readbyte, con read, readexising, readchar..... y nada de nada. Ya estoy desesperado porque tiene que ser una chorrada pero no lo veo!



braser, lo que necesitas es el driver para proteus y tener instalado el virtual usb que viene con proteus, en unas paginas atras estan los drivers que usé yo y funcionaron.


----------



## netma (Nov 30, 2012)

Imposible, he probado todo, con usb_cdc_putc.... y lo maximo que consigo es que haga amago de enviar algo pero no manda nada el pic.
en el visor usb del proteus se ve el paquete que envia,pero se queda en estado pendiente y no contiene nada.


----------



## junior perez (Nov 30, 2012)

hola amigos necesito ayuda para simular usb    en  windows 7 a 64 bits le instale los divers y me dice algo asi como que windows no lo soporta gracias de antemano...


----------



## Gonzer (Dic 9, 2012)

Muy buenas Noches,

De antemano quiero agradecerles a todos los que han participado en este foro tan increíble y de aprovechar para poder seguir investigando y desarrollando nuevas cosas; Moyano muchas gracias por todas sus tutorías y paciencia e igual a todas las personas que han ayudado a que esto siga adelante. Tengo una duda y es que por mi parte deseo usar el pic18f2550 con un bootloader de internet (Neo-teo), creo que es bien reconocido, para poder programar este pic directamente por USB y que también sea posible usar el USB con HID desde visual 2010, la verdad lo intente por aparte el bootloader como la programación en visual y sirven muy bien, pero a la hora de poner el bootloader en el pic y quemar el programa para el usb, este simplemente no hace nada, pero nada.... el código en el pic fue el siguiente:


```
#include <18f2550.h>
#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN,NOPBADEN
#use delay(clock=48000000)
#include <pic18_usb.h>

#include <Descriptor_easyHID.h>
#include <USB.c>
#include <usb_bootloader.h>//Para que sirva el bootloader en "teoria"
#use fast_io(b)
#use fast_io(c)


void USB_debug(){

    output_high(PIN_C7); // Enciende el led error y apaga el led USB_OK.
    output_low(PIN_C6);
    usb_wait_for_enumeration(); // Espera a ser enumerado por el host.
    output_low(PIN_C7); // Enciende el led USB_OK y apaga el led USB_ERROR.
    output_high(PIN_C6);  
}

void main()
{
   
   int8 recibe[32];
   set_tris_b(0xF0);
   output_b(0x00);
   set_tris_c(0b00111100);
   output_low(PIN_C0);
   output_low(PIN_C1);
   usb_init();
   usb_task();
   USB_debug();
   
   while(1)
   {
   
   
      if(usb_enumerated())
      {
         
      
         if (usb_kbhit(1))
         {   
            
            usb_get_packet(1,recibe,32);
            
            if(recibe[0]==0x0A){
            
               switch(recibe[1])
               {
                  case 0x01:
                  output_toggle(PIN_B0);
                  break;
                  case 0x02:
                  output_toggle(PIN_B1);
                  break;
                  case 0x03:
                  output_toggle(PIN_B2);
                  break;
                  case 0x04:
                  output_toggle(PIN_B3);
                  break;
               
               }
            
            }
            
         
         }
      
      }
   
   }

}
```
El programa recibe datos del visual y lo que hace es según el botón seleccionado enciende un led en el puerto RB.


Muchas gracias por la atención y de antemano algún comentario para posible solución sería de gran ayuda...


----------



## GNM (Dic 18, 2012)

Hola que tal moyano, te queria hacer la siguiente pregunta, bueno antes que nada te comento un poco mi problema y lo que estoy aciendo, estoy controlando 8 salidas PWM desde la computadora por el modulo USB bulk, mediante estas salidas controlo 8 servos y funciona a la perfeccion, pero como el PWM se esta manejando con la interrupcion del timer0, mis entradas analogas no reaccionan bien es decir no funcionan de buena manera, nose si sepas de alguna interrupcion para las entradas analogas o la conexion a usb en verdad nose lo que este fayando, pero ese es mi problema espeor puedas ayudarme.....


----------



## netma (Dic 18, 2012)

Hola compañeros, a ver si alguien sabe porque pasa esto:
como codigo en el pic tengo lo siguiente:

```
printf(usb_cdc_putc, "Usb correctamente conectado\r\n");
```

Y en VB recibo de la siguiente manera.

```
recep = SerialPort1.ReadExisting()
```

De esta manera la variable string recep queda vacia, pero si hago esto otro con un vector.

```
SerialPort1.Read(prueba, 0, 3)
 recep = SerialPort1.ReadExisting()
```

Prueba me coge el valor "U" y recep coge "sb correctamente conectado"

PORQUE!?? no me lo explico


----------



## netma (Dic 19, 2012)

Bueno, ya lo he apañado.
Por si alguno le interesa que no veo mucho movimiento por aqui. Lo he apañado con un readline()


----------



## betox1234 (Ene 24, 2013)

Hola Moyano Jonathan muy bueno todo!! Te queria preguntar si por las dudas pudiste usar la mcHID.dll en Visual C++ 2008? estoy tratando con la ClassHid.dll http://www.micros-designs.com.ar/practicas-en-visual-c-05/ pero no logro hacerlo funcionar . Me parece que lo mas practico seria usar mcHID.dll por eso te lo pregunto.

Saludos


----------



## Moyano Jonathan (Ene 24, 2013)

> Hola Moyano Jonathan muy bueno todo!! Te queria preguntar si por las dudas pudiste usar la mcHID.dll en Visual C++ 2008?



Nunca lo he probado. Un saludo !


----------



## Rijiru (Feb 11, 2013)

Buen dia, estaba viendo este proyecto por que me interesa hacer un bridge USB to RS232, pero, tengo un problema, desde la PC envio un dato al PIC y en la salida UART del PIC(independientemente de lo que envio por USB) obtengo un '+'(0x2B), el codigo en la sección main está asi:

do
   {
      usb_task();
      if (usb_enumerated())
      { // Si el puerto ya fue enumerado por el host :
         if(usb_cdc_kbhit())
         {
            data=toupper(usb_cdc_getc());
            putc(data);
         }
      }

La misma aplicación la probe con el COM virtual de X-CTU y no tuve problemas.

Saludos


----------



## mpereyra1 (Feb 15, 2013)

Hola  miborbolla, me baje tu zip.rar y vi que es un proyecto de base de datos supongo
No se si tendrás los demás datos, clases, métodos, y eso que es de c#.
Agradecería si tenes que  me lo pases para practicarlo.
Gracias de ante mano. mpereyra1
*políticas@delforo.com
*

*Como no cumplo las Políticas del Foro. Me editaron el mensaje.*​


----------



## miguelfgp (Feb 22, 2013)

hola que tal, tengo una duda con los pics que soportan puerto USB, si yo tengo un dispositivo que manda datos por usb y se conecta a la compu o sea manda los datos que lee a la compu por un cable USB verdad, entonces mi duda es si puedo mandar esos datos que manda por USB a un pic 18f4550 que soporta transmision por USB para procesar los datos en el microcontrolador y luego mandarlos a la pc, no se si me explique es decir usar el microcontrolador entre el dispositivo USB y la PC como quien dice meterlo en medio para hacer otra funcion, esto es posible?


----------



## Moyano Jonathan (Feb 22, 2013)

Se puede hacer pero no de la manera que vos planteas. Para hacerlo hay otras maneras mas o menos sencillas según el nivel de conocimiento:

- Usar un chip USB - HOST dedicado, donde escribiendo el handler y la plantilla de descriptores USB en algún lenguaje de programación, podés interactuar con mouse, teclado, impresoras, cámaras, dispositivos android, etc. Una opción de complejidad alta para hacerlo desde 0, en Arduino hay algunos ejemplos y librerías listos. Manejo por puerto SPI.

- Usar un chip de vínculo ...(FTDI VINCULUM) que es un controlador USB más sencillo, donde podés conectar por ejemplo un pendrive y crear, modificar, borrar, archivos o carpetas, etc. Se maneja desde el puerto SPI y no es muy complejo de implementar.

- Usar algún PIC que disponga de puerto USB host, como por ejemplo los PIC24 o los PIC32. Microchip ya tiene listas las librerías y los ejemplos para que vos puedas implementar lo que necesitas según sea el caso.

Espero te puedas guiar, un saludo !


----------



## miguelfgp (Feb 23, 2013)

gracias por la respuesta, creo que me decidire por un micro con USB-Host conoces alguno de la familia de microchip que me puedas recomendar?, alguno famoso del cual pueda encontrar informacion en la red x favor


----------



## Moyano Jonathan (Feb 24, 2013)

No sinceramente nunca he trabajado con los módulos USB host de microchip. Lo vas a tener que investigar dentro de las librerías que aparecen con el framework: http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=2680&dDocName=en547784


----------



## Rijiru (Feb 25, 2013)

Hola Foristas, estoy implementando lo aportado en ésta discusión en un  programa de prueba en C# ya logré hacer un bridge cuando le haga los  ajustes finales lo posteo.

Saludos


----------



## jmolina33 (Feb 28, 2013)

Buenos dias, ya he leido mas o menos hasta la hoja 78 del tema, la pregunta mia va encaminada a solucionar un problema que aunque muchos lo preguntaron no se dio respuesta concreta, (hasta donde mire), necesito leer varias variables análogas digitales, primero en 8 bits de resolucion para que no me toque hacer conversiones de bits, me envía unos datos de unos pulsadores como entradas digitales y solo uno de los datos AD, eso dentro de un buffer envia[], voy a enviar el otro dato dentro del buffer pero al colocar el put(1,envia,3,usb_dts_toggle) ya no recibe nada en visual, estoy utilizando la plantilla del ejemplo 6 de Jhonatan, ya he mirado que el migro del easyHID, pero este fue el unico que me funciono siguiendo todo el tema. si me dan una luz en el proyecto de envio de mas de 2 datos por usb gracias estoy con un reloj de 4Mhz.


----------



## Moyano Jonathan (Feb 28, 2013)

Lo que pasa es que el PIC empaqueta los datos cuando envía por USB. Si querés leer por ejemplo 2 entradas analógicas + entradas digitales:


```
private void Lee_datos(UInt32 In_handle)
        {
            byte[] BufferINP = new byte[EasyHID.BUFFER_IN_SIZE]; // Declaramos el buffer de entrada.
            if ((EasyHID.Read(In_handle, out BufferINP)) == true) // Si hay datos, los procesamos...
            {
                // Según se haya presionado un pulsador, indicará el evento de forma gráfica.
                if (BufferINP[1] == 0x01) { IN_DIGITAL_1.BackColor = Color.GreenYellow; 
                    MENSAJES_USB.Items.Add("Botón 1 presionado."); }
                else { IN_DIGITAL_1.BackColor = Color.Green; }
                if (BufferINP[2] == 0x01) { IN_DIGITAL_2.BackColor = Color.GreenYellow; 
                    MENSAJES_USB.Items.Add("Botón 2 presionado."); }
                else { IN_DIGITAL_2.BackColor = Color.Green; }
                if (BufferINP[3] == 0x01) { IN_DIGITAL_3.BackColor = Color.GreenYellow; 
                    MENSAJES_USB.Items.Add("Botón 3 presionado."); }
                else { IN_DIGITAL_3.BackColor = Color.Green; }
                if (BufferINP[4] == 0x01) { IN_DIGITAL_4.BackColor = Color.GreenYellow; 
                    MENSAJES_USB.Items.Add("Botón 4 presionado."); }
                else { IN_DIGITAL_4.BackColor = Color.Green; }
                
                // Une la parte alta y baja de la conversión y guarda el dato en la variable
                // ADCxValue.
                ADCValue1 = (uint)(BufferINP[5] << 8) + BufferINP[6];
                ADCValue2 = (uint)(BufferINP[7] << 8) + BufferINP[8];
                // Muestra los valores en las barras de progreso.
                ADC1_VALUE.Value = (int)ADCValue1;
                ADC2_VALUE.Value = (int)ADCValue2;
            }
                                                                   
 }
```

El buffer del endpoint de salida, tiene declarados 32 bytes, si analizas la porción de código:


```
ADCValue1 = (uint)(BufferINP[5] << 8) + BufferINP[6];
ADCValue2 = (uint)(BufferINP[7] << 8) + BufferINP[8];
```

Te das cuenta que los datos del conversor analógico de 10 bits se encuentran en los bytes 5,6,7 y 8 respectivamente.

Del lado del PIC:


```
// Leemos 2 canales analógicos del PIC.

                    set_adc_channel(0);                                 // Seleccionamos el canal 0 y comenzamos a leer.
                    delay_us(10);                                       // Esperamos un tiempo para estabalizar el dato leido.
                    valor_adc_alta = (read_adc()>>8);                   // Enviamos la parte alta de la conversión de 10 bits.
                    valor_adc_baja = (int)(read_adc());                 // Enviamos la parte baja de la conversión de 10 bits.
                    envia[4]=valor_adc_alta;
                    envia[5]=valor_adc_baja;


                    set_adc_channel(2);                                 // Seleccionamos el canal 2 y comenzamos a leer.
                    delay_us(10);                                       // Esperamos un tiempo para estabalizar el dato leido.
                    valor_adc_alta = (read_adc()>>8);                   // Enviamos la parte alta de la conversión de 10 bits.
                    valor_adc_baja = (int)(read_adc());                 // Enviamos la parte baja de la conversión de 10 bits.
                    envia[6]=valor_adc_alta;
                    envia[7]=valor_adc_baja;
```

Si necesitas enviar o recibir más datos...solamente usá más bytes del buffer del lado del PIC y del programa host...usando la misma estructura que usé para el ejemplo.

Saludos !


----------



## jmolina33 (Feb 28, 2013)

creo que con estos datos podre solucionar mi dificultad nuevamnete te felicito, y personalmente aunque he investigado mucho al respecto tus documentos, ellos han sido una guia completa para mi, esto es una labor educativa el proyecto que estamos haciendo, no es comercial y nada por el estilo, esta bien que utilicemos los protocolos a los que hace referencia este proyecto???

Gracias Miles


----------



## Moyano Jonathan (Feb 28, 2013)

> esta bien que utilicemos los protocolos a los que hace referencia este proyecto???



No hay problema, saludos !


----------



## mpereyra1 (Mar 2, 2013)

estimado moyano.
te cuento que estoy en eso de la comunicacion de dispositivos por usb y c#,y me baje todos los Zip que pusiste en el foro y otros que encontre en scribd.
la pena es en los codigos del CCS,no me compilan y me salen como 100 errores,los he compilado de diferentes formas y me descargue lo ultimo en ccs v4.114 y ccs v4.130 y nada, lo estoy ejecutando en windows 7 32bits.espero que puedas ayudarme o mandarme un zip,te lo agradeceria.


----------



## jmolina33 (Mar 5, 2013)

buenas tardes, el proyecto me funciono en HID sin problemas, pero ya se me presenta un problema adicional, es que la gran variedad de software educativo que trabaja coin adquisicion de datos trabaja por el puerto COM, estoy mirando como puedo hacer para que estos lean el dato pensando en un comvirtual como el que se genra cuando se trabaja por cdc, pero la velocidad del programa que muestras ahi y en el micro hacen que la comunicacion no se adecuada para los adc, como se podria mejorar estos tiempos, estoy mirando si el timmer que colocas en los programas de VB, es necesario o exista la opcion que cuando ocurra en evento de dato en el buffer se ejecute algo? pero no tengo claro si se puede hacer, ahora, en el PUIC cuando el PC enumera el USb veo que esta dentro de un ciclo, se podria hacer antes de entrar al ciclo que la numeracion se haga y desùes entre al ciclo?, por que cuando le doy clic a uno de los botones del programa para prender un led en VB, el responde despues de un tiempo.

Gracias


----------



## cabflip (May 14, 2013)

Hola gente, soy nuevo en el foro y estoy acá porque ya no se a quien mas recurrir!  

Necesito establecer una comunicacion PIC-USB, mi problema es que este es mi primer proyecto con usb y no estoy muy metido en el tema. 
No quiero molestarlos con todo el resto del programa porque es largo y solo tengo problemas en la transmisión. El tema es el siguiente, con un PIC18F4550 y un xtal de 20Mhz, necesito transmitir 250KB en un segundo, que son repetidas mediciones de una plancha de 48x48 sensores, que ya están guardadas en la memoria del micro. Para probar la TX con la PC me base en el proyecto de http://picmania.garcia-cuervo.net/usb_3_cdctransfers.php, el cual me anduvo sin problemas... excepto que solo lograba transmitir al rededor de 50kb en un segundo... demasiado lento para lo que necesito. 
El programa lo hice en CCS y utilice el hyperterminal para recibir los datos en la pc. Como podrán ver en el cogido a continuación, mi idea fue mostrar los datos en forma de tabla, 48 columnas, 48 filas y transmitir 50 veces la plancha, que es mas o menos lo que necesito. Una vez que envio las 50 planchas hace titilar un led que se encuentra en el PIN C0. 
El circuito es TAN SIMPLE COMO ESO, transmite por USB y en el pin C0 hay un led, nada mas.

Este fue el codigo que utilice, basado en el proyecto de picmania:

```
#include <18F4550.h>
#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN
#use delay(clock=48000000)

#include ".\include\usb_cdc.h"


void main() {
   BYTE columna,fila,plancha;
   output_high(PIN_C0);
   delay_ms(300);
   usb_cdc_init();
   usb_init();
   while(!usb_cdc_connected()) {}
   output_low(PIN_C0);
  
 
   while (TRUE) {    
    for(plancha=1;plancha<=50;++plancha){
      for(columna=1; columna<=48;++columna){
         printf(usb_cdc_putc, "\r\n");
         for(fila=1; fila<=48; ++fila) {
            printf(usb_cdc_putc, "%2x" fila);
            printf(usb_cdc_putc, " ");
            
         }
      }printf(usb_cdc_putc, "\r\n\n Plancha: ");
       printf(usb_cdc_putc, "%2x" plancha );
       printf(usb_cdc_putc, "\r\n");
    }    

    while (TRUE) 
      {output_toggle(PIN_C0);
      delay_ms(500);}

   }
}
```

Estaria muy agradecido si me pudieran ayudar con este problema! Al menos dándome una mano con algún link o código en donde pueda entender como abrir varios endpoints y como utilizarlos.

Saludos!

Facundo


----------



## azzul (May 15, 2013)

Hola a todos , soy nueva en el foro y sobre el proyecto de prender leds via usb , pues  tengo un error que  me deja dormir varios días. Me aparece este error , en el controlador desde la administración de dispositivos " Este dispositivo no puede iniciar. (Código 10)
No hay recursos de sistema suficientes para completar la llamada a la API." . Sin embargo el circuito  funciona perfectamente  desde la pc de  un amigo  y yo tengo este problema , osea no es por capacitores , ni el crystal . 
No tuve oportunidad de revisar su maquina , pero el proyecto es exactamente el mismo.

Estoy usando win8, eso tiene algo que ver??? .
muchisimas gracias por responder


----------



## alberto0265 (May 29, 2013)

Hola a todos estoy empesando programacion con visual c++2010 Express para poder realizar comunicacion usb entre la pc y un microcontrolador (ejemplo 18f4550).
Si alguien me puede ayudar con algun ejemplo se lo agradesco.


----------



## Moyano Jonathan (May 30, 2013)

> Hola a todos estoy empesando programacion con visual c++2010 Express para poder realizar comunicacion usb entre la pc y un microcontrolador (ejemplo 18f4550).
> Si alguien me puede ayudar con algun ejemplo se lo agradesco.



En la primer página está lo que necesitas.

Saludos !


----------



## robertosebastian92 (Jun 9, 2013)

Hola amigos del foro. Hace mucho tiempo que me viene interesando este tema, a diferencia de ustedes yo lo estoy realizando en PIC SIMULATOR IDE, lo abandone hace unos meses por qué no lo logre hacer funcionar y como hasta ese entonces no era de importancia, no seguí con el asunto. Pero ahora me topo con la necesidad de adaptar un extenso programa que realice en PSI el cual necesita una interfaz USB y no puedo, Pero luego de hacer muchos experimentos logre descubrir que la rutina se bloquea en la línea UsbStart. 

El código usado es en el que esta de ejemplo en la página de OshonSoft

```
Define CLOCK_FREQUENCY = 20
Define CONFIG1L = 0x24
Define CONFIG1H = 0x0c
Define CONFIG2L = 0x3e
Define CONFIG2H = 0x00
Define CONFIG3L = 0x00
Define CONFIG3H = 0x83
Define CONFIG4L = 0x80
Define CONFIG4H = 0x00
Define CONFIG5L = 0x0f
Define CONFIG5H = 0xc0
Define CONFIG6L = 0x0f
Define CONFIG6H = 0xe0
Define CONFIG7L = 0x0f
Define CONFIG7H = 0x40

UsbSetVendorId 0x1234
UsbSetProductId 0x1234
UsbSetVersionNumber 0x1122
UsbSetManufacturerString "OshonSoft.com"
UsbSetProductString "Generic USB HID Device"
UsbSetSerialNumberString "1111111111"
UsbOnIoInGosub input_report_before_sending
UsbOnIoOutGosub output_report_received
UsbOnFtInGosub feature_report_before_sending
UsbOnFtOutGosub feature_report_received

AllDigital
ADCON1 = 0x0e
TRISB = 0
PORTB = 0xff
UsbStart
PORTB = 0

Dim an0 As Byte

loop:
	Adcin 0, an0
	If an0 < 50 Then
		PORTB = 0
		UsbStop
		While an0 < 100
			Adcin 0, an0
		Wend
		PORTB = 0xff
		UsbStart
		PORTB = 0
	Endif
	UsbService
Goto loop
End                                               

feature_report_received:
Toggle PORTB.7
Return                                            

feature_report_before_sending:
UsbFtBuffer(0) = UsbFtBuffer(0) - 1
UsbFtBuffer(1) = UsbFtBuffer(1) - 1
UsbFtBuffer(2) = UsbFtBuffer(2) - 1
UsbFtBuffer(3) = UsbFtBuffer(3) - 1
UsbFtBuffer(4) = UsbFtBuffer(4) - 1
UsbFtBuffer(5) = UsbFtBuffer(5) - 1
UsbFtBuffer(6) = UsbFtBuffer(6) - 1
UsbFtBuffer(7) = UsbFtBuffer(7) - 1
Return                                            

output_report_received:
Toggle PORTB.6
Return                                            

input_report_before_sending:
UsbIoBuffer(0) = UsbIoBuffer(0) + 1
UsbIoBuffer(1) = UsbIoBuffer(1) + 1
UsbIoBuffer(2) = UsbIoBuffer(2) + 1
UsbIoBuffer(3) = UsbIoBuffer(3) + 1
UsbIoBuffer(4) = UsbIoBuffer(4) + 1
UsbIoBuffer(5) = UsbIoBuffer(5) + 1
UsbIoBuffer(6) = UsbIoBuffer(6) + 1
UsbIoBuffer(7) = UsbIoBuffer(7) + 1
Return
```

Y aquí pueden ver donde se queda trabado.







He escrito 2 mensajes en el report bug del psi pero jamás recibí respuesta alguna de parte de Vladimir ni tampoco de oshonsoft o quien sea que responda los mensajes (Aclaro que tengo la versión comprada personal del PSI)

Alguien tiene idea que sucede?, se deberá a mala configuración de bytes? Alguien ha tratado esto antes en el PSI?, he encontrado realmente poco respecto del Pic18 Simulator Ide y usb en el internet. Y realmente la página de Oshonsoft la explicación y ejemplos para este tema es muy pobre. Cordiales saludos y gracias de antemano espero poder solucionar esto y que nos sirva a todos.


----------



## josexremix65 (Jun 11, 2013)

Buenas, he seguido este foro, y me ha sido de gran utilidad, Muchisimas gracias por ayudarnos a todos los que estamos aun amateur en este mundo de la electrónica. Tengo una necesidad, en mi universidad, nos pidieron que simuláramos con un micro controlador un proceso, y que por medio de una conexion usb pudiéramos pasar el proceso de forma automática ( la programación del pic ) A manual ( Por medio de un software controlador en la pc, controlar todo el proceso). Lo estoy simulando con unos leds, los cuales hacen el papel de bombas y sistemas de refrescamiento.

Estoy aun en eso, pero si están disponibles, me gustaría que me dieran ideas de como hacerlo mejor, actualmente estoy preguntando por el valor enviado del pc al pic, y dependiendo del valor recibido prende o apaga un led. Pero tengo problemas para pasarlo de automático a manual. La idea es que el pic aun conectado a la pc, ejecute su proceso tranquilamente, y al darle en el software a ( MANUAL ) este se detenga por completo y espere la orden del pc, una ves que en el pc se le de a ( Automático ) El pic continué su proceso tranquilamente, o lo inicie de 0, es indiferente.

De que forma podría hacerlo? tienen algun ejemplo por el cual guiarme? Utilizo VB6 tal como los ejemplos de este tema, el pic 18f2550 y el compilador CCS. Muchas gracias de ante mano.

Anexo dejo mi código fuente, tanto aplicación en CCs para el Pic como, el proyecto en VB6. también las librerías y el driver. Recibo cualquier critica, mejora, ayuda, todo. Muchas gracias.

Nota: Me baso totalmente en los proyectos del inicio de este tema.


----------



## alberto0265 (Jun 11, 2013)

hola estoy tratando de hacer funcionar el proyecto de la pagina nº1 visual C# hid USB,les comento trabajo con un pic18F4550.Les voy a dejar los dos programas,yo cambie el vid y el pid del fuente visualC# por no coincidir con el del fuente c del pic. 


```
/********************************************************************
Programa: Control de dispositivos por USB.
Descripción: HID - DEMO, programa para mostrar el uso del puerto USB 
             en proyectos de control.
Programador: Moyano Jonathan.
Hardware necesario: USB - PIC trainer v0.1 + PicKit2 clon.
Año: 2011.

*********************************************************************/

//=========================================================================

#include <18F4550.h> // Definición de registros internos del PIC18F2550.
//#DEVICE ADC=8 // CAD a 8 bits, justificación a a la derecha.
#DEVICE ADC=10 // CAD a 10 bits, justificación a a la derecha.
//#DEVICE ADC=16 // CAD a 10 bits, justificación a a la izquierda.

#fuses MCLR,HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN,NOPBADEN

// NOMCLR: No vamos ha usar el PIN MCLR, el reset se hará por software.
// HSPLL: Utilizaremos un cristal de alta velocidad en conjunto con el PLL.
// NOWDT: No vamos a usar el perro guardian.
// NOPROTECT: Memoria no protejida contra lecturas.
// NOLVP: No utilizamos el modo de programación con bajo voltaje.
// NODEBUG: No utilizamos código para debugear.
// USBDIV: signfica que el clock del usb se tomará del PLL/2 = 96Mhz/2 = 48Mhz.
// PLL1: significa que el PLL prescaler dividirá la frecuencia del cristal. para HS = 20Mhz, PLL = 5.
//       con esto se obtiene: 20Mhz/5 = 4Mhz.
// CPUDIV1: El PLL postscaler decide la división en 2 de la frecuencia de salida del PLL de 96MHZ, si queremos 48MHZ, lo dejamos como está.
// VREGEN: habilita el regulador de 3.3 volts que usa el módulo USB.
// NOPBADEN: Todo el Puerto B como I/O digitales.

// Usamos una frecuencia de trabajo de 48Mhz.
#use delay(clock=48000000)

//===========================================================================

//========================================================================================================

// Incluimos librerías utilizadas por la aplicación.
#include <pic18_usb.h>                   // Drivers's USB del PIC18F2550.
#include <APLICACION_HID.h>              // Definición de funciones y hardware utilizado en el programa.
#include <Descriptor_easyHID.h>          // Descriptores HID del proyecto.
#include <USB.c>                         // Funciones del USB.
#define USB_EP1_RX_SIZE 32
#define USB_EP1_TX_SIZE 32
#build(reset=0x1000,interrupt=0x1008) //Remapeo
#org 0x0000,0x0FFF {}


// Usamos fast_io, en los puertos B y C.
#use fast_io(b) 
#use fast_io(c)

void USB_debug(){

    LED_ON(LED_RED); // Enciende el led error y apaga el led USB_OK.
    LED_OFF(LED_GREEN);
    usb_wait_for_enumeration(); // Espera a ser enumerado por el host.
    LED_ON(LED_GREEN); // Enciende el led USB_OK y apaga el led USB_ERROR.
    LED_OFF(LED_RED);  
}

void config_adcon2(void) {
   #asm
   movlw 0b10111110 
   iorwf 0xFC0,1    
   #endasm
}

    int8    recibe[USB_EP1_RX_SIZE];                                    // Declaramos la variable recibe de 32 bytes.
    int8    envia[USB_EP1_TX_SIZE];                                     // Declaramos la variable envía  de 32 bytes.
    int8    valorPWM1_H=0;                                              // Valor del semiperiodo alto del PWM1.  
    int8    valorPWM2_H=0;                                              // Valor del semiperiodo alto del PWM2. 
    int8    valorPWM1_L=0;                                              // Valor del semiperiodo bajo del PWM1.
    int8    valorPWM2_L=0;                                              // Valor del semiperiodo bajo del PWM2.
    int8    valorPWM1=0;                                                // Variable que contiene el valor del PWM1.
    int8    valorPWM2=0;                                                // Variable que contiene el valor del PWM2.
    int8    valor_adc_alta=0;                                           // Contiene el MSB del valor del ADC.
    int8    valor_adc_baja=0;                                           // Contiene el LSB del valor del ADC.
  
   
//===========================================================================================================



    // Variables globales.
    void main(void)                                                         // Función Principal.
{    

    // Configuraciones varias.

    set_tris_b(0xF0);                                                   // Nibble bajo salidas, el alto entradas.
    output_b(0x00);                                                     // Inicializamos las salidas a 0.
    set_tris_c(0b00111000);                                             // RC0,RC1,RC2,RC6,RC7,como salidas. Las demás Rc3
                                                                        // RC4,RC5, como entradas.

    setup_adc_ports(AN0_TO_AN2);                                        // Configura canales usados por el ADC.
    setup_adc(ADC_CLOCK_DIV_64);                                        // Asigna la velocidad: relog\64.
    config_ADCON2();                                                    // Configuramos el ADCON2.


    LED_OFF(PWM1);                                                      // Apagamos ambos canales PWM.
    LED_OFF(PWM2);
    usb_init();                                                         // Inicializamos el stack USB.

    usb_task();                                                         // Habilita el periferico usb y las interrupciones.
    USB_debug();                                                        // Nos muestra el estado de conección del USB.                                                       


    while (TRUE)                                                        // Bucle infinito.
    {
        if(usb_enumerated())                                            // Si el dispositivo está configurado...
        {
                    // PWM por software correspondiente al canal 1.
                    valorPWM1_H=valorPWM1;
                    valorPWM1_L=255-valorPWM1_H;
                    for(valorPWM1_H;valorPWM1_H>0;valorPWM1_H--){
                    LED_ON(PWM1);}
                    for(valorPWM1_L;valorPWM1_L>0;valorPWM1_L--){
                    LED_OFF(PWM1);
                    }
                    // PWM por software correspondiente al canal 2.
                    valorPWM2_H=valorPWM2;
                    valorPWM2_L=255-valorPWM2_H;
                    for(valorPWM2_H;valorPWM2_H>0;valorPWM2_H--){
                    LED_ON(PWM2);}
                    for(valorPWM2_L;valorPWM2_L>0;valorPWM2_L--){
                    LED_OFF(PWM2);
                    }

   // Leemos el estado de los pulsadores.                 
   if(input_state(SW1)==0x01){delay_ms(20); envia[0]=0x01;}else{envia[0]=0x00;}
   if(input_state(SW2)==0x01){delay_ms(20); envia[1]=0x01;}else{envia[1]=0x00;}
   if(input_state(SW3)==0x01){delay_ms(20); envia[2]=0x01;}else{envia[2]=0x00;}
   if(input_state(SW4)==0x01){delay_ms(20); envia[3]=0x01;}else{envia[3]=0x00;}

   // Leemos 2 canales analógicos del PIC.

                    set_adc_channel(0);                                 // Seleccionamos el canal 0 y comenzamos a leer.
                    delay_us(10);                                       // Esperamos un tiempo para estabalizar el dato leido.
                    valor_adc_alta = (read_adc()>>8);                   // Enviamos la parte alta de la conversión de 10 bits.
                    valor_adc_baja = (int)(read_adc());                 // Enviamos la parte baja de la conversión de 10 bits.
                    envia[4]=valor_adc_alta;
                    envia[5]=valor_adc_baja;


                    set_adc_channel(2);                                 // Seleccionamos el canal 2 y comenzamos a leer.
                    delay_us(10);                                       // Esperamos un tiempo para estabalizar el dato leido.
                    valor_adc_alta = (read_adc()>>8);                   // Enviamos la parte alta de la conversión de 10 bits.
                    valor_adc_baja = (int)(read_adc());                 // Enviamos la parte baja de la conversión de 10 bits.
                    envia[6]=valor_adc_alta;
                    envia[7]=valor_adc_baja;

 usb_put_packet(1, envia, USB_CONFIG_HID_TX_SIZE, USB_DTS_TOGGLE);      // Enviamos el paquete de datos por USB.

            if (usb_kbhit(1))                                           // Si hay un paquete de datos del host.. en el buffer lo tomamos y guardamos en la variable data.
            {
                usb_get_packet(1, recibe, USB_CONFIG_HID_RX_SIZE);      // En el buffer lo tomamos del EP1 y lo guardamos en la variable recibe....
                                                                       
                if(recibe[0]==ACTIVA_SALIDAS){                          // Si recibe comando de control de salidas...
                     
                        switch(recibe[1]){                              // Según el dato que recibe, activa o desactiva los led's.
                        case LED_1:
                        output_toggle(PIN_B0);                          // Cambia de estado el LED1.
                        break;
                        case LED_2:
                        output_toggle(PIN_B1);                          // Cambia de estado el LED2.
                        break;
                        case LED_3:
                        output_toggle(PIN_B2);                          // Cambia de estado el LED3.
                        break;
                        case LED_4: 
                        output_toggle(PIN_B3);                          // Cambia de estado el LED4.
                        break;
                         }
                    }
                if(recibe[0]==PWM_CONTROL1)                             // Si recibimos el comando de control PWM1..
                {valorPWM1=recibe[2];}                                  // Tomamos el dato y lo procesamos.
       
                if(recibe[0]==PWM_CONTROL2)                             // Si recibimos el comando de control PWM2..
                {valorPWM2=recibe[3];}                                  // Tomamos el dato y lo procesamos.
                
            }
        }
    }
}              

aca va el C#
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.ComponentModel;
using System.Runtime.InteropServices;

namespace MecaniqueUK
{
    class EasyHID
    {
        // HID specific...
        public const UInt32 VENDOR_ID = 1781;
        public const UInt32 PRODUCT_ID = 07D0;
        public const int BUFFER_IN_SIZE = 32;
        public const int BUFFER_OUT_SIZE = 32;

        // HID events...
        private const int WM_APP = 0x8000;
        public const int WM_HID_EVENT = WM_APP + 200;
        public const int NOTIFY_PLUGGED = 0x0001;
        public const int NOTIFY_UNPLUGGED = 0x0002;
        public const int NOTIFY_CHANGED = 0x0003;
        public const int NOTIFY_READ = 0x0004;

        // HID interface...
        [DllImport("mcHID.dll")]
        public static extern bool Connect(IntPtr pHostWin);
        [DllImport("mcHID.dll")]
        public static extern bool Disconnect();
        [DllImport("mcHID.dll")]
        public static extern UInt32 GetItem(UInt32 pIndex);
        [DllImport("mcHID.dll")]
        public static extern UInt32 GetItemCount();
        [DllImport("mcHID.dll")]
        public static extern bool Read(UInt32 pHandle, IntPtr pData);
        [DllImport("mcHID.dll")]
        private static extern bool Write(UInt32 pHandle, IntPtr pData);
        [DllImport("mcHID.dll")]
        private static extern bool ReadEx(UInt32 pVendorId, UInt32 pProductId, IntPtr pData);
        [DllImport("mcHID.dll")]
        private static extern bool WriteEx(UInt32 pVendorId, UInt32 pProductId, IntPtr pData);
        [DllImport("mcHID.dll")]
        public static extern UInt32 GetHandle(UInt32 pVendorID, UInt32 pProductId);
        [DllImport("mcHID.dll")]
        public static extern UInt32 GetVendorID(UInt32 pHandle);
        [DllImport("mcHID.dll")]
        public static extern UInt32 GetProductID(UInt32 pHandle);
        [DllImport("mcHID.dll")]
        public static extern UInt32 GetVersionID(UInt32 pHandle);
        [DllImport("mcHID.dll")]
        public static extern UInt32 GetInputReportLength(UInt32 pHandle);
        [DllImport("mcHID.dll")]
        public static extern UInt32 GetOutputReportLength(UInt32 pHandle);
        [DllImport("mcHID.dll")]
        public static extern void SetReadNotify(UInt32 pHandle, bool pValue);
        [DllImport("mcHID.dll")]
        public static extern bool IsReadNotifyEnabled(UInt32 pHandle);
        [DllImport("mcHID.dll")]
        public static extern bool IsAvailable(UInt32 pVendorId, UInt32 pProductId);

        // Managed version of the read/write functions.
        public static bool Read(UInt32 pHandle, out byte[] pData)
        {
            IntPtr unmanagedBuffer = Marshal.AllocHGlobal(BUFFER_IN_SIZE);
            bool result = Read(pHandle, unmanagedBuffer);

            try { pData = new byte[BUFFER_IN_SIZE]; Marshal.Copy(unmanagedBuffer, pData, 0, BUFFER_IN_SIZE); }
            finally { Marshal.FreeHGlobal(unmanagedBuffer); }

            return result;
        }

        public static bool Write(UInt32 pHandle, byte[] pData)
        {
            IntPtr unmanagedBuffer = Marshal.AllocHGlobal(BUFFER_OUT_SIZE);
            bool result;

            try { Marshal.Copy(pData, 0, unmanagedBuffer, BUFFER_OUT_SIZE); result = Write(pHandle, unmanagedBuffer); }
            finally { Marshal.FreeHGlobal(unmanagedBuffer); }

            return result;
        }

        }
    }
Cambio de vid,pid
namespace MecaniqueUK
{
    class EasyHID
    {
        // HID specific...
        public const UInt32 VENDOR_ID = 1781;
        public const UInt32 PRODUCT_ID = 07D0;
        public const int BUFFER_IN_SIZE = 32;
        public const int BUFFER_OUT_SIZE = 32;



#ifndef __USB_DESCRIPTORS__
#define __USB_DESCRIPTORS__

#ifndef USB_CONFIG_PID
   #define USB_CONFIG_PID  0x07D0  // PID easyHID, configurado por el usuario.
#endif

#ifndef USB_CONFIG_VID
   #define  USB_CONFIG_VID 0x1781  // VID easyHID, configurado por el usuario.
#endif
```

El funcionamiento es el siguiente teniendo habierto el control desde la pc conecto el usb de mi placa oprimo DISPOSITIVO CONECTADO y lo hacepta como conectado.Si lo desconecto y oprimo DIS-CON nuevamente confirma la desconeccion hasta ahora todo bien el problema es que no me indica ni entradas ni salidas ,nada,lo unico que se obserba en la placa es el cambio de led de la enumeracion.
Comento yo tengo un booloader cargado en el pic que esta en C18 y en otr momento queria cargar un programa para dimerizar led y buscando en un foro encontre el que yo puse como remapeo y funciono.
Tendra esto que ver en el problema.
Desde ya un gran abazo.


----------



## alberto0265 (Jun 11, 2013)

Hola nuevamente cargue el programa directamente al pic4550 sin booloader y hace lo mismo, si alguien se le ocurre algo avise .
gracias nuevamente


----------



## Moyano Jonathan (Jun 11, 2013)

> Les voy a dejar los dos programas,yo cambie el vid y el pid del fuente visualC# por no coincidir con el del fuente c del pic



Muy raro esto que contas, yo cuando lo cargué al proyecto funcionaba todo OK y el VID/PID era correcto.
De todas maneras lo voy a revisar.



> El funcionamiento es el siguiente teniendo habierto el control desde la pc conecto el usb de mi placa oprimo DISPOSITIVO CONECTADO y lo hacepta como conectado.Si lo desconecto y oprimo DIS-CON nuevamente confirma la desconeccion hasta ahora todo bien el problema es que no me indica ni entradas ni salidas ,nada,lo unico que se obserba en la placa es el cambio de led de la enumeracion.



Puede ser que el software para la PC tenga algunos errores, estaría bueno que subas un video corto del comportamiento del software para ver que es lo que sucede.

Saludos !


----------



## josexremix65 (Jun 12, 2013)

Moyano, he seguido tu post mucho, pero al trabajar en windows 7, los softwares controladores de VB6 no me corren, solo me corren los del easy HID, pero no lo consigo por ninguna parte, podrías facilitarme un enlace para descargarlo?, Muchas gracias de antemano.


----------



## Meta (Jun 12, 2013)

Buenas Moyano:

Ya que la tecnología cambia, el XC8 cada vez se usa más y hay muchos videotutoriales sobre el MPLAB X. El C18 dicen que se dejará de actualizar con el tiempo, el MPLAB v8.92 se quedará ahí y no se incluirán nuevos dispositivos pero si estará para su descarga.

No se si tendrás tiempo. 

¿Podrás hacer algún tutorial o manual con el XC8, MPLAB X y C# sobre USB en el futuro?

Un saludo.


----------



## Moyano Jonathan (Jun 12, 2013)

> Moyano, he seguido tu post mucho, pero al trabajar en windows 7, los softwares controladores de VB6 no me corren, solo me corren los del easy HID, pero no lo consigo por ninguna parte, podrías facilitarme un enlace para descargarlo?, Muchas gracias de antemano.



El controlador mcHID.dll está en el archivo de descarga de la primera página, junto al software en Visual C# para usarlo. Quiero aclarar que yo he probado algunos programas viejos de VB 6.0 en Win 7 de 32 y 64 bits y han funcionado. De todas maneras te recomiendo que pases directamente a VB.net 2010 - 2012.



> ¿Podrás hacer algún tutorial o manual con el XC8, MPLAB X y C# sobre USB en el futuro?



No uso MPLAB, ni XC8. Si voy realizar un manual nuevo con más funcionalidades, otro controlador USB más estandar y voy a usar CCS. Esto último por que es el compilador que *a mi parecer* está más difundido en el ambiente de desarrollo.

Sobre cuando lo voy a terminar, no se, pero en cuanto lo termine lo voy a publicar.

Saludos !


----------



## josexremix65 (Jun 12, 2013)

Ok, ahora tengo otro problema, tomando como base los ejemplos que tu dejaste, funcionan perfectamente, sin prpblemas vuando utilizo ese. HEX, pero si tomo ese proyecto en MPLAB, y lo compilo con la libreria que dejas tambien een el ejemplo, sin cambiarle nada, no lo reconoce el software controlador, solo reconoce el. HeX que tu ddejas, pero el compilado por mi no. A que se puede deber? Disculpa la molestia, pero es para un trabajo de la uni yla verdad es uno de esos profesores que ni van a clases. Muchas gracias, he aprendido mucho en eeste post, me decidi por el HID por ser nativo de windows, agradesco toda ayuda

Uso mplab y compilador ccs


----------



## Moyano Jonathan (Jun 12, 2013)

Sinceramente no entiendo por que no te funciona, si no has modificado nada te tiene que andar. Quizás sea la versión del compilador. Yo lo compilé con la v4.114 o v4.104....alguna de esas 2. 
Tengo que avisarte que hace mucho que no toco los ejemplos de USB por mis obligaciones académicas, trabajo, etc.


----------



## josexremix65 (Jun 12, 2013)

ok, muchas gracias por tu tiempo, estoy siguiendo paso a paso tu guía. Me parece muy ilustrativa, cambiare el ccs a esa versión y avisare cualquier resultado. Espero sea positivo, muchas gracias por tu trabajo.


----------



## alberto0265 (Jun 12, 2013)

Yo tengo la version ccs pcwhd 4.068 osea que como yo tuve que compilar por usar un pic18f4550,es por eso que no funciona,sin ofender a esperar un tuto en c18.
Un abrazo


----------



## josexremix65 (Jun 12, 2013)

Ya termine de seguir tu guia paso a paso, me pareció bastante buena e  interactiva, todo funciona bien, pero no el HOST no me reconoce aun al  dispositivo, es igual un 18f2550 y uso CCS 4.1. También, al compilar tus  trabajos, dejan de ser reconocidos, queria saber si podria subir el  proyecto aqui ( El host en Visual C# y la aplicación del pic en CCS  ademas de la libreria ) Para que le echaras un ojo, y si puedes, me  dijeras que hago mal. De verdad me interesa mucho el tema y en mi  universidad, mi profesor es un vago, y me frustra un poco el que aun no  pueda hacer funcionar el primer proyecto. Agradecería mucho tu ayuda.

Si estas en las posibilidades de echarle un ojito, subiría lo mas pronto posible el código. 

Bueno, adjunto dejo los archivos, de verdad me gustaría que me ayudaran con esto. El proceso aun no esta establecido, solo quiero que primero me conecte el pic con el HOST. Muchas gracias a todos, de verdad. 

No se si es por mis librerías pic18_usb,  usb.c o la de descripciones, pero uso su mismo codigo y no me funciona u.u ya estoy algo desilusionado conmigo, no logro que funcione ni el 1ero, y he intentado con HID, CDC, y EasyHiD. incluso seguí tu guía paso a paso, y actualice el CCS a la ultima versión. En verdad necesito ayuda y saber que hago mal u.u Muchas gracias.


Adjunto envío de igual forma, las librerias de mi CCS y el ejemplo 4 que tu proporcionaste pero compilado por mi. Nada me funciona y debo entregar un avance para la otra semana u.u, Si pueden decirme que estoy haciendo mal, se los agradeceria muchisimo, me conformaría con poder modificar un ejemplo hasta que haga lo que necesito, pero si los compilo no los reconocen los controladores.

Si me hace falta alguna libreria, si debo modificar otra, lo que sea, sera de gran ayuda. Repito, utilizo la libreria modificada de descripcion que viene en el mismo ejemplo y luego de compilar, no los reconoce. Lo he compilado en el MPLAB y directo del CCS.

SOS.


*
Nota del Moderador:*
Por favor edita tus mensajes, no crees nuevos.


----------



## alberto0265 (Jun 14, 2013)

josexremix65: Tu tienes el mismo problema que yo, desinstale la versión 4.068 que al principio me compilaba
la aplicación_hid, cambie por la aplicación 4.104 y nada, por la 4.114 y nada, volví nuevamente a la primera y no lo compila mas.
Ahora estoy buscando las versiones 4.104,4.110 y si consigo la 4.114 pero de otros link.
Tal vez estén modificados los usb.h, usb.c y el pic18_usb.h.
Lo que más me llama la aten*c*ión es mi primera versión, lo compilaba y cuando lo reinstale no lo co*m*pilo mas,
eso que me tome el trabajo de borrar la carpeta picc que queda después de la desinstalación.
Al final se me terminó por complicar todo el trabajo. Saludos



Bueno conseguí compilarlo con la versión 4.110.
Dejo el link *www.políticasdelforo.com*
Un abrazo.



Bueno moyano funciona todo, era el compilador (la versión 4.068) no funciona para esto.
Ojo para los que tengan este problema no todos los compiladores que están en la web funcionan,
el que los colgó por algún motivo modifico funciones.
Gracias

buenas otra vez por acá, Moyano tendras otra forma de remapeo la mía no funciona en este caso,yo uso el hid booloader c18
#build(reset=0x1000,interrupt=0x1008)
#org 0x0000,0x0FFF {}
Desde ya se agradece

Aclaro que sin booloader ya funciona real en el pic18f4550 

*Como no cumplo las Políticas del Foro. Me editaron el mensaje.*​


----------



## Moyano Jonathan (Jun 14, 2013)

alberto0265 como estás.

- Antes que nada te digo que no se pueden colgar archivos de programas pirata dentro del foro.

- Yo lo compilé con la versión 4.114 (Cualquier versión mayor tiene que funcionar).

- No te podría decir como implementar los ejercicios utilizando el bootloader, nunca lo he utilizado de esa
  manera.

josexremix65:



> Ya termine de seguir tu guia paso a paso, me pareció bastante buena e interactiva, todo funciona bien, pero no el HOST no me reconoce aun al dispositivo, es igual un 18f2550 y uso CCS 4.1. También, al compilar tus trabajos, dejan de ser reconocidos, queria saber si podria subir el proyecto aqui



El proyecto está completo y funcionando en la primera página. Está compilado con la versión de CCS
v4.114 o superior. Si tenés problemas con tu proyecto puede ser un tema hardware...o los drivers de
tu PC, o el controlador USB de tu PC en el peor de los casos.



> Adjunto envío de igual forma, las librerias de mi CCS y el ejemplo 4 que tu proporcionaste pero compilado por mi. Nada me funciona y debo entregar un avance para la otra semana u.u, Si pueden decirme que estoy haciendo mal, se los agradeceria muchisimo, me conformaría con poder modificar un ejemplo hasta que haga lo que necesito, pero si los compilo no los reconocen los controladores.



Vas a tener que revisar bien tu ejercicio e investigar adecuadamente para poder desarrollar el programa. Yo personalmente no puedo implementar una solución a tu caso en particular, pero te recomiendo investigar más a fondo el hilo y en otras páginas de internet.


----------



## alberto0265 (Jul 1, 2013)

Je,je tengo funcionando el ejemplo de microchip Hid pnp demo en C18 limpio para el 18f4550 y C# en la PC.
Para el que necesite lo que tengo me envia un mail.
Saludos a todos.                  



Me olvide le adjunte un boton para encender y apagar un led en la salida D3 del 4550.



Hay que aclarar  que este tipo de software  funciona con la dll que trae window y creo que tambien con 
otras dll aunque no lo probe.
Funciona en 32 y 64 bits cuando se lo construye en Modo / / "x86" en el C#,y lo hace muy bien sin tantos percanses como el ccs,ademas esta para que funcione cargandolo por medio de booloader con la ventaja 
para los que no conocen bien el C# y el C18 de probar y reprobar constantemente las modificaciones.


----------



## josexremix65 (Jul 1, 2013)

Ya lo tengo todo operativo, debo entregar el proyecto en 2  semanas, ya funciona, le doy los últimos detalles.

El proyecto se basa en, Un control SCADA para el sistema de llenado de camiones cisterna en el Edo Zulia. Este SCADA debe conectarse al controlador mediante USB, debe soportar salidas y entradas analogicas de 4-20 mA, entradas y salidas  discretas de 110V AC, poder pasarse de Automatico a Manual y debe contar de un despliegue.

Ya funciona aunque aun tengo unos detalles con unas alarmas.

Esta en CCS y VB6, Basado en el ejemplo de Jonathan, protocolo HID y el pic esta en esclavo, lo que indica que, el SCADA debe enviar una petición cada 100ms para que el pic le actualice sus estado.

No cumple con ningun standart porque es solo con propósitos académicos. Una ves que este listo lo subire todo al foro, para que sirva de antecedente a cualquier otra persona.

Muchas Gracias a Jonathan, tu ejemplo fue anillo al dedo.


----------



## thunder2 (Jul 5, 2013)

Hola Moyano, la comunicación USB la puedo hacer con el PIC18F2550 o PIC18F4550 o con los dos?, veo mucha información. Ademas del USB-HID puede ser modificable?


----------



## Moyano Jonathan (Jul 6, 2013)

> Hola Moyano, la comunicación USB la puedo hacer con el PIC18F2550 o PIC18F4550 o con los dos?



Con cualquiera de los dos podés implementar la comunicación USB.



> Ademas del USB-HID puede ser modificable?



No entiendo tu pregunta.

Saludos !


----------



## josexremix65 (Jul 11, 2013)

Lo prometido es deuda, Gracias especiales a Jonathan, aquí les traigo el proyecto que entregue, de toda la sección hasta ahora soy el único que no lo mando a hacer, aquí lo dejo como aporte para que sirva de antecedente.

Aquí dejo todo lo necesario.

Cristal a 20Mhz.
No tengo en este momento disponible la simulación, luego la coloco para que lo simulen
Pic18f4550

Los archivos disponibles son:

El ejecutable con su codigo fuente.
La aplicacion al PIC.
Manual de usuario bastante sencillo.
Protocolo de comunicacion.
Datos tecnicos.
Despliegue del proceso.
Un paint con el diagrama instrumentado del proceso.


En el proceso, se conecto el Micro Controlador a una fuente de 4 a 20 mA digital, para general la salida a la válvula de control mediante sus respectivos opto-acopladores
Se utilizo unos periféricos para que el Pic pudiera leer una señal entrante de 110Vac como un uno logico.
Cambien una combinación de transistores, optacopladores y relees para que pudiera emitir 110Vac hacia unas bombas de llenado.

La entrada del tanque, se implemento con un transmisor de nivel de 4-20 mA, conectado a una resistencia de 250 Omnios. Luego se coloco la entrada AN0 en paralelo con dicha resistencia, y mide su voltaje, lo que es una medida indirecta de su corriente, y por lo tanto del nivel del tanque.
El escalamiento se realizo mediante EL HOST, el pic envía de forma directa el dato analógico recibido, mediante el protocolo claro esta.

Siéntanse libres de usarlo como antecedentes, codificarlo y demás para sus proyectos.


----------



## thunder2 (Jul 11, 2013)

Hola Moyano, hice el intento del ejemplo 1 que tienes tu de ejemplo en la primera pagina del post, pero he programado mis micros 18F2550 y 18F4550, pero mi computador es un AMD turon 32 bits y el bendito computador da dispositivo desconocido. Como le hago o tendre que cambiar de maquina?

Perdón por molestarte y buen día....


----------



## acj8991 (Jul 21, 2013)

Moyano Gracias por la info me lei las 109 paginas completas ...
la info esta exelente...
Soy nuevo en el Foro y queria hacerte una pregunta yo ya hice en hid y en cdc mis experminetos y ya logre comunicarlos con el pc pero mi problema es el siguiente en Hid la aplicacion la estoy haciendo en Visual Basic . net  y no entindo muy bien como funciona el HIDWRITE y el HIDREAD

geacias.....


----------



## Sant0 (Ago 11, 2013)

Muy bueno el post Moyano.
Todavía no terminé de leerlo todo, llegué a ver el ejemplo de 4 salidas digitales, 4 entradas digitales y 2 PWM.

Lo que no entiendo bien es porque no me funcionan unas modificaciones del código en CCS.
Cargo el .HEX y anda. alguien me podría dar los archivos pero con el .pjt.
Quizás estoy haciendo algo mal con eso.

Además otra cosa q*ue* todavía no entiendo es porq*ue* ese mismo proyecto no funciona con WIN 7 de 64 bits.
Probé en otra PC (siguiendo los mismos pasos) con WIN 7 de 32bits y anduvo. 

Gracias por su tiempo!


----------



## Moyano Jonathan (Ago 11, 2013)

> Hid la aplicacion la estoy haciendo en Visual Basic . net y no entindo muy bien como funciona el HIDWRITE y el HIDREAD



No uso VB.net...solo Visual C# pero HIDWRITE y HIDREAD, administran la salida y entrada de datos respectivamente del puerto USB. Son funciones para enviar o recibir datos. Investiga en internet acerca de VB.net e easyHID, vas a encontrar mucha información relevante.



> Lo que no entiendo bien es porque no me funciona unas modificaciones del codigo en CCS.



Dependen de que modificaciones sean.



> Ademas otra cosa q todavia no entiendo es porq ese mismo proyecto no funciona con WIN 7 de 64 bits. Probe en otra PC (siguiendo los mismos pasos) con WIN 7 de 32bits y anduvo.



El proyecto fue compilado para 32 bits originalmente, pero tendría que funcionar en 64 bits. Lo que hay que hacer es crear nuevamente el proyecto y compilarlo para 64 bits.

Saludos !


----------



## chelicote (Ago 11, 2013)

Una consulta por el asunto USB-CDC CCS  pic18f4550, el problema que tenía era que se tildaba el programa o que perdía la comunicación cada 5, 10 o 20 mins. Para mejorar esto intenté varias casas entre ellas utilicé el SENSE PIN, con esto mejoró bastante, aunque también se tildaba cada tanto.
Ahora cambie la declaración del fichero (#include "usb_cdc.h" ) por el (#include <usb_cdc.h> )
Desde entonces veo que no se tilda. ¿Quisiera saber si ha alguien le a pasado algo similar "master Moyano Jonathan" ?
Ya que según el manual se lo pueden declarar de de esas dos formas.
Aclaro que probé con varias PC tanto con window xp y window7 ambas de 32 bits y versiones del CCS 4.1


----------



## Sant0 (Ago 12, 2013)

Hola de nuevo!, gracias por la respeusta.

quizas no me exprese del todo bien. Conserve el programa en C# y use el mismo codigo, borrando todo lo que no era para el control de los 4 leds de la salida B0, B1, ... 
El dispositvo no me lo reconoce y otra cosa curiosa es que tuve que cambiar el orden de los "include" ya que me tiraba error "USB_EP1_RX_SIZE" (y otras mas) diciendo que estaba fuera del rango.

¿Que podria ser? ¿Tendra que ver con la version del CCS (v 4.023) ?
¿Si uso un cristal de 20MHz cambia mucho si lo pongo o no en el codigo?

Me parece que estoy haciendo algo mal con el Project Wizard; ¿alguien tendria los archivos con el .pjt (proyecto) que le este andando??

Desde ya muchas gracias!


----------



## Moyano Jonathan (Ago 12, 2013)

> ¿Que podria ser? ¿Tendra que ver con la version del CCS (v 4.023) ?


 Tenés que usar la versión 4.114 o superior.


----------



## colmenares58 (Ago 12, 2013)

les agradeceria me dijeran donde o como consigo el archivo easyHID.cs, es para un proyecto de Moyano 
Jonathan


----------



## Sant0 (Ago 13, 2013)

Al final se pudo!!  gracias Moyano, al final era la version del ccs. 

Aqui el Easy.cs que use para el proyecto (no de mi autoria, esta en el post) :


```
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.ComponentModel;
using System.Runtime.InteropServices;

namespace MecaniqueUK
{
    class EasyHID
    {
        // HID specific...
        public const UInt32 VENDOR_ID = 6017;
        public const UInt32 PRODUCT_ID = 2000;
        public const int BUFFER_IN_SIZE = 32;
        public const int BUFFER_OUT_SIZE = 32;

        // HID events...
        private const int WM_APP = 0x8000;
        public const int WM_HID_EVENT = WM_APP + 200;
        public const int NOTIFY_PLUGGED = 0x0001;
        public const int NOTIFY_UNPLUGGED = 0x0002;
        public const int NOTIFY_CHANGED = 0x0003;
        public const int NOTIFY_READ = 0x0004;

        // HID interface...
        [DllImport("mcHID.dll")]
        public static extern bool Connect(IntPtr pHostWin);
        [DllImport("mcHID.dll")]
        public static extern bool Disconnect();
        [DllImport("mcHID.dll")]
        public static extern UInt32 GetItem(UInt32 pIndex);
        [DllImport("mcHID.dll")]
        public static extern UInt32 GetItemCount();
        [DllImport("mcHID.dll")]
        public static extern bool Read(UInt32 pHandle, IntPtr pData);
        [DllImport("mcHID.dll")]
        private static extern bool Write(UInt32 pHandle, IntPtr pData);
        [DllImport("mcHID.dll")]
        private static extern bool ReadEx(UInt32 pVendorId, UInt32 pProductId, IntPtr pData);
        [DllImport("mcHID.dll")]
        private static extern bool WriteEx(UInt32 pVendorId, UInt32 pProductId, IntPtr pData);
        [DllImport("mcHID.dll")]
        public static extern UInt32 GetHandle(UInt32 pVendorID, UInt32 pProductId);
        [DllImport("mcHID.dll")]
        public static extern UInt32 GetVendorID(UInt32 pHandle);
        [DllImport("mcHID.dll")]
        public static extern UInt32 GetProductID(UInt32 pHandle);
        [DllImport("mcHID.dll")]
        public static extern UInt32 GetVersionID(UInt32 pHandle);
        [DllImport("mcHID.dll")]
        public static extern UInt32 GetInputReportLength(UInt32 pHandle);
        [DllImport("mcHID.dll")]
        public static extern UInt32 GetOutputReportLength(UInt32 pHandle);
        [DllImport("mcHID.dll")]
        public static extern void SetReadNotify(UInt32 pHandle, bool pValue);
        [DllImport("mcHID.dll")]
        public static extern bool IsReadNotifyEnabled(UInt32 pHandle);
        [DllImport("mcHID.dll")]
        public static extern bool IsAvailable(UInt32 pVendorId, UInt32 pProductId);

        // Managed version of the read/write functions.
        public static bool Read(UInt32 pHandle, out byte[] pData)
        {
            IntPtr unmanagedBuffer = Marshal.AllocHGlobal(BUFFER_IN_SIZE);
            bool result = Read(pHandle, unmanagedBuffer);

            try { pData = new byte[BUFFER_IN_SIZE]; Marshal.Copy(unmanagedBuffer, pData, 0, BUFFER_IN_SIZE); }
            finally { Marshal.FreeHGlobal(unmanagedBuffer); }

            return result;
        }

        public static bool Write(UInt32 pHandle, byte[] pData)
        {
            IntPtr unmanagedBuffer = Marshal.AllocHGlobal(BUFFER_OUT_SIZE);
            bool result;

            try { Marshal.Copy(pData, 0, unmanagedBuffer, BUFFER_OUT_SIZE); result = Write(pHandle, unmanagedBuffer); }
            finally { Marshal.FreeHGlobal(unmanagedBuffer); }

            return result;
        }

        }
    }
```


*******************
Consulta, como se puede hacer para que con un boton se prenda y apague un LED hasta que se envie otra instruccion? Alguno tiene alguna idea?

Desde ya muchas gracias!


----------



## Moyano Jonathan (Ago 16, 2013)

> Consulta, como se puede hacer para que con un boton se prenda y apague un LED hasta que se envie otra instruccion? Alguno tiene alguna idea?


 Podrías dar más presiciones con respecto a esto último. No entiendo si necesitas un led que se prenda a modo de gráfico en la aplicación o que vos puedas encender un led externo desde la aplicación.


----------



## Sant0 (Ago 20, 2013)

Hola nuevamente!

A lo que me refiero es prender una cierta secuencia de LEDS y cuando se reciba por USB otra instruccion que cambie la secuencia de encendido.

Si tuviera 2 botones en la aplicacion y uno de ellos hiciera en un bucle una secuencia como prender led1, led2, led3, apagar, y de nuevo.

Quiero que se interrumpa esta secuencia cuando recibe el otro dato. Mi problema radica en que si lo dejo en un bucle al PIC para el encendido, luego como salgo de ese estado para seguir recibiendo otros datos??

Gracias de antemano.

-----------------------------------
Hola gente!

Me surgio otra duda: ¿hay forma de acelerar el tiempo que el pic procesa los datos?

Basado en los ejemplos de este post modifique uno delos botones de la aplicacion de c# con la idea de prender varios LEDS (secuencia) y que sea lo mas rapido posible.


```
private void led4_btn_Click(object sender, EventArgs e)
        {
            byte[] BufferOUT = new byte[EasyHID.BUFFER_OUT_SIZE];
            BufferOUT[0] = 0;      // Report ID
            BufferOUT[1] = 0x0A;   // Primero enviamos un comando de control al dispositivo: 

            byte i;

            for (i = 0; i < 255; i++)
            {
                BufferOUT[2] = i;
                EasyHID.Write(controlador, BufferOUT); // Envía los datos.
            }
}
```

El pic solo esta programado para prender los leds segun su entrada.. es decir que si mando 255 prende todos, 0 ninguno etc.

¿Ideas?


Gracias nuevamente!


----------



## Rijiru (Sep 23, 2013)

Hola, gente del foro, al igual que todos he estado siguiendo ésta tematica, sin embargo, estoy probando en una aplicación hecha por un servidor mi problema es que curiosamente al enviar un bloque de varios Bytes del host al PIC, en el byte numero 18, los datos se truncan, en el siguiente bloque lo mismo, hasta que en un tiempo la aplicación se detiene por un error(curiosamente en el Byte #18) me dice: "El dispositivo no funciona".


----------



## jkikegavilan (Oct 3, 2013)

Muy buenos días, he estado siguiendo el tema y gracias a todos sus aportes y la dedicación de Moyano  tengo una mejor idea de como usar el modulo usb de los pic 18, quiero preguntarles si alguno de usted ha realizado una conexión usb a un dispositivo móvil, ya que debo hacer una tarjeta de muestreo que pueda conectarse a un dispositivo móvil con SO ANDROID desde la versión 2.3 a la 4 y este debe tener la interfaz de visualización, pero estoy confundido en que tipo de comunicación debería realizarse si HID o BULK? ademas de como programar la interfaz en ANDROID, saludos y muchas gracias por cualquier aporte.


----------



## acj8991 (Oct 16, 2013)

Maestro Moyamano...

y en general a todos los compañeros del foro, queria preguntarle si alguno ya instalo el driver cdc en win 8 y si alquien ya lo realizo me podria decir uqeu hiso gracias....


----------



## COSMICO (Oct 17, 2013)

Amigo acj8991.
Primero que todo, no me le ponga apodos al amigo Moyano , que es muy buena gente.
Ahora si en serio, ya probe este driver en windows 8 de mi portatil y no funciono.


----------



## erml075 (Oct 20, 2013)

amigo moyano, saludes desde colombia, te cuento, estoy trabajando en un proyecto de grado en el cual creo que tu podrias ayudarme con tu conocimiento para poder comenzar a desarrollarlo, el proyecto lo he  dividido en etapas, y no he podido comenzar por que no conosco mucho de la primera etapa por no decir que nada pero por lo visto en estos foros tu si, puedo contar con tu ayuda?? existe algun medio de comunicacion mas continuo??


----------



## Moyano Jonathan (Oct 20, 2013)

Hola como estás.

Si es tu proyecto de grado podrías empezar por deducir que es lo que necesitas hacer con el mismo. Luego dividir en etapas el desarrollo.
Si alguna de las etapas tiene conectividad USB, en este hilo podrás poner tus dudas al respecto y ver como las podemos solucionar entre todos.

Saludos !


----------



## EL SHABRI (Oct 30, 2013)

Cordiales saludos a todos………
Acudo a Uds. Con la firme convicción de contar con su ayuda en un problema en el que me encuentro el cual paso a describir a continuación:
Estoy desarrollando un proyecto con comunicación USB, para ello estoy empleando el PIC18F2550 que es el encargado de recibir y enviar datos desde y hacia la PC por medio del bus USB clase CDC, cuento con una tarjeta de proceso en la cual dispongo de un XMEGA de ATMEL el mismo que recibe y envía datos desde y hacia el PIC18F2550 por medio de comunicación serial RS-232, en la transmisión de datos en el sentido PC->PIC18F2550->XMEGA no tengo inconvenientes, el problema surge cuando quiero enviar los datos resultados del proceso en el sentido XMEGA->PIC18F2550->PC, ya que en el PIC he intentado recibir los datos por medio de la interrupción INT_RDA(Interrupción del puerto USART); pero dicha interrupción no se produce ya que al compilar el programa del PIC los warnings indican que las interrupciones se encuentran deshabilitadas, también he intentado recibir los datos de la comunicación serial sin utilizar la interrupción es decir directamente en la función MAIN() con la instrucción FGETS(DATOS) pero ocurre que se pierde la comunicación USB y el programa se queda como estancado en alguna de las librerías incluidas, porque no se ejecuta ni esta instrucción FGETS(DATOS).
He probado por separado la comunicación USB PIC18F2550<->PC y la comunicación XMEGA<->PIC18F2550 y funciona de maravilla.
Compilador: PCWHD   Lenguaje: CCS  
Librerías incluidas:
#INCLUDE <PIC18_USB.H>
#INCLUDE <USB.C>
Warnings al compilar el programa del PIC:
Interrupts disabled during call to prevent re-entrancy: (usb_token_reset)
Interrupts disabled during call to prevent re-entrancy: (usb_flush_out)
Interrupts disabled during call to prevent re-entrancy: (usb_flush_in)

Puede ser que el USB CDC al crear un Puerto serie virtual, ello puede estar interfiriendo en la comunicación serial. Por fa si me pueden echar una mano con este asunto……..de antemano muchas gracias.


----------



## JHON FER (Ene 10, 2014)

Buenas tardes a todos, soy nuevo y estoy probando la comunicación USB del PIC18F4550.
Utilicé el código de que les mostraré a continuación, pero cuando conecto el PIC al PC se genera un error en la Instalación.

El mensaje del error es el siguiente:  
"Se encontró software del controlador  de Windows del dispositivo, pero se produjo un error al intentar instalarlo.   
El sistema no encontró controladores del archivo especificado.   
Si sabe quién fabricó el dispositivo, busque información acerca del software del controlador en la sección de soporte técnico del sitio web del fabricante."  

El sistema operativo es Windows 7  
Este mensaje me da cuando manualmente doy una ruta que es la del CCS que está en la carpeta Picc\Drivers

Porque cuando doy alguna otra ruta me dice que el controlador no se encontró.

De antemano muchas gracias por su pronta respuesta.


```
#include <18F4550.h> // Definición de Registros Internos.
#fuses HSPLL, NOMCLR, NOWDT, NOPROTECT, NOLVP, NODEBUG, USBDIV, PLL5, CPUDIV1, VREGEN, NOPBADEN
#use delay (clock = 20000000) // Frecuencia Máxima de Trabajo
#include <usb_cdc.h> // Descripción de Funciones del USB
#include <usb_desc_cdc.h> // Descriptores del Dispositivo USB.

void main () {
set_tris_b (0x00);
output_b (0x00);
usb_cdc_init (); // Configuramos al puerto virtual.
usb_init (); // Inicializamos el stack USB.
output_high (PIN_B0); // LED ROJO ENCENDIDO
output_low (PIN_B1); // LED VERDE Apagado

while (! usb_cdc_connected ()) {} // Espera un DETECTAR Una transmission de la PC (. Set_Line_Coding)
do {usb_task (); 
if (usb_enumerated ()) {// Espera una cola el Dispositivo porción enumerado mar el host.
output_low (PIN_B0); // LED ROJO Apagado
output_high (PIN_B1); // LED VERDE ENCENDIDO
if (usb_cdc_kbhit ()) {// En espera de Nuevos Caracteres en el búfer de recepción ¿.
if (usb_cdc_getc () == 'x') {// llego x?
printf (usb_cdc_putc ". llego x \n \r");}
if (usb_cdc_getc () == 'a') {// llego a?
printf (usb_cdc_putc, "llego a \n \r.");
}
}
}
}
while (TRUE);
}
```


----------



## josepuello (Ene 18, 2014)

primero que todo felicitaciones por el foro esta  excelente y me ha servido mucho Quisiera saber como hago para apagar las salidas del pic por medio de vb.net , ya que genero una secuencia y cuando esta termina me queda encendida alguna salida, como hago entonces para que por medio de codigo las pueda apagar la salida que quedo encendida o sea que el apague la salida o salidas que quedo encendida.


----------



## Sant0 (Feb 21, 2014)

josepuello dijo:


> primero que todo felicitaciones por el foro esta  excelente y me ha servido mucho Quisiera saber como hago para apagar las salidas del pic por medio de vb.net , ya que genero una secuencia y cuando esta termina me queda encendida alguna salida, como hago entonces para que por medio de codigo las pueda apagar la salida que quedo encendida o sea que el apague la salida o salidas que quedo encendida.



Ya tenes un código que se pueda ver? Que tipo de comunicación usas? Si es HID quizás tenga una respuesta .


Sino puedes apagar todas las salidas al recibir un comando desde VB net. Ej: si los puertos utilizados son el B, entonces podrias apagarlos a todos con la siguiente funcion:

output_b(0);​
(la funcion es para CCS compiler).


----------



## fifiolo (Mar 4, 2014)

Buenas a todos!
Tengo un aparato que funciona con un PIC16F877 que se comunica con un PC mediante un puerto serie. Quería "modernizar" este aparato y hacer la comunicación mediante USB en lugar de con puerto serie. ¿Alguien puede orientarme sobre cómo empezar?


----------



## el anciano (Mar 4, 2014)

Claro que si fifiolo , la ayuda ya la tienes en este foro, solo debes leer con calma y paciencia desde el principio... 

Saludos  amigo



fifiolo dijo:


> Buenas a todos!
> Tengo un aparato que funciona con un PIC16F877 que se comunica con un PC mediante un puerto serie. Quería "modernizar" este aparato y hacer la comunicación mediante USB en lugar de con puerto serie. ¿Alguien puede orientarme sobre cómo empezar?


----------



## IxMagoxI (Abr 4, 2014)

Hola buen dia a todos, como andan?, hace poco empece con esto de pic-usb, ya que aprendi algo de java y me mire un par de tutoriales, pero resulta que no puedo simular la conexión del usb, para mi el problema esta en el VID/PID, cuando ejecuto la simulación(Proteus 8) la pc reconoce el nuevo dispositivo, pero al querer instalar el driver no lo encuentra, al fijarme los detalles del controlador aparece que no encontró el controlador, al ir a la ventana de detalles me fijo el Id de hardware y me pone 

USB\Vid_0000&Pid_0000&Rev_0000
USB\VID_0000&PID_0000, 

cuando en la compilación del programa para el pic el vid/pid esta puesto:

USB_MAX_EP0_PACKET_LENGTH, //max packet size for endpoint 0. (SLOW SPEED SPECIFIES 8)
08,0x04, //vendor id (0x04D8 is Microchip)
0x0B,0x00, //product id

Así que me parece que se me esta pasando algo por alto.... resulta que al modificar el driver de: 

[DeviceList]
%DESCRIPTION%=DriverInstall, USB\VID_04D8&PID_000B

a 

[DeviceList]
%DESCRIPTION%=DriverInstall, USB\VID_0000&PID_0000

y ahi reconoce el driver, lo instala, en java uso la libreria jpicUSB con la dll correspondiente, la carga todo bien, pero al ejecutar iface.GetDeviceCount("vid/pid")  que es para que devuelva la cantidad de dispositivos que coinciden con el vid/pid, me devuelve 0, asi que instalar el driver con vid_0000&pid_0000 no es la forma correcta.

no se que mas decirles, espero que alguien me pueda ayudar con este problema, de ultima lo que no funciona es simularlo en proteus... muchas gracias, Saludos


----------



## contrerasqm (Abr 13, 2014)

Hola a todos!!!
Quisiera saber si alguien a realizado la comunicación USB con algún dispositivo utilizando mikroC y Visual C# ó Visual Basic, para que intercambiemos información.
Muchas gracias.


----------



## fife89 (May 7, 2014)

Buenas Gente
estoy intentando dar mis primeros pasos con el pic 18f2550 + usb estoy utilizando el programa microcode studio y el easyHID usb wizard 
ya genere el codigo y todo bien compila el circuito basico del condensador y el cable usb conectado todo bien,  al conectarlo al usb del pc no pasa nada no lo reconoce el pc
dandole me acorde que no configure los fuses para este pic al ver la cantidad de fuses a configurar con el programador he quedado loco









estoy usando un oscilador externo de 20mhz con 2 condensadores de 33pf 
por el momento solo quiero que el pc lo reconozca para luego continuar
aqui esta el codigo 

```
include	"DESCUSBProject.bas"

DEFINE OSC 20
DEFINE LOADER_USED 1
b   VAR BYTE	' Declarar la variable b como byte
d   VAR BYTE	' Declarar la variable d como byte
TRISB=0		' Configurar el puerto B como salida

USBBufferSizeMax   con 8  ' maximum buffer size
USBBufferSizeTX    con 8  ' input
USBBufferSizeRX    con 8  ' output

' the USB buffer...
USBBuffer        Var Byte[USBBufferSizeMax] 
USBBufferCount   Var Byte 

' ************************************************************
' * main program loop - remember, you must keep the USB      *
' * connection alive with a call to USBService every couple  *
' * of milliseconds or so...                                 *
' ************************************************************
usbinit ' initialise USB...
ProgramStart: 
   gosub DoUSBIn
   b=USBBuffer[4]	' Leer el buffer(4) y almacenarlo en b
	PORTB=b		' El valor de b mostrarlo por el puerto B
	Pause 100	' Pausa de 100 milisegundos
	USBService	' Mantener la conexión USB habilitada
	USBBuffer[6]=d	' Almacenar d en el buffer(6) 
   gosub DoUSBOut
   goto ProgramStart  

' ************************************************************
' * receive data from the USB bus                            *
' ************************************************************
DoUSBIn:
   USBBufferCount = USBBufferSizeRX              ' RX buffer size
   USBService                                    ' keep connection alive
   USBIn 1, USBBuffer, USBBufferCount, DoUSBIn   ' read data, if available
   return
    
' ************************************************************
' * wait for USB interface to attach                         *
' ************************************************************
DoUSBOut:
   USBBufferCount = USBBufferSizeTX              ' TX buffer size
   USBService                                    ' keep connection alive
   USBOut 1, USBBuffer, USBBufferCount, DoUSBOut ' if bus available, transmit data
   return
```
adjunto dejo los archivos
gracias


----------



## D@rkbytes (May 8, 2014)

fife89 dijo:


> Estoy intentando dar mis primeros pasos con el PIC18F2550 + USB.
> Estoy utilizando el programa MicroCode Studio y el EasyHID USB Wizard.
> Ya generé el código y todo bien, compila el circuito básico.
> Del condensador y el cable usb conectado todo bien,  al conectarlo al USB del pc no pasa nada, no lo reconoce el PC.
> ...


Si vas a trabajar el PIC con USB necesitas que corra a 48MHz, no a 20MHz como lo declaraste.
Cambia la frecuencia a 48MHz.
Ejemplo: Define OSC 48

La palabra de configuración que tomará el compilador será la del archivo 18F2550.INC.
Esa palabra está escrita para trabajar con un cristal de 20MHz, pero tiene los fuses BOREN y WDTE activos, también tiene en OFF el fuse PWRTE y es bueno usarlo, aparte ya es obsoleta esa forma de escribirla.

Esta es la palabra de configuración del archivo 18F2550.INC:

```
__CONFIG    _CONFIG1L, _PLLDIV_5_1L & _CPUDIV_OSC1_PLL2_1L & _USBDIV_2_1L
        __CONFIG    _CONFIG1H, _FOSC_HSPLL_HS_1H & _FCMEN_OFF_1H & _IESO_OFF_1H
        __CONFIG    _CONFIG2L, _PWRT_OFF_2L & _BOR_ON_2L & _BORV_3_2L & _VREGEN_ON_2L
        __CONFIG    _CONFIG2H, _WDT_ON_2H & _WDTPS_512_2H
        __CONFIG    _CONFIG3H, _CCP2MX_ON_3H & _PBADEN_OFF_3H & _LPT1OSC_OFF_3H & _MCLRE_ON_3H
        __CONFIG    _CONFIG4L, _STVREN_ON_4L & _LVP_OFF_4L & _XINST_OFF_4L
```
Te recomiendo que sustituyas esa palabra de configuración por esta otra:

```
config FOSC = HSPLL_HS, PLLDIV = 5, USBDIV = 2, CPUDIV = OSC1_PLL2
    config PWRT = ON, WDT = OFF, PBADEN = OFF, LVP = OFF, BOR = OFF
    config FCMEN = OFF, IESO = OFF, VREGEN = ON
```
También se pueden usar otros cristales para alcanzar los 48MHz necesarios. (Por ejemplo, uno de 4MHz.)

Con esa palabra de configuración podrás compilar y grabar el PIC para usarlo con USB y un cristal de 20MHz.

Suerte.


----------



## fife89 (May 8, 2014)

D@rkbytes dijo:


> Si vas a trabajar el PIC con USB necesitas que corra a 48MHz, no a 20MHz como lo declaraste.
> Cambia la frecuencia a 48MHz.
> Ejemplo: Define OSC 48
> 
> ...



gracias por responder.
ya modifique el archivo a como me lo planteaste el archivo esta ubicado en C:\PBP 
correcto compilado y montado al pic 
el pc no detecta nada al conectar el usb, al mover el fuse de cristal el pc si lo reconoce pero dice este dispositivo no funciona correctamente, estoy trabajando con el qlprogren
este programador permite modificar los fuses y alguno los toma y otros no.
que debo colocar en los fuses para que lo reconozca el pc
ya cambie el codigo a 48, el cristal que uso afuera es de 20mhz


----------



## D@rkbytes (May 8, 2014)

fife89 dijo:


> Gracias por responder.
> Ya modifiqué el archivo a como me lo planteaste, el archivo esta ubicado en C:\PBP
> Correcto, compilado y montado al pic.
> El pc no detecta nada al conectar el usb, al mover el fuse del cristal el pc si lo reconoce pero dice, este dispositivo no funciona correctamente, estoy trabajando con el qlprogren.
> ...


Esa palabra de configuración está bien, al parecer es porque estás definiendo que se usará BootLoader.
¿Estás usando un BootLoader?
Si no lo estás usando, elimina esto del código: *DEFINE LOADER_USED 1*

En dado caso que tu programa siga sin funcionar, prueba con este que adjunto. (Incluye interfaz para la PC)
Este programa está funcionando correctamente con PBP 2.60 y compilado con MPASM.

Suerte.


----------



## fife89 (May 8, 2014)

este programador toca programarle los fuses por codigo si no no los toma :S ya probe tu configuracion de usb el pc no lo reconoce el cable esta bueno y el pic tambien, errores de conexiones no hay es una tarjeta entrenadora ql200
los fuses debo configurarlos por codigo o manual desde el programador 




gracias por tu colaboracion D@rkbytes


----------



## D@rkbytes (May 8, 2014)

fife89 dijo:


> Ya probé tu configuración de usb, el pc no lo reconoce, el cable esta bueno y el pic también, errores de conexiones no hay, es una tarjeta entrenadora ql200.


Suele suceder que cuando un dispositivo USB HID no es bien reconocido por la PC, puede presentar problemas.
Si ya volviste a grabar el PIC con el código correcto y la palabra de configuración adecuada, entonces tienes que desinstalar el controlador HID y reiniciar la PC para que vuelva a tratar de reconocer el dispositivo.

Eso lo haces en el administrador de dispositivos.
Yo uso Windows XP y cuando conecto el PIC aparece un nuevo dispositivo HID en la ventana del administrador de dispositivos.

En otros sistemas debe aparecer también algo similar a esto:

​Si logras ver esta rama, desinstala los controladores dando doble click sobre los dispositivos.
Seleccionar pestaña (Controlador)
​Después reinicia la PC asegurándote de no tener conectado el PIC al puerto USB.
Cuando ya estés dentro de Windows, espera un tiempo hasta que todo esté estable y conecta el PIC.
Si todo está bien, nuevamente la PC tratará de reconocer el dispositivo y lo verás en los Pop-ups.


----------



## fife89 (May 8, 2014)

D@rkbytes dijo:


> Suele suceder que cuando un dispositivo USB HID no es bien reconocido por la PC, puede presentar problemas.
> Si ya volviste a grabar el PIC con el código correcto y la palabra de configuración adecuada, entonces tienes que desinstalar el controlador HID y reiniciar la PC para que vuelva a tratar de reconocer el dispositivo.
> 
> Eso lo haces en el administrador de dispositivos.
> ...



Hola, eso fue lo primero que intente. pero no funciona, como comente mi programador toca ponerles los fuses por codigo o individual. no logro que funcione 
podrias pasarme los fuses en codigo 
algo como esto

```
@ DEVICE pic16f628A, INTRC_OSC_NOCLKOUT 'Reloj interno solo.-
@ DEVICE pic16f628A, WDT_OFF            ' Watchdog Timer desconectado.-
@ DEVICE pic16f628A, PWRT_OFF           ' Power-On Timer conectado.- 
@ DEVICE pic16f628A, BOD_ON             ' Brown-Out Detect conectado.- 
@ DEVICE pic16f628A, MCLR_ON            ' Master Clear Externo desconectado.-
@ DEVICE pic16f628A, LVP_OFF            ' Low-Voltage Programming desconectado.-
@ DEVICE pic16f628A, CPD_OFF            ' Data Memory Code Protect desconectado.-
```


----------



## D@rkbytes (May 9, 2014)

fife89 dijo:


> Hola, eso fue lo primero que intenté, pero no funciona, como comenté, mi programador toca ponerles los fuses por código o individual. No logro que funcione.
> ¿Podrías pasarme los fuses en código?


Al parecer no estás entendiendo nada acerca de la palabra de configuración. 

En el _post #2202_ la puse.


D@rkbytes dijo:


> Te recomiendo que sustituyas esa palabra de configuración por esta otra:
> 
> ```
> config FOSC = HSPLL_HS, PLLDIV = 5, USBDIV = 2, CPUDIV = OSC1_PLL2
> ...


Esa es la palabra de configuración por código.
Si estuvieras usando PBP3, sí la podrías poner directamente en la cabecera del programa, de esta forma:

```
[COLOR=Blue]#Config[/COLOR]
    config FOSC = HSPLL_HS, PLLDIV = 5, USBDIV = 2, CPUDIV = OSC1_PLL2
    config PWRT = ON, WDT = OFF, PBADEN = OFF, LVP = OFF, BOR = OFF
    config FCMEN = OFF, IESO = OFF, VREGEN = ON
[COLOR=Blue]#EndConfig[/COLOR]
```
Si estás utilizando una versión inferior a MicroCode Studio 5, entonces tienes que usar la palabra de configuración que está en el archivo 18F2550.INC, como ya te había mencionado, por eso es que ese archivo se tiene que editar, para que el compilador tome la palabra de configuración de ese archivo.

Para poder poner la palabra de configuración en tu código, tienes que comentar o eliminar las líneas de la palabra del archivo 18F2550.INC.

Quedaría de esta forma:

```
NOLIST
    ifdef PM_USED
        LIST
        "Error: PM does not support this device.  Use MPASM."
        NOLIST
    else
        LIST
        LIST p = 18F2550, r = dec, w = -311, w = -230, f = inhx32
        INCLUDE "P18F2550.INC"    ; MPASM  Header
[B];[/B]        __CONFIG    _CONFIG1L, _PLLDIV_5_1L & _CPUDIV_OSC1_PLL2_1L & _USBDIV_2_1L
[B];[/B]        __CONFIG    _CONFIG1H, _FOSC_HSPLL_HS_1H & _FCMEN_OFF_1H & _IESO_OFF_1H
[B];[/B]        __CONFIG    _CONFIG2L, _PWRT_OFF_2L & _BOR_ON_2L & _BORV_3_2L & _VREGEN_ON_2L
[B];[/B]        __CONFIG    _CONFIG2H, _WDT_ON_2H & _WDTPS_512_2H
[B];[/B]        __CONFIG    _CONFIG3H, _CCP2MX_ON_3H & _PBADEN_OFF_3H & _LPT1OSC_OFF_3H & _MCLRE_ON_3H
[B]; [/B]       __CONFIG    _CONFIG4L, _STVREN_ON_4L & _LVP_OFF_4L & _XINST_OFF_4L
        NOLIST
    endif
        LIST
EEPROM_START    EQU    0F00000h
BLOCK_SIZE    EQU    32
```
Entonces en la cabecera de tu programa ya puedes añadir la palabra de configuración de esta forma:

```
[B]Asm[/B]
[COLOR=Green]    config FOSC = HSPLL_HS, PLLDIV = 5, USBDIV = 2, CPUDIV = OSC1_PLL2
    config PWRT = ON, WDT = OFF, PBADEN = OFF, LVP = OFF, BOR = OFF
    config FCMEN = OFF, IESO = OFF, VREGEN = ON[/COLOR]
[B]EndAsm[/B]
```
Notas:
Así como pretendes escribir la palabra de configuración, no es posible.
El PIC18F2550 necesita ser compilado con MPASM porque el compilador PM de PBP no lo hace.
Por eso está declarada la sentencia para mostrar un error si se usa PM con este PIC.


			
				PM Compiler dijo:
			
		

> *"Error: PM does not support this device.  Use MPASM."*


El *@* *Device* y la sintaxis que se usa en la palabra de configuración para los PIC12 y los PIC16, no es reconocida por MPASM y es por eso que se debe usar la palabra de configuración como mencioné.

Según las fotos que pusiste, tienes bien los fuses, y el programa que subí funciona perfectamente.
Ese programa está escrito para usar MicroCode Studio Plus u otra versión inferior al 5.

No sé que problema tengas, pero ya no es debido a la palabra de configuración.

Inténtalo así ahora, pero es lo mismo que si la palabra de configuración estuviera en el archivo 18F2550.INC. 

Suerte.


----------



## fife89 (May 10, 2014)

D@rkbytes dijo:


> No sé que problema tengas, pero ya no es debido a la palabra de configuración.
> 
> Inténtalo así ahora, pero es lo mismo que si la palabra de configuración estuviera en el archivo 18F2550.INC.
> 
> Suerte.



Hola Muchisimas gracias por tu ayuda, ya logre que funcionara  
no tomaba bien la configuracion, como antes de modificar el archivo de pbp hice una copia la restaure y volvi a modificar como me dijiste. y ahi si lo reconocio pero no del todo, subi el condensador a un electrolitico de 1uf y ahi si lo reconocio muy bien el pic ya funciona con mi codigo gracias!


----------



## fife89 (May 11, 2014)

tengo otra duda,  necesito comunicar un pic 16f877a con el pic18f2550, y que este envie los datos por usb, para hacer pruebas intento enviar datos desde el 18f2550 al pc por medio de el xbee xplorer y el x-ctu, pero no recibo nada. con el 16f877a si transmito datos y llegan al pc perfecto pero con el 18f2550 no se manda nada.
aqui esta el codigo

```
Define OSC 48   ; Definir frecuencia de 48MHz.
Include "USB_Desc.inc"  ; Archivo con los descriptores HID (Human Interfaz Device)

; Variables para el buffer USB
USBBufferSizeMax    Con 8   ; Tamaño máximo del buffer
USBBufferSizeTX     Con 8   ; Para la entrada
USBBufferSizeRX     Con 8   ; Para la salida
USBBuffer           Var Byte[USBBufferSizeMax] 
USBBufferCount      Var Byte

; Configuración del oscilador interno en caso de falla.
b   Var Byte                ; Declarar la variable b como byte
d   Var Byte
X   VAR Byte                ; Declarar la variable d como byte
TRISB = 0 
X=0 
;*******************************************************************************
; * main program loop - remember, you must keep the USB
; * connection alive with a call to USBService every couple
; * of milliseconds or so.
;*******************************************************************************
USBInit ; Inicializar la comunicación USB
ProgramStart:
    ADCON1 = $0F           ; Puertos A y B Digital I/O
	GoSub DoUSBIn           ; Ir hacia la rutina de recepción de datos
    b = USBBuffer[4]        ; Leer el buffer(4) y almacenarlo en b
    PORTB = b               ; El valor de b mostrarlo por el puerto D
    USBService              ; Mantener la conexión USB habilitada
'    d = PORTA
'    POT PORTA.0, 255, X
X=1 
    SEROUT2 PORTC.6,84,[X]              ; El valor del puerto A almacenarlo en d
    USBBuffer[6] = X       ; Almacenar d en el buffer(6) 
    GoSub DoUSBOut          ; Ir hacia la rutina de transmisión de datos
    GoTo ProgramStart  

;*******************************************************************************
; Recibir los datos del bus USB
;*******************************************************************************
DoUSBIn:
	USBBufferCount = USBBufferSizeRX   ; Especificar el tamaño del buffer
	USBService             ; Mantener siempre la conexión
   	USBIn 1, USBBuffer, USBBufferCount, DoUSBIn ; Leer los datos (Si existen)
	Return   
;*******************************************************************************
; Esperar hasta que el dispositivo sea conectado al puerto USB
;*******************************************************************************
DoUSBOut:
	USBBufferCount = USBBufferSizeTX   ; Especificar el tamaño del buffer
	USBService             ; Mantener siempre la conexión
	USBOut 1,USBBuffer,USBBufferCount,DoUSBOut ; Si el bus está disponible, transmitir.
	Return
	
    End
```


----------



## D@rkbytes (May 11, 2014)

fife89 dijo:


> tengo otra duda,  necesito comunicar un pic 16f877a con el pic18f2550, y que este envie los datos por usb, para hacer pruebas intento enviar datos desde el 18f2550 al pc por medio de el xbee xplorer y el x-ctu, pero no recibo nada. con el 16f877a si transmito datos y llegan al pc perfecto pero con el 18f2550 no se manda nada.


Aquí existe algo que debes tener en cuenta.
Estás trabajando el CPU-Core a 48MHz y con esa frecuencia no puedes trabajar con RS-232.
Entonces lo que tienes que hacer, es que el módulo USB trabaje a 48MHz, pero el CPU a 4 u 8MHz.
Yo así logré hacer un proyecto para recuperación del valor OSCCAL en PIC's 12 por RS-232, usando USB.


----------



## fife89 (May 11, 2014)

D@rkbytes dijo:


> Aquí existe algo que debes tener en cuenta.
> Estás trabajando el CPU-Core a 48MHz y con esa frecuencia no puedes trabajar con RS-232.
> Entonces lo que tienes que hacer, es que el módulo USB trabaje a 48MHz, pero el CPU a 4 u 8MHz.
> Yo así logré hacer un proyecto para recuperación del valor OSCCAL en PIC's 12 por RS-232, usando USB.


ok , entiendo en eso fue lo primero que pense pero estoy trabajando a 9600 segun eso debo trabajar a 8 MHZ intentare revisar.


----------



## gongonni (May 12, 2014)

fife89, te han dicho que utilices un cristal externo de 4Mhz o lo que corresponda. Con 20Mhz no podrás tener USB. Creo haber entendido y que se os ha pasado por alto.


----------



## fife89 (May 14, 2014)

me tome unos dias para sacarme el estres y ya estoy de vuelta  
el motivo? se quemo un xbee por un corto, esos pequeños retasos que quedan de cortar las patas de los componentes  en fin  ya pedí otro xbee me debe estar llegando uno nuevo mañana.
como se me complico esto de HID. 
la comunicación serial lo tomare en cuenta después, ahora tengo un problema mayor ya que tengo el pic funcionando en USB HID gracias a la ayuda de D@rkbytes funcionando con el programa demo que me mando aparentemente todo bien, necesito interpretar los datos con C# integrado en unity 3D.
no he logrado que se entienda el pic con unity 3D todavía, alguien sabe como seria? 
la otra forma seria convertir el 18f2550 en un joystick usb de esta manera lo interpretaria muy facil en el unity3D pero nos e como hacerlo en el pic, necesito muchos ejes  y pocos botones,
en pbp 
gracias


----------



## fife89 (May 21, 2014)

nadie sabe del tema? yo encontre algo mas o menos 
hice los pasos el pc lo reconoce como un dispositivo hid pero en los joystick no esta


----------



## fife89 (May 21, 2014)

Buenas Noches 
antes que todo estoy desarrollando un proyecto en el que debo leer 21 datos adc y trasmitirlos inalambricamente al pc el cual va a interpretar los datos
dispongo de:
1 pic 18f2550
4 pics 16f877A
2 xbee s1
esquemático pues no tengo, es el circuito basico usb que funciona bien,con un cristal de 20mhz 
deseo comunicarlos via usb convirtiendo todos estos datos en varios analogos(joystick)
segui paso a paso los datos de el pdfhttps://www.forosdeelectronica.com/attachment.php?attachmentid=110687&d=1400706122  para generar un codigo ejemplo con 2 ejes (x,Y) y 4 botones con el fin de entender como funciona y asi poder desarrollar mi proyecto.
segun el pdf debo modificar un archivo para colocar los archivos descriptores

```
RETLW 0x05  
RETLW 0x01                     ; USAGE_PAGE (Generic Desktop) 
RETLW 0x09  
RETLW 0x04                     ; USAGE (Joystick) 
RETLW 0xa1  
RETLW 0x01                     ; COLLECTION (Application) 
RETLW 0x09  
RETLW 0x04                     ;   USAGE (Joystick) 
RETLW 0xa1  
RETLW 0x00                     ;   COLLECTION (Physical) 
RETLW 0x09  
RETLW 0x30                     ;     USAGE (X) 
RETLW 0x09  
RETLW 0x31                     ;     USAGE (Y) 
RETLW 0x75  
RETLW 0x08                     ;     REPORT_SIZE (8) 
RETLW 0x95  
RETLW 0x02                     ;     REPORT_COUNT (2) 
RETLW 0x35  
RETLW 0x00                     ;     PHYSICAL_MINIMUM (0) 
RETLW 0x46  
RETLW 0xff  RETLW 0x00               ;     PHYSICAL_MAXIMUM (255) 
RETLW 0x81  
RETLW 0x03                     ;     INPUT (Cnst Var Abs) 
RETLW 0x05  
RETLW 0x09                     ;     USAGE_PAGE (Button) 
RETLW 0x19  
RETLW 0x01                     ;     USAGE_MINIMUM (Button 1) 
RETLW 0x29  
RETLW 0x04                     ;     USAGE_MAXIMUM (Button 4) 
RETLW 0x15  
RETLW 0x00                     ;     LOGICAL_MINIMUM (0) 
RETLW 0x25  
RETLW 0x01                     ;     LOGICAL_MAXIMUM (1) 
RETLW 0x75  
RETLW 0x01                     ;     REPORT_SIZE (1) 
RETLW 0x95  
RETLW 0x08                     ;     REPORT_COUNT (8) 
RETLW 0x81  
RETLW 0x03                     ;     INPUT (Cnst Var Abs) 
RETLW 0xc0  
;   END_COLLECTION 
RETLW 0xc0 
; END_COLLECTION
```
luego de generarlo dice que lo copie dentro de un archivo .asm y editar unas cosas en el archivo principal, bueno todo bien hasta el momento, al compilarlo lo hace todo bien reviso el archivo .asm y que encuentro? nada de lo que copie anteriormente, al compilar crea denuevo ese asm y borra todo. entonces lo trate de colocar los datos en el archivo .bas que genera el asm en el descriptor y no lo compila tira error, no entiendo por que. 
adjunto dejo todos los archivos


----------



## cho-k (May 28, 2014)

Buenos días

quisiera saber como en el Descriptor_easyHID.h  es posible variar la corriente entregada por el puerto, desde el form en C#.

gracias

//**************************************************************************

#ifndef USB_CONFIG_BUS_POWER
                                                                 // El rango válido es 0...500.
                                                            #define  USB_CONFIG_BUS_POWER 100   // 100mA, corriente máxima que entregará el puerto.
#endif

/*****************************************************************************   

#if USB_CONFIG_BUS_POWER
         0x80, //bit 6=1 if self powered, bit 5=1 if supports remote wakeup (we don't), bits 0-4 unused and bit7=1         ==8
        #else
         0xC0, //bit 6=1 if self powered, bit 5=1 if supports remote wakeup (we don't), bits 0-4 unused and bit7=1         ==8
        #endif
         USB_CONFIG_BUS_POWER/2, //maximum bus power required (maximum milliamperes/2)  (0x32 = 100mA)


----------



## SunLight (Jun 14, 2014)

Hola buenas tardes a todos gracias por sus aportes me han ayudado mucho bueno... he leído casi todo el post, y me di cuenta que la mayoría de veces se hace comunicación con visual Studio, c# y c++, alguien sabe como realizar la comunicación vía matlab usando un pic 18f en modo HID?? donde tengo la mayor duda es en la comunicación del host al pic.


----------



## kamk (Oct 3, 2014)

Disculpen, alguno sabe como modificar la libreria usb_desc_cdc.h en CCS v4.y104 ?

pruebo este programa que encontre en youtube, pero me da una seguidilla de errores.


```
#include <18F4550.h>             //PIC a emplear
#device adc=10;                  //Conversor A/D de 10 bits
#fuses HSPLL,NOWDT,NOLVP,USBDIV,PLL5,CPUDIV1,VREGEN
#use delay(clock=20000000)
include <usb_cdc.h>


void main(){
    unsigned long int fefe;
    usb_cdc_init();
    usb_init();
    while(!usb:cdc_connected()){}
    do{
       usb_task();
       if (usb_enumerated()){
            printf(usb_cdc_putc,"BARDXP: %Lu\r\n",fefe);
            fefe=fefe+1;
       }}while(TRUE);
       
}
```

Adjunto una imagen con los errores


----------



## D@rkbytes (Oct 3, 2014)

Falta poner un *# *en *include <usb_cdc.h>*
Así: *#include <usb_cdc.h>*

Existen dos puntos *":"* en *while(!usb:cdc_connected())*
Debe ser así: *while(!usb_cdc_connected())*

Ya no veo otra cosa extraña.

Suerte.


----------



## kamk (Oct 3, 2014)

Muchas gracias D@rkbytes, compile con exito, perdon las molestias!


----------



## Sant0 (Oct 3, 2014)

kamk dijo:


> Disculpen, alguno sabe como modificar la libreria usb_desc_cdc.h en CCS v4.y104 ?
> 
> pruebo este programa que encontre en youtube, pero me da una seguidilla de errores.
> 
> ...



No se si hace falta usb_task en el bucle while. Con hacerlo una vez antes de entrar bastaria. Ademas de lo que mencionaron anteriormente de reemplazar : por _ en usb_cdc etc.. el undefined es porque no encuentra las funciones. En particular nunca hice la comunicacion con CDC pero en la demas (HID o bulktransfer) hace falta incluir usb.c (#include <usb.c>).

Espero que te sirva !!


----------



## rodolfoandres (Nov 6, 2014)

Saludos.

Estoy intentando hacer la conexión USB entre el PIC18F4550 y la PC, el tipo de conexión es HID.
Ya hice la simulación en proteus 8.1 y funciona correctamente, pero al implementar en circuito físico, la PC no me reconoce nada, ni como un programa desconocido.
El programa del PIC está funcionando, porque tengo dos leds que indican la conexión, pero sólo se prende el rojo esperando a que se haga la conexión.

Adjunto una imagen del circuito y el código del programa que está grabado en el PIC.


----------



## Moyano Jonathan (Nov 8, 2014)

Hola como estás.

Fijate si no es un error de hardware/configuración del cristal/cables D+ D- invertidos, etc. Mirá bien como están configurados los fusibles.

Saludos !


----------



## robop18 (Ene 16, 2015)

hola espero me puedan ayudar al enviar un dato del adc se manda la parte alta del dac en un buffer  alto y uno bajo esto hecho en ccs  pero mi duda es como concateno en visual net para mostrarlo en un text.text  en c++ he leido que es asi 


                // Une la parte alta y baja de la conversión y guarda el dato en la variable
                // ADCxValue.
                ADCValue1 = (uint)(BufferINP[5] << 8) + BufferINP[6];
                ADCValue2 = (uint)(BufferINP[7] << 8) + BufferINP[8];
                // Muestra los valores en las barras de progreso.
                ADC1_VALUE.Value = (int)ADCValue1;
                ADC2_VALUE.Value = (int)ADCValue2;

pero en Visual Basic.Net  no se como se haga


----------



## papirrin (Ene 16, 2015)

no me acuerdo muy bien peroo es simple, pones:

ADCValue1=(bufferinp(5)*256)+bufferinp(6)
text1.text=STR(adcvalue1) 

no recuerdo si es 255 o 256 XD


----------



## robop18 (Ene 16, 2015)

Gracias papirrin. Lo checo hoy en la noche y les aviso.


----------



## lcrs11 (Ene 26, 2015)

robop18 dijo:


> hola espero me puedan ayudar al enviar un dato del adc se manda la parte alta del dac en un buffer  alto y uno bajo esto hecho en ccs  pero mi duda es como concateno en visual net para mostrarlo en un text.text  en c++ he leido que es asi
> 
> 
> // Une la parte alta y baja de la conversión y guarda el dato en la variable
> ...



hola amigo yo hice algo parecido a lo que estas haciendo pero a la inversa mande numeros de 16 bits en un arreglo y en el pic lo estoy uniendo mira asi lo hice en el pic

x1=((int16)numx2*256)+numx1;

numx1=recibe[1];  //1er byte del numero X
numx2=recibe[2];  //2do byte del numero X





rodolfoandres dijo:


> Saludos.
> 
> Estoy intentando hacer la conexión USB entre el PIC18F4550 y la PC, el tipo de conexión es HID.
> Ya hice la simulación en proteus 8.1 y funciona correctamente, pero al implementar en circuito físico, la PC no me reconoce nada, ni como un programa desconocido.
> ...



me parece que el error es que la pc no esta enumerando a tu pic, puede que no hayas copiado la *.dll a la carpeta windows/system32


----------



## robop18 (Ene 29, 2015)

Gracias lcrs11 te dire que lo hice como me comento papirrin
            ADCValue1 = (BufferIn(9) * 1024) + BufferIn(10) / 2
            Temp1.Text = Str(ADCValue1)
            NIVEL.Level = Val(Temp1.Text) + 1 
me funciono ok aunque tambien si solo mostraba el valor de Bufferin(9) me daba lo mismo; sera por que el pic tengo justificado hacia la izquierda? (>>)
    valor_adc_alta = (read_adc()>>8);      // Enviamos la parte alta de la conversión de 10 bits.
    valor_adc_baja = (int)(read_adc());    // Enviamos la parte baja de la conversión de 10 bits.
    envia[10]=valor_adc_alta;
    envia[11]=valor_adc_baja;

Aunque ahora me surge otra duda, programando en pic c me encuentro con varios void aparte del void main, quiero pensar que los demas void son como llamadas donde se ejecuta el codigo y despues regresa a donde se inicio la llamada; perdon por mi novatez soy autodidacta y me gustan los pics estoy realizando una interfaz con visual studio 2008 18f45450 Symbol Factory.Net windows 7 prof 64 bits ya probe la comunicacion y todo ok
gracias a los aportes de Moyano,Meta,Jose Villasmil, Mauricio Ferrer y Miguel Piñeiro y otros grandes que para mencionarlos son muchos  Gracias

void Inicio(void);  //llamamos a Inicio para determinarlo

void Inicio(void)


----------



## papirrin (Ene 29, 2015)

Si son subrutinas como se hacen en basic, si en lugar de void pones un tipo como int long etc son como las funciones en basic y retorna el valor.


----------



## lcrs11 (Ene 29, 2015)

Robop18 yo tambien ya realice la comunicacion por el puerto USB, con winXP, 32 bits, para hacerlo con un sistema operativo de 64 bits que dll estas usando no se si puedes facilitarme esa informacion.


----------



## robop18 (Ene 29, 2015)

que tal lcrs11 te la adjunto en Verdad es un trabajo de moyano muy bueno solo que si hay que estudiarle
y el principal problema a veces son configuracion de los fuses; a la hora de programar debemos tener presente que crystal usamos; en win 7 64 bits tuve que compilar mi  proyecto en visual net en Propiedades del proyecto/compilacion/opciones avanzadas/ como Any cpu y X86 y lo simulo en proteus 8 asi me evito estar instalando a cada rato el usb virtual



Perdon no subi el archivo pero aqui esta tambien me ayudo mucho el proyecto de  josexremix65
Saludos


----------



## Moyano Jonathan (Ene 29, 2015)

```
Robop18 yo tambien ya realice la comunicacion por el puerto USB, con winXP, 32 bits, para hacerlo con un sistema operativo de 64 bits que dll estas usando no se si puedes facilitarme esa informacion.
```

La misma librería tiene que funcionar para sistemas operativos de 32 y 64 bits. La librería tiene que estar en la carpeta SysWOW64, donde se encuentran las DLL del sistema. En caso de que utilices un sistema operativo de 32 bits, tiene que estar en la carpeta System32.

Saludos !


----------



## lcrs11 (Ene 29, 2015)

Gracias por la aclaración, pense que esa dll solo servia para sistemas de 32 bits, lo preguntaba porque me comprare una nueva laptop y pues antes de meterle algun sistema operativo queria saber si me funcionaria o no algunos trabajos que hice.


----------



## Moyano Jonathan (Ene 29, 2015)

Yo todavía no la pruebo en windows 8, pero creería que tendría que funcionar sin problemas. Tanto en 32 como en 64 bits.

Saludos !


----------



## Alfredo (Feb 9, 2015)

Hola Moyano he estado siguiendo tu excelente post! has avanzado en windows 8??


----------



## Moyano Jonathan (Feb 9, 2015)

Todavía no pruebo nada en windows 8, por que no tengo el sistema operativo instalado. Saludos !


----------



## Alfredo (Mar 4, 2015)

Alguien se ha arriesgado a escribir el codigo de Moyano (primer pagina) en MikroC? Ocupo ayuda!!


----------



## Moyano Jonathan (Mar 5, 2015)

Como estás Alfredo, El primer ejemplo está diseñado con las librerías de CCS. Tendrías que ver si MikroC a sacado librerías para implementar una conexión tipo CDC. Con MikroC vas a poder encontrar librerías para implementar un enlace tipo HID. También vas a poder encontrar una aplicación para realizar las pruebas HID.


----------



## cristian roque (Abr 25, 2015)

Hola Ya he probado instalando el dll en syswow64 y tampoco anda, si alguien los solucionó sería fantástico saber la solución



Hola, olvide comentar que en windows xp funciona correctamente


----------



## lcrs11 (May 5, 2015)

cristian roque dijo:


> Hola Ya he probado instalando el dll en syswow64 y tampoco anda, si alguien los solucionó sería fantástico saber la solución
> 
> 
> 
> Hola, olvide comentar que en windows xp funciona correctamente



 Vaya no se que paso con mi mensaje lo había publicado hace mas de 1 mes, había comentado que en windows 8 funciona perfectamente ya que opte por comprarme una laptop nueva y lo primero que hice fue probar la dll.


----------



## SunLight (Jun 24, 2015)

Buenas a todos compañeros, una pregunta hay una función llamada leer dispositivo que por lo que leí intercepta los mensajes de windows tengo una duda esa función puede ser llamada en un botón para que si al presionar un botón,  lea el adc, una ves que lo leí haga una función de enviar un dato pero siempre dentro de la misma funcion del boton??


----------



## jipc (Oct 20, 2015)

Moyano Jonathan dijo:


> Hola como estás.
> 
> Fijate si no es un error de hardware/configuración del cristal/cables D+ D- invertidos, etc. Mirá bien como están configurados los fusibles.
> 
> Saludos !




Hola a todos, estoy intentando que me funcione la comunicación CDC con el pic18f4550 y el problema es que en el administrador de dispositivos se reconoce como _"Dispositivo USB desconocido (Error de solicitud de descriptor de dispositivo)"_   por lo que no puedo actualizarle el  mchpcdc.inf ...

¿Dónde puede estar el problema? 

Gracias!


----------



## luis30 (Oct 20, 2015)

jipc dijo:


> Hola a todos, estoy intentando que me funcione la comunicación CDC con el pic18f4550 y el problema es que en el administrador de dispositivos se reconoce como _"Dispositivo USB desconocido (Error de solicitud de descriptor de dispositivo)"_   por lo que no puedo actualizarle el  mchpcdc.inf ...
> 
> ¿Dónde puede estar el problema?
> 
> Gracias!



Asegurate de usar el cristal correcto o la configuracion correcta con la pll y el usbdiv


----------



## jipc (Oct 21, 2015)

luis30 dijo:


> Asegurate de usar el cristal correcto o la configuracion correcta con la pll y el usbdiv



Gracias por la respuesta, pero el problema ahora sé que está en el hardware... el problema es que no lo encuentro.

Voy a revisar el circuito a ver si cambiando algún condensador o lo que sea, si a alguien se le ocurre algo lo agradezco.

Un saludo y gracias!


----------



## luis30 (Oct 22, 2015)

jipc dijo:


> Gracias por la respuesta, pero el problema ahora sé que está en el hardware... el problema es que no lo encuentro.
> 
> Voy a revisar el circuito a ver si cambiando algún condensador o lo que sea, si a alguien se le ocurre algo lo agradezco.
> 
> Un saludo y gracias!



Mira verifica el conector usb, que este correctamente conectado, mira viendolo por abajo es asi






aparte de eso solo es el cristal de 20mhz y el capacitor a tierra en el pin 18, yo puse uno de 104nf ceramico, y debe funcionar saludos.


----------



## COSMICO (Oct 22, 2015)

Que Windows estas usando, para probar. esos problemas por lo general son de driver.
La verdad depende de la versión de windows que uses, molestan bastante en windows 7 y windows 8.

Te sugiero si quieres y te sirve, que trabajes con XP en máquina virtual ahí estos circuitos trabajan muy bien, y los driver de XP son muy estables.

Esto es si no solucionaste y es urgente..


----------



## luis30 (Oct 22, 2015)

COSMICO dijo:


> Que Windows estas usando, para probar. esos problemas por lo general son de driver.
> La verdad depende de la versión de windows que uses, molestan bastante en windows 7 y windows 8.
> 
> Te sugiero si quieres y te sirve, que trabajes con XP en máquina virtual ahí estos circuitos trabajan muy bien, y los driver de XP son muy estables.
> ...



Tienes razon en cierto punto, yo estube trabajando con el usb y batalle ya que depende de la version de ccs que uses por ejemplo estos ejemplos hay que modificar el vid y pid del driver de microchip mas reciente para que funcione en ccs 5.048, si instalas la version anterior de ccs 4.104 creo que funciona bien, ahora el problema que el tiene es hardware ya que windows siquiera reconoce el dispositivo, puede ser el conector usb mal conectado o el cristal, solo hay que verificarlo bien ya que es hardware.

PD: windows deberia reconocerlo minimo.
PD1: intenta con este ejemplo yo lo uso para ccs 5.048 esta funcionando
PD2: olvide adjuntar la libreria usb_desc_cdc.h hay que modificarla en el vi y pid 


```
///////// config options, although it's best to leave alone for this demo /////
#ifndef  USB_CONFIG_PID
   #define  USB_CONFIG_PID       0x000a
#endif
#ifndef  USB_CONFIG_VID
   #define  USB_CONFIG_VID       0x04D8
#endif
#ifndef  USB_CONFIG_BUS_POWER
   #define  USB_CONFIG_BUS_POWER 100   //100mA  (range is 0..500)
#endif
#ifndef  USB_CONFIG_VERSION
   #define  USB_CONFIG_VERSION   0x0100      //01.00  //range is 00.00 to 99.99
#endif
```
saludos!


----------



## jipc (Ene 17, 2016)

Hola! 

Ahora he vuelto a retomar el tema y la conexión ya si que funciona... creo que no me daba cuenta de que estaba usando los usb_cdc.h y usb_desc_cdc.h que vienen por defecto en el programa (al principio cambié éstos pero parece que no se guardaban bien) . Así que los modificados los definí con 
	
	



```
#include ".\Librerias\usb_cdc.h"
#include ".\Librerias\usb_desc_cdc.h"
```
y así evito confusiones. 

El problema viene ahora que quiero hacer la detección del host por hardware. He seguido los pasos de las primeras páginas, usando el *pic18_usb_MODIFICADO.h* de Moyano, pero me salen 100 errores, de sintaxis casi todos, simplemente usando su .h en lugar de modificar del mío (algunos errores son del archivo modificado y otros del usb.h, el cual no da errores cuando uso el pic_18.h normal). También decir que el archivo que él cambió en su día tiene 1000 líneas de código más que el que viene por defecto en el css (sin contar con sus variaciones del sense pin y los leds rojo y verde) asi que no se... 

De momento a ver si me podéis echar una mano para entender esto me conformo. Gracias!!


----------



## luis30 (Ene 19, 2016)

jipc dijo:


> Hola!
> 
> Ahora he vuelto a retomar el tema y la conexión ya si que funciona... creo que no me daba cuenta de que estaba usando los usb_cdc.h y usb_desc_cdc.h que vienen por defecto en el programa (al principio cambié éstos pero parece que no se guardaban bien) . Así que los modificados los definí con
> 
> ...



No entiendo muy bien tu pregunta, no se a cual libreria te refieres, pero probablemente sea cuestion de los includes, como cambiaste la ruta de las librerias, deberias modificar dentro de cada libreria la ruta, si es que las tienes en una carpeta o las pusiste directo en la carpeta del programa, tal como hiciste con la usb_desc_cdc.h.

PD: si estoy mal cuelga tu codigo para ver, ya que no se a que libreria te refieres saludos.


----------



## jipc (Ene 19, 2016)

luis30 dijo:


> No entiendo muy bien tu pregunta, no se a cual libreria te refieres, pero probablemente sea cuestion de los includes, como cambiaste la ruta de las librerias, deberias modificar dentro de cada libreria la ruta, si es que las tienes en una carpeta o las pusiste directo en la carpeta del programa, tal como hiciste con la usb_desc_cdc.h.
> 
> PD: si estoy mal cuelga tu codigo para ver, ya que no se a que libreria te refieres saludos.



El fallo era que estaba modificando el pic18_usb*.h* en lugar del pic18_usb*.c* ... 

Pero bueno, me he quitado los errores pero no los problemas. Ahora el código que tengo es éste:

```
// Programa: Realiza procesos secundarios mientras el dispositivo está desconectado del HOST.
// Programador: Moyano Jonathan.
// 15/12/08
/********************************************************************************************/

#include <18F4550.h> // Definición de registros internos.

#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL6,CPUDIV1,VREGEN,NOPBADEN

// Fuses utilizados:
/*
HSPLL: utilizamos un cristal HS de alta velocidad, en conjunto con el PLL para generar los 48Mhz.
NOMCLR: Utilizamos reset por software, y dejamos el pin 1 del micro como entrada/salida digital.
NOWDT: No utilizamos el perro guardían.
NOPROTECT: Desactivamos la protección de código.
NOLVP: Desac tivamos la programación a bajo voltaje.
NODEBUG: No entramos al modo debug.
USBDIV: signfica que el clock del usb se tomará del PLL/2 = 96Mhz/2 = 48Mhz.
PLL5: significa que el PLL prescaler dividirá en 5 la frecuencia del cristal. para HS = 20Mhz/5 = 4Mhz.
CPUDIV1: El PLL postscaler decide la división en 2 de la frecuencia de salida del PLL de 96MHZ, si queremos 48MHZ, lo dejamos como está.
VREGEN: habilita el regulador de 3.3 volts que usa el módulo USB
NOPBADEN: Deshabilitamos el módulo de conversión ADC del puerto B.
*/

#use delay(clock=48000000) // Frecuencia máxima de trabajo 48 Mhz.
short estado_usb;   // boolean global, se debe declarar antes de llamar a usb_cdc.h
#define USB_CON_SENSE_PIN PIN_B5 // Definiendo este pin , detectamos si el host está conectado o no por hardware.
#include "usb_cdc.h" // Descripción de funciones del USB.
#include "usb_desc_cdc.h" // Descriptores del dispositivo USB.

// Declaramos las funciones utilizadas.
void estado_conexion_usb(short bandera);

void main() {
estado_usb=false;
   usb_cdc_init(); // llamadas necesarias para iniciar el módulo USB.
   usb_init_cs();    // inicia el USB y sale. Va de la mano con usb_task().
while(true){
     usb_task(); // configura el USB.
     estado_conexion_usb(estado_usb); // Se fija en el estado de la conexión usb.
     if(usb_cdc_connected()){ // Si está conectado entonces....
   // Espera a detectar una transmisión de la PC (Set_Line_Coding).
       if (usb_enumerated()){ // aquí se enumera el dispositivo por el host y despúes sale.
          if(usb_cdc_kbhit()){ //en espera de nuevo(s) caracter(es) en el buffer.
             if(usb_cdc_getc()=='m'){ //¿lo que llegó fué el caracter m?

                printf(usb_cdc_putc, "Llegó la letra m.\n\r"); // Envia una respuesta al HOST.
                output_high(PIN_B7); // Indica que ha llegado un caracter.
                delay_ms(1000); // Espera 1 seg.
                output_low(PIN_B7); // Apaga el indicador de llegada de caracteres.
             }  
          }
       }
     }
//*************** aquí se ejecutan otros procesos*********************//
// Estos procesos son independientes de la conexión por usb.
output_high(PIN_C2); // enciende el LED, conectado al pin RC2.
delay_ms(500); // Espera 500 mseg.
output_low(PIN_C2); // Apaga el LED, conectado al pin RC2.
delay_ms(500); // Espera 500 mseg.
}
}
//***********************************************
// Esta función, nos indica mediante 2 diodos LED conectados al 
// puerto RB0 y RB3 respectivamente. El estado de conexión del puerto usb.
// Conectado: Enciende LED VERDE.
// Desconectado: Enciende LED ROJO.
//***********************************************
void estado_conexion_usb(short bandera){
 if(bandera){
 output_high(PIN_B3); // Enciende LED VERDE.
 output_low(PIN_B0);  // Apaga LED ROJO.
 }else{
 output_high(PIN_B0); // Enciende LED ROJO.
 output_low(PIN_B3);  // Apaga LED VERDE.
 }
}
```

que es el ejemplo5 de Moyano. El caso es que el led amarillo (de la parte del code_ * aquí se ejecutan otros procesos*_)sí parpadea, el pc sí me reconoce al PIC sin problemas, peero se queda la luz fija del led rojo que indicaría que el USB está desconectado, aún cuando sí esta conectado al pc. 

Cuando compilo me aparecen algunos warnings, que se ven en la imagen adjuntada, y que por lo que sea deshabilitan las interrupciones... no se si es eso, pero no se donde sino puede estar el fallo.

saludos y Gracias!!


----------



## jipc (Ene 24, 2016)

Alguien sabe cómo arreglar este error? 

*Undefined identifier __usb_kbhit_status*

No encuentro nada por ahí y lo que he probado no funciona


----------



## tecno1814 (Mar 9, 2016)

Moyano Jonathan dijo:


> El segundo  ejemplo establece una comunicación bidireccional con la PC, a través de la clase CDC. La diferencia con respecto al ejemplo anterior es que esta véz se controla un LED conectado al puerto B del PIC y también se detecta si el puerto usb está conectado o no indicándolo con un led.
> También detecta cuando el host (pc) enumera al dispositivo (pic) encendiendo un LED verde , cuando el host no ha enumerado al pic prende un led rojo.
> 
> 
> ...



Hola que tal, quiero preguntar acerca de la aplicacion que creaste en el ejercicio 2, "USB_CDC Detección del host.exe" me gustaria saber si esa aplicación funciona sin depender de los otros componentes...es decir, en mi caso que aun no he instalado el controlador ni conectado el circuito...porque probé iniciandolo en una pc nueva y marca este error: Component 'MSCOMM32.OCX' or one of its dependencies not correctly registered: a file is missing or invalid

PD: El controlador basta con copiarlo a la carpeta de drivers de windows?
De antemano gracias.


----------



## D@rkbytes (Mar 10, 2016)

Verifica que ese control ActiveX se encuentre en la carpeta de sistema de Windows.
Aunque lo dudo, ya que ese componente es de Visual Basic 6 y viene con la instalación.
Si no lo tienes, lo puedes descargar desde aquí: *MSCOMM32.OCX* (Original)

Después lo tendrás que registrar en el sistema con el ejecutable REGSVR32.EXE (Está en la carpeta de sistema)
Con tal solo arrastrar y soltar el archivo MSCOMM32.OCX hacia el ejecutable REGSVR32.EXE, se debe registrar mostrando un aviso.
Por si acaso, también copia el archivo adjunto: "MSCOMM32.DEP"
Ese es el archivo de dependencias del control MSCOMM32.OXC

Si el control es correctamente registrado, se mostrará un mensaje similar a éste:



Suerte.​


----------



## tecno1814 (Mar 10, 2016)

Hola, pude arreglar el problema del control que no se podia registrar, en todo caso, lo que hice fue registrar con la ventana de comando con permisos de administrador
Por cierto, ya llevo algunas paginas leyendo y busco una forma en la que el pic reciba 5 datos y los almacene en 5 variables (x,y,r,g,b) donde X puede ser entre 0-7, Y entre 0-7, r entre 0-255, g entre 0-255, b entre 0-255...luego a su vez el pic las envia a cualquiera de los otros 8 pic que están conectados a el via i2c


----------



## SlyferPIC (May 13, 2016)

Moyano Jonathan dijo:


> Cualquier cosa que necesites , acá estamos. Si necesitas ayuda con algo de programación para el pic y para la pc lo vemos juntos y a ver que sale de todo esto.



aludos, el pprograma que estoy haciendo trabaja de la siguiente forma: se envia un dato desde la compuadora al pic, este es procesado en el pic, y en dependencia del dato, se muven uno motores paso a paso, el problema es que cuando el micro está en el ciclo que permite moverse a los motores le puede llegar un dato de control y este puede ser o pausar o parar, atendiendo a lo que se esto se puede hacer o por interrucion o por encuesta, pero en mi carrera no soportan el segundo metodo y necesito hacerlo por el primero, disculpa que no te halla contactado por uno de los foro, solo q por aqui es mas rapido y necesito ahorar tiempo. bueno, cuando me respondas te doy mas detalles.
SlyferPIC


----------



## jipc (Jun 25, 2016)

Aún sigo teniendo problemas con el SENSE PIN y su configuración con las funciones que explica Moyano en las primeras páginas... pero bueno al margen de eso, me gustaría preguntaros si la comunicación puerto serie virtual que hacemos, es posible usarla como si fuera una función. Quiero decir que si estoy en un bucle puedo consultar si se esta recibiendo algo? 

En definitiva quiero poder controlar variables tanto manualmente con un rotary, como por una interfaz gráfica a través del pc, pero que en todo momento pueda utilizar ambos recursos...

Gracias!


----------



## jipc (Ago 25, 2016)

Hola! Una pregunta, ¿qué tipo de interrupción puedo usar que se active cuando se recibe un dato por el puerto serie virtual? Usando la clase CDC por USB.

Gracias!


----------



## D@rkbytes (Ago 25, 2016)

La interrupción por recepción del módulo EUSART y no importa que clase uses, o que el puerto sea virtual.


----------



## jipc (Ago 25, 2016)

D@rkbytes dijo:


> La interrupción por recepción del módulo EUSART y no importa que clase uses, o que el puerto sea virtual.



Te refieres a #INT_RDA? Es que viendo los posts _#1251_ y la respuesta a continuación de Moyano o no es la misma pregunta o no lo he entendido bien. 

Según he entendido no me hace falta ninguna conexión con el RX y TX del PIC. 
Estoy buscando por todos lados y no termino de aclararme... 

Saludos y gracias


----------



## D@rkbytes (Ago 25, 2016)

jipc dijo:


> ¿Te refieres a #INT_RDA?


Si, pero fui genérico porque no mencionaste lenguaje de programación.


jipc dijo:


> Es que viendo los posts _#1251_ y la respuesta a continuación de Moyano o no es la misma pregunta o no lo he entendido bien.


Es que una cosa es la interrupción del módulo EUSART y otra la del módulo USB.
Ambas son seriales, pero con protocolos y servicios distintos.


jipc dijo:


> Según he entendido no me hace falta ninguna conexión con el RX y TX del PIC.
> Estoy buscando por todos lados y no termino de aclararme.


Mejor aclara qué es lo que quieres hacer y de cuál de los dos módulos estás hablando.
Porque Tx y Rx en un microcontrolador se refieren a un puerto RS-232 y D+ y D- a un puerto USB.


----------



## jipc (Ago 25, 2016)

D@rkbytes dijo:


> Mejor aclara qué es lo que quieres hacer y de cuál de los dos módulos estás hablando.
> Porque Tx y Rx en un microcontrolador se refieren a un puerto RS-232 y D+ y D- a un puerto USB.



De acuerdo, lo que tengo es conexion por usb cdc simulando un puerto serie virtual, es decir D+ y D- son las conexiones entre PC y PIC. Bien pues lo que quiero es que desde el PC, al enviar datos por este puerto simulado como si fuera por RS232, me salte una interrupción. 

Saludos


----------



## D@rkbytes (Ago 25, 2016)

Entonces debes usar la interrupción *#INT_USB
*Y por poleo puedes usar *usb_kbhit()*


----------



## Jose1306 (Ago 30, 2016)

Buenas. 

Quería hacer una pregunta relacionada al control del pic por medio de un puerto USB. 

Tengo un 18F4550 pero le tengo que deshabilitar la función USB que trae por defecto el micro, porque no me alcanza la memoria RAM por el número de variables que contiene el programa. Pero en un principio quería utilizar esa función.

Mi idea era transferir los datos que tiene el micro hacia un USB para de cierta forma "descargarle la información" a un pendrive. 

Alguien tiene una idea si se puede hacer esto? o tienen algún ejemplo en proton ?

Muchas gracias.


----------



## D@rkbytes (Ago 30, 2016)

Es más sencillo que uses una memoria micro SD y usar el protocolo FAT/FAT32, que una memoria USB OTG

Aquí verás algo de información al respecto, para los PIC24FJ256 con USB OTG:
*USB OTG and Embedded Host - Microchip*


----------



## Jose1306 (Ago 30, 2016)

Perfecto. Muchas gracias D@rkbytes. Voy a explorar eso del USB OTG. 

Tengo una micro SD también. Se puede transferir información desde la SD a un USB utilizando el 18F4550? Porque para hacer uso del USB OTG tengo que pasarme a los 24F y realizar nuevamente todo el trabajo.

Gracias


----------



## BUSTAMANTEHB (Nov 29, 2016)

amigo Moyano, estoy haciendo un pequeño proyecto de comunicacion usb via CDC y he visto varios ejemplos y ninguno me a funcionado, me podrias orientar para yo conectar mi pic por fin con la pc via usb cdc para mas adelante ver si puedo hacer consultas desde el pic a una base de datos en la pc espesificamente en el jestor de bases de datos de php myadmin alojada en wamp server.  Tambien mi gran vision en el futuro una ves que pueda lograr la coneccion del pic con la pc via usb cdc es terminar un entorno grafico multilenguaje que he venido haciendo en GTK++ para microcontroladores y asi controlar Hardware desde la pc con este entorno grafico y microcontroladoes. Espero tu ayuda en la comunicacion usb CDC, utilizo windows 7 y en mi laptop windows 10 y tambien Ubuntu version 15.


----------

