TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: jorgejg en 02 de Febrero de 2012, 15:51:48
-
Saludos:
Estoy usando bootloader USB en un pic18F4550 y en el programa principal tambien uso el USB. Por defecto tenia en el archivo *.lkr lo siguuiente:
...
DATABANK NAME=gpr0 START=0x60 END=0xFF
DATABANK NAME=gpr1 START=0x100 END=0x1FF
DATABANK NAME=gpr2 START=0x200 END=0x2FF
DATABANK NAME=gpr3 START=0x300 END=0x3FF
DATABANK NAME=usb4 START=0x400 END=0x4FF PROTECTED
...
Para habilitar mas RAM lo cambie por esto y funcionó:
...
DATABANK NAME=gpr0 START=0x60 END=0xFF
DATABANK NAME=gpr1 START=0x100 END=0x2FF
//DATABANK NAME=gpr2 START=0x200 END=0x2FF
DATABANK NAME=gpr3 START=0x300 END=0x3FF
DATABANK NAME=usb4 START=0x400 END=0x4FF PROTECTED
...
Pero necesito habilitar mas RAM y lo cambie por esto:
...
DATABANK NAME=gpr0 START=0x60 END=0xFF
DATABANK NAME=gpr1 START=0x100 END=0x3FF
//DATABANK NAME=gpr2 START=0x200 END=0x2FF
//DATABANK NAME=gpr3 START=0x300 END=0x3FF
DATABANK NAME=usb4 START=0x400 END=0x4FF PROTECTED
...
pero me sale el error: "Error - undefined DATABANK/SHAREBANK 'gpr3' for STACK."
Lineas abajo en el *.lkr tengo esto:
STACK SIZE=0x100 RAM=gpr3
Como puedo cambiar esto para habilitar mas RAM?
-
deberias tacharlos y a su vez poner start=0x200 end=4FF para que ese banco tenga mas memoria ya que si no lo que haces es anular los bancos.
lo que debes hacer es poner stack size=0x100 RAM=gpr0 o gpr1 o usb4...
-
Si pongo STACK SIZE=0x100 RAM=usb4 no ocurrirá conflicyo cuando use el USB?
Según este pic hay 8 bancos de los cuales los 4 ultimos serán usados por el USB y no se deben tocar.
Me quedan los primeros 4 bancos de los cuales 1 banco debe ser designado para el Stack, entonces me quedan disponibles reales solo 3 bancos. Si uso como Stack el banco3 entonces podria disponer del banco 0 al 2, pero del banco 0 me parece que los primeros 96 bytes tampoco puedo tocarlos con lo que llego a la conclusión de que solo puedo usar desde parte del banco 0 hasta el final del banco 2.
Esto es: tengo libre desde 0x60 hasta la 0x2FF, dicho esto trato de configurar asi:
ACCESSBANK NAME=accessram START=0x0 END=0x5F
DATABANK NAME=MiData START=0x60 END=0x2FF
DATABANK NAME=gpr3 START=0x300 END=0x3FF
DATABANK NAME=usb4 START=0x400 END=0x4FF PROTECTED
DATABANK NAME=usb5 START=0x500 END=0x5FF PROTECTED
DATABANK NAME=usb6 START=0x600 END=0x6FF PROTECTED
DATABANK NAME=usb7 START=0x700 END=0x7FF PROTECTED
ACCESSBANK NAME=accesssfr START=0xF60 END=0xFFF PROTECTED
SECTION NAME=CONFIG ROM=config
STACK SIZE=0x100 RAM=gpr3
SECTION NAME=MIDATA RAM=MiData
SECTION NAME=USB_VARS RAM=usb4
En el programa coloco:
#pragma udata MiData
...
creo variables
...
pero no me deja crear 672 chars (160+256+256) como puedo mejorar esto?
-
He notado que los registros del USB USBDeviceState, USBActiveConfiguration, ... se posicionan a partir de la dirección 0x29F y he visto que la misma secuencia de registros se encuentran definidos en el archivo usb_device.c :
/** VARIABLES ******************************************************/
#pragma udata
USB_VOLATILE USB_DEVICE_STATE USBDeviceState;
USB_VOLATILE BYTE USBActiveConfiguration;
USB_VOLATILE BYTE USBAlternateInterface[USB_MAX_NUM_INT];
volatile BDT_ENTRY *pBDTEntryEP0OutCurrent;
...
/** USB FIXED LOCATION VARIABLES ***********************************/
#if defined(__18CXX)
#if defined(__18F14K50) || defined(__18F13K50) || defined(__18LF14K50) || defined(__18LF13K50)
#pragma udata USB_BDT=0x200 //See Linker Script, BDT in bank 2 on these devices - usb2:0x200-0x2FF(256-byte)
#elif defined(__18F47J53) || defined(__18F46J53) || defined(__18F27J53) || defined(__18F26J53) || defined(__18LF47J53) || defined(__18LF46J53) || defined(__18LF27J53) || defined(__18LF26J53)
#pragma udata USB_BDT=0xD00 //BDT in Bank 13 on these devices
#else
#pragma udata USB_BDT=0x400 //All other PIC18 devices place the BDT in usb4:0x400-0x4FF(256-byte)
#endif
#endif
...
En esta sección deje solo el #pragma udata USB_BDT=0x400 pero siguen apareciendo los registros desde la posición 0x29F y necesito que estos registros comienzen a partir de la 0x400.
Alguna idea por ahi?
-
creo recordar que estos pics tenian una ram dedicada a usb, es decir los buffers habia que ponerlos en determinada parte de la ram, lo que no se es porque, ni si influye algo cambiarlos.
-
Por lo que he visto depende del micro, hay micros en los cuales los bancos de ram para USB son específicos y en otros no. Si ese banco que necesitas crear no pisa USB, podes probar colocarle protected y asignarle ese espacio a tus variables. Si el proyecto te lo permite (por el uso de la RAM que necesite), no debería indicar error.
Saludos!
-
A la sección que he creado le puse PROTECTED y deshabilité las secciones protegidas del usb y aun asi siguen los registros del usb empezando desde la posición 0x29F a pesar que estoy declarando mi sección desde 0x60 hasta 0x2FF.
-
tienes que cambiar tambien esto #pragma udata USB_BDT=0x200 el 200 x otra cosa
-
Si claro eso hize, incluso deshabilite toda esa parte de código y solo dejé el #pragma udata USB_BDT=0x400 pero sigue igual.
Tengo una duda, en el lkr dice:
STACK SIZE=0x100 RAM=gpr3
que significa esto? se reservan 256 bytes específicamente el banco 3 de la RAM para que lo use el pic cuando le indique que haga operaciones de funciones como strcat, memset, ... etc? cuanto espacio reservar o en que casos o como calculo lo que debo reservar?
-
eso es el tamaño de la pila, ya depende de las operaciones que uses con la pila
-
Bueno he reordenado mis variables y ya entra todo en la RAM que tengo, mas adelante con mas tiempo veré lo que sucede con la RAM, gracias por sus aportes.