TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: martos_iii 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
-
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...
-
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.
-
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ón
-
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