Вы находитесь на странице: 1из 8

E.P.S.

de Ingeniera de Gijn
Curso 2003-2004

Prcticas Sistemas Electrnicos Digitales

curso 3 Ingeniera de Telecomunicacin

Prctica 3 Entorno MPLAB v6.xx: Subprogramas matemticos


Fechas: 5 y 12 de Diciembre de 2003
El objetivo de la prctica es habituar a los alumnos al entorno MPLAB v6.xx,
para que procedan a dar los pasos correspondientes al diseo, prueba y
evaluacin de fragmentos de programa escritos en ensamblador.
Se analizarn y simularn dos subprogramas matemticos: uno que convierte
nmeros representados en Binario a su formato BCD y otro que convierte
nmeros representados en BCD a Binario.
Estos subprogramas sern utilizados con posterioridad en el desarrollo de
sucesivas prcticas que necesitan de estos tipos de conversin.
Los alumnos debern completar la prctica mediante la implementacin de
un pequeo programa que supone una modificacin a uno de los
subprogramas y que se describir ms adelante.
Los subprogramas se incluyen en los siguientes ficheros:
BIN16BCD.ASM : Rutina que convierte un nmero binario expresado en 16
bits en su valor expresado en BCD (5 dgitos expresados como 5 semibytes
en 3 variables).
BCD2BIN.ASM : Rutina que convierte un nmero BCD de 2 dgitos en su
valor expresado en binario sobre un byte.

E.P.S. de Ingeniera de Gijn


Curso 2003-2004

Prcticas Sistemas Electrnicos Digitales

curso 3 Ingeniera de Telecomunicacin

Apartado a).- Conversin de Binario a BCD


Planteamiento: se dispone de un dato binario de 16 bits almacenado en 2
bytes consecutivos (BIN_ALTO posicin 0x3A de RAM y BIN_BAJO
posicin 0x3B de RAM) y se desean generar los 5 dgitos correspondientes
a su representacin en BCD. Los 5 dgitos se almacenarn en las posiciones
correlativas siguientes: BCD2 posicin 0x3C, BCD1 posicin 0x3D y BCD0
posicin 0x3E.
ENTRADA:
BIN_ALTO (3Ah)
01100000

BIN_BAJO (3Bh)
00000000

Ej: 60h

Ej: 00h

Valor decimal:
24576

SALIDA:
BCD2 (3Ch)
00000010
Ej: 02h

BCD1 (3Dh)
01000101
Ej: 45h

BCD0 (3Eh)
01110110
Ej: 76h

El valor se calcula realizando la operacin tal y como se hara una conversin


de binario a decimal:
Nmero en binario -> b15 b14 b13 ... b2 b1 b0
Valor = b15*215 + b14*214 + b13*213 ++ b2*22 + b1*21 + b0*20
Tambin se puede expresar de otra forma, que coincide con la forma de
calcular que se realiza en el programa:
Valor = ((.(((b15*2 + b14)*2)+ b13)*2+ b2)*2 + b1)*2 + b0
Las operaciones de multiplicacin por 2 y suma de un bit se realizan de
manera elemental mediante desplazamiento a la izquierda y entrada del bit
a sumar por la derecha
Como se desea que el resultado final se exprese en BCD, debemos ajustar
en todo momento a BCD los dgitos resultantes tras cada operacin. Para
realizar el ajuste de cada dgito se debe comprobar si ste excede de 9
(dgito BCD vlido ms alto) y en caso de que as sea, se le debe aadir 6

E.P.S. de Ingeniera de Gijn


Curso 2003-2004

Prcticas Sistemas Electrnicos Digitales

curso 3 Ingeniera de Telecomunicacin

(nmero de combinaciones que no utiliza el BCD) para incluirlo en el margen


