Está en la página 1de 34

UNIVERSIDAD SIMÓN BOLÍVAR

VICERRECTORADO ACADÉMICO
DECANATO DE ESTUDIOS TECNOLÓGICOS
COORDINACIÓN DE TECNOLOGÍA ELÉCTRICA Y ELECTRONICA
LABORATORIO DE MICROPROCESADORES

INFORME #1
Introducción MPLAB, PROTEUS y a el Programador K 150, diseño de un programa capaz
de sumar y restar el contenido de 2 números introducidos en los puertos
(Tecnología Electrónica)

Autor: Adrian Mayora


Carnet: 16-00131
C.I: 26.180.109

Profesor: Alberto Armengol

Camurí Grande, julio de 2022


ÍNDICE

Índice ...............................................................................................................................
Índice de Figuras ........................................................................................................... 2
Introducción .................................................................................................................. 3
Instrucciones ................................................................................................................. 4
Análisis del Circuito...................................................................................................... 5
Circuito Rediseñado ...................................................................................................... 7
Diseño del programa de suma ....................................................................................... 8
Configuración de puertos .......................................................................................... 8
Programa principal .................................................................................................... 9
Subrutina de comprobación ..................................................................................... 10
Subrutina BCD a 7 segmentos................................................................................. 13
Diagrama de flujo del programa de suma................................................................ 15
Diseño del programa de resta ...................................................................................... 16
Configuración de puertos ........................................................................................ 16
Programa principal .................................................................................................. 17
Subrutina de comprobación ..................................................................................... 18
Subrutina BCD a 7 segmentos................................................................................. 21
Diagrama de flujo del programa de resta ................................................................ 23
Laboratorio .................................................................................................................. 24
Programa realizado en el laboratorio (suma y resta a la vez) .................................. 26
Programa de suma utilizando solo el puerto C para obtener los datos .................... 30
Conclusion .................................................................................................................. 32
Referencias Consultadas ............................................................................................. 33
ÍNDICE DE FIGURAS

Figura 1. Montaje del circuito dado ............................................................................. 4


Figura 2. PIC16F84A ................................................................................................... 5
Figura 3. PIC16F84A ................................................................................................... 5
Figura 4. Configuración del display ............................................................................. 6
Figura 5. Montaje del circuito rediseñado.................................................................... 7
Figura 6. Montaje del circuito en el laboratorio......................................................... 24
Figura 7. Montaje del circuito SUMA y RESTA....................................................... 25
Figura 8. Montaje del circuito SUMA (con un solo puerto) ...................................... 29
INTRODUCCIÓN

El presente informe se enfocará en familiarizarnos con algunas de las herramientas


que nos ayudarán a manejar los microcontroladores. Entra las herramientas que
utilizaremos se encuentran MPLAB, IDEs, PROTEUS y programadores. Estas
herramientas son fundamentales para el desarrollo de proyectos usando
microcontroladores particularmente en este caso el PIC, esto lo haremos
desarrollando 2 programas, uno que realice una suma de 3 bits provenientes de los
puertos del pic y otro que realice una resta, el resultado de la suma y resta se
mostraran en un display 7 segmentos.

3
INSTRUCCIONES

El prelaboratorio consiste en compilar con MPLAB dos programas para simular en


un mismo circuito utilizando Proteus.

Figura 1. Montaje del circuito dado - Imagen dada por el profesor

Parte 1 – Suma

El número en el display será el resultado de la suma de los números de tres bits, si el


resultado es mayor de 910 solo se mostrará el dígito menos significativo. El orden de
lectura de los bits en ambas entradas es de abajo hacia arriba, en el caso mostrado
para la suma el valor del display debería ser 5 + 3 = 8.

Parte 2 – Diferencia

El número en el display será el resultado de la resta de los números de tres bits. Para
evitar números negativos el Primer Número siempre será mayor o igual al segundo.
En el caso mostrado 5 – 3 = 2.

En ambos casos seguiremos los siguientes pasos:

• Desarrolle el programa en assembly para la Parte 1 usando MPLAB y/o


MPLABx. Microchip también suministra un IDE (Integrated Development
Environment)
• Simular ambos circuitos tal como se muestra en la gráfica con Proteus y
verificar su funcionamiento.
• Adaptar los programas y el circuitos al PIC16F873A, simúlenlos con Proteus
y verifique su funcionamiento.

4
ANÁLISIS DEL CIRCUITO

Como vimos en la figura 1, lo primero que podemos notar es que circuito consta de
un pic16F84a, el cual como vemos en la figura de abajo, solo tiene 2 puertos A y B;

Figura 2. PIC16F84A - Imagen sacada de alldatasheet.com

En la practica no utilizaremos el pic anterior, sino el pic16F873a, mostrado abajo:

Figura 3. PIC16F84A - sacada de alldatasheet.com

Este pic, como vemos tiene 3 puertos A, B y C, esto nos da una ventaja a la hora
realizar nuestro programa, ya que necesitamos sumar 2 números de 3 bits obtenidos
desde el exterior, con el pic 16f84a necesitábamos utilizar un solo puerto para obtener
dichos números y realizar un realizar un ajuste para poder sumarlos, ya que solo
contamos con 2 puertos, con el pic16F873a no es necesario realizar este ajuste, ya
que los numero se sumarán y restaran directamente, como veremos más adelante.

5
Otra cosa interesante que podemos notar del diagrama suministrado, es la utilización
un decodificador de BCD para el display 7 segmentos.

Figura 4. Configuración del display - Imagen dada por el profesor

Este decodificador es necesario para el 16F84A ya que el puerto A es de tan solo 6


Bits, como vemos en la figura anterior, sin embargo, el 16F873A tiene la ventaja de
tener 2 puertos de 8 Bits por lo cual podemos mostrar el resultado en el display sin
necesidad de usar un decodificador, como veremos más adelante, al realizar el
programa.

6
CIRCUITO REDISEÑADO

Ya sabiendo los puntos anteriores podemos rediseñar el circuito para el


PIC16F873A, tal como se muestra en la figura de abajo:

V+
C1

22pF 5V
X1
CRYSTAL
C2 V+

