Autor Tema: USB en CCS: Detectando y gestionando la interrupción  (Leído 30599 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado Andres D

  • PIC10
  • *
  • Mensajes: 8
Re: USB en CCS: Detectando y gestionando la interrupción
« Respuesta #45 en: 20 de Abril de 2009, 20:54:01 »
Hola.

Quisiera saber si hay algún modo de gestionar la interrupción por USB sin necesidad de copiar las funciones de las librerias mencionadas, y usando el comando usb_get_packet.

Aclaro que no me interesa manipular los registros de los endpoint directamente, sino simplemente usar usb_get_packet cada vez que se detecte la interrupción.


Quisiera manipular la interrupción con un formato igual o parecido al siguiente (ejemplo para el ADC):

#int_ad
control_adc()
{
   adc_activo=FALSO;
}

Gracias.

Desconectado rafaelnotty

  • PIC10
  • *
  • Mensajes: 7
Re: USB en CCS: Detectando y gestionando la interrupción
« Respuesta #46 en: 29 de Julio de 2010, 18:39:22 »
...sta muy exelente este foro!! ahora a probar todo!

modulay! primero mis respetos por el manejo del tema q tienes

una preguntik la insercion de la funcion (datos_endpoint(en) ; ) esta dentro de un else q podria no entrar en esa parte del codigo
y no "continuar" con la interrupcion personalizada, una mejor opcion no seria dejar esta funcion fuera de todos los "if" para q siempre
se llegue a este codigo.
bno y otra cosa es el parametro de la funcion (en) aqui se utiliza 1,2,3? yo solo necesito un solo endpoint puedo dejar siempre un "1" alli?
« Última modificación: 29 de Julio de 2010, 23:44:44 por rafaelnotty »

Desconectado rafaelnotty

  • PIC10
  • *
  • Mensajes: 7
Re: USB en CCS: Detectando y gestionando la interrupción
« Respuesta #47 en: 29 de Julio de 2010, 23:43:05 »
hola a todos... agradesco quien me pueda colaborar en esto
bueno amplio aqui el planteamiento de mi problemilla:
mi targeta de comunicacion con el pic18f4550 recibe solo 1 solo paquete y no es posible recibir otro paquete solo conectandolo y lo desconectandolo del puerto usb
y pienso q todo el proble es por las interrupciones, intente hacer lo del amigo modulay pero bno, estoy intentandolo...

interrupts disable during call to prevent re-entrancy: (usb_token_reset)


gracias por la colaboracion.

Desconectado Modulay

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 2651
Re: USB en CCS: Detectando y gestionando la interrupción
« Respuesta #48 en: 30 de Julio de 2010, 09:15:07 »
Esas ramas "if" son necesarias, ya que engloban las comunicaciones en ambos sentidos, con transferencias de control por endpoint 0 implicadas y tal...

Pon tu código a ver si encontramos algo raro.

Saludo

Desconectado rafaelnotty

  • PIC10
  • *
  • Mensajes: 7
Re: USB en CCS: Detectando y gestionando la interrupción
« Respuesta #49 en: 30 de Julio de 2010, 17:38:51 »
bueno, aqui yo tengo varios enredos:

1. la velocidad del micro no esta bn, debido a que las rutinas delays no tardan lo que deberian pese a que el reloj esta en 4.000.000 y el cristal fisicamente sta bn

2. no entendi tu subrutina datosenpoit(en) por tanto no pude implementar algo parecido para sacar los datos directamente del buffer (porfa si puedes explicarla seria exelente)

3. consegui bn conexion con el usb, pero esta se pierde luego de recibir del pc los primeros 64 bytes (no se vuelven a producir interrupciones pero el codigo del main sigue ejecutandose) y entonces me di cuenta q conectando y desconectando podia restablecerse la conexion, entonces lo hice por los comandos usb_detach ();  usb_attach ();   usb_init();  usb_task();  usb_wait_for_enumeration(); despues de recibir cada paquete de 64bytes

4. funcionando esta parte, a mi me sirve porq solo necesito enviar comando a unas targetas por i2c pero aparecio otro problema, el usb deja de funcionar, ya probe con la misma tactica del usb_detach ();  usb_attach (); (conectando y desconectando por comandos) pero nada ya no funciona, como q no pueden coexistir estos 2 protocolos, ¿se necesitara algo mas?.

aqui esta el codigo:
Código: [Seleccionar]
#include <18F4550.h>
#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL1,CPUDIV1,VREGEN,MCLR,NOPBADEN
// No olvide que PLL1 = Para un Xtal de 4Mhz
//               PLL2 = Para un Xtal de 8Mhz
//               PLL3 = Para un Xtal de 12Mhz
//               PLL4 = Para un Xtal de 20Mhz , etc.
#use delay(clock=4000000)
#use i2c(Master,Fast,sda=PIN_B0,scl=PIN_B1,restart_wdt,force_hw)

#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    64                 //size to allocate for the rx endpoint 1 buffer

//#define USB_CON_SENSE_PIN PIN_B2  //CCS 18F4550 development kit has optional conection sense pin

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

/*////////////////////////////////////////////////////////////////////
               
         0xD8,0x04,           //vendor id (0x04D8 is Microchip)
         0x0B,0x00,           //product id
         0x01,0x00,           //device release number

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

#BYTE ADCON1  = 0x0FC1                         
#BYTE CMCON   = 0x0FB4                         

int8 dato[64];
int8 dato2[64];

void main(void) {
   set_tris_a(0);
   set_tris_b(0);
   dato2[1]=123;
   output_a(0);
   delay_ms(1000);
   output_bit (pin_B0,1);
   output_bit (pin_B1,0);
   delay_ms(1000);
   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_bit (pin_B0,0);
   output_bit (pin_B1,1);
   delay_ms(1000);
   
   ADCON1 = 0x0F; 
   CMCON  = 0x07;   
   set_tris_a(0);
   //disable_interrupts(GLOBAL);

   while (TRUE)
   {
 
      if(usb_enumerated())                      // si el Pic está configurado via USB
      {
       if (usb_kbhit(1))                      // si el endpoint de salida contiene datos del host
         {
        // disable_interrupts(GLOBAL);
          delay_ms(10000);
          output_toggle(PIN_B7);
          delay_ms(10000);
          output_toggle(PIN_B7);
          delay_ms(2000);
         
          usb_get_packet(1, dato, 64);   
          output_a(dato[0]);
          delay_ms(1000);
          dato[0] =142;// input_c();                   
          usb_put_packet(1, dato, 64, USB_DTS_TOGGLE); //leer q es dts toggle
          delay_ms(1000);
          usb_detach ();
/*          delay_ms(100);
          i2c_start();
          i2c_write(2);     // Device address
          i2c_write(2);     // Device address
          delay_ms(1000);
          i2c_write(dato[0]);  // Data to device
          delay_ms(1000);
          i2c_stop();

*/         
          //enable_interrupts(GLOBAL);
          delay_ms(100);
          usb_attach ();
          usb_init();                                  // inicializamos el USB
          usb_task();                                  // habilita periferico usb e interrupciones
          usb_wait_for_enumeration();
         }
       }
   }
}


