Autor Tema: Declaracion de vectores grandes "int vector[500];"....  (Leído 10574 veces)

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

Desconectado richardjr

  • PIC12
  • **
  • Mensajes: 69
Declaracion de vectores grandes "int vector[500];"....
« en: 06 de Agosto de 2009, 13:50:08 »
Hola! Quisera compartir esta duda y ver si alguien me ayuda a aclarar como solucionar esto! Resulta que necesito declarar un array de 500 elementos tipo int para volcar en este 500 lecturas del conversor AD... una vez lleno el vector con las 500 muestras, lo paso por una serie de filtros digitales... el punto es... No consigo declarar el vector de forma correcta.. de mas esta decir que declarar " int datos[500]; " por ej, no sirve...

me tira el siguiente error:

HI-TECH C PRO for the PIC18 MCU Family (Lite)  V9.63PL3
Copyright (C) 1984-2009 HI-TECH SOFTWARE
(1273) Omniscient Code Generation not available in Lite mode (warning)
Advisory[1233] Employing 18F4550 errata work-arounds:
Advisory[1234]  * Corrupted fast interrupt shadow registers
Warning [1257] C:\Documents and Settings\Administrador\Escritorio\TESIS\Filtro\etapas de filtros2.c; 54. local variable "_datos" is used but never given a value
Error   [1250] C:\Archivos de programa\HI-TECH Software\PICC-18\PRO\9.63\sources\ftneg.c; 20. could not find space (1000 bytes) for variable F2036
Error   [1250] C:\Archivos de programa\HI-TECH Software\PICC-18\PRO\9.63\sources\ftneg.c; 20. could not find space (1000 bytes) for variable F2032
Error   [1250] C:\Archivos de programa\HI-TECH Software\PICC-18\PRO\9.63\sources\ftneg.c; 20. could not find space (1000 bytes) for variable F2028
Error   [1250] C:\Archivos de programa\HI-TECH Software\PICC-18\PRO\9.63\sources\ftneg.c; 20. could not find space (1000 bytes) for variable F2030
Error   [1253] C:\Archivos de programa\HI-TECH Software\PICC-18\PRO\9.63\sources\ftneg.c; 20. could not find space (6170 bytes) for auto/param block
Error   [1250] C:\Archivos de programa\HI-TECH Software\PICC-18\PRO\9.63\sources\ftneg.c; 20. could not find space (1000 bytes) for variable F2036
Error   [1250] C:\Archivos de programa\HI-TECH Software\PICC-18\PRO\9.63\sources\ftneg.c; 20. could not find space (1000 bytes) for variable F2032
Error   [1250] C:\Archivos de programa\HI-TECH Software\PICC-18\PRO\9.63\sources\ftneg.c; 20. could not find space (1000 bytes) for variable F2028
Error   [1250] C:\Archivos de programa\HI-TECH Software\PICC-18\PRO\9.63\sources\ftneg.c; 20. could not find space (1000 bytes) for variable F2030
Error   [1253] C:\Archivos de programa\HI-TECH Software\PICC-18\PRO\9.63\sources\ftneg.c; 20. could not find space (6170 bytes) for auto/param block

********** Build failed! **********


Aprecio cualquier tipo de aporte!!!!!

Desde ya muchas gracias!

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Declaracion de vectores grandes "int vector[500];"....
« Respuesta #1 en: 06 de Agosto de 2009, 14:17:01 »
http://www.todopic.com.ar/foros/index.php?topic=24011.0

Los pics no tienen ram direccionable secuencialmente, hay que hacer cambios de banco y el uso de arreglos grandes es imposible en C.

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Declaracion de vectores grandes "int vector[500];"....
« Respuesta #2 en: 06 de Agosto de 2009, 14:20:48 »
Otra solución es que las lecturas del ADC las hagas a 8 bits y las deposites en un arreglo de bytes de menos muestras.

byte arreglo1[64], arreglo2[64],... etc

Desconectado richardjr

  • PIC12
  • **
  • Mensajes: 69
Re: Declaracion de vectores grandes "int vector[500];"....
« Respuesta #3 en: 06 de Agosto de 2009, 14:59:46 »
Lo maximo que me deja declarar es un vector de 8 elementos int.... aca hay algo q no anda bien..... Estoy compilando con el HI TECH P18. Seguramente algo se debe poder hacer en C... no creo que hayan dejado librado al azar este punto...

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Declaracion de vectores grandes "int vector[500];"....
« Respuesta #4 en: 06 de Agosto de 2009, 15:07:52 »
Seguramente los int son de 4 bytes en tu compilador y 8 x 4 = 32 bytes.