22pF
U3 RN1
9 21 1 16
OSC1/CLKIN RB0/INT
10 22 2 15
0 OSC2/CLKOUT RB1
RB2
23 3 14
2 24 4 13
0 3
4
RA0/AN0
RA1/AN1
RB3/PGM
RB4
25
26
5
6
12
11
RA2/AN2/VREF-/CVREF RB5
1 5
6
RA3/AN3/VREF+ RB6/PGC
27
28
7
8
10
9
RA4/T0CKI/C1OUT RB7/PGD
7
RA5/AN4/SS/C2OUT
11 460
1
MCLR/Vpp/THV
RC0/T1OSO/T1CKI
RC1/T1OSI/CCP2
12
13
0
RC2/CCP1
RC3/SCK/SCL
14
15
0
R3 R2 RC4/SDI/SDA
V+ RC5/SDO
16
17
0
22k 1.2k RC6/TX/CK
18
RC7/RX/DT
PIC16F873A

Figura 5. Montaje del circuito rediseñado – Imagen de autoría propia hecha con el software proteus

Como vemos en la imagen anterior, se hicieron los cambios antes mencionados:

1. Se cambio el PIC16F84A por el PIC16F73A.


2. Se utilizaron 2 puertos en vez de 1.
3. No se utilizó un decodificador, sino que directamente se conecto el display a
la salida de los puertos.

Este circuito nos servirá tanto para el programa de suma como el de resta.

7
DISEÑO DEL PROGRAMA DE SUMA

Configuración de puertos

En el cuadro de abajo vemos la primera parte del programa, donde simplemente se


configuran el puerto A y C como entradas y el puerto B como salida, podemos notar
que el puerto A necesita una configuración extra ya que el PIC16F873A tiene la
opción de configurar este puerto como entrada/salida digital o analógica, en este caso
lo configuramos como entrada digital (se muestra en color amarillo), otra cosa a tener
en cuenta es que se añadió un conjunto de instrucciones al finalizar el proceso de
configuración de puertos ( se muestra en color verde), para mostrar en el display el
inicio o reseteo del programa.

;Configuración de puertos

reset org 0
bcf STATUS,RP1 ;Coloco en 0 el bit RP1 (seleccion
;banco 1)
bsf STATUS,RP0 ;Coloco en 1 el bit RP0 (seleccion
;banco 1)
CLRF PORTB ;Borro el puerto B
;(si borro el puerto B significa que
;lo coloco como salida)
movlw 0FFh ;configuro el puerco c como entrada
movwf PORTC
movlw 06h ;configuro el puerco a como entrada
;digital
movwf ADCON1
movlw 06h ;configuro el puerco a como entrada
movwf PORTA
bcf STATUS,RP0 ;Coloco en 0 el bit RP0 (selección
;banco 0)
movlw 00h ;se carga w con 00h
movwf PORTB ;se descarga w en el puerto b (para
;indicar encendido o reseteo)
call Retardo_20s ;creo un retardo par que se vea por
;mas tiempo el encendido de los leds

8
Programa principal

Este consiste en un programa en bucle, donde constantemente se estará leyendo los


datos del puerto A y C, haciendo la suma de estos y escribiéndolos en el puerto B.

;===========================================================
;Programa principal

INICIO movf PORTA,W ;leo el puerto A


movwf N1 ;guardo los datos que esten en
;el puerto A
movf PORTC,W ;leo el puerto C
movwf N2 ;guardo los datos que esten en
;el puerto C
goto comp ;Compruebo si el reultado es un
;numero entre 0 y 14
LISTO movlw B'10111111' ;si no es un numero entre 0 y 14
movwf PORTB ;muestro un guion indicando un
;desbordamiento
goto INICIO ;vuelvo a iniciar el prgrama

Como vemos en color amarillo se muestra un conjunto de instrucciones que


mostraran un guion en el display en caso de que el resultado de la suma sea mayor a
14, lo cual es inviable para una suma de 3 bits, ya que el máximo número será
111b+111b=1111b=14d , sin embargo siempre es bueno tomar en cuenta todos los
factores que puedan ocurrir, como por ejemplo que por error en la práctica se
conecten 4 entradas en vez de 3.

9
Subrutina de comprobación

Esta subrutina consiste en comprobar que numero del 0 al 14 es el del resultado, en


caso de que sea uno de estos números nos enviara a la subrutina a BCD a 7
segmentos y de no ser ninguno de estos números volveremos al programa principal.

;===========================================================
;Subrutina para comprobar que numero del 0 al 14 es el del
resultado

comp movf N1,0


Addwf N2,0
sublw b'00000000'
btfsc STATUS,Z ;Compruebo si el resultado es cero
goto CERO ;si es asi convierto a su equivalente
;7 segmentos
movf N1,0 ;sino vuelvo hacer la suma
Addwf N2,0

sublw b'00000001'
btfsc STATUS,Z ;Compruebo si el resultado es uno
goto UNO ;si es asi convierto a su
;equivalente 7 segmentos
movf N1,0 ;sino vuelvo hacer la suma
Addwf N2,0

sublw b'00000010'
btfsc STATUS,Z ;Compruebo si el resultado es dos
goto DOS ;si es asi combierto a su
;equivalente 7 segmentos
movf N1,0 ;sino vuelvo hacer la suma
Addwf N2,0

sublw b'00000011'
btfsc STATUS,Z ;Compruebo si el resultado es tres
goto TRES ;si es asi convierto a su
;equivalente 7 segmentos
movf N1,0 ;sino vuelvo hacer la suma
Addwf N2,0

sublw b'00000100'
btfsc STATUS,Z ;Compruebo si el resultado es cuatro
goto CUATRO ;si es asi convierto a su
;equivalente 7 segmentos
movf N1,0 ;sino vuelvo hacer la suma
Addwf N2,0

10
sublw b'00000101'
btfsc STATUS,Z ;Compruebo si el resultado es cinco
goto CINCO ;si es asi convierto a su equivalente
;7 segmentos
movf N1,0 ;sino vuelvo hacer la suma
Addwf N2,0

sublw b'00000110'
btfsc STATUS,Z ;Compruebo si el resultado es seis
goto SEIS ;si es asi convierto a su equivalente
;7 segmentos
movf N1,0 ;sino vuelvo hacer la suma
Addwf N2,0

