TODOPIC
Microcontroladores PIC => Primeros pasos - Iniciación a los microcontroladores => Mensaje iniciado 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:
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
-
Si tu problema es este:
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
XORWF PORTA, W
BTFSS STATUS, Z
GOTO NOIGUAL
GOTO IGUAL
ó
Restando. Si es igual a 0
SUBWF PORTA, W
BTFSS STATUS, Z
GOTO NOIGUAL
GOTO IGUAL
-
Muchas gracias KILLERJC, sí, eso buscaba.
He puesto algo asi:
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.
-
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.
-
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?
-
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:
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:
Se transforma al compilarse en:
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.
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..
-
Muchas gracias KILLERJC, muy útiles tus respuestas.
-
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.
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