Autor Tema: Dudas sobre bucle decfsz y errores en mplab y proteus.  (Leído 4241 veces)

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

Desconectado alemaniafino

  • PIC10
  • *
  • Mensajes: 3
Dudas sobre bucle decfsz y errores en mplab y proteus.
« en: 09 de Mayo de 2013, 13:50:15 »
soy novato, me intereso mucho esto sobre pic's y estoy practicando, hice un ciclo que consiste en que por el PORTA prendieran leds a manera de numeracion secuencial es decir: '0001', luego '0010, '0011' y asi hasta llegar al 15, y por medio de un decfsz se repitiera el ciclo 3 veces pero, cuando lo simulo en proteus, los leds no paran nunca de prender, luego en mp lab verifique con mplabsim y el visor de registros, y me mando estos errores, a pesar de que en el quickbuild me puso Build succeeded:

 :-/ :-/ Espero me ayuden porque ya me desespere y estoy muy entusiasmado con el pic  :mrgreen: de antemano gracias  ((:-))

Build:
Executing: "C:\Archivos de programa\Microchip\MPASM Suite\MPAsmWin.exe" /q /p16F84A "CONTADOR2.asm" /l"CONTADOR2.lst" /e"CONTADOR2.err"
Message[302] C:\CONTADOR2.ASM 13 : Register in operand not in bank 0.  Ensure that bank bits are correct.
BUILD SUCCEEDED: Thu May 09 10:12:49 2013

MPLABSIM:
CORE-E0002: Stack under flow error occurred from instruction at 0x000404

codigo:
;DATOS

      LIST       P=16F84A
      INCLUDE      <P16F84A.INC>
      CBLOCK      0x0C
      
      ENDC
Contador EQU d'3'

            ORG 0

Inicio   bsf      STATUS,RP0
      clrf      TRISA
      bcf      STATUS,RP0
      movwf   Contador
Principal
      movlw   b'0000'
      movwf   PORTA
      call      Retardo200
      movlw   b'0001'
      movwf   PORTA
      call      Retardo200
      movlw   b'0010'
      movwf   PORTA
      call      Retardo200
      movlw   b'0011'
      movwf   PORTA
      call      Retardo200
      movlw   b'0100'
      movwf   PORTA
      call      Retardo200
      movlw   b'0101'
      movwf   PORTA
      call      Retardo200
      movlw   b'0110'
      movwf   PORTA
      call      Retardo200
      movlw   b'0111'
      movwf   PORTA
      call      Retardo200
      movlw   b'1000'
      movwf   PORTA
      call      Retardo200
      movlw   b'1001'
      movwf   PORTA
      call      Retardo200
      movlw   b'1010'
      movwf   PORTA
      call      Retardo200
      movlw   b'1011'
      movwf   PORTA
      call      Retardo200
      movlw   b'1100'
      movwf   PORTA
      call      Retardo200
      movlw   b'1101'
      movwf   PORTA
      call      Retardo200
      movlw   b'1110'
      movwf   PORTA
      call      Retardo200
      movlw   b'1111'
      movwf   PORTA
      call      Retardo200
      decfsz   Contador,f
      goto   Principal
;SUBRUTINAS
      CBLOCK
      R_ContA
      R_ContB
      R_ContC
      ENDC
Retardo200
      movlw   d'5'
      goto   RetardoDecima
RetardoDecima
      movwf   R_ContC
RetardoBucleExterno2
      movlw   d'50'
      movwf   R_ContB
RetardoBucleExterno1
      movlw   d'249'
      movwf   R_ContA
RetardoBucleInterno
      decfsz   R_ContA,F
      goto   RetardoBucleInterno
      decfsz   R_ContB,F
      goto   RetardoBucleExterno1
      decfsz   R_ContC,F
      goto   RetardoBucleExterno2
      return
      END

Desconectado alexhumbertoa

  • PIC10
  • *
  • Mensajes: 49
Re: Dudas sobre bucle decfsz y errores en mplab y proteus.
« Respuesta #1 en: 09 de Mayo de 2013, 14:17:31 »
Código: [Seleccionar]
[code]Inicio   bsf      STATUS,RP0
      clrf      TRISA
      bcf      STATUS,RP0
      movwf   Contador
[/code]

observo que estas asignando el valor de W al registro contador sin establecer antes un valor para W por lo cual esl registro contador esta siendo cargado con un valor indetermindado

Código: [Seleccionar]
Contador EQU d'3'
la directiva EQU se usa para crear una representacion fija de un valor numerico, es decir darle un nombre a un valor
 en este caso estas fijando el valor '3' al nombre contador para luego usarlo como direccionamiento directo de un registro.
La protoboard es la mejor amiga del ruido.

Desconectado alemaniafino

  • PIC10
  • *
  • Mensajes: 3
Re: Dudas sobre bucle decfsz y errores en mplab y proteus.
« Respuesta #2 en: 10 de Mayo de 2013, 21:02:44 »
De nuevo aqui--- :)

Les cuento que me ha ido mal...

Quite la directiva EQU y declare la etiqueta Contador dentro de CBLOCK y ENDC: y ya le asigne un valor a Contador mediante el movlw, y el resto del codigo anterior...

