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....
#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!