Desconectado Modulay

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 2651
Re: USB en CCS: Detectando y gestionando la interrupción
« Respuesta #50 en: 30 de Julio de 2010, 21:19:13 »
Código: CSS
  1. #define BD1OSTAT        0x408
  2. #define BD1OCNT         0x409
  3. #define BD1OADRL        0x40A
  4. #define BD1OADRH        0x40B
  5.  
  6. int8 buffer_usb_in[64];
  7.  
  8. void datos_endpoint(int8 ep)
  9. {
  10.   int8 i,bytes_recibidos,*ptr;
  11.   bytes_recibidos = *(BD1OCNT + ep*8);      
  12.   ptr = 256*(*(BD1OADRH + 8*ep)) + (*(BD1OADRL + ep*8));
  13.   for(i = 0; i < bytes_recibidos; i++)
  14.     {
  15.     buffer_usb_in[i] = *ptr;
  16.     ptr++;
  17.     }
  18.   usb_flush_out(ep, USB_DTS_TOGGLE);  
  19. }

- bytes_recibidos contiene el número de bytes recibidos en el endpoint en cuestión. En tu caso almacena el valor 64.
- ptr se inicializa con la direccion de memoria a partir de la cual se almacenan los datos recibidos por el endpoint, y después
lo usamos para ir leyendo byte a byte y copiándolo en el array buffer_usb_in[].
- La llamada a usb_flush_out(ep, USB_DTS_TOGGLE) no debe faltar para que las interrupciones puedan seguir funcionando.

Desconectado rafaelnotty

  • PIC10
  • *
  • Mensajes: 7
Re: USB en CCS: Detectando y gestionando la interrupción
« Respuesta #51 en: 31 de Julio de 2010, 00:47:02 »
gracias, es ud muy atento;

aprobechando su generosidad y atencion le tengo una preguntik bn puntual;

¿porq las interrupciones por usb son desabilitadas en algun momento de recibir datos? o a lo largo de toda la libreria pic18_usb.h?
debido a mi problema (qno se generan nuevas interrupciones luego de reibir los 1eros 64 bytes)
¿seria valido editar todas las funciones y hacer un llamado a la funcion usb_flush_out(ep, USB_DTS_TOGGLE) en todas las funciones de las librerias??
esto para que no se pierda la continuidad de los datos por interrupcion... colaborame con esa duda y con este problemillo

gracias

Desconectado Modulay

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 2651
Re: USB en CCS: Detectando y gestionando la interrupción
« Respuesta #52 en: 31 de Julio de 2010, 06:37:58 »
Cuando se atiende una interrupcion se debe evitar que vuelva a saltar la misma interrupción antes de terminar de procesar la anterior.
Esa que te puse es un ejemplo de rutina de interrupción que puedes usar como punto de partida para construir la tuya propia (llevando a cabo todos los cambios que explico en el primer post del hilo), y como puedes ver, al final lleva la llamada a usb_flush_out(ep, USB_DTS_TOGGLE), la cual vuelve a habilitar el endpoint para seguir funcionando. Lo que no recuerdo es si la interrupción es habilitada por dicha llamada o se hace previamente en otro sitio, pero habilitarse, se habilita.

Desconectado rafaelnotty

  • PIC10
  • *
  • Mensajes: 7
Re: USB en CCS: Detectando y gestionando la interrupción
« Respuesta #53 en: 31 de Julio de 2010, 15:57:47 »
gracias, exelente, voy a probar... y bueno otra preguntika... pueden coexistir el i2c y el usb?? alguna recomendacion en especial?
gracias...

Desconectado rafaelnotty

  • PIC10
  • *
  • Mensajes: 7
Re: USB en CCS: Detectando y gestionando la interrupción
« Respuesta #54 en: 01 de Agosto de 2010, 00:59:29 »
bno! como siempre agradecido x la colaboracion pero;
ya hize todo lo de pasar los codigos de las rutinas de pic18_usb.h al codigo principal del compilador
ya he probado tambn el codigo de datos_endpoint(en); lo anexe

pero persisten los problemas, luego de los primeros bytes el programa no vuelve a generar interrupciones
y usando otra vez la tactica de detach(); y el attach(); conectando y desconectando hardware logro seguir recibiendo datos pero etos no estan siendo logicos, los datos no son los q son o los que deberian ser, he hecho un par de pruebas como xej mostrar todas las posiciones de buffer_in[1,2,3,4,...] y no salen datos coherentes a lo q estoy enviando (si xej mando puros 1s salen puros datos raros)... bueno, estoy por rendirme en esto de comprnder a profundidad el usb

  bytes_recibidos = *(BD1OCNT + ep*8);                                      // el + ep*8 es para saltar el ep0 de control?
  ptr = 256*(*(BD1OADRH + 8*ep)) + (*(BD1OADRL + ep*8));      //igual aka?
     
estos mensajes warning me parecen raros pero no doi para resolverlos; con la operacion que modulay sugirio al principio del foro desaparecieron 2 de estos warning pero todavia salen 2 mas...

>>> Warning 203 "C:\Program files\PICC\drivers\pic18_usb.h"Line 523(1,1); Condition always TRUE                           // esto es una gran duda para mi
>>> Warning 216 "usb.c"Line 291(0,1): Interrupts disabled during call to prevent re-entrancy: (usb_token_reset)         //si puede echeme una mano(explicacion)

¿q hago? si puedes ayudame o aconsejame abandonar la comprension exaustiva del usb como ud la tiene...

Desconectado Modulay

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 2651
Re: USB en CCS: Detectando y gestionando la interrupción
« Respuesta #55 en: 04 de Agosto de 2010, 16:38:53 »
Bueno, mi comprensión de este tema tampoco es tan exahustiva, aparte que tampoco conozco en profundidad la librería usb de ccs (para lo cual se hace necesario conocer el protocolo usb bastante bien).
En cuanto al i2c, no veo motivo por el cual no pueda coexistir con el usb.
Respecto a los warnings, la verdad q no recuerdo si a mí también me salían...si fué así, no creo que los tuviera muy en cuenta.


  bytes_recibidos = *(BD1OCNT + ep*8);                                      // el + ep*8 es para saltar el ep0 de control?
  ptr = 256*(*(BD1OADRH + 8*ep)) + (*(BD1OADRL + ep*8));      //igual aka?
     

Efectivamente. BD1OCNT, BD1OADRH y BD1OADRL se usan como direcciones base y se corresponden con el buffer y descriptor de buffer del endpoint cero.

La verdad es que no se que más puedo decirte.
Quizá, si lo que quieres es empezar a manejar el usb, lo mejor sea que empieces por algo más sencillo.
Pásate por este hilo y prueba con el proyecto de J1M.
Una vez lo tengas funcionando bien, puedes pasar a controlar la interrupción.

Y por favor, no me llames de usted :oops:

Desconectado RICHI777

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1498
Re: USB en CCS: Detectando y gestionando la interrupción
« Respuesta #56 en: 04 de Agosto de 2010, 18:05:40 »
Hola, no uso PIC ni CCS asi que mucho no te voy a poder ayudar, lo que si puedo es explicarte el primer warning, cuando el compilador se refiere a "condicion siempre es verdadera" se refiere a casos como este:

Código: C
  1. if ( 1 )
  2. {
  3.   printf( "Es 1" );
  4. }
  5. else
  6. {
  7.   printf( "Es 0 " );
  8. }

1 nunca puede ser otra cosa, con la cual la expresion siempre es verdadera

Creo que en el foro de CCS tratan este tema, fijate

http://www.ccsinfo.com/forum/viewtopic.php?p=118968

Saludos !


Desconectado rafaelnotty

  • PIC10
  • *
  • Mensajes: 7
Re: USB en CCS: Detectando y gestionando la interrupción
« Respuesta #57 en: 08 de Agosto de 2010, 14:57:32 »
gracias, llevo el proyecto un poco mas adelantado. he tratado de ir solucionando mis problemas de una manera u otra y a la vez ir entendiendo cositas profundas de funcionamiento de los protocolos y de ccs... gracias por todo el apoyo... ahorita mismo stoy cuadrando el i2c bn para controlar desde la pc toda una red de uc´s.

gracias a ti richi tambn por la colaboracion. era cuestion del protocolo usb y la libreria pic18_usb.h