|
V
|
V
|
V
ÿ
Aientras la bifurcación condicional es sumamente importante, es a
menudo necesario hacer una salto directo a una posición de memoria
dada sin basarlo en una decisión lógica dada. Esto es equivalente a salto
incondicional. Esto es cumplido en el 8051 usando instruc- ciones de Salto
Directo y Call.
Ejemplo: ljmp dirección nueva
..
.
dirección nueva: ....
Cuando el 8051 encuentra la instrucción jmp carga el PC con la dirección
indicada por el operando y continúa la ejecución desde aquí.
||
V
Aparte de LJAP, hay otras dos instrucciones que causan un salto di- recto :
SJAP y AJAP. Funcionalmente, estos dos comandos realizan la misma
función que LJAP: continuar la ejecución en la dirección in- dicada por el
operando. No obstante, SJAP y AJAP difieren en algo:
Si SJAP y AJAP hacen lo mismo que LJAP pero con restricciones, ¿Por
qué usarlas?.
La respuesta es directa: Las primeras instrucciones ocupan cada una de 2
bytes, mientras que LJAP es una instrucción de 3 bytes.
En aplicaciónes con limitaciones de memoria, la sustitución de todas las
LJAP por SJAP o AJAP puede liberar más de una centena de bytes.
R
Cuando el 8051 ejecuta una instrucción LCALL dirección, guarda
inmediatamente el contenido del PC en la pila y continúa ejecutando
código a partir de la dirección indicada por la instrucción LCALL.
|
V
|
V
!!!
|
V
!!!
KR
El 8051 opera con una señal de reloj de frecuencia precisa suminis- trada
por un oscilador realizado con un inversor operando linealmen- te, basado
en un cristal externo. Las frecuencias más comunes del reloj del 8051
estándar son 12 AHz y 11.059 AHz, aunque existen versiones con
frecuencia de hasta 60 AHz.
jenerador
C = 30 10 pF
|
V
!!!
Ciclo de Aáquina
Durante cada ciclo de máquina ocurren 12 pulso de reloj. Esto signi- fica
que si una instrucción se ejecuta en un ciclo y la frecuencia de reloj es de
11.059 AHz, entonces el 8051 puede ejecutar por segundo,
|
V
!!!
Si la instrucción
Como se indicó, esunadeinstrucción
1 ciclo-1byte,
puedecomo
tenerinc1 A,
o más
en elciclos
primerdeestado
máquina.S1 del
Siempre
ciclo se
obtiene eldos
realizan operaciones
código de búsqueda
de operación (OP) desde
durante
la memoria
cada ciclo,
de programa
aunque lay se
instrucción
deposita no
en el
lo
exija. Si de
registro es de un sólo
éstainstrucciones byte,
(èR), unaelsegunda
µCtrl ignora
búsqueda
la segunda
ocurre búsqueda
durante ely estado
el contador
S4 y dela
ejecución es
programa (PC) completada
no se incrementa.
en el estado S6.
i a aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiaï |
V
!!!
On ejemplo de una instrucción de 1 ciclo-2byte es add A,#dato. En este caso du- rante S1
se busca el código de operación (OP) y se carga en el registro èR, una se- gunda
búsqueda en el estado S4 permite obtener el byte dato del segundo operan- do. En S6 se
ejecuta la suma, y el resultado se deposita en el acumulador.
@
@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiaï |
V
!!!
Ona instrucción de 2 ciclos de máquina y 1 byte es inc DPTR. La CPO realiza cuatro
operaciones de búsqueda y desecha las tres últimas.
á
ai aï |
V
!!!
,
|
V
!!!
|
K
/
!
èè
||
KK
|
KK
|
!!!KK
V i a a a a a a aà
|
!!!KK
|
K
.
Kÿ
|
Kÿ
A las 32 líneas de E/S del 8051 se puede tener acceso como puertos de 8
bits o por bits independientes. Todas las líneas pueden programarse como
entradas o salidas.
Los cuatro puertos P0 a P3 tienen un registro latch (SFR), un buffer de
entrada y un circuito de salida realizado con transistores FETs. Los puertos
P0 y P2 incluyen un multiplexor para permitir el acceso a memoria externa.
Durante el acceso a memoria exterior, por el puerto 0 se emite el byte de
orden bajo del bus de direcciones. Si la dirección es de 16 bits, el byte de
orden alto aparece en el puerto 2.
Dos terminales de P1 y todos los de P3 tienen función dual, para activar la
función alternativa debe escribirse un 1 en el latch de la línea
correspondiente.
|
Kÿ
|
Kÿ
||
dir/dato
bus interno D
Escribir a latch CL
Leer pin
bus interno D
Escribir a latch CL
Leer pin
Cuando el CPO emite una señal escribir a latch, se carga en el flip flop D
(un bit del FSR) el estado lógico de la línea del bus interno. En respuesta a
un comando del CPO leer latch, el nivel lógico de la salida del biestable
se deposita en la línea del bus interno.
El estado lógico del terminal físico del puerto (el pin) pasa al bus interno
como resultado de un comando leer pin generado por el CPO. Ciertas
instrucciones de lectura de puerto activan la señal leer latch, mientras que
otras usan el comando leer pin.
Ona señal interna, control, conmuta las líneas de los puertos 0 y 2 al bus
interno de direcciones o direcciones/datos para permitir el acceso a
memoria externa. En este caso el SFR P2 no es afectado mientras que
todos los bits de P0 son cargados con unos.
|
[
dir/dato
control + VCC
Leer latch
T1
bus interno D
Escribir a latch CL T2
Leer pin
|
[ &
|
m resistor activo con fet
Kÿ
Para usar el pin como entrada, la salida del latch deberá estar, o ponerse a
1, y será responsabilidad de la fuente externa colocar la línea en estado
cero o uno.
|
Kÿ
Las intrucciones que leen el latch en lugar del estado del pin son:
è K
è K
Estas instrucciones son del tipo leer-modificar-escribir. Cuando se ejecuta una de éstas, lee el
estado del latch, quizás lo altere y lo carga con el nuevo valor.
|
Kÿ
La operación sobre el FSR en lugar de sobre el pin asegura que las líneas
usadas como entradas no sufran alteraciones forzadas, y ade- más evita
ambigüedades en la lectura de la tensión en el terminal.
Ona
Considere
Para lectura
activar
Leyendo el el
subsiguiente
el caso
FSR dispositivo
de una
en lugar del
BJTbit
del línea
esdel
pin necesario
se de
puerto
un detectaría
obtienepuerto
cargar
el valoruno
delcorrecto,
un8051
encero,
la línea
controlando
al estado
un re-gistrar
del puerto.
un
la
alto,
transistor
tensión
en base-emisor
la líneabipolar que, funciona
del puerto, VBE0.7 como
V,del transistor
interruptor.en conducción.
|
[
Rm
bus interno D
Escribir a latch CL
Leer pin
|
m resistor activo con fet
[ Y
||
m resistor activo con fet
Kÿ
Las salidas de los puertos 1,2 y 3 tienen resistores activos conectados
como pull-up (llevar a alto) y realizados con transistores AOS. Para que
una línea de estos puertos sea usada como entrada es necesario cargar 1
en el latch para cortar el AOSFET de salida. Con el transistor desactivado
la línea respectiva es puesta a nivel alto por el resistor pero puede ser
llevada a cero desde el exterior.
Las líneas del puerto 0 son a drenador abierto cuando se usan como
salidas. Observe que el transistor T1 (pull-up) de P0 permanece cortado a
menos que se esté escribiendo unos en una operación de acceso a
memoria externa. Si se carga un nivel alto en el latch, ambos transistores
de salida se cortan, y las líneas pueden usarse como entradas de alta
impedancia.
|
Kÿ
è
V
KÿK
/
!
ÿ
/
( 1
! |
Kÿ
|
|
¿Como programar?
èF-THEN/ELSE.
CASE.
WHèLE-DO
REPEAT-ONTèL.
|
¿Como programar?
K
è*KKRÿK
On elemento de decisión permite la ejecución de un proceso o la selección
entre la ejecución de dos procesos. En el primer caso la estructura se reduce
a èF-THEN.
|
¿Como programar?
è Then è Then/Else
entrada entrada
¿condición? ¿condición?
salida salida
||
¿Como programar?
K
VÿK
En el caso que se deba probar una condición para ejecutar más de dos
procesos deben utilizarse varias estructuras èF-THEN/ELSE, lo cual puede
complicar innecesariamente un programa. La estructura CASE es más
adecuada para este caso. La acción de CASE es evaluar un dato de un
grupo posible, y ejecutar el proceso asignado al dato.
Para garantizar que la estructura CASE tenga una entrada y una salida, cada
rutina de proceso debe finalizar con una instrucción de salto incondicional a la
misma dirección de memoria.
|
¿Como programar?
Case entrada
¿condición?
salida
|
¿Como programar?
K
2*èRK
Las instrucciones de salto permiten el establecimiento de lazos de
programación, en los cuales un grupo de instrucciones se ejecuta
repetidamente, una instrucción de salto condicional es la encargada de
controlar la repetición y salida.
En esta estructura la condición al inicio del lazo es evaluada repetidamente, y
el resultado de la prueba indicará si se debe ejecutar el lazo o salir de este.
|
¿Como programar?
Èhile-Do
entrada
¿condición?
proceso 1
salida
|
¿Como programar?
K
KK"èR
En este caso el control entra al lazo y el proceso es ejecutado, pos-
teriormente se prueba la condición y dependiendo del resultado se repite el
lazo o se abandona este. A diferencia de la estructura DO-WHèLE en la cual
es posible que el lazo nunca se ejecute, en REPEAT-ONTèL se ejecu- ta al
menos una vez.
|
¿Como programar?
>epeat-Until entrada
proceso 1
¿condición?
salida
|
¿Como programar?
|
¿Como programar?
|
|
1
R
[
ÿ
´
|
||
|
|
|
|
ACALL:
JC:
AOL:
Salto
Llamada
Aultiplica
si acarreoabsoluta
el Acumulador
es 1 a subrutina by B
ADD,
JAP:
NOP:
ADDC:
Salto
No hacer
incondicional
Sumarnada acumulador (Con Acarreo)) JNB:
AJAP:
ORL:
Salto Salto
si OR absoluto
bit es cero
ANL:
JNC:
RETè:
Bitwise
Salto
Retorno
si
ANDacarreo
de subrutina
es cero de servicio de interrupción
CJNE:
JNZ:
RL:Comparar
Salto
Rotarsiacontenido
la and
izquierda
saltar delelsiAAcumulador
no
no es
es igual
cero RLC:
CPL:
LCALL:
RR: è
JZ:Rotar
CLR: Salto
Cargar
A sia cero
través
Complementar
Rotar
Llamada
contenido
enderegistro
a la derecha
ladelbandera
a registro
subrutina
A es cero de acarreo
el Acumulador
dentro de 64K RRC:
DA:
LJAP:
Ajuste
Rotar Salto
Adecimal
a ladentro
derecha
deldeacumulador
a64través
K del acarreo C
DEC:
AOV:
DèV:
SETB:
POP:
SJAP:
1
Decrementar
Aover
Dividir
Poner bitRegistro
Obtener
Salto
acumulator
Valor
a1
restringido
depor la Bpila
DJNZ:
POSH:
SOBB:
Decrementar
Cargar
Restavalordel registro
Aaconla pila
acarreo
y saltar si no es cero RET:
èNC:SWAP:
èncrementar
Retorno èntercambia
desde Registro
subrutinaNibbles del Acumulador
JB:
AOVC:
XCH:
Saltarèntercambia
Aove
si bit esbyte1 debytes
código AOVX:
JBC:
Aover
XCHD:
Saltar
byteèntercambia
sidesde
bit es 1RAA
y dígitos
ponerlo
externa a cero.
XRL: OR exclusivo |
.
|
Registrada Por Keil Software,èNC
La aplicación windows µVision2 es un
Esta es una
grupo
M versión
de
de evaluación,
programas
que en la cualun
ofrece están
am-
ausentes
M ciertos
biente recursos
integrado
de
parasumael utilidad
para elde
desarrollo
desarrollo
de aplicaciones profesionales.
sistemas microcontroladores
M
basados
en
El ensamblador ASA51 o el
compilador C51 se utilizan del
modo conocido por todos. En
lugar de describir el programa
µVision2, se presenta el desa-
rrollo de un proyecto.
uien lee debe consultar los
manuales de usuario para
aclarar dudas.
|
Proceso de ensamblado
El archivo lista es un archivo texto que contiene una mezcla del programa
fuente y el código objeto, indicando las direcciones de memoria utilizadas
para almacenamiento del programa, y mensajes de posibles errores
cometidos en la escritura del texto fuente.
Las salidas del L51 son: On archivo objeto en código absoluto listo para
ejecutar, y un archivo lista que muestra los resultados del proceso de
enlazado y relocalización.
Aódulos fuente
Aódulo hex
|
ÿ 1
El 8051 es un procesador con áreas de memoria destinadas para
almacenamiento de información específica. En un archivo fuente se usan
segmentos para asignar el código, datos y variables a estas áreas.
On segmento no es más que un bloque de memoria que el A51 crea a partir
del código o datos del archivo fuente. On segmento genérico se crea con la
directiva de ensamblador SEjAENT. La declaración :
ÿ
No tienen nombre y residen en un área fija de de memoria. Se crean usando
las directivas CSEj, DSEj, XSEj, èSEj y BSEj. Estas permiten localizar
código y datos o reservar un bloque de memoria en una localización fija.
ÿ
5
Si la aplicación usa subrutinas debe declararse un segmento de pila para
reservar un área de memoria para el stack.
K
)
è
%%
%
%%%%%%%%%%%
'
%
ÿ%
&
!
%
!
%
%
%
()
"
&%%%%%%%%%%%%%%
%%%
&
)
&
K
èK )4 &
Paso 1
Crear un archivo de proyecto.
Paso 2
Seleccionar la versión del 8051.
Paso 3
Escribir uno o mas archivo fuente en ensamblador (nombre.a51) o en C
(nombre.c51).
Paso 4
Agregar los archivos fuentes al proyecto y configura opciones
Paso 5
Construir (BOèLD) la aplicación con el administrador de proyectos.
Paso 6
Corregir errores en los módulos fuente.
Paso 7
Simular y depurar la aplicación
|
mEl usuario puede especificar otra extensión.
Ose la estructura lógica èF-THEN-ELSE en un programa para:
Leer un dato desde el puerto 2.
Si corresponde al código ASCèè de la letra R debe activar un indicador
luminoso conectado al bit 7 del puerto 3.
En caso contrario, activa un led en el bit 0 del mismo puerto.
NAAE èF_THEN
codigo SEjAENT CODE
CSEj AT 0
OSèNj 1 ; Selecciona el banco de registros 1
JAP inicio
RSEj codigo
inicio:
dato equ P2 :El dato se obtiene de P2
ledR equ P3.7 ;El caracter R activa el Led en P3.7
ledNR equ P3.0 ;El carácter R activa el Led en P3.0
|
"
K
!!!
|
[ 5
[ 5
&
Escribir un programa con estructura CASE, para seleccionar una de cuatro
opciones de acuerdo con el valor en el registro R5.
COANDO:
valor=0 Activar la bandera de acarreo.
valor=1 Cargar 1 en bit 0 de P3.
valor=2 Bandera de usuario a 1.
valor=3 Cargar cero en Puerto 2
&
NAAE EL_CASE
menu: cjne valor,#0,menu1
setb C
codigo SEjAENT CODE sjmp salir
menu1: cjne valor,#1,menu2
CSEj AT 0
clr P3.0
JAP inicio sjmp salir
RSEj codigo menu2: cjne valor,#2,menu3
setb F0
inicio: nop sjmp salir
valor equ R5 menu3: cjne valor,#3,salir
anl P2,#0
salir: nop
end
&
El breakpointEl0breakpoint
presenta el1menú
permite
deseleccionar
funciones enla laopción.
ventana de salida
&
El usuario puede configura un grupo de pulsadores con comandos asociados
(Toolbox).
&
Con el menú Project/Options for Target Aplicación2/Debug, se carga el
archivo texto de comandos en el archivo fuente.
&
Ejecutando con R5=1, se verifica con el pulsador 2 que P3.0=0.
Y
Este programa copia un bloque de la memoria externa con dirección de inicio
dorg, a otra área con inicio en ddes. El número máximo de posi- ciones a
transferir es de 256. La estructura lógica es DO-WHèLE.
|
Y
NAAE DO_WHèLE
dorg equ r0
dorgh equ r1
ddesl equ r2
ddesh equ r3
i equ 60H
tbloq equ 128
inicio:
mov i,#tbloq+1
lazo: djnz i,seguir
jmp salir
seguir: mov dpl,r0
mov dph,r1
movx a,@dptr
inc r0
mov dpl,r2
mov dph,r3
movx @dptr,a
inc r2
jmp lazo
salir: nop
end
Y
Y
Bloque inicio
Y
Bloque destino
ègual al anterior pero con estructura lógica REPEAT-ONTèL.
NAAE REPEAT_ONTèL
dorg equ r0
dorgh equ r1
ddesl equ r2
ddesh equ r3
con equ 60H
tbloque equ 128
inicio:
mov con,#tbloque+1
ordena en forma ascendente una lista de hasta 256 ele- mentos,
almacenados a partir de la posición itabl. Se usa el metodo de la burbuja
(bubble).
Esta ténica de ordenación interna es la más fácil de programar pero la
menos eficiente en términos de tiempo de CPO. Además no aprovecha la
ordenación inicial de la tabla. No obstante se usa debido a que es la más
apropiada para listas de 4 a 10 elementos.
NAAE filtro
POBLèC itabl,nocambio,temp,temp1,temp2,num,dinicio,ndatos EXTRN
CODE (orden,sum88,div168)
codigo segment code
pila segment idata
varbit segment bit
rseg pila
ds 10h
cseg at 0
jmp inicio
rseg codigo
inicio: mov sp,#pila-1
itabl equ 70h ;dirección de inicio de la tabla
num equ 0Ah ;número de bytes en la tabla
temp1 equ 50h
temp2 equ 51H
temp equ 60h
dinicio equ 72h ;dirección nicial de datos a promedia
ndatos equ 6 ;número de datos a promediar
NAAE ordenar
POBLèC orden
EXTRN DATA (itabl,num,temp1,temp2)
EXTRN BèT (nocambio)
Ordenar_Bytes SEjAENT CODE
RSEj Ordenar_Bytes
ÿ
NAAE suma8_8
POBLèC sum88
EXTRN DATA (dinicio,ndatos)
Sumar_Bytes SEjAENT CODE
RSEj Sumar_Bytes
sum88:
mov r2,#ndatos-1
mov r3,#0
mov r0,#dinicio+1
clr c
sumar: add a,@r0
jnc proxdato inc
r3 ;puede usarse addc proxdato: inc
r0 djnz
r2,sumar salir:
nop
ret
end
#
NAAE div16_8
POBLèC div168
EXTRN DATA (temp)
Dividir SEjAENT CODE
RSEj Dividir
O |
#
Promedio en 60H-61H
V
ordena en forma ascendente una lista de hasta 256 ele- mentos,
almacenados a partir de la posición itabl. Se usa el metodo de la burbuja
(bubble).
Esta ténica de ordenación interna es la más fácil de programar pero la
menos eficiente en términos de tiempo de CPO. No obstante se usa debido a
que es la más apropiada para listas de 4 a 10 elementos.
V
#
Se debe escribir un programa de control para un voltímetro DC con
convertidor A/D de pendiente doble, usando un 8051. El valor de la tensión
desconocida debe mostrarse en una pantalla de cristal líquido, con el
formato mostrado en la figura.
#
El 8051 envía por las ocho líneas del puerto P1 los caracteres a presentar e
Por
instrucciones
las líneas P3.7,
de control.
P3.6, y P3.5 se emiten las señales de control: EN, RS y R/W.
#
#
|
#
Convertidor A/D de pendiente doble
#
Convertidor A/D de pendiente doble
#
à
* aaaaaaaaaaaaaaaaaa *
à
donde:
Ve: voltaje DC que se mide
n: Cuenta digital correspondiente al valor medido.
Vr: Voltaje de referencia. (-2.0 V en este caso)
N: Cuenta correspondiente a Vr. 213 = 8192 en este diseño)
#
Procedimiento de medición:
El instrumento debe medir el voltaje de entrada, presentarlo en la pantalla y
LCD y repetir la medida. On ciclo de medición consta de tres pasos:
Paso 1: ènicio
Se conecta la tensión de referencia (Vr = -2 V) a la entrada del integrador, lo
cual produce una rampa positiva. El diodo del integrador fija el valor máximo
de la rampa a su tensión de conducción. Esta situación se mantiene durante
40 ms como ilustra la figura que sigue. Este tiempo no es crítico y puede ser
menor. La salida del comparador se mantiene a una tensión negativa.
#
#
Paso 2: èntegración de Ve
El código conecta la tensión desconocida Ve al integrador y se genera una
rampa negativa. En t1 (47.4 ms) la rampa cruza el nivel de cero voltios y el
comparador sube a una tensión positiva. El programa debe detectar este
cruce por cero y arrancar un contador previamente cargado con cero. La
cuenta continúa hasta cuando el contador alcance N = 8192, en t2 = 96.4 ms.
El lapso t2 ± t1 de 49 ms es constante e independiente de la tensión de
entrada.
#
Paso 3: èntegración de Vr
El µP debe conectar de nuevo la tensión de referencia al integrador, poner el
contador en cero e iniciar un nuevo conteo. La rampa, ahora positiva, se
incrementa y en t3 = 130.7 ms alcanza cero voltios y la salida rectificada del
comparador cae nivel bajo. El código debe detectar este cruce por cero y
parar el contador y almacenar la cuenta igual a n.
#
* *
#
|
#
||
#
|
#
|
2rograma principal (volt_2V.a51)
#
|
#
|
#
|
#
|
mul8_16
#
|
#
|
conv_bcd
#
#
|
#
retar_5ms
#
cmd
#
dat
#
es_cdn
#
es_mem
#
ini_lcd
#
#
libre
#
#
µVision se usa para el desarrollo del programa. Para una emulación más
real se recurre al paquete de simulación de circuitos electrónicos PROTEOS
6.9. Este software permite la simulación del voltímetro con todos sus
componentes.
Observe que se modificaron los valores:
C1 = 6.8 µf R2 = 4.7 K y se usa un diodo con menor èsat inversa que el 1N914
|
#
#
,(( 1%)
+, +,
| | |
|
| $
|$ | ;9+
,
2| 1 21 01 $
|
21 #&! $
01 |'()* $
$
14 1
#1| $
. 1| 10|
#! $
.627 . 3+
||
1| | 1 .- |
$
||
| # # |$
| /
$|
| | # |,
| / ! " $||
|
;9+ $|
|/ | |
/ $|
||
|
( $|
( $|
;9+
( 21
#| | 1 |
| $#
|
/ |"| ||
01 | | |$
|| |
| $"
| |
#
-
| $"|
|
21 21 | $
|
01| |/ ") | $|
|
| $%#
| |
| $#
15
. 10 | |
||
# |
|
/
|
(
|
(
21
1
1!!
#%
#!
|
1
|
|
||
|
|
|
"
1