Autor Tema: PIC 18F4550 y USB, exprimiendo hasta la última gota de RAM [CCS]  (Leído 79195 veces)

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

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
Re: PIC 18F4550 y USB, exprimiendo hasta la última gota de RAM [CCS]
« Respuesta #15 en: 14 de Noviembre de 2009, 12:46:30 »
Me ha pasado justo lo mismo que a ti. Mi programa no cabía cuando lo compilaba con opción bootloader porque ya no cabía en la ROM, así que he tenido que volver a la 4.084

Desconectado jeremylf

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1341
Re: PIC 18F4550 y USB, exprimiendo hasta la última gota de RAM [CCS]
« Respuesta #16 en: 01 de Diciembre de 2009, 02:11:37 »
Buena explciacion, gracias. Pero, por mi poco conocimiento, puedo decir que los PIC18Fx550 no son capaces de utilizar todos los endpoints que tiene debido a su poca RAM. A menos que este equivocado. De todas formas, nuevamente gracias.


Salu2.

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: PIC 18F4550 y USB, exprimiendo hasta la última gota de RAM [CCS]
« Respuesta #17 en: 01 de Diciembre de 2009, 12:57:23 »
Buena explciacion, gracias. Pero, por mi poco conocimiento, puedo decir que los PIC18Fx550 no son capaces de utilizar todos los endpoints que tiene debido a su poca RAM. A menos que este equivocado. De todas formas, nuevamente gracias.

Salu2.

Hola Jeremy, sí se pueden usar todos los endpoints, incluso con pingpong habilitado, pero con ciertas limitantes. Hay 1024 bytes de usb ram disponibles.

Primero la tablita de los buffer descriptors ocuparía una porción del banco 4 (0x0400 a 0x047F - 128 bytes) con pingpong deshabilitado. Esta tablita indica la posición, tamaño y estado de todo endpoint ubicado del banco 4 al 7. El espacio sobrante del banco 4 se puede usar para endpoints.

El máximo número de endpoints que un dispositivo puede tener es 16. Si tienes cada endpoint con tamaño de 64 bytes entonces ocuparás 1024 bytes de ram. Pero si sobraron 128 bytes del banco 4 más 768 bytes de los bancos 5, 6 y 7 apenas si sumas los 1024 bytes.

Entonces para que quepan solo es cuestión de quitarle bytes a unos cuantos endpoints y listo... 16 endpoints en un pic.

Claro está que una aplicación que hace uso de los 16 endpoints es porque busca la máxima velocidad del bus, ya que en caso contrario un solo endpoint bien administrado basta para cualquier cosa.

Incluso en el modo isócrono que puede mandar hasta 1023 bytes estaría un poco limitado el pic, tendría que ocupar 4 bytes para el buffer descriptor del endpoint isócrono y 1020 bytes de tamaño de endpoint. Pero de que se puede... se puede.  ;-)

Desconectado jeremylf

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1341
Re: PIC 18F4550 y USB, exprimiendo hasta la última gota de RAM [CCS]
« Respuesta #18 en: 02 de Diciembre de 2009, 00:29:08 »
Ah, claro pero me referia a todos los endpoints habiliados con envios y recibos de 64 bytes. Ocea intentando buscar la maxima velocidad pues. Es mas, eso sin contar la habilitacion de los ping pong que ni idea xD!

Salu2.

Desconectado EDDIE_SAN

  • PIC10
  • *
  • Mensajes: 3
Re: PIC 18F4550 y USB, exprimiendo hasta la última gota de RAM [CCS]
« Respuesta #19 en: 05 de Enero de 2010, 14:55:30 »
Ayuda!... he hecho todo lo que dicen aca pero mm me sale un error al momento de compilar... no se que sucede, espero me puedan colaborar!!

El error que sale es:

***Error112 "C:\Archivos de programa\PICC\drivers\pic18_usb.h" Line 472(1,1): Function used but not defined: ... usb_token_reset SCR=2798

Qué puedo hacer???... bueno puedo resultar algo ignorante en el aspecto, comento qué estoy realizando para complementar en algo lo que he dicho... tengo problemas con la memoria, pues no me cabe todo el programa que necesito en el pic!!!.. Estoy utilizando un PIC18F4550, y bueno, manejo GLCD y varias cosas. Despues de buscar alguna "solución" en internet a mi problema, dí con este post.  

