TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: EARC en 15 de Febrero de 2006, 07:50:00
-
Gracias por leer mi mensaje.
Tengo el Siguiente problema:
Cuando intento compilar mi programa sale el mensaje rojo NO ERRORS y no compila.
Buscando el porque me di cuenta que si la memoria ROM es mayor al 35% usada, pasa lo mismo. le borre una parte al programa y compila bien, pero lo pego nuevamente y NADA. y no es error en el programa porque si quito un pedaso distinto al anterior tambien compila. QUE PASARA, ME ESTOY QUEMANDO LA CABEZA Y NO ENCUENTRO EL POR QUE PASA ESO.
EL PIC QUE SO ES EL 16F877.
AYUDENME.![Llorica Llorica]()

-
Hola Earc, para solucionar el problema que tienes en tu codigo debes poner tus funciones con el siguiente formato.
#INLINE
VOID MIFUNCION()
{
//MI CODIGO
}
otro detalle que debes tener en cuenta es que no puedes declarar prototipos de tus funciones que lleven la directiva #INLINE por lo tanto tu funcion se debe de encontrar antes de que pueda ser llamada en tu programa principal.
Saludos
-
Puede que el codigo rebase una pagina de la memoria rom... aunque yo creo que CCS deberia de avisar al respecto.
Has probado a poner un org antes de la funcion, marcando el inicio de una nueva pagina de memoria?
(si el problema persiste y no tienes tiempo ni ganas de solucionarlo, lo mejor que puedes hacer es pasarte a la serie 18F, que tiene una memoria totalmente lineal)
-
MUCHISIMAS GRACIAS POR SU AYUDA.
Estaba trabajando con el CCS version 3.163 y salia el error que les comente anteriormente. Ahora compilo con 3.242 y sale en Sgute error.
Out of ROM, Asegment or the program is too large.
Segun lo que se entiende es que hay que paginar, (¿eso no es automatico?).
Antepuse el #INLINE como dice jorgevert y NADA, agrego #ORG 0x0800 como dice manex para la funcion, y NADA. Ya tengo 2000 neuronas quemadas con ese problema.
QUE PRUEBA AHORA?"????![Llorica Llorica]()
![Llorica Llorica]()
![Llorica Llorica]()
![Llorica Llorica]()
![Llorica Llorica]()
-
Parece que el PIC se queda pequeño para el programa que estas desarrollando, prueba con uno con mas memoria, o comprueba que no has declarado una constante "const" demasiado grande...
saludos
-
Hola JIM Como puedo montar el programa para que lo vean.
Veran que no es gran cosa. Ya toy malo de tanto pensar.![Helado Helado]()
![Helado Helado]()
![Helado Helado]()
-
copia el código y pegalo... será lo mas rápido
s2!
-
//*****************************************************************
//Paso No1 (INDICAR QUE TIPO DE MICROCONTROLADOR DE VA A USAR)
#include <16f877A.h>
//*****************************************************************
/*Paso No2 (DEFINIR LOS FUSIBLES DE PROGRAMACION)
LP Low power osc < 200 khz
XT Crystal osc <= 4mhz
HS High speed Osc (> 4mhz)
RC Resistor/Capacitor Osc with CLKOUT
--------------------------------------------------------------------------------
WDT Watch Dog Timer ACTIVADO
NOWDT Watch Dog Timer DESACTIVADO
--------------------------------------------------------------------------------
PUT Power Up Timer ACTIVADO
NOPUT No Power Up Timer DESACTIVADO
--------------------------------------------------------------------------------
PROTECT Codigo de Proteccion de lectura ACTIVADO
NOPROTECT Codigo de Proteccion de lectura DESACTIVADO
--------------------------------------------------------------------------------
DEBUG Modo de depuracion IN-Circuit ACTIVADO
NODEBUG Modo de depuracion IN-Circuit DESACTIVADO
--------------------------------------------------------------------------------
BROWNOUT Reset de bajo voltaje ACTIVADO
NOBROWNOUT Reset de bajo voltaje DESACTIVADO
--------------------------------------------------------------------------------
LVP Programacion de bajo voltaje en B3(PIC16) o B5(PIC18) ACTIVADO
NOLVP Programacion de bajo voltaje en B3(PIC16) o B5(PIC18) DESACTIVADO
--------------------------------------------------------------------------------
CPD Codigo de proteccion para EEPROM ACTIVADO
NOCPD Codigo de proteccion para EEPROM DESACTIVADO
--------------------------------------------------------------------------------
WRT Memoria de programa protegida ACTIVADA
NOWRT Memoria de programa protegida DESACTIVADA
--------------------------------------------------------------------------------
*/
#fuses XT,NOWDT,PUT,NOPROTECT,NODEBUG,BROWNOUT,NOLVP,NOCPD,NOWRT
//*****************************************************************
// Paso No3 (INDICAR CUAL ES LA FRECUENCIA DE TRABAJO)
#use delay(clock=4000000)
//******************************************************************************
// Paso No4 Declarar variables
char seg,min,hor,dia_s,date,mes,ano,control,//Variables para DS1307
unidad=0,decena=0,//Variables para los displays
segundo_0,segundo_1=0,//Para los TIMER
casilla=0,//Posicion de la tabla para la secuencia de leds
analogo=0,//Variable que recive el dato analogo
tiempo,//Variable para llevar conteo de los minutos
T1min,T1max,T2min,T2max,//Variables para controlar temperatura
H1min,H1max,H2min,H2max,//Variables para controlar humedad
grados=0b11011111,//Variable para dibujar el simbolo de grados
cursor=0,cursor2=0;//Variables para saber la funcion de las teclas
int1 pito=0;//Variable para habiitar sonido
//******************************************************************
// Paso No5 Declarar funciones
#include <lcd_serial_A&Z.c>
void correcion(char dato_preg){
if(dato_preg<=99)lcd_putc(" ");
if(dato_preg<=9)lcd_putc(" ");
}
void configuracion(){
printf(lcd_putc,"fPRESIONE QUE VAR
DESEA AJUSTAR "
;
while(input(pin_b0)==0){
//------------------------------------------------------------------------
if(input(pin_b1)==0){cursor=cursor+1;
pito=1;
while(input(pin_b1)==0)delay_cycles(1);}
//------------------------------------------------------------------------
if(input(pin_b2)==0){cursor=cursor+2;
pito=1;
while(input(pin_b2)==0)delay_cycles(1);}
//------------------------------------------------------------------------
if(input(pin_b3)==0){cursor=cursor+3;
pito=1;
while(input(pin_b3)==0)delay_cycles(1);}
//------------------------------------------------------------------------
if(input(pin_b4)==0){cursor=cursor+4;
pito=1;
while(input(pin_b4)==0)delay_cycles(1);}
//------------------------------------------------------------------------
if(input(pin_b5)==0){cursor=cursor+5;
pito=1;
while(input(pin_b5)==0)delay_cycles(1);}
//------------------------------------------------------------------------
if(input(pin_b6)==0){cursor=cursor+6;
pito=1;
while(input(pin_b6)==0)delay_cycles(1);}
//------------------------------------------------------------------------
if(input(pin_b7)==0){cursor=cursor+7;
pito=1;
while(input(pin_b7)==0)delay_cycles(1);}
//------------------------------------------------------------------------
if(pito==1){
pito=0;
output_bit(pin_c2,1);
delay_ms(25);
output_bit(pin_c2,0);
delay_ms(100);
}
switch (cursor){
case 1:cursor=0;
break;
case 2:cursor=0;
break;
case 3: printf(lcd_putc,"f TEMPORIZADOR
"
; //TEMPORIZADOR
correcion(tiempo);
printf(lcd_putc,"%umin",tiempo);
cursor=10;
cursor2=3;
break;
case 4: printf(lcd_putc,"fMIN TEMP.1 MAX"
;//TEMPERATURA1
lcd_gotoxy(0,2);
correcion(T1min);
printf(lcd_putc,"%u%cc",T1min,grados);
lcd_gotoxy(11,2);
correcion(T1max);
printf(lcd_putc,"%u%cc",T1max,grados);
cursor=10;
cursor2=4;
break;
case 5: printf(lcd_putc,"fMIN TEMP.2 MAX"
;//TEMPERATURA2
lcd_gotoxy(0,2);
correcion(T2min);
printf(lcd_putc,"%u%cc",T2min,grados);
lcd_gotoxy(11,2);
correcion(T2max);
printf(lcd_putc,"%u%cc",T2max,grados);
cursor=10;
cursor2=5;
break;
case 6: printf(lcd_putc,"fMIN HUME.1 MAX"
;//HUMEDAD1
lcd_gotoxy(0,2);
correcion(H1min);
printf(lcd_putc,"%u%%",H1min);
lcd_gotoxy(11,2);
correcion(H1max);
printf(lcd_putc,"%u%%",H1max);
cursor=10;
cursor2=6;
break;
case 7: printf(lcd_putc,"fMIN HUME.2 MAX"
;//HUMEDAD2
lcd_gotoxy(0,2);
correcion(H2min);
printf(lcd_putc,"%u%%",H2min);
lcd_gotoxy(11,2);
correcion(H2max);
printf(lcd_putc,"%u%%",H2max);
cursor=10;
cursor2=7;
break;
case 11: //Tecla1 ENTER
break;
case 12: //Tecla1 RETROCEDER
cursor=cursor2-1;
if(cursor<=2)cursor=7;
while(input(pin_b2)==0)delay_cycles(1);
break;
case 13: //Tecla1 AVANZAR
cursor=cursor2+1;
if(cursor>=8)cursor=3;
while(input(pin_b3)==0)delay_cycles(1);
break;
case 14: //Tecla1 DECREMENTAR MINIMO
cursor=10;
switch(cursor2){
case 3: //DECREMENTAR MINIMO temporizador
tiempo=tiempo-1;
lcd_gotoxy(0,2);
correcion(tiempo);
printf(lcd_putc,"%u",tiempo);
write_eeprom (0,tiempo);
break;
case 4: //DECREMENTAR MINIMO Temperatura1
T1min=T1min-1;
if(T1min>=101)T1min=T1max-1;
lcd_gotoxy(0,2);
correcion(T1min);
printf(lcd_putc,"%u",T1min);
write_eeprom (1,T1min);
break;
case 5: //DECREMENTAR MINIMO Temperatura2
T2min=T2min-1;
if(T2min>=101)T2min=T2max-1;
lcd_gotoxy(0,2);
correcion(T2min);
printf(lcd_putc,"%u",T2min);
write_eeprom (3,T2min);
break;
case 6: //DECREMENTAR MINIMO Humedad1
H1min=H1min-1;
if(H1min>=101)H1min=H1max-1;
lcd_gotoxy(0,2);
correcion(H1min);
printf(lcd_putc,"%u",H1min);
write_eeprom (5,H1min);
break;
case 7: //DECREMENTAR MINIMO Humedad2
H2min=H2min-1;
if(H2min>=101)H2min=H2max-1;
lcd_gotoxy(0,2);
correcion(H2min);
printf(lcd_putc,"%u",H2min);
write_eeprom (7,H2min);
break;
}//switch(cursor2)
break;
case 15: //Tecla1 INCREMENTAR MINIMO
cursor=10;
switch(cursor2){
case 3: //INCREMENTAR MINIMO Temporizador
tiempo=tiempo+1;
lcd_gotoxy(0,2);
correcion(tiempo);
printf(lcd_putc,"%umin",tiempo);
write_eeprom (0,tiempo);
break;
case 4: //INCREMENTAR MINIMO Temperatura1
T1min=T1min+1;
if(T1min>=(T1max))T1min=0;
lcd_gotoxy(0,2);
correcion(T1min);
printf(lcd_putc,"%u",T1min);
write_eeprom (1,T1min);
break;
case 5: //INCREMENTAR MINIMO Temperatura2
T2min=T2min+1;
if(T2min>=(T2max))T2min=0;
lcd_gotoxy(0,2);
correcion(T2min);
printf(lcd_putc,"%u",T2min);
write_eeprom (3,T2min);
break;
case 6: //INCREMENTAR MINIMO Humedad1
H1min=H1min+1;
if(H1min>=(H1max))H1min=0;
lcd_gotoxy(0,2);
correcion(H1min);
printf(lcd_putc,"%u",H1min);
write_eeprom (5,H1min);
break;
case 7: //INCREMENTAR MINIMO Humedad2
H2max=H2max-1;
if(H2max<=(H2min+1))H2max=H2min+1;
lcd_gotoxy(11,2);
correcion(H2max);
printf(lcd_putc,"%u",H2max);
write_eeprom (8,H2max);
break;
}
break;
case 16: //Tecla1 DECREMENTAR MAXIMO
cursor=10;
switch(cursor2){
case 4: //DECREMENTAR MAXIMO Temperatura1
T1max=T1max-1;
if(T1max<=(T1min))T1max=100;
lcd_gotoxy(11,2);
correcion(T1max);
printf(lcd_putc,"%u",T1max);
write_eeprom (2,T1max);
break;
case 5: //DECREMENTAR MAXIMO Temperatura2
T2max=T2max-1;
if(T2max<=(T2min))T2max=100;
lcd_gotoxy(11,2);
correcion(T2max);
printf(lcd_putc,"%u",T2max);
write_eeprom (4,T2max);
break;
case 6: //DECREMENTAR MAXIMO Humedad1
H1max=H1max-1;
if(H1max<=(H1min))H1max=100;
lcd_gotoxy(11,2);
correcion(H1max);
printf(lcd_putc,"%u",H1max);
write_eeprom (6,H1max);
break;
case 7: //DECREMENTAR MAXIMO Humedad2
H2max=H2max-1;
if(H2max<=(H2min))H2max=100;
lcd_gotoxy(11,2);
correcion(H2max);
printf(lcd_putc,"%u",H2max);
write_eeprom (8,H2max);
break;
}//switch(cursor2)
break;
case 17: //Tecla1 INCREMENTAR MAXIMO
cursor=10;
switch(cursor2){
case 4: //INCREMENTAR MAXIMO Temperatura1
T1max=T1max+1;
if(T1max>=100)T1max=T1min+1;
lcd_gotoxy(11,2);
correcion(T1max);
printf(lcd_putc,"%u",T1max);
write_eeprom (2,T1max);
break;
case 5: //INCREMENTAR MAXIMO Temperatura2
T1max=T1max+1;
if(T1max>=100)T1max=T1min+1;
lcd_gotoxy(11,2);
correcion(T2max);
printf(lcd_putc,"%u",T2max);
write_eeprom (4,T2max);
break;
case 6: //INCREMENTAR MAXIMO Humedad1
H1max=H1max+1;
if(H1max>=100)H1max=H1min+1;
lcd_gotoxy(11,2);
correcion(H1max);
printf(lcd_putc,"%u",H1max);
write_eeprom (6,H1max);
break;
case 7: //INCREMENTAR MAXIMO Humedad2
H2max=H2max+1;
if(H2max>=100)H2max=H2min+1;
lcd_gotoxy(11,2);
correcion(H2max);
printf(lcd_putc,"%u",H2max);
write_eeprom (8,H2max);
break;
}//switch(cursor2)
break;
}//switch (cursor)
}//while(input(pin_b0)==0)
}//void configuracion()
//*****************************************************************
/*Paso No6 (Determinar si se quiere programacion de puertos rapido, fijo, auto)
#use fast_io( )
#use fixed_io( )
#use standard_io( )
*/
#use fast_io(A)
#use fast_io(B)
#use fast_io(C)
#use fast_io(D)
#use fast_io(E)
//*****************************************************************
//Paso No7 Programa
void main(void){
set_tris_a(0b00000101);
set_tris_b(0b11111111);
set_tris_c(0b10000000);
set_tris_d(0b00000000);
set_tris_e(0b00000000);
//------------------------------------------------------------------------------
output_a(0b00110000);//Dato de arranque en el puerto
output_c(0);//Dato de arranque en el puerto
output_d(0);//Dato de arranque en el puerto
//------------------------------------------------------------------------------
setup_adc(ADC_CLOCK_DIV_32); //Divisor de frecuencia del moulo ADC.
setup_adc_ports (ALL_ANALOG);//Apaga puertos del modulo conversor ADC.
//------------------------------------------------------------------------------
tiempo=read_eeprom (0);
T1min=read_eeprom (1);
T1max=read_eeprom (2);
T2min=read_eeprom (3);
T2max=read_eeprom (4);
H1min=read_eeprom (5);
H1max=read_eeprom (6);
H2min=read_eeprom (7);
H2max=read_eeprom (8);
//------------------------------------------------------------------------------
lcd_init(); //Inicializa pantalla LCD
//------------------------------------------------------------------------------
if (input(pin_b0)==0) configuracion();
//------------------------------------------------------------------------------
printf(lcd_putc,"T1: %cc H1: %%
T2: %cc H2: %%",Grados,Grados);
//------------------------------------------------------------------------------
output_bit(pin_c2,1);
delay_ms(25);
output_bit(pin_c2,0);
delay_ms(25);
//-----------------------------------------------------------------------------
//setup_timer_0(RTCC_INTERNAL|RTCC_DIV_8);
//enable_interrupts(int_timer0); //Habilita interrupcion por desborde TMR1
setup_timer_1(t1_internal|t1_div_by_8);//Configura el TMR1 cada 0.5 segundos
enable_interrupts(int_timer1); //Habilita interrupcion por desborde TMR1
//enable_interrupts(int_rda); //Habilita interrupcion por llegada de dato RS232
enable_interrupts(global); //Habilita interrupcion global
//------------------------------------------------------------------------------
while (1){
delay_cycles(1);//Espero a que ocurra alguna interrupcion
}
}
//*****************************************************************
//Paso No8 Interrupciones
#int_timer1
void actualiza_RTC(){
disable_interrupts(global); //deshabilita interrupcion global
//----------------------------------------
set_adc_channel(0);
set_adc_channel(0);
analogo = read_adc();
analogo=analogo*0.196; //Temperatura1
lcd_gotoxy(3,1);
if(analogo<=99)lcd_putc(" ");
if(analogo<=9)lcd_putc(" ");
printf(lcd_putc,"%u",analogo);
//----------------------------------------
set_adc_channel(2);
set_adc_channel(2);
analogo = read_adc();
analogo=analogo*0.392; //Humedad1
lcd_gotoxy(12,1);
if(analogo<=99)lcd_putc(" ");
if(analogo<=9)lcd_putc(" ");
printf(lcd_putc,"%u",analogo);
//----------------------------------------
set_adc_channel(0);
set_adc_channel(0);
analogo = read_adc();
analogo=analogo*0.196; //Temperatura2
lcd_gotoxy(3,2);
if(analogo<=99)lcd_putc(" ");
if(analogo<=9)lcd_putc(" ");
printf(lcd_putc,"%u",analogo);
//----------------------------------------
set_adc_channel(2);
set_adc_channel(2);
analogo = read_adc();
analogo=analogo*0.392; //Humedad2
lcd_gotoxy(12,2);
if(analogo<=99)lcd_putc(" ");
if(analogo<=9)lcd_putc(" ");
printf(lcd_putc,"%u",analogo);
//----------------------------------------
enable_interrupts(global); //Habilita interrupcion global
}
-
Todo funciona perfecto, el conversor AD, El timer1, solo cuando agrego la funcion CONFIGURACION es que pasa el error. Ahora, no toda la fucion genera error, ya que si borro la mitad de esta funcion, hay si compila. el mensaje en rojo DICE:
Out of ROM, a segment or the program is too large (lcd_gotoxy).
Mi deduccion es que como yo incluyo la libreria de la LCD primero que todo, al final del programa no se puede llamar a esta funcion porque queda en distinta pagina, (¿la paginacion no es auto con CCS?).
-
Hola !
Pues te cuento que el problema es que se llenó la memorioa del pic.
Unas de las pocas cosas malas del C (a mi modo de pensar) es que genera mucho codigo y nuestras aplicaciones se tornan mas pesadas. Revisa que partes del codigo puedes modificar para optimizarlo. Nota que si incluyes la libreria del un 18F452 apenas llega a llenar el 20% de este.
Un saludo !
-
joscar66 tienesla razon. me case con este programa, me cambio de PIC ahora mismo, aunque nunca he trabajado con la serie 18F, y mirando el PDF del 18F452 no es necesario cambiar nada al programa, solo los fisibles de prog y el #include del inicio.
Hay otra cosa que se tenga que tener en cuenta para hacer ese cambio?
Pruebo y les comento como me fue. GRACIAS A TODOS POR SU COLABORACION
-
Exactamente, el problema era que la memoria del PIC se lleno, me pase al 18f442 y no problema, estoy muy agradecidos con ustedes, por haber gastado un poco de su tiempo leyendo mi problema y solucionandolo.
SALUDOS DESDE COLOMBIA
-
Probaste usando lo sgte??
#device *=16 //Use 16 bit pointers (for 14 bit parts)
Eso sirve para que CCS tome todos los bancos de la memoria...a mi me pasó algo similar, y lo que ocurria era que CCS ocupaba solo un banco de memoria, con lo que se quedaba corto....
Recomendacion ==> usar siempre la senetencia anterior, con lo que se evitan malos ratos
Saludos
-
Oye gracias por ese dato, lo tendre que probar, y le cuento, no sabia eso del compilador, y ademas en ningunaparte me daban esa razon, gracias por ese dato.