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

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.
 
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,,,

Código:
#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
 
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,,,
 
Última edición:
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
 
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 !
 
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. :)
 
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..
 
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.
 
Última edición:
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.
 
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.
 
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.
 
Última edición:
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
 
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
 
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 :(
 
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)
 
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
 
Atrás
Arriba