sublw b'00000111'
btfsc STATUS,Z ;Compruebo si el resultado es siete
goto SIETE ;si es asi convierto a su equivalente
;7 segmentos
movf N1,0 ;sino vuelvo hacer la suma
Addwf N2,0

sublw b'00001000'
btfsc STATUS,Z ;Compruebo si el resultado es ocho
goto OCHO ;si es asi convierto a su
;equivalente 7 segmentos
movf N1,0 ;sino vuelvo hacer la suma
Addwf N2,0

sublw b'00001001'
btfsc STATUS,Z ;Compruebo si el resultado es nueve
goto NUEVE ;si es asi convierto a su
;equivalente 7 segmentos
movf N1,0 ;sino vuelvo hacer la suma
Addwf N2,0

sublw b'00001010'
btfsc STATUS,Z ;Compruebo si el resultado es diez
goto DIEZ ;si es asi combierto a su
;equivalente 7 segmentos
movf N1,0 ;vuelvo hacer la suma
Addwf N2,0

sublw b'00001011'
btfsc STATUS,Z ;Compruebo si el resultado es once
goto ONCE ;si es asi convierto a su equivalente
;7 segmentos
movf N1,0 ;sino vuelvo hacer la suma
Addwf N2,0

sublw b'00001100'
btfsc STATUS,Z ;Compruebo si el resultado es doce
goto DOCE ;si es asi convierto a su equivalente
;7 segmentos
movf N1,0 ;sino vuelvo hacer la suma
Addwf N2,0

11
sublw b'00001101'
btfsc STATUS,Z ;Compruebo si el resultado es trece
goto TRECE ;si es asi convierto a su
;equivalente 7 segmentos
movf N1,0 ;sino vuelvo hacer la suma
Addwf N2,0

sublw b'00001110'
btfsc STATUS,Z ;Compruebo si el resultado es catorce
goto CATORCE ;si es asi convierto a su equivalente
;7 segmentos
movf N1,0 ;sino vuelvo hacer la suma
Addwf N2,0
goto LISTO ;sino es nunguno de los anteiores ir
;al programa principal

12
Subrutina BCD a 7 segmentos

Esta subrutina es la encargada de convertir el resultado de la suma en su equivalente


7 segmentos y mostrarlo en el display, una vez hecho esto volverá al inicio del
programa para completar el bucle, y realizar todo el proceso nuevamente.

;===========================================================
;Subrutina BCD a 7 segmentos

CERO movlw B'11000000'


movwf PORTB
goto INICIO

UNO movlw B'11111001'


movwf PORTB
goto INICIO

DOS movlw B'10100100'


movwf PORTB
goto INICIO

TRES movlw B'10110000'


movwf PORTB
goto INICIO

CUATRO movlw B'10011001'


movwf PORTB
goto INICIO

CINCO movlw B'10010010'


movwf PORTB
goto INICIO

SEIS movlw B'10000010'


movwf PORTB
goto INICIO

SIETE movlw B'11111000'


movwf PORTB
goto INICIO

OCHO movlw B'00000000'


movwf PORTB
goto INICIO

NUEVE movlw B'00010000'


movwf PORTB
goto INICIO

13
DIEZ movlw B'11000000'
movwf PORTB
goto INICIO

ONCE movlw B'11111001'


movwf PORTB
goto INICIO

DOCE movlw B'10100100'


movwf PORTB
goto INICIO

TRECE movlw B'10110000'


movwf PORTB
goto INICIO

CATORCE movlw B'10011001'


movwf PORTB
goto INICIO

include <Retardos.inc>
END

NOTA: podemos notar la inclusión de la librería Retardos al final del programa, este
tipo de librerías se pueden descargar por internet, cuyo objetivo es simplificar el
programa añadiendo subrutinas de uso regular a las cuales podemos acceder desde el
programa principal.

Video del programa SUMA simulado en proteus:

https://drive.google.com/file/d/1yPhRqiKrj-h-
SgsYDRhcQMUK81_hbHGL/view?usp=sharing

14
Diagrama de flujo del programa de suma

15
DISEÑO DEL PROGRAMA DE RESTA

Configuración de puertos

La configuración de puertos del programa de resta es exactamente la misma que la


del programa de suma, en el cuadro de abajo vemos la primera parte del pro grama
donde simplemente se configuran el puerto A y C como entradas y el puerto B como
salida, podemos notar que el puerto A necesita una configuración extra ya que el
PIC16F873A tiene la opción de configurar este puerto como entrada/salida digital o
analógica, en este caso lo configuramos como entrada digital (se muestra en color
amarillo), otra cosa a tener en cuenta es que se añadió un conjunto de instrucciones al
finalizar el proceso de configuración de puertos (se muestra en color verde), para
mostrar en el display el inicio o reseteo del programa.

;Configuración de puertos

reset org 0
bcf STATUS,RP1 ;Coloco en 0 el bit RP1 (seleccion
;banco 1)
bsf STATUS,RP0 ;Coloco en 1 el bit RP0 (seleccion
;banco 1)
CLRF PORTB ;Borro el puerto B
;(si borro el puerto B significa que
;lo coloco como salida)
movlw 0FFh ;configuro el puerco c como entrada
movwf PORTC
movlw 06h ;configuro el puerco a como entrada
;digital
movwf ADCON1
movlw 006h ;configuro el puerco a como entrada
movwf PORTA
bcf STATUS,RP0 ;Coloco en 0 el bit RP0 (selección
;banco 0)
movlw 00h ;se carga w con 00h
movwf PORTB ;se descarga w en el puerto b (para
;indicar encendido o reseteo)
call Retardo_20s ;creo un retardo par que se vea por
;mas tiempo el encendido de los leds

16
Programa principal

El programa principal consiste en un programa muy sencillo en bucle, donde


constantemente se estará leyendo los datos del puerto A y C, haciendo la resta de
estos y escribiéndolos en el puerto B contantemente:

;===========================================================
;Programa principal

INICIO movf PORTA,W ;leo el puerto A


