Autor Tema: Problema con la bandera Z  (Leído 2347 veces)

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

Desconectado ommarcano

  • PIC10
  • *
  • Mensajes: 3
Problema con la bandera Z
« en: 15 de Enero de 2019, 19:49:53 »
Buenas tardes estoy comenzando a programar en ensamblador y estoy usando el PIC16F84A.
Estoy intentando utilizar la bandera Z para comprobar si el resultado de una resta es 0.
Necesito comprobar el valor de un registro para poder saber cual será el siguiente procedimiento del programa así que utilicé un Subwf y luego un "BTFSC STATUS,Z" pero por lo que veo la bandera Z no está cambiando. A continuacion copio el programa a ver si me pueden ayudar a detectar el error:
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC

LIST P=16F84A
INCLUDE "P16F84A.INC"

ORG 0x00
BSF STATUS,RP0
MOVLW 0x00
MOVWF PORTB
BSF PORTA,0
BSF PORTA,1
BCF STATUS,RP0
MOVLW 0x3F
MOVWF PORTB

DESARROLLO
BTFSC PORTA,0
GOTO SUBIDA
BTFSC PORTA,1
GOTO BAJADA
GOTO DESARROLLO

SUBIDA
MOVLW 0X3F
SUBWF PORTB,0
BTFSC STATUS,Z
GOTO UNO
MOVLW 0x06
SUBWF PORTB,0
BTFSC STATUS,Z
GOTO DOS
MOVLW 0x5B
SUBWF PORTB,0
BTFSC STATUS,Z
GOTO TRES
MOVLW 0x4F
SUBWF PORTB,0
BTFSC STATUS,Z
GOTO CUATRO
MOVLW 0x66
SUBWF PORTB,0
BTFSC STATUS,Z
GOTO CINCO
MOVLW 0x6D
SUBWF PORTB,0
BTFSC STATUS,Z
GOTO SEIS
MOVLW 0x7D
SUBWF PORTB,0
BTFSC STATUS,Z
GOTO SIETE
MOVLW 0x07
SUBWF PORTB,0
BTFSC STATUS,Z
GOTO OCHO
MOVLW 0x7F
SUBWF PORTB,0
BTFSC STATUS,Z
GOTO NUEVE
MOVLW 0x67
SUBWF PORTB,0
BTFSC STATUS,Z
GOTO NUEVE
GOTO DESARROLLO

BAJADA
CLRF W
MOVLW 0X3F
SUBWF PORTB,W
BTFSC STATUS,Z
GOTO CERO
MOVLW 0x06
SUBWF PORTB,0
BTFSC STATUS,Z
GOTO CERO
MOVLW 0x5B
SUBWF PORTB,0
BTFSC STATUS,Z
GOTO UNO
MOVLW 0x4F
SUBWF PORTB,0
BTFSC STATUS,Z
GOTO DOS
MOVLW 0x66
SUBWF PORTB,0
BTFSC STATUS,Z
GOTO TRES
MOVLW 0x6D
SUBWF PORTB,0
BTFSC STATUS,Z
GOTO CUATRO
MOVLW 0x7D
SUBWF PORTB,0
BTFSC STATUS,Z
GOTO CINCO
MOVLW 0x07
SUBWF PORTB,0
BTFSC STATUS,Z
GOTO SEIS
MOVLW 0x7F
SUBWF PORTB,0
BTFSC STATUS,Z
GOTO SIETE
MOVLW 0x67
SUBWF PORTB,0
BTFSC STATUS,Z
GOTO OCHO
GOTO DESARROLLO

CERO
MOVLW 0x3F
MOVWF PORTB
GOTO DESARROLLO
UNO
MOVLW 0x06
MOVWF PORTB
GOTO DESARROLLO
DOS
MOVLW 0x5B
MOVWF PORTB
GOTO DESARROLLO
TRES
MOVLW 0x4F
MOVWF PORTB
GOTO DESARROLLO
CUATRO
MOVLW 0x66
MOVWF PORTB
GOTO DESARROLLO
CINCO
MOVLW 0x6D
MOVWF PORTB
GOTO DESARROLLO
SEIS
MOVLW 0x7D
MOVWF PORTB
GOTO DESARROLLO
SIETE
MOVLW 0x07
MOVWF PORTB
GOTO DESARROLLO
OCHO
MOVLW 0x7F
MOVWF PORTB
GOTO DESARROLLO
NUEVE
MOVLW 0x67
MOVWF PORTB
GOTO DESARROLLO



