Comparación de números
En este post muestro el circuito, el diagrama de flujo, el código y la implementación de un programa en lenguaje ensamblador en el microcontrolador microcontrolador PIC 16F886 para realizar una comparación de números utilizando los bits Z y CARRY del registro STATUS.
EL propósito es aplicar las instrucciones de prueba de bits para poder realizar las comparaciones:
- BTFSS
- BTFSC
La implementación consta de 4 entradas en los bits menos significativos del puerto A para introducir el número de referencia y con el cual se desea trabajar. Este número estará en un rango de 0 a 15. Como resultado se dispone de 4 posibles condiciones de salida a través de los bits RB0 - RB3:
- El número es igual a 9
- El número es mayor a 12
- El número es menor a 5
- El número se encuentra entre 3 y 8
Configuración de entradas y salidas
Se utilizarán algunos pines del puerto A y del Puerto B. La siguiente tabla muestra a detalle los bits utilizados por el programa:
Bit | Función | Descripción |
---|---|---|
RA0 | Entrada | Posición menos significativa del número |
RA1 | Entrada | Siguiente posición del número |
RA2 | Entrada | Siguiente posición del número |
RA0 | Entrada | Posición más significativa del número |
RB0 | Salida | Indicador de la condición 1 |
RB1 | Salida | Indicador de la condición 2 |
RB2 | Salida | Indicador de la condición 3 |
RB3 | Salida | Indicador de la condición 4 |
Diagrama eléctrico
El diagrama del circuito respectivo es el que se muestra a continuación:
Diagrama de flujo
El diagrama de flujo de la implementación se encuentra divido en cinco partes, la primera corresponde al programa principal, mientras que las restantes hacen referencia a cada una de las subrutinas para las comparaciones.
Programa
El código en lenguage ensamblador es el siguiente:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
#include "p16f886.inc"
; CONFIG1
; __config 0xEFE5
__CONFIG _CONFIG1, _FOSC_INTRC_CLKOUT & _WDTE_OFF & _PWRTE_ON & _MCLRE_ON & _CP_OFF & _CPD_OFF & _BOREN_ON & _IESO_ON & _FCMEN_ON & _LVP_OFF
; CONFIG2
; __config 0xFFFF
__CONFIG _CONFIG2, _BOR4V_BOR40V & _WRT_OFF
; TODO PLACE VARIABLE DEFINITIONS GO HERE
porta EQU 05
trisa EQU 85
ansel EQU 188
portb EQU 06
trisb EQU 86
status EQU 03
c EQU 00
z EQU 02
rp0 EQU 05
rp1 EQU 06
ra0 EQU 00
ra1 EQU 01
ra2 EQU 02
ra3 EQU 03
rb0 EQU 00
rb1 EQU 01
rb2 EQU 02
rb3 EQU 03
numero EQU 20
;****************************************************************************
; Reset Vector
;****************************************************************************
RES_VECT CODE 0x0000 ; processor reset vector
GOTO START ; go to beginning of program
;***************************************************************************
; MAIN PROGRAM
;***************************************************************************
MAIN_PROG CODE ; let linker place main program
START
; TODO Step #5 - Insert Your Program Here
bsf status,rp0 ;move to bank 3
bsf status,rp1 ;move to bank 3
clrf ansel ;PORTA as digital I/O
bsf status,rp0 ;move to bank 1
bcf status,rp1 ;move to bank 1
MOVLW b'11111111' ;configure porta as input
MOVWF trisa
MOVLW b'00000000' ;configure portb as output
MOVWF trisb
BCF status,rp0 ;move to bank 0
BCF status,rp1 ;move to bank 0
CLRF porta
CLRF portb
MAIN
MOVF porta,w
MOVWF numero
CALL N9
CALL N12
CALL N5
CALL N3N8
GOTO MAIN
N9
MOVLW d'9'
SUBWF numero,W
BTFSS status,z
GOTO LED9OFF
BSF portb,rb0
RETURN
LED9OFF
BCF portb,rb0
RETURN
N12
MOVLW d'12'
SUBWF numero,w
BTFSC status,z
GOTO LED12OFF
BTFSS status,c
GOTO LED12OFF
BSF portb,rb1
RETURN
LED12OFF
BCF portb,rb1
RETURN
N5
MOVLW d'5'
SUBWF numero,w
BTFSC status,c
GOTO LED5OFF
BSF portb,rb2
RETURN
LED5OFF
BCF portb,rb2
RETURN
N3N8
MOVLW d'3'
SUBWF numero,w
BTFSS status,c
GOTO LED38OFF
MOVLW d'8'
SUBWF numero,w
BTFSC status,z
GOTO LED38ON
BTFSC status,c
GOTO LED38OFF
GOTO LED38ON
LED38OFF
BCF portb,rb3
RETURN
LED38ON
BSF portb,rb3
RETURN
END