TODOPIC

Microcontroladores PIC => Primeros pasos - Iniciación a los microcontroladores => Mensaje iniciado por: Colino en 01 de Noviembre de 2016, 06:01:19

Título: Stack overflow
Publicado por: Colino en 01 de Noviembre de 2016, 06:01:19
Holá

Na simulação deste software dá "hardware stack overflow" na instrução
 

fechar
       BSF     0x05,0   
Título: Re:Stack overflow
Publicado por: KILLERJC en 01 de Noviembre de 2016, 08:22:17
Cuando haces un CALL la direccion se guarda en el stack ( +1 elemento en el stack ). Cuando haces un RETURN la direccion sale del stack ( -1 elemento en el stack ).

Entonces... Un CALL si o si debe encontrar un RETURN.

Tu CALL:
Citar
fechar 
   BSF     GPIO,0              ; LIGA  A LUZ 
   CALL    delay1              ; ACTIVA ATRASO DE 30 MINUTOS

delay:
Citar
delay1                               ; TEMPORIZAÇÃO DE 30 MINUTOS
   movlw   0x7E               
   movwf   count1              ;carrega contador 1
   movlw   0x14
   movwf   count2              ;carrega contador 2
   movlw   0x21
   movwf   count3              ;carrega contador 3     
        nop   
   decfsz   count1, f           
   goto   $+2
   decfsz   count2, f
   goto   $+2
   decfsz   count3, f
   goto   main

No hay RETURN!. Entonces siempre estas poniendo algo en el stack pero nunca sacando, por eso el Stack Overflow.

Solucion:

Código: ASM
  1. delay1                              ; TEMPORIZAÇÃO DE 30 MINUTOS
  2.         movlw   0x7E                
  3.         movwf   count1              ;carrega contador 1
  4.         movlw   0x14
  5.         movwf   count2              ;carrega contador 2
  6.         movlw   0x21
  7.         movwf   count3              ;carrega contador 3    
  8.         nop  
  9.         decfsz  count1, f          
  10.         goto    $+2
  11.         decfsz  count2, f
  12.         goto    $+2
  13.         decfsz  count3, f
  14.         return
Título: Re:Stack overflow
Publicado por: Colino en 01 de Noviembre de 2016, 10:59:19
Ok gracias
Mas tengo otro problema

counters não decrementa
Título: Re:Stack overflow
Publicado por: KILLERJC en 01 de Noviembre de 2016, 14:59:00
Primero:

- ¿30 minutos en el que el micro no hace nada?

Código: ASM
  1. delay1                              ; TEMPORIZAÇÃO DE 30 MINUTOS
  2.         movlw   0x7E                
  3.         movwf   count1              ;carrega contador 1
  4.         movlw   0x14
  5.         movwf   count2              ;carrega contador 2
  6.         movlw   0x21
  7.         movwf   count3              ;carrega contador 3
  8.         nop    
  9. dLoop:  
  10.         decfsz  count1, f          
  11.         goto    $+2
  12.         decfsz  count2, f
  13.         goto    $+2
  14.         decfsz  count3, f
  15.         goto     dLoop
  16.         return
Título: Re:Stack overflow
Publicado por: Colino en 01 de Noviembre de 2016, 16:52:44
Sim
 30 minutos com GP0 (pin 7) en  ON

  Penso que tengo o codigo pronto
Título: Re:Stack overflow
Publicado por: Colino en 01 de Noviembre de 2016, 17:19:06
Qual la diferença em usar  timers   TMR0, TMR1L, TMRH en los counters,  e los endereços 20, 21, 22 por exemplo
Título: Re:Stack overflow
Publicado por: KILLERJC en 01 de Noviembre de 2016, 17:45:18
Hay varios Timers.

El Timer0 es de 8 bits.
El Timer1 es de 16bits.

TMR0 corresponder al Timer0, y TMR1H:TMR1L corresponde al Timer1.

Mas informacion en el datasheet del micro.

------------------------------

Si los programas a los Timers podes usar las interrupciones, de esa forma el micro sigue haciendo otra cosa, mientras contas el tiempo.
Título: Re:Stack overflow
Publicado por: Colino en 01 de Noviembre de 2016, 18:25:43
OK

Mutchas gracias Killerjc

 Vou fazer el PCB e testar
Futuramente se pode implementar PWM em GP0

  Gracias por  tu ayuda