Autor Tema: Comunicacion USB y PIC-LABVIEW  (Leído 2687 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado ADY12

  • PIC10
  • *
  • Mensajes: 43
Comunicacion USB y PIC-LABVIEW
« en: 16 de Septiembre de 2015, 06:22:34 »
Una pregunta en la comunicación USB comunicación (HID), cuando medimos sensores como por ejemplo; temperatura, potenciómetro (nivel de líquido), tenemos unos menús para poder seleccionar el tipo de medida.
Cuando hacemos las medidas con el C CCS podemos seleccionar la medida que queremos medir. y a la hora de unirlo con labview el menú se desaparece y no podemos visualizar ninguna medida, pero si reconoce el usb.
la pregunta es que deberíamos hacer para poder seleccionar el sensor que queremos medir (la selección lo hacemos a través de un teclado).

Desconectado ADY12

  • PIC10
  • *
  • Mensajes: 43
Re: Comunicacion USB y PIC-LABVIEW
« Respuesta #1 en: 17 de Septiembre de 2015, 06:12:30 »
Tengo esta parte del código pero nose por donde tirar, si alguien me pudiera ayudar.

in_data y out_data, serian las variables a medir, en este caso he puesto solamente una para probar.

Código: [Seleccionar]
case 4:
  
   switch (j) {
  
            case '1':
                    output_low(LED1);                    //Se apaga el led verde  
                    output_high(LED2);                   //Se enciende el led rojo  
                    usb_init();
                    usb_task();                          //Hace que se conecte y desconecte automaticamente
                    usb_wait_for_enumeration();          //Espera hasta que se reconoce el dispositivo
                    output_high(LED1);                   //Se enciende el led verde
                    output_low(LED2);                    //Se apaga el led rojo
                    out_data[8]=TC;
                    while (usb_enumerated()){
                    if(usb_kbhit(1)) usb_get_packet(8, in_data,8);
                    if (in_data[0]=0x0A) usb_put_packet(8,out_data,8,USB_DTS_TOGGLE);
                    }                                  
                    break;
                  
            case '#':
                    Mostrar_menu_inicial();
                    Nivelmenu=0;
                    break;
                    
            default:
                     break;
   }
            break;        

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Comunicacion USB y PIC-LABVIEW
« Respuesta #2 en: 17 de Septiembre de 2015, 06:40:41 »
Como que primero que nada no pondria


              usb_init();
                    usb_task();                          //Hace que se conecte y desconecte automaticamente
                    usb_wait_for_enumeration();          //Espera hasta que se reconoce el dispositivo

Dentro de la ejecucion del menu, sino que eso solamente lo haria al comienzo del programa y nunca mas, Ootro problema que se puede presentar aca es que nunca se conecte el USB y por lo tanto no salga mas del "usb_wait_for_enumeration()" lo cual se podria implementar una especie de timeout, o de deteccion si esta conectado o no el USB, para evitar ese problema.
Otro tema tambien es el usb_init el cual se detiene ahi esperando que se conecte, Asi que todo va a depender de como este hecho tu hardware, si se alimenta desde el USB de la maquina, entonces podes usar eso asi nomas y ponerlo al comienzo del main( antes del loop del menu ). Sino vas a tener que usar usb_init_cs(), mas definir un pin de sensado de que esta el bus (USB_CON_SENSE_PIN) y llamar continuamente a usb_task que es el encargado de que lo desconecte o no segun el pin ese

En el siguiente lugar:

                    while (usb_enumerated()){
                    if(usb_kbhit(1)) usb_get_packet(8, in_data,8);
                    if (in_data[0]=0x0A) usb_put_packet(8,out_data,8,USB_DTS_TOGGLE);
                    }

Tenes un while... por lo que obviamente de ahi no va a salir mas. podrias cambiarlo por un if asi de esa forma si no esta conectado el usb, no se pone a intentar recibir o enviar.

Y por ultimo me queda una duda.
Asi como esta el codigo y haciendo los cambios que dije, la unica forma que reciba y envie es cuendo entras en esa opcion, es decir que mientras estas en otras partes del "menu" eso no se va a ejecutar.
Asi que no se si queres realmente que eso suceda, o fue algo no pensado.

No habia respondido por que yo no conozco mucho de USB y menos de CCS, pero normalmente es C.
« Última modificación: 17 de Septiembre de 2015, 06:45:54 por KILLERJC »

Desconectado ADY12

  • PIC10
  • *
  • Mensajes: 43
Re: Comunicacion USB y PIC-LABVIEW
« Respuesta #3 en: 17 de Septiembre de 2015, 07:19:00 »
KILLERJC, si yo tambien en el tema USB estoy perdido.

Y sobre lo que comentas:
Citar
Asi como esta el codigo y haciendo los cambios que dije, la unica forma que reciba y envie es cuendo entras en esa opcion, es decir que mientras estas en otras partes del "menu" eso no se va a ejecutar.
Asi que no se si queres realmente que eso suceda, o fue algo no pensado.

Si pretendo que tenias dos opciones al comienzo de todo que era, 1.MENU y 2.ENVIAR DATOS. En la primera quiero que funcione mientras no esta conectado el USB. En la segunda cuando el USB este conectado haga lo mismo que en la primera, es decir, que lo muestre por la pantalla del LCD con sus submenus y muestre las variables, y ademas pueda ver estos datos en el LABVIEW a traves de la informacion que envia por USB. El USB se alimenta desde la maquina.

Ahora mismo el while de dentro del main lo tengo asi,(sin haber aplicado tus correciones que me acabas de comentar). Nose si cuando entro en la opcion de enviar datos, deberia meter otra vez lo mismo que en la primera opcion.

Código: [Seleccionar]
while(TRUE){  //Bucle infinito siempre consulta el teclado
Obtenerdatos();
k=kbd_getc();



if (k!=0 )// &&  j!=k)
{
j=k;
}
else
{
j=0;
}
              //Comprueba que la tecla presionada no sea la misma que se presiono la ultima vez            

switch(Nivelmenu){
   case 0:
          switch (j){                  //Menu principal
          case '1':
                  Mostrar_menu_de_variables(); // Menu 1.MOT, 2.NCOMB,3.TAC,4.AMB
                  Nivelmenu=1; //Indica en todo momento en que submenu estamos
                  break;
          case '2':
                  EnviarDatos();                  
                  Nivelmenu=4;
                  break;
          default:
                  break;
          }
          break;
   case 1:                          //Menu de variables, se muestran todas las variables para que se seleccione una
          switch (j){ //j es la tecla que llegeixes del teclat
          case '1':
                  Mostrar_menu_var(); //Menu Obtener datos y volver al menu atras
                  variable=1;  //variable es la opción pulsada de 1.MOT 2.NCOMB 3.TAC 4.AMB
                  Nivelmenu=2;
                  break;
          case '2':
                  Mostrar_menu_var();
                  variable=2; //variable es la opción pulsada de 1.MOT 2.NCOMB 3.TAC 4.AM
                  Nivelmenu=2;
                  break;
          case '3':
                  Mostrar_menu_var();
                  variable=3; //variable es la opción pulsada de 1.MOT 2.NCOMB 3.TAC 4.AM
                  Nivelmenu=2;
                  break;
          case '4':
                  Mostrar_menu_var();
                  variable=4;//variable es la opción pulsada de 1.MOT 2.NCOMB 3.TAC 4.AM
                  Nivelmenu=2;
                  break;
          case '#':
                  Mostrar_menu_inicial();
                  variable=0; //variable es la opción pulsada de 1.MOT 2.NCOMB 3.TAC 4.AM
                  Nivelmenu=0;
                  break;
          default:
                 break;
          }
          break;
    case 2: // Menu de cada variable, todas tienen 2 opciones, obtener datos y salir al menu anterior
          
           switch (j) {
          
           case '1': Mostra_variable(variable);
                     Nivelmenu=3;
                     break;
                    
           case 'A':        
                     Mostrar_menu_de_variables();
                     Nivelmenu=1;
                     break;
                    
           default:  
                      break;
          }
          break;    
          
          
   case 3:
  
   switch (j) {
          
                              
           case 'A':        
                     Mostrar_menu_de_variables();
                     Nivelmenu=1;
                     break;
                    
            default:
                     Mostra_variable(variable);
                     delay_ms(1);

                     break;
   }
            break;
  
   case 4:
  
   switch (j) {
  
            case '1':
                    output_low(LED1);                    //Se apaga el led verde  
                    output_high(LED2);                   //Se enciende el led rojo  
                    usb_init();
                    usb_task();                          //Hace que se conecte y desconecte automaticamente
                    usb_wait_for_enumeration();          //Espera hasta que se reconoce el dispositivo
                    output_high(LED1);                   //Se enciende el led verde
                    output_low(LED2);                    //Se apaga el led rojo
                    //out_data[0]=p;
                    if (usb_enumerated()){
                    out_data[0]=p;
                    usb_put_packet(1,out_data,1,USB_DTS_TOGGLE);
                    if (usb_kbhit(1)){
                    usb_get_packet(1,in_data,1);
                    }
                    
                    }                                  
                    break;
                  
            case '#':
                    Mostrar_menu_inicial();
                    Nivelmenu=0;
                    break;
                    
            default:
                     break;
   }
            break;
}//end switch Nivel Menu
}  //end while
}  //end main menu
« Última modificación: 17 de Septiembre de 2015, 07:23:52 por ADY12 »

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Comunicacion USB y PIC-LABVIEW
« Respuesta #4 en: 17 de Septiembre de 2015, 08:27:33 »
Si me decis que tu placa se alimenta directamente desde el USB, es decir no va a estar energizada cuando la desconectes, entonces haria algo asi.
No se si es correcto el uso de usb_put_packet o usb_get_packet, pero creo que asi lo haria yo.