movwf N1 ;guardo los datos que esten en
;el puerto A
movf PORTC,W ;leo el puerto c
movwf N2 ;guardo el puerto C
movf N1,0 ;recupero los datos del puerto A
subwf N2,0 ;resto los datos guardados del
;puerto A con los del C
btfss STATUS,C ;salta un espacio si resultado
;es NO es negativo
goto NEGATIVO ;en caso de ser negativo muestro
;en el display un signo menos

Como vemos en color amarillo se muestra un conjunto de instrucciones que nos


enviara a una subrutina que colocara un guion en el display en caso de que el
resultado de la resta sea un numero negativo, en caso contrario comprobara que
numero es el dado al realizar la resta, se convertirá en u equivalente 7 segmentos y se
mostrara en el display, tal como hicimos con el programa anterior.

17
Subrutina de comprobación

Esta subrutina consiste en comprobar que numero es el del resultado, en caso de que
sea uno de estos números nos enviara a la subrutina a BCD a 7 segmentos y de no ser
ninguno de estos números volveremos al programa principal.

;===========================================================
;Subrutina para comprobar que numero del 0 al 14 es el del resultado

COMP sublw b'00000000'


btfsc STATUS,Z ;salta un espacio si el resultado no es 0
goto CERO ;si es 0 convierto a su equivalente 7
;segmentos y lo muestro en el display
movf N1,0 ;vuelvo a hacer la resta de los datos
;guardados
subwf N2,0

sublw b'00000001'
btfsc STATUS,Z ;salta un espacio si el registro NO es 1
goto UNO ;si es 1 convierto a su equivalente 7
;segmentos y lo muestro en el display
movf N1,0 ;vuelvo a hacer la resta de los datos
;guardados
subwf N2,0

sublw b'00000010'
btfsc STATUS,Z ;salta un espacio si el registro NO es 2
goto DOS ;si es 2 convierto a su equivalente 7
;segmentos y lo muestro en el display
movf N1,0 ;vuelvo a hacer la resta de los datos
;guardados
subwf N2,0

sublw b'00000011'
btfsc STATUS,Z ;salta un espacio si el registro NO es 3
goto TRES ;si es 3 convierto a su equivalente 7
;segmentos y lo muestro en el display
movf N1,0 ;vuelvo a hacer la resta de los datos
;guardados
subwf N2,0

sublw b'00000100'
btfsc STATUS,Z ;salta un espacio si el registro NO es 4
goto CUATRO ;si es 4 convierto a su equivalente 7
;segmentos y lo muestro en el display
movf N1,0 ;vuelvo a hacer la resta de los datos
;guardados

18
sublw b'00000101'
btfsc STATUS,Z ;salta un espacio si el registro NO es 5
goto CINCO ;si es 5 convierto a su equivalente 7
;segmentos y lo muestro en el display
movf N1,0 ;vuelvo a hacer la resta de los datos
;guardados
subwf N2,0

sublw b'00000110'
btfsc STATUS,Z ;salta un espacio si el registro NO es 6
goto SEIS ;si es 6 convierto a su equivalente 7
;segmentos y lo muesto en el display
movf N1,0 ;vuelvo a hacer la resta de los datos
;guardados
subwf N2,0

sublw b'00000111'
btfsc STATUS,Z ;salta un espacio si el rehistro NO es 7
goto SIETE ;si es 7 convierto a su equivalente 7
;segmentos y lo muestro en el display
movf N1,0 ;vuelvo a hacer la resta de los datos
;guardados
subwf N2,0

sublw b'00001000'
btfsc STATUS,Z ;salta un espacio si el registro NO es 8
goto OCHO ;si es 8 convierto a su equivalente 7
;segmentos y lo muestro en el display
movf N1,0 ;vuelvo a hacer la resta de los datos
;guardados
subwf N2,0

sublw b'00001001'
btfsc STATUS,Z ;salta un espacio si el registro NO es 9
goto NUEVE ;si es 9 convierto a su equivalente 7
;segmentos y lo muestro en el display
movf N1,0 ;vuelvo a hacer la resta de los datos
;guardados
subwf N2,0

sublw b'00001010'
btfsc STATUS,Z ;salta un espacio si el registro NO es 10
goto DIEZ ;si es 10 convierto a su equivalente 7
;segmentos y lo muestro en el display
movf N1,0 ;vuelvo a hacer la resta de los datos
;guardados
Addwf N2,0

sublw b'00001011'
btfsc STATUS,Z ;salta un espacio si el registro NO es 11
goto ONCE ;si es 11 convierto a su equivalente 7
;segmentos y lo muestro en el display
movf N1,0 ;vuelvo a hacer la resta de los datos
;guardados
subwf N2,0

19
sublw b'00001100'
btfsc STATUS,Z ;salta un espacio si el registro NO es 12
goto DOCE ;si es 12 convierto a su equivalente 7
;segmentos y lo muestro en el display
movf N1,0 ;velvo a hacer la resta de los datos :
guardados
subwf N2,0

sublw b'00001101'
btfsc STATUS,Z ;salta un espacio si el registro NO es 13
goto TRECE ;si es 13 convierto a su equivalente 7
:segmentos y lo muestro en el display
movf N1,0 ;vuelvo a hacer la resta de los datos
;guardados
subwf N2,0

sublw b'00001110'
btfsc STATUS,Z ;salta un espacio si el registro NO es 14
goto CATORCE ;si es 14 convierto a su equivalente 7
;segmentos y lo muestro en el display
movf N1,0 ;vuelvo a hacer la resta de los datos
;guardados
subwf N2,0
movwf PORTB ;muestro el resultado del display
goto INICIO ;vuelvo al inicio

20
Subrutina BCD a 7 segmentos

Esta subrutina es exactamente la misma que la del programa de suma, se encarga de


convertir el resultado de la resta en su equivalente 7 segmentos y mostrarlo en el
display, una vez hecho esto volverá al inicio del programa para completar el bucle, y
realizar todo el proceso nuevamente.

;===========================================================
;Subrutina BCD a 7 segmentos

CERO movlw B'11000000'


movwf PORTB
goto INICIO

UNO movlw B'11111001'


movwf PORTB
goto INICIO

DOS movlw B'10100100'


