Vous êtes sur la page 1sur 11

Objetivos

Desarrollar e implementar, el algoritmo de la suma, resta, multiplicacin y divisin, para dos bytes. Interactuar con la placa de desarrollo Ql200,para la implementacin de los algoritmos anteriores. Introduccin Se analizaran los algoritmos de la suma, multiplicacin, resta y divisin, en base a diagramas de flujo, para implementar en assembler, as como su puesta en practica en la placa de desarrollo QL200. Marco terico Suma Para implementar el algoritmo de la suma, recurrimos al set de instrucciones del C, y observamos que la instruccin addwf realiza la suma entre el contenido del registro W y el contenido del registro F. Igualmente las banderas del registro STATUS que son afectadas son: C : acarreo DC: acarreo entre nibbles bajo y alto Z: resultado que a producido un 0.

Por ejemplo, en la suma, la bandera CARRY se coloca en "1" cuando el resultado supera el nmero 255 y permanecer en "0" indicando que no se present ningn overflow; es decir que el resultado de la suma fue menor que el mximo permitido. Por otro lado, existe otra bandera denominada Acarreo de Dgito DC que expresa lo que sucede con los 4 Bits menos significativos; es decir, si los cuatro bits menos significativos sobrepasa al numero 15 (2 elevado a 4, incluyendo el cero) expresado en forma decimal, entonces la bandera DC = 1, en el caso contrario ser "0". Finalmente la bandera de estado Z se activa cuando la operacin aritmtica da como resultado un "1"; de lo contrario se coloca en "0". Como solamente se pide que indique a travs de un bit del PORTB, si la suma a producido un acarreo, en la figura A.1 se observa el diagrama de flujo:

Pgina 1 de 11

FIGURA A. 1

Como podemos observar se considera tanto el test de los bits del PORTB, para guardar los datos 1 y 2, como la condicin de acarreo. Cabe sealar que no se a

Pgina 2 de 11

considerado la ultima parte del test del bit PORTB.0 que realizara la divisin, pero a continuacin lo desarrollaremos en un diagrama de flujo. Resta Como en caso anterior recurriendo al set de instruccin del C, vemos que la instruccin subwf nos servir, para realizar la resta entre el contenido del registro F mas el complemento a 2 del contenido del registro W. Ahora las banderas que son afectadas del registro STATUS son: C : acarreo DC: acarreo entre nibbles bajo y alto Z: resultado que a producido un 0.

Ahora especificaremos los 3 posibles casos de resultado que podran darse en la resta, que como se observa, en realidad el C hace la suma del minuendo con el complemento a dos del sustraendo, dando como resultado la suma de los nmeros, pero cabe sealar que abra un caso especial en el que el sustraendo sea mayor al minuendo, por lo que este resultado no representara la magnitud de la diferencia, a continuacin lo especificamos: En la resta de dos nmeros la bandera CARRY se coloca en "1" cuando el resultado de la operacin sea un nmero positivo, o se pone en cero para el caso contrario. Esto tan sencillamente quiere decir por ejemplo que si tenemos A = FFh y B = Fh donde X = A-B; el resultado ser X = F0h (nmero positivo); para el caso contrario si tenemos A = Fh y B = FFh donde X=A-B entonces X= 10h, obtenindose un resultado negativo y adems el resultado no es la magnitud de la diferencia, la cual sera el complemento a dos del resultado en este caso 10h el cual seria F0h obviamente con signo negativo, pero este signo lo especificara el CARRY.

Para realizar dicho complemento a dos, solamente se resta 0 W.


La bandera de acarreo de dgito DC se colocar en "1" cuando los cuatro bits menos significativos del registro W sea menor que los cuatro bits menos significativos del registro que se desea restar, en caso contrario se colocar un cero. La bandera de estado Z solamente se activar cuando ambas cantidades sean iguales. Habiendo tomado los respectivos casos, podemos realizar e algoritmo de la resta, en la siguiente figura A.2 donde se representa el diagrama de flujo de la resta:

Pgina 3 de 11

FIGURA A. 2

