Autor Tema: Arrays en CCS?  (Leído 3585 veces)

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

Desconectado firepic

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1130
    • JC Servicios
Arrays en CCS?
« en: 16 de Mayo de 2008, 21:31:05 »
Saludos gente todopic!
Bueno sigo con mi proyecto del modulo gps...
Ok, ya logro que capture los datos y puedo procesarlos...
Pero la cosa es que sólo he logrado capturar parte de los datos...
El módulo GPS cada vez que envía datos lo hace usando 4 sentencias NMEA... cada sentencia son aproximadamente 70 a 80 caracteres...
O sea que necesito leer como  mínimo unos 280 caracteres...
Trato de hacer un arreglo con esa cantidad de caracteres, pero el compilador me da un error.
El código es este:

Código: C
  1. //////////////////////////////////
  2. // Recibe del gps y envia al pc //
  3. //////////////////////////////////
  4.  
  5. #include <16f876.h>
  6. #fuses HS,NOWDT,NOPROTECT,NOLVP,PUT,NOBROWNOUT
  7. #define led PIN_C5
  8. #define Tx  PIN_C6
  9. #define Rx  PIN_C7
  10. #define Rg  PIN_C0
  11. #define DTR PIN_C1
  12. #use delay (CLOCK=20000000)
  13. #use fast_io(A)
  14. #use fast_io(B)
  15. #use fast_io(C)
  16. #use rs232 (STREAM=GPS,BAUD=4800,RCV=Rg)
  17. #use rs232 (STREAM=PC,BAUD=19200,XMIT=Tx,RCV=Rx)
  18.  
  19. void main(void)
  20. {
  21.    char cadena[280];
  22.         int  i;
  23.    setup_ccp1(CCP_OFF);
  24.    set_tris_a(0b11111111);
  25.    set_tris_b(0b11111111);
  26.         set_tris_c(0b10000001);
  27.    fputs("=====RECIBIDO DEL GPS=====",PC);
  28.    output_high(led);
  29.    while(TRUE)
  30.    {
  31.       output_high(DTR);
  32.       for(i=0;i<280;i++)
  33.       {
  34.          cadena[i]=fgetc(GPS);
  35.       }
  36.       output_low(DTR);
  37.       for(i=0;i<280;i++)
  38.       {
  39.           fputc(cadena[i],PC);
  40.        }
  41.       fputs("\n\r==DATOS DEL GPS RECIBIDOS==\n\r",PC);    
  42.    }
  43. }

Y el output da los siguientes errores:

Executing: "C:\Program Files\PICC\Ccsc.exe" +FM "C:\Program Files\PICC\gps_2.c" +DF +LN +T +A +M +Z +Y=9 +EA
*** Error 87 "gps_2.c" Line 21(19,20): Data item too big
*** Error 28 "gps_2.c" Line 23(22,23): Expecting an identifier
*** Error 43 "gps_2.c" Line 23(23,24): Expecting a declaration
*** Error 28 "gps_2.c" Line 24(15,25): Expecting an identifier
*** Error 43 "gps_2.c" Line 24(26,27): Expecting a declaration
*** Error 28 "gps_2.c" Line 25(15,25): Expecting an identifier
*** Error 43 "gps_2.c" Line 25(26,27): Expecting a declaration
*** Error 28 "gps_2.c" Line 26(12,22): Expecting an identifier
*** Error 43 "gps_2.c" Line 26(23,24): Expecting a declaration
*** Error 28 "gps_2.c" Line 27(38,39): Expecting an identifier
*** Error 48 "gps_2.c" Line 27(39,41): Expecting a (
*** Error 43 "gps_2.c" Line 27(42,43): Expecting a declaration
*** Error 28 "gps_2.c" Line 28(19,20): Expecting an identifier
*** Error 43 "gps_2.c" Line 28(20,21): Expecting a declaration
*** Error 43 "gps_2.c" Line 29(4,9): Expecting a declaration
*** Error 43 "gps_2.c" Line 29(9,10): Expecting a declaration
*** Error 43 "gps_2.c" Line 29(14,15): Expecting a declaration
*** Error 43 "gps_2.c" Line 29(14,15): Expecting a declaration
*** Error 43 "gps_2.c" Line 30(4,5): Expecting a declaration
*** Error 28 "gps_2.c" Line 31(22,23): Expecting an identifier
*** Error 43 "gps_2.c" Line 31(23,24): Expecting a declaration
*** Error 43 "gps_2.c" Line 32(7,10): Expecting a declaration
*** Error 43 "gps_2.c" Line 32(10,11): Expecting a declaration
*** Error 48 "gps_2.c" Line 32(11,12): Expecting a (
*** Error 43 "gps_2.c" Line 32(13,14): Expecting a declaration
*** Error 43 "gps_2.c" Line 32(14,15): Expecting a declaration
*** Error 48 "gps_2.c" Line 32(15,16): Expecting a (
*** Error 43 "gps_2.c" Line 32(17,20): Expecting a declaration
*** Error 43 "gps_2.c" Line 32(20,21): Expecting a declaration
*** Error 48 "gps_2.c" Line 32(21,22): Expecting a (
*** Error 43 "gps_2.c" Line 32(24,25): Expecting a declaration
*** Error 43 "gps_2.c" Line 33(7,8): Expecting a declaration
*** Error 48 "gps_2.c" Line 34(10,16): Expecting a (
*** Error 48 "gps_2.c" Line 34(17,18): Expecting a (
*** Error 43 "gps_2.c" Line 34(19,20): Expecting a declaration
*** Error 43 "gps_2.c" Line 35(7,8): Expecting a declaration
*** Error 28 "gps_2.c" Line 36(21,22): Expecting an identifier
*** Error 43 "gps_2.c" Line 36(22,23): Expecting a declaration
*** Error 43 "gps_2.c" Line 37(7,10): Expecting a declaration
*** Error 43 "gps_2.c" Line 37(10,11): Expecting a declaration
*** Error 48 "gps_2.c" Line 37(11,12): Expecting a (
*** Error 43 "gps_2.c" Line 37(13,14): Expecting a declaration
*** Error 43 "gps_2.c" Line 37(14,15): Expecting a declaration
*** Error 48 "gps_2.c" Line 37(15,16): Expecting a (
*** Error 43 "gps_2.c" Line 37(17,20): Expecting a declaration
*** Error 43 "gps_2.c" Line 37(20,21): Expecting a declaration
*** Error 48 "gps_2.c" Line 37(21,22): Expecting a (
*** Error 43 "gps_2.c" Line 37(24,25): Expecting a declaration
*** Error 43 "gps_2.c" Line 38(7,8): Expecting a declaration
*** Error 27 "gps_2.c" Line 39(15,16): Expression must evaluate to a constant
*** Error 43 "gps_2.c" Line 39(16,17): Expecting a declaration
*** Error 48 "gps_2.c" Line 39(17,19): Expecting a (
*** Error 43 "gps_2.c" Line 39(20,21): Expecting a declaration
*** Error 43 "gps_2.c" Line 40(1,2): Expecting a declaration
*** Error 28 "gps_2.c" Line 41(50,51): Expecting an identifier
*** Error 48 "gps_2.c" Line 41(51,53): Expecting a (
*** Error 43 "gps_2.c" Line 41(54,55): Expecting a declaration
*** Error 43 "gps_2.c" Line 42(4,5): Expecting a declaration
*** Error 43 "gps_2.c" Line 43(1,2): Expecting a declaration
      59 Errors,  0 Warnings.
Halting build on first failure as requested.
BUILD FAILED: Fri May 16 19:58:28 2008

(Básicamente un error por cada línea)...
La cosa es que si cambio y en vez de cadena[280] le coloco cadena[80] compila y funciona todo perfecto...
Pero según el primer error, el 280 es "muy grande"...

Cómo podría hacer para manejar en un arreglo esa cantidad de datos?
Estuve buscando en el foro y entendí que hay que hacerlo con punteros definidos como constantes o algo así, pero no entendí muy bien cómo es que exactamente debe hacerse...  :(
Y el manual de CCS4 no me dice casi nada tampoco  :x

Bueno de antemano les agradezco su ayuda.
Y disculpen que los moleste tanto...

Ok nos leemos!  :mrgreen:

PD: olvidé decirlo pero me imagino que se darán cuenta por el código que estoy usando un PIC16F876.
« Última modificación: 16 de Mayo de 2008, 21:37:46 por firepic »
"Por la presunción solo se ocasiona una lucha, pero con los que consultan juntos hay sabiduría" (Proverbios 13:10).
Visita Mi Sitio Web

Desconectado Gonzalo_BlackHawk

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 519
Re: Arrays en CCS?
« Respuesta #1 en: 16 de Mayo de 2008, 22:10:35 »
Hola firepic, del primer error es el que te esta dando problemas, los otros son solo consecuencias de que el compilador trata de seguir construyendo un código que ya no es correcto.
Con una string de 280 caracteres obviamente estas llenando todo el banco de memoria del PIC donde CCS trata de alamacenar la variable y el compilador no puede reservar semejante espacio de memoria. CCS no soporta matrices en RAM con mas de 128 elementos y con mas de 256 elementos en la ROM.
Deberias hacer una cadena con cada sentencia NEMA, asi puedes evitar el error, de todas formas vas a necesitar mucha memoria.

Con respecto a lo de los punteros referidos a constantes, CCS solo soporta los mismos desde la versión 4.057 creo, y tampoco ofrece una flexibilidad enorme con estos. Si tienes una versión anterior puedes arreglartelas con las cadenas en la ROM utilizando
el preprocesador #device PASS_STRINGS=IN_RAM, pero esto encarece mucho la RAM disponible. Es una larga historia, te puedo comentar algo si lo deseas. Sin embargo, no creo que necesites utilizar cadenas constantes, pues tienes que actualizarlas con cada envio, no te queda otra que utilizar la RAM.

Sigue asi con tu proyecto. Nos vemos.
"Siempre piensa si el jugo vale la exprimida..."

"La muerte esta tan segura de vencer que nos da toda una vida de ventaja."

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Arrays en CCS?
« Respuesta #2 en: 17 de Mayo de 2008, 10:57:23 »
Hola

Se me ocurre lo siguiente con lo que comenta Gonzalo...

Código: [Seleccionar]
char cadena_baja[128];
char cadena_media[128];
char cadena alta[24];

...

     for(i=0;i<128;i++)
        cadena_baja[i]=fgetc(GPS);
     for(i=0;i<128;i++)
        cadena_media[i]=fgetc(GPS);
     for(i=0;i<24;i++)
        cadena_media[i]=fgetc(GPS);

...
     for(i=0;i<128;i++)
        fputc(cadena_baja[i],PC);
     for(i=0;i<128;i++)
        fputc(cadena_media[i],PC);
     for(i=0;i<24;i++)
        fputc(cadena_alta[i],PC);


Desconectado RICHI777

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1498
Re: Arrays en CCS?
« Respuesta #3 en: 17 de Mayo de 2008, 15:30:12 »
Hola, dependiendo de la arquitectura no podes dimensionar desde el stack semejante cantidad de datos, esta bien la propustea del moderador, que sean globales
Saludos !

Desconectado gu1llermo

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 217
Re: Arrays en CCS?
« Respuesta #4 en: 18 de Mayo de 2008, 00:25:50 »
Hola! fire, no me e puesto analizar bien en detalle pero creo que con punteros se podría resolver. hay que sentarse a ver, pero creo que el tiro va por allí, por mi parte e trabajado poco con los punteros, pero aqui hay mucha gente que está super clara con eso, seguro que en poco tiempo ya tienes la solución.

Saludos.

PD1:

Viendo el datasheet solo podrías manejar 368 bytes de datos y están distribuídos en los 4 bancos  :? es decir hay que seguir pensando  8)

PD2:

Analizando la solución de santiago me parece la mejor y más sencilla, dividiendo y trabajar con la cadena en tres partes, el pic tiene memoria.
« Última modificación: 18 de Mayo de 2008, 00:44:48 por gu1llermo »

Desconectado firepic

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1130
    • JC Servicios
Re: Arrays en CCS?
« Respuesta #5 en: 18 de Mayo de 2008, 00:41:33 »
Gracias por sus respuestas!
Migsantiago, en lo que pueda probaré el código que me recomiendas a ver qué tal...
Ok nos leemos!  :mrgreen:
"Por la presunción solo se ocasiona una lucha, pero con los que consultan juntos hay sabiduría" (Proverbios 13:10).
Visita Mi Sitio Web

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Arrays en CCS?
« Respuesta #6 en: 18 de Mayo de 2008, 10:34:29 »
Hola

La escribí sin revisar bien los bancos de memoria del 876, hay que ver si caben los 128 y los 24 bytes consecutivos en cada banco.

Desconectado Gonzalo_BlackHawk

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 519
Re: Arrays en CCS?
« Respuesta #7 en: 18 de Mayo de 2008, 12:59:32 »
Yo creo que te conviene guardar cada sentencia nema por separado, son 4 y contienen 80 elementos que si entran en un banco.
Trabajar con punteros te va a poder hacer mas flexible el manejo de los datos, pero no te va a salvar de ocupar el 76 % de la memoria RAM con esas sentencias. Obviamente vas a tener que declararlas como globales, porque las variables locales se crean en el stack y este te va a desbordar seguramente.

Un saludo.

"Siempre piensa si el jugo vale la exprimida..."

"La muerte esta tan segura de vencer que nos da toda una vida de ventaja."

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Arrays en CCS?
« Respuesta #8 en: 18 de Mayo de 2008, 13:02:16 »
Tambien puede usar la EEPROM interna del 876 que tiene 256bytes, aunque no sé qué tan frecuente sea esa recepción de datos.

Desconectado LABmouse

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3575
    • Juntos es mejor
Re: Arrays en CCS?
« Respuesta #9 en: 18 de Mayo de 2008, 14:48:14 »
Pos creo se te hace necesario pasarte al pic 18F452... Compila con ese PIC y veras que se borran todos los problemas..Por precio no hay mayor diferencia y en potencia, definitivamente no hay comparacion.

SALUDOS!