Código: C
  1. int1 usb_habilitado;    //Bandera para indicar que se habilito del menu el enviar por USB
  2.  
  3. usb_init();                     // Confiuracion inicial del dispositivo + enumeracion
  4. usb_task();                     // No hay problema si es que se desconecta, ya que perderia VDD y se reiniciaria el micro
  5. usb_wait_for_enumeration();
  6.  
  7. while(TRUE){  //Bucle infinito siempre consulta el teclado
  8.  
  9. Obtenerdatos();
  10.  
  11. if (usb_habilitado && usb_enumerated()){                //En el loop principal asi cuando se habilita lee/escribe siempre mientras sigue el menu
  12.         out_data[0]=p;
  13.         usb_put_packet(1,out_data,1,USB_DTS_TOGGLE);
  14.         if (usb_kbhit(1)){
  15.                 usb_get_packet(1,in_data,1);
  16.         }
  17. }
  18.  
  19. k=kbd_getc();
  20.  
  21.  
  22.  
  23. if (k!=0 )// &&  j!=k)
  24. {
  25. j=k;
  26. }
  27. else
  28. {
  29. j=0;
  30. }
  31.               //Comprueba que la tecla presionada no sea la misma que se presiono la ultima vez            
  32.  
  33. switch(Nivelmenu){
  34.    case 0:
  35.           switch (j){                  //Menu principal
  36.           case '1':
  37.                   Mostrar_menu_de_variables(); // Menu 1.MOT, 2.NCOMB,3.TAC,4.AMB
  38.                   Nivelmenu=1; //Indica en todo momento en que submenu estamos
  39.                   break;
  40.           case '2':
  41.                   output_toggle(LED1);                   // Toggle del led, led encendido, habilitado el USB, apagado no habilitado para recibir o escribir
  42.                   usb_habilitado = ~usb_habilitado;      // Cambio estado de la bandera. Sigo en el mismo nivel del menu, el led es mi indicador
  43.                   break;
  44.           default:
  45.                   break;
  46.           }
  47.           break;
  48.    case 1:                          //Menu de variables, se muestran todas las variables para que se seleccione una
  49.           switch (j){ //j es la tecla que llegeixes del teclat
  50.           case '1':
  51.                   Mostrar_menu_var(); //Menu Obtener datos y volver al menu atras
  52.                   variable=1;  //variable es la opción pulsada de 1.MOT 2.NCOMB 3.TAC 4.AMB
  53.                   Nivelmenu=2;
  54.                   break;
  55.           case '2':
  56.                   Mostrar_menu_var();
  57.                   variable=2; //variable es la opción pulsada de 1.MOT 2.NCOMB 3.TAC 4.AM
  58.                   Nivelmenu=2;
  59.                   break;
  60.           case '3':
  61.                   Mostrar_menu_var();
  62.                   variable=3; //variable es la opción pulsada de 1.MOT 2.NCOMB 3.TAC 4.AM
  63.                   Nivelmenu=2;
  64.                   break;
  65.           case '4':
  66.                   Mostrar_menu_var();
  67.                   variable=4;//variable es la opción pulsada de 1.MOT 2.NCOMB 3.TAC 4.AM
  68.                   Nivelmenu=2;
  69.                   break;
  70.           case '#':
  71.                   Mostrar_menu_inicial();
  72.                   variable=0; //variable es la opción pulsada de 1.MOT 2.NCOMB 3.TAC 4.AM
  73.                   Nivelmenu=0;
  74.                   break;
  75.           default:
  76.                  break;
  77.           }
  78.           break;
  79.     case 2: // Menu de cada variable, todas tienen 2 opciones, obtener datos y salir al menu anterior
  80.            
  81.            switch (j) {
  82.            
  83.            case '1': Mostra_variable(variable);
  84.                      Nivelmenu=3;
  85.                      break;
  86.                      
  87.            case 'A':        
  88.                      Mostrar_menu_de_variables();
  89.                      Nivelmenu=1;
  90.                      break;
  91.                      
  92.            default:  
  93.                       break;
  94.           }
  95.           break;    
  96.          
  97.          
  98.    case 3:
  99.    
  100.    switch (j) {
  101.            
  102.                              
  103.            case 'A':        
  104.                      Mostrar_menu_de_variables();
  105.                      Nivelmenu=1;
  106.                      break;
  107.                      
  108.             default:
  109.                      Mostra_variable(variable);
  110.                      delay_ms(1);
  111.  
  112.                      break;
  113.    }
  114.             break;
  115. }//end switch Nivel Menu
  116. }  //end while
  117. }  //end main menu