Multiplicacin Como tal el set de instrucciones del C no cuenta con una instruccin para este propsito, por lo que definiremos a la multiplicacin como el numero de sumas determinado por el multiplicador, del multiplicando. O sea una sumatoria del multiplicando desde n = 0 asta n = multiplicador.

Pgina 4 de 11

Ahora podemos realizar su diagrama de flujo como en la figura A.3:

FIGURA A. 3

Pgina 5 de 11

Divisin Como vimos en el algoritmo anterior, el set de instrucciones del C no cuenta con una instruccin de divisin, por lo que definiremos a la divisin como un numero restas del dividiendo el divisor, y despus la resta ser con el residuo el dividiendo, el numero de restas que no produzcan un numero negativo o cuando el divisor sea mayor al residuo o al dividiendo, la cuenta se parara y el numero de restas que si se hayan realizado ser nuestro cociente. Cabe sealar que en el diagrama de flujo de la figura A.4, se considera que ya se obtuvieron los datos 1 y 2, previamente, as que solamente se considerara la interaccin del PORTB.0 para hacer la divisin y mostrar el resultado.

FIGURA A. 4

Pgina 6 de 11

Desarrollo
Ahora veremos la aplicacin de los algoritmos vistos en los diagramas de flujo anteriores, aplicados en assembler.:

;1er Configuracin del C y de los puertos, as como la asignacin de etiquetas ;a registros de propsito general
;********************************************************************************** ;* INSTITUTO POLITECNICO NACIONAL ;*Unidad Profesional Interdisciplinaria de Ingenieria y Tecnologias Avanzadas ;* ;* Microprocesadores, Microcontroladores e Interfaz ;* FECHA: de Agosto de 2012 ;* M. en C. DAVID ARTURO GUTIRREZ BEGOVICH ;* ;* PROGRAMA: Ejemplo de uso de MPLAB ;* PARA: MICROCONTROLADOR PIC16F877A ;* ENSAMBLADO EN: MPLAB FOR WINDOWS ;********************************************************************************** processor 16F877 include <p16f877.inc> cblock 0x20 d_1 d_2 op dat_1 dat_2 resultado endc ;********************************************************************************** ;Inicio de programa ;********************************************************************************** org 0x00 ; goto 0x05 ;Se respeta el vector de interrupcion, inicio en 0x05 org 0x05 ; ;********************************************************************************** ;Configuracion de los puertos ;********************************************************************************** clrf PORTC bsf STATUS,RP0 ;Se accede al banco 1 movlw 0x7F movwf TRISB ;Se declra PtoB.7 como salida clrf TRISC ;Se declara como salida todo el puerto bcf STATUS,RP0 ;Se accede al banco 0

;2do Inicio del programa principal


;********************************************************************************** ;Programa Principal. ;********************************************************************************** clrf PORTC bcf PORTB,7 Lee btfss PORTB,0 ;se entra en un ciclo infinito asta que no se pulse el push goto Lee ;button

Pgina 7 de 11

Paso1 movf PORTD,W movwf PORTC movwf d_1 testB movf PORTB,0 andlw 0x0F movwf op movlw 0x02 subwf op,0 btfss STATUS,C goto testB movf PORTD,W movwf d_2 btfsc op,1 goto suma btfsc op,2 goto resta btfsc op,3 goto multiplicacion loop2 movwf PORTC btfss PORTB,0 goto loop2

;Nos quedamos con el nibble bajo ;Realizamos la resta del valor de PORTB con 2h ;op - 0x02, y checamos si se a producido un cambio ; c=1? resultado positivo ;por lo tanto se ha presionado un push button ;despus preguntamos bit a bit cual se presiono

;Etapa de la divisin

division bcf PORTB,7 clrf resultado movlw 0xFF movwf dat_2 movf d_1,F btfsc STATUS,Z goto loopcero movf d_2,F btfsc STATUS,Z goto loopcero loop7 movf d_2,W subwf d_1,1 btfss STATUS,C goto loop8 incf resultado,1 decfsz dat_2,1 goto loop7 movf resultado,0 movwf PORTC goto fin loop8 movf d_2,0 addwf d_1,1 btfss STATUS,Z bsf PORTB,7 movf resultado,0 movwf PORTC