de cdigos BCD vlidos.
El ajuste se realizar de la siguiente forma (se realiza mediante una rutina
denominada AJBCD): si en un resultado parcial algn dgito es mayor que 4
(100b) y no se han acabado las operaciones de desplazamiento, en la
siguiente operacin de desplazamiento se va a salir del margen BCD (como
mnimo va a ser 5*2=10). En ese caso habr que ajustarlo sumndole 6 o lo
que es igual, aprovechando que se va a realizar luego un desplazamiento a la
izquierda (multiplicacin por 2) sumndole 3 y esperando a que el siguiente
desplazamiento a la izquierda haga el resto (la multiplicacin por 2). Vase
la rutina AJBCD para msdetalles.
En nuestro ejemplo anterior: b15=0, b14=1, b13=1, b12=0, b11=0,....
Cuando llevemos realizada la operacin ((((b15*2 + b14)*2)+ b13)*2)+ b12 el
resultado sera 6 (0110b)
Al realizar la siguiente iteracin y multiplicar por 2 (desplazar a la
izquierda), el resultado sera 1100b, lo que no corresponde a un cdigo BCD
vlido.
Para arreglarlo, al 6 (que es mayor que 4) le sumamos 3, obteniendo 9
(1001b), que posteriormente multiplicaremos por 2 a la vez que le sumamos
b11(mediante un desplazamiento a la izquierda) con lo que el resultado final
sera: 1 0010b =12h que s que se corresponde con dos dgitos BCD
coincidentes con el resultado a obtener.
Para comprobar si un nmero es mayor que 4 (0100b) o no, se le puede
restar 4 y comprobar el resultado con el acarreo o bien sumarle 3 (0011b) y
si alcanza un 1 en el bit 3 es que hemos obtenido un resultado de 8 (1000b)
o mayor que 8 y por lo tanto el nmero era 5 o mayor que 5. Adems, esa
suma nos puede servir para preparar la necesaria correccin y ajuste a BCD
si fuera necesario sumarle 6.

E.P.S. de Ingeniera de Gijn


Curso 2003-2004

Prcticas Sistemas Electrnicos Digitales

curso 3 Ingeniera de Telecomunicacin

Un posible algoritmo sera:

Contador_desp =16

Puesta a 0 de los digitos


BCD

BCD2

BCD1

BCD0

BIN_ALT

BIN_BAJ

Dec. Contador_desp

Si
CONTADOR =0

FIN

No
Ajusto BCDs

Un cdigo fuente puede ser (fichero bin16bcd.asm):


;
;
;
;
;
;
;
;
;
;

Programa que realiza la conversin de un dato binario de 16 bits a un


formato BCD almacenndolo en 5 dgitos que ocupan medio byte cada uno
El dato binario est almacenado en dos bytes contiguos: BIN_ALTO y BIN_BAJO
y el resultado va a parar a 3 bytes tambin consecutivos que son de mayor
a menor peso: BCD2, BCD1 y BCD0
Estos almacenan los 5 dgitos, estando presente en los 4 bits ms bajos de
BCD2 nicamente el dgito ms significativo
LIST p=16F877
CONSTANT BIN_ALTO=0x3A,BIN_BAJO=0x3B ;Definicin posiciones del dato
CONSTANT BCD2=0x3C,BCD1=0x3D,BCD0=0x3E ;Posiciones del resultado final

CONTADOR
FSR
STATUS
CARRY
TMP
INDIR

EQU
EQU
EQU
EQU
EQU
EQU

0x3F
4
3
0
0x40
0

;Contador de desplazamientos
;Registro para direccionamiento indirecto
;Registro de STATUS
;Posicin temporal auxiliar
;Registro para direccionamiento indirecto

ORG
CALL

0
BINBCD

;Llamamos al subprograma

ESPERA GOTO

ESPERA

;Tras retorno del subprograma quedamos aqu

;Inicio del subprograma


ORG

0x120

E.P.S. de Ingeniera de Gijn


Curso 2003-2004
BINBCD