Lo que hice fue tomar un programa que ya tenía funcionando y le "adapte" lo que recomiendan en este foro, a esperas de poder comprobar todo satisfactoriamente, pero pues no me sale!!!!... Aclaro, no estoy usando para nada USB, solo necesito mas espacio de memoria!... Entonces please!!! Ayuda!!!!

Ahora me surgen varias dudas:

Qué includes o defines asociados a USB debo utilizar? Buscando por la red y también mirando los ejemplos de CCS, opte, sin experiencia en el tema alguna, por colocar lo siguiente (son las únicas directivas de USB que coloco en todo el programa):

#define USB_HID_DEVICE     FALSE          
#define USB_EP1_TX_ENABLE  USB_ENABLE_BULK  
#define USB_EP1_RX_ENABLE  USB_ENABLE_BULK  
#define USB_EP1_TX_SIZE    1                
#define USB_EP1_RX_SIZE    1                

#include <pic18_usb.h>           

Espero me puedan colaborar!!!... Y Disculpas de antemano si sueno algo corto de conocimiento por lo que he dicho anteriormente. Mil gracias!!!!

Saludos desde Bogotá, Colombia!
« Última modificación: 05 de Enero de 2010, 15:06:06 por EDDIE_SAN »

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: PIC 18F4550 y USB, exprimiendo hasta la última gota de RAM [CCS]
« Respuesta #20 en: 05 de Enero de 2010, 14:59:58 »
Hola.

Pues si no estas usando el USB, no pongas los archivos de cabecera y listo no?  :?

Saludos
El papel lo aguanta todo

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: PIC 18F4550 y USB, exprimiendo hasta la última gota de RAM [CCS]
« Respuesta #21 en: 05 de Enero de 2010, 16:14:33 »
Exacto, no incluyas archivo alguno relacionado con USB.

Desconectado EDDIE_SAN

  • PIC10
  • *
  • Mensajes: 3
Re: PIC 18F4550 y USB, exprimiendo hasta la última gota de RAM [CCS]
« Respuesta #22 en: 06 de Enero de 2010, 01:25:45 »
Pero entonces como haría lo del ahorro de memoria???  :(

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: PIC 18F4550 y USB, exprimiendo hasta la última gota de RAM [CCS]
« Respuesta #23 en: 06 de Enero de 2010, 01:32:59 »
Hola.

Es que es justamente eso, para ahorrar RAM cuando se usa el USB, de caso contrario, lo que tienes que hacer es optimizar variables.
El papel lo aguanta todo

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: PIC 18F4550 y USB, exprimiendo hasta la última gota de RAM [CCS]
« Respuesta #24 en: 06 de Enero de 2010, 11:50:48 »
Si no usas USB, entonces no usas la RAM USB que se declara en los archivos h.

Si no usas los archivos h, entonces tienes 2kB de RAM para tu programa.

Desconectado Pchuqui_1

  • PIC16
  • ***
  • Mensajes: 187
Re: PIC 18F4550 y USB, exprimiendo hasta la última gota de RAM [CCS]
« Respuesta #25 en: 18 de Abril de 2010, 21:16:44 »
Hola compañeros. Quisera saber si alguien a utilizado la función get_string usb(char *s, int max) para la comunicación por usb_cdc. Yo no entiendo como implementarla. Gracia.s

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: PIC 18F4550 y USB, exprimiendo hasta la última gota de RAM [CCS]
« Respuesta #26 en: 19 de Abril de 2010, 14:49:00 »
Hola compañeros. Quisera saber si alguien a utilizado la función get_string usb(char *s, int max) para la comunicación por usb_cdc. Yo no entiendo como implementarla. Gracia.s

Puedes estudiar su código fuente y deducir qué hace:

Código: [Seleccionar]
void get_string_usb(char* s, unsigned int max) {
   unsigned int len;
   char c;

   --max;
   len=0;
   do {
     c=usb_cdc_getc();
     if(c==8) {  // Backspace
        if(len>0) {
          len--;
          usb_cdc_putc(c);
          usb_cdc_putc(' ');
          usb_cdc_putc(c);
        }
     } else if ((c>=' ')&&(c<='~'))
       if(len<max) {
         s[len++]=c;
         usb_cdc_putc(c);
       }
   } while(c!=13);
   s[len]=0;
}

Desconectado Pchuqui_1

  • PIC16
  • ***
  • Mensajes: 187
Re: PIC 18F4550 y USB, exprimiendo hasta la última gota de RAM [CCS]
« Respuesta #27 en: 19 de Abril de 2010, 20:25:36 »
Hola migsantiago. Graicas por tu respuesta. Te cuento que hace aproximadamente 1 semana que estoy con el tema de usb_cdc y no puedo usar la instrucción usb_cdc_getc();, no puedo obtener datos desde un programa hacia el pic, no me lee nada. Ya probee todo. Bueno, pero creo que la libreria que estoy usando esta mal editada. Estoy comparando la libreria usb_cdc.h con otra y no son similares y temo que sea eso que me este trabando. Aqui pongo la parte de la libreria que creo esta mal y mi programa. Gracias.

Esta es la parte de la libreria usb_cdc que llama la intrucción usb_cdc_getch(); y que ami no me funciona de ninguna forma.
////////////////// END USB CONTROL HANDLING //////////////////////////////////

////////////////// BEGIN USB<->RS232 CDC LIBRARY /////////////////////////////

char usb_cdc_getc(void) {
   char c;

   while (!usb_cdc_kbhit()) {}

   c=usb_cdc_get_buffer_status_buffer[usb_cdc_get_buffer_status.index++];
   if (usb_cdc_get_buffer_status.index >= usb_cdc_get_buffer_status.len) {
      usb_cdc_get_buffer_status.got=FALSE;
      usb_flush_out(USB_CDC_DATA_OUT_ENDPOINT, USB_DTS_TOGGLE);
               
   }
            return(c);
}







Este es mi programa, lo que hago solamente es caergar el valor del puerto y mostrarlo.

do{
       usb_task();
         if (usb_enumerated()){                 // Espera a que el dispositivo sea enumerado por el host.
           if(usb_cdc_kbhit()){                // En espera de nuevos caracteres en el buffer de recepción.
          lcd_putc("\fPASO2\n");

   
                                                                                                                //get_string_usb(*marco,1);
         marco=usb_cdc_getc();                //¿lo que llegó fué el caracter x?
               

       lcd_gotoxy(1,2);
      lcd_putc("\fPASO3\n");
    printf(usb_cdc_putc,"%c",marco);
                                                            }                           
   // delay_ms(200);
                 
               }
           
       }while (TRUE); // bucle infinito.

}


Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: PIC 18F4550 y USB, exprimiendo hasta la última gota de RAM [CCS]
« Respuesta #28 en: 20 de Abril de 2010, 11:00:38 »
¿Cómo envías datos al com virtual desde la pc?

Desconectado Pchuqui_1

  • PIC16
  • ***
  • Mensajes: 187
Re: PIC 18F4550 y USB, exprimiendo hasta la última gota de RAM [CCS]
« Respuesta #29 en: 20 de Abril de 2010, 17:13:56 »
Hola de nuevo. Yo se que este tema ya está bastante tratado, pero no encuentro solución y ya no se mas que probar. Estoy mandando datos desde el Labview y en un principio solo podía mandar datos desde el pic y no al revés. Ahora de tanto toquetear, ya no me reconoce los drivers. Estoy usando Windows Vista 32 bits. Puede ser que el USB no funcione en mi notebook? Muchas gracias

#include <18F4550.h>
#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN
#use delay(clock=48000000)
#include "usb_cdc.h"
#include "picUSB_CDC.h"
#rom int 0xf00000={1,2,3,4}


void main() {
   int8 x;
   set_tris_b(0x00);
   output_b(0x00);
   usb_cdc_init(); // Configuramos al puerto virtual.
   usb_init(); // Inicializamos el stack USB.
     while(!usb_cdc_connected()) {} // espera a detectar una transmisión de la PC (Set_Line_Coding).
       do{usb_task();
          if (usb_enumerated()){  // Espera a que el dispositivo sea enumerado por el host.
            if(usb_cdc_kbhit()){ // En espera de nuevos caracteres en el buffer de recepción.
                x=usb_cdc_getc();
                output_b(x);
              }
             }
       }while (TRUE); // bucle infinito.
       //// jokelnice_cdc_enviar
}