;Comprobamos si es cero, alguno de los dos datos ; ; ; ; ;Movemos el divisor ;Se lo restamos al dividendo ;Es positivo el resultado? ;incrementamos el resultado, dado que la resta no a ;producido un valor negativo

;la resta produjo un resultado negativo ;por lo tanto el divisor es mayor al dividiendo ;y termina el ciclo

Pgina 8 de 11

goto fin ;****************************************

;Etapa de la suma

suma movf d_1,0 addwf d_2,0 btfsc STATUS,C ;comprobamos si se produjo acarreo con C=1 bsf PORTB,7 goto loop2 ;****************************************

;Etapa de la resta

resta

movf d_2,W subwf d_1,W btfsc STATUS,C ;comprobamos si es negativo con C=0 goto loop2 bsf PORTB,7 sublw 0x00 ;Obtenemos la magnitud del resultado al realizar goto loop2 ;el complemento a 2 del resultado ;****************************************

;Etapa de la multiplicacin

multiplicacion clrf resultado movf d_1,F btfsc STATUS,Z goto loopcero movf d_2,1 btfsc STATUS,Z goto loopcero movf d_2,W movwf dat_2 loop3 movf d_1,0 addwf resultado,F btfsc STATUS,C goto loop4 decfsz dat_2,F goto loop3 movf resultado,W goto loop2 loop4 bsf PORTB,7 movf resultado,W goto loop2 loopcero movf resultado,W goto loop2

;Comprobamos si es cero alguno de los dos datos

;Hay acarreo? ;se a producido una multiplicacin mayor a FFh ;decrementamos el multiplicador ;al no ser 0, deber seguir sumando

;al producirse una multiplicacin mayor a FFh se sale del ;ciclo ;algun dato es cero

;Fin del programa

;**************************************** fin sleep end ;****************************************

Pgina 9 de 11

Conclusiones
Jose Amauri Quiroz Garca. Deduzco que podemos representar un sistema muy complejo con la suma de partes fundamentales del mismo, en el caso de la multiplicacin y divisin, vemos como, a partir de operaciones bsicas y con cierto lineamientos, la implementacin de una multiplicacin o divisin, se reduce a sus conceptos bsicos. Ergo la implementacin a un nivel de estructuras, representa la conjuncin del hardware como del software en un nivel muy bajo de implementacin, es decir en funciones bsicas, para la obtencin de una funcin mas compleja. Jess Armando Cacelin Gasca. La prctica nos sirve como introduccin al uso de la tarjeta QL-200 para este curso y a pesar de tener algunos inconvenientes con el uso de sta, la prctica cumpli su cometido. Es importante el manejo de las operaciones matemticas bsicas as como conocer el comportamiento de las banderas porque en general estas nos pueden ayudar a tomar decisiones si el programador as lo desea.

Referencias
Microcontroladores PIC: Sistema Integrado para el Autoaprendizaje
Escrito por Enrique Mandado Pre

Microcontroladores: Fundamentos y aplicaciones con PIC


Escrito por Fernando E. Valds Prez,Ramn Palls Areny

Microcontroladores PIC16F84 Desarrollo de Proyectos


Escrito por Enrique Palacios, Fernando Remiro, Lucas J. Lpez

DATASHEET PIC16F87X
Microchip

Pgina 10 de 11

INSTITUTO POLITCNICO NACIONAL UNIDAD PROFESIONAL INTERDISCIPLINARIA EN INGENIERA Y TECNOLOGAS AVANZADAS

ASIGNATURA: MICROPROCESADORES, MICROCONTROLADORES E INTERFAZ. GRUPO 2MM9 INTEGRANTES DEL EQUIPO: JESS ARMANDO CACELIN GASCA. JOS AMAURI QUIROZ GARCA.

FECHA: 19 DE SEPTIEMBRE DE 2012 PROFESOR: DAVID ARTURO GUTIRREZ BEGOVICH.

Pgina 11 de 11