MOVLW
MOVWF
CLRF
CLRF
CLRF

DESPLAZ BCF
RLF
RLF
RLF
RLF
RLF

AJUSTE

0x10
CONTADOR
BCD2
BCD1
BCD0
STATUS,CARRY
BIN_BAJO
BIN_ALTO
BCD0
BCD1
BCD2

Prcticas Sistemas Electrnicos Digitales

curso 3 Ingeniera de Telecomunicacin


;Cargamos 16 en el contador
;Puesta a cero
;inicial de las posiciones
;finales
;Ponemos a cero el carry antes de rotar
;Rotacin total
;desde el byte bajo
;hasta el byte ms alto
;de los datos finales
;en BCD

DECFSZ
GOTO
RETURN

CONTADOR
AJUSTE

;Si el contador es cero


;ya van 16 desplazamientos
;y retornamos

MOVLW
MOVWF
CALL

BCD0
FSR
AJBCD

;Empleamos direccionamiento indirecto


;para llamar al subprograma de ajuste
;decimal de cada byte, primero con BCD0

MOVLW
MOVWF
CALL

BCD1
FSR
AJBCD

;Lo mismo con BCD1

MOVLW
MOVWF
CALL

BCD2
FSR
AJBCD

;Y lo mismo con BCD2

GOTO

DESPLAZ

;Volvemos a las rotaciones

; Subprograma para ajuste BCD de cada byte


AJBCD

MOVLW
ADDWF

3
INDIR,W

;Sumamos 3 a la posicin a la que apunta FSR


;el contenido queda en W

MOVWF
BTFSC
MOVWF

TMP
TMP,3
INDIR

;Exploramos si en el primer dgito el


;resultado es mayor que 7
;si es as lo corregimos almacenando ese valor

MOVLW
ADDWF

30
INDIR,W

;Hacemos lo mismo con el dgito BCD superior

MOVWF
BTFSC
MOVWF

TMP
TMP,7
INDIR

;Exploramos sumando 30 al byte completo


;y si el dgito superior es mayor que 7
;lo almacenamos para corregir

RETURN

;Retorno desde el subprograma AJBCD

END

Para la simulacin (comprobacin del funcionamiento):


1. Creamos un fichero con el cdigo fuente anterior
File > New para abrir el editor, se escribe y...
File > Save para salvar el cdigo
2. Se define el proyecto correspondiente

Project > Project Wizard

E.P.S. de Ingeniera de Gijn


Curso 2003-2004

Prcticas Sistemas Electrnicos Digitales

curso 3 Ingeniera de Telecomunicacin

3. Se realiza el ensamblado

Project > Build All

4. Activamos el simulador

Debugger > Select Tool >MPLAB Sim

5. Aadimos las variables a ver durante la simulacin.

View > Watch

y seleccionamos las siguientes variables de inters:


BIN_ALTO (en binario o hexadecimal)
BIN_BAJO (en binario o hexadecimal)
BCD0 (en hexadecimal)
BCD1 (en hexadecimal)
BCD2 (en hexadecimal)
CONTADOR (en decimal)
6. Colocamos valores iniciales a las variables BIN_ALTO y BIN_BAJO.
Les damos unos valores de prueba y al resto valores aleatorios.
7. Realizamos la ejecucin que permita comprobar el funcionamiento:
ejecucin continua, con animacin o paso a paso
Debugger > Run / Animate / Step

E.P.S. de Ingeniera de Gijn


Curso 2003-2004

Prcticas Sistemas Electrnicos Digitales

curso 3 Ingeniera de Telecomunicacin

Apartado b).- Conversin de BCD a Binario


Se dispone de 2 dgitos BCD almacenados cada uno en un semi-byte de una
variable de 8 bits denominada DATOBCD (0x30) y se desea obtener el valor
binario equivalente en la variable Binario (0x31).
ENTRADA:
BCDH

Ejemplo:
BCDL

