You are on page 1of 10

LABORATORIO 1

CONOCIENDO LAS HERRAMIENTAS DE TRABAJO

ELKIN DARIO GRANADOS HERNANDEZ


DANY YADIR JAIMES CACERES

20041005048
20041005055

DIGITALES III
PROFESOR: JULIAN CAMARGO

UNIVERSIDAD DISTRITAL FRANCISCO JOSE DE CALDAS


FACULTAD INGENIERIA
ELECTRONICA
BOGOTA D.C.
08 DE ABRIL DE 2008

CONOCIENDO LAS HERRAMIENTAS DE TRABAJO


Planteamiento del problema:
Teniendo un dato codificado en Hexadecimal de 16 bits sin signo en la memoria
RAM del microcontrolador. Disear, ensamblar y simular un programa que
realice la conversin a cdigo BDC del dato almacenado en la memoria RAM
del microcontrolador, el resultado se almacenara en las posiciones de memoria
DIG4, DIG3, DIG2, DIG1, DIG0 (es decir, cada digito BCD se almacenara en
una posicin de memoria individual) previamente definidas en la memoria RAM
del microcontrolador.

Anlisis del problema:


Lo primero a tener en cuenta son los sistemas numericos que utilizaremos:
El sistema hexadecimal, a veces abreviado como hex, es el sistema de
numeracin posicional de base 16 empleando por tanto 16 smbolos. Su
uso actual est muy vinculado a la informtica y ciencias de la computacin,
pues los computadores suelen utilizar el byte u octeto como unidad bsica de
memoria; y, debido a que un byte representa 28 valores posibles, y esto puede
representarse como
,
que, segn el teorema general de la numeracin posicional, equivale al nmero
en base 16 10016, dos dgitos hexadecimales corresponden exactamente
permiten representar la misma lnea de enteros a un byte.
Binary-coded decimal (BCD8421) es un sistema numrico usado en sistemas
computacionales y electrnicos para codificar nmeros enteros positivos y
facilitar las operaciones aritmticas. Es un cdigo pesado debido a que
representa los dgitos con un orden especfico (8421).
Sistema de conversin
Para la conversin de hexadecimal a BCD, existen diferentes mtodos de
manipulacin de dgitos, y en nuestro caso optaremos por las propiedades del
microcontrolador de distinguir o mejor de poder trabajar en hexadecimal, o en
decimal sin causar problema alguno, por lo tanto el problema se nos simplifica
a realizar la identificacin de cada uno de los dgitos decimales que compongan
la cantidad a convertir.
Para esto nos basaremos en el hecho de ser un sistema decimal, por lo tanto
cada digito puede ser identificado por medio de divisiones por mltiplos de diez,
y dado que las divisiones lgicas desprecian las fracciones, nos permite
encontrar el digito de mayor peso apartando el los dems dgitos que
componen el numero, y prosiguiendo con unas multiplicaciones por la misma
cantidad por la que se dividi podremos empezar a descomponer el numero
digito a digito por medio de restas.

Explicacin del programa


Para el desarrollo del programa nos basamos en un mtodo de
divisiones para as obtener cada digito
Dado que el numero en memoria es de 16 bits, el mximo que se puede
representar es 65535, y la operacin DIV, que utilizaremos tiene 2
restricciones: el divisor y el resultado debes ser caracteres de 8 bits (una
mxima cantidad de 255), por lo tanto el mximo numero por el que
puedo dividir (ya que haremos divisiones sucesivas por potencias de
diez), es 100 (0h64), y dado esto el mximo numero para realizar la
divisin y poder guardar en memoria es 25500 (0h 639C)
Primero reviso si el numero es mayo de 25500, si es as realizo restas
sucesivas por 20000 (0h4E20) hasta que el numero sea menor o igual a
25500.
Cuando esto ocurra divido por 10000, ya que no puedo realizar esta
operacin directamente porque 10000 es un numero de 16 bits, y el
divisor es de mximo 8 bits, divido 2 veces por 100, y luego el resultado
lo sumo con un contador (el cual se coloco para contrarrestar el hecho
de las restas por 20000, as que a cada resta el contador ha contado 2
veces), y as hall el primer digito.
Luego multiplico este digito por 10000 y resto esta cantidad con el
numero guardado en memoria, as por resultado solo me quedaran los 4
dgitos restantes del numero inicial.
Para encontrar el siguiente digito realizo una divisin por 1000 (hecha
por dos divisiones sucesivas la primera por 100 y la segunda por 10), as
obtengo el segundo digito, a este digito lo multiplico por 1000 (primero
por 10 0hA y luego por 100 0h64), y realizo la resta respectiva con el
numero en memoria, y continuo repitiendo el procedimiento hasta
encontrar los dgitos restantes.

Anexo 1. Diagrama ASM

Anexo 2. CODIGO
INCLUDE 'MC68HC908AP16.inc'
COPD

EQU

ORG
X0
X1
X2
D0
D1
T1
T2
Cont
S5
S4
S3
S2
S1

DS
DS
DS
DS
DS
DS
DS
DS
DS
DS
DS
DS
DS

060H
1
1
1
1
1
1
1
1
1
1
1
1
1

; Define el bit 0 del rigistro config1.


; Inicio la primera posicin valida de la memoria

; Posicin de memoria del resultado 5