movwf PORTB
goto INICIO

TRES movlw B'10110000'


movwf PORTB
goto INICIO

CUATRO movlw B'10011001'


movwf PORTB
goto INICIO

CINCO movlw B'10010010'


movwf PORTB
goto INICIO

SEIS movlw B'10000010'


movwf PORTB
goto INICIO

SIETE movlw B'11111000'


movwf PORTB
goto INICIO

OCHO movlw B'00000000'


movwf PORTB
goto INICIO

NUEVE movlw B'00010000'


movwf PORTB
goto INICIO

21
DIEZ movlw B'11000000'
movwf PORTB
goto INICIO

ONCE movlw B'11111001'


movwf PORTB
goto INICIO

DOCE movlw B'10100100'


movwf PORTB
goto INICIO

TRECE movlw B'10110000'


movwf PORTB
goto INICIO

CATORCE movlw B'10011001'


movwf PORTB
goto INICIO

include <Retardos.inc>
END

Video del programa RESTA simulado en proteus:

https://drive.google.com/file/d/1yQsWxaV7RsjWBgKZwuHG_irEfTjLOd_l/view?us
p=sharing

22
Diagrama de flujo del programa de resta

23
LABORATORIO

El laboratorio simplemente consistió en armar el circuito simulado y mostrar su


funcionamiento al profesor, el circuito armado se muestra en la figura de abajo:

Figura 6. Montaje del circuito en el laboratorio – Imagen de autoría propia

El circuito anterior fue mostrado al profesor y funciono de la manera correcta.

24
Posteriormente el profesor mando a hacer que ambos programas funcionaran en
conjunto. El resultado fue el esquema que se muestra en la figura de abajo:

V+
C1

22pF 5V
X1
CRYSTAL
C2 V+

U3 RN1
22pF
9 21 1 16
OSC1/CLKIN RB0/INT
10 22 2 15
1 2
OSC2/CLKOUT RB1
RB2
23
24
3
4
14
13
0 3
4
RA0/AN0
RA1/AN1
RB3/PGM
RB4
25
26
5
6
12
11
RA2/AN2/VREF-/CVREF RB5
0 5
6
RA3/AN3/VREF+ RB6/PGC
27
28
7
8
10
9
RA4/T0CKI/C1OUT RB7/PGD
7
RA5/AN4/SS/C2OUT
11 460
1
MCLR/Vpp/THV
RC0/T1OSO/T1CKI
RC1/T1OSI/CCP2
12
13
1
RC2/CCP1
RC3/SCK/SCL
14
15
1
R3 R2 RC4/SDI/SDA
V+ RC5/SDO
16
17
0
22k 1.2k RC6/TX/CK
18
RC7/RX/DT
PIC16F873A 1

Figura 7. Montaje del circuito SUMA y RESTA – Imagen de autoría propia hecha con el software proteus

Como vemos en la figura anterior se utilizó un pin extra, para que el programa
funcionará como suma si el bit de este pin estaba en 0, y como resta si el bit de este
pin estaba en 1.

El diseño, simulación y muestra del funcionamiento del circuito real se hizo en


presencia del profesor y este funcionó de la forma correcta, el programa realizado se
muestra en las paginas siguientes:

25
Programa realizado en el laboratorio (suma y resta a la vez)

;===========================================================
;Configuracion de puertos

reset org 0

bcf STATUS,RP1 ;
bsf STATUS,RP0 ;Coloco en 1 el bit RP0 (seleccion banco 1)

CLRF PORTB ;Borro el pueto B


;(si borro el puerto B significa que lo coloco como salida)

movlw 0FFh ;configuro el puerto c como entrada


movwf PORTC ;

movlw 07h ;configuro el puerto a como entrada digital


movwf ADCON1 ;

movlw 07h ;configuro el puerto a como entrada


movwf TRISA ;

bcf STATUS,RP0 ;Coloco en 0 el bit RP0 (seleccion banco 0)


movlw 00h ;se carga w con 00h
movwf PORTB ;se descarga w en el puerto b (para indicar encedido o reseteo)
call Retardo_20s ;creo un retardo par que se vea por mas tiempo el encedido de los leds

;===========================================================
;Programa SUMA o RESTA?

INICIO
BTFSS PORTC,7
GOTO SUMA
GOTO RESTA

;===========================================================
;Programa de suma

SUMA
movf PORTA,W ;leo el puerto A
ANDLW 07h
movwf N1 ;guardo los datos que esten en el puerto A
movf PORTC,W ;leo el puerto C
ANDLW 07h
movwf N2 ;guardo los datos que esten en el puerto C

goto comp1 ;Compruebo si el reultado es un numero entre 0 y 14


LISTO movlw B'10111111' ;si no es un numero entre 0 y 14
movwf PORTB ;muestro un guion indicando un desbordamiento
goto INICIO ;vuelvo a iniciar el prgrama

;===========================================================
;Subrutina para comprobar cual es el número

comp1 movf N1,0


Addwf N2,0
sublw b'00000000'
btfsc STATUS,Z ;Compuebo si el resultado es cero
goto CERO ;si es asi combierto a su equivalente 7 segmentos
movf N1,0 ;sino vuelvo hacer la suma
Addwf N2,0

sublw b'00000001'
btfsc STATUS,Z ;Compuebo si el resultado es uno
goto UNO ;si es asi combierto a su equivalente 7 segmentos
movf N1,0 ;sino vuelvo hacer la suma
Addwf N2,0

sublw b'00000010'
btfsc STATUS,Z ;Compuebo si el resultado es dos
goto DOS ;si es asi combierto a su equivalente 7 segmentos
movf N1,0 ;sino vuelvo hacer la suma
Addwf N2,0

sublw b'00000011'
btfsc STATUS,Z ;Compuebo si el resultado es tres
goto TRES ;si es asi combierto a su equivalente 7 segmentos
movf N1,0 ;sino vuelvo hacer la suma
Addwf N2,0

sublw b'00000100'
btfsc STATUS,Z ;Compuebo si el resultado es cuatro
goto CUATRO ;si es asi combierto a su equivalente 7 segmentos
movf N1,0 ;sino vuelvo hacer la suma
Addwf N2,0

