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

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

PHP:
#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
}
 
Última edición por un moderador:
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 :)
 
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..::D
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?
 
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.
 
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..
 
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.
 
Última edición:
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
 
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#:

Código:
       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:

Código:
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!
 
Última edición:
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

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.
 
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
 
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.
 
Última edición:
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 :cry:) que se abre despues de introducir la contraseña correcta...
 

Adjuntos

  • App Pass v1.0 [Sola].part1.rar
    1.4 MB · Visitas: 118
  • App Pass v1.0 [Sola].part2.rar
    746.2 KB · Visitas: 86
  • App Pass v1.0.part1.rar
    2 MB · Visitas: 114
  • App Pass v1.0.part2.rar
    2 MB · Visitas: 90
  • App Pass v1.0.part3.rar
    2 MB · Visitas: 98
  • App Pass v1.0.part4.rar
    2 MB · Visitas: 158
  • App Pass v1.0.part5.rar
    2 MB · Visitas: 104
  • App Pass v1.0.part6.rar
    2 MB · Visitas: 94
  • App Pass v1.0.part7.rar
    2 MB · Visitas: 82
  • App Pass v1.0.part8.rar
    1.2 MB · Visitas: 98
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...


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

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 !
 
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.
 
Atrás
Arriba