Autor Tema: duda retardo  (Leído 2084 veces)

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

Desconectado martos_iii

  • PIC10
  • *
  • Mensajes: 26
duda retardo
« en: 04 de Diciembre de 2004, 11:42:00 »
hola a todos, estoy haciendo mi segundo programa para el pic 16f84. El programa consiste en hacer un retardo de un tiempo determinado. El problema lo tengo en que creo que no entiendo bien la instrucción decfsz, bueno el trozo de codigo es muy simple y es el siguiente:

lista de variables utilizadas
var1 EQU 0ch
var2 EQU 0eh
;fin de definición de variables
list p=PIC16f84
include "p16f84.inc"

org 00h
reset
goto inicio


org 10h



inicio
movlw 02h
movwf var1
movwf var2
salto1
decfsz var1,1
goto salto1
decfsz var2,1
goto salto1

end


Yo creo que por ejemplo en la primerra instruccion "decfsz" según he leido en el manual, se debería decrementar la var1 una vez y almacenar el resultado en ellay luego saltar de nuevo a uno, después decrementar la var1 de nuevo y como el resultado es cero saltar la instrucción "goto salto1" y pasar directamente a decfsz var2 y en este caso se consumirian dos ciclos de reloj.
Mi problema es que la primera vez lo hace todo bien pero luego cuando lo simulo en MPLAB el programa ya se "atasca en decfsz var1,1" y no pasa de ahi. Bueno supongo que todo esto será una duda bastante tonta. Muchas gracias a todosLlorando

Desconectado pepocor

  • PIC10
  • *
  • Mensajes: 8
RE: duda retardo
« Respuesta #1 en: 04 de Diciembre de 2004, 13:20:00 »
Yo también estoy empezando y tal vez me equivoque (las probabilidades son altas) pero creo que las variables es mejor declararlas en un bloque

BLOCK <dir_mem_inicial>

ENDC

Tuve el mismo problema que tú y me dí cuenta que al declararlas con EQU lo que hacía era definirlas como constantes y luego ese valor con el que las inicias es el que mantiene durante todo el programa. De ahí tal vez el hecho de que se te quede colgado en el bucle, nunca llega a decrementar las variables...



Desconectado gfp

  • PIC18
  • ****
  • Mensajes: 274
RE: duda retardo
« Respuesta #2 en: 04 de Diciembre de 2004, 15:04:00 »
Por que no lo haces así:

LIST P=PIC16F84
#INCLUDE <P16F874.INC>
var1 EQU 0ch
var2 EQU 0eh

ORG 0
GOTO INICIO
ORG 10

INICIO
movlw 02h
movwf var1
movwf var2
salto1
decfsz var1,1
goto salto1
salto2
decfsz var2,1
goto salto2
goto INICIO
END

gfp :-)

Una recomendación: Trata de colocar un solo anuncio Si? Si colocas mas de uno confundimos a los participantes y mas trabajo para las personas que te ayudan.
Recuerda, es sólo una recomendación.

Desconectado martos_iii

  • PIC10
  • *
  • Mensajes: 26
RE: duda retardo
« Respuesta #3 en: 04 de Diciembre de 2004, 15:26:00 »
ok, muchas gracias ya me funciono con lo de las dos etiquetas, aunque lo de definir las variables en bloque no he conseguido hacerlo. Muchas gracias de todos modos a los dos por vuestra informaciónFlash

Desconectado fenix_jn

  • PIC18
  • ****
  • Mensajes: 418
RE: duda retardo
« Respuesta #4 en: 04 de Diciembre de 2004, 20:33:00 »
Por lo que lei del programa el error podria ser el siguiente: Al llegar a 0 el valor de var1, efectivamente decrementa el valor de var2 en 1 pero no existe un valor de "recarga" para el valor var1 (que ya esta en 0) por lo que la cuenta comienza ahora en 255, es decir en vez de tomar 2 * 2 ciclos esta tomando 2 + 255 ciclos (suma gruesa, en realidad se tarda un poco mas por lo d que la instruccion decfsz toma dos ciclos y todo eso), la solucion seria la siguiente:

inicio   movlw 02h
           movwf var2, 1
recar   movlw 02h
          movwf  var1, 1

salto  decfsz  var1, 1
          goto     salto
          decfsz   var2, 1
          goto     recar
          return o goto identificador