Autor Tema: Sobre la instruccion: DECFSZ  (Leído 20048 veces)

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

Desconectado cereal2

  • PIC10
  • *
  • Mensajes: 26
Sobre la instruccion: DECFSZ
« en: 11 de Marzo de 2005, 11:45:00 »
Buenas

Sólo pretendo tener una rutina que es una DEMORA de 0.02 ms, por lo tanto monto un bucle de 20 ciclos de Delay (con PIC a 4 MHz, o sea 1 microsec/instruccion) utilizando la instrucción DECFSZ.

Pero esta instruccion no entiendo muy bien como funciona, porque segun la función siguiente (con permiso de Pier Paolo Messaggio T.):


DEMORA     movlw     .3                 ;1 set numero de repeticion
                  movwf     PDel0           ; 1 |
PLoop0      clrwdt                          ; 1 clear watchdog
                 decfsz    PDel0, 1         ; 1 + (1) es el tiempo 0  ?
                 goto      PLoop0           ; 2 no, loop
PDelL1      goto PDelL2                 ; 2 ciclos delay
PDelL2      clrwdt                           ; 1 ciclo delay
                 return                          ; 2+2 Fin

Lo unico que me hace esta función es meterme en un buble INFINITO dentro de PLoop, será por la instrucción DECFSZ? Es que no acabo de entenderlo. Sólo pretendo en tener una RETARDO de X secs.

Gracias.






Desconectado Xelene

  • PIC12
  • **
  • Mensajes: 81
RE: Sobre la instruccion: DECFSZ
« Respuesta #1 en: 12 de Marzo de 2005, 06:03:00 »
La instruccion decfsz PDel0,1 lo que hace es restarle a PDel0 1, lo guarda en él mismo y si el resultado es 0 se salta la siguiente instrucción. Por ejemplo...

Inicialmente PDel0=3, pasamos x la instrucción de DECSFZ y esta hace:

  PDel0=3-1=2, ahora PDel0 vale 2. Como 2 es distinto de 0 repite el bucle (goto Ploop0)

Cuando PDel0=1, al pasar x la instrucción DECSFZ PDel0=1-1=0 y se saltará la instrucción de goto... así saldrá del bucle y pasará a la siguiente instrucción.

Lo entiendes ahora?? Si no es así, me comentas!!
Maria.

Desconectado cereal2

  • PIC10
  • *
  • Mensajes: 26
RE: Sobre la instruccion: DECFSZ
« Respuesta #2 en: 12 de Marzo de 2005, 08:48:00 »
Lo entiendo perfectamente, pero no me salta del a siguiente instrucción una vez llegado a 0 el contador, un ejemplo sería lo siguiente:

Codigo:
DEMORA
            movlw 0x05           ; 5 al contador
            movwf CONTADOR
DECR        decfsz CONTADOR,1
           goto NOPS
           return
NOPS       nop
           goto DECR


En teoria, tal como está programado aquí, la instrucción DSCFSZ ha de ejecutar la siguiente instrucción 4 veces, y a la siguiente, debe saltar e ir a la instrucción RETURN. Pues a mi, realizandolo paso a paso, no salta NUNCA, Ardiendo además ni puedo mirar qué valor tiene el registro CONTADOR ya que con el programa MPLAB me dice: Restricted Memory.

Espero que me podais resolver esto. Gracias Flash Flash Flash Flash


Desconectado fer_zone

  • PIC12
  • **
  • Mensajes: 74
RE: Sobre la instruccion: DECFSZ
« Respuesta #3 en: 14 de Marzo de 2005, 20:24:00 »
Hola, primero permiteme preguntar si estos programas los has simulado solamente o los has provado en el micro.
Despues otra pregunta: qué dirección le diste a ese registro CONTADOR (estas en la pagina de memoria que corresponde???).

Saludos...

Desconectado cereal2

  • PIC10
  • *
  • Mensajes: 26
RE: Sobre la instruccion: DECFSZ
« Respuesta #4 en: 15 de Marzo de 2005, 02:54:00 »
Buenas fer_zone.

Lo simulé y lo prové en el micro. Pero ara ya funciona correctamente. Era un error a la hora de declarar la variable, ya que ponia:

Codigo:
Contador     EQU     0x00


Claro, yo pensaba que a esa variable se declaraba con un valor inicial "0", pero no, sino era la posicion de memoria. Pues lo rectifiqué poniendo 0x20 (que es la primera posición libre del PIC16F877).

Gracias de todas las maneras.

CIAO!


Desconectado Xelene

  • PIC12
  • **
  • Mensajes: 81
RE: Sobre la instruccion: DECFSZ
« Respuesta #5 en: 15 de Marzo de 2005, 05:40:00 »
Vaya, he llegado tarde, me alegro de q lo hayas solucionado! Flash


 

anything