TODOPIC

Microcontroladores PIC => Primeros pasos - Iniciación a los microcontroladores => Mensaje iniciado por: Watek en 20 de Abril de 2020, 11:37:28

Título: LCD 7seg con teclado binario, ayudaaaa
Publicado por: Watek en 20 de Abril de 2020, 11:37:28
Buenas gente,

soy nuevo en la programacion Pic!! Estoy intentando programar un pic16f84a para que muestre un número en un display conectado al Puerto B, a traves de unos botones de estado lógico conectados al Puerto A.
No encuentro ni consigo ninguna instrución tipo: "si PORTA == W"
Mi código es el siguiente:

Código: [Seleccionar]
List p=16f84a
#include <p16f84a.inc>
__CONFIG _FOSC_XT & _WDTE_OFF & _PWRTE_ON & _CP_OFF
org     0x00
   
    zero  equ b'00111111'
    one   equ b'00000110'
    two   equ b'01011011'
    three equ b'01001111'
    four  equ b'01100110'
    five  equ b'01101001'
    six   equ b'01111101'
    seven equ b'01111111'
    nine  equ b'01101111'
   
    bZero  equ b'00000'
    bOne   equ b'00001'
    bTwo   equ b'00010'
    bThree equ b'00011'
    bFour  equ b'00100'
    bFive  equ b'00101'
    bSix   equ b'00110'
    bSeven equ b'00111'
   
 

BSF     STATUS,RP0
MOVLW     b'11111'
MOVWF     TRISA
CLRF     TRISB
BCF     STATUS,RP0
   
    START
    CALL     TESTif0
    CALL     TESTif1
    CALL     TESTif2
    CALL     TESTif3
    CALL     TESTif4
    CALL     TESTif5
    CALL     TESTif6
    CALL     TESTif7
    GOTO     START
   
    TESTif0
    BTFSC PORTA,bZero
    MOVLW zero
    BTFSC PORTA,bZero
    MOVWF PORTB
    RETURN
   
    TESTif1
    BTFSC PORTA,bOne
    MOVLW one
    BTFSC PORTA,bOne
    MOVWF PORTB
    RETURN
   
    TESTif2
    BTFSC PORTA,bTwo
    MOVLW two
    BTFSC PORTA,bTwo
    MOVWF PORTB
    RETURN
   
    TESTif3
    BTFSC PORTA,bThree
    MOVLW three
    BTFSC PORTA,bThree
    MOVWF PORTB
    RETURN
   
    TESTif4
    BTFSC PORTA,bFour
    MOVLW four
    BTFSC PORTA,bFour
    MOVWF PORTB
    RETURN
   
    TESTif5
    BTFSC PORTA,bFive
    MOVLW five
    BTFSC PORTA,bFive
    MOVWF PORTB
    RETURN
   
    TESTif6
    BTFSC PORTA,bSix
    MOVLW six
    BTFSC PORTA,bSix
    MOVWF PORTB
    RETURN
   
    TESTif7
    BTFSC PORTA,bSeven
    MOVLW seven
    BTFSC PORTA,bSeven
    MOVWF PORTB
    RETURN
   
    END

Título: Re:LCD 7seg con teclado binario, ayudaaaa
Publicado por: KILLERJC en 20 de Abril de 2020, 12:30:58
Si tu problema es este:

Citar
si PORTA == W

Entonces:
Perdiendo W, pero no debería haber problemas, ya que ese registro es de trabajo:

Usando una OR Exclusiva, si son iguales queda W en 0
Código: ASM
  1. XORWF PORTA, W
  2. BTFSS STATUS, Z
  3. GOTO  NOIGUAL
  4. GOTO  IGUAL

ó

Restando. Si es igual a 0
Código: ASM
  1. SUBWF PORTA, W
  2. BTFSS STATUS, Z
  3. GOTO  NOIGUAL
  4. GOTO  IGUAL
Título: Re:LCD 7seg con teclado binario, ayudaaaa
Publicado por: Watek en 20 de Abril de 2020, 18:23:05
Muchas gracias KILLERJC, sí, eso buscaba.

He puesto algo asi:

Código: [Seleccionar]
MOVFW     dir0
XORWF     PORTA, W
BTFSS     STATUS,Z
CALL     IMP0

MOVFW     dir1
XORWF     PORTA, W
BTFSS     STATUS,Z
CALL     IMP1