0101

DATOBCD (30h)

DATOBCD (30h) = 51

SALIDA:
b7b6b5b4

0001

Ejemplo:
b3b2b1b0

0011

BINARIO (31h)

0011

BINARIO (31h) = 33h = 51d

Para realizar esta operacin, operamos de la siguiente forma:


Binario = 10 x DIGH + DIGL
Debemos operar en binario, pero como no hay instruccin de multiplicacin,
buscamos los productos por 2 que consisten en desplazamientos:
Binario= (8+2) x DIGH + DIGL = 8 x DIGH + 2 x DIGH + DIGL
Extraemos DIGL

Binario = DIGL

P. alta: DIGH * 2 4

Rotamos dcha.: DIGH * 2

Binario = Binario + DIGH * 2

Rotamos 2 veces dcha. DIGH*2


obtenemos DIGH * 2

Binario = Binario + DIGH * 2

E.P.S. de Ingeniera de Gijn


Curso 2003-2004

Prcticas Sistemas Electrnicos Digitales

curso 3 Ingeniera de Telecomunicacin

Y un posible cdigo fuente (fichero bcd2bin.asm):


;
; Subprograma para la conversin de
; en un nmero binario equivalente,
;
;
El dato de entrada se sita
;
y el resultado va a parar a
;

dos dgitos BCD almacenados en un byte


entra en 8 bits por tanto
en la posicin DATOBCD
la posicin BINARIO

LIST P=16F877
DATOBCD
BINARIO
TEMP
MISMO
STATUS
CARRY

EQU
EQU
EQU
EQU
EQU
EQU

0x30
0x31
0x32
1
3
0

;Posicin donde se carga el dato con los dos dgitos BCD


;Posicin final donde va a parar el resultado
;Posicin auxiliar de trasvase
;Indicador de resultado sobre el registro
;Registro de STATUS
;Posicin del bit de CARRY dentro de STATUS

ORG 0
CALL
BCDBIN ;Llamada al subprograma de conversin
ESPERA GOTO
ESPERA ;Nos quedamos esperando en este bucle tras retorno

BCDBIN

ORG

100

MOVLW
ANDWF
MOVWF

0x0F
DATOBCD,W
BINARIO

;Extraemos dgito BCD inferior y


;lo dejamos en W
;Lo guardamos ahora en la posicin final

MOVLW
ANDWF

0xF0
DATOBCD,MISMO

;Extraemos ahora dgito BCD superior y


;lo dejamos en el dato, tenemos pues el BCD
;superior multiplicado por 16

BCF
RRF
MOVF
ADDWF

STATUS,CARRY
DATOBCD
DATOBCD,W
BINARIO,MISMO

;Ponemos a cero el carry para desplazamientos


;Como divido por 2 ahora tengo
;dgito superior multiplicado por 8
;y se lo sumo al dgito inferior

RRF
RRF
MOVF
ADDWF
RETURN

DATOBCD
DATOBCD
DATOBCD,W
BINARIO,MISMO

;Divido por 2: dgito sup. x 4


;Divido por 2: dgito sup. x 2
;Ahora lo sumo con el parcial previo
;en la posicin binario
;retorno del subprograma

END

Para la simulacin se proceder de manera similar al apartado a)


Trabajo Adicional para los Alumnos:
Se debe realizar un subprograma que tomando 4 dgitos BCD almacenados
en las posiciones BCD_ALTO (0x20) y BCD_BAJO (0x21) nos proporcione el
valor binario asociado (mximo 0x270F = 9999 en decimal) y lo almacene en
dos bytes denominados BIN_HIGH (0x22 para la parte alta) y BIN_LOW
(0x23 para la parte baja).
El fragmento de programa se escribir para un microcontrolador PIC16F877
Se detallar el algoritmo empleado, se escribir el correspondiente cdigo
fuente y se comprobar su funcionamiento
8

Вам также может понравиться