sublw b'00000101'
btfsc STATUS,Z ;Compuebo si el resultado es cinco
goto CINCO ;si es asi combierto a su equivalente 7 segmentos
movf N1,0 ;sino vuelvo hacer la suma
Addwf N2,0

sublw b'00000110'
btfsc STATUS,Z ;Compuebo si el resultado es seis
goto SEIS ;si es asi combierto a su equivalente 7 segmentos
movf N1,0 ;sino vuelvo hacer la suma
Addwf N2,0

sublw b'00000111'
btfsc STATUS,Z ;Compuebo si el resultado es siete
goto SIETE ;si es asi combierto a su equivalente 7 segmentos
movf N1,0 ;sino vuelvo hacer la suma
Addwf N2,0

26
sublw b'00001000'
btfsc STATUS,Z ;Compuebo si el resultado es ocho
goto OCHO ;si es asi combierto a su equivalente 7 segmentos
movf N1,0 ;sino vuelvo hacer la suma
Addwf N2,0

sublw b'00001001'
btfsc STATUS,Z ;Compuebo si el resultado es nueve
goto NUEVE ;si es asi combierto a su equivalente 7 segmentos
movf N1,0 ;sino vuelvo hacer la suma
Addwf N2,0

sublw b'00001010'
btfsc STATUS,Z ;Compuebo si el resultado es diez
goto DIEZ ;si es asi combierto a su equivalente 7 segmentos
movf N1,0 ;vuelvo hacer la suma
Addwf N2,0

sublw b'00001011'
btfsc STATUS,Z ;Compuebo si el resultado es once
goto ONCE ;si es asi combierto a su equivalente 7 segmentos
movf N1,0 ;sino vuelvo hacer la suma
Addwf N2,0

sublw b'00001100'
btfsc STATUS,Z ;Compuebo si el resultado es doce
goto DOCE ;si es asi combierto a su equivalente 7 segmentos
movf N1,0 ;sino vuelvo hacer la suma
Addwf N2,0

sublw b'00001101'
btfsc STATUS,Z ;Compuebo si el resultado es trece
goto TRECE ;si es asi combierto a su equivalente 7 segmentos
movf N1,0 ;sino vuelvo hacer la suma
Addwf N2,0

sublw b'00001110'
btfsc STATUS,Z ;Compuebo si el resultado es catorce
goto CATORCE ;si es asi combierto a su equivalente 7 segmentos
movf N1,0 ;sino vuelvo hacer la suma
Addwf N2,0

goto LISTO ;sino es nunguno de los anteiores ir al programa principal

;===========================================================
;Programa de resta

RESTA movf PORTA,W ;leo el puerto A


ANDLW 07h
movwf N1 ;guardo los datos que esten en el puerto A
movf PORTC,W ;leo el puerto c
ANDLW 07h
movwf N2 ;guardo el puerto C
movf N1,0 ;recupero los datos del puerto A
subwf N2,0 ;resto los datos guardados del puerto A con los del C
btfss STATUS,C ;salta un espacio si resultado es NO es negativo
goto NEGATIVO ;en caso de ser negativo muestro en el display un signo menos

;===========================================================
;Subrutina para comprobar cual es el número

COMP sublw b'00000000'


btfsc STATUS,Z ;salta un espacio si el resultado no es 0
goto CERO ;si es 0 convierto a su equivalente 7 segmentos y lo muesto en el display
movf N1,0 ;velvo a hacer la resta de los datos guardados
subwf N2,0

sublw b'00000001'
btfsc STATUS,Z ;salta un espacio si el rehistro NO es 1
goto UNO ;si es 1 convierto a su equivalente 7 segmentos y lo muesto en el display
movf N1,0 ;velvo a hacer la resta de los datos guardados
subwf N2,0

sublw b'00000010'
btfsc STATUS,Z ;salta un espacio si el rehistro NO es 2
goto DOS ;si es 2 convierto a su equivalente 7 segmentos y lo muesto en el display
movf N1,0 ;velvo a hacer la resta de los datos guardados
subwf N2,0

sublw b'00000011'
btfsc STATUS,Z ;salta un espacio si el rehistro NO es 3
goto TRES ;si es 3 convierto a su equivalente 7 segmentos y lo muesto en el display
movf N1,0 ;velvo a hacer la resta de los datos guardados
subwf N2,0

sublw b'00000100'
btfsc STATUS,Z ;salta un espacio si el rehistro NO es 4
goto CUATRO ;si es 4 convierto a su equivalente 7 segmentos y lo muesto en el display
movf N1,0 ;velvo a hacer la resta de los datos guardados
subwf N2,0

sublw b'00000101'
btfsc STATUS,Z ;salta un espacio si el rehistro NO es 5
goto CINCO ;si es 5 convierto a su equivalente 7 segmentos y lo muesto en el display
movf N1,0 ;velvo a hacer la resta de los datos guardados
subwf N2,0

sublw b'00000110'
btfsc STATUS,Z ;salta un espacio si el rehistro NO es 6
goto SEIS ;si es 6 convierto a su equivalente 7 segmentos y lo muesto en el display
movf N1,0 ;velvo a hacer la resta de los datos guardados
subwf N2,0

sublw b'00000111'
btfsc STATUS,Z ;salta un espacio si el rehistro NO es 7
goto SIETE ;si es 7 convierto a su equivalente 7 segmentos y lo muesto en el display
movf N1,0 ;velvo a hacer la resta de los datos guardados
subwf N2,0

27
sublw b'00001000'
btfsc STATUS,Z ;salta un espacio si el rehistro NO es 8
goto OCHO ;si es 8 convierto a su equivalente 7 segmentos y lo muesto en el display
movf N1,0 ;velvo a hacer la resta de los datos guardados
subwf N2,0

sublw b'00001001'
btfsc STATUS,Z ;salta un espacio si el rehistro NO es 9
goto NUEVE ;si es 9 convierto a su equivalente 7 segmentos y lo muesto en el display
movf N1,0 ;velvo a hacer la resta de los datos guardados
subwf N2,0