En "dirx" tengo almacenados los números a comparar desde el Puerto A, los impx son funciones que devuelven el numero por el Puerto B.

Por alguna razón me sigue sin funcionar, pero creo que es un problema del circuito simulado... o de alguna otra parte del código.


Repito, gracias.
Título: Re:LCD 7seg con teclado binario, ayudaaaa
Publicado por: KILLERJC en 20 de Abril de 2020, 18:35:09
Acordate que el BTFSS salta la instruccion cuando la bandera Z esta en 1... Si queres que salte cuando este en 0, entonces es BTFSC


Ademas podes tener otro problema.
Título: Re:LCD 7seg con teclado binario, ayudaaaa
Publicado por: Watek en 20 de Abril de 2020, 19:03:54
Si, disculpa, eso ya estaba corregido al instante de publicar la anterior respuesta, copie mal del portapapeles.

El display se vuelve loco en la simulación.

Por otra parte MOVWF copia de W a File y MOVFW copia de File a W? esto es asi o me lo acabo de inventar?
Título: Re:LCD 7seg con teclado binario, ayudaaaa
Publicado por: KILLERJC en 20 de Abril de 2020, 19:35:13
En realidad solo existe la instrucción MOVF y MOVWF (lo podes ver en el datasheet)

Recordando que MOVF puede ir a F o W... Es decir:

Código: ASM
  1. MOVF registro, F

Lo mueve al mismo lugar (como para actualizar las banderas)
PERO debido a justamente lo que comentas, el compilador tambien acepta la "pseudo-instruccion" (instruccion no real que luego se reemplaza por la real) MOVFW. Por ejemplo:

Código: ASM
  1. MOVFW registro

Se transforma al compilarse en:

Código: ASM
  1. MOVF registro, W

Hay mas pseudo-instrucciones que acepta el compilador. Aunque por ahi no es recomendable basarse en ellas. Ya que solo algunos PICs lo soportan.

http://ww1.microchip.com/downloads/en/DeviceDoc/33014L.pdf (Pagina 320)
Y vas a ver que solo algunos PICs lo soportan : 12-BIT/14-BIT SPECIAL INSTRUCTION MNEMONICS
Y tambien en cuales se convierten.


Citar
El display se vuelve loco en la simulación.

Podes llegar a tener otros problemas, pero en la simulacion usualmente lo mejor es sacarle el delay para mostrarlo..
Título: Re:LCD 7seg con teclado binario, ayudaaaa
Publicado por: Watek en 21 de Abril de 2020, 07:35:59
Muchas gracias KILLERJC, muy útiles tus respuestas.

Título: Re:LCD 7seg con teclado binario, ayudaaaa
Publicado por: elreypic2 en 01 de Mayo de 2020, 21:05:08
Que tal Watek,

Espero te encuentres bien. El siguiente código es otra forma de realizar la tarea de tu circuito de una manera más eficiente y con el código más pequeño. Espero te sirva en tu proceso de aprendizaje.

Código: [Seleccionar]
LIST P=PIC16F84A
INCLUDE <P16F84A.INC>


__CONFIG _FOSC_XT & _WDTE_OFF & _PWRTE_ON & _CP_OFF

org     0x00
GOTO INICIO

BANCO0      MACRO
            BCF     STATUS,RP0
            BCF     STATUS,RP1
            ENDM

BANCO1      MACRO
            BSF     STATUS,RP0
            BCF     STATUS,RP1
            ENDM

TABLA ADDWF PCL,F
RETLW b'00111111' ;Print "0"
RETLW b'00000110' ;Print "1"
RETLW b'01011011' ;Print "2"
RETLW b'01001111' ;Print "3"
RETLW b'01100110' ;Print "4"
RETLW b'01101101' ;Print "5"
RETLW b'01111101' ;Print "6"
RETLW b'00000111' ;Print "7"
RETLW b'01111111' ;Print "8"
RETLW b'01101111' ;Print "9"
RETLW b'01110111' ;Print "A"
RETLW b'01111100' ;Print "b"
RETLW b'00111001' ;Print "C"
RETLW b'01011110' ;Print "d"
RETLW b'01111001' ;Print "E"
RETLW b'01110001' ;Print "F"
           
INICIO BANCO1
MOVLW H'00'
MOVWF TRISB
BANCO0
INI
MOVF PORTA,W
CALL TABLA
MOVWF PORTB
GOTO INI
END

  - Tienes que ingresar para ver archivos adjuntos -  

saludos,

elreypic