Autor Tema: Me quede sin RAM?  (Leído 1882 veces)

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

Desconectado elgarbe

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2178
Me quede sin RAM?
« en: 20 de Octubre de 2012, 18:52:20 »
Hola, me estoy volviendo loco.... Estoy con un programa en CCS, el compilador me informa:

>>> Warning 202 "LCD_Test.c" Line 48(5,7): Variable never used:   t1
>>> Warning 202 "LCD_Test.c" Line 49(5,21): Variable never used:   n_vueltas_timer1
>>> Warning 202 "LCD_Test.c" Line 50(5,15): Variable never used:   hay_viento
>>> Warning 202 "LCD_Test.c" Line 51(7,9): Variable never used:   vv
>>> Warning 202 "LCD_Test.c" Line 52(5,6): Variable never used:   l
>>> Warning 202 "LCD_Test.c" Line 53(5,6): Variable never used:   p
      Memory usage:   ROM=56%      RAM=24% - 31%
      0 Errors,  6 Warnings.

como que estoy usando el 24-31% de la RAM, pero me pasa lo siguiente: Tengo algunas variables globales, entre ellas algunas float, aparte estoy usando la libreria LCD.c que viene con el CCS. En el main defino una variable así:
   char cDv[];

ese char despues lo muestro en el LCD (un string en realidad)

Me venía funcionando todo bien hasta que agregue un poco más de codigo, entre ello algunas variables, compilo, todo bien, grabo.... anda todo excepto el mostrar cDv, no me lo muestra el LCD.
Empiezo a borrar cosas hasta que empieza a andar otra vez... Empiezo a agregar de a poco y detecto que cuando agrego algunas variables globales más deja de funcionar el código para cDv. Me quede sin RAM????? Porque el CCS me  dice que tengo de sobra?
Pongo el código completo por las dudas, pero no creo que les sirva sin algo para simular....

Código: [Seleccionar]
#include <16F883.h>

#device adc=10

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES INTRC_IO                 //Internal RC Osc NO I/O
#FUSES PUT                      //Power Up Timer
#FUSES NOMCLR                     //Master Clear pin enabled
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NOCPD                    //No EE protection
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOIESO                   //Internal External Switch Over mode disabled
#FUSES NOFCMEN                  //Fail-safe clock monitor disabled
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) used for I/O
#FUSES NODEBUG                  //No Debug mode for ICD
#FUSES NOBROWNOUT                   //Brownout reset at 4.0V
#FUSES NOWRT                    //Program memory not write protected

#use delay(clock=4000000)
#include<LCD.c>

#use fast_io(A)
#use standard_io(C)

#byte PORTA = 0x5
#byte PORTB = 0x6
#byte PORTC = 0x7
#byte TRISA=0x85
#byte TRISB=0x86
#byte TRISC=0x87

int newDataT=0;      //Flag para indicar que hay nueva info para mostrar en el LCD
int newDataH=0;      //Flag para indicar que hay nueva info para mostrar en el LCD
int newDataDv=0;      //Flag para indicar que hay nueva info para mostrar en el LCD
int medicion=0;     //0->Temp; 1->Hum; 2->Veleta
long lADC=0;        //Valor leido del ADC

long lTemp=0;
float fTemp=0.0;    //Valor real de Temperatura
int cantTemp=0;     //Cantidad de valores de temp. leidas antes de promediar

long lHum=0;
float fHum=0.0;     //Valor real de Humedad
int cantHum=0;      //Cantidad de valores de hume. leidas antes de promediar

long lDv=0;

int t1=0;         //Para almacenar el tmr1 en el CCP
int n_vueltas_timer1=0;
int hay_viento=0;
float vv=0.0;
int l=0;
//int p=0; -> si descomento esto no me anda.....
//double tiempo=0;

///////////////////////////////////////////////////////////////////////////////
//Interrupcion del ADC por conversion terminada.
#int_AD
void AD_isr()
{
   //Primero leo el valor actualmente convertido
   lADC=read_adc(ADC_READ_ONLY);
   if(medicion==0){
      lTemp+=lADC;
      if(++cantTemp==10){
         newDataT=1;
         cantTemp=0;
      }
   }
   if(medicion==1){
      lHum+=lADC;
      if(++cantHum==10){
         newDataH=1;
         cantHum=0;
      }
   }
   if(medicion==3){
      lDv=lADC;
      newDataDv=1;
   }
}



void main()
{
   char cDv[];

   set_tris_a(0xFF);   //FF = Todo entradas
   setup_oscillator(OSC_4MHZ);
   //ADC_CLOCK_INTERNAL se sugiere solo para frecuencias menores a 1MHz.
   //Para 8MHz se sugiere ADC_CLOCK_DIV_32
   setup_adc(ADC_CLOCK_DIV_32);
   //Voy a usar el pin 2 (AN0) para el TPS, la referencia es GND y +5V
   setup_adc_ports(sAN0 | sAN1 | sAN3 | VSS_VDD);
   //Dentro de los puertos usados (solo el 0) elijo el canal 0 para convertir
   set_adc_channel(0);

//    setup_ccp1(CCP_CAPTURE_RE); // Configuro para capturar siguiente flanco de bajada
   //El timer0 interrumpira cada 256*4*256/8000000=32,7mSeg
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_256);
   //El timer1 base de tiempos del CCP esta puesto a 8uSeg por cuenta, 0.52428 seg por desborde
//   setup_timer_1(T1_INTERNAL | T1_DIV_BY_8);
   setup_timer_2(T2_DISABLED,0,1);
   setup_spi(FALSE);
   setup_comparator(FALSE);
   setup_vref(FALSE);

   disable_interrupts(INT_RTCC);
//   enable_interrupts(INT_TIMER1);
//   enable_interrupts(INT_CCP1);
   enable_interrupts(INT_AD);
   enable_interrupts(GLOBAL);

   lcd_init();
   delay_ms(100);
   printf(lcd_putc, "\f    Estacion\nMeteorologic");
   delay_ms(2000);

// TODO: USER CODE!!
   do{
      set_adc_channel(0);
      delay_ms(1);
      medicion=0;
      read_adc(ADC_START_ONLY);
      delay_ms(1);
      set_adc_channel(1);
      delay_ms(1);
      medicion=1;
      read_adc(ADC_START_ONLY);
      delay_ms(1);
      set_adc_channel(3);
      delay_ms(1);
      medicion=3;
      read_adc(ADC_START_ONLY);
      delay_ms(1);

      if(newDataT){
         newDataT=0;
         fTemp=4.3*100*(lTemp/10.0)/1024;
         lTemp=0;
      }
      if(newDataH){
         newDataH=0;
         fHum=((4.3*(lHum/10.0)/1024)-(5*0.16))/(5*0.0062);
         lHum=0;
      }
      if(newDataDv){
         newDataDv=0;
         if((lDv>0) && (lDv<64))
            strcpy( cDv, "N");
         if((lDv>64) && (lDv<128))
            strcpy( cDv, "NE");
         if((lDv>128) && (lDv<192))
            strcpy( cDv, "E");
         if((lDv>192) && (lDv<256))
            strcpy( cDv, "SE");
         if((lDv>256) && (lDv<320))
            strcpy( cDv, "S");
         if((lDv>320) && (lDv<384))
            strcpy( cDv, "SO");
         if((lDv>384) && (lDv<448))
            strcpy( cDv, "O");
         if((lDv>448) && (lDv<512))
            strcpy( cDv, "NO");
      }

      printf(lcd_putc, "\fT: %01.1f  Dv: %s\nH: %01.1f  Vv:", fTemp, cDv, fHum);
//      printf(lcd_putc, "\fT: %01.1f  Dv: %s\nH: %01.1f  Vv: %01.1f", fTemp, cDv, fHum,vel_vien);
      delay_ms(50);
   }while(true);

}


Saludos!
-
Leonardo Garberoglio

Desconectado pikman

  • Moderador Local
  • PIC24F
  • *****
  • Mensajes: 679
Re: Me quede sin RAM?
« Respuesta #1 en: 20 de Octubre de 2012, 19:43:26 »
Hola, no veo ningun problema en tu codigo ni estas quedandote sin RAM, lo que te informa el compilador es que tenes variables definidas y no se usan, nada mas, esto no es un problema que impida el funcionamiento del codigo, pero si ocupara mas recursos de los necesarios.

saludos
ARIEL
saludos
PikMan

Desconectado elgarbe

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2178
Re: Me quede sin RAM?
« Respuesta #2 en: 20 de Octubre de 2012, 19:46:47 »
Si, pero para mi el compilador no esta contando la RAM definida en el LCD.c y me estoy quedando sin ram... si no no me explico por que cuando agrego una definicion de variable me deja de funcionar el programa... Incluso el compilador dice que estoy usando el 56% de la ROM, pero el grabador me dice que estoy usando el 71%, creo que el compilador no cuenta lo del LCD.c....

Estoy biendo como lo verifico....
-
Leonardo Garberoglio

Desconectado elgarbe

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2178
Re: Me quede sin RAM?
« Respuesta #3 en: 20 de Octubre de 2012, 20:16:22 »
Hay otro problema, no es el LCD.c.... pero no entiendo porque cuando agrego una variable global deja de andar el la variable cDv....

Saludos
-
Leonardo Garberoglio

Desconectado elgarbe

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2178
Re: Me quede sin RAM?
« Respuesta #4 en: 20 de Octubre de 2012, 20:25:57 »
El problema debe estar en la forma de reservar memoria para cDv, es un string de 2 caracteres, pero como se reservaría memoria para eso? porque como yo lo estoy definiendo estimo que me reserva solo un int....
-
Leonardo Garberoglio

Desconectado Nubbeo

  • PIC10
  • *
  • Mensajes: 12
Re: Me quede sin RAM?
« Respuesta #5 en: 20 de Octubre de 2012, 21:27:14 »
Hola, no se donde está el problema pero si queres asignar a cDv 2 caracteres lo tenes que definir char cDv[2];
Saludos

Desconectado elgarbe

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2178
Re: Me quede sin RAM?
« Respuesta #6 en: 20 de Octubre de 2012, 21:35:51 »
Hola, no se donde está el problema pero si queres asignar a cDv 2 caracteres lo tenes que definir char cDv[2];
Saludos

Recuerdo del ANSI C que para almacenar una cadena de 2 caracteres habia que reservar 3 lugares, el último era para el '\0' o final de cadena. No se si aca es igual...

Saludos
-
Leonardo Garberoglio


 

anything