¿Qué pic usas?
¿Qué tamaño en bits tiene un int?
¿Qué otra ram estás usando?

Desconectado richardjr

  • PIC12
  • **
  • Mensajes: 69
Re: Declaracion de vectores grandes "int vector[500];"....
« Respuesta #5 en: 07 de Agosto de 2009, 00:06:32 »
Hola! gracias por responder pronto migsantiago !!
Te cuento:

-Uso el PIC8F4550 y compilo con el HI-TECH C PIC18 MCU Family
-Segun el manual del compilador, int es de 16 bits
-A que te refirs con que otra ram uso? disculpa la ignorancia... si te referis a algo externo... no uso nada...

Sds!

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Declaracion de vectores grandes "int vector[500];"....
« Respuesta #6 en: 07 de Agosto de 2009, 12:37:53 »
El PIC18F4550 tiene demasiada ram, seguramente se te está escapando algo. Por favor sube tu código en C para que busquemos el problema.

Desconectado richardjr

  • PIC12
  • **
  • Mensajes: 69
Re: Declaracion de vectores grandes "int vector[500];"....
« Respuesta #7 en: 07 de Agosto de 2009, 12:46:58 »
Aca paso el programa, es un par de filtros digitales... supongo el programa en si ocupa poco y nada...

#include <htc.h>
#define larg 500



__CONFIG(2, WDTDIS );
__CONFIG(3, PBDIGITAL & LPT1DIS & MCLRDIS  );

int datos [larg];

int LowPassFilter(int data);
int HighPassFilter(int data);
int Derivative(int data);
int MovingWindowIntegral(int data );




void main (void)

   {

   int sol_1[larg] = {0}, sol_2[larg]= {0}, sol_3[larg]= {0}, sol_4[larg]= {0}, sol_5[larg]= {0}, i;
   int max, indice, max2, indice2;
   float tiempo, RH;

   
   for (i = 0; i < larg; i++)
       {
          sol_1 = LowPassFilter(datos);
       }
   for (i = 0; i < larg; i++)
       {
          sol_2 = HighPassFilter (sol_1);
       }
   for (i = 0; i < larg; i++)
       {
          sol_3 = Derivative (sol_2);
       }
   for (i = 0; i < larg; i++)
       {
          sol_4 = sol_3 * sol_3 ;
       }
   for (i = 0; i < larg; i++)
       {
          sol_5 = MovingWindowIntegral (sol_4);
      }

   max = 0;

    for (i = 0; i < larg; i++)
    {
        if (sol_5 > max)
        {
        max = sol_5;
        indice = i;
        }
    }

   for (i = indice + 3; i < larg; i++)
    {
        if (sol_5 == max)
        {
        max2 = sol_5;
        indice2 = i;
        break;
        }
    }

   tiempo = (float)(indice2 - indice)/larg;

   RH = 60/tiempo;



}



int LowPassFilter(int data)
{
   int y1 = 0, y2 = 0, x[26], n = 12;
   int y0;
   x[n] = x[n + 13] = data;
   y0 = (y1 << 1) - y2 + x[n] - (x[n + 6] << 1) + x[n + 12];
   y2 = y1;
   y1 = y0;
   y0 >>= 5;
   if(--n < 0)
      {
         n = 12;
      }
   return(y0);
}

int HighPassFilter(int data)
{
   int y1 = 0, x[66], n = 32;
   int y0;
   x[n] = x[n + 33] = data;
   y0 = y1 + x[n] - x[n + 32];
   y1 = y0;
   if(--n < 0)
      {
         n = 32;
      }
   return(x[n + 16] - (y0 >> 5));
}

int Derivative(int data)
{
   int y, i;
   int x_derv[4];
   /*y = 1/8 (2x( nT) + x( nT - T) - x( nT - 3T) - 2x( nT -
   4T))*/
   y = (data << 1) + x_derv[3] - x_derv[1] - ( x_derv[0] <<
   1);
   y >>= 3;
   for (i = 0; i < 3; i++)
      {
         x_derv = x_derv[i + 1];
         x_derv[3] = data;
      }
   return(y);
}



