Documentos de Académico
Documentos de Profesional
Documentos de Cultura
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)
Í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
3
INSTRUCCIONES
Parte 1 – Suma
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.
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;
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.
6
CIRCUITO REDISEÑADO
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
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
;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
;===========================================================
;Programa principal
9
Subrutina de comprobación
;===========================================================
;Subrutina para comprobar que numero del 0 al 14 es el del
resultado
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
;===========================================================
;Subrutina BCD a 7 segmentos
13
DIEZ movlw B'11000000'
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.
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
;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
;===========================================================
;Programa principal
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
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
;===========================================================
;Subrutina BCD a 7 segmentos
21
DIEZ movlw B'11000000'
movwf PORTB
goto INICIO
include <Retardos.inc>
END
https://drive.google.com/file/d/1yQsWxaV7RsjWBgKZwuHG_irEfTjLOd_l/view?us
p=sharing
22
Diagrama de flujo del programa de resta
23
LABORATORIO
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.
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)
;===========================================================
;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
;===========================================================
;Subrutina para comprobar cual es el número
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
;===========================================================
;Programa de resta
;===========================================================
;Subrutina para comprobar cual es el número
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
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
;===========================================================
;Subrutina para comprobar cual es el número
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
;===========================================================
;Subrutina BCD a 7 segmentos
include <Retardos.inc>
END
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
33