Autor Tema: corrección del desbordamiento con la pila  (Leído 2179 veces)

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

Desconectado rennick

  • PIC10
  • *
  • Mensajes: 1
corrección del desbordamiento con la pila
« en: 09 de Abril de 2020, 22:22:09 »
Buenas noches mi gente realicé un programa de reloj regresivo pues así lo necesito, trabaja hasta  que se requiere realice el ciclo nuevamente y comienza a tener error de desbordamiento de la pila, ya he revisado lo foros que se presenta y no he podido hallar la falla si tendrán alguna idea se los agradecería de antemano le coloco el código a ver si detectan la falla ok. :lol:
#include <16f883.h>
#fuses xt, nowdt
#use delay (Clock=4Mhz)
#define LCD_DATA_PORT getenv("SFR:PORTC")
#define LCD_ENABLE_PIN  PIN_A0                                   
#define LCD_RS_PIN      PIN_A2                                   
#define LCD_RW_PIN      PIN_A1                                   
#include <lcd.c>
#use standard_io(c)
int16 desbordamiento=0;
int s=0;
int m=0; 
int c=0;

 void pausa(void)
            {
            lcd_gotoxy(1,2);
            lcd_putc("TIEMPO RESTATNTE:   pausa\n");
                       
         while(input(pin_b0)==0){                                                // pulsa tecla stop se retorna
           if(input(pin_b6)==1){                                                 //pulsa la tecla play retorna y sigue decrementando
           do{           
             }
             while(input(pin_b6)==1);
               c=0;
               return;
              }
           }
         }
       
     
 void configuracion(void)                                                        //:::::::::: Función de Configuración ::::::::::
      {
         enable_interrupts(int_ext);                                             //Habilitamos la interrupción   externa
         ext_int_edge(l_to_h);                                                   // se habilita la interrupcion ext. de bajo a alto     
         setup_timer_0(RTCC_INTERNAL|RTCC_DIV_256);                              //Preescaler 256 Timer0
         set_timer0(224);                                                         //Establecemos el timer0 a 224 para obtener 10ms
         enable_interrupts(int_timer0);                                          //Habilitamos la interrupción del timer0
         enable_interrupts(global);                                              //Habilitamos todas las interrupciones del PIC
      }
   
    void inicio(void)                                                               //Función Aplicacion de señal MENU RUN::::::::::
      {
         configuracion();
         lcd_putc('\f');
         lcd_gotoxy(1,1);
         lcd_putc("Aplic.        \n");
         lcd_gotoxy(28,1);
         lcd_putc("% 00\n"); 
         lcd_gotoxy(1,2);
         lcd_putc("TIEMPO RESTATNTE:       \n");
     
   
   while (TRUE)
      {
         lcd_gotoxy(26,2);
         printf(lcd_putc,"(%02u:%02u)",m,s);
          }     
         }
   
   
 void tiempo()
      {
         lcd_putc('\f');       
         lcd_gotoxy(8,1);
         lcd_putc("*** MENU DE TIEMPO ***\n");
         lcd_gotoxy(1,2);       
         lcd_putc("TIEMPO RESTATNTE:       \n"); 
      while(true){
             
         lcd_gotoxy(26,2);
         printf(lcd_putc,"(%02u:%02u)",m,s);
         delay_ms(200);
         lcd_gotoxy(26,2);
         printf(lcd_putc,"(  :%02u)",s);
         delay_ms(200);
       
      }
     return;
   }
 
 

   void main(void)
   {
         
      lcd_init();         
      enable_interrupts(int_rb); 
      enable_interrupts(int_ext);                                                //Habilitamos la interrupción   externa
      ext_int_edge(l_to_h);
      enable_interrupts(global);
      delay_ms(300);
     
      while(true)
      {
         lcd_gotoxy(4,1);       
         lcd_putc("\f      menu main       \n");
         delay_ms(1500);
         break;
      }
     tiempo();
    }
   
     
 #int_timer0
 void timer_reloj(void)                                                          //Función de Interrupción Timer,RELOJ:::::::::
       {         
         desbordamiento++;
      if(desbordamiento==10)                                                     // es 100 para 1 seg, pero se coloca 10 para hacerlo dinamico en la simulacion
         {
         desbordamiento=0;
         
      if(s!=0){
         s--;
         }
         
      if(m==0&&s==0)
            {
               m=0;
               s=0;
               disable_interrupts(int_timer0);
               clear_interrupt(int_timer1);
               clear_interrupt(int_rb);
               clear_interrupt(int_ext);
               main();
            }     
     
      if(s==0)
         {
         s=59;
         
         if(m!=0){
            s=59;
            m--;
            }   
           }
         }
         set_timer0(224);                                                        //se carga el timer0 de nuevo para 10 mseg
      }
 

#int_RB
   ext_isr(){

      if(input(pin_b4)==1){
         do {
            }
         while(input(pin_b4)==1);
            m=m+1;
      if(m==60){
            m=60;
         }
      }
     
      if(input(pin_b5)==1){
         do {
            }
         while(input(pin_b5)==1);     
      if(m!=0){
            m=m-1;
          }   
       }
       
     if(input(pin_b6)!=0){
         do {
            }
         while(input(pin_b6)!=0);
     if(c==1){
             pausa(); 
             }
            c++;
          inicio();
         }
      if((input(pin_b0)==1)||(input(pin_b7)==1))
               {
               do {
            }
         while((input(pin_b0)==1)||(input(pin_b7)==1));
               s=0;
               m=0;
               disable_interrupts(int_timer0);
               clear_interrupt(int_timer1);
               clear_interrupt(int_rb);
               clear_interrupt(int_ext);             
               main();
               }
         
   }
       
   

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:corrección del desbordamiento con la pila
« Respuesta #1 en: 09 de Abril de 2020, 23:11:50 »
Sin ver demasiado ya que es largo, mirando una interrupción acabo de ver una llamada a la función main... que estoy seguro que sea uno de tus problemas.
Y ese es solo uno de los puntos malos del programa, hay muchos mas como la excesiva cantidad de loops infinitos. Cuando solo deberias tener uno solo. (Si esos while(true) ). Ademas esos loops dentro de las interrupciones.

Y pare de verlo. Porque esos errores son demasiados graves para omitirlos, y se debería arreglar esos antes que cualquier otro.
« Última modificación: 09 de Abril de 2020, 23:20:29 por KILLERJC »