Matriz LED 8X8_PIC16F887_74HC595

Hola muy buenas noches , tengo un problema con mi codigo , me explico quiero hacer arrancar una matriz led 8x8 con pic 16f887a y un ic 74hc595 y sale pero a medias , al momento de simularlo en proteus me sale este mensaje :
[PIC16 CORE] PC=0x0078. Stack overflow executing CALL instruction. [U1]
no puedo visualizar el erro en mi programacion pido su ayuda y muchas gracias

#INCLUDE<16F887.H>
#FUSES HS,NOWDT,NOPROTECT,NOPUT,MCLR
#USE DELAY(CLOCK=20M)
#USE STANDARD_IO(D)
#USE STANDARD_IO(B)
#DEFINE LARGO 38
#DEFINE DATA PIN_D0
#DEFINE CLOCK PIN_D1
#DEFINE LATCH PIN_D2

VOID F74595_INIT()
{
output_bit(DATA,1);
output_bit(CLOCK,1);
output_bit(DATA,0);
}

VOID F74595_CLOCK()
{
output_bit(CLOCK,1);
output_bit(CLOCK,0);
output_bit(LATCH,1);
output_bit(LATCH,0);
}

CONST INT TABLA[LARGO]={0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
0x67,0XA3,0X49,0XA0,0XA0,0X49,0XA3,0X67,
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF};


VOID MAIN()
{
INT I,J,K;
WHILE(TRUE)
{
FOR(I=0;I<LARGO+16;I++)
{
FOR(K=0;K<24;K++)
{
F74595_INIT();
FOR(J=0;J<16;J++)
{
F74595_CLOCK();
OUTPUT_B(TABLA[J+I]);
delay_US(1);

}
}

}

}


}
 
este error -->Stack overflow executing CALL instruction
No importa de que ordenador se trate ni marca ni modelo significa una sola cosa.

En cualquier ordenador, cuando se salta a una subrutina de cualquier índole, luego de ejecutar una instrucción CALL nn <--llamado a subrutina
Se almacena la dirección desde donde se salta, a la subrutina nn , para saber a donde VOLVER cuando se termine la tarea, ni bien se encuentre en el código de la subrutina una instrucción del tipo RETURN o RET .
EL almacen de memoria, donde se guarda la dirección de partida se llama STACK ó PILA.
Para volver de la subrutina, con RET se recupera la dirección desde el STACK y se le suma 1, para volver a la instrucción siguiente del programa y continuar con su ejecución.

Ejemplo :

Inicio :

linea 1
linea 2
CALL nn ( se manda al STACK esta dirección con la instrucción PUSH STACK) es a menudo implicita
linea 4 ( lugar donde continua la ejecución)
.......
linea xx : GOTO INICIO

subrutinas :
nn :

linea 1
linea 2
linea n : return ( se recupera del STACK con la instrucción POP STACK y se le suma 1) a menudo implicita

La memoria STACK siempre es limitada y tiene estructura FIFO.
En los procesadores pequeños suele tener un tamaño fijo de 2 o 3 registros nada mas.
Para que el STACK funcione bien debe haber siempre 1 CALL y luego 1 RET
Si el STACk es de 3 lugares máximo, puedo saltar hasta 3 subrutinas encadenadas, luego de las cuales debo volver al menos de una subrutina, sino se desborda la pila y el procesador pierde el NORTE.... no sabe que hacer ni donde ir, por eso aborta por incoherencia del programa.
Si usted implementa 4 call seguidas y ningun RET ya desbordo el STACK

Espero lo entienda. Con este concepto en claro, revise su código de nuevo.

FIFO = First Input , First Output (ninguna otra cosa ) ;)
 

Adjuntos

  • STACK.jpg
    STACK.jpg
    32.4 KB · Visitas: 2
Última edición:
Arriba