END

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Problema con la bandera Z
« Respuesta #1 en: 15 de Enero de 2019, 21:13:28 »
Citar
Necesito comprobar el valor de un registro para poder saber cual será el siguiente procedimiento del programa así que utilicé un Subwf y luego un "BTFSC STATUS,Z" pero por lo que veo la bandera Z no está cambiando.

Que tan seguro estas de que la bandera Z no esta cambiando ?

Repasemos lo que estas haciendo:

- Pones el PORTB como salida
- Pones el PORTA 0 y 1 como entrada
- Asignas el valor 0x3F al PORTB

En tu rutina "SUBIDA" no hay problema ya que al detectar el 0x3F procede a cambiarlo por 0x06 (rutina UNO), y eso lo lleva hacia adelante.
En la rutina "BAJADA" se queda en la rutina CERO ( 0x3F ) para siempre...

El programa funciona correctamente sin prestarle atencion a los bits de configuracion.

Desconectado ommarcano

  • PIC10
  • *
  • Mensajes: 3
Re:Problema con la bandera Z
« Respuesta #2 en: 16 de Enero de 2019, 00:06:53 »
Asumi que el problema es con la bandera Z porque al cambiar los BTSFSC por BTFSS funciona la primera parte del programa como si la bandera se mantuviera siempre en 0 a pesar de que la resta es 0.
Realmente no manejo mucho la programación del Pic aún y no tengo seguridad de si ese es el error. En teoría el programa debería ser un contador que al tocar un pulsador aumente una unidad y al tocar otro pulsador disminuya una unidad, como la salida debe ser un display 7segmentos fue esto lo que pensé que se podría hacer pero lo cierto es que no está funcionando.  :oops:

Desconectado ommarcano

  • PIC10
  • *
  • Mensajes: 3
Re:Problema con la bandera Z
« Respuesta #3 en: 16 de Enero de 2019, 00:35:30 »
Gracias por tu ayuda y disculpa que te siga molestando. El programa solo me alterna entre el 0 y el 9 pero realmente no sé por qué. Me pordrías ayudar?

Desconectado elreypic2

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1297
Re:Problema con la bandera Z
« Respuesta #4 en: 16 de Enero de 2019, 17:54:25 »
Que tal ommarcano,

Primero que nada algunos consejos para la programamción.

1) Comentar el código. Es una excelente y recomendable práctica el comentar las líneas de tu código, ya que esto te permitirá entender mejor tu código y sobre todo, recordar su funcionamiento.

2) Usa los tabuladores para colocar tu código de una manera visualmente ordenada. Esto le dara mayor claridad y limpieza a tu código.

He agregado algunas correcciones a la parte de tu rutina llamada BAJADA ya que encontré algunos detalles en ella.
Algo que no mencionas es si estás simulando este código en PROTEUS o lo estás realizando en vivo sobre alguna tarjeta de demostración o en un BREADBOARD.

Si lo estás simulando en PROTEUS, con las corrreciones no deberías tener ningún problema, pero si estás armando el circuito en una tarjeta demo o en un BREADBOARD, entonces tienes que trabajar en los rebotes de los pulsadores de otra manera solo veras que los numeros brincan tan rápidamente que te dará la sensasión de que no funciona, ya que solo veras algunos numeros mostrados. Para ellos tienes que realizar algunas subrutinas de delay para implementar la eliminación de los rebotes.

Este es el código corregido sin la eliminación de rebotes:

Código: [Seleccionar]
LIST P=16F84A
INCLUDE "P16F84A.INC"
;**********************************************************
; Configuración de Fusibles
; Code Protect: OFF
; Watch-dog timer: OFF
; Power-up Timer: ON
; Oscillator: External Crystal
;**********************************************************
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC


ORG 0x00
BSF STATUS,RP0 ;Cambia a banco 1
MOVLW 0x00 ;Configura todo el purrto B como salida
MOVWF PORTB
BSF PORTA,0 ;Configura puerto A0 como entrada
BSF PORTA,1 ;Configura puerto A1 como entrada
BCF STATUS,RP0 ;Cambia a Banco 0
MOVLW 0x3F ;Muestra un "0" en el display de 7 segmentos
MOVWF PORTB ;de cátodo común conectado al puerto B

DESARROLLO
BTFSC PORTA,0 ;Se presionó el interruptor de incremento?
GOTO SUBIDA ;Sí, entonces ve a rutina SUBIDA
BTFSC PORTA,1 ;No, se presionó interruptor de decremento?
GOTO BAJADA ;Sí, entonces ve a rutina BAJADA
GOTO DESARROLLO ;No, entonces regresa a preguntar por interruptor de incremento

