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.

#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();
}
}