Practica 6. Operaciones Aritmeticas

Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 4

1. Nombre.

Programación del Microcontrolador PIC 16F877A en lenguaje


ensamblador con operaciones aritméticas y lógicas.

2. Objetivo. Hacer uso da las instrucciones en lenguaje ensamblador para realizar


operaciones aritméticas y lógicas para obtención de un valor deseado a la salida.
2.1 Objetivo general Hacer uso de las instrucciones en lenguaje ensamblador para realizar
operaciones aritméticas y lógicas para obtención de un valor deseado a la salida. 2.2
Objetivos específicos Hacer uso del software MPLAB para la compilación del código en
lenguaje ensamblador. Aprender a utilizar el programador de PICS para configurar el
PIC16F877A Verificar el funcionamiento del código simulando el circuito utilizando el
software proteus. Realizar el armado del circuito en físico utilizando los componentes
especificados en la práctica.

3. Marco Teórico. Ver información de configuración y uso de puertos, operaciones


aritméticas y lógicas, depuración de un programa usando MPLAB (Debugger, select
tool, MPLAM SIM). Incluya esta información en su reporte de práctica.

4. Procedimiento.
4.1 Realice el circuito indicado en el diagrama a bloque de la figura 1.

Figura 1. Diagrama a bloques del Microcontrolador y la función esperada de operación.

4.2 Escriba un programa en lenguaje ensamblador para el Microcontrolador PIC


16F877 que realice la función indicada en el diagrama a bloques de la figura 1.
4.3 Demuestre la operación del sistema aplicando diferentes valores al Puerto D y ver
resultado en Puerto B.

5. Desarrollo. (Exprese el desarrollo de su práctica en esta sección)


__CONFIG_WDT_OFF&_PWRTE_OFF&_XT_OSC&_LVP_OFF&_CP_OFF;
Configuración para el programa
LIST p=16F877A
INCLUDE <P16F877A.INC>
ORG 0x00; Inicio de programa
GOTO Inicio
Entrada EQU 0x20
AcarreoM EQU 0x21
Resultado EQU 0x27
Multiplo EQU 0x28
Divisor EQU 0x30
;---------------------------------- Programa ---------------------------------------------------
ORG 0x05
Inicio
BCF STATUS,RP0 ; Pone en cero el bit RPO de file STATUS
BCF STATUS,RP1 ; Pone en cero el bit RP1 de file STATUS
CLRF PORTB ; limpia el puerto B
CLRF PORTD ; limpia el puerto D
BSF STATUS,RP0 ; accede a banco 1
CLRF TRISB ; Configura el puerto B como salida
MOVLW b'11111111' ; Mueve b'11111111' al registro de trabajo W
MOVWF TRISD ; Mueve lo que hay en el registro de trabajo a TRISD por lo que
configura el puerto D como entradas
BCF STATUS,RP0 ; regresa a banco 0
Operaciones ; Subrutina Operaciones
;--------------------------------------Limpiar variables----------------------------------------------------
CLRF Entrada ; Limpiar registro Entrada
CLRF Multiplo ; Limpia Multiplo
CLRF AcarreoM ; Limpia AcarreoM
CLRF Resultado ; Limpia Resultado
CLRF Divisor ; Limpia Divisor
;--------------------------------------Revision--------------------------------------------------------------
MOVLW .180 ; Verificar que el numero ingresado no pase de 179, el acarreo en
resta se representa con 0
SUBWF PORTD,1 ; PORTD-180, mientras exista acarreo es un numero permitido
BTFSC STATUS,C ; Se verifica el valor del bit C si es 0 salta la linea
GOTO Fin ; Inicia la subrutina Fin
;---------------------------------------------Operaciones---------------------------------------------------
MOVLW D'10' ; veces que debemos sumar para realizar multiplicacion x10
MOVWF Multiplo ; Registro donde llevaremos el conteo de veces que se a sumado
MOVLW D'7' ; veces que debemos restar para realizar división x7
MOVWF Divisor ; Registro donde llevaremos el conteo de veces que se a sumado
; Subrutina Multiplicacion
Multiplicacion
MOVF PORTD,W ; Movemos lo que se tenía en el puerto D al registro de trabajo
ADDWF Entrada,W ; Sumamos nuestro valor de entrada a Entrada, resultado se guarda en w
guarda en W
MOVWF Entrada ; En Entrada vamos acumulando nuestro resultado
BTFSC STATUS,C ; Si no hay acarreo( C=0), da salto
INCFSZ AcarreoM ; Cuando hay acarreo se incrementa 1
DECFSZ Multiplo ; Cada que se realiza una suma, decremente Multiplo y al llegar
al 0 sale de la multiplicacion
GOTO Multiplicacion ; Inicia la subrutina Multiplicacion
INCF AcarreoM ; Cuando hay acarreo incrementa 1
; Subrutina Division
Division
MOVF Divisor, W ; Muevo el 7 de la variable divisor al registro de trabajo
SUBWF Entrada, W ; Resto 7 al valor que tenga en la entrada
MOVWF Entrada ; En Entrada vamos acumulando el resultado
BTFSS STATUS,C ; Verifico si se ha activado el bit C si esta en 1 salta a la siguiente
línea
DECFSZ AcarreoM ; Cuando hay acarreo se decrementa 1
INCF Resultado ; El resultado va aumentando 1, esto representa las veces que se
puede dividir
BTFSC AcarreoM,2 ; Revisa el bit 2 de acarreo del registro STATUS(Z), si el
resultado de una operacion aritmetica no fue cero, da salto
GOTO Division ; Regresa a la subrutina Division
BTFSC AcarreoM, 1 ; Revisa el bit 1 de acarreo del registro Status(DC), si no hubo
acarreo del cuarto bit de orden bajo en el resultado, da salto
GOTO Division ; Regresa a la subrutina Division
BTFSC AcarreoM, 0 ; Revisa el bit 0 de acarreo del registro Status(C), si no hay
acarreo en el bit más significativo del resultado, da salto
GOTO Division ; Regresa a la subrutina Division
GOTO Mostrar ; Va a la subrutina Mostrar
Mostrar
MOVF Resultado, W ; Se mueve el resultado final al registro de trabajo
MOVWF PORTB ; pasar lo que hay en registro W al puerto B
GOTO Operaciones ; Regresa a la subrutina operaciones
Fin
END ; Fin de programa
6. Observaciones y conclusiones...

7. Referencias...

8. Anexos (Código, diagramas, simulaciones)

También podría gustarte