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

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

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: USB en CCS: Detectando y gestionando la interrupción
« Respuesta #30 en: 02 de Octubre de 2008, 13:30:09 »
ok ya lo entiendo mejor, si como dices el compilador me dio un error cuando encontró dos funciones iguales

ahora espero sean mis ultimas preguntas: tu usaste solo las librerías del CCS verdad? modificándolas un poco, verdad? y en que valores dejaste los parametros que modificaste para qeu no te consuma la ram innecesariamente??

crees que pueda ser asi:

#define USB_TOTAL_BUFFER_SPACE  ((int16)0x80)   //0x80 por los dos buffer de 64 bytes de I/O o solo 0x40?

//#reserve 0x400:0x4FF+USB_BUFFER_NEEDED  //esta linea comentada

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
estas dos lineas tb comentadas??

usaré los 64bytes maximos como tu, que lineas debo comentar o cambiar?

gracias por la ayuda Modulay y por responder tan rápido.
.

Desconectado Modulay

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 2651
Re: USB en CCS: Detectando y gestionando la interrupción
« Respuesta #31 en: 02 de Octubre de 2008, 13:38:19 »
Mejor así

Código: C++
  1. #define USB_TOTAL_BUFFER_SPACE......... // esta no la toques
  2.  
  3. #reserve 0x400:0x4FF+USB_BUFFER_NEEDED
  4.  
  5. //char usb_data_buffer[USB_TOTAL_BUFFER_SPACE-USB_MAX_EP0_PACKET_LENGTH-USB_MAX_EP0_PACKET_LENGTH];
  6. //#locate usb_data_buffer=USB_BUFFER+USB_MAX_EP0_PACKET_LENGTH+USB_MAX_EP0_PACKET_LENGTH

Los endpoints que uses y sus respectivos tamaños y tipos (BULK,INTERRUPT,etc...) los puedes especificar en tu programa principal (J1M lo hace así en su ejemplo).
Eso sí,recuerda que todo descriptor de endpoint (los descriptores de dispositivo están contenidos en el fichero Pic_usb.h en el ejemplo de J1M) deberá reflejar también el tamaño de dicho endpoint.

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: USB en CCS: Detectando y gestionando la interrupción
« Respuesta #32 en: 02 de Octubre de 2008, 16:21:57 »
bien, creo que todo lo preeliminar esta fuera de dudas.

Ahora me han surgido dudas en el momento de la obtención y envió de datos, antes hacía esto:

Código: [Seleccionar]
#define LEDV    PIN_A0
#define LEDR    PIN_A1
#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]

int8 recibe[3];                  //declaramos variables
int8 envia[1];

void main(void) {
   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);   //en este nivel me daba cuenta que el micro fue configurado correctamente
   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, recibe es el nombre de mi buffer
            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
            }
         }
      }
   }
}

ahora haciendo tu proceso como debo gestionar los datos?, como recibo y como transmito??

un saludo
.

Desconectado Modulay

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 2651
Re: USB en CCS: Detectando y gestionando la interrupción
« Respuesta #33 en: 02 de Octubre de 2008, 18:01:18 »
Para enviar puedes usar:

usb_puts(endpoint, puntero_a_los_datos, bytes_a_enviar, 10);

Para recibir...deberías volver a leer el hilo con más detenimiento.
Si te surgen dudas al respecto, aquí ando :)

Desconectado Modulay

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 2651
Re: USB en CCS: Detectando y gestionando la interrupción
« Respuesta #34 en: 02 de Octubre de 2008, 18:06:36 »
La llamada a usb_task() sobra.

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: USB en CCS: Detectando y gestionando la interrupción
« Respuesta #35 en: 11 de Octubre de 2008, 12:37:32 »
hola modulay, ahora que he probado el usb con el kbhit, me doy cuenta que es mucho mejor gestionar uno mismo la interrupcion.

He vuelto a leer tus post, y pues entiendo que los datos se almacenarán a partir de la posición 0x400 de la ram, en realidad desde la x500, pues desde la x400 se almacenan registros para el amnejo de los endpoints. Pero mira nose si será que no lo leí o no lo entendí pero creo que debería haber algo que te diga que tu buffer ha terminado de recibir datos, quizá se me haya pasado o es que si no lo entendí. Si fueras tan amable de explicarme como saber que ya he recibido datos en mi buffer te lo agradeceré

un saludo amigo, gracias por la ayuda.
.