sublw b'00001010'
btfsc STATUS,Z ;salta un espacio si el rehistro NO es 10
goto DIEZ ;si es 10 convierto a su equivalente 7 segmentos y lo muesto en el display
movf N1,0 ;velvo a hacer la resta de los datos guardados
Addwf N2,0

sublw b'00001011'
btfsc STATUS,Z ;salta un espacio si el rehistro NO es 11
goto ONCE ;si es 11 convierto a su equivalente 7 segmentos y lo muesto en el display
movf N1,0 ;velvo a hacer la resta de los datos guardados
subwf N2,0

sublw b'00001100'
btfsc STATUS,Z ;salta un espacio si el rehistro NO es 12
goto DOCE ;si es 12 convierto a su equivalente 7 segmentos y lo muesto en el display
movf N1,0 ;velvo a hacer la resta de los datos guardados
subwf N2,0

sublw b'00001101'
btfsc STATUS,Z ;salta un espacio si el rehistro NO es 13
goto TRECE ;si es 13 convierto a su equivalente 7 segmentos y lo muesto en el display
movf N1,0 ;velvo a hacer la resta de los datos guardados
subwf N2,0

sublw b'00001110'
btfsc STATUS,Z ;salta un espacio si el rehistro NO es 14
goto CATORCE ;si es 14 convierto a su equivalente 7 segmentos y lo muesto en el display
movf N1,0 ;velvo a hacer la resta de los datos guardados
subwf N2,0
movwf PORTB ;muestro el resultado del display
goto INICIO ;vuelvo al inicio

;===========================================================
;Subrutina BCD a 7 segmentos

NEGATIVO movlw B'10111111'


movwf PORTB
goto INICIO

CERO movlw B'11000000'


movwf PORTB
goto INICIO

UNO movlw B'11111001'


movwf PORTB
goto INICIO

DOS movlw B'10100100'


movwf PORTB
goto INICIO

TRES movlw B'10110000'


movwf PORTB
goto INICIO

CUATRO movlw B'10011001'


movwf PORTB
goto INICIO

CINCO movlw B'10010010'


movwf PORTB
goto INICIO

SEIS movlw B'10000010'


movwf PORTB
goto INICIO

SIETE movlw B'11111000'


movwf PORTB
goto INICIO

OCHO movlw B'00000000'


movwf PORTB
goto INICIO

NUEVE movlw B'00010000'


movwf PORTB
goto INICIO

DIEZ movlw B'11000000'


movwf PORTB
goto INICIO

ONCE movlw B'11111001'


movwf PORTB
goto INICIO

DOCE movlw B'10100100'


movwf PORTB
goto INICIO

TRECE movlw B'10110000'


movwf PORTB
goto INICIO

CATORCE movlw B'10011001'


movwf PORTB
goto INICIO

include <Retardos.inc>
END

28
Por otra parte, durante la práctica el profesor mencionó que el objetivo era realizar la
suma y la resta con un solo puerto utilizando solo el puerto C, tal como se muestra en
el esquema de abajo:

V+
C1

22pF 5V
X1
CRYSTAL
C2 V+

22pF
U3 RN1
9 21 1 16
OSC1/CLKIN RB0/INT
10 22 2 15
OSC2/CLKOUT RB1
23 3 14
RB2
2 24 4 13
RA0/AN0 RB3/PGM
3 25 5 12
RA1/AN1 RB4
4 26 6 11
RA2/AN2/VREF-/CVREF RB5
5 27 7 10
RA3/AN3/VREF+ RB6/PGC
6 28 8 9
RA4/T0CKI/C1OUT RB7/PGD
7
RA5/AN4/SS/C2OUT
11 460
1
MCLR/Vpp/THV
RC0/T1OSO/T1CKI
RC1/T1OSI/CCP2
12
13
1
RC2/CCP1
RC3/SCK/SCL
14
15
0
R3 R2 RC4/SDI/SDA
V+ RC5/SDO
16
17
1
22k 1.2k RC6/TX/CK
18
RC7/RX/DT
PIC16F873A 0
1
1

Figura 8. Montaje del circuito SUMA (con un solo puerto) – Imagen de autoría propia hecha con el software proteus

No se hizo de esta forma desde el principio para aprovechar que teníamos a la mano
3 puertos con 16F873a y de esta forma simplificar el programa, sin embargo se
mostrará el programa suma adaptado a este caso para saber qué hacer en este caso, el
programa es prácticamente el mismo con la diferencia que los 2 datos los tomaremos
del puerto C y estos necesitan un procedimiento anterior a la suma (el cual estará
resaltado en color amarillo en el programa a continuación), para el primer dato, antes
de hacer la suma solo eliminamos los 4 bits más significativos del puerto C con una
and, para el segundo dato eliminaremos los 4 bits menos significativos y además
rotaremos 4 bits todo el registro, el resto del programa es exactamente el mismo.

29
Programa de suma utilizando solo el puerto C para obtener los datos

;===========================================================
;Programa principal

INICIO movf PORTC,W ;leo el puerto C


andlw 07h ;borro los bits mas significativos
movwf N1 ;guardo el primer numero
movf PORTC,W ;leo el puerto C
andlw 0E0h ;conservo solo los 3 bits menos significatos
movwf N2 ;roto los 3 bits mas significativos
movf N2,0
RLF N2,0
movwf N2
movf N2,0
RLF N2,0
movwf N2
movf N2,0
RLF N2,0
movwf N2
movf N2,0
RLF N2,0
andlw 07h ;elimino el bit de carry
movwf N2
goto comp ;Compruebo si el reultado es un numero entre 0 y 14

LISTO movlw B'10111111' ;si no es un numero entre 0 y 14


movwf PORTB ;muestro un guion indicando un desbordamiento
goto INICIO ;vuelvo a iniciar el prgrama

;===========================================================
;Subrutina para comprobar cual es el número

comp movf N1,0


Addwf N2,0
sublw b'00000000'
btfsc STATUS,Z ;Compuebo si el resultado es cero
goto CERO ;si es asi combierto a su equivalente 7 segmentos
movf N1,0 ;sino vuelvo hacer la suma
Addwf N2,0

sublw b'00000001'
btfsc STATUS,Z ;Compuebo si el resultado es uno
goto UNO ;si es asi combierto a su equivalente 7 segmentos
movf N1,0 ;sino vuelvo hacer la suma
Addwf N2,0