; Posicin de memoria del resultado 4
; Posicin de memoria del resultado 3
; Posicin de memoria del resultado 2
; Posicin de memoria del resultado 1

INICIO: BSET COPD,CONFIG1


; Deshabilito el mdulo COP
MOV 060H,X0
; Configuro X0 en el primer lugar de la memoria RAM
MOV 061H,X1
; Configuro X1 en el primer lugar de la memoria RAM
CLR S5
CLR S4
CLR S3
CLR S2
CLR S1
CLR Cont
PRUEBA: LDA X0
SUB #63H
BCS S_5
CLC
BNE

RESTA

LDA
SUB

X1
#9DH

BCS
CLC

S_5

RESTA: LDA X0
SUB #4EH
STA X0
INC Cont
LDA X1
SUB #20H
STA X1
INC Cont
JMP PRUEBA
S_5:

LDA X0
PSHA
PULH
LDA X1
LDX #64H
DIV
CLRH
DIV
STA X2
LDA

Cont

; Cargo el acumulador con X0


; Le resto a X0 063h para la comparacin
; Si hay acarreo salto a encontrar primer digito
; Limpio acarreo
; Si no es igual salto a resta (si Z=0)
; Cargo X1 en el acumulador
; Resto a X1 9DH

; Cargo en el acumulador parte alta de numero inicial


; Resto a la parte alta del digito la parte alta de 20000 (4E20)
; Incremento el contador

; Cargo en el acumuladaro X0
; Guardo en el acumulador en la pila
; Saco a H la pila
; Cargo X1 en el acumulador
; Cargo 100 en X
; Divido H:A/X
; Limpio registro H
; Cargo en X2 el resultado de la divisin

ADD
STA

X2
S5

; Cargo x2 el resultado de la divisin

REST_1: CLRH
LDA X2
LDX #64H
MUL
LDX #64H
MUL
STA T2
STX T1

; Multiplico X2*100
; Multiplico A*100 (A=X2*100)
; Guardo parte baja de la multiplicacin en T2
; Guardo parte alta de la multiplicacin en T1

LDA
SUB
STA

X1
T2
D1

BCS
LDA
SUB
STA

SALTO1
X0
T1
D0

SALTO1: BCC
LDA X0
DECA
STA X0
SUB T1
STA D0

; Resto X1-T2
; Cargo resultado en D1

; Resto X0-T1
; Cargo resultado de resta en D0

S_4

S_4:

LDA D0
PSHA
PULH
LDA D1
LDX #64H
DIV
CLRH
LDX #0AH
DIV
STA S4
digito)
REST_2: CLRH
LDA S4
LDX #0AH
MUL
LDX #64H
MUL
STA T2
STX T1
LDA
SUB
STA
AND

D1
T2
D1
#0FFH

BCS
LDA
SUB
STA

SALTO2
D0
T1
D0

SALTO2:
BCC
LDA
DECA
STA
SUB
STA

; Salto si acarreo es igual a 1

; A=X0-1
; Resto X0-1-T1
; D0=X0-1-T1
; Cargo en el acumuladaro D0
; Guardo en el acumulador en la pila
; Saco a H la pila
; Cargo D1 en el acumulador
; Cargo 100 en X
; Divido H:A/X
; Limpio registro H
; Cargo 10 en X
; Cargo en S4 el resultado de la divisin (que corresponde al segundo
; Limpio registro H
; Cargo 10 en X
; Multiplico S4*10
; Multiplico A*100 (A=S4*10)
; Guardo parte baja de la multiplicacin en T2
; Guardo parte alta de la multiplicacin en T1
; Resto D1-T2
; Cargo resultado en D1
; Salto si acarreo es igual a 1
; Resto D0-T1
; Cargo resultado de resta en D0

S_3
D0
; A=D0-1
D0
T1
D0

; Resto D0-1-T1
; D0=D0-1-T1

S_3:

LDA D0
PSHA
PULH
LDA D1
LDX #64H
DIV
STA S3

REST_3: CLRH
LDA S3
LDX #64H
MUL
STA T2
LDA
SUB
STA
S_2:

; Cargo en el acumuladaro D0
; Guardo en el acumulador en la pila
; Saco a H la pila
; Cargo D1 en el acumulador
; Cargo 100 en X
; Divido H:A/X
; Guardo resultado de la divisin en S3 (tercer digito)
; Limpio registro H

D1
T2
D1

CLRH
LDA D1
LDX #0AH
DIV
STA S2

REST_4: CLRH
LDX #0AH
LDA S2
MUL
STA

T2

LDA
SUB
STA
CLR

D1
T2
S1
Cont

ORG
FDB

0FFFEH
INICIO

; Vector de reset

CONCLUSIONES
Mediante el desarrollo del laboratorio se pudo enfatizar en la
manipulacin de de datos que se encuentren en la memoria RAM, del
microcontrolador, y la familiarizacin con el set de instrucciones del
mismo para el desarrollo de un problema especifico.
Se trabajo el acceso a registros propios del microcontrolador como lo
son el H, el X, el acumulador.
Tambin se encontr la facilidad de operacin que presenta en los
nmeros representados en hexadecimal mediante manipulaciones de
grupos de 8 bits (2 dgitos en hexadecimal), ya que los registros de
operacin as lo requieren para este microcontrolador especifico.
Se familiarizo con el uso del Code Warrior para la sntesis y compilacin
del programa.

You might also like