Desconectado Modulay

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 2651
Re: USB en CCS: Detectando y gestionando la interrupción
« Respuesta #36 en: 11 de Octubre de 2008, 17:23:48 »
Cuando eso ocurre,salta la interrupción...de ahí que debas hacer el trapicheo de traerte a tu fichero principal las rutinas relacionadas y, como yo hice, coloques una llamada a una rutina tuya donde hagas el tratamiento de la interrupción. Los registros BD1OADRH y BD1OADRL contienen la dirección de comienzo de los datos recibidos y el registro BD1OCNT indica la cantidad de bytes que se han recibido (dando por hecho que estamos hablando del out endpoint 1)

Desconectado Modulay

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 2651
Re: USB en CCS: Detectando y gestionando la interrupción
« Respuesta #37 en: 11 de Octubre de 2008, 17:28:56 »
El primer segmento de código del primer post son las rutinas que te tienes que traer al main...y si te fijas, al final de dicho segmento he añadido la llamada a la que es mi rutina de interrupción...
En el segundo segmento de código de ese mismo post está implementada dicha rutina a modo de ejemplo

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: USB en CCS: Detectando y gestionando la interrupción
« Respuesta #38 en: 14 de Octubre de 2008, 15:41:22 »
ok, lo que me quieres decir entonces es que con esa tu rutina de interrupción ya haces que todos los datos necesarios esten donde deberían??

ahorita, en tu codigo existe algun flag que te diga que hay datos en el buffer? de no haberlo donde debería colocarlo?

disculpa la preguntadera, todavía sigo trasteando con el codig, gracias por la ayuda, me srve bastante, un saludo Modulay
.

Desconectado kain589

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 324
Re: USB en CCS: Detectando y gestionando la interrupción
« Respuesta #39 en: 06 de Marzo de 2009, 22:40:56 »
...Entre ellas cómo tener mi propia rutina de interrupción cuando se reciben datos por algún endpoint que no sea el endpoint 0...

Una duda que tengo, esto es para todos los endpoints y ademas el "0", o para todos excluyendo el "0"

Es que al decir propia rutina para endpoint que no sea el cero, no sé si la de ccs solo sirve para el endpint cero
Saludos desde Córdoba, españa

Desconectado Modulay

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 2651
Re: USB en CCS: Detectando y gestionando la interrupción
« Respuesta #40 en: 07 de Marzo de 2009, 13:09:09 »
Es para todos los endpoints excluyendo el 0. Dicho endpoint se usa para transferencias de control y ccs ya se encarga de gestionarlas, por lo que no hay que preocuparse por el endpoint 0.
Por defecto, las rutinas de ccs para gestionar las interrupciones usb trabajan de la misma manera para todos los endpoints y lo hacen de forma "oculta" al programador...lo que se explica en este hilo son una serie de modificaciones para tener control sobre la interrupción (ya que por defecto sólo se puede acceder a los datos mediante polling) , permitiendo escribir una rutina de tratamiento de interrupción que se adapte a nuestras necesidades.

Desconectado kain589

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 324
Re: USB en CCS: Detectando y gestionando la interrupción
« Respuesta #41 en: 07 de Marzo de 2009, 15:02:16 »
Muchas gracias por la contestacion, la verdad es que siempre habia creido que en los proyectos con usb se usaba el endpoint 0, pero ahora al mirarlos veo que usan el 1. Es una de esas veces que das algo por supuesto sin comprobarlo; y de ahi que me llamara la atencion que no usaras el endpoint que yo creia que todo el mundo usaba
Saludos desde Córdoba, españa

Desconectado PalitroqueZ

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5474
    • Electrónica Didacta
Re: USB en CCS: Detectando y gestionando la interrupción
« Respuesta #42 en: 07 de Marzo de 2009, 15:36:57 »
kain es que el endpoint 0 se usa siempre, lo usa el dispositivo para responderle al host cuando se conecta la primera vez y todas las comunicaciones que no tienen que ver con los datos que nosotros gestionamos

La propiedad privada es la mayor garantía de libertad.
Friedrich August von Hayek

Desconectado kain589

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 324
Re: USB en CCS: Detectando y gestionando la interrupción
« Respuesta #43 en: 07 de Marzo de 2009, 18:05:25 »
PalitroqueZ, me referia a usado para los datos, siempre pense que todo,control y datos, se gestionaba mediante el endpoint 0, ahora veo que no. Gracias por las aclaraciones a los dos
Saludos desde Córdoba, españa

Desconectado PalitroqueZ

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5474
    • Electrónica Didacta
Re: USB en CCS: Detectando y gestionando la interrupción
« Respuesta #44 en: 09 de Marzo de 2009, 17:13:30 »
PalitroqueZ, me referia a usado para los datos, siempre pense que todo,control y datos, se gestionaba mediante el endpoint 0, ahora veo que no. Gracias por las aclaraciones a los dos

ahh ¡entendido!  :mrgreen:

La propiedad privada es la mayor garantía de libertad.
Friedrich August von Hayek


 

anything