sublw b'00000010'
btfsc STATUS,Z ;Compuebo si el resultado es dos
goto DOS ;si es asi combierto a su equivalente 7 segmentos
movf N1,0 ;sino vuelvo hacer la suma
Addwf N2,0

sublw b'00000011'
btfsc STATUS,Z ;Compuebo si el resultado es tres
goto TRES ;si es asi combierto a su equivalente 7 segmentos
movf N1,0 ;sino vuelvo hacer la suma
Addwf N2,0

sublw b'00000100'
btfsc STATUS,Z ;Compuebo si el resultado es cuatro
goto CUATRO ;si es asi combierto a su equivalente 7 segmentos
movf N1,0 ;sino vuelvo hacer la suma
Addwf N2,0

sublw b'00000101'
btfsc STATUS,Z ;Compuebo si el resultado es cinco
goto CINCO ;si es asi combierto a su equivalente 7 segmentos
movf N1,0 ;sino vuelvo hacer la suma
Addwf N2,0

sublw b'00000110'
btfsc STATUS,Z ;Compuebo si el resultado es seis
goto SEIS ;si es asi combierto a su equivalente 7 segmentos
movf N1,0 ;sino vuelvo hacer la suma
Addwf N2,0

sublw b'00000111'
btfsc STATUS,Z ;Compuebo si el resultado es siete
goto SIETE ;si es asi combierto a su equivalente 7 segmentos
movf N1,0 ;sino vuelvo hacer la suma
Addwf N2,0

sublw b'00001000'
btfsc STATUS,Z ;Compuebo si el resultado es ocho
goto OCHO ;si es asi combierto a su equivalente 7 segmentos
movf N1,0 ;sino vuelvo hacer la suma
Addwf N2,0

sublw b'00001001'
btfsc STATUS,Z ;Compuebo si el resultado es nueve
goto NUEVE ;si es asi combierto a su equivalente 7 segmentos
movf N1,0 ;sino vuelvo hacer la suma
Addwf N2,0

sublw b'00001010'
btfsc STATUS,Z ;Compuebo si el resultado es diez
goto DIEZ ;si es asi combierto a su equivalente 7 segmentos
movf N1,0 ;vuelvo hacer la suma
Addwf N2,0

30
sublw b'00001011'
btfsc STATUS,Z ;Compuebo si el resultado es once
goto ONCE ;si es asi combierto a su equivalente 7 segmentos
movf N1,0 ;sino vuelvo hacer la suma
Addwf N2,0

sublw b'00001100'
btfsc STATUS,Z ;Compuebo si el resultado es doce
goto DOCE ;si es asi combierto a su equivalente 7 segmentos
movf N1,0 ;sino vuelvo hacer la suma
Addwf N2,0

sublw b'00001101'
btfsc STATUS,Z ;Compuebo si el resultado es trece
goto TRECE ;si es asi combierto a su equivalente 7 segmentos
movf N1,0 ;sino vuelvo hacer la suma
Addwf N2,0

sublw b'00001110'
btfsc STATUS,Z ;Compuebo si el resultado es catorce
goto CATORCE ;si es asi combierto a su equivalente 7 segmentos

goto LISTO ;sino es nunguno de los anteiores ir al programa principal

;===========================================================
;Subrutina BCD a 7 segmentos

CERO movlw B'11000000'


movwf PORTB
goto INICIO

UNO movlw B'11111001'


movwf PORTB
goto INICIO

DOS movlw B'10100100'


movwf PORTB
goto INICIO

TRES movlw B'10110000'


movwf PORTB
goto INICIO

CUATRO movlw B'10011001'


movwf PORTB
goto INICIO

CINCO movlw B'10010010'


movwf PORTB
goto INICIO

SEIS movlw B'10000010'


movwf PORTB
goto INICIO

SIETE movlw B'11111000'


movwf PORTB
goto INICIO

OCHO movlw B'00000000'


movwf PORTB
goto INICIO

NUEVE movlw B'00010000'


movwf PORTB
goto INICIO

DIEZ movlw B'11000000'


movwf PORTB
goto INICIO

ONCE movlw B'11111001'


movwf PORTB
goto INICIO

DOCE movlw B'10100100'


movwf PORTB
goto INICIO

TRECE movlw B'10110000'


movwf PORTB
goto INICIO

CATORCE movlw B'10011001'


movwf PORTB
goto INICIO

include <Retardos.inc>
END

Video del programa SUMA (CON UN SOLO PUERTO) simulado en proteus:

https://drive.google.com/file/d/1cUXdWxS02WYpZrDQC_d-
Rcx13kdCOi8t/view?usp=sharing

31
CONCLUSION

En esta práctica pudimos dar una buena introducción al manejo del pic16F873a, y a
la utilización del programador pick150 para programar el pic con los programas de
suma y resta realizados en el prelaboratorio, ambos programas se pudieron hacer de
manera exitosa tanto en la simulación como en la práctica real de laboratorio,
posteriormente en el laboratorio se realizó la unión de ambos programas también de
forma exitosa en presencia del profesor y post laboratorio se demostró como
modificar el programa para utilizar un solo puerto para la obtención de datos en vez
de 2 como lo pedía el profesor, en todos los casos no hubo ningún inconveniente para
la realización de la práctica con la excepción de un fallo en las fuentes de tensión del
laboratorio, las cuales no estaban suministrando el valor de corriente adecuada, sin
embargo pudimos utilizar una fuente de 5 voltios externa para subsanar esta situación
y poder realizar la practica con éxito

32
REFERENCIAS CONSULTADAS

16F873A. (s.f.). Obtenido de www.alldatasheet.com:


https://www.alldatasheet.com/datasheet-
pdf/pdf/82339/MICROCHIP/PIC16F873A.html

16F873A. (s.f.). Obtenido de www.alldatasheet.com:


https://www.alldatasheet.com/datasheet-
pdf/pdf/74979/MICROCHIP/PIC16F84A.html

Armengol, A. (2022). Introducción a las herramientas de Software. Caracas,


Venezuela: Universidad Simón Bolívar.

33

También podría gustarte