Código: [Seleccionar]
LIST       P=16F84A
      INCLUDE      <P16F84A.INC>
      CBLOCK      0x0C
      Contador
      ENDC


            ORG 0

Inicio   bsf      STATUS,RP0
      clrf      TRISA
      movlw   d'3'
      movwf   Contador     
      bcf      STATUS,RP0
     
     

Tambien he Puesto Contador fuera del CBLOCK...  como seguia sin parar intente poniendo como subrutina el decfsz

Código: [Seleccionar]
      ------ ;codigo antecedente
      movlw   b'1111'
      movwf   PORTA
      call      Retardo200
      call      Bucle
;SUBRUTINAS
      CBLOCK
      R_ContA
      R_ContB
      R_ContC
      Contador
      ENDC
Retardo200
-----------;codigo
Bucle
      movlw   d'3'
      movwf   Contador
      decfsz   Contador,f
      goto   Principal
      return
      END

y tampoco me valio, sigue sin parar, no estoy entendiendo esto.

que lata doy aunque esta sencillo no hago que pare el Bucle. :D

Desconectado alexhumbertoa

  • PIC10
  • *
  • Mensajes: 49
Re: Dudas sobre bucle decfsz y errores en mplab y proteus.
« Respuesta #3 en: 11 de Mayo de 2013, 12:27:23 »
Hay otro error en tu código:
cuando el contador de programa llega a la ultima dirección de la memoria de programa se resetea y comienza a ejecutar desde la dirección cero de nuevo, en tu código cuando el registro "Contador" decrementa y su valor queda en cero sale de ese bucle, ejecuta la subrutina "retardo200"y luego no hay nada que le ordene al programa quedarse ahí quieto por lo cual el contador de programa sigue corriendo hasta que se acaba la memoria de programa y luego comienza desde la dirección cero otra vez ejecutando así todo el programa de nuevo.
Para corregir esto debes escribir donde deseas que pare, unas instrucciones que le indiquen al programa que se quede ahí y no siga avanzando el contador de programa.
de resto debería funcionar bien
La protoboard es la mejor amiga del ruido.

Desconectado alemaniafino

  • PIC10
  • *
  • Mensajes: 3
Re: Dudas sobre bucle decfsz y errores en mplab y proteus.
« Respuesta #4 en: 13 de Mayo de 2013, 03:02:20 »
Hola a todos  :-/

Gracias alexhumbertoa, ya logre que parara, para que el decfsz no saltara a la siguiente instruccion que formaba parte de la subrutina primero apague los leds con un clrf y luego hice esto goto $, asi lo detuve, aunque en el mplabsim me marca un desbordamiento de pila (stack underflow from 0x000404) en el proteus si corre bien, y aqui pongo el codigo completo: ;DATOS

      LIST       P=16F84A
      INCLUDE      <P16F84A.INC>
      Contador
      
      ORG 0

Inicio   bsf      STATUS,RP0
      clrf      PORTA
      bcf      STATUS,RP0
Etiqueta      
      movlw   d'2'
      movwf   Contador
Principal
      movlw   b'0000'
      movwf   PORTA
      call      Retardo200
      movlw   b'0001'
      movwf   PORTA
      call      Retardo200
      movlw   b'0010'
      movwf   PORTA
      call      Retardo200
      movlw   b'0011'
      movwf   PORTA
      call      Retardo200
      movlw   b'0100'
      movwf   PORTA
      call      Retardo200
      movlw   b'0101'
      movwf   PORTA
      call      Retardo200
      movlw   b'0110'
      movwf   PORTA
      call      Retardo200
      movlw   b'0111'
      movwf   PORTA
      call      Retardo200
      movlw   b'1000'
      movwf   PORTA
      call      Retardo200
      movlw   b'1001'
      movwf   PORTA
      call      Retardo200
      movlw   b'1010'
      movwf   PORTA
      call      Retardo200
      movlw   b'1011'
      movwf   PORTA
      call      Retardo200
      movlw   b'1100'
      movwf   PORTA
      call      Retardo200
      movlw   b'1101'
      movwf   PORTA
      call      Retardo200
      movlw   b'1110'
      movwf   PORTA
      call      Retardo200
      movlw   b'1111'
      movwf   PORTA
      call      Retardo200
      decfsz   Contador,F
      goto    Principal
      clrf      PORTA
      goto   $
;SUBRUTINAS
      CBLOCK 0x0C
      R_ContA
      R_ContB
      R_ContC
      ENDC
Retardo200
      movlw   d'5'
      goto   RetardoDecima
RetardoDecima
      movwf   R_ContC
RetardoBucleExterno2
      movlw   d'50'
      movwf   R_ContB
RetardoBucleExterno1
      movlw   d'249'
      movwf   R_ContA
RetardoBucleInterno
      decfsz   R_ContA,F
      goto   RetardoBucleInterno
      decfsz   R_ContB,F
      goto   RetardoBucleExterno1
      decfsz   R_ContC,F
      goto   RetardoBucleExterno2
      return
      END


seguire estudiando y practicando ya les comentare en breve mis siguientes proyectos y dudas sobre ellos, saludos y gracias.