int MovingWindowIntegral(int data)
{
   int x[32], ptr = 0;
   long sum = 0;
   long ly;
   int y;
   if(++ptr == 32)
      {
         ptr = 0;
         sum -= x[ptr];
         sum += data;
         x[ptr] = data;
         ly = sum >> 5;
      }
   if(ly > 32400) /*check for register overflow*/
      {
         y = 32400;
      }
   else
      {
         y = (int) ly;
      }
   return(y);
}



Gracias nuevamente!!

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Declaracion de vectores grandes "int vector[500];"....
« Respuesta #8 en: 07 de Agosto de 2009, 12:51:30 »
Estas definiendo 6 vectores de 500 elementos, por eso no te alcanza la RAM del PIC.

Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado richardjr

  • PIC12
  • **
  • Mensajes: 69
Re: Declaracion de vectores grandes "int vector[500];"....
« Respuesta #9 en: 07 de Agosto de 2009, 13:23:59 »
A veces uno se centra en una parte y se olvida del resto... gracias!!!!!

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Declaracion de vectores grandes "int vector[500];"....
« Respuesta #10 en: 07 de Agosto de 2009, 17:25:25 »
6 arreglos de 500 x 2bytes = 6000bytes y el 18f4550 apenas llega a 2048 bytes :D

Desconectado richardjr

  • PIC12
  • **
  • Mensajes: 69
Re: Declaracion de vectores grandes "int vector[500];"....
« Respuesta #11 en: 07 de Agosto de 2009, 18:40:44 »
jajaja, imaginate... gracias igual por tu predisposicion! Buen finde!!

Desconectado jeremylf

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1341
Re: Declaracion de vectores grandes "int vector[500];"....
« Respuesta #12 en: 10 de Agosto de 2009, 23:31:16 »
Ya que estamos cn el tema....

Como puedo hacer algo asi: (En CCS)

int8 const Tabla[9][504] =
{
.
.
.
}

Que debo pones en los puntos para poder escribir los bytes de cada matriz(del 0 al 9) sus 504 bytes de cada uno?

Ocea, quiero acceder a 9 tablas con 504 bytes cada una pero distintas con solo pones Tabla o algo asi. Como agrego los bytes en esa tabla para cada uno de los nueve?

Algo confuso, espero se entienda xD


Salu2.

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Declaracion de vectores grandes "int vector[500];"....
« Respuesta #13 en: 11 de Agosto de 2009, 00:18:54 »
int8 const Tabla[9][504] ={{'a','b','c','d',0x03,....},
                                     {'1','2','3',....           },
                                     {'A','B','C',...            },
                                     {'*','/','#',...            }};

Acuerdate que si la defines como const es solo de lectura!

Después para acceder:

a=Tabla[2][245];


Saludos!
« Última modificación: 11 de Agosto de 2009, 10:04:29 por Suky »
No contesto mensajes privados, las consultas en el foro

Desconectado richardjr

  • PIC12
  • **
  • Mensajes: 69
Re: Declaracion de vectores grandes "int vector[500];"....
« Respuesta #14 en: 11 de Agosto de 2009, 00:31:35 »
Ya que estamos cn el tema....

Como puedo hacer algo asi: (En CCS)

int8 const Tabla[9][504] =
{
.
.
.
}

Que debo pones en los puntos para poder escribir los bytes de cada matriz(del 0 al 9) sus 504 bytes de cada uno?

Ocea, quiero acceder a 9 tablas con 504 bytes cada una pero distintas con solo pones Tabla o algo asi. Como agrego los bytes en esa tabla para cada uno de los nueve?

Algo confuso, espero se entienda xD


Salu2.
   
Yo estaba usando algo asi como esto :

const char FONT2[44][5]=
                        {0x26, 0x49, 0x49, 0x49, 0x32, // S
                         0x01, 0x01, 0x7F, 0x01, 0x01, // T
                         0x3F, 0x40, 0x40, 0x40, 0x3F, // U
                         0x1F, 0x20, 0x40, 0x20, 0x1F, // V
               
                          ......................................
                     
                         0x44, 0x64, 0x54, 0x4C, 0x44, // z
                         0x00, 0x08, 0x36, 0x41, 0x41, // {
                         0x00, 0x00, 0x7F, 0x00, 0x00, // |
                         0x41, 0x41, 0x36, 0x08, 0x00, // }
                         0x02, 0x01, 0x02, 0x04, 0x02};// ~


Sds!