Descargue como PDF, TXT o lea en línea desde Scribd
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...