DESARROLLO1
CLRW ;Limpia el registro de trabajo W
XORWF PORTA,W ;Verifica si los pulsadores se han liberado
BTFSS STATUS,Z         ;Se han liberado los pulsadores?
GOTO DESARROLLO1 ;No, entonces espera hasta que se liberen
GOTO DESARROLLO ;Sí, entonces regresa a preguntar por los pulsadores.

SUBIDA
MOVLW 0X3F ;Coloca en el regsitro de trabajo W el valor del "0"
SUBWF PORTB,0 ; W = PORTB - W
BTFSC STATUS,Z ; El puerto B está mostrando un "0"?
GOTO UNO ; Sí, entonces ve a rutina UNO
MOVLW 0x06 ; No, entonces coloca en el regsitro de trabajo W el valor del "1"
SUBWF PORTB,0 ; W = PORTB - W
BTFSC STATUS,Z ; El puerto B esta mostrando un "1"?
GOTO DOS ; Sí, entonces ve a rutina DOS
MOVLW 0x5B ; No, entonces coloca en el registro de trabajo W el valor del "2"
SUBWF PORTB,0 ; W = PORTB - W
BTFSC STATUS,Z ; El puerto B está mostrando un "2"?
GOTO TRES ; Sí, entonces ve a rutina TRES
MOVLW 0x4F ; No, entonces coloca en el registro de trabajo W el valor del "3"
SUBWF PORTB,0 ; W = PORTB - W
BTFSC STATUS,Z ; El puerto B está mostrando un "3"?
GOTO CUATRO ; Sí, entonces ve a rutina CUATRO
MOVLW 0x66 ; No, entonces coloca en el registro de trabajo W el valor del "4"
SUBWF PORTB,0 ; W = PORTB - W
BTFSC STATUS,Z ; El puerto B está mostrando un "4"?
GOTO CINCO ; Sí, entonces ve a rutina CINCO
MOVLW 0x6D ; No, entonces coloca en el registro de trabajo W el valor del "5"
SUBWF PORTB,0 ; W = PORTB - W
BTFSC STATUS,Z ; El puerto B está mostrando un "5"?
GOTO SEIS ; Sí, entonces ve a rutina SEIS
MOVLW 0x7D ; No, entonces coloca en el registro de trabajo W el valor del "6"
SUBWF PORTB,0 ; W = PORTB - W
BTFSC STATUS,Z ; El puerto B está mostrando un "6"?
GOTO SIETE ; Sí, entonces ve a rutina SIETE
MOVLW 0x07 ; No, entonces coloca en el registro de trabajo W el valor del "7"
SUBWF PORTB,0 ; W = PORTB - W
BTFSC STATUS,Z ; El puerto B está mostrando un "7"?
GOTO OCHO ; Sí, entonces ve a rutina OCHO
MOVLW 0x7F ; No, entonces coloca en el registro de trabajo W el valor del "8"
SUBWF PORTB,0 ; W = PORTB - W
BTFSC STATUS,Z ; El puerto B está mostrando un "8"?
GOTO NUEVE ; Sí, entonces ve a rutina NUEVE
MOVLW 0x67 ; No, entonces coloca en el registro de trabajo W el valor del "9"
SUBWF PORTB,0 ; W = PORTB - W
BTFSC STATUS,Z ; El puerto B está mostrando un "9"?
GOTO CERO ; Sí, entonces ve a rutina CERO
GOTO DESARROLLO ; No, entonces ve a rutina DESARROLLO para preguntar por los pulsadores

