Autor Tema: ayuda-stack overflow is forcing device reset  (Leído 4127 veces)

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

Desconectado metalpatriot

  • PIC10
  • *
  • Mensajes: 4
ayuda-stack overflow is forcing device reset
« en: 22 de Junio de 2014, 20:55:13 »
Saludos, estoy realizando un programa para realizar el monitoreo de la temperatura de tres tanques mediante sensore LM35 usando un pic18f452, el programa compila bien pero al realizar la simulacion en proteus me da el mensaje "stack overflow is forcing device reset" pero solo estoy usando el 24% de RAM, he notado que esto sucede cuando ejecuto algunas rutinas IF dentro del main pero no logro ver la razon, a ver si alguien puede ayudar


Código: [Seleccionar]
unsigned dato1,dato2,dato3,ac;
float datof1,datof2,datof3;
char txt1[14],txt2[14],txt3[14];

// Lcd pinout settings
sbit LCD_RS at RB4_bit;
sbit LCD_EN at RB5_bit;
sbit LCD_D7 at RB3_bit;
sbit LCD_D6 at RB2_bit;
sbit LCD_D5 at RB1_bit;
sbit LCD_D4 at RB0_bit;

// Pin direction
sbit LCD_RS_Direction at TRISB4_bit;
sbit LCD_EN_Direction at TRISB5_bit;
sbit LCD_D7_Direction at TRISB3_bit;
sbit LCD_D6_Direction at TRISB2_bit;
sbit LCD_D5_Direction at TRISB1_bit;
sbit LCD_D4_Direction at TRISB0_bit;

sbit led1 at PORTD.B0;
sbit led2 at PORTD.B1;
sbit led3 at PORTD.B2;

sbit B_1 at PORTC.B0;
sbit B_2 at PORTC.B1;
sbit B_3 at PORTC.B2;




void main() {

inicio:
trisd = 0;
trisa = 0XFF;
trisc = 0XFF;
PORTC = 0;
PORTD = 0;
adcon0 = 0b00000001;
ADCON1 = 0;
Lcd_Cmd(_LCD_CURSOR_OFF);
delay_ms(200);


Lcd_Init();
ADC_Init();
Lcd_Out(1,1,"***PROGRAMA PARA***");
Lcd_Out(2,1,"*MONITOREO DE TEMP.*");
delay_ms(1500);
Lcd_Cmd(_LCD_CLEAR);
Lcd_Out(1,1,"B1 para temp. S1");
delay_ms(1000);
Lcd_Out(2,1,"B2 para temp. S2");
delay_ms(1000);
Lcd_Out(3,1,"B3 para temp. S3");
delay_ms(1000);
Lcd_Out(4,1,"B4 para informacion");
delay_ms(3000);
Lcd_Cmd(_LCD_CLEAR);
Lcd_Out(3,1,"Rango 2->150 grados");
Lcd_Out(4,1,"grados celcius(C)");
delay_ms(3000);
Lcd_Cmd(_LCD_CLEAR);

Lcd_Out(1,1,"*MONITOREO DE TEMP.*");


  do {

     PORTC = 0;
     
     dato1= ADC_Read(0);            //S1
     datof1 = (float)dato1*5/1024;
     datof1 = datof1*100;
     floattoStr(datof1,txt1);

     dato2= ADC_Read(1);            //S2
     datof2 = (float)dato2*5/1024;
     datof2 = dato2*100;
     floattoStr(datof2,txt2);
     
     dato3= ADC_Read(2);
     datof3 = (float)dato3*5/1024;
     datof3 = datof3*100;
     floattoStr(datof3,txt3);
     
     if( dato1 > dato2 && dato1 > dato3){
     Lcd_Cmd(_LCD_CLEAR);
     Lcd_Out(1,1,"*MONITOREO DE TEMP.*");
     Lcd_Out(3,14,"S1");
     Lcd_Out(4,1,txt1);
     Lcd_Out(4,10,"(g)");
     led1 = 1;
     delay_ms(1000);
     }
     
     if( dato2 > dato1 && dato2 > dato3){
     Lcd_Cmd(_LCD_CLEAR);
     Lcd_Out(1,1,"*MONITOREO DE TEMP.*");
     Lcd_Out(3,14,"S2");
     Lcd_Out(4,1,txt2);
     Lcd_Out(4,10,"(g)");
     led2 = 1;
     delay_ms(1000);
     }
     
     if( dato3 > dato1 && dato3 > dato2){
     Lcd_Cmd(_LCD_CLEAR);
     Lcd_Out(1,1,"*MONITOREO DE TEMP.*");
     Lcd_Out(3,14,"S3");
     Lcd_Out(4,1,txt3);
     Lcd_Out(4,10,"(g)");
     led2 = 1;
     delay_ms(1000);
     }

     if(B_1 = 1){
     Lcd_Cmd(_LCD_CLEAR);
     Lcd_Out(3,1,"S1:");
     Lcd_Out(4,1,txt1);
     delay_ms(2000);
     PORTC = 0;
     Lcd_Cmd(_LCD_CLEAR);
     }
     if(B_2 = 1){
     Lcd_Cmd(_LCD_CLEAR);
     Lcd_Out(3,1,"S2:");
     Lcd_Out(4,1,txt2);
     delay_ms(2000);
     PORTC = 0;
     Lcd_Cmd(_LCD_CLEAR);
     }
     if(B_3 = 1){
     Lcd_Cmd(_LCD_CLEAR);
     Lcd_Out(3,1,"S3");
     Lcd_Out(4,1,txt3);
     delay_ms(2000);
     PORTC = 0;
     Lcd_Cmd(_LCD_CLEAR);
     }

     


     }while(1);

}

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: ayuda-stack overflow is forcing device reset
« Respuesta #1 en: 22 de Junio de 2014, 21:10:09 »
Hola, varias sugerencias...

Cambia esto:

Código: [Seleccionar]
if(B_1 = 1)
por esto

Código: [Seleccionar]
if(B_1 == 1)
Hay muchos lugares en donde te equivocas asignando y no comparando.

Crece el tamaño de tus arrays de chars...

Código: [Seleccionar]
char txt1[25];
Y no sé qué sealo siguiente, pero checa si no falta ponerle int.

Código: [Seleccionar]
unsigned dato1,dato2,dato3,ac;
Código: [Seleccionar]
Saludos

Desconectado metalpatriot

  • PIC10
  • *
  • Mensajes: 4
Re: ayuda-stack overflow is forcing device reset
« Respuesta #2 en: 22 de Junio de 2014, 21:15:31 »
gracias amigo, ire a probar lo que me has dicho y luego comento que tal me fue, aun cometo muchos errores jaja es apenas mi segundo programa en mikroC.

Desconectado metalpatriot

  • PIC10
  • *
  • Mensajes: 4
Re: ayuda-stack overflow is forcing device reset
« Respuesta #3 en: 22 de Junio de 2014, 22:10:31 »
he corregido lo que me dijiste pero sigo con el mismo problema, a seguir revisando sera...

Desconectado planeta9999

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3520
    • Pinballsp
Re: ayuda-stack overflow is forcing device reset
« Respuesta #4 en: 22 de Junio de 2014, 22:50:16 »



Revisa el tamaño de la "pila", se está desbordando, seguramente por un exceso de llamadas anidadas a funciones.

Cada vez que el programa hace una llamada a una función, el procesador guarda en la "pila" la dirección de memoria, para poder volver cuando termina esa función. El problema es que si desde esa función llamas a otra, y desde esa a otra más, etc..etc.., puedes llegar a desbordar la pila "stack overflow", que es lo que te está pasando a tí.

Creo que en todos los compiladores, hay una directiva para forzar el tamaño de la pila, aunque eso también dependerá de la cantidad de memoria disponible en el micro. Ojo, que tengas memoria de sobra, no quiere decir que el compilador la haya asignado a la pila, eso se hace en tiempo de compilación, no en tiempo de ejecución, así que si desbordas la pila, aunque quede memoria de sobra, el micro no la podrá utilizar.

Comprueba tambien que no se trate de un error de programación, función uno llama a función dos, y esta a su vez vuelve a llamar a la uno, así entras en un bucle infinito que consume todo el espacio de la pila, y la desborda. Si no hay errores de programación, entonces tienes que aumentar el tamaño de la pila, o revisar las funciones de las librerías que estés utilizando, para ver cuantos niveles de anidamiento están usando, y corregirlo si es posible (llamadas a otras funciones similares, con menor consumo de la pila).







 

anything