Desconectado ADY12

  • PIC10
  • *
  • Mensajes: 43
Re: Comunicacion USB y PIC-LABVIEW
« Respuesta #5 en: 21 de Septiembre de 2015, 06:16:42 »
KILLERJC, una cuestion:
Citar
i se alimenta desde el USB de la maquina, entonces podes usar eso asi nomas y ponerlo al comienzo del main( antes del loop del menu ). Sino vas a tener que usar usb_init_cs(), mas definir un pin de sensado de que esta el bus (USB_CON_SENSE_PIN) y llamar continuamente a usb_task que es el encargado de que lo desconecte o no segun el pin ese

En el caso que tenga una bateria externa que alimenta la placa y solo quiero el usb para transmitir los datos al ordenador para poder observarlos a traves del LABVIEW, es decir, que solo conectare el usb para ver datos en el ordenador. En lugar de poner usb_init() se pondria el usb_init_cs() y el usb_task() y el usb_wait_for_enumeration() desaparecerian antes del loop. La unica duda es que el USB_CON_SENSE_PIN(le puesto que sea el pin B3 que es un led) que seria el led que detecta el USB. El codigo quedaria de la siguiente manera(nose si es correcto, me detecta el ordenador, el problema es que cuando quiero deshabilitarlo no puedo o a veces no lo detecta hace el tonto):

Código: [Seleccionar]
while(TRUE){  //Bucle infinito siempre consulta el teclado
Obtenerdatos();

if (usb_habilitado){      //En el loop principal asi cuando se habilita lee/escribe siempre mientras sigue el menu
usb_task();
if (usb_enumerated()){
out_data[0]=p;
        usb_put_packet(1,out_data,1,USB_DTS_TOGGLE);
        if (usb_kbhit(1)){
           usb_get_packet(1,in_data,1);
        }
}
}

k=kbd_getc();

if ((k!=0 ) &&  (j!=k))
{
j=k;
}
else
{
j=0;
!}
              //Comprueba que la tecla presionada no sea la misma que se presiono la ultima vez            

switch(Nivelmenu){
   case 0:
          switch (j){                  //Menu principal
          case '1':
                  Mostrar_menu_de_variables(); // Menu 1.MOT, 2.NCOMB,3.TAC,4.AMB
                  Nivelmenu=1; //Indica en todo momento en que submenu estamos
                  break;
          case '2':
                  output_toggle(LED1);                   // Toggle del led, led encendido, habilitado el USB, apagado no habilitado para recibir o escribir
                  usb_habilitado = ~usb_habilitado;
                  break;
          default:
                  break;
          }
          break;
« Última modificación: 21 de Septiembre de 2015, 06:58:40 por ADY12 »

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Comunicacion USB y PIC-LABVIEW
« Respuesta #6 en: 21 de Septiembre de 2015, 10:50:41 »
Segun el manual si se usa Connection Sense. obivmante inicias con usb_init_cs(); y debes definir USB_CON_SENSE_PIN, esto es un pin que no tiene otro uso, que se pondra a uno cuando se conecte el puerto USB a la placa

#define USB_CON_SENSE_PIN PIN_B3

Y luego usb_task() debe ser llamado cada tanto para que detecte si es que se conecto o no. Ahora viene la parte que tengo dudas, en el manual tenes estas 2 funciones

Si se detecta que esta conectado va a montar el USB. Por lo cual podes preguntar con:

usb_attached() si es que esta montado o no, esto despues del usb_task(), realmente no se que mas se pueda hacer. asi que imagino algo asi:


Código: C
  1. usb_task();
  2. if (usb_habilitado && usb_enumerated() && usb_attached()){
  3.         out_data[0]=p;
  4.         usb_put_packet(1,out_data,1,USB_DTS_TOGGLE);
  5.         if (usb_kbhit(1)){
  6.            usb_get_packet(1,in_data,1);
  7.         }
  8. }

No esperamos hasta que se enumere el dispositivo, directamente seguimos hasta que se cumpla la condicion de que: este el USB puesto, este ennumerado Y este habilitado para el envio de datos.

Vuelvo a repetir, yo me estoy metiendo mucho pero no tengo la menor idea, lo unico que hago es tratar de crear un codigo con lo que hay en el manual. Se que CCS tiene ejemplos, deberias tratar de buscarlo, o buscar un ejemplo que utilize justamnte en sensado

Desconectado ADY12

  • PIC10
  • *
  • Mensajes: 43
Re: Comunicacion USB y PIC-LABVIEW
« Respuesta #7 en: 22 de Septiembre de 2015, 06:03:57 »
Si KILLERJC, estoy con el manual observando, he corregido algunas cosas, que me detectaba mal(en las librerias).
Finalmente el out_data[8] es un int8.

Claro cuando el USB este activado, por el ordenador puedas visualizar cualquier variable.

Código: [Seleccionar]
usb_task();
if (usb_habilitado && usb_enumerated() && usb_attached()){
        out_data[0]=p;
        usb_put_packet(1,out_data,1,USB_DTS_TOGGLE);
        if (usb_kbhit(1)){
           usb_get_packet(1,in_data,1);
        }

es decir,

Código: [Seleccionar]
usb_task();
if (usb_habilitado && usb_enumerated() && usb_attached()){
        out_data[0]=TC;  //Temperatura motor
        out_data[1]=p;   //Nivel comb
        out_data[2]=RPM;//RPM
        out_data[3]=VEL;//vel
        usb_put_packet(1,out_data,1,USB_DTS_TOGGLE);
        if (usb_kbhit(1)){
           usb_get_packet(1,in_data,1);
        }

al tener las 4 variables puestas, siempre me lee en todas el de TC que es temperatura motor.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Comunicacion USB y PIC-LABVIEW
« Respuesta #8 en: 22 de Septiembre de 2015, 13:30:44 »
¿ Conviene usar usb_put_packet() o directamente usar usb_puts() ?

Creo que puts permite que si no entra en el endpoint se envien varios.
Pero apartir de aca estoy TAN perdido como vos :P
« Última modificación: 22 de Septiembre de 2015, 13:33:22 por KILLERJC »


 

anything