BAJADA
CLRF W ; Limpia el registro de trabajo W
MOVLW 0X3F ;Coloca en el regsitro de trabajo W el valor del "0"
SUBWF PORTB,0 ; W = PORTB - W
BTFSC STATUS,Z ; El puerto B está mostrando un "0"?
GOTO NUEVE ; Sí, entonces ve a rutina NUEVE
MOVLW 0x06 ; No, entonces coloca en el regsitro de trabajo W el valor del "1"
SUBWF PORTB,0 ; W = PORTB - W
BTFSC STATUS,Z ; El puerto B esta mostrando un "1"?
GOTO CERO ; Sí, entonces ve a rutina CERO
MOVLW 0x5B ; No, entonces coloca en el registro de trabajo W el valor del "2"
SUBWF PORTB,0 ; W = PORTB - W
BTFSC STATUS,Z ; El puerto B está mostrando un "2"?
GOTO UNO ; Sí, entonces ve a rutina UNO
MOVLW 0x4F ; No, entonces coloca en el registro de trabajo W el valor del "3"
SUBWF PORTB,0 ; W = PORTB - W
BTFSC STATUS,Z ; El puerto B está mostrando un "3"?
GOTO DOS ; Sí, entonces ve a rutina DOS
MOVLW 0x66 ; No, entonces coloca en el registro de trabajo W el valor del "4"
SUBWF PORTB,0 ; W = PORTB - W
BTFSC STATUS,Z ; El puerto B está mostrando un "4"?
GOTO TRES ; Sí, entonces ve a rutina TRES
MOVLW 0x6D ; No, entonces coloca en el registro de trabajo W el valor del "5"
SUBWF PORTB,0 ; W = PORTB - W
BTFSC STATUS,Z ; El puerto B está mostrando un "5"?
GOTO CUATRO ; Sí, entonces ve a rutina CUATRO
MOVLW 0x7D ; No, entonces coloca en el registro de trabajo W el valor del "6"
SUBWF PORTB,0 ; W = PORTB - W
BTFSC STATUS,Z ; El puerto B está mostrando un "6"?
GOTO CINCO ; Sí, entonces ve a rutina CINCO
MOVLW 0x07 ; No, entonces coloca en el registro de trabajo W el valor del "7"
SUBWF PORTB,0 ; W = PORTB - W
BTFSC STATUS,Z ; El puerto B está mostrando un "7"?
GOTO SEIS ; Sí, entonces ve a rutina SEIS
MOVLW 0x7F ; No, entonces coloca en el registro de trabajo W el valor del "8"
SUBWF PORTB,0 ; W = PORTB - W
BTFSC STATUS,Z ; El puerto B está mostrando un "8"?
GOTO SIETE ; Sí, entonces ve a rutina SIETE
MOVLW 0x67 ; No, entonces coloca en el registro de trabajo W el valor del "9"
SUBWF PORTB,0 ; W = PORTB - W
BTFSC STATUS,Z ; El puerto B está mostrando un "9"?
GOTO OCHO ; Sí, entonces ve a rutina OCHO
GOTO DESARROLLO ; No, entonces ve a rutina DESARROLLO para preguntar por los pulsadores

CERO
MOVLW 0x3F ; Coloca en el registro de trabajo el valor del "0"
MOVWF PORTB ; Muestra en el display de 7 segmentos el "0"
GOTO DESARROLLO1 ; Regresa a preguntar por los pulsadores
UNO
MOVLW 0x06 ; Coloca en el registro de trabajo el valor del "1"
MOVWF PORTB ; Muestra en el display de 7 segmentos el "1"
GOTO DESARROLLO1 ; Regresa a preguntar por los pulsadores
DOS
MOVLW 0x5B ; Coloca en el registro de trabajo el valor del "2"
MOVWF PORTB ; Muestra en el display de 7 segmentos el "2"
GOTO DESARROLLO1 ; Regresa a preguntar por los pulsadores
TRES
MOVLW 0x4F ; Coloca en el registro de trabajo el valor del "3"
MOVWF PORTB ; Muestra en el display de 7 segmentos el "3"
GOTO DESARROLLO1 ; Regresa a preguntar por los pulsadores
CUATRO
MOVLW 0x66 ; Coloca en el registro de trabajo el valor del "4"
MOVWF PORTB ; Muestra en el display de 7 segmentos el "4"
GOTO DESARROLLO1 ; Regresa a preguntar por los pulsadores
CINCO
MOVLW 0x6D ; Coloca en el registro de trabajo el valor del "5"
MOVWF PORTB ; Muestra en el display de 7 segmentos el "5"
GOTO DESARROLLO1 ; Regresa a preguntar por los pulsadores
SEIS
MOVLW 0x7D ; Coloca en el registro de trabajo el valor del "6"
MOVWF PORTB ; Muestra en el display de 7 segmentos el "6"
GOTO DESARROLLO1 ; Regresa a preguntar por los pulsadores
SIETE
MOVLW 0x07 ; Coloca en el registro de trabajo el valor del "7"
MOVWF PORTB ; Muestra en el display de 7 segmentos el "7"
GOTO DESARROLLO1 ; Regresa a preguntar por los pulsadores
OCHO
MOVLW 0x7F ; Coloca en el registro de trabajo el valor del "8"
MOVWF PORTB ; Muestra en el display de 7 segmentos el "8"
GOTO DESARROLLO1 ; Regresa a preguntar por los pulsadores
NUEVE
MOVLW 0x67 ; Coloca en el registro de trabajo el valor del "9"
MOVWF PORTB ; Muestra en el display de 7 segmentos el "9"
GOTO DESARROLLO1 ; Regresa a preguntar por los pulsadores

END

Espero esto te ayude.

elreypic.

P.S Realicé una pequeña modificación para la operación correcta.
« Última modificación: 17 de Enero de 2019, 00:07:30 por elreypic2 »