Autor Tema: Me quedo sin RAM antes de poner una linea de codigo!!!!!!!!!  (Leído 7268 veces)

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

Desconectado angelmt

  • PIC10
  • *
  • Mensajes: 19
Me quedo sin RAM antes de poner una linea de codigo!!!!!!!!!
« en: 05 de Octubre de 2008, 15:48:59 »
Hola

Por favor ayudadme porque de esta no se salir:

Resulta que quiero generar una tabla con 90 numeros de tipo int8 y los quiero almacenar en una matriz que este almacenada en la memoria de datos de un PIC16F72 que tiene 128 bytes, bueno pues mi sorpresa viene que declaro la matriz y una declaracion de interrupcion externa, pero ni siquiera he puesto codigo aun y al compilar me dice que no tengo suficiente RAM, como es posible si este microcontrolador tiene 128 bytes?

Ayudadme!!!!

Muchas gracias

os pongo el codigo que tengo:

#include "C:\Documents and Settings\Angel\Escritorio\Bingo\f72\main.h"
#int_EXT
void  EXT_isr(void)
{

}

int8 numeros_salidos[90];

void main()
{

   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_spi(SPI_SS_DISABLED);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   enable_interrupts(INT_EXT);
   enable_interrupts(GLOBAL);

   

}





« Última modificación: 05 de Octubre de 2008, 15:51:52 por angelmt »

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Me quedo sin RAM antes de poner una linea de codigo!!!!!!!!!
« Respuesta #1 en: 05 de Octubre de 2008, 15:55:20 »
Hola.

Algunas de las funciones buil-in que estas usando usan RAM tambien, por lo que puede ser por eso.

Saludos
El papel lo aguanta todo

Desconectado jeremylf

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1341
Re: Me quedo sin RAM antes de poner una linea de codigo!!!!!!!!!
« Respuesta #2 en: 05 de Octubre de 2008, 16:28:13 »
Creo que al ponerlas como gobales el compilador hace algo mas de codigo que quiza contenga mas ram q cuando los pones como locales.

Salu2.


Desconectado angelmt

  • PIC10
  • *
  • Mensajes: 19
Re: Me quedo sin RAM antes de poner una linea de codigo!!!!!!!!!
« Respuesta #4 en: 05 de Octubre de 2008, 18:48:48 »
En main.h no creo que sea importante para el problema de la ram, tengo esto:

#include <16F72.h>

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES RC                       //Resistor/Capacitor Osc with CLKOUT
#FUSES NOPUT                    //No Power Up Timer
#FUSES NOPROTECT                //Code not protected from reading
#FUSES BROWNOUT                 //Reset when brownout detected

#use delay(clock=20000000)

Desconectado Modulay

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 2651
Re: Me quedo sin RAM antes de poner una linea de codigo!!!!!!!!!
« Respuesta #5 en: 05 de Octubre de 2008, 19:16:35 »
CCS no deja crear variables que ocupen por sí solas un cierto porcentaje de la ram.
El motivo,pues no lo se. Pero es así.Posiblemente se salvaguarde espacio para cambios de contexto y tal.
Si bajas el tamaño del array por ejemplo a 50, posiblemente compile.

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Me quedo sin RAM antes de poner una linea de codigo!!!!!!!!!
« Respuesta #6 en: 05 de Octubre de 2008, 19:42:50 »
Hola

En la hoja de características el PIC16F72 tiene 128bytes de ram, pero hay que considerar que existen 96 bytes en el banco 0 y 32 bytes en el banco 1, la ram no es continua como en otros micros.

Si quisieras apuntar a 90bytes del banco 0, estando en el banco 0, tendrías solo 6 bytes de ram para trabajar con esos apuntadores, seguramente por eso CCS no puede compilar.

Es mejor que cambies de PIC y busques uno que tenga 90bytes en cualquier banco y unos 20 ó 30 bytes extras en ese mismo banco, es cuestión de hacer la prueba.

La otra opción es partir el arreglo en 2 partes en el mismo pic: 70 bytes en un arreglo y 20 bytes en el otro, talvez así CCS sí pueda manipularlos en bancos separados.
« Última modificación: 05 de Octubre de 2008, 19:45:20 por migsantiago »

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: Me quedo sin RAM antes de poner una linea de codigo!!!!!!!!!
« Respuesta #7 en: 06 de Octubre de 2008, 01:52:35 »
Tal y como está tu programa, no admite un array de más de 82 bytes. Con 83 ya salta el error.
Sin embargo, con 82 bytes el % de RAM ocupado según el compilador es únicamente el 76%.

Por tanto, he podido crear otro array con 31 elementos que ocupa el resto de RAM y se compila al 100%.

Así que se confirma la explicación de Modulay:
CCS no deja crear variables que ocupen por sí solas un cierto porcentaje de la ram.

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5544
    • Picmania by Redraven
Re: Me quedo sin RAM antes de poner una linea de codigo!!!!!!!!!
« Respuesta #8 en: 06 de Octubre de 2008, 03:26:43 »
CCS no deja crear variables que ocupen por sí solas un cierto porcentaje de la ram.
El motivo,pues no lo se. Pero es así.Posiblemente se salvaguarde espacio para cambios de contexto y tal.
Si bajas el tamaño del array por ejemplo a 50, posiblemente compile.

Ummmm ... no tenía ni idea ... y sin embargo en mi programa del hilo Detectando Flancos de subida (y de bajada) con un 18F4550 acabo de subir el Array de structs (4 bytes por struct) hasta unos espeluznantes 480 registros lo que supone el 92% de la memoria RAM del 4550 y no se ha quejado para nada.  :shock:

Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado angelmt

  • PIC10
  • *
  • Mensajes: 19
Re: Me quedo sin RAM antes de poner una linea de codigo!!!!!!!!!
« Respuesta #9 en: 06 de Octubre de 2008, 05:51:05 »
Muchas gracias a todos, lo que hare al final sera crear dos matrices para poder llegar a los 90 bytes.Ya se una nueva cosa con la administracion del ccs en la memoria de datos.

Nocturno, muchisimas gracias por tomarte el interes de ir probando la matriz y compilarlo,etc

Desconectado PalitroqueZ

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5474
    • Electrónica Didacta
Re: Me quedo sin RAM antes de poner una linea de codigo!!!!!!!!!
« Respuesta #10 en: 07 de Octubre de 2008, 13:57:17 »
Es que en los 16F con el CCS simplemente no se puede, recuerdo que leí un post por allí donde decian que cambiando una directiva, creo que era poner Device= *16 o algo asi , le decian al compilador que hiciera el "acomodo" del arrays en los bancos, pero no funciona.

la forma es partiendo el array y con #reserve seleccionas la dirección en el banco respectivo.



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

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5544
    • Picmania by Redraven
Re: Me quedo sin RAM antes de poner una linea de codigo!!!!!!!!!
« Respuesta #11 en: 07 de Octubre de 2008, 14:37:29 »
Es que en los 16F con el CCS simplemente no se puede ...

Ahhh, Pedro, entonces me explico que yo si pueda superarlo, estoy con un 18F. Muchas gracias por tu comentario.
Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Me quedo sin RAM antes de poner una linea de codigo!!!!!!!!!
« Respuesta #12 en: 07 de Octubre de 2008, 19:17:16 »
La explicación del porqué no en los 16F y familias inferiores(como 12X) y el porqué sí en las familias superiores es sencilla:
Las familias más antiguas poseen la memoria de datos(y programa) paginada. Esto hace muy complejos(y, de lograrlo, lentos) los algoritmos necesarios para gestionar un array que tenga variables en más de uno de los bancos de memoria. Esta paginación no exíste en los 18F y familias superiores, por lo que el compilador no tiene en problema en utilizar arrays de casi la totalidad de la memoria disponible.

Saludos.
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado Modulay

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 2651
Re: Me quedo sin RAM antes de poner una linea de codigo!!!!!!!!!
« Respuesta #13 en: 07 de Octubre de 2008, 20:00:59 »
No termino de ver el por qué de la paginación en unos sí y en otros no.
Los 16F, al menos los que yo he usado, precisan de la gestión de los bits RPX (RP0 y RP1 en el caso del 16F84) para acceder en cada momento al banco en el que se encuentra el registro buscado.
Si cuando hablais de paginación os estais refiriendo a eso, es algo que también precisan micros de la gama 18F (18F452 por ejemplo), con la diferencia de que el 452 lleva un registro llamado BSR, que se debe escribir con el valor del banco al cual se va a acceder.
No tengo en estos momentos el compilador a mano,pero apostaría a que ccs hace la gestión necesaria para acceder al banco que sea, tanto en 16F como en 18F, y ya sea para acceder variables simples o de tipo compuesto y ubicadas,en este último caso, en más de un banco de forma simultánea.

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Me quedo sin RAM antes de poner una linea de codigo!!!!!!!!!
« Respuesta #14 en: 07 de Octubre de 2008, 22:30:08 »
No tengo en estos momentos el compilador a mano,pero apostaría a que ccs hace la gestión necesaria para acceder al banco que sea, tanto en 16F como en 18F, y ya sea para acceder variables simples o de tipo compuesto y ubicadas,en este último caso, en más de un banco de forma simultánea.


Lo que comentas es altamente probable usando el direccionamiento indirecto de los pic16, usando los registros INDF y FSR.


 

anything