You are on page 1of 149

Índice

PRÁCTICA 1. Modos de direccionamiento. Ensamblador .................................. 11


Introducción................................................................................................... 11
1.1. Actividad 1.1. Modos de direccionamiento I (No presencial) .............. 11
1.2. Actividad 1.2. Modos de direccionamiento II (Presencial)................... 15

PRÁCTICA 2. Programación modular y pila ....................................................... 17


Introducción................................................................................................... 17
2.1. Actividad 2.1. Programación modular y pila I (No presencial) ............ 17
2.2. Actividad 2.2. Programación modular y pila II (Presencial)................. 22

PRÁCTICA 3. Puertos de E/S y Tarjeta de desarrollo ......................................... 31


Introducción................................................................................................... 31
3.1. Manejo y simulación del funcionamiento de los puertos...................... 31
3.2. Tarjeta de desarrollo, carga y depuración de programas ....................... 32

PRÁCTICA 4. Controlador de Interrupciones (NVIC) ........................................ 37


Introducción................................................................................................... 37
4.1. Actividad 4.1. Controlador de Interrupciones I (No presencial)........... 37
4.2. Actividad 4.2. Controlador de Interrupciones II (Presencial) ............... 44

PRÁCTICA 5. Funcionamiento y manejo del System Timer............................... 47


Introducción................................................................................................... 47
5.1. Actividad 5.1. Configuración y simulación de System Timer
(No presencial) ...................................................................................... 47
8 Prácticas de laboratorio de sistemas electrónicos digitales

5.2. Actividad 5.2. Depuración on-chip del System Timer (Presencial)...... 50

PRÁCTICA 6. Funcionamiento y manejo del Timers .......................................... 53


Introducción................................................................................................... 53
6.1. Actividad 6.1. Configuración y simulación del Timer (No presencial) .... 53
6.2. Actividad 6.2. Depuración on-chip del Timer (Presencial)................... 56

PRÁCTICA 7. Conversor Digital Analógico (DAC) ........................................... 61


Introducción................................................................................................... 61
7.1. Actividad 7.1. Conversor Digital Analógico (DAC) (I) (No presencial) .. 61
7.2. Actividad 7.2. Conversor Digital Analógico (DAC) (II) (Presencial) .. 63

PRÁCTICA 8. Conversor Analógico Digital (ADC) ........................................... 69


Introducción................................................................................................... 69
8.1. Actividad 8.1. Detección de fin de conversión por muestreo (No pre-
sencial) .................................................................................................. 69
8.2. Actividad 8.2. Detección del fin de conversión mediante interrupción
(Presencial)............................................................................................ 72

Anexo I. Programación en ensamblador con Keil µVision®4........................ 75


I.1. Introducción .................................................................................... 75
I.2. ¿Qué es Keil µVision®4? ............................................................... 75
I.3. Creación de un proyecto en ensamblador ....................................... 77

Anexo II. Principales directivas de ensamblador ............................................ 83

Anexo III. Desensamblado de un programa ..................................................... 87

Anexo IV. Programación en C con Keil µVision®4 ......................................... 89


IV.1. Introducción .................................................................................... 89
IV.2. Creación de un proyecto en C ......................................................... 89
índice 9

Anexo V. Simulación de los puertos en el analizador lógico.......................... 101


V.1. Utilización del analizador lógico .................................................... 101
V.2. Ejemplo de utilización de los puertos ............................................. 105

Anexo VI. Guía de configuración del adaptador J-Link para carga y depuración 111
VI.1. Introducción .................................................................................... 111
VI.2. Instalación del controlador de USB del adaptador J-Link .............. 111

Anexo VII. Bibliotecas stdint.h y LPC17xx.h. Algunos aspectos importantes.. 123

Anexo VIII. Resumen del manejo de interrupciones en el LPC1768 ................. 127


VIII.1. Introducción .................................................................................... 127
VIII.2. Modelo de excepciones del Cortex M3........................................... 127
VIII.3. Interrupciones externas del LPC1768 ............................................. 130
VIII.4. Introducción al CMSIS (Cortex Microcontroller Software Interface
Standard) ......................................................................................... 132
VIII.5. Ejemplo de programa que utiliza interrupciones externas usando
CMSIS............................................................................................. 134
VIII.6. Ejemplo de programa que utiliza interrupciones externas sin usar
CMSIS............................................................................................. 135
VIII.7. Tabla de nombres y número de interrupción................................... 138
VIII.8. Definición de los nombres de rutinas de atención a las interrupciones 139

Anexo IX. Entradas analógicas y conversión ADC en tarjeta con LPC1768_H.. 141
IX.1. Introducción .................................................................................... 141
IX.2. El conversor analógico-digital ........................................................ 141
IX.3. Descripción de pines relacionados con el ADC .............................. 142
IX.4. Descripción de los registros implicados.......................................... 143
Práctica 1

Modos de direccionaMiento. ensaMblador

introducción

Esta práctica aborda el estudio de algunos modos de direccionamientos utili-


zados en la programación del microcontrolador LPC1768 de la familia Cortex M3
(ARM). Además, con ella se pretende una mejor comprensión del funcionamien-
to de los microprocesadores, a través de su programación en ensamblador.
La práctica está dividida en dos actividades. La Actividad 1.1 es no presencial
y en ella se suministra un programa de ejemplo donde el alumno debe analizar los
modos de direccionamiento de diferentes instrucciones y comprobar los valores
que toman los registros y la memoria en cada una de ellas. También se pide rea-
lizar una pequeña modificación sobre otro programa.
La Actividad 1.2 es presencial en el laboratorio y en ella los alumnos llevarán
a cabo el desarrollo de aplicaciones sencillas, basándose en el ejemplo facilitado
en la Actividad 1.1.
En el Anexo I se explica cómo crear un programa en ensamblador para el
LPC1768 con el entorno Keil µVision®4 y el Anexo II donde se resumen las prin-
cipales directivas de ensamblador.

1.1. actividad 1.1. Modos de direccionamiento i (no presencial)

En el código fuente del Programa 1.1 se utilizan instrucciones en ensamblador


que permiten analizar y entender el funcionamiento de algunos de los modos de
direccionamiento vistos en las clases de teoría.
Tenga en cuenta que al ensamblar el programa el área de código (RESET) se
almacenará a partir de la dirección 0x0000_0000, a continuación el área de datos
constantes (Constantes) y el área de datos variables (Variables) a partir de
la dirección 0x1000_0000.
" " " " " " " " " " " " "
" " " " " " " " " " " "
" " "

" " " " " " " " " " " " " " "
12 " " " " "Prácticas de laboratorio
" " de" sistemas
" "
electrónicos "
digitales "
" " " " " " " " " "

" " " " " " "

" " " " " ""


Práctica 1 - modos de direccionamiento. emsamblador 13

PrograMa 1.1. instrucciones


" " con diferentes
" " Modos de
" direccionaMiento
" " . "

" " " " " " "


1.1.1. Tareas a realizar en esta actividad
" " " " " " " " " " " " " "
" " " " " " " ®" " "
Cree un proyecto con el entorno Keil µVision 4 y ensamble el código fuente " " "
del Programa 1.1 siguiendo los pasos especificados en el Anexo I. A continuación
" " " " " " " " " " " " " " " " "
realice los siguientes apartados:
" " " " " " " " " " " "
" " " " " ""
1. Ejecute el Programa 1.1 paso a paso. Indique, para cada una de las líneas
indicadas en la Tabla 1.1, los modos de direccionamiento utilizado, el
" " " " " " " " " "
registro o posición de memoria que se modifica y el valor que toma.
" " " "
" " de los registros "
Tabla 1.1. Modos de direccionamiento y valores
" " " "
" "Modo de direccionamiento" " "
Registro/Memoria
Línea " " " " Valor "
Destino Fuente modificado
" " " " "
26 " " " " "
" " " " "
32
" " " " " " " " " " " " " " " "
35 " " " " " " " " " " " " " " "
" " " " " " " " "
38
""
40

46

" " " " " "


2. Adjunte una captura de pantalla de la ventana memory en la que se mues-
tren al menos los primeros 48 bytes de memoria, organizada en 4 bytes por
fila, a partir de la dirección dada por la etiqueta Espacio, una vez ejecuta-
do el programa.
14 Prácticas de laboratorio de sistemas electrónicos digitales

3. Sustituya las dos instrucciones de las líneas 52 y 53" por


" " una sola
" " instruc- "
ción que haga la misma operación.
" " " " " " " " " " " " " " " " "
"
"
4. Complete el Programa 1.2 mostrado a continuación para que el bucle alma-
" cene los" valores
" del 1" al "20 en tamaño
" " word a partir" de la
" dirección
" " dada
" " "
por la
" " " " etiqueta Numeros.
" " " Los valores
" " " se deben
" almacenar
" " " en memoria
" " "
como" se muestra" en" la Tabla 1.2.
" " " " " " " "
"
UVCEMaVQR""
U VCEMaVQR"" G GSW"2z32226222""
SW"2z32226222""
" " C TGC"TGUGV."EQFG"
CTGC"TGUGV."EQFG"
" " F EF"UVCEMaVQR"""""
FEF"UVCEMaVQR"""""
" " F
FEF"kpkekq"
E F " kpke kq "
" " U
URCEG"*2z622/:+""
RCEG"*2z622/:+ :+""
" " G
GPVT[""
PVT["" ""
" """
kpkekq"
k pk ek q" N
NFT"t2.?Pwogtqu"
FT"t2.?Pwogtqu"
" " O
OQX"t3.%42"
Q X " t3 . %42 "
""""
="Dweng"c"eqorngvct"
= "Dweng"c"eqor r ng vct"
nc|q"
n c| q" " "
" " D
DPG"nc|q"
P G " nc|q " =
="Hkp"fgn"dweng"
"Hkp"fgn"dweng"
" " "
fgcfnqqr"
f gc fn qq r " D"fgcfnqqr"""
D"fgcfnqqr"""
""
"" " C
CTGC"Xctkcdngu."FCVC"
TGC"Xctkcdngu."FCVC"
Pwogtqu"
P wo gt qu " URCEG"42,6"
URCEG"42,6"
"
" " G PF "
GPF
PrograMa 1.2. código en " ensaMblador
" " " .
" " a Modificar "

"
Tabla 1.2. Valores
" almacenados
" " en memoria" " "
Dir Numeros Numeros+0x4 Numeros+0x8 Numeros+0xC …..
" " " " " "
Valor 0x00000001 0x00000002 0x00000003 0x00000004 …..
" " " " " "
"
"
" " " " " " " " " " " " " " " "
" " " " " " "
Práctica 1 - modos de direccionamiento. emsamblador 15

5. Adjunte una captura de la ventana memory en la que se vean las posicio-


nes que se han modificado una vez ejecutado el Programa 1.2.

6. Indique los problemas que se ha encontrado durante la realización de esta


actividad.

1.2. actividad 1.2. Modos de direccionamiento ii (Presencial)

En la Actividad 1.2, que se llevará a cabo en el laboratorio de forma presen-


cial, se realizarán modificaciones al programa en ensamblador estudiado en la
Actividad 1.1. Los pasos que hay que seguir en esta actividad son los siguientes:

• Simular y depurar en el laboratorio los ejemplos propuestos.


• Tomar evidencias de los resultados (valores numéricos, captura de pan-
tallas, etc.).
• Mostrar en el laboratorio que ha realizado la actividad con aprove-
chamiento.

1. A partir del Programa 1.1, determine la duración de las siguientes instruc-


ciones:
• MOV r2,#0xA
• LDR r3,[r5,r1]
• LDR r2,=Suma
• SUBS r1,#1
• BNE lazo (cuando salta a la etiqueta lazo)
• BNE lazo (cuando ejecuta la siguiente instrucción –secuencialmen-
te–, es decir, STR r3,[r2]).

2. A partir del Programa 1.2, realice las siguientes actividades:


• Modifique el programa para que desplace un ´1´ por los 32 bits del
registro R0, desde el bit 0 al 31. Cuando el ‘1’ alcanza la posición 31 el
programa se debe quedar parado en un bucle infinito. nota: La instruc-
ción de desplazamiento a izquierdas es LSL.
16 Prácticas de laboratorio de sistemas electrónicos digitales

• Modifique el programa para que la duración del ´1´ en cada posición sea
igual al número de su puesto de trabajo en el laboratorio multiplicado
por 2 µs. Haga uso de un bucle y del conocimiento que ya tiene de la
duración de ejecución de algunas instrucciones.

• Realice un desplazamiento circular, de forma que cuando el ´1´ llegue


al bit 31 se repita el proceso comenzando de nuevo por el bit 0.
Práctica 2

Programación modular y Pila

introducción

En esta práctica se va a analizar un programa relacionado con la adquisición de


conocimientos básicos acerca de la programación modular (rutinas anidadas/fun-
ciones anidadas) y el uso de la pila en el microcontrolador LPC1768. Para ello, se
ejecutará el programa paso a paso y se observarán los valores que van tomando cier-
tas variables, posiciones de memoria, la pila, el puntero de pila, etc.
La práctica está dividida en dos actividades, consistiendo la primera en la eje-
cución y análisis de un programa realizado en ensamblador y la segunda en su
desarrollo en lenguaje de alto nivel (C). Para la realización de la práctica es nece-
sario estudiar el Anexo III “Desensamblado de un programa” y el Anexo IV “Pro-
gramación en C con Keil µVision®4”.
La Actividad 2.1 es no presencial y en ella se continúa trabajando con la herra-
mienta de Keil µVision®4, tal y como se hizo en la Práctica 1. El alumno ensam-
blará y ejecutará un programa, que se le proporciona, en ensamblador, compro-
bando cómo se modifican registros y memoria (incluida la pila) Para ello seguirá
la secuencia de tareas indicada en la misma.
La Actividad 2.2 consiste en aprender cómo se utiliza el entorno Keil µVi-
sion®4 programando en alto nivel. Además, a partir de un programa en C, con la
misma funcionalidad que el suministrado en Actividad 2.1, se comprobará el
código ensamblador que genera el compilador comprándolo con el realizado
directamente en ensamblador y viendo qué registros y posiciones de memoria se
modifican, así como el uso que se hace de la pila.

2.1. actividad 2.1. Programación modular y pila i (no presencial)

En esta actividad se va a analizar un programa para consolidar ciertos conoci-


mientos básicos acerca de la programación modular (en este caso con un progra-
" " " " " " " " " " " " "
" " " " " " " " " " " " " " "
" " " " " " " " " " "

" 18 " " " " " "" "


Prácticas de laboratorio de sistemas electrónicos digitales "
" " " " " " " " " " " " " "
" ma " " en ensamblador" que llama " a " una "rutina" y ésta
" "a su vez llama " " a otra) y el uso
" " " "
" de" la
" pila" "en "el microcontrolador
" " " " " LPC1768.
" " " Para
" "ello,
" se" ejecutará el programa
" " "
" " paso a paso
" " y se observarán
" los
" " valores
" " " que van tomando
" " ciertas" variables,
" " posi- " "
ciones
" de memoria,
" " la pila, el
" " puntero
" " de pila, etc.
" " En la
" Figura
" " "2.1 se muestra
" " " el " "
entorno de simulación con Keil µVision®4, indicando los controles relativos a los
" " " " " " " " " " " " " " "
registros y la memoria.
"

/̋ŒæøÆ̇"
4̋̌Æœßøæœ"

"
Figura 2.1.
" E"ntorno" dE" simulación
" .

" " " " " "" "


2.1.1. Programa en ensamblador

El Programa 2.1 muestra el código fuente contenido en el fichero


pila_en_asm.s, que se encuentra en el aula virtual. Dicho programa cuenta de dos
rutinas: rutina Multiplica y desde esta a su vez se llama a la rutina Suma.
Descárguelo desde el Aula Virtual, ensámblelo sin errores, entre en el simulador
y continúe con los siguientes pasos.
" " " " " " "

" " " "


" " " " " " " " " " " " " " "
" " " " " " " " " " " " " " " " "
" Práctica
" " "2 - "Programación
" " modular y Pila " " " " " " " " 19 " "
" " " " " " " "

"

"
Programa "
2.1.
"
c ódigo En Ensamblador Para El Estudio dE los modos
" " " " " " " " " " "
dE dirEccionamiEnto.
" " " " " " " " " " " " " " "
" " de
Antes " realizar la simulación
" " del
" programa,
" " indique
" " con qué instrucciones se

" realizan saltos a subrutinas y qué instrucciones modifican el contenido de la pila.

" " " " " "


" " " " " "
" " " " " " " " "
" " " " " " " " " " " " "
2.1.2. " Simulación
" " " y "depuración
" " del" proyecto
" " ""
" " el Programa
Simule " " " 2.1, como
" " se indica
" " a continuación,
" y" "compruebe
" " " la eje- " "
""
cución del mismo. Repita la simulación del programa cuantas veces se consi-
"

" " " " " " " "


20 Prácticas de laboratorio de sistemas electrónicos digitales

dere necesario, para hacer un seguimiento y ver la utilidad de las ventanas que
se indican.

1. Identifique cuáles son la dirección de inicio del programa principal y el


valor del puntero de pila.

2. Inserte un breakpoint en la línea 27 e inicie la ejecución continua,


• Compruebe los registros que se han modificado y su nuevo contenido.
• Compruebe la dirección en la que se ha detenido el PC.

3. Continúe ejecutando el programa paso a paso, comprobando los valores


que van adquiriendo r2, r1 y r0 y anote los valores del LR y PC antes de
ejecutar BL.W Multiplica.

4. Tras ejecutar la instrucción BL.W Multiplica:


• Compruebe el valor que adquieren los registros LR y PC.
• Explique qué ha sucedido al ejecutar dicha instrucción.

5. Una vez se haya saltado a la rutina Multiplica siga ejecutando paso a


paso y compruebe e indique:
• Al ejecutar PUSH {lr} qué posiciones de memoria se modifican y con
qué contenido (obsérvelo en una de las ventanas de memoria a partir del
valor conocido del puntero de pila).

• Tras ejecuta la instrucción BL.W Suma:


¡ Compruebe el valor que adquieren los registros LR y PC.

¡ Explique qué ha sucedido al ejecutar dicha instrucción.


Práctica 2 - Programación modular y Pila 21

6. Una vez se haya ejecutado el salto a la rutina Suma siga ejecutando paso a
paso e indique:
• Qué hace dicha rutina.
• Razone por qué no se ha utilizado aquí la instrucción PUSH {lr} ni
posteriormente POP {pc}.

• ¿Qué sucede al ejecutarse BX lr?


¡ ¿Se modifica el puntero de pila?

¡ ¿Qué registros se modifican?

¡ ¿Cuál es la siguiente instrucción que se va a ejecutar (observe el valor

del contador de programa) y en qué posición se encuentra con res-


pecto a BL.W Suma?
¡ ¿Qué operando devuelve la rutina Suma a la rutina Multiplica y

en qué registro?

7 . Una vez se ha ejecutado BX lr en la rutina Suma:


• ¿Cuáles son las siguientes instrucciones a ejecutarse y qué registros se
modifican? ¿Con qué valores?

8. ¿Qué función realiza la instrucción POP {pc}?


• Relacione esta funcionalidad con PUSH {lr} e indique por qué era
necesario utilizar esta última.

9. Cuando se vuelve al programa principal ¿qué función realizan las dos ins-
trucciones siguientes y qué registros o posiciones de memoria se modifi-
can? ¿con qué valores?
• LDR r1,=dato
• STR r0,[r1,#0x00]
" " " " " " " " " " " " "
"

"

22 " " " " " " de laboratorio


Prácticas " de" sistemas electrónicos
" " digitales
" " "
" " " " " " " " " " " "
" " ""
10. Razone por qué no se ha utilizado en ninguna de las dos rutinas las ins-
" " PUSH ri y POP " ri.
trucciones
"

" " " " " " " " " " " " " " " "
" "
2.2. actividad 2.2. Programación modular y pila ii (Presencial)
"
En la Actividad 2.2 se sigue trabajando con el mismo objetivo de la Actividad
2.1, y se hace uso de las herramientas que proporciona Keil µVision®4 para el
seguimiento
" de la pila, así" como
" de ciertas variables" en memoria "y "registros
" "del
microprocesador LPC1768. En este caso la funcionalidad se programa en C y se
analiza" la" correspondencia
" " " entre" C y ensamblador.
" " " " " " " " " " "
" " " " " " " " " " " "
" " " " " " " " " "
2.2.1. Utilización" de" Breakpoints
" " " " " " " " " " "

Los breakpoints
" o puntos
" " de ruptura son " marcas que podemos colocar delante
de las líneas de código para ayudar a depurarlo durante la simulación. Evitan, por
ejemplo," tener que ejecutar
" " paso " a" paso una " porción
" de "código
" que lleva " mucho" " "
" " " " " " "
tiempo y sabemos a priori que funciona correctamente. De este modo, permiten " " " " "
ejecutar "el "programa
" y" que éste" quede " detenido " "cuando " se encuentre
" una" "línea que " " "
" " " " " " "
se ha marcado en el simulador con un breakpoint. A partir de ahí, se puede seguir " " " " "
"
ejecutando paso a" paso" para" depurar " " cuidadosamente
" " " el" código que" sigue" o" seguir " "
" " " " " " "
ejecutando el programa hasta que se encuentre el siguiente breakpoint, etc. " " " " "
" " " " " " " " " " ""
Para "insertar un" breakpoint,
" sitúese
ı " en una línea
" "de código
" y hacer
" "click en " " "
.""""
" " " " " " " " " " " " "
Existen muchas otras posibilidades de utilizar breakpoints a través de la ven-
tana" de comandos,
" " "
por ejemplo, condicionalmente. " recomienda
Se " " consultar" el " " "
" " " " "" ®
comando breakset en la ayuda del entorno Keil µVision 4, pestaña ‘índice’.
" " " "
2.2.2." Programa" en C
" " " " " " " " " " " "
" " " " " " " " " " ""
El Programa 2.2 Pila_en_c.c que se encuentra disponible en el Aula Virtual y
"
cuyo código se muestra a continuación, será "utilizado en el desarrollo de esta acti-
" " " " "
vidad.
" " " " " " "
"
" "
"
"" " " "
"" "
" " " " " " " " " " " " " "
" " " " " " " " " " " " "
" " " " ""

" " " "


"
Práctica " "
2 - Programación "
modular" y Pila
" " " " " " " " 23
" " "
" " " " " " " " " " ""
11f ge nc tcek „p" hw pekq pgu "
11fgenctcek„p"hwpekqpgu"
kpv"Uwoc*kpv"c."kpv"d+="
k pv"Uwoc*kpv"c."kpv"d+="
kpv"Ownvkrnkec*kpv"c."kpv"d."kpv"e+="
k pv"Ownvkrnkec*kpv"c."kpv"d."kpv"e+="
"
kpv"ockp*xqkf+"
k pv"ockp*xqkf+"
}"
} "
""fcvq?Ownvkrnkec*7.":."32+="
""fcvq?Ownvkrnkec*7.":."32+="
""yjkng*3+="
""yjkng*3+="
"
" " "" " " " "
11"hwpek„p"swg"uwoc"c-d""
1 1"hwpek„p"swg"uwoc"c-d""
kpv"Uwoc*kpv"c."kpv"d+"
}"
" ""kpv"vgor="" " " " 11"xctkcdng"vgorqtcn"
" " " " " "
""vgor?"c-d="
""tgvwtp"vgor="
"
""
11"hwpek„p"swg"ecnewnc"fcvq?"e,*c-d+""
kpv"Ownvkrnkec*kpv"c."kpv"d."kpv"e+"
}"
""kpv"vgorauwoc=" " " 11"xctkcdng"vgorqtcn"
""kpv"vgor="""""" " " 11"xctkcdng"vgorqtcn"
""vgorauwoc"?"Uwoc*c.d+=" 11"Ncoc"c"nc"hwpek„p"uwoc"
""vgor?"e,vgorauwoc="
""tgvwtp"vgor="
"
"
Programa 2.2. código En lEnguajE c Para El Estudio dE la Pila.
" " " " " " " " " " " "

2.2.3." Análisis" del


" código
" ensamblador
" generado
" " a partir
" del
" código
" " en
" C
" " " " " " " " " " " " " " "
1. En este primer
" " " apartado
" se pretende
" " " " comparar
" el código
" fuente
" " en ensam-
" " " "
"blador
" del fichero Pila_en_asm.s, con el código fuente en C del" fichero
" " " " " " " " " " " "
"
Pila_en_c.c. Para ello, complete la Tabla 2.1 con el código en C que rea-
lizaría" la "misma funcionalidad
" " " que el" código" en" ensamblador
" " " indicado.
" "
"
" " " " " "
" " "
" "
" "" " """"
" " " " "
"
" " "
" "
" " "
" " " """ "
" """""""" " ""
" """"""" " "
""""
"
"
"
" " "
" "
" " " " "
" " " " "
" " " " "
24 Prácticas de laboratorio de sistemas electrónicos digitales

Tabla 2.1. Comparación entre los códigos fuentes en los lenguajes C y


ensamblador
Código ensamblador (Pila_en_asm.s) Código C (Pila_en_C.c)
Función Suma

Suma ADD r0,r0,r1


BX lr

Función Multiplica

Multiplica PUSH {lr}


BL.W Suma
MUL r0,r0,r2
POP {pc}

Programa principal

MOVS r2,#0x0A
MOVS r1,#0x08
MOVS r0,#0x05
BL.W Multiplica
LDR r1,=dato
while STR r0,[r1,#0x00]
B while

2. Tras compilar el programa Pila_en_c.c, inicie el simulador y en la venta-


na de desensamblado compruebe que se ha generado un código ensambla-
dor similar al mostrado a continuación en el Programa 2.3.
" " " " " " "
Práctica 2 - Programación modular y Pila 25
"
3;<"}""
""""42<""kpv"vgor=""""""11"xctkcdng"vgorqtcn""
2z222223C6"6824""""""OQX""""""t4.t2"
""""43<""vgor?"c-d=""
""""44<""tgvwtp"vgor=""
2z222223C8"3:72""""""CFFU"""""t2.t4.t3"
""""45<" ""
""""46<""""
""""47<"11"hwpek„p"swg"ecnewnc"fcvq?"e,*c-d+"""
""""48<"kpv"Ownvkrnkec*kpv"c."kpv"d."kpv"e+""
2z222223C:"6992""""""DZ"""""""nt"
""""49<"}""
""""4:<""kpv"vgorauwoc="11"xctkcdng"vgorqtcn""
""""4;<""kpv"vgor=""""""""""11"xctkcdng"vgorqtcn""
2z222223CC"G;4F63H2""RWUJ"""""}t6/t:.nt "
2z222223CG"6827""""""OQX""""""t7.t2"
2z222223D2"682G""""""OQX""""""t8.t3"
2z222223D4"6836""""""OQX""""""t6.t4"
""""52<""vgorauwoc"?"Uwoc*c.d+=""""11"Ncoc"c"nc"hwpek„p"uwoc""
2z222223D6"6853""""""OQX""""""t3.t8"
2z222223D8"684:""""""OQX""""""t2.t7"
2z222223D:"H9HHHHH6""DN0Y"""""Uwoc"*2z222223C6+"
2z222223DE"6829""""""OQX""""""t9.t2"
""""53<""vgor?"e,vgorauwoc=""
2z222223DG"HD26H:29""OWN""""""t:.t6.t9"
""""54<""tgvwtp"vgor=""
2z222223E4"6862""""""OQX""""""t2.t:"
""""55<" ""
2z222223E6"G:DF:3H2""RQR""""""}t6/t:.re "
""""34<""fcvq?Ownvkrnkec*7.":."32+=""
""""35<"""
2z222223E:"442C""""""OQXU"""""t4.%2z2C"
2z222223EC"432:""""""OQXU"""""t3.%2z2:"
2z222223EE"4227""""""OQXU"""""t2.%2z27"
2z222223EG"H9HHHHGE""DN0Y"""""Ownvkrnkec"*2z222223CC+"
2z222223F4"6;24""""""NFT""""""t3.]re.%:_""="B2z222223FE"
2z222223F6"822:""""""UVT""""""t2.]t3.%2z22_"
""""36<""yjkng*3+=""
2z222223F8"DH22""""""PQR"""""""
2z222223F:"G9HG""""""D""""""""2z222223F:"
"
" Programa 2.3. código dEsEnsamblado En lEnguajE c dEl Programa
" " "
PilA_en_C.C.
" " " " " " "

" "
Compárelo con el código ensamblador del fichero Pila_en_asm.s, incluyendo
en la Tabla 2.2 el código del fichero Pila_en_asm.s que corresponde con el códi-
go obtenido del desensamblado del fichero en C que se muestra.
26 Prácticas de laboratorio de sistemas electrónicos digitales

Tabla 2.2. Comparación del Código desensamblado en lenguaje C y en


ensamblador
Código ensamblador del fichero
Desensamblado del fichero Pila_en_C.c
Pila_en_asm.s
Función Suma
0x000001A4 4602 MOV r2,r0
0x000001A6 1850 ADDS r0,r2,r1
0x000001A8 4770 BX lr

Función Multiplica
0x000001AA E92D41F0 PUSH {r4-r8,lr}
0x000001AE 4605 MOV r5,r0
0x000001B0 460E MOV r6,r1
0x000001B2 4614 MOV r4,r2
0x000001B4 4631 MOV r1,r6
0x000001B6 4628 MOV r0,r5
0x000001B8 F7FFFFF4 BL.W Suma
(0x000001A4)
0x000001BC 4607 MOV r7,r0
0x000001BE FB04F807 MUL r8,r4,r7
0x000001C2 4640 MOV r0,r8
0x000001C4 E8BD81F0 POP {r4-r8,pc}

Programa principal
0x000001C8 220A MOVS r2,#0x0A
0x000001CA 2108 MOVS r1,#0x08
0x000001CC 2005 MOVS r0,#0x05
0x000001CE F7FFFFEC BL.W Multiplica
(0x000001AA)
0x000001D2 4902 LDR r1,[pc,#8]
0x000001D4 6008 STR
r0,[r1,#0x00]
0x000001D6 BF00 NOP
0x000001D8 E7FE B 0x000001D8

3. Explique las diferencias encontradas y el porqué de las mismas.

2.2.4. ejecución del programa

1. Una vez generado el proyecto basado en el programa Pila_en_c.c y com-


pilado, realice los pasos siguientes:
Práctica 2 - Programación modular y Pila 27

1. Inicie el simulador y antes de ejecutar compruebe en qué posiciones de


memoria se han almacenado las variables suma y dato, ayudándose para
ello de la ventana symbols.

2. Compruebe en qué direcciones de memoria comienza el código de las fun-


ciones Suma y Multiplica (ventana symbols) y visualice el contenido de
dichas posiciones de memoria. Obtenga una captura de la ventana de
memoria donde aparece.

3. Compruebe cuál es el valor inicial de los registros LR y PC antes de la eje-


cución del programa.

4. Se procederá ahora a ejecutar el programa paso a paso. Para ello, una vez
iniciado el simulador haga clic sobre el código en ensamblador de la ven-
tana disassembly. De esta manera al ejecutar paso a paso con F11 (step
one line) ejecutaremos cada una de las instrucciones en ensamblador. De
no hacerlo así, cada paso será cada una de las sentencias de C. Ejecute
paso a paso hasta que entre en la función Multiplica y deténgase
justo antes de la llamada a la función Suma, sin llegar a ejecutarla. En la
ventana de desensamblado la flecha amarilla debe quedar en la línea mos-
trada en la Figura 2.2.
" " " " " " " " " " " " " " " " " "
" " " " " " " " " " " " " " " "
" " " " " " " " "" " " " " "
" " " " " " " " " " " " " " " " "
" " " " " " " " " " " " " " " " " "
28 " " " " " " " " " " " "
Prácticas de laboratorio de sistemas electrónicos digitales "
" "
" " " " " " " " "

"
Figura "2.2." VEntana
" " dE dEsEnsamblado
" .

" " " " cuál


a. Compruebe " es "el nuevo
" " valor
" " registros
de los " " " LR y PC.

"

" " " " " " " " " " " " " " " "
b. Compruebe
" " cuál
" "es" el "nuevo valor" del
" registro
" SP y, en caso de haberse
modificado, indique el contenido que se ha almacenado en pila.
" " " " " " " " " " " " " " "
"
5. Localice " "
e indique " "qué
en " posiciones
" "
de memoria o registros se almace-
"
nan las variables temporales temp_suma y temp de la función Mul-
tiplica.
" " " " " " " " " " " " " " " " "
" " " " " " "

" 6. Continúe con la ejecución paso a paso hasta entrar en la función Suma.
Detenga la ejecución según se indica en la Figura 2.3.

" " " " " " " "


Práctica 2 - Programación modular y Pila 29
" "" " " " "

"
Figura 2.3.
" " VEntana
" " dE dEsEnsamblado
" " " al
" inicio
" dE la Función SUmA.
" "

" " " "


a. Compruebe " " es ahora
cuál " " el" valor de" los" "registros
" LR y PC.
"

" " " " " " " " " " " " " " " "
b. Compruebe el valor del SP y en caso de haberse modificado indique qué
" " "
se ha almacenado en pila.
"

" " " " " " " " " " " " " " " " "
" " 7. "Continúe ejecutando paso" a paso
" " para" salir de" la" función Suma
" " y detenga
" "
" " la ejecución antes
" " de
" la sentencia
" " temp=c*temp_suma.
" " " " Localice
" " en qué
" "
registros" o posiciones
"
de
" "
memoria se" encuentran
" "
los operandos de dicha
"
sentencia y dónde se almacena el resultado. Copie imágenes del simulador
" que evidencien la localización de esos datos.

" " " " " " " " " " " " " "
" " " " " " " " " " " " " " " "
8.
" Tras ejecutarse la sentencia return temp de la función Multiplica
indique qué registros y direcciones de memoria se modifican. Explique
" cómo se utiliza la pila por parte de esta instrucción.
Práctica 3

Puertos de e/s y tarjeta de desarrollo

introducción

En esta práctica se va a estudiar el manejo de los puertos, la depuración de pro-


gramas mediante el analizador lógico y la ejecución de programas sobre la tarje-
ta de desarrollo LPC1768-Mini-DK2, mediante la utilización del adaptador J-
Link de Segger. Los programas de ejemplo abordarán el uso de los puertos de
entrada/salida de propósito general (GPIO) del microcontrolador LPC1768, estu-
diados en teoría.
La práctica está dividida en dos sesiones (dos semanas). En la primera sesión
se estudia cómo manejar y simular el funcionamiento de los puertos haciendo uso
del analizador lógico y ventanas de simulación. En la segunda sesión se estudia
cómo descargar y depurar los programas en la tarjeta.

3.1. Manejo y simulación del funcionamiento de los puertos

Actividad 3.1.1: Puertos, simulador y analizador lógico (I) (No presencial)

Lea el Anexo V y pruebe el ejemplo de utilización del analizador lógico ejecu-


tando el primer programa del Anexo V (Programa V.1), mostrando el valor de la
variable ‘i’ en el analizador lógico. (Adjunte ventana del simulador y analizador).

Actividad 3.1.2: Puertos, simulador y analizador lógico (II) (Presencial)

Analice y simule el ejemplo de utilización de los puertos del Anexo V (Pro-


grama V.2), visualizando en el analizador lógico los 4 bits implicados (adjunte
captura de la ventana del simulador y analizador). Siga el procedimiento indica-
do en dicho Anexo para la modificación interactiva de variables y visualice el
32 Prácticas de laboratorio de sistemas electrónicos digitales

funcionamiento del programa en la ventana del puerto P0 (pestaña Peripherals à


GPIO Fast Interface à Port0)
Pruebe también a realizar la modificación de variables mediante una ventana
Watch, bien escribiendo el nombre de la variable o arrastrándola hasta la ventana.

3.2. tarjeta de desarrollo, carga y depuración de programas

Introducción a la tarjeta LPC1768-Mini-DK2

La tarjeta LPC1768-Mini-DK2 dispone de 2 LEDs, LED1 y LED2, conecta-


dos a los terminales P3.25 y P3.26. Ambos se activan con un nivel bajo. También
incluye otro LED para indicar que la tarjeta está alimentada. Además dispone de
3 pulsadores de propósito general: P2.10 (ISP), P2.11 (Key1) y P2.12 (Key2), y
uno de Reset.
En la Figura 3.1 se puede observar la localización de los LEDs y pulsadores
en la tarjeta, y en la" Figura 3.2 la
" conexión
2ø³̊ßÆ̊̇œ"¸̋"Ø̇̈æø̇ßæøÆæ"¸̋"5Æœß̋Œ̇œ"'Ø̋̊ßø
" " " eléctrica de
" los mismos.
ºÆ̊æœ"&Æ̌Æß̇Ø̋œ"
"

Figura 3.1. tarjeta de desarrollo lPc1768-Mini-dK2.

(Æ̌­ø̇"ぬ
" な ""6̇øª̋ß̇"¸̋"¸̋œ̇øøæØØæ".2%なばはぱ
" " " /ÆºÆ &-に "

"
"
(Æ̌­ø̇"ぬ
" な ""6̇øª̋ß̇"¸̋"¸̋œ̇øøæØØæ".2%なばはぱ
" "
Práctica 3 - Puertos de e/s y tarjeta de desarrollo
" /ÆºÆ &-に " 33
"

"
Figura (Æ̌­ø̇"ぬ
3.2. c" onexión
に ""%æº̋®Æde " led
" los " " la lPc1768-M
s "y""ı­Øœ̇¸æø̋œ"̋º"Ø̇".2%なばはぱ
º"¸̋"Øæœ".'&œ"
" Pulsadores" en ini" -dK2.
/ÆºÆ &-に

""#̊ßƩƸ̇¸"ぬ" に な ""6̇øª̋ß̇"¸̋"¸̋œ̇øøæØØæ
" " ""̊̇ø̌̇"" ""¸̋ı­ø̇̊Æ º"¸̋"ıøæ̌ø̇Œ̇œ"
" " " 0æ"2ø̋œ̋º̊Æ̇Ø
" "
Actividad
2̇ø̇"Ø̇"ø̋̇ØÆ
" " 3.2.1: Tarjeta de desarrollo, carga y depuración
̇̊Æ º"¸̋"̋œß̇"̇̊ßƩƸ̇¸"¸̋̈̋"œ̋̌­Æø"Øæœ"œÆ̌­Æ̋ºß̋œ"ı̇œæœ
" " " " " " " " de " programas
(No Presencial)
な " .̋̇"̋Ø"#º̋®æ"8+
" " " "")­Þ̇"¸̋"̊æº̨Æ̌­ø̇̊Æ
" " º"¸̋Ø"̇¸̇ıß̇¸æø",
" " " .ƺŁ"ı̇ø̇"̊̇ø̌̇"
" " " ""¸̋ı­ø̇̊Æ º "
" Para
" la realización" de " esta actividad
" " debe seguir
" " los siguientes pasos:
に " #º̇ØÆ̊̋"Ø̇"̨­º̊Ææº̇ØƸ̇¸"¸̋Ø"ıøæ̌ø̇Œ̇"¸̋Ø"#º̋®æ"8+"&̋ı­ø̇̊Ææº,.+0-" " 2øæ̌ø̇Œ̇"8+" な"
ぬ " /æ¸Æ̨Æł­̋"̋Ø"ıøæ̌ø̇Œ̇"&̋ı­ø̇̊Ææº,.+0-
1." Lea ̊"ı̇ø̇"ł­̋"̊­̇º¸æ"̋œßÎ"ı­Øœ̇¸æ"̋Ø"ı­Øœ̇¸æø"-';に"
" el Anexo" VI. Guía de configuración
" " del" adaptador
" J-Link
" para" carga
" y " "
ıø渭 ̊̇"ł­̋"̋Ø".'&"&な
" depuración.
" " " ""̊æº̋̊ß̇¸æ"̇Ø"ıƺ"ぬ
" " " にの"̊̇Œ̈Æ̋"¸̋"̋œß̇¸æ"̊̇¸̇"ばのど"Œœ
" " " " " " " ""ł­̋"̊­̇º¸æ"
" "
̋Ø"ı­Øœ̇¸æø"-';に"ºæ"̋œßÎ"ı­Øœ̇¸æ"̋Ø".'&"に"̊æº̋̊ß̇¸æ"̇Ø"ıƺ"ぬ
" 2. "Analice" la" funcionalidad
" " "del programa
" " " " VIには"̊̇Œ̈Æ̋"¸̋"̋œß̇¸æ"̊̇¸̇"にのど"
del "Anexo " " "
depuracionjlinK " " "
Œœ ""+º̊Ø­ ̇"̋Ø"̊" ¸Æ̌æ"̨­̋ºß̋"ø̋̇ØÆ
"(Programa "VI.1) " ̇¸æ"̊æŒæ"̋©Æ¸̋º̊Æ̇
" " "
" 3. Modifique el programa depuracionjlinK.c para que cuando esté pulsado
el pulsador KEY2 produzca que el LED D1, conectado al pin 3.25 cambie
" de estado cada 750 " ms, y que cuando el pulsador KEY2 no esté pulsado el
LED 2 conectado al pin 3.26 cambie de estado cada 250 ms. incluya el
código fuente realizado como evidencia.

なは"" " &̋ı̇øß̇Œ̋ºßæ"¸̋"'Ø̋̊ßø


" " ºÆ̊̇ ""7ºÆ©̋øœÆ¸̇¸"¸̋"#Ø̊̇س
" " "
Actividad 3.2.2: Tarjeta de desarrollo, carga y depuración de programas
(II) (Presencial)

En esta parte de la práctica se van a afianzar los conocimientos adquiridos en la


Actividad 3.2.1, continuando con el manejo de las herramientas que proporciona
34 Prácticas24>%6+%#"ぬ" " " ""2­̋øßæœ"¸̋"'
de laboratorio " electrónicos
de sistemas " 5"" ""6̇øª̋ß̇"¸̋"¸̋œ̇øøæØØæ"
" "
digitales "

#̊ßƩƸ̇¸"ぬ" に に ""6̇øª̋ß̇"¸̋"¸̋œ̇øøæØØæ
" " ""̊̇ø̌̇"" ""¸̋ı­ø̇̊Æ º"¸̋"ıøæ̌ø̇Œ̇œ"
" " " ++ " 2ø̋œ̋º̊Æ̇Ø "
Keil µVision®4. Se trata de continuar con la tarea desarrollada en la actividad 3.2.1
'º"̋œß̇"ı̇øß̋"¸̋"Ø̇"ıø³̊ßÆ̊̇"œ̋"©̇º"̇"̨̇Æ̇º
" " y "desarrollar,
" " " " presencial,
de forma " " ̇ø"Øæœ"̊æºæ̊ÆŒÆ̋ºßæœ"̇¸ł­ÆøƸæœ"̋º"Ø̇"#̊ßƩƸ̇¸"ぬ
un" programa
" "
en C de configuración " y "manejo
" de " に な "
̊æºßƺ­̇º¸æ" " ̊æº" " ̋Ø"
" Œ̇º̋ªæ" " ¸̋"" Ø̇œ"
" ̶̋øø̇ŒÆ̋ºß̇œ" " ł­̋"" ıøæıæø̊Ææº̇" "
puertos, así como descargarlo en la tarjeta utilizando el adaptador J-Link.-̋ÆØ"
" ヅ8ÆœÆæº kね " 5̋"" ßø̇ß̇"" ¸̋""

̊æºßƺ­̇ø"" ̊æº"" Ø̇"" ß̇ø̋̇"" ¸̋œ̇øøæØØ̇¸̇"" ̋º"" Ø̇"" ̇̊ßƩƸ̇¸"" ぬ に な"" " ¸̋œ̇øøæØØ̇ø " ¸̋"̨æøŒ̇"
" " ıø̋œ̋º̊Æ̇Ø " ­º""
" " " "
ıøæ̌ø̇Œ̇"̋º"%"¸̋"̊æº̨Æ̌­ø̇̊Æ º"" ""Œ̇º̋ªæ"¸̋"ı­̋øßæœ
" " ""̇œÞ"̊æŒæ"¸̋œ̊̇ø̌̇øØæ"̋º"Ø̇"ß̇øª̋ß̇"­ßÆØÆ
" " " " " " ̇º¸æ""
"
̋Ø"̇¸̇ıß̇¸æø"," .ƺŁel" programa modificado en la actividad no presencial:
sobre
" " "
• Visualice " " del
5æ̈ø̋"̋Ø"ıøæ̌ø̇Œ̇"Œæ¸Æ̨Æ̊̇¸æ"̋º"Ø̇"̇̊ßƩƸ̇¸"ºæ"ıø̋œ̋º̊Æ̇Ø
el estado " pulsador " Key2 " en tiempo" real. Para ello se debe

" "mostrar" el estado


‚"" 8Æœ­̇ØÆ̊̋"̋Ø"̋œß̇¸æ"¸̋Ø"ı­Øœ̇¸æø"-̋
" del" pin に"̋º"ßÆ̋Œıæ"ø̋̇Ø
2.12
" " a través" del analizador " lógico y" de la venta-
""2̇ø̇"̋ØØæ"œ̋"¸̋̈̋"Œæœßø̇ø"̋Ø"̋œß̇¸æ"¸̋Ø"
" " " " " "
na de gPio Fast interface, GPIO2.
" なに"̇"ßø̇©Îœ"¸̋Ø"̇º̇ØÆ
ıƺ"に " " " " ̇¸æø"Ø" ̌Æ̊æ"" ""¸̋"Ø̇"©̋ºß̇º̇"¸̋")2+1"(̇œß"+ºß̋ø̨̇̊̋
" " " " " " "")2+1に "
• Visualice en el osciloscopio la tensión de los pines P3.25 y P3.26 del puer-
‚"" 8Æœ­̇ØÆ̊̋"̋º"̋Ø"æœ̊ÆØæœ̊æıÆæ"Ø̇"ß̋ºœÆ
" to
" 3" durante el funcionamiento
" " º"¸̋"Øæœ"ıƺ̋œ"2ぬ
" del
" programa
" にの"" ""2ぬ には"¸̋Ø"ı­̋øßæ"ぬ"¸­ø̇ºß̋"̋Ø"
" desarrollado "en el" apartado " "2. " "
̨­º̊Ææº̇ŒÆ̋ºßæ" " ¸̋Ø"
" ıøæ̌ø̇Œ̇" " ¸̋œ̇øøæØØ̇¸æ" " ̋º" " ̋Ø"
" ̇ı̇øß̇¸æ" "
Compare lo obtenido entre ambos pines. Si hay diferencia, explique a qué に " %æŒı̇ø̋" " Øæ"
" æ̈ß̋ºÆ¸æ" " ̋ºßø̋"
"
̇Œ̈æœ"" ıƺ̋œes" 5Æ"" ̶̇ " ¸Æ̨̋ø̋º̊Æ̇
debida. ̋®ıØÆł­̋"
anote los "valores " ̇""tensión
de ł­Î"" ̋œ""obtenidos
¸̋̈Ƹ̇ ""#ºæß̋"
en cada" Øæœ""caso
©̇Øæø̋œ"
y mida " ¸̋"" ß̋ºœÆ º""
æ̈ß̋ºÆ¸æœ"" el
̋º"periodo
" ̊̇¸̇"" ̊̇œæ"
de la " ŒÆ¸̇"
" señal " ̋Ø"" ı̋øÆæ¸æ"
visualizada " ¸̋"" adjuntarlo
para Ø̇"" œ̋ó̇Ø"" ©Æœ­̇ØÆ ̇¸̇"" ı̇ø̇"" ̇¸ª­ºß̇øØæ""
como evidencia.
̊æŒæ"̋©Æ¸̋º̊Æ̇
" "

"

&̋œ̇øøæØØæ"¸̋"­º"ıøæ̌ø̇Œ̇"ı̇ø̇"̊æº̨Æ̌­ø̇̊Æ
"desarrollo
" " " "
de un programa º"" ""Œ̇º̋ªæ"¸̋"Øæœ"ı­̋øßæœ"
para configuración y" manejo
" " de los puertos
"
'Ø"" ıøæ̌ø̇Œ̇"̇"¸̋œ̇øøæØØ̇ø"¸̋̈̋ø³"̌̋º̋ø̇ø"­º̇"œ̋ó̇Ø"¸Æ̌Æß̇Ø"¸̋"
" "El programa "a desarrollar
" " generar
deberá " "una señal " な* ""̊æº"­º"̊Æ̊Øæ"¸̋"ßø̇̈̇ªæ"
" digital " " con un
de 1Hz " ciclo
" " ł­̋""
¸̋ı̋º¸̋ø³"" ¸̋" ¸æœ"" ̋ºßø̇¸̇œ
de "trabajo " &な"" &ど "de
que dependerá 'Ø""dos
̋œł­̋Œ̇" " ¸̋""D1
entradas, Øæœ""D0.
ß̋øŒÆº̇Ø̋œ" " ̋ŒıØ̋̇¸æœ"
El esquema " œ̋"" Œ­̋œßø̇"" ̋º"" Ø̇""
de los terminales
(Æ̌­ø̇"ぬ" ぬ "" empleados se muestra en la Figura 3.3.

ヰ"
7ヰ
7 ヰくヰ"
vヰくヰ
v vンくヲヵ"
""vンくヲヵ ;7"7ヱ"
]];7"7ヱ
7ヱ"
7ヱ ヰくヱ"
vヰくヱ
v
v1ヱΑヶΒ"
]]v1ヱΑヶΒ
} ヲヲ""
ヲくヱヲ"
vヲくヱヲ
v
ふふ[; ヲぶぶ"
[; ヲ
"
Figura 3.3." tぬerMinales
(Æ̌­ø̇"ぬ "eMPleados" Para
" "el PrograMa
" " a desarrollar
""6̋øŒÆº̇Ø̋œ"̋ŒıØ̋̇¸æœ"ı̇ø̇"̋Ø"ıøæ̌ø̇Œ̇"̇"¸̋œ̇øøæØØ̇ø " .

2̇ø̇"̋œß̇̈Ø̋̊̋ø"̋Ø"©̇Øæø"¸̋"Ø̇œ"̋ºßø̇¸̇œ"&な"
" " " establecer
Para " " "el valor de" las" "entradas
"&ど"º̋̊̋œÆß̇ø³"̇Ø"Œ̋ºæœ"に"̊̇̈Ø̋œ"¸̋"̊æº̋®Æ
" " " necesitará
D1 y D0 " " al menos
" " 2 cables
º"̶̋Œ̈ø̇
"
̶̋Œ̈ø̇ ""æ"̈Æ̋º"œÆ"¸Æœıæº̋"¸̋"̊̇̈Ø̋œ"Œ̶̇̊æ
" de conexión
" " " " " ̶̋Œ̈ø̇"­ßÆØÆ̊̋"­º̇"ıØ̇̊̇"̈æ̇ø¸"ı̇ø̇"̊æº̋̊ß̇øØæœ
" " " " "
hembra-hembra, o bien si dispone de cables macho-hembra utilice " ""©̋ø""
(Æ̌­ø̇"ぬ
" ね ""'Ø"ºÆ©̋Ø"̇Øßæ"Øæ"æ̈ß̋º¸ø³"¸̋"̊­̇Øł­Æ̋ø"ıƺ"¸̋"̊æº̋̊ßæø"Ƹ̋ºßÆ̨Æ̊̇¸æ"̊æº"ぬ8ぬ
" placa
una " board
" " para conectarlos,
" " " " 3.4.
ver Figura " El nivel "alto lo obtendrá
" de" cual-" ""̋Ø"ºÆ©̋Ø"
" "
̈̇ªæ"¸̋"Øæœ"ıƺ̋œ"Ƹ̋ºßÆ̨Æ̊̇¸æœ"̊æº")0&
" " " quier "pin de conector " identificado
" "" con 3V3, y el nivel bajo de los pines identifi-
cados con GND.
(Æ̌­ø̇"ぬ
" ぬ ""6̋øŒÆº̇Ø̋œ"̋ŒıØ̋̇¸æœ"ı̇ø̇"̋Ø"ıøæ̌ø̇Œ̇"̇"¸̋œ̇øøæØØ̇ø
" " " " " " "

2̇ø̇"̋œß̇̈Ø̋̊̋ø"̋Ø"©̇Øæø"¸̋"Ø̇œ"̋ºßø̇¸̇œ"&な"
" " " " " " " " ""&ど"º̋̊̋œÆß̇ø³"̇Ø"Œ̋ºæœ"に"̊̇̈Ø̋œ"¸̋"̊æº̋®Æ
" " " " " " " º"̶̋Œ̈ø̇
"
̶̋Œ̈ø̇ ""æ"̈Æ̋º"œÆ"¸Æœıæº̋"¸̋"̊̇̈Ø̋œ"Œ̶̇̊æ
" " " " " " ̶̋Œ̈ø̇"­ßÆØÆ̊̋"­º̇"ıØ̇̊̇"̈æ̇ø¸"ı̇ø̇"̊æº̋̊ß̇øØæœ
" " " " " " ""©̋ø""
(Æ̌­ø̇"ぬ
" ね ""'Ø"ºÆ©̋Ø"̇Øßæ"Øæ"æ̈ß̋º¸ø³"¸̋"̊­̇Øł­Æ̋ø"ıƺ"¸̋"̊æº̋̊ßæø"Ƹ̋ºßÆ̨Æ̊̇¸æ"̊æº"ぬ8ぬ
" " " " " " " " " " " " " ""̋Ø"ºÆ©̋Ø"
" "
Práctica 3 - Puertos de e/s y tarjeta de desarrollo 35
̈̇ªæ"¸̋"Øæœ"ıƺ̋œ"Ƹ̋ºßÆ̨Æ̊̇¸æœ"̊æº")0&
" " " " " " ""

"
Figura 3.4." cねables
(Æ̌­ø̇"ぬ de
" conexión
""%̇̈Ø̋œ"¸̋"̊æº̋®Æ
" " heMbra
º"̶̋Œ̈ø̇ -heMbra
̶̋Œ̈ø̇" y Macho
" ""Œ̶̇̊æ -heMbra
̶̋Œ̈ø̇ " .

"
El modo de funcionamiento será el siguiente:

• Inicialmente el programa generará por la salida P3.25 una señal digital de


&̋ı̇øß̇Œ̋ºßæ"¸̋"'Ø̋̊ßø
" " 1Hz conºÆ̊̇
un""7ºÆ©̋øœÆ¸̇¸"¸̋"#Ø̊̇س"
" " del 40%.
ciclo de trabajo " なば""
• Cada vez que se presione el pulsador KEY2 se leerá el valor digital, D1 D0,
de los terminales P0.1 P0.0. Este código digital determina el nuevo ciclo de
trabajo, que corresponderá con el indicado en la Tabla 3.1.

Tabla 3.1. Código digita l y ciclo de trabajo


D1 D0 Ciclo trabajo
0 0 20%
0 1 40%
1 0 60%
1 1 80%

• Se generará la señal de salida de 1Hz con el nuevo valor de ciclo de traba-


jo hasta que se vuelva a presionar KEY2.
• Para las temporizaciones utilice la función delay_1ms() proporcionada
en esta práctica.

Para realizar este apartado siga la secuencia de tareas siguiente:

1. Desarrolle una función config_GPIO() que inicialice los puertos P0,


P2 y P3 de manera que los 4 terminales empleados estén configurados de
la manera adecuada. No considere en ningún caso que los bits de los regis-
tros correspondientes ya estaban en el valor adecuado. Asegure que su fun-
36 Prácticas de laboratorio de sistemas electrónicos digitales

cionamiento es el deseado (tenga en cuenta que debe configurar la función


de los pines, el modo de funcionamiento, si se trata de entrada o salida, si
debe inicializarlos a 0 ó 1, etc.).
En P2 configure el pin P2.12 como entrada y el resto como salida. En P0 con-
figure los pines P0.0 y P0.1 como entrada y el resto también como entrada.
En P3 configure el pin P3.25 como salida y el resto como entradas.

2. Genere la función main() del programa empleando las funciones con-


fig_GPIO() y delay_1ms(), de forma que se realice la funcionalidad
descrita.

3. Escriba el programa completo considerando todas las definiciones e “inclu-


des” necesarios.

4. Una vez generado el proyecto basado en el programa, descárguelo en la tar-


jeta mediante el adaptador J-Link y depure su funcionamiento. Escriba las
observaciones que crea pertinentes.
Práctica 4

controlador de interruPciones (nVic)

introducción

En esta práctica se aborda el aprendizaje y comprensión del funcionamiento del


controlador de interrupciones. En ella se analizará su funcionamiento mediante
simulaciones y utilizando las interrupciones externas del microprocesador. Para
ello, se parte de un programa ejemplo que debe simular, y contestar las cuestiones
indicadas como actividad no presencial antes de asistir a la actividad presencial.
La práctica está dividida en dos actividades:

• La Actividad 4.1 es no presencial y en ella se analizará y simulará el pro-


grama suministrado. El alumno compilará y ejecutará un programa en el
simulador, probará distintos casos de activación de las interrupciones y
modificará el valor de las variables para indicar la finalización de las ruti-
nas de atención a la interrupción.
• La Actividad 4.2 consiste en modificar el programa para que las interrup-
ciones se soliciten mediante la activación de ciertas entradas de los puertos
de propósito general, con lo que aunaremos en un mismo programa los
conocimientos adquiridos sobre puertos e interrupciones.

Para realizar la práctica presencial deberá asistir al laboratorio con el siguien-


te material:

• Placa para el montaje de componentes.


• 3 LEDs.
• 3 resistencias de valores entre 470 Ω y 1K Ω.
• Cables para realizar el montaje.

4.1. actividad 4.1. controlador de interrupciones i (no presencial)

En esta actividad se va a analizar un programa para consolidar ciertos conocimien-


tos básicos acerca del controlador de interrupciones en el microcontrolador LPC1768.
38 Prácticas de laboratorio de sistemas electrónicos digitales

Para ello, se analizará el programa que se suministra a continuación y se simulará para


observar la situación en la que se encuentran las interrupciones en cada momento.
Antes de comenzar lea con atención el Anexo VIII, “Resumen del Manejo de
Interrupciones en el LPC1768”.

4.1.1. Programa para la actividad

El Programa 4.1. main.c, que se encuentra en el Aula Virtual de la asignatura,


será utilizado en el desarrollo de esta actividad. Descárguelo (no lo copie del PDF
ya que le dará errores de compilación), compílelo sin errores, entre en el simula-
dor "y "continúe con
" "
los pasos
"
que se " indican" más adelante.

%kpenwfg">NRE39zz0J@"
"
ejct"c?3."d?3."e?3="
""
11Hwpekqpgu"swg"kpkekcnk|cp"ncu"kpvgttwrekqpgu"
xqkf"kpkekqRKPUGN*+}"
"11Eqphkiwtcek„p" fg" nqu" rkpgu" R4032" c" R4034." eqoq" gpvtcfcu" fg"
kpvgttwrek„p"
"NREaRKPEQP/@RKPUGN6"~?"3">>"*32,4+=""""
"NREaRKPEQP/@RKPUGN6"~?"3">>"*33,4+=""""
"NREaRKPEQP/@RKPUGN6"~?"3">>"*34,4+=""""
11Eqphkiwtcek„p"fg"nqu"rkpgu"R402"c"R404."eqoq"IRKQ"
"NREaRKPEQP/@RKPUGN6"(?"\"*5">>"*2,4++="""
"NREaRKPEQP/@RKPUGN6"(?"\"*5">>"*2,4++="""
"NREaRKPEQP/@RKPUGN6"(?"\"*5">>"*2,4++="""
"
"
xqkf"kpkekqKTSu*+}"
11Cukipcek„p"fg"rtkqtkfcfgu"
""PXKEaUgvRtkqtkv{Itqwrkpi*6+="
""PXKEaUgvRtkqtkv{*GKPV2aKTSp."2z6+="
""PXKEaUgvRtkqtkv{*GKPV3aKTSp."2z8+="
""PXKEaUgvRtkqtkv{*GKPV4aKTSp."2z4+="
"
11Jcdknkvcek„p"fg"ncu"kpvgttwrekqpgu"
""PXKEaGpcdngKTS*GKPV2aKTSp+="
""PXKEaGpcdngKTS*GKPV3aKTSp+="
""PXKEaGpcdngKTS*GKPV4aKTSp+="
"
"
11KUT"fg"ncu"kpvgttwrekqpgu"
xqkf"GKPV2aKTSJcpfngt*+}"
""NREaUE/@GZVKPV"~?"*3+="""11"Dqttct"gn"hnci"fg"nc"GKPV2"//@"GZVKPV02"
""NREaIRKQ4/@HKQUGV?2z22222223="""11"Cevkxct"gn"rkp"R402"
""yjkng*c+"="
""NREaIRKQ5/@HKQENT?2z22222223="""11"Fgucevkxct"gn"rkp"R402"
"
"
" "
"" " " " " """ " " " " " "
"" """ " " " " "
"" "
"" """ " " " " "
"
"" "
"
"
" " " "
" "
"" " " """
" " " " " " " "
"" """ " " " " "
Práctica
"" 4 - controlador
" " de interruPciones (nVic) 39
"" """ " " " " "
"
"
xqkf"GKPV3aKTSJcpfngt*+}"
""NREaUE/@GZVKPV"~?"*3">>"3+="""11"Dqttct"gn"hnci"fg"GKPV3"/@GZVKPV03"
""NREaIRKQ4/@HKQUGV?2z22222224="""11"Cevkxct"gn"rkp"R403"
""yjkng*d+="
""NREaIRKQ4/@HKQENT?2z22222224="""11"Fgucevkxct"gn"rkp"R403"
"
"
xqkf"GKPV4aKTSJcpfngt*+}"
""NREaUE/@GZVKPV"~?"*3">>"4+="""11"Dqttct"gn"hnci"fg"GKPV4"/@"GZVKPV04"
""NREaIRKQ4/@HKQUGV?2z22222226="""11"Cevkxct"gn"rkp"R404"
""yjkng*e+="
""NREaIRKQ4/@HKQENT?2z22222226="""11"Cevkxct"gn"rkp"R404"
"
"
11Rtqitcoc"rtkpekrcn"
ockp"*+""
}"
""kpkekqRKPUGN*+="
""kpkekqKTSu*+="
""yjkng*3+="
"
"
Programa 4.1.
" "código " main.c.
" "del ejemPlo
"

Para realizar la simulación, cargue la ventana del NVIC en el menú Periphe-


" rals/core Peripherals/neste Vectored " interrupt controller
" " (nVic)-
" ver" Figu-
" "
ra 4.1-. En esta ventana se pueden modificar de forma sencilla los registros del
NVIC. Esto permite simular la habilitación de una interrupción (enable), la soli-
citud de la misma (Pending), ver si está activa (active), modificar la prioridad
(Priority), cambiar de grupo de prioridad (PrigrouP), etc.
En este ejemplo la habilitación y asignación de prioridad las configurará el
código suministrado (se podrá ver ejecutándolo línea a línea), por lo que en esta
ventana se visualizarán dichas configuraciones, y desde la casilla de Pending se
podrá simular la solicitud de la interrupción correspondiente (en el caso mostra-
do en la siguiente figura sería la de EINT2)
" " " "" " "" " " " " " " " " " " " " " " ""
" " " " " " " "" " " " " "" " " " " " "
" " " " "
" " " " " " " " " " " " " "
" " " "
" " " " " " " " " "
" " " " " " " " " " "
" " "" " " " " " " " " " " " "
" " 40 " " "" " " " " " " " "" de"laboratorio
Prácticas " de " " electrónicos
" sistemas " " " digitales
" "" ""
" " " " " " "" " " " " "" " " " " " " " " " " " " " " "
" " " " " " " " " " " " " " "
" " " " " " " " " " " " "

"
Figura 4.1. Ventana del nVic.
" " " " "
"
" " " " " " " " " " " " " "
" " " " "
" Para" entender
" " el funcionamiento
" " del NVIC" " durante " " la habilitación
" "
y asigna- " " "
" " " ción de
" "" prioridades,
" " " se recomienda
" "" " que antes
" " " " de solicitar la
" " " " " interrupción se
" "" " " " pare " " ""
" la" ejecución
" " " "continua;
" " tras" " solicitarla
"" se" vuelva
"" " " a lanzar
" " " para
" "que" el programa
" " " pro-" " "
" " cese la
" solicitud,
" " "y a continuación
" la vuelva
" " a parar para
" " " poder comprobar" " su efec-
" " " "
" to, como" se" muestra " en la" secuencia
" de
" la " Figura
" 4.2. " " " " "

"""""""" """""""" "


" " " " " " " " " " " " " " " " " "
"""""""" """""""" "
" " Figura
" " " " " " " " " " " " " " "
" " " 4.2.
" secuencia
" " " a" seguir Para Ver " el " Funcionamiento
" " " del nVic durante
" " " " "
" " " la habilitación
" " " y asignación
" " " "
de Prioridades. " " " "
" " " " " "" " " " " " " " " " " " " " "
" " " " " " " " " " " " " "
"
" " " " "
"
Práctica 4 - controlador de interruPciones (nVic) 41

Dado que al ejecutar el código se están configurando los pines P2.10 a P2.12
como
" " entradas" de" interrupción
" externa,
" ver Figura
" 4.3, otra forma de simular las
interrupciones es solicitarlas desde los propios pines del puerto.
" " " " " " "

" "
Figura 4.3. Ventana
" " " "conFiguración
" " " y" Visualización
" "" " " de" estado
"" " " de" gPio2.

" " " En" "este


" "caso " " " " " " parar
se recomienda " " " " ""
la"ejecución "" " "" "" "" " " "
de la simulación, poner a 0 el pin " " "" " "
" " " " " " "
" " " " " " " "
" ponerlo" " " "
" " a 1" de "nuevo" " " " " " que " "
" "
(pinchando " "en" la casilla), e
" inmediatamente
" " " " " " " (aquí se " verá
" " "
" " "
la interrupción " " pendiente)
" y" a continuación
" " " lanzar la " ejecución " "para " "
" " "se marca
" " como
" "
"que" el programa
" " procese
" " la solicitud,
" y pararla de nuevo para ver su efecto.
" " " " " " " " " " " " " " " "
" Además
" " " " se han
"
configurado
" "" " " " los" "pines" P2.0
" a P2.2" de" manera" que
" cuando las " "
"interrupciones
" " estén
" "activas" esos pines también lo estén.
"
Otras " " que pueden
herramientas " " ser" útiles
" " para el aprendizaje
" " " del
" "NVIC y del
" " "
" " "" "
" desarrollo de la práctica" son
" las
" siguientes.
" " " " " " " " " " "
" " En
"" el" " menú Peripherals/system
" " " control block/external
" " " interrupts,
" se" "
"
puede " "
interactuar " los registros
con " de "control
" " " extmode
extint, " " y extPo-
" " " " " " " " " " "
"
lar," ver
"
Figura
"
4.4. " " " " " " "

"
" " " " " " " " " " " " "
" " " " " " " " " " " " " "
" " " " " "" " " " " " " " " "
Figura 4.4.
" " V"entana de conFiguración y Visualización del estado
" "" " " " " " " " " " " "
de las interruPciones externas.
" " " " " " " " " " " " " "
" " " " " " " " " " " " " " "
" " " "
42 " electrónicos digitales
Prácticas de laboratorio de sistemas

" " " " " " " " " " " " "
" " En" el menú Peripherals/Pin
" " connect
" block,
" cuando
" " desde "el "programa se" " "
" configuran
" " los " pines," se "puede ver" cómo "estos
" se cambian
" desde
" su
" anterior" fun- " "
ción a "entradas
" externas
" " de interrupción, ver Figura 4.5.

"
Figura 4.5. Ventana
" " de conFiguración
" " y Visualización
" " " " del estado
" " " de " Pines.
los

" "
A partir del programa de ejemplo conteste " "
a las siguientes "
preguntas: " " "

1. Ordene las interrupciones de menor a mayor prioridad.

2. Indique qué interrupciones pueden interrumpir (desalojar) al servicio de


atención de la interrupción del EINT2.

3. ¿Cuál es el valor inicial del stack pointer tras un Reset? Muestre evidencias
utilizando la tabla de vectores.

4. ¿Cuáles son las direcciones de inicio de main() y de la rutina de atención


a la interrupción EINT2. Muestre evidencias utilizando la tabla de vectores
y la memoria de programa.

5. Indique el valor del registro AIRC (en la ventana de NVIC), antes y después de
ejecutar la función inicioirQs(). Muestre evidencias y justifique la respuesta.
ね" %­³Ø̋œ"œæº"Ø̇œ"¸Æø̋̊̊Ææº̋œ"¸̋"ƺÆ̊Ææ"¸̋"ockp*+"
" " " " " " " " ""¸̋"Ø̇"ø­ßƺ̇"¸̋"̇ß̋º̊Æ
" " " " º"̇"Ø̇"ƺß̋øø­ı̊Æ
" " " º""
'+06に ""/­̋œßø̋"̋©Æ¸̋º̊Æ̇œ"­ßÆØÆ
" " " " " "
̇º¸æ"Ø̇"ß̇̈Ø̇"¸̋"©̋̊ßæø̋œ" " ""Ø̇"Œ̋ŒæøÆ̇"¸̋"ıøæ̌ø̇Œ̇
" " " "
"

の " +º¸Æł­̋"" ̋Ø"" ©̇Øæø"" ¸̋Ø"" ø̋̌Æœßøæ"" #+4%"" ̋º"" Ø̇"" ©̋ºß̇º̇"" ¸̋"" 08+% " ̇ºß̋œ"" " ¸̋œı­Îœ"" ¸̋"" ̋ª̋̊­ß̇ø"" Ø̇""
Práctica 4 - controlador de interruPciones (nVic) 43
̨­º̊Æ º"ƺÆ̊Ææ+435
" ""/­̋œßø̋"̋©Æ¸̋º̊Æ̇œ"
" " ""ª­œßÆ̨Æł­̋"Ø̇"ø̋œı­̋œß̇
" " "
" 6. Rellene la Tabla 4.1, suponiendo la ocurrencia de los eventos en el orden
" "indicado.
" な Muestre
は " 4̋ØØ̋º̋"Ø̇"6̇̈Ø̇"ね evidencias de simulación.
" " " Para generar
" " "interrupciones
""œ­ıæºÆ̋º¸æ"Ø̇"æ̊­øø̋º̊Æ̇"¸̋"Øæœ"̋©̋ºßæœ"̋º"̋Ø"æø¸̋º"ƺ¸Æ̊̇¸æ
" " " y""/­̋œßø̋""
modificar
̋©Æ¸̋º̊Æ̇œ"¸̋"œÆŒ­Ø̇̊Æ
" " las variables a, b y c abra una
º ""2̇ø̇"̌̋º̋ø̇ø"ƺß̋øø­ı̊Ææº̋œ"
" " ventana Watch (Ver Figura
" ""Œæ¸Æ̨Æ̊̇ø"Ø̇œ"©̇øÆ̇̈Ø̋œ"
" " 4.6) y " " ̊""̇̈ø̇""
" ̇ ""̈
" coloque
"
­º̇"©̋ºß̇º̇"9̇ß̶̊" en ella las
" 8̋ø"(Æ̌­ø̇"ね
" variables y el puerto, y modifique
" は " ""̊æØæł­̋"̋º"̋ØØ̇"Ø̇œ"©̇øÆ̇̈Ø̋œ"
" " " " los valores
" ""̋Ø"ı­̋øßæ
" desde la
" ""Œæ¸Æ̨Æł­̋"Øæœ" " "
" misma " " para conseguir que las" ISR " finalicen.
©̇Øæø̋œ"¸̋œ¸̋"Ø̇"ŒÆœŒ̇"ı̇ø̇"̊溜̋̌­Æø"ł­̋"Ø̇œ"+54"̨ƺ̇ØÆ̊̋º
" " " " "

"
Figura 4.6.
(Æ̌­ø̇"ね
Ventana" Watch
" は ""8̋ºß̇º̇"9̇ß̶̊ " .

" な ""'œß̇¸æ"¸̋"Ø̇œ"ƺß̋øø­ı̊Ææº̋œ"
6̇̈Ø̇"ね " " " "
Tabla 4.1. Estado de las interrupciones
" Estado
'œß̇¸æ"" ® ""2(x,
""# P," A)
Orden Evento EINT0 EINT1 EINT2
1ø¸̋º '©̋ºßæ"" '+06ど '+06な '+06に
1 Solicita atención EINT1
2 な"" Solicita atención
" EINT0
5æØÆ̊Æß̇"̇ß̋º̊Æ º"'+06な
" " " "
3 Solicita atención EINT2
に"" "
5æØÆ̊Æß̇"̇ß̋º̊Æ "
º"'+06ど " " "
4 c=0
5 ぬ"" a=0
"
5æØÆ̊Æß̇"̇ß̋º̊Æ "
º"'+06に " " "
6 b=0
ね"" ̊サど"" " " "
x à(ha terminado o no ha solicitado); Pàpending; aà active)
の"" ̇サど"" " " "
7. Cambieは""el grupo de prioridad
̈サど"" " la Tabla
a 5 y rellene " 4.2, suponiendo
" la
ocurrencia de los eventos en el orden indicado. Muestre evidencias de
®"å
" ̶̇"ß̋øŒÆº̇¸æ"æ"ºæ"̶̇"œæØÆ̊Æß̇¸æ
" " " " " ""2åı̋º¸Æº̌ ""#å"#̊ßÆ©̋
" "
simulación.

&̋ı̇øß̇Œ̋ºßæ"¸̋"'Ø̋̊ßø
" " ºÆ̊̇ ""7ºÆ©̋øœÆ¸̇¸"¸̋"#Ø̊̇س"
" " " にぬ""
44 Prácticas de laboratorio de sistemas electrónicos digitales

Tabla 4.2. Estado de las interrupciones con grupo de prioridad 5


Estado (x, P, A)
Orden Evento EINT0 EINT1 EINT2
1 Solicita atención EINT1
2 Solicita atención EINT0
3 Solicita atención EINT2
4 c=0
5 a=0
6 b=0

4.2. actividad 4.2. controlador de interrupciones ii (Presencial)

En la Actividad 4.2 se sigue trabajando con el mismo objetivo de la Actividad


4.1. En este caso se utilizan señales de los puertos de propósito general para pro-
vocar las interrupciones y mostrar por los LED que están en estado activo.

1. Modifique el programa para que indique mediante LEDs conectados en las


líneas P0.4, P0.6 y P0.8 la interrupción que está activa (EINT0, EINT1 o
EINT2) y que finalice el servicio de atención de dicha interrupción cuando
las líneas P0.5, P0.7 y P0.9, respectivamente, pasen a nivel bajo. Para loca-
lizar los pines en la tarjeta y conectar los cables ayúdese del fichero
LPC1768-Mini-DK2_Schematic.
Tenga en cuenta que los pulsadores ISP, KEY1 y KEY2 están conectados res-
pectivamente a P2.10, P2.11 y P2.12 (EINT0, EINT1, EINT2) y que en repo-
so mantienen un nivel alto en el pin correspondiente, provocando un nivel
bajo al pulsarlos (ver documento lPc1768-mini-dK2_schematic.pdf).

En la elaboración y ejecución del código se recomienda:

• Habilitar los pines P0.4, P0.6 y P0.8 como salidas configuradas sin
resistencia de Pull-Up ni Pull-down y sin Open-Drain. Conectar las sali-
das a los LEDs a través de una resistencia de valor entre 470 Ω y 1K Ω.
• Habilitar los pines P0.5, P0.7 y P0.9 como entradas configuradas con
resistencia de Pull-Up, de forma que cuando estén al aire se interprete
un nivel alto.
• Ejecutar línea a línea el código de configuración comprobando cómo
van quedando los diferentes pines de los puertos y sistema de interrup-
ciones.
Práctica 4 - controlador de interruPciones (nVic) 45

• Activar puntos de ruptura en las ISR, en las líneas que comprueban si


P0.5, P0.7 y P0.9 están en el nivel que provoca que se termine la ISR.

Tenga en cuenta que al ser interrupciones solicitadas por nivel, se puede


registrar más de una solicitud de la misma interrupción cada vez que se
quiere solicitar una. Y también que, para evitar problemas en la detección
de niveles, las líneas P0.5, P0.7 y P0.9 es conveniente tenerlas conectadas
a 3.3v, salvo cuando se quiera forzar un nivel bajo, que se llevarán a GND.
Para la comprobación repita la secuencia de la Tabla 4.1.
2. Modifique el programa para que no pueda existir desalojo entre ninguna de
las interrupciones y para que EINT0 se active con un flanco ascendente y
EINT1 se activen en flanco descendente. Indique con LEDs conectados en
las líneas P0.4 y P0.6 la interrupción que está activa (EINT0 o EINT1).
3. Conecte la salida de un generador de funciones con una señal cuadrada
(entre 0V y 3.3V) a las entradas EINT0 y EINT1. Añada dos variables que
iniciándolas en valor cero vayan contando el número de interrupciones que
se reciben por cada una de las entradas y muéstrelas en pantalla.
4. Tal y como indica el fabricante en el manual, hay que tener en cuenta que
cuando se modifican los registros EXTMODE y/o EXTPOLAR de una
interrupción externa (apartado 3.6), se activa la bandera correspondiente
para esa interrupción en el registro EXTINT y por tanto la interrupción
estará pendiente. Para evitar que se ejecute de forma indeseada el servicio
de atención a dicha interrupción, antes de asignar grupo de prioridad y prio-
ridades, y de habilitar las interrupciones, configure los pines como entra-
das de interrupción de eint0 a eint2, configure extmode y ext-
Polar, borre las banderas en los registros extint (LPc_Sc-
>EXTinT) e icPr (interrupt clearPending reg. nVic_clearPendin-
giRQ(EinTx_iRQn)). Posteriormente ya puede asignar grupo de priori-
dad y prioridades, y habilitar las interrupciones.
Práctica 5

Funcionamiento y manejo del SyStem timer

introducción

En esta práctica se proponen las actividades a desarrollar con el temporizador


del sistema (System Timer) y con el controlador de interrupciones. Para ello, se
parte de un programa de ejemplo que se debe simular como actividad no presen-
cial y a partir de la simulación contestar las cuestiones indicadas.
Para el desarrollo de la práctica es indispensable el manejo fluido del adap-
tador J-Link de Segger para la depuración de programas. Se recomienda repa-
sar el Anexo VI “Guía de configuración del adaptador J-Link para carga y
depuración”.
La práctica está dividida en dos actividades: la Actividad 5.1 es no presencial
y en ella se estudia y se practica con un programa ejemplo, mientras que en la
Actividad 5.2 se propone el desarrollo de programas para depurar y ejecutar
mediante adaptador J-Link.

5.1. actividad 5.1. configuración y simulación de System timer


(no presencial)

Para la realización de la Actividad 5.1 debe seguir los siguientes pasos:

1. Lea las páginas 515 a 519; capítulo 23 del “UM10360 LPC17xx User
manual Rev 4.1“. Analice la utilidad de cada uno de los 4 registros de
SysTick (del registro STCALIB tenga en cuenta solamente los bits 23:0
TENMS) y analice también la funcionalidad de cada bit o campo de bits de
dichos registros.
2. Realice los ejercicios propuestos en este apartado 5.1 a partir del programa
ejemplo suministrado.
"
" " " " " " " " " " " "
" " " " " " " " " " " " " " " "
" " " " " " " " " " " " " " " "
" " " " " " " " " " " " " " "
48 " " " " " " PrácTicaS de laboraTorio de SiSTemaS elecTrónicoS digiTaleS
"
" " " " " " " " " " " " " "
5.1.1. Programa "
de ejemplo
" " " "
El Programa 5.1 SYSTicK_interrupt.c disponible en el Aula Virtual de la asig-
" " " " " " " " " " " " " "
natura
" " será utilizado
" " " en el desarrollo
"" de esta actividad.
1,/////////////////////////////////////////////////////////////////////////"
","Pcog<""""U[UVKEakpvgttwrv0e"
",///////////////////////////////////////////////////////////////////////,1"
"
%kpenwfg"$NRE39zz0J$" """"
wkpv54av"rwnucfqt="
wkpv54av"U{uvgoHtgswgpe{?322222222="
"
xqncvkng"wkpv54av"ewgpvc=""" 11"Eqpvcfqt"fg"xgegu"fg"z"ou""
"
xqkf"U{uVkemaJcpfngt"*xqkf+" 11"Twvkpc"*KUT+"fg"cvgpek„p000"
"""""""""""""""""""""""""""""11000"c"nc"gzegrek„p"37"/fgn"U{uVkem/"
}"
""ewgpvc"--=" """""""""""11"Kpetgogpvct"eqpvcfqtgu"ecfc"32ou""{"ecfc"3u"
"
"
kpv"ockp"*xqkf+"
""}" " " " " " " "
""NRE IRKQ5/@HKQFKT"~?"*3>>47+=" 11"R5047"fghkpkfq"eqoq"ucnkfc"
""NREaIRKQ5/@HKQFKT"~?"*3>>48+="
"" N R E I R K Q 5 / @ H K Q F K T" ~ ? "* 3 > > 4 8 + = " 1
11"R5048"fghkpkfq"eqoq"ucnkfc"""
1"R5048"fghkpkfq"eqoq"ucnkfc"""
""NREaIRKQ4/@HKQFKT"(?"\*3>>34+="""
""NREaIRKQ4" /@" HKQFKT"(? " "\*3>>34+" =""" " 1
11"R4034"fghkpkfq"eqoq"gpvtcfc"""
1"""R4034"fghkpkfq"eqoq"gpvtcfc""" "
"""
" "
""11"U{uvgoKpkv"*+=""""""""""""""""11"Kpkekcnk|ct"tgnqlgu"$enqemu$"
""11"U{uvgoKpkv"*+=""""""""""""""""11"Kpkekcnk|ct"tgnqlgu"$enqemu$"
" "
""U{uVkemaEqphki"*U{uvgoHtgswgpe{1322+=""""11"Eqphkiwtct""U{uVkem"
""U{uVkemaEqphki"*U{uvgoHtgswgpe{1322+=""""11"Eqphkiwtct""U{uVkem"
"
""yjkng"*3+"}"
""yjkng"*3+"}"
""""rwnucfqt?**NREaIRKQ4/@HKQRKP"("*3>>34++@@34+="""
""""rwnucfqt?**NREaIRKQ4/@HKQRKP"("*3>>34++@@34+="""
""""kh"*rwnucfqt??2+}"""""""""""""""11"rwnucfqt"rwnucfqA""
"""" kh"*rwnucfqt??2+}"""""""""""""""11"rwnucfqt"rwnucfqA""
""""
""""""kh"*ewgpvc??5+NREaIRKQ5/@HKQRKP"~?"*3>>47+=""11"gpekgpfq"NGF"
"""""" kh"*ewgpvc??5+NRE IRKQ5/@HKQRKP"~?"*3>>47+=""11"gpekgpfq"NGF"
"""""""kh"*ewgpvc@?5,4+}"
""""""" kh"*ewgpvc@?5,4+}"
" """"NREaIRKQ5/@HKQRKP"""(?"\*3>>47+="""""""""11"crciq"NGF"
"""" NREaIRKQ5/@HKQRKP"""(?"\*3>>47+="""""""""11"crciq"NGF"
" """"ewgpvc?2="
"""" ewgpvc?2="
"""""""""" "
""""""" "
""""gnug}"
"""" gnug}"

"""""""kh"*ewgpvc??8+"NREaIRKQ5/@HKQRKP"(?"\*3>>48+="11"gpekgpfq"NGF"
""""""" kh"*ewgpvc??8+"NREaIRKQ5/@HKQRKP"(?"\*3>>48+="11"gpekgpfq"NGF"
"""""""kh"*ewgpvc@?8,4+}"
""""""" k h" * e w g p v c @ ? 8 , 4 + } "
""""""""""NREaIRKQ5/@HKQRKP"~?"*3>>48+=""""""""""""""11"crciq"NGF""
"""""""""" NRE IRKQ5/@HKQRKP"~?"*3>>48+=""""""""""""""11"crciq"NGF""
""""ewgpvc?2="
""""" """" ewgpvc?2="
"""""""""" "
"""" ""
"" "
"
Programa 5.1. código
" " del " SYSTICK_InTerrupT
" Programa
" " .C
" " " " " " " " " " " " " " " " " "
" " " " " " " " " " " " "
" "
" " " " " " " " " " " " " " " "
PrácTica 5 - funcionamienTo Y manejo del SYSTem Timer 49

A partir del programa de ejemplo anterior, y tras la simulación del código


(tenga en cuenta que en simulación el registro SysTick->CALIB se inicializa con
valor 0), conteste razonadamente a las siguientes preguntas:

1. Explique cuál es el funcionamiento de las diferentes funciones y del siste-


ma global cuando se ejecute dicho código.

2. Localice en el fichero core_cm3.h la función SysTick_Config() y


explique cuál es la funcionalidad de cada una de sus líneas de código.

3. De estar habilitada la interrupción del SysTick indique:


• ¿Qué prioridad tiene?

• ¿Cuál es la dirección de inicio de su rutina de atención a la interrupción?


Muestre evidencias utilizando la tabla de vectores y la memoria de programa.

4. A partir de la función SysTick_Config() indique con qué nombre se refiere a


los registros de configuración de SysTick para usarlos en un programa en C.

5. Ayudándose de la visualización de las variables y de las ventanas de regis-


tros “pheripherals-> Core pheripherals ->System Tick Timer“ y ”pheri-
pherals-> Core pheripherals ->nisted Vector Interrup Controller“ res-
ponda razonadamente cuál es el valor de los registros siguientes antes de
ejecutarse la instrucción while (1). Justifique la respuesta, teniendo en
cuenta la funcionalidad de cada registro.

• SysTick->RELOAD =
• SysTick->VAL (SysTick-CURR)=
• SysTick->CTRL =
• SysTick->CALIB =
50 Prácticas de laboratorio de sistemas electrónicos digitales

5.2. Actividad 5.2. Depuración on-chip del System Timer (Presencial)

En la actividad presencial se trabajará con el depurador J-Link, ejecutando sobre


la tarjeta LPC1768-Mini-DK2 las dos versiones de programa, que se piden a conti-
nuación, poniendo en práctica todos los conocimientos adquiridos en las prácticas
anteriores y del estudio de los registros de configuración de SysTick. Se recomien-
da encarecidamente que visualice las ventanas de Pheripherals correspondientes a
aquellos registros y hardware con que esté trabajando y/o modificando.

Los pasos para la realización de la Actividad son los siguientes:

1. Modifique el Programa 5.1., de manera que teniendo como fuente de inte-


rrupción el SysTick cada 100 ms, sobre la tarjeta parpadeen alternamente
los LEDs (P3.25, P3.26) con una cadencia de 0,5 segundos si P2.12 no está
pulsado y de 2,5 segundos si lo está. Tenga en cuenta que la Frecuencia del
Sistema (CCLK) es de 100Mhz.
Además, se debe eliminar la línea SysTick_Config (SystemFre-
quency/100) y crear una función propia Configuracion_Systick()
que configure los registros necesarios del SysTick, y que no deberá contener
ningún elemento que el alumno no conozca. No la llame SysTick_
Config(). Dicha función debe tomar el valor del registro de Calibración
del SysTick para generar una interrupción cada 20 ms, permitirá pasar
como parámetro el nivel de prioridad que se quiere asignar a la excepción
15, habilitará la cuenta de SysTick, habilitará la posibilidad de generar inte-
rrupción y seleccionará la fuente de reloj interna.
2. Desarrolle y describa la función de inicialización del SysTick, para que se
cumpla lo enunciado anteriormente.

3. Desarrolle y describa la ISR que atienda a la excepción 15 (SysTick), con-


siderando que se deben tener dos contadores de ticks que se incrementen
cada 20 ms y cada 0,5 segundos (cada vez que se incremente en 1 el con-
tador de 0,5s se pondrá a 0 el de 20ms). Además la activación y desactiva-
ción de los LEDs para generar el parpadeo debe hacerse desde la ISR.

4. Ponga puntos de ruptura en todas las líneas de main() que llamen a una
función y en la línea que en su programa indique el cumplimiento de la
PrácTica 5 - funcionamienTo Y manejo del SYSTem Timer 51

acumulación de cada 0,5 segundos de tiempo. Ejecute paso a paso de


manera que se entre en las funciones y se ejecuten línea a línea (step one
line). Observe mediante la ejecución del mismo y en las correspondientes
ventanas de pheripheral cómo se va configurando el microcontrolador.
Indique en qué líneas se modifica el contenido de los registros de System
Timer y de nested Vector interrup controller y cuál es el valor con que se
modifican los registros afectados.

5. Repita el ejercicio descrito en el punto 1 (con la misma funcionalidad),


pero en este caso se debe deshabilitar la fuente de interrupción, y median-
te muestreo se debe consultar si ha transcurrido el tiempo de conteo.
6. Ponga puntos de ruptura en todas las líneas de main() que llamen a una
función y en la línea que en su programa indique la acumulación del cum-
plimiento de cada 0,5 segundos de tiempo. Ejecute paso a paso de manera
que se entre en las funciones y se ejecuten línea a línea (step one line).
Observe mediante la ejecución del mismo y en las correspondientes venta-
nas de Pheripheral cómo se va configurando el microcontrolador.

7. Indique en qué líneas se modifica el contenido de los registros de System


Timer y cuál es el valor con que se modifican los registros afectados.

8. ¿Cómo desactiva el bit COUNTFLAG, para poder detectar cuándo se vuel-


ve a activar?

9. Ponga únicamente un punto de ruptura en la línea de código en la que con-


sulta el estado de COUNTFLAG en este programa e indique razonada-
mente si la temporización de este método es mejor o peor que la consegui-
da por interrupciones.

Tome evidencias del trabajo realizado para rellenar el informe de la práctica.


Práctica 6

Funcionamiento y manejo de los timers

introducción

En esta práctica se proponen las actividades a desarrollar para el aprendizaje


del funcionamiento de los cuatro temporizadores de propósito general
Timer0/1/2/3 y del controlador de interrupciones. Los ejemplos aquí expuestos se
particularizan para el Timer0, pero todo ello es extrapolable a los Timers 1/2/3, al
ser idénticos en su funcionalidad. Para ello, se parte de un programa de ejemplo
que se debe simular como actividad no presencial y contestar las cuestiones indi-
cadas antes de asistir a la actividad presencial.
La práctica está dividida en dos actividades: la Actividad 6.1, no presencial, en
la que se guía paso a paso al alumno y se practica con un programa ejemplo,
mientras que la Actividad 6.2, presencial, propone el desarrollo de programas
para depurar y ejecutar mediante adaptador J-Link.

6.1. actividad 6.1. configuración y simulación del timer (no presencial)

Para la realización de la Actividad 6.1 debe seguir los siguientes pasos:

1. Lea las páginas 501a 511 del “UM10360 - LPC17xx User manual
Rev4.1”. Excluya de la lectura todo lo referente a la aplicación de los
Timers al DMA (acceso directo a memoria), así como el modo captura
(capture mode) ya que no son necesarios para esta práctica. Analice cui-
dadosamente la utilidad que tienen los registros TCR, TC, PR, PC,
MR0/1/2/3 y MCR.
2. Realice los ejercicios propuestos en esta Actividad 6.1, a partir del progra-
ma ejemplo suministrado, al tiempo que vuelve a leer en el manual la uti-
lidad de los registros implicados en este ejemplo.
54 Prácticas de laboratorio de sistemas electrónicos digitales

6.1.1. Programa de ejemplo

El Programa 6.1. timer1_ejemplo.c será utilizado en el desarrollo de esta acti-


vidad. Si no desea conectar un LED externo a P1.18, puede intercambiar dicho pin
por el P3.26 que ya incorpora un LED en la placa (preste atención a los comenta-
rios incluidos en el código). Los pasos básicos que sigue este ejemplo son:

1. Conecte la alimentación al timer1 con lPc_sc->PconP |= 1 << 2.


(Apartado 4.8.9 Power Control for Peripherals register del manual de usua-
rio). En el caso de los Timers0/1 no es necesario ya que quedan activados
por defecto tras el reset. Por ello, en el ejemplo no se ha escrito dicha línea
de código.
2. Seleccione el clock para el timer1 (Apartado 4.7.3 Peripheral Clock Selec-
tion registers 0 and 1 del manual de usuario).
3. Configure la interrupción. El LPC1768 contiene 4 registros de match para
cada timer. Estos registros de match pueden ser usados para resetear el
timer, generar una interrupción, parar el timer, o para generar una señal
temporizada en un pin externo. En el primer ejemplo se usará el registro
match0 del timer1 para generar una interrupción.
4. En la rutina de atención a la interrupción del timer1, la función asocia-
da a la interrupción se llama TIMER1_IRQHandler(). Se debe ave-
riguar la fuente de interrupción dentro de esta rutina comprobando qué
bit está a 1 dentro del registro IR del Timer (el correspondiente al regis-
tro match0, match1, match2 o match3), para a continuación borrar este
bit, de lo contrario se generará otra interrupción tan pronto sea atendida
la actual.
Práctica 6 - FUncionamiento Y maneJo de los timers 55
" " " " " " "

11,/////////////////////////////////////////////////////////////////////////"
,/ // // //// /// // //// /// / / /// //// / / /// //// // /// //// /// / / /// //// / / /// //// // //"
"","Pqodtg<""""Vkogt3aGlgornq0e""
,"Pqodtg<""""Vkogt3aGlgornq0e""
"",///////////////////////////////////////////////////////////////////////,1"
,/ // // //// /// // //// /// / / /// //// / / /// //// // /// //// /// / / /// //// / / /// //// // ,1 "
"
%%kpenwfg"$NRE39zz0J$"
kpenwfg"$NRE39zz0J$" """"
xxqkf"kpkekcnk|c"*xqkf+}"
qkf"kpkekcnk|c"*xqkf+}"
"
""111"NREaUE/@REQPR"~?"3">>"4"""Eqpgevct"nc"cnkogpvcek„p"cn"Vkogt3"
1"NREaUE/@REQPR"~?"3">>"4"""Eqpgevct"nc"cnkogpvcek„p"cn"Vkogt3"
"" ""NREaIRKQ5/@HKQFKT"~?"*3>>48+=""11"R5048"fghkpkfq"eqoq"ucnkfc"
NREaIRKQ5/@HKQFKT"~?"*3>>48+=""11"R5048"fghkpkfq"eqoq"ucnkfc"
"" ""NREaUE/@RENMUGN2"~?"3">>"7="11"Enqem"rctc"gn"Vkogt"?"EENM14"
NREaUE/@RENMUGN2"~?"3">>"7="11"Enqem"rctc"gn"Vkogt"?"EENM14"
"" ""NREaVKO3/@OT2"?"4;4;8:="11"Ug"cukipc"xcnqt"crtqrkcfq"rctc"nc"htgewgpekc"fg"
NREaVKO3/@@OOT2"?"4;4;8:="11"Ug"cukipc"xcnqt"crtqrkcfq"rctc"nc"htgewgpekc"fg"
""""""""""""""""""""""""""11"rctrcfgq"fgn"NGF"dcucfq"gp"htgewgpekc"fgn"tgnql"
"""""""""""""""""""""""""" 11"rctrcfgq"fgn"NGF"dcucfq"gp"htgewgpekc"fgn"tgnql"
""NREaVKO3/@OET"~?"2z5=""11"Kpvgttworkt"ewcpfq"ug"cnecpeg"Ocvej2"*dkv2+"{"
""NREaVKO3/@@OOET"~?"2z5=""11"Kpvgttworkt"ewcpfq"ug"cnecpeg"Ocvej2"*dkv2+"{"
"" 111"tgugvgct"gn"eqpvcfqt"fgn"Vkogt"
1"tgugvgct"gn"eqpvcfqt"fgn"Vkogt"
""""""""""""""""""""""""11"ewcpfq"cnecpeg"gn"xcnqt"fgn"Ocvej2"*dkv3+"
""""""""""""""""""""""""11"ewcpfq"cnecpeg"gn"xcnqt"fgn"Ocvej2"*dkv3+"
""NREaVKO3/@RT"?"733="
""NREaVKO3/@RT"?"733=" "11"Ecfc"xg|"swg"gn"Rtguecngt2"cnecpeg"guvg"xcnqt"
"11"Ecfc"xg|"swg"gn"Rtguecngt2"cnecpeg"guvg"xcnqt"
" 111"ug"kpetgogpvc"gp"wpq"gn"eqpvcfqt"fgn"Vkogt"
1"ug"kpetgogpvc"gp"wpq"gn"eqpvcfqt"fgn"Vkogt"
""NREaVKO3/@VET"~?"3">>"3="11"Tgugvgct"Vkogt""
""NREaVKO3/@VET"~?"3">>"3="11"Tgugvgct"Vkogt""
""NREaVKO3/@VET"(?"\*3>>3+="11"Ug"xwgnxg"c"rqpgt"c"2"rctc"gnkokpct"gn"Tgugv"
""NREaVKO3/@VET"(?"\*3>>3+="11"Ug"xwgnxg"c"rqpgt"c"2"rctc"gnkokpct"gn"Tgugv"
""PXKEaGpcdngKTS*VKOGT3aKTSp+="11"Jcdknkvct"kpvgttwrek„p"Vkogt"
""PXKEaGpcdngKTS*VKOGT3aKTSp+="11"Jcdknkvct"kpvgttwrek„p"Vkogt"
""NREaVKO3/@VET"~?"3">>"2="11"Cttcpect"gn"Vkogt"
""NREaVKO3/@VET"~?"3">>"2="11"Cttcpect"gn"Vkogt"
"
"
xxqkf"VKOGT3aKTSJcpfngt"*xqkf+"}"
qkf"VKOGT3aKTSJcpfngt"*xqkf+"}"
""""kh**NREaVKO3/@KT"("2z23+"??"2z23+"11"Uk"ug"jc"kpvgttworkfq"rqt"OT2"""""}"
""""kh**NREaVKO3/@KT"("2z23+"??"2z23+"11"Uk"ug"jc"kpvgttworkfq"rqt"OT2"""""}"
""""""""NREaVKO3/@KT"~?"3">>"2="11"Dqttct"hnci"fg"kpvgttwrek„p"OT2"
""""""""NREaVKO3/@KT"~?"3">>"2="11"Dqttct"hnci"fg"kpvgttwrek„p"OT2"
""""""""NREaIRKQ5/@HKQRKP"`?"3">>"48="11"Eqpowvct"guvcfq"fgn"NGF""
""""""""NREaIRKQ5/@HKQRKP"`?"3">>"48="11"Eqpowvct"guvcfq"fgn"NGF""
"""" "
"
"
kkpv"ockp"*xqkf+}"
pv"ockp"*xqkf+}"
""kpkekcnk|c*+="
""kpkekcnk|c*+="
""yjkng*3+="
""yjkng*3+="
"
Programa 6.1. código de Timer1_ejemPlo.c
" " " " "

" A partir
" " del Programa
" " " 6.1
" " y tras la" simulación
" " del código,
" conteste
" " razonada-
" "
mente a las
" siguientes preguntas:

" " Se recomienda


Nota: " " " " abiertas" "las ventanas
tener " de " Peripherals:
"" " NVIC,
Timer1, y GPIO1.
" " " " " " " " " " " " " "

"

" " " " " " " " " " " " " " " " "
" " "" " " " " " "
56 Prácticas de laboratorio de sistemas electrónicos digitales

1. Explique cuál es el funcionamiento global del sistema cuando se ejecute
dichocódigo.

2. Apartirdelcódigodelejemplo,indiquecuálesladefinicióndelosregis-
trosdeconfiguracióndelTimerutilizadosydelregistrousadoenlaISR.

3. Ayudándosedelavisualizacióndelasventanasderegistros“Pheripheral-
sà Clocking&Power Control à Clock Dividers”,determinecuálesla
frecuenciaderelojparaelTimer0(presenteevidencias),eindiquecómose
podríaconseguirquedichafrecuenciaderelojfueseCCLK/4.

4. ¿Cada cuánto tiempo se produce una interrupción por parte del Timer1?
Presente evidencias tomando una captura de la señal P3.26 mediante el
analizadorlógico.
NOTA: Si lo necesita reduzca los tiempos para que las simulaciones no
seanexcesivamentelentas.

5. Calculeteóricamenteelvaloranteriorapartirdelosvaloresdelaseñalde
relojseleccionada(PCLK),delregistroPRydelregistroMR0.

6. ¿Cuálesladireccióndeiniciodelarutinadeatenciónalainterrupcióndel
Timer1?Muestreevidenciasutilizandolatabladevectoresylamemoriade
programa.

6.2. Actividad 6.2. Depuración on-chip del Timer (Presencial)

EnestaactividadpresencialsetrabajaráconeldepuradorJ-Link,ejecutando
sobrelatarjetaLPC1768-Mini-DK2elprogramadelaActividad6.1ycreando
Práctica 6 - FUncionamiento Y maneJo de los timers 57

dos nuevos programas. De este modo, se pondrán en práctica todos los conoci-
mientos adquiridos en la Actividad 6.1 y en la lectura del capítulo de los Timers
en el manual del fabricante.
Los pasos para la realización de la Actividad son los siguientes:

6.2.1. Actividad presencial 6.2.1.

Cargue en la tarjeta LPC1768-Mini-DK2 el programa de la Actividad 6.1 para


comprobar su funcionamiento y muéstrelo al profesor.

6.2.2. Actividad presencial 6.2.2.

En este caso debe crear un programa que genere una señal cuadrada de 5Hz
por el pin P1.25 haciendo uso de la funcionalidad que pueden proporcionar los
bits external match control del registro external match register (lPc_tim1-
>emr, y sin necesidad de usar interrupción alguna (MAT1.1) (Apartado 21.6.11
del manual de usuario del LPC17xx).

1. Desarrolle el programa y escriba el código a continuación.

2. Ejecute el programa en la LPC1768-Mini-DK2 y conecte el osciloscopio al


P1.25 para visualizar la señal. Tome una foto de la pantalla del oscilosco-
pio y muéstrela a continuación. Verifique que la señal es cuadrada con una
frecuencia de 5Hz.

6.2.3. Actividad presencial 6.2.3.

Ahora realizará un programa para generar por P1.29 una señal cuadrada de
2KHz con un ciclo de trabajo del 30%. Tenga en cuenta que en este apartado no
se puede usar P1.25 porque interferiría con el bloque de Match. Para ello confi-
gure el timer1 para que interrumpa tanto cuando el tc (contador del Timer)
alcance el valor match0 (cada 0,5ms) como el de match1 (0,15ms) (Apartado
21.6.3 Count Control Register del manual de usuario). Además, cada vez que se
58 Prácticas de laboratorio de sistemas electrónicos digitales
2ø³̊ßÆ̊̇œ"¸̋"Ø̇̈æø̇ßæøÆæ"¸̋"5Æœß̋Œ̇œ"'Ø̋̊ßø
" " " " " ºÆ̊æœ"&Æ̌Æß̇Ø̋œ"
" "

/̇ß̶̊ね"œ̋"¸̋̈̋"ø̋œ̋ß̋̇ø"̋Ø"6%
" "
interrumpa " por match0
" " se""6̇Œ̈Æκ"¸̋̈̋"̊溜­Øß̇ø"̋Ø"ø̋̌Æœßøæ"¸̋"ƺß̋øø­ı̊Ææº̋œ"¸̋Ø"6ÆŒ̋ø"
"
debe resetear "el TC. También
" " debe" consultar
" el regis- " " "
ı̇ø̇"" ̊æºæ̊̋ø" " Ø̇"" ̨­̋ºß̋"
" ¸̋"
" ƺß̋øø­ı̊Æ º"
" " ̈æøø̇øØ̇"
" 6̇̈Ø̇"
" ねには " .̇"
" (Æ̌­ø̇"
" は
tro de interrupciones del Timer para conocer la fuente de interrupción y borrarlaな"
" ̋œł­̋Œ̇ßÆ ̇"
" ̋Ø"
"
̨­º̊Ææº̇ŒÆ̋ºßæ "
(Tabla 426). La Figura 6.1 esquematiza el funcionamiento:
"
6ÆŒ̋øな" ƺß̋øø­Œı̋" ıæø" /4ど ""4̋œ̋ß̋̇"̋Ø"6%"ı̇ø̇"
6ÆŒ̋øな"ƺß̋øø­Œı̋"ıæø"/4ど 4̋œ̋ß̋̇" ̋Ø" 6%" ı̇ø̇"
" ̊̊æŒ̋º
æŒ̋º ̇̇ø"­º"º­̋©æ"̊Æ̊Øæ"
ø"­º"º­̋©æ"̊Æ̊Øæ" ""ıæº̋"2な
ıæº̋"2な に
にひ"̇"­ºæ"
ひ"̇"­ºæ"

" 6ÆŒ̋øな" Æƺß̋øø­Œı̋"


6ÆŒ̋øな" ºß̋øø­Œı̋" ı ıæø"
æø"
/4な
/ 4な ""2æº̋"2な
2æº̋"2な に
にひ"̇"̊̋øæ"
ひ"̇"̊̋øæ"
"
"
"
Figura 6.1. esquema
(Æ̌­ø̇"は temPoral
" del
" Programa
" " "a realizar
" な ""'œł­̋Œ̇"ß̋Œıæø̇Ø"¸̋Ø"ıøæ̌ø̇Œ̇"̇"ø̋̇ØÆ ̇ø "

な " +ºœ̋øß̋"̋Ø"̊
" " ¸Æ̌æ"̇"̊æºßƺ­̇̊Æ
" " º"
1. Inserte el código a continuación:
"

に " %æº̋̊ß̋"̋Ø"æœ̊ÆØæœ̊æıÆæ"̇Ø"ıƺ"2な
" " " " " にひ ""/Ƹ̇"" ""̇ºæß̋"̋Ø"ı̋øÞæ¸æ"¸̋"Ø̇"œ̋ó̇Ø"
" " " " " " ""̋Ø"ßÆ̋Œıæ"̋º"ºÆ©̋Ø"
" " " "
2. Conecte" el osciloscopio
" " " al pin
̇Øßæ ""6æŒ̋"­º̇"̊̇ıß­ø̇"¸̋"Ø̇"ı̇ºß̇ØØ̇"
" P1.29.
" ""ı Mida
" " y anote elºperíodo
º̌̇Ø̇"̇"̊æºßƺ­̇̊Æ " de la señal y
el tiempo en nivel alto. Tome una captura de la pantalla y póngala a conti-
" nuación:

" " に ね ""


は に ね " #̊ßƩƸ̇¸"ıø̋œ̋º̊Æ̇Ø"は
" " " " " " " " " " " " " " " "
/æ¸Æ̨Æł­̋"̋Ø"ıøæ̌ø̇Œ̇"¸̋Ø"ı­ºßæ"̇ºß̋øÆæø"ı̇ø̇"ł­̋"Ø̋̇"̋Ø"̋œß̇¸æ"¸̋"¸æœ"ıƺ̋œ"¸̋"­º"ı­̋øßæ" " ""̋º""
" " " " " " " " " " " " " " にひ ""œ̋̌(º"Ø̇"6̇̈Ø̇"は
̨­º̊Æ º"¸̋"œ­"©̇Øæø"Œæ¸Æ̨Æł­̋"̋Ø"̊Æ̊Øæ"¸̋"ßø̇̈̇ªæ"¸̋"Ø̇"œ̋ó̇Ø"ıæø"̋Ø"2な " " " な"
6.2.4. Actividad presencial 6.2.4.
6̇̈Ø̇"は" な ""%Æ̊Øæ"¸̋"ßø̇̈̇ªæ"¸̋"Ø̇"œ̋ó̇Ø"̋º"2な
" " " " " " " にひ "
Modifique el programa del punto anterior
" para que lea el estado de dos pines
de un puerto y en función de su" valor
'œß̇¸æ"ıƺ̋œ"" modifique el ciclo
" " de trabajo
" にひ""de la señal por
%Æ̊Øæ"¸̋"ßø̇̈̇ªæ"2な
el P1.29, según la Tabla 6.1:ど"ど"
" " にどガ""
ど"な"
" " ねどガ""
な"ど"
" " はどガ""
Tabla 6.1. Ciclo de trabajo de la señal en P1.29.
な"な"
" " ぱどガ""
Estado pines Ciclo de trabajo P1.29
な " %æıÆ̋"̋Ø"̊
" " ¸Æ̌æ"̇"̊æºßƺ­̇̊Æ
" " 00 º"" ""Œ­̋œßø̋"̋Ø"̨­º̊Ææº̇ŒÆ̋ºßæ"̇Ø"ıøæ̨̋œæø
" " "20%
" "
01 40%
" 10 60%
11 80%
に" 3­Î"" œ­̊̋¸̋"" ̊æº"" Ø̇"" ƺß̋ºœÆ¸̇¸"" Ø­ŒÆºæœ̇"" ¸̋Ø"" .'&"" ̊æº̋̊ß̇¸æ"" ̇"" 2な にひ"" œ̋"" ̊æº̋̊ß̇ø³"" ­º""
.'&ギ4̋œÆœß̋º̊Æ̇"̋®ß̋øºæœ"̇"̋œß̋"ıƺ
" " " " ""̇Ø"Œæ¸Æ̨Æ̊̇ø"̋Ø"̊Æ̊Øæ"¸̋"ßø̇̈̇ªæ
" " " " " " #"ł­Î"̋œ"¸̋̈Ƹæ
" " " ""

"

"
Práctica 6 - FUncionamiento Y maneJo de los timers 59

1. Copie el código a continuación y muestre el funcionamiento al profesor:

2. ¿Qué sucede con la intensidad luminosa del LED conectado a P1.29 (se
conectará un LED+Resistencia externos a este pin), al modificar el ciclo de
trabajo? ¿A qué es debido?
Práctica 7

" conversor Digital analógico (Dac)

" "" " " " "


introDucción
"
" " En "esta
" práctica" se" abordará" "el estudio " y" manejo del" conversor
" digital" analógi- " " "
"co disponible
" " en" el "LPC1768. "Para" ello" antes" de" comenzar" se" debe
" leer el " capítu-
" " "
"lo 30 del manual de usuario del LPC1768.
La práctica está dividida en dos actividades: la Actividad 7.1 es no presencial
" y" en ella
" se estudia
" " el "DAC y se practica
" " con un" programa
" " " ejemplo, "mientras
" " "que
" "
" " " en" la Actividad
" " 7.2,
" presencial,
" "
se propone el "desarrollo
" " " de un programa
" " para " "
" depurar
" " " " " "
y ejecutar mediante adaptador J-Link. " " " " " "

" " " " "


7.1. actividad 7.1. conversor Digital analógico (Dac) (i) (no presencial)
" " " "
"
" "El conversor
" digital
" analógico
" que
" " incorpora" el" LPC1768
" es" un periférico
" " que ""
" " permite
" obtener
" " en el pin
" P0.26 (AOUT) una
" " " tensión
" proporcional
" " " a un
" " código "
"
" digital
" de
" 10" bits.
" La expresión
" " de tensión" de" salida,
" para
" " las tensiones
" de ali- " " "
"mentación de la tarjeta de desarrollo, corresponde a la siguiente:
8#.7'
8#176噺ぬ ぬ 磐 卑 "岷8峅"
などにね
" " " " " " " " " " " " " " " " " " " " " " "
" VALUE" " " es" un dato" de 10 bits y por tanto varía entre 0 y 1023. Así, el margen
de valores de VAOUT se encuentra entre 0 y 3,3 voltios.
" La" habilitación
" " " del "DAC" se" lleva a cabo "configurando
" " " el pin" P0.26
" como" su " " "
" función "“10” en el registro PINSEL1.
Dispone de dos registros de configuración y uno de operación. El registro de
" " " " " " " " " " " " " "
configuración Dacctrl debe ser configurado a cero (valor por defecto) ya que
" " " " " " " " " " " " " " " " "
se emplea para enviar los datos al DAC vía DMA (Direct Access Memory) y no
" " " " " " " " " " " " " " " " "
se va a emplear. El registro de configuración Daccntval permite configurar
" " " " " " " " " " " " " " "
" " " " " " " " " " " " " " " " " "
" " " " " " " " " " " " " " " "
"
62 PrácticAs De lAborAtorio De sisteMAs electrónicos DigitAles

un valor de recarga para el temporizador que envía datos al DAC vía DMA, y por
lo tanto no se empleará tampoco. Se dejará a su valor por defecto: 0x0000.
El único registro que se empleará será el registro de operación Dacr. Este
registro tiene dos campos:

• VALUE, bits 15:6, que es el valor de 10 bits que se convierte a tensión ana-
lógica.
• BIAS, bit 16, que permite establecer el tiempo de asentamiento. Para este
caso se configurará a valor 1, es decir, un tiempo de asentamiento de 2,5 us.

A partir de esta información, realice la actividad no presencial 7.1 siguiendo


los siguientes pasos:

1. Lea las páginas 593 a 596 del “UM10360 LPC17xx User manual Rev4.1”.
Preste especial atención a los apartados 30.1 a 30.4, puesto que el apartado
30.5 explica el funcionamiento de la conversión empleando acceso directo
a memoria (DMA) que no se estudiará en esta práctica.
2. Simule el Programa 7.1 Practica_7_nP.c suministrado a través del Aula
Virtual. Puesto que es una simulación, para comprobar su funcionamiento
se visualizarán los registros del DAC en el entorno Keil µVision®4. Para
ello una vez dentro del simulador vaya al menú Peripherals ð D/A con-
" " verter" y "le mostrará
" una ventana
" como" la de la Figura 7.1.

"
Programa 7.1. ejemPlo De manejo Del Dac.
" " " " " " " "

" "
" " "" " " " " " "
"
" "
"
" " "
"
"" " " " " "
"""
"" " " " ""
"" "
"
PRÁCTICA 7 - ConveRsoR dIgITAl AnAlógICo (dAC) 63
" " " " " " " "

%kpenwfg"$nre39zz0j$"
%fghkpg"FCEaDKCU" 2z22232222""11"Ugvvnkpi"vkog"c"xcnqt"4.7wu"
"
xqkf"FCEKpkv*xqkf+="
"
kpv"ockp"*xqkf+"
}"
""wkpv54av"k"?"2."o="
"""
""11"Kpkekcnk|coqu"gn"FCE""
""FCEKpkv*+="
"""
""yjkng"*3+"
""}"
" NREaFCE/@FCET"?"*k">>"8+"~"FCEaDKCU=" "
" k--="
" "
" hqt*o"?"3222="o"@"3="o//+="
" kh"*"k"??"3246"+"
" k"?"2="
"" "
"
"
xqkf"FCEKpkv*"xqkf"+"
}"
""11"Eqphkiwtcoqu"gn"rkp"r2048"eqoq"ucnkfc"FCE""
""11"Gp"RKPUGN3"dkvu"42"c"2"{"dkv"43"c"3"
""NREaRKPEQP/@RKPUGN3"(?"\*2z3>>42+="
""NREaRKPEQP/@RKPUGN3"~?"*2z3>>43+=""
"
Figura 7.1. Ventana de control
" "
del d/a conVerter.
" " " " "

" " " " " " " " " " " " " " "
3. LealaActividadpresencial7.2.yrespondaalosapartadosdelpunto7.3.2
""
“Desarrollodelaactividad”.

" " " " " " " "


7.2. actividad 7.2. conversor digital analógico (dac) (ii) (Presencial)
" " " " " " " " " " " " " " " "
Enestapartedelaprácticasevanaafianzarlosconocimientosadquiridosen " "
" " " " " " " " "
laActividad" 7.1,
" "desarrollando
" " una aplicación
" " que
" maneja"el conversor
" digital
analógico,DAC.Laaplicaciónadesarrollaresungeneradordeseñalsenoidalde
"
frecuenciaajustable.

" " " " " " "


64 PrácticAs De lAborAtorio De sisteMAs electrónicos DigitAles

" "" " " " "


7.2.1. Descripción del programa
" " " "
" Se" debe generar " " " en la" salida " AOUT " "
una " "
señal sinusoidal cuya "frecuencia " "varía" " " "
"
entre 1Khz y" 15 " Khz, que " " aproveche " al " máximo" el "margen" de" tensiones de " salida.
" " "
" " " " " " "
La frecuencia se podrá cambiar mediante la pulsación del pulsador conectado al " " " " " "
" terminal P2.12 " " " " Este pulsador
(KEY2). " " provocará la " "interrupción
" " EINT2
" " y" la" fre-" "
cuencia será proporcional al valor digital de 4 bits de los terminales P1.21 a "
" " " " " " " " " " " " " " " " " "
" " " " " " " " " " " " " " " " " "
P1.24, de tal manera que para valor P1.24…P1.21 = 0001 la frecuencia de la señal
" " " " "
debe ser 1Khz, y para valor P1.24…P1.21 = 1111 debe de ser de 15Khz. Para el
"valor P1.24…P1.21
" " " " = 0000 "la frecuencia
" " " será" " de 100Hz." " " " " " "
" La forma " de onda " se "almacenará
" " en " un " array de" 50" elementos. " " Este "array " se " " "
calculará al principio del programa principal. Para el cálculo de los elementos del"
" " " " " " " " " " " " " "
"array " puede " hacer
" " " uso de la función sin(). Recuerde que la función sin()
admite como parámetro el ángulo en radianes y devuelve un valor entre -1 y 1.
" " " " " " " " " " " " " " " " "
En el array se almacenarán 50 muestras correspondientes a un ciclo, con valo-
" ""
res entre 0 y 1023 (Figura 7.1).
"
などにぬ"

8̇Øæø"

ど" "
" ど" 0(Œ̋øæ"¸̋"Œ­̋œßø̇" ねひ"
Figura 7.1. esquema
" " De llenaDo
" " Del" array
" "con" una
" señal
" sinusoiDal
" .

"" " " " " " " " " " " " " " " " " " "
" " Las 50" muestras
" de" la" forma
" de onda " que están " almacenadas
" " " " "en el array se
" " "
" deben" sacar
" por el
" " " DAC en
" " un tiempo
" " que depende
" " de la
" " frecuencia seleccionada
" " " " "
para
" "la señal,
" y "a continuación
" " "se volverá
" " a" sacar" otro
" ciclo" de la forma
" " de onda. " " "
Para ello se necesitará
" " " un
" temporizador de manera que cada vez que se ejecute su
ISR permita sacar por el DAC una nueva muestra. Se empleará para las tempori-
"zaciones
" " " 0.
el Timer " " " " " " " " " "
" " " " " " " " " " "
" "
" "
" " "
" " "
" " "
"
" "
" " "
"
" " " "
" " "

" " " " " " " " " " "

" " " " " " " " " " " "" " " " " " " "
" " " " " " " " " " " " " " " " "
" " " " " " " " " " " " " " " " " " "
PrácticA 7 - conversor DigitAl AnAlógico (DAc)
" " " " " " " " " " " " " " " " " 65"
" " " "

'º"̋Ø"2øæ̌ø̇Œ̇"ば に"œ̋"Œ­̋œßø̇º"̇Ø̌­º̇œ"¸̨̋ƺÆ̊Ææº̋œ "¸̋̊Ø̇ø̇̊Ææº̋œ"ıøæßæßÆıæ"¸̋"̨­º̊Ææº̋œ" "Ø̇"


hwpek„p"ockp*+"swg"fgdg"gorngct"rctc"gn"fgucttqnnq"fg"uw"rtqitcoc0"
%kpenwfg"$nre39zz0j$"
%kpenwfg"$ocvj0j$"
%fghkpg"FCEaDKCU" 2z22232222"
%fghkpg"PWOaOWGUVTCU" 72"
%fghkpg"RK"503637;"
"
wkpv38av"QpfcUgpqkfcn]PWOaOWGUVTCU_="
wkpv:av"EqpvcfqtOwguvtcu?2."HtgewgpekcMj|="
"
xqkf"FCEKpkv*"xqkf"+="
xqkf"Kpkekcnk|cCttc{*xqkf+="
xqkf"EqphkiwtcIRKQ*xqkf+="
xqkf"EqphkiwtcVkogt2*xqkf+="
xqkf"EqphkiwtcKpvgttwrekqpgu*xqkf+="
" " " " " " "
wkpv: v"NggtHtgewgpekc*xqkf+="
"pv"ockp"*xqkf+"
kpv"ockp"*xqkf+"
k
}"
} "
"""" F FCEKpkv*+="
CEK p kv*+= "
" " " " " " "
Kpkekcnk|cCttc{*+="
K pk ek cn k|cC ttc {* +="
" E
EqphkiwtcIRKQ*+="
qphkiwtcIRKQ*+="
" H
HtgewgpekcMj|?NggtHtgewgpekc*+="
tg ew gpek cMj |? Nggt Htg e w gpek c*+= "
" E
EqphkiwtcVkogt2*+="
qp hk iwtc Vko gt 2*+= "
" E
EqphkiwtcKpvgttwrekqpgu*+="
qp hk iwtc Kpv gt twre kqp g u *+= "
" "
" y
yjkng*3+="
jk ng *3+= " "
"
Programa
" " 7.2. "DeFiniciones
" " , Declaraciones
" " " " Del
" PrototiPo
" " " De " Funciones
" " " "
y la Función main() a utilizar en el" Desarrollo Del Programa.

" " " " "


" " " " " " " " " " " " " " "
"
7.2.2. Desarrollo" de" la actividad
""

" " " " " " " " " " " " "
A partir" de las
" definiciones
" " " "de" variables y" declaraciones
" " " prototipo
" que se indi-
can,
" desarrolle las siguientes funciones del programa:
" " " " " " " " " " " "
1. " Escriba
" "
la función
"
void DACInit(void) que inicializa el DAC. La
configuración del terminal P0.26 no debe afectar a la configuración de los
"
demás terminales.
" " " " " " " " " " "
" " " " " " " " " " " " " " " "
" " " " "
" 2. Escriba la función void InicializaArray(void) necesaria para
" inicializar
" " el" array de"la forma de onda. " " " " " " " "
" " " " " " " " " "
"

"
" " " " " " " " " " " " " " " " " " " " "
" " " " " " " " " " " " " " " " " "
" " " " " " "
66 PrácticAs De lAborAtorio De sisteMAs electrónicos DigitAles

3. Escriba la función void ConfiguraGPIO(void) necesaria para con-


figurar los terminales P1.21 a P1.24 y P2.12 sin afectar al resto de termi-
nales (selección de función, con resistencia de pull-up y de entrada).

4. Escriba la función uint8_t LeerFrecuencia(void) que lee el


valor de los terminales P1.21 a P1.24 y lo devuelve como valor de retorno.

5. Para sacar las muestras de la señal senoidal por el DAC se va a emple-


ar el Timer 0. Calcule el periodo con el que debe interrumpir el Timer
0 para generar las frecuencia de la onda de la señal de salida de 1Khz y
15Khz.

6. Teniendo en cuenta que Timer 0 va a funcionar a 50Mhz, con un valor


de PRE=0, e interrumpiendo cada vez que alcance el Match 0, calcule
el valor que se debe cargar en el registro MR0, en función de la fre-
cuencia de la señal senoidal de salida, para la salida tenga la frecuencia
correcta.

7. Escriba la función void ConfiguraTimer0() que a partir del valor


de frecuencia almacenado en la variable global FrecuenciaKhz esta-
blezca correctamente el periodo de interrupción del Timer 0, empleado
para sacar las muestras de la señal por el DAC. Tenga en cuenta aquí que
cuando el valor de FrecuenciaKhz sea de 0 se debe generar una señal
de 100Hz.

8. Escriba a continuación la función void ConfiguraInterrupcio-


nes(void) de manera que la interrupción EINT2 tenga más prioridad
con desalojo que la del Timer 0.
PrácticA 7 - conversor DigitAl AnAlógico (DAc) 67

9. Escriba a continuación la función de atención a la interrupción de la


EINT2.

10. Escriba a continuación la función de atención a la interrupción del Timer 0.

11. Complete con el programa principal. Compílelo sin errores y simúlelo en


el entorno Keil µVision®4.

7.2.3. Ejecución del programa

Una vez tenga el programa completo simulado, descárguelo a la tarjeta de


desarrollo y compruebe su funcionamiento. Para ello visualice en el oscilosco-
pio la señal del terminal P0.26 (AOUT). Mida la frecuencia de la señal obtenida
para distintos códigos de P1.24…P1.21.
Práctica 8

conversor analógico Digital (aDc)

introDucción

En esta práctica se va a usar una de las entradas analógicas de la tarjeta. Se


trata de aprender a configurar y usar el ADC que convierte la señal analógica de
dicha entrada en un código digital. Para ello, se estudiará su funcionamiento y se
desarrollarán los programas para la inicialización y lectura de los conversores.
Posteriormente se representará mediante los 2 LEDs de la tarjeta los rangos de
valor analógico en los que se encuentra la señal.
La práctica está dividida en dos actividades; en la primera se iniciará la con-
versión analógico-digital y la lectura del valor mediante la correspondiente orden
por programa (lo que se ha denominado orden de conversión explicita) y se espe-
rará hasta que la conversión AD se haya realizado (desde que se da la orden de
lectura y conversión hasta que el valor está convertido y disponible como un dato
binario trascurre un tiempo). Se sabe que la conversión ha finalizado muestrean-
do (polling) el bit correspondiente en un registro. Posteriormente se lee el valor y
se representa el rango que se encuentra en los dos LEDs de la tarjeta (P3.25 y
P3.26). En la segunda actividad se trata de cambiar el modo de detección de final
de conversión; en este caso en lugar de esperar muestreando, se programará para
que se genere una interrupción cuando finalice, y en ese momento se leerá el códi-
go binario correspondiente al valor de la señal analógica y se representará.

8.1. actividad 8.1. Detección de fin de conversión por muestreo


(no presencial)

Para la realización se deben seguir los siguientes pasos:


1. Lectura del Anexo IX “Resumen de las Entradas Analógicas y conversión
ADC en tarjeta de desarrollo con LPC1768_H. configuración y registros
implicados”.
70 Prácticas de laboratorio de sistemas electrónicos digitales

2. Ampliación de conocimientos mediante la consulta del capítulo 29 (página


585) del manual “UM10360 LPC17xx User manual Rev4.1”
3. Simulación/emulación de las funciones de configuración y medida a desarro-
llar en la actividad no presencial.

8.1.1. Descripción de la funcionalidad a realizar

Se trata de conectar a la entrada analógica AD5 una tensión analógica que


pueda ir variando para comprobar el funcionamiento del conversor. Esto podría
conseguirse fácilmente mediante un generador de funciones, pero para simplifi-
carlo, se pueden conectar los terminales fijos de un potenciómetro (de 100KΩ
p.e.) en la propia tarjeta a dos pines, uno de 3V3 y otro de GND, y el cursor se
conectará a la entrada AD5 como se muestra en la Figura 8.1. De esta manera
moviendo el cursor tendremos a la entrada AD5 una tensión analógica variable,
" entre
" 3,3V y" 0V.
" " " "

" "
Figura 8.1. conexión De un Potenciómetro Para obtener una señal analógica
" " " " " " " " " "
variable a la entraDa Del aDc.
" " " " " " "

" " " " " " " " " " " " " " " " "
" "Para" indicar la lectura
" " " " " " " " " "
de la tensión convertida a digital, mediante los LED’s que " " " "
" " " la tarjeta" posee conectados
" " a los " " terminales " "(P3.25
" " " se indicará" el código
y P3.26), " " " "
" “00”" si la tensión
" " se encuentra" " entre" 0" y 0,825V
" (códigos
" " " entre 0x0 " y" 0x3FF); si" la " " "
" tensión" se encuentra
" " entre
" 0,826 " y" l,65V (códigos
" " " 0x400
entre " " " y "0x7FF) se " indica-
" " "
" " rá "el código" “01”;" si la tensión" " se encuentra
" " entre
" " 1,66 y " 2,475V " (códigos entre
0x800 y 0xBFF) se indicará el código “10” y si la tensión se encuentra entre 2,47V
" y 3,3V (códigos
" " entre 0XC00 " y" 0xFFF)
" se indicará el código “11”.
" " " " " " " " " " " " " " " " " "
" " " " " " " " " " " " " " "
" " " " " " " "
Práctica 8 - conVersor analógico digital (adc) 71

8.1.2. Descripción del programa en C

El programa a desarrollar en C deberá ser capaz de inicializar el hardware y


los pines de los puertos, de forma que todo funcione de la manera indicada. No
obstante se detallan a continuación, a grandes rasgos, los pasos a ejecutar.
Se deben generar funciones en C para inicializar los LEDs, para iniciar el
ADC, para lanzar la conversión analógico-digital y leer el resultado de la misma.
Por simplicidad, se recomienda utilizar variables globales en todo el programa.

• No olvide cargar en proyecto los ficheros startup_lPc17xx.s y


system_lPc17xx.c.
• No olvide incluir en su programa: lpc17xx.h, type.h, adc.h.
• Considere, si lo necesita, que la frecuencia del reloj del sistema es de 100
MHz.

8.1.3. Desarrollo de la actividad

1. Desarrolle una función de retardo e indique el valor de la constante a pasar


como argumento para que el retardo sea de un segundo (cualquier otro
valor se podrá obtener multiplicando por el factor de escala). Esta función
se usará en la inicialización de los pines de los puertos como se indicará
posteriormente.

Desarrolle una función para inicializar el canal 5 del ADC. Tenga en cuenta que:

• Tiene que habilitar el pin correspondiente del puerto como entrada ADC, y
asegúrese de que no se configura con resistencia ni de PULL-UP ni de
PULL-DOWN.
• Debe habilitar el reloj del periférico controlador adc (registro
PCONP “lPc_sc->PconP”), ya que por defecto está inhabilitado para
disminuir el consumo.
• Debe activar el canal ADC que desea en el registro ADCR.
• Debe desactivar la conversión del ADC, (No START en el registro ADCR),
para lanzarla cuando el programa lo indique.
• Debe programar la frecuencia de conversión del conversor en el registro
ADCR (por ejemplo con un factor de división 0x0A).
• Active la conversión generada por software (no modo burst).
72 Prácticas de laboratorio de sistemas electrónicos digitales

• Desactivelageneracióndeinterrupciones.
• PongaelADCoperativoPDN=1.

2. Desarrolleunafunciónque:generelaordendeconversión,muestreehasta
comprobarquelaconversiónhafinalizado,parelaconversióncuandoesto
hayaocurrido,leaelcódigodigitalcorrespondientealvalordetensióny
retornealprogramaprincipal.

3. DesarrolleunafuncióndeinicializacióndePuertosparadefinirlosLEDSde
latarjetacomosalidas,conresistenciadePULL-UPysindrenadorabierto.
Para comprobar la inicialización haga que parpadeen simultáneamente dos
vecesconunacadenciadedossegundos.Alfinalizardebenquedarapagados.

4. Generelafunciónmain()delprogramaapartirdelasfuncionesanteriores,
deformaqueserealicelafuncionalidaddescrita.

5. Escribaelprogramacompletoconsiderandotodaslasdefinicioneseinclu-
des necesarios.

8.1.4. Ejecución del programa

Unavezgeneradoelproyectobasadoenelprogramadescárgueloenlatarjetay
compruebesufuncionamiento.Escribalasobservacionesquecreapertinentes.

8.2. Actividad8.2.Deteccióndelfindeconversiónmedianteinterrupción
(Presencial)

En este caso se deben repetir los pasos de laActividad 8.1 (no presencial),
perovariandoalgunosaspectosenelprocedimientoyfuncionalidad.
Práctica 8 - conVersor analógico digital (adc) 73

El primero es que cuando se dé la orden de conversión, se volverá al progra-


ma principal en lugar de esperar muestreando cuándo finaliza la misma. Cuando
la conversión finalice se generará una interrupción y su isr se encargará de
desactivar el aDc, realizar la lectura y presentar el valor. La segunda modi-
ficación consiste en que, en función del valor de tensión leído, los LEDS parpa-
dearán alternamente con tiempos de parpadeo de 4s, 2s, 1s y 0,5s. De 4 segundos
cuando el valor de tensión es cero (0x00) a 0,5 segundos cuando el valor es de
3,3V (0xFFF).
Los aspectos a modificar o desarrollar son:

1. La función de inicialización del canal del ADC, se debe configurar para


que genere una interrupción cuando convierta (registro ADINTEN), y se
debe habilitar la IRQ correspondiente del ADC en el NVIC. No debe espe-
rar a la conversión ni parar el conversor ni leer el valor de conversión.

2. Se debe generar una nueva función para la ISR de la interrupción


(adc_irQHandler) que pare el conversor, borre el flag correspondiente de
la interrupción, lea el valor de conversión y haga parpadear los LEDS con
la cadencia correcta.

3. Se debe generar la función main() del programa a partir de las funciones


anteriores, de forma que se realice la funcionalidad descrita.

4. Escriba el programa completo considerando todas las definiciones e inclu-


des necesarios.
Anexo I

ProgrAmAcIón en ensAmblAdor con KeIl µVIsIon®4

I.1. IntroduccIón

Este anexo presenta un pequeño tutorial sobre cómo desarrollar programas en


ensamblador, utilizando el entorno de desarrollo Keil µVision®4.

• Se puede descargar una versión gratuita limitada a 32K completando un


formulario previo: https://www.keil.com/demo/eval/arm.htm.
• En el Aula Virtual se puede encontrar la versión con la que se trabajará
en el laboratorio.

I.2. ¿Qué es KeIl µVIsIon®4?

El entorno de desarrollo Keil µVision®4 es una herramienta IDE (Entorno de


Desarrollo Integrado) profesional para el desarrollo de aplicaciones basadas en
microcontrolador. Este entorno engloba una serie de componentes mediante los
que se pueden llevar a cabo los procesos inherentes al desarrollo y depuración
de aplicaciones. La Figura I.1 muestra los módulos que integran este entorno de
desarrollo.
" " " " "
" " " " " " " " " " " " "
" " " " " " " " " " "
" " " " " " " " " " " " " " " "
76" " " " " Prácticas
" " " de sistemas
de laboratorio " " electrónicos
" digitales
" " "
" " " " "

"
®
FIgurA I.1. módulos
" " Que" IntegrAn
" el
" " entorno
" "de desArrollo
" " KeIl µV
" IsIon 4.

La interfaz de este entorno permite definir las características del proyecto,


como" el" tipo de procesador
" " "utilizaremos,
que " tipo de optimización a la hora de "
compilar, tipos de ficheros al ensamblar (o compilar) y montar, etc. Keil µVi-
sion®4 permite, asimismo, depurar el código desarrollado. Dispone del modo
depuración, mediante el cual vuelca el código en la placa de desarrollo o placa de
aplicación final, ejecutándose el código en esta y comunicándose con Keil µVi-
sion®4. Para ello, el PC y la placa de desarrollo se conectan mediante un cable de
conversión USB a JTAG. También es posible realizar la depuración sin un sopor-
te físico o placa de desarrollo que ejecute realmente el código; Keil µVision®4
integra un potente simulador con el que se puede simular el funcionamiento del
procesador y todos los periféricos que este integre.
Los ficheros fuente creados con el IDE de Keil µVision®4 se pasan al compi-
lador o al macroensamblador para ser procesados y obtener los ficheros objeto
reubicables, que luego pasan al módulo montador para obtener el fichero ejecu-
" " " " " " " " " " " " " " "
" " " " " " " " " " " " " " "
" " " " " " " " " " " " " " "
" "
" " " " " " " " " " " " " " " " "
" " " " " " " " " " " " " " " "
" " anexo i - Programación
" " en ensamblador
" " con Keil
" µVision
" ®
4 " " " " 77

" " " " " " " " " " " " " " " "
table. Los ficheros ejecutables (.HEX) se utilizan, por ejemplo, para programar la
" " " " " " " " " " " "
memoria Flash del microcontrolador.
" " " gestor de "librerías
El " permite " "la utilización
" "
de librerías " de módulos " "
de objetos " "
" " previamente" " " " " " "
generadas con el compilador o el macroensamblador. Keil µVi- "
®
" " sion
" 4 también
" incluye
" " una serie de " librerías,
" por" ejemplo,
" las "que" incluyen" cier- "
tas
" " " funciones matemáticas,
" " " etc. " " " " " " " "
" " " " " " " " " "
I.3. creAcIón de un Proyecto en ensAmblAdor
" " " " " " ""
Para la ejecución y prueba de un programa ensamblador es necesario seguir
" " los siguientes
" " pasos:
" " " " " " " " " " "
" " " 1. Ejecute" el programa
" " " µVision
Keil " " ®4 y cree
" "
un nuevo " ejecutando
proyecto, " " " "
" " en" el menú:" Project
" -> new" " uVision "Project.
" " Debe aparecer
" " " la ventana
" "
" que se muestra en la Figura I.2.

"
FIgurA" I.2.
"
VentAnA
"
N
"
ew Project.
"

" " "En "la ventana " de diálogo,


" " darle "un"nombre al" proyecto
" " "
y almacenarlo "en una " "
" carpeta" vacía," creada" previamente " para
" dicho" proyecto.
" El" nombre no" puede
" "
" " contener
" " " " " "los
" " caracteres
" " " " " " siguientes:
" " " "" = ^ ~ ‘ “ ` *. ; - ? [ ] ( ) ! & ~ < >@.
2. Seleccione el microprocesador para el que vamos a crear el proyecto, que
" " " en este caso será del " fabricante
" " " NXP, modelo
" " " "
LPC1768 " “oK”,
y pulse " " ver " " "
" "Figura" I.3. " " " " " " " ""
78 Prácticas de laboratorio de sistemas electrónicos digitales
""
""

""

"
"
" " VentAnA
FIgurA I.3. " " " device.
" " " Select
" "
" " " " " " " " " " " " " " "
" " " que
3. Indique " NO
" copie
" " código
el " " "
de" inicialización " LPC17xx,
del " " " ver Figura I.4.
" " " " "
"
" " " " " " " " " " " " " "
"

"
"
FIgurA I.4. " VentAnA
" " de
" seleccIón
" " " StartuP
del " code.
" " " " " " " "
" "
" En "muchos
"
" "
programas
" "
" necesario
es "
"
"
" tener
"
" " algún
" "
" tipo
"
" " de código
" "
" de iniciali- "
"
"
" " " " "" " " " " "" " " "" " " " " "
" zación (startup" code) " del
" microcontrolador " " " que debe " " coincidir
" " con
" la con-"
" " " " " " " " " " " "
" "" "
figuración " " "su
de " " " " "" " " " " "" " " " " ensam-
" " "
" " " " diseño de " hardware. " " " Cuando se trabaja " " en lenguaje"
" " "" "
" " la inicialización
blador, " " " "" "
" microcontrolador
del " realiza
se " "" " "
mediante un con- "
" " " " " " " " " " " " " "" " " " "" " " " " " " " ""
" " "junto de " directivas
" " propias de" ""las" herramientas
"" " " " " de" " "
desarrollo. "" " " "
" " " " " " " " "
4." En" la ventana
" " del proyecto, despliegue el árbol, y pulse con el botón dere-
" " " cho en " “source
" "group 1”," ver " Figura " " " " "
I.5. " " " " "
" " " "

"
"
" " " " "
" " " " "
" " " " " " " " " " " " " " " " "
" " " " IgurA
F " " I.5. V
" entAnA " del" Proyecto
" " ." " " " " "
" " " " " " " " " "" "" " " " " "
" " " " " " " " " " " " " "
" " " " " "" " " " " " " " "" " " " " " "" "" " " "" " " "
" " " " " " " " " " " "
"" " " " " " " " "" " " " " """ " "" " ""
" " "" " " " "" " " " " "" "
" " " "" " " " " "
"" " " " " " "" " " " " " " "" " "
"
" " " " " " "" " " " " " " " "
""
" " " " " " " " " " " " "
anexo i - Programación en ensamblador con Keil µVision®4 79

5. Seleccione “add existing files to group ‘source group 1’…” y añada el fiche-
ro “fichero.s” que contiene el código fuente en ensamblador, ver Figura I.6.
Dicho fichero tiene que haberse creado con anterioridad utilizando una herra-
mienta cualquiera de edición de texto o la del propio Keil µVision®4 (File/new).
También se puede crear en el propio entorno añadiendo un new file y luego guar-
" " dándolo y" añadiéndolo
" " a “add existing
" "files to group ‘source group 1’…”.

"

"

"
FIgurA I.6. VentAnAs
" " PArA
" AñAdIr
" " un
" FIchero
" exIstente
" " " Proyecto.
Al

" "
80 Prácticas de laboratorio de sistemas electrónicos digitales

""
6. En la ventana de proyecto pulse con el botón derecho sobre “Target 1” y
" "seleccione
" " “Options
" " for Target
" " " ‘Target
" 1’…”,
" ver" Figura
" I.7.
" " " "
" " " " " " "

"
FIgurA I.7. VentAnA
" " de "conFIgurAcIón
" " " del dIsPosItIVo
" .
" " " " " " " " " " " " " " " " " "" "
7. Vaya" a" la solapa
" "“linker”" " y active la casilla “Use memory layout from tar-
" " "get dialog”.
" " " " " " de diálogo,
Cierre el cuadro " " ver Figura
" " " "
I.8. " "
" " " " " " "

"
"
FIgurA I.8. V
" entAnA
" "de" conFIgurAcIón
" " del “l
" iNker”.
" " " " " " "
" " " " " " " " " " " " " " " " " "
" "
" " " " " "
anexo i - Programación en ensamblador con Keil µVision®4 81

8. " Para
" compilar:
" " Project
" -> build
" target
" o el botón que se indica en la Figu-

" " ra I.9. " " " " " " " " " " " " " " ""
" " " " " " "

" " " " " " " " " " " " " " " " ""

"
FIgurA I.9." c" omPIlAr
" Proyecto
" .
"
" " " " " " " " " " " " " " " " " "
9. Si no hay errores, pulsar
" " el botón
" de Iniciar
" Simulación que se muestra en
" " " "
la Figura
"
I.10.
" " " " " " " " " " " " "
"
+ºÆ̊Æ̇ø"
œÆŒ­Ø̇̊Æ º"

"
" "
" " " " " %æŒıÆØ̇̊Æ º"
"
" " " " " " " " " " " " œÆº"̋øøæø̋œ"
" " "
FIgurA" " " " " Proyecto.
" " " " " " I.10. s"ImulAcIón
" " del
" " " " " " " "
" " " " "" " " "" " " "" " "" " " " " " " "" " " "
" " "10. "En la "simulación
" " puede
" ver
" "los valores
" " de registros
" " "internos, memoria,
" " "
" "ejecutar el programa
" " " " paso" a paso,
" " poner "puntos
" " " " ver los "tiem-
de ruptura,
"
"
pos de ejecución de una instrucción o un conjunto de instrucciones, etc.
" En la Figura I.11 se muestran los resultados de la simulación.
"
"
"
"
"
"
"
82 Prácticas de laboratorio de sistemas electrónicos digitales
""

8̋ºß̇º̇"¸̋" 8̇Øæø̋œ"¸̋"
Øæœ"ø̋̌Æœßøæœ" 8̋ºß̇º̇"¸̋" ­º̇" æº̇"¸̋"
¸̋œ̋ºœ̇Œ̈Ø̇¸æ" Œ̋ŒæøÆ̇"

""
""

6Æ̋Œıæ"ßø̇ºœ̊­øøƸæ"
"
FIgurA I.11. resultAdos de lA sImulAcIón del Proyecto.
" " " " " " " "

Se" pueden
" "
visualizar " "
hasta " "
4 zonas del" mapa
" " " " " "
de memorias a la vez, "en venta- "
" " " " " " " " " " "
nas diferentes. Para añadir una nueva ventana de memoria ir al menú
View/memory Windows.
Anexo II

PrIncIPAles dIrectIvAs de ensAmblAdor

name eQU expr

La directiva EQU asigna un nombre simbólico a una constante. En el Progra-


ma 1.1 se emplea para asignar el nombre STACK_TOP al valor 0x10004000,
mediante la línea STACK_TOP EQU 0x10004000.

AreA section{,attr}...

La directiva AREA permite definir distintas secciones de código o datos. El


parámetro section corresponde con un nombre que el programador asigna a la
sección. Este nombre opcionalmente puede ir entre barras ‘|’. A continuación
puede llevar una serie de atributos separados por comas que definen el tipo de
sección. Algunos de los más habituales son:

• CODE: Define una sección de código que contendrá código máquina.


• DATA: Define una sección de datos.
• READONLY: Indica que la sección es de sólo lectura.
• READWRITE: Indica que la sección es de lectura y escritura.

En el Programa 1.1 aparece en tres ocasiones:

• AREA RESET, CODE Define un área denominada RESET para código.


• AREA Constantes, DATA, READONLY Define un área denomi-
nada Variables para datos constantes.
• AREA Variables, DATA Define un área denominada Variables
para datos variables.
84 PRácTicaS dE laboRaToRio dE SiSTEmaS ElEcTRónicoS digiTalES

{label} dcd expr{,expr}

Define datos en memoria. Puede manejar tanto valores como etiquetas. En el


Programa 1.1 se emplea en varias ocasiones.

DCD STACK_TOP Define un dato al que asigna el valor de la etiqueta


STACK_TOP. Es la primera directiva DCD que apa-
rece en la sección de código por lo que asignará el
valor en las direcciones 0x0000_0000 a
0x0000_0003.
DCD inicio Define un dato al que asigna el valor de la etiqueta
inicio. Esta etiqueta contiene la dirección de la pri-
mera instrucción del programa, que se ejecutará tras
un reset. Almacena dicho valor en las direcciones
0x0000_0004 a 0x0000_0007.
Lista DCD … Define una serie de datos contantes de 32 bits en
memoria. La lista de valores se puede indicar en
decimal o hexadecimal, van separados por comas y
se puede referenciar por la etiqueta Lista.

{label} dcb expr{,expr}

Su funcionamiento es idéntico a DCD, pero en este caso define datos de tama-


ño 8 bits. En el Programa 1.1 aparece en la línea:

Num DCB 10

En la que se define en memoria una dato de tamaño 8 bits, con valor 10 en


decimal, y lo podemos referenciar con la etiqueta Num.

{labEl} SPACE ExPR

La directiva SPACE permite reservar espacio en memoria. Aparece tres veces


en el programa. En la primera, SPACE (0x400-8), se reservan 0x3F8 bytes a
continuación de los 8 primeros bytes para que el programa principal empiece en
la dirección 0x400 (cuando se expliquen las excepciones se entenderá porqué
dejar libre las primeras posiciones de memoria). La segunda, Suma SPACE 40,
reserva espacio de 40 bytes para almacenar el resultado de la ejecución del pro-
anExo ii - PRinciPalES diREcTiVaS dE EnSambladoR 85

grama (10 datos word). La tercera, Numeros SPACE 80, reserva espacio de 80
bytes para almacenar el resultado de la ejecución del programa (20 datos word).

entrY

La directiva ENTRY declara un punto de entrada a un programa.

end

Informa al ensamblador que se ha llegado al final del código fuente.


Anexo III

" DesensAmblADo De un progrAmA

" " " " " "


" " " " " " " " " " " " "
®
" Cuando
" " el entorno
" "Keil
" " µVision
" 4" desensambla el código ensamblador gene-
rado del Programa 1.1 da lugar al código fuente de la Figura III.1:
"
"
&Æø̋̊̊Æ º"̋º"Ø̇"ł­̋"œ̋"­̈Æ̊̇"Ø̇"ƺœßø­̊̊Æ º"
"
" % ¸Æ̌æ"Œ³ł­Æº̇"¸̋"Ø̇"ƺœßø­̊̊Æ º"
"
" +ºœßø­̊̊Æ º"æøÆ̌ƺ̇Ø"
" +ºœßø­̊̊Æ º"æ̈ß̋ºÆ¸̇"̇Ø"¸̋œ̋ºœ̇Œ̈Ø̇ø"
"
""""47<"""""""""""""""""OQX"t2.%;"""
2z22222622"H26H222;""OQX""""""t2.%2z2;"
""""48<"""""""""""""""""OQX"t3.%2""""
2z22222626"H26H2322""OQX""""""t3.%2z22"
""""49<"""""""""""""""""CFF"t3.%6""
2z2222262:"H3232326""CFF""""""t3.t3.%2z26"
""""4:<"""""""""""""""""OQX"t4.%2zC""
2z2222262E"H26H242C""OQX""""""t4.%2z2C"
""""4;<"""""""""""""""""OQX"t7.%2z32222222""""
2z22222632"H26H77:2""OQX""""""t7.%2z32222222"
""""52<"""""""""""""""""OQX"t6.t7"""
""""53<"""
2z22222636"684E""""""OQX""""""t6.t7"
""""54<"""""""""""""""""UVT"t2.]t7_"""""""""""
2z22222638"824:""""""UVT""""""t2.]t7.%2z22_"
""""55<"""""""""""""""""NFT"t5.]t7_"""""""""""
2z2222263:"8:4D""""""NFT""""""t5.]t7.%2z22_"
""""56<"""""""""""""""""UVT"t2.]t7.%6_""""""""
2z2222263C"828:""""""UVT""""""t2.]t7.%2z26_"
""""57<"""""""""""""""""NFT"t5.]t7.%6_#"""""""
""""58<"""
2z2222263E"H:775H26""NFT""""""t5.]t7.%2z26_#"
""""59<"""""""""""""""""UVT"t3.]t7.t3_""""""""
2z22222642"728;""""""UVT""""""t3.]t7.t3_"
""""5:<"""""""""""""""""NFT"t5.]t7.t3_""
""""5;<"""
2z22222644"7:8D""""""NFT""""""t5.]t7.t3_"
""""62<"""""""""""""""""UVT"t6.]t7_.%4""
""""63<"""""""""""""""""""
" "" """""" "
"""" """"""""""""""""" " ""
"""" """""""""""""""""""
" "" """""" "
"""" """"""""""""""""" " ""
" """""" """""" "" " "
"""" """"""""""""""""" " """""""
"""" """
" "" """""" "
"""" """"""""""""""""" " """"""""
" """""" """""" "
"""" """"""""""""""""" " ""
"""" """
88 " """""" Prácticas de laboratorio
"""""" " de sistemas electrónicos digitales
"""" """"""""""""""""" " ""
"""" """""""""""""""""""
2z22222646"H:676D24""UVT""""""t6.]t7_.%2z24"
""""64<"""""""""""""""""NFOKC"t6.}t2/t4 ""
""""65<"""""""""""""""""""
2z2222264:"G:;62229""NFO""""""t6.}t2/t4 "
""""66<"""""""""""""""""NFT"t2.?Nkuvc""
2z2222264E"6:29""""""NFT""""""t2.]re.%4:_""="B2z2222266E"
""""67<"""""""""""""""""NFT"t4.?Pwo""
2z2222264G"6C2:""""""NFT""""""t4.]re.%54_""="B2z22222672"
""""68<"""""""""""""""""NFTD"t3.]t4_""
2z22222652"9:33""""""NFTD"""""t3.]t4.%2z22_"
""""69<"""""""""""""""""NFT"t4.?Uwoc""
2z22222654"6C2:""""""NFT""""""t4.]re.%54_""="B2z22222676"
""""6:<"""""""""""""""""OQX"t5.%2z22""
2z22222656"H26H2522""OQX""""""t5.%2z22"
""""6;<"""""""""""""""""OQX"t7.%2z6""
""""72<"""
""""73<"nc|q""
2z2222265:"H26H2726""OQX""""""t7.%2z26"
""""74<"""""""""""""""""NFT"t6.]t2_""
2z2222265E"8:26""""""NFT""""""t6.]t2.%2z22_"
FIgurA III.1. ejemplo De DesensAmblADo De un progrAmA.
" " " " " "" "
anexo iV

Programación en c con Keil µVision®4

"

" "
iV.1. introducción " " " " " "
" Este anexo presenta una introducción al manejo del entorno de desarrollo Keil
µVision®4, una herramienta software para el desarrollo de proyectos en lenguaje
C basados
" en microcontroladores.
" Entre otras cosas, permite compilar, simular,
depurar y cargar el código en un chip microcontrolador (LPC1768, en este caso).
" " " " " " " " " " " " " "
A continuación
" "
se hará
" "
una introducción
" "
a este "entorno
"
de desarrollo
" "
a " través
"
de un ejemplo sencillo
" " que
" ilustra
" la " creación" de un" proyecto,
" " su "simulación
" " " y
depuración
" " para visualizar
" variables
" " " así como
" el empleo de los breakpoints.
" " " " " " " " " " " " " " " "
" " " " " " " " " " " " " "
iV.2. " reación
c " " " de un" Proyecto
" " en" c

La
" Figura IV.1
" esquematiza
" " de" una
" "manera muy general los pasos que se deben
seguir en el diseño de un programa para desarrollar una determinada aplicación
" " " " " " " " " " " " " " " " " " "
con
" un microcontrolador.
" " " " " " " " "
"
#º³ØƜƜ"¸̋"Ø̇"̇ıØÆ̊̇̊Æ º"
"
¸̋œ̋̇¸̇"
"
"
&Æœ̋óæ"¸̋"Ø̇"̇ıØÆ̊̇̊Æ º "¸Æ̇̌ø̇Œ̇"¸̋"̈Øæł­̋œ"
"
"
%æ¸Æ̨Æ̊̇̊Æ º"
"
"
" &̋ı­ø̇̊Æ º"

" " " " " " " " " " "
Figura iV.1. Pasos en el diseño de un Programa Para microcontrolador.
" " " " " " " " " " " " " " " "
" " " " " " " " " " " " " " " " " "
" " " " " " " " " " " " " "
" " " " " " " " " " " " " " " " "
" " " " " " " " " " " " "
90 Prácticas de laboratorio de sistemas electrónicos digitales

A continuación, se ilustrará cómo crear un proyecto en Keil µVision®4 con el


programa fuente que previamente se ha escrito con un editor de texto o desde el
propio editor de Keil µVision®4, luego se compilará este programa y se simulará
para poderlo depurar y probar su funcionamiento.
Se comenzará creando un nuevo proyecto, siguiendo los pasos indicados en la
Figura IV.2. Si ya se hubiese creado un proyecto anteriormente, entonces habría
que abrirlo. A continuación se abre una ventana donde se escribe el nombre del
proyecto (Ejemplo1) y se guarda (Figura IV.2B). Luego se abrirá otra ventana
(Figura IV.2C) en la que hay que seleccionar el microcontrolador que se vaya a
utilizar (LPC1768). Para ello se selecciona el fabricante y se hace clic en el sím-
bolo ‘+’ a su izquierda, con objeto de que aparezcan todos los modelos que
corresponden a ese fabricante. En la siguiente ventana que se abre (Figura IV.2D)
" " " " " "
se pregunta si se desea copiar al proyecto un" fichero con una plantilla para iniciar
el
" código que se vaya a escribir (responder SI).
"
"
"
"
" #" $"

"
"
"
"
"
"
"
&"
"
"
%"
"
"
"
"
Figura" iV.2.
" Ventanas
" " Para
" " crear
" un" nueVo Proyecto
" " " ," seleccionar
" "
el Fabricante y el disPositiVo.
" " " " " " " " " " " " " "
" " " " " " " " " " " " " "
" " " " " " " " " " " " " " " "
" " " ""

" " " "


" " " " " " " " " " " " " "
anexo iv - Programación en c con keil µvision®4 91

El fichero startup_lPc17xx.s es similar a un Sistema Operativo, donde se rea-


liza una configuración inicial del microcontrolador, que permite al usuario traba-
jar con un nivel mayor de abstracción. Una vez realizada esta configuración se
llama a la función main(), que será la función principal del programa en C.

iV.2.1. configuración del entorno

A continuación se selecciona el compilador adecuado en la ventana de Confi-


guración del Entorno (Figura IV.3). A esta ventana se accede desde el menú de
“Keil Project -> Manage -> Components, Environment, Books…”. En la ventana
que se abre se selecciona la sol apa Folders/Extensions.

Existe la opción de elegir entre dos compiladores posibles:

1. Compilador Real/View: Es el compilador de ARM; en este caso se va a tra-


bajar con una versión libre y gratuita de evaluación restringida a 32Kbytes
de código. Para códigos más amplios es necesario comprar la licencia. Esta
es la opción que se selecciona en este ejemplo.
2. Compilador de GNU: Versión libre. " "
" "

"
Figura iV.3. Ventana
" de
" conFiguración
" " " de
" entorno
" . "
" " " " " " "
" " " "
" " " "
" " " " " " " " " " " " " " "
" " " " " " " " "" "" " " " " " " "" " " " " "" " "
" " " " " "" " "" "" " " " " "" " " "" " " " "
"" " " " " " " " " " " " "
92 Prácticas de laboratorio de sistemas electrónicos digitales
"
" " " " " " "
iV.2.2. configuración de opciones
" " " "
" Se
" puede renombrar
" " la" entrada" Target
" "1 como LPC1768
" (haciendo
" " click
" sobre
" " "
ella, tras
" estar previamente
" " seleccionada).
" " " Hacer
" click
" " con el " botón derecho
" " " del "
" ratón
" sobre la" entrada
" " lPc1768" para " que aparezca
" su" menú
" contextual
" y selec- " "
"cionar options for target ‘lPc1768’… (Figura IV.4).

"
Figura iV.4." m"enú contextual
" " " de lPc1768.
"

" " Una vez" aparezca


" la" ventana" ‘Options
" for" Ejemplo1’
" se" configuran
" las
" opcio-
" " "
nes que" aparecen " a continuación
" " " " " (Figuras" IV.5, " 6 y 7)." Se" selecciona
" " la "velocidad
" " "
de
" "reloj" que" viene
" "por "defecto
" "(12" MHz)," ya que" será
" " el valor
" " que se "usará en
nuestra tarjeta en el resto de prácticas.
" " " " " " " "

"
" " " " " " " "

"
"
"
"
"
"
"
"
"
"
Figura iV.5." oPciones
" " Para
" " la Pestaña
" "target.

"
"
"
"
"
"

anexo iv - Programación en c con keil µvision®4


" 93
" " " " " " "

"
"
"
"
"
"
"
"
"
"
"
"
"
Figura
" " iV.6. o
" Pciones
" " Para
" " d
la" Pestaña " . "obserVar
" ebug " " que
" " sólo " será
" " "
simulación, y no se Volcará el código" " sobre " ninguna Placa externa.

" "

" " " " " " " "

"
Figura iV.7. oPciones
" "
Para la Pestaña c/c++.
" " " " "

" " " " "


" " " " " " " " " " " " " " " "
" " " " " " " " " " " "
" " " " " " " " " " " "
94 Prácticas de laboratorio de sistemas electrónicos digitales

iV.2.3. agregar ficheros al proyecto

A continuación se renombra la entrada del árbol de proyecto source group 1


como startUp (Figura IV.8). Además de contener el fichero startup_lPc17xx.s,
se incluirá otro fichero llamado system_lPc17xx.c, necesario para la configura-
ción inicial del microcontrolador. Para ello, se debe proceder como se ilustra en
las Figuras IV.8 y 9 (system_lPc17xx.c se encuentra en la ruta
C:\Keil\ARM\Startup\NXP\LPC17xx\, pero es muy importante copiar este fiche-
ro en el mismo directorio que el proyecto e incluirlo desde ahí, para no correr el
riesgo de modificar el original). Ahora se debe situar sobre la entrada LPC1768
del árbol de proyecto, se hace click con el botón derecho y se selecciona add
group (Figuras IV.10). Se creará una entrada llamada new group que se renom-
brará como sourceFiles. Del mismo modo que se ha incluido el fichero
system_lPc17xx.c a la entrada startUp, se incluirá el fichero fuente xxx.c, pero
en la entrada sourceFiles que se acaba de crear (Figura IV.11). Es necesario saber
dónde se ha almacenado previamente los ficheros que se desean agregar para así
poder localizarlos.
NOTA: se puede editar previamente y guardar el fichero fichero .c con el lis-
tado de código que aparece en el Programa IV.1.

" " " " " " "

"
Figura iV.8. " menú
" contextual
" " de
" la
" entrada
" ‘start
" uP’.

"
"
" " " " " " " "
"
" " " " " " " "
anexo iv - Programación en c con keil µvision®4 " 95
"

"
" " " " " " " "
""
Figura iV.9. F" ichero
"
system_LPC17xx.C a ser agregado al Proyecto.
" " " " " " "
"
"

"
Figura iV.10. "agregar
" " " " " " "
" lPc1768.
gruPo sourceFiles a la entrada
"
" " " " " " " " "
" " " " " " " "
" " " " " " " "
" "
96 Prácticas de laboratorio de sistemas electrónicos digitales

" "

"
"
" " " " " " " "
Figura iV.10. agregar
" gruPo
" source
" " F" iles
" a la " lPc1768.
" entrada
"
"
xqkf"EcnewncEwcftcfq*kpv",qtkigp."kpv",fguvkpq."kpv"p+""
" " " " " " ""
}"
"
"""kpv"k="
""" " "
"""hqt*k?2=k>p=k--+"
""" "
"""" ,*fguvkpq-k+?*,*qtkigp-k++,*,*qtkigp-k++="
"""" "
""
"
"
"
"
ockp*+"" ""
}""
"" "
""uvcvke"ejct"xct3=" " "
""
""kpv"Vcdnc3]7_?}4.5.;.34.37" ="
"
"" "
""kpv"VcdncEwcftcfqu]7_=""
"" " " "
""uvcvke"kpv"k="
"
"
"" "
""xct3?2z34="
"" " " "
""EcnewncEwcftcfq*Vcdnc3."VcdncEwcftcfqu."7+="
"
"
"" "
""yjkng*3+"
"" "
""}"
""""" "
"""""k?2="
""""" "
"" "
"""""k?3="
""" "
"
" " " "
Figura iV.11. agregar main.C a la entrada sourceFiles.
" " " "" " " " " " " "
" " " " completa
" del" proyecto
" " " y el "
En la Figura IV.12 se muestra la estructura ejemplo
resultado de su compilación y enlazado mediante" "el comando " Build (F7) " " o " "
haciendo click sobre cualquiera de los iconos"" . "Obsérvese "la "ventana infe-
" " "
" " " " " " " "
"
"
" " " " " " "
" " " " " " " " " " " " "
" " " " " " " " " " " " "
" " " " " " " " " " "" " " " " " " " " " " " " " " " " " " " " "
" " " " "" " " " " " " " " " " " "" " " " " " " "" " " " " " " " "
""" " " " " "en "c" con "" "" " " "" """ " " "" " " " " " " " " " " 97" " "" ""
" " "
anexo "
iv - Programación " " " " "®4 "
keil µvision
" " "" " "" " " """ " " " " " " " " "" " " " "" " " " " " " " " " "" " "
" " " " " " " "
" " " " " " " " " " " " " " " "
" " " "rior"" "build" output
" " " "que indica "si se ha producido algún error durante la compila-
" informa" " " "" " " " " " " " " " " "
" " " ción " " y" "también " "" " sobre
" " el tamaño
" " "que ocupa
" " el programa.
" " "
" "
"
"
" "
" "
"
" "
"
"" "
"
"" "
"
"
" "
" "
" "
" "
"" "
"
"" "
"
"
" "
" "
" "
" "
" F"igura " iV.12. " c " omPilado " " y “Linkado " ”" del"" Proyecto " "(Zi-data " :" Zero initialiZed
" " "
" " "constantes
data, ro-data" son "" " " " .t
" " "amaño " " "" de
" total " " ram
"" " =" rW" " data" + Zi data
" . " " "
" " "tamaño
" " " " "
total de rom = code " " " " " " "
" + ro data)." " " " " " " " " "" "
" " "" " "" " "
" " " " " " " " " " " " " " " "" "" "" " "" " " "
" " " " " "" " " " "" " " "
" " " " " " " " " " " " " "
" " " iV.2.4.
" " " simulación
" " " "
"" " " " " " " " " " "" " " " " " " "
" " " " " " " " " " " " " "
" " " " " " " " " " " " " " "
" Una " " "que" se"ha compilado
" " vez " " " " el" "programa " " "tiene
" " " " se " " la "" " " " " " de ejecutar
" " posibilidad " " """ " el
""" pro-""" "" " " "
" " " grama " " " " " " " " " " " " ® " " " " " " "" " " " " "" " " " "" "
" " " en " el " simulador
"" " que
" " " "incluye "Keil " " µVision
"" " " 4 o "de cargarlo " " en una" placa de "des-"
" " " "arrollo " " externa """ " para " que " " "se" " ejecute
"" " físicamente " "" " en"el microcontrolador.
"" " " "" " De " "" momento, " "" " " " "
" " se hará "
" uso " "
" del" "simulador " "" para " ver" algunas " de "
" sus " " " " "
interesantes" posibilidades. " " " Para ello, " " " " " "
" " " " " " " " " "" " "" " " " " " "" " "" " " "
" " " " "se arranca "" " el" simulador " " " haciendo " " " " click " " " sobre " "el " botón
" " " "(F5) " y" aparecerá"" " la ventana
"" " " " " "
de" la "Figura "
" "
IV.13.
" " Estos"
" son " algunos" " "
comandos " "
que "
resultarán
" "
" de " utilidad:
"
" " "
" " " " " " " " "
" " " "" " " " " " " " " "" " " " "" " " "" "" " " " "
"• Se" " ejecuta" el" programa " paso "a " paso "haciendo " " un
" click
" " " "sobre " (F11)
" " por
" " " " " "
" " " " " cada " " " " " " " " " " " " " " "" "
" " instrucción. "
" "" " " "
" "" "
" "" " " "
"• Si" " se" "desea" que""se" ejecute "con "un simple " " " toda
" click " " " función,
una " " " sin " nece- "" " " " ""
" " " "sidad de " ejecutar " " " " "" " " " " " " " " " "
paso " a paso cada" una de las instrucciones que la compo-
" " " "" "
" " " " " " " "" " " " " " " "" " " " " "
" " " " " " "
" " " " "
" " " nen, "se" "debe "hacer "click" sobre " "(F10). "
" • " Para " " ejecutar
" " " todo " el
" código " " "hasta
" " la" "línea
" " donde" "" " hemos " " " " colocado
" " " el
" cursor," " " "
" " click "" "sobre el " " " " "" "
icono (Ctrl.+F10). " " " " " "" " " " "" " " " " " " " " " " " " "" " " "
" " " " " " " " " " "
" " " " " "
" " " " " " " " " " " " " "
" " " " " " " " " " " " " " "
" " "
" "" " " " " " " " " " " " ""
" " " " " " " " " " " " " " " " "" " "" ""
" " " " " " "" " " "" " " " " " "" " " " "
" " " " " " " " " " " " " " " " " " "" "" " " " " " " " " "
" " " " " " "
" " " " " " " " " " " " " " " " "
" " " " " "
" " " " " " " " " " " " " " " "
" " " "" " " "

"
98 " " " " " " de" laboratorio
Prácticas " de"sistemas electrónicos
" " digitales
" " "
" " " " " " "
" " "
• Para hacer reset y llevar la ejecución al comienzo del código se debe pul-
" " " " " " " " " " " " " " " " " "
" " " " sar "en "el "icono " "
" • " Si" lo que " " se desea " es " ejecutar " todo" el" código" de" una" vez,"" " (F5) "y " " para " "
"" " " " " detenerlo." "
" " " " " " " " " " " " "
" " "" A continuación
" " " "
se comentan algunas observaciones sobre las ventanas que
aparecen en la Figura IV.13:
" " " " " " " " " " " " " "
" " " " " "" " " " " " " " " "
" • En la ventana disassembly aparece el código traducido a ensamblador a
partir del código fuente en C de las funciones startup_lPc17xx.s y main.c.
" " " " " " "
" " •" En la zona " de " la izquierda
" aparece la ventana registers, con el nombre y
valor actual de todos los registros del microcontrolador. Se observa una
marca grisácea sobre el/los registros que se ven modificados cada vez que " "

" ejecutamos
" " " " un " paso con " Step(F11). " " " " " " " " " " "
• Se "puede " apreciar" "una flecha o cursor " " de color" amarillo " "que apunta " siem-
" "
" instrucción
pre a la " " " que se "va a " ejecutar " " (tanto en" la" ventana " " de ensambla- "
" "dor como " " "
en la de código c). " " " " " " " " " " "
" " " " " " " " " " " " " " " " "
• "También se muestra el tiempo transcurrido desde que se inició la ejecución del
" programa
" " hasta el " comienzo
" " de la instrucción " " actual
" " (parte " " inferior derecha).
" " "
• En" la" ventana "locals " " (parte inferior " " derecha) " vemos
" el valor " actual que van
" " "
tomando " variables
las " "del programa. " " " " " " " " " "
" " "

""
Figura iV.13.
" Ventana
" " inicial
" " del simulador
" .

" " " " " " " " " " " " " " " "
" " " " " " " " " " " " " " "
" " " " " " " " " " " " " " " " " "
" " " " " " " " " "
anexo iv - Programación en c con keil µvision®4 99

En la ventana locals también se puede comprobar que la variable tabla1 se


ha almacenado a partir de la dirección de memoria 0x1000025C. Para mostrar el
contenido de esta zona de memoria se hace click sobre la pestaña memory 1 y se
introduce en el campo address el valor 0x1000025C. Se coloca el cursor delante
de la línea CalculaCuadrado(Tabla1, TablaCuadrados, 5) y se
ejecuta hasta la posición del cursor (Ctrl+F10). En este momento ya está iniciali-
zada la variable tabla1 y en la Figura IV.14 se puede ver el contenido de la zona
de memoria donde se ha almacenado esta variable.
Resulta interesante observar que cada valor de tabla1 ocupa 4 bytes porque se
declaró como array de enteros. También se puede comprobar que el byte menos
significativo se almacena en la parte más baja de memoria (dirección menor de
las 4 afectadas). Se puede modificar a mano el valor de una posición de memoria
haciendo doble click sobre ella y editando su contenido.
Se puede visualizar el contenido de una variable determinada simplemente
situando el cursor sobre ella en la ventana symbols o en la ventana del código
fuente (en este último caso, la variable debe pertenecer a la función que se esté
ejecutando en ese momento).
Como ejercicio se recomienda, que observe dónde se almacena el array
TablaCuadrados[5] y que compruebe cómo se actualiza mientras el pro-
grama se ejecuta paso a paso. Repita los mismos pasos con la variable var1.
imPortante: Para visualizar la variable var1 es necesario hacer dos
cosas: definirla como estática (static char var1) y en las opciones del compilador
seleccionar optimization: level 0. Si no se selecciona este nivel de optimización,
tampoco se ejecutará el bucle while, porque el compilador ve una cadena de ope-
raciones sin mucho sentido: i=0; i=1; que las elimina del código compilado. Para
visualizar la variable var1 se puede hacer click con el botón derecho sobre ella y
seleccionar add ‘var1’ to…àWatch1, o bien escribiendo &var1 en el campo
address de la ventana memory 1.
" " " " " " "

" " " " " " " " " " " " "
" " " " " " " " " " " " " " " "
" " " " " " " " " " " " " " "
" " " " " " " " " " " " " " " "
100 " " " " " " Prácticas de laboratorio de sistemas electrónicos digitales
" " " " " " " " " " "
" " " " " " " " " " " " " " " "

"
Figura iV.14. contenido
" " de la
" " memoria
" " donde
" " se
" ha almacenado
" " " la Variable
"
tabla1.
"
"
"
"

"

" " " " " " " "


Anexo V

SimulAción de loS puertoS en el AnAlizAdor lógico

Este anexo continua con la presentación del manejo del entorno de desarrollo
Keil µVision®4. En este caso se trata de la utilización del analizador lógico para
visualizar señales o variables en el dominio del tiempo, uso de puertos y breakpoints.

V.1. utilizAción del AnAlizAdor lógico

El simulador dispone de un analizador lógico que permite ver variables y seña-


les de puertos en el dominio del tiempo. Para visualizar las variables en el anali-
zador, estas deben ser estáticas o globales; no locales. A continuación se muestran
los pasos para visualizar con el analizador lógico la variable i que se actualiza
constantemente en el bucle while del programa V.1.

• Cree un nuevo proyecto y compile el Programa V.1 analizador.c.


" " " " "
" " " " " " " " " " " " " " " " "
" " " " " " " " " " " " " " " " " " " " " " " " " ""
" "" " " " " " " " " " " " " "" " " " " "" " "" "
" " " " "" " " "" " " " " " " "" " " "" "" "" " "
" "" " " " " " " " " " " "
102" " " " " " " " de laboratorio
Prácticas " " de sistemas electrónicos
" digitales
" " " " " " " " " " " "
"
%kpenwfg">NRE39zz0J@""""""
" " """"""
kpv54av"k="
"
" " "
11Hwpek„p"swg"fg"tgvctfq"
"
xqkf"fgnc{a3ou*wkpv54av"u+"
" " " "
}" " " "
""wkpv54av"p="
"
""hqt*p?2=p>ou,364:5=p--+="
"" " "
" "" "
" "
kpv"ockp*xqkf+"
"
}" " "
""yjkng*3+}"
"
""""kh*k??2+"}"
"" "
""""""k?3="
"""" " "
""""""fgnc{a3ou*47+=""""""
"""""" "
""""""""""
" """"""
""""gnug}"
"""" "
""""""k?2="
"""" "
""""""fgnc{a3ou*47+=""""""
"""""" "
""""""""""
" """"""
""" """"
" "
" """ "
" progrAmA V.1. código
" del
" progrAmA
" " analizador
" .c."
" " " " " "
" " " " " "
" " " " " "
• Inicie la simulación del programa.
" " " " " " " " " " "
• "Haga click
" sobre
" el" icono
" "para" visualizar" el" analizador " lógico. "
" • Introduzca " " la variable " " "i en " el analizador, " simplemente " arrastrándola" " y sol-" " " "
"tándola
" en la " " ventana
"" " " " " analizador
del " " " " " (en" la parte " " " " " de la ventana,
izquierda "" " " " " "" " "
" " " de los "botones
debajo "" " "de set-up, """ load," save). "" " " Con un "" conjunto " " " de " variables,"" " " " "" "
"
se" procedería
" "" " " " " "
del mismo modo, arrastrándolas y soltándolas de una en una. " " " " " "
• Ajuste" la" escala " vertical haciendo click en el botón setup… de la ventana
" " "
del analizador " y rellene " con 0x0 " y 0x1 " las
" " cajas de " texto" min: " " y max:," res-" " "
" " " "
" " "Acepte "
" " y cierre "
" " haciendo " " "
" click
" " " " "
" el botón close. "También " " " " se " " " "
pectivamente. en
" " " " " " " " " " " " " " " "
puede ajustar la escala vertical abriendo el menú contextual sobre el anali-
zador y" seleccionando
" "
la opción" ‘Bit’." "" "
" " " " " ""
• Ajuste la escala de tiempo a 20 ms/div (grid: 20 ms) haciendo varios clicks
sobre el botón in del Zoom (o situándose sobre el valor de Grid y movien-
do la rueda del ratón).
• Habilite la casilla signal info para obtener información al colocar el pun-
tero sobre la señal.
" "
" " " " " " " " " " " " " " " "
" " " "" " " "" " " " "" " " "
" " " "
" " " " " " " " " " " " " " " " " " "
" " " " " " " " " " "
" " " V - simUlación" de los" PUertos
aneXo " " el" analiZador
en " " lógico " " " " " 103
" " " " " " " " "
" " " " " " " "" " " " " " " " " " " " " " " "
• Ejecute "paso a paso hasta entrar en el bucle while y observe la señal cua-
" " " "" " " drada " " ""que aparece ""
en
" " la
" "ventana
" " " del" analizador
" " lógico
" " a "medida que" cam-
" " "
bia el valor de la variable i en el bucle while.
"" " " " "" " " " " " "" " " " "" " " " " " " " "" " " " "
• Haga click sobre cualquier flanco de la señal para colocar una marca y
" "" " " " " luego
" " " colocar " " " el puntero
" " " del "" " ratón
" sobre "" otro "flanco
" para" visualizar
" " la dife- " " "
" "" " rencia
" de tiempos
" " (delta).
" " " " " " " " " " "
notA: Otra forma de especificar directamente un bit de una variable en el
" " " "analizador " " " " " " "
" " " " lógico, por " ejemplo el bit " 0" de" la variable
" " i, sería" la" siguiente:
" hacer
" " "
" " "click "en """""""" de" la" ventana" de" setup" del" analizador lógico (Figura V.1) e intro-
" " " " " " "
" " ducir el texto i.0. " " " " " " " " """""""" " " " " " "
" " " " " " " " "

"
" " " " " " " "

" " " " " " " " " " "
" " " FigurA" V.1."" A"ñAdir
"
VAriAble deSde
" " " lA" VentAnA de Setup del AnAlizAdor.
" " " " " " "
" " " " " " " " "
"" "" " " "" " " " " " "" " " " " " " " " " "
" " "" En la Figura
"" " " " V.2 aparece un
" " " " " " " " " ejemplo que
" muestra
" una porción
" " " de la señal sobre " "
" "" " el analizador
" " configurado
"" " " " con una escala
" " "" de
"" 0.1us/div.
" Es importante
" resaltar
" " que " "
el" microcontrolador
" " " ofrece " varias
" posibilidades
" " " como" fuente
" " de reloj" " para su" fun- "
" " cionamiento.
" " " Tras el reset,
" " " queda
" seleccionado
" " como reloj
" " " por defecto
" la
" " salida
" de " "
" un oscilador
" " " RC" de 4MHz " " que posee internamente,
" " " pero la selección
" " " de un cris-" " "
tal de 12 MHz (Figura V.3), junto a los ficheros que se han incluido para el arran-
" " " " " " " "
que en la entrada StartUp del árbol de proyecto garantizan que la velocidad de
" reloj interna en la CPU sea de 100 MHz.

"
"
"
104 Prácticas de laboratorio de sistemas electrónicos digitales

" "

"
FigurA V.2. ejemplo
" " que ViSuAlizA
" " lA
" VAriAble
" " " i Sobre " lógico.
" " el AnAlizAdor
"

"

"
FigurA V.3. " conFigurAción
"
de lA FrecuenciA del criStAl en lAS opcioneS del
" " " " " " " " " " "
proyecto.

" " " " " " "


" " " " " " " " " " " " " " " " " " "
" " " " " " " " " " " " " " "
aneXo V - simUlación de los PUertos en el analiZador lógico 105

V.2. ejemplo de utilizAción de loS puertoS

En este caso se presenta un ejemplo que hace uso del puerto 0 para activar cua-
tro pines del mismo de manera secuencial, seleccionando el sentido de activación
de acuerdo al valor de una variable que podrá ser modificada de forma interacti-
va en el simulador. Las señales serán visualizadas mediante el analizador lógico.
Comience cerrando el proyecto actual (Projectàclose Project) y creando uno
nuevo. Llame analizador_puertos al nuevo proyecto y almacénelo en una carpe-
ta diferente. El código fuente para este ejemplo, analizador_puertos.c, es el mos-
trado en" el" Programa
" "
V.2. " " "

%kpenwfg">NRE39zz0J@"""""1,"Fghkpkekqpgu"rctc"gn"NRE39zz",1"
"
kpv54av"ugpvkfq="
"
11"Hwpekqp"fg"tgvctfq"
xqkf"fgnc{a3ou*wkpv54av"ou+"
}"
""wkpv54av"k="
""hqt*k?2=k>ou,364:5=k--+="
"
"
kpv"ockp*xqkf+"
}"
""kpv54av"p="
"
""11"Nqu"rkpgu"R20]2005_""eqphkiwtcfqu"eqoq"ucnkfcu."
""11"""""""""""R20]60053_"eqphkiwtcfqu"eqoq"gpvtcfcu0"
""NREaIRKQ2/@HKQFKT?2z2222222H=""
"
""11"Ug"rqpgp"c"egtq"nqu"rkpgu"R20]2005_0""
""NREaIRKQ2/@HKQENT?2z2222222H=""
"""
""ugpvkfq?3="
""p?3="
" "
""yjkng*3+}"
""""kh*ugpvkfq+"}"
""""""p?p>>3="
" kh*p??*3>>6++""
""""""""p?3="
"""" "
""""gnug}"
""""""p?p@@3="
""""""kh*p??2+""
""""""""p?*3>>5+="
"""" "
"""""11"Cevkxct"nc"ucnkfc"swg"eqttgurqpfc0"
""""NREaIRKQ2/@HKQRKP?*p>>2+=""
""""11Tgvctfq"fg"47"ou0"
""""fgnc{a3ou*47+=""
"" "
"
progrAmA V.2. código
" " del
" progrAmA
" " analizador_
" puertos.c.

" " " " " " "


" " " " " " " " " " " " " " "
" " " " " " " " " " " " " " " " "
" " " " " " " " " " " " " " " " "
106 Prácticas de laboratorio de sistemas electrónicos digitales

Visualización de puertos en el analizador lógico

Una vez compilado el proyecto sin errores inicie el simulador, muestre la ven-
tana del analizador lógico y configúrelo para visualizar los cuatro bits de menor
peso del puerto 0 P0.[3..0]. Para poder visualizar estos cuatro bits, primero se
busca el puerto 0 (Fio0Pin) haciendo clic en el símbolo ‘+’ de la entrada special
Function registers (ventana symbols) para expandirla (Figura V.4). Como
Fio0Pin hace referencia conjunta a todos los bits del puerto 0, se arrastra y suel-
ta hasta cuatro veces Fio0Pin a la ventana del analizador lógico y a continuación
se selecciona un bit diferente en cada variable Fio0Pin.
" "

"
" "

" "

" "

" "

" "

" "

" "

" "

" "

" "

" "
" FigurA V.4. locAlizAción
" " " "puerto
del " p0
" " en
" lA VentAnA
" S" ymbolS.
" " " " " " " "" " " " " " " " "" " " " " "" "" " "
" Para" configurar " el bit "a visualizar
" " " pulse" en setup " de" la" ventana
" del" analizador." "
" " " " " " " " " " " " " " " " "
La Figura " "V.5 ilustra " este proceso" " " para seleccionar
" " " el" bit de menor" peso " (b0) " de
" la "
" " " " " " " " " " " " " "
" " variable
primera " Fio0Pin, " configurando
" " el" valor
" 0x00000001 " " en" el" campo and " " "
" " " " " " " " " " " " " "
" " "
mask y estableciendo " " " un rango" " "
de amplitud "min/max "
de" 0x0-0x1." " "
Siguiendo " "
un
" " " " " " " " " " " " "
proceso
" " similar, se configuran
" " " " " "" " " el resto de variables.
" " " "" " " Así, para
" " " " seleccionar el
" " "" bit b3 " " "
en la Fio0Pin inferior se escribe 0x00000008 en su campo and mask.
"notA:
" " Otra " " "forma " " "especificar
de " " " directamente" " " pin
un "" de "" un" puerto "" " " en el analizador
" "" " " "
" "
lógico, por ejemplo " " " " " "
" " el "pin" 18 del " puerto " "1, sería " la " siguiente:" hacer" clic" en" " de"la "ven- " "
tana del analizador " lógico
" (Figura
" " V.1) e
" " introducir " el texto FIO1PIN.18.
"
" " " " " " " " " " " " " " "
" " " " " " " " " " " " " " "
" " " " " " " " " " " " " " "
" " " " " " " " " " " " " " " "
" " " " " " " " " " " " " " " "
aneXo V - simUlación de los PUertos en el analiZador lógico
" " " " " " " " " " " " " " " " " " 107 "
" " " " " " " "

"
FigurA V.5. Selección
" " " " b0" del
del bit " "p0
" "puerto " y conFigurAción
" " " " Su eScAlA.
de
" " " " " " "
"
" " " "
" modificación interactiva " de variables
" " " " " "
" " " " " " " " " " " " " " " "
"" " " " " poder interactuar
"
Para " " " con el programa " " " y así modificar " " la " variable " sentido " en" " "
" "
" tiempo de
" " " " " "
ejecución "
" " " " y que "
cambie" " " el " "
sentido
"" " de " " "
desplazamiento
" " " " "
en la "
activación
" de " " " "
" " " " "pines
los " P0.[0..3]," se
" creará
" " una ventana " "" compuesta
" " " " de" dos " botones:
" "" ‘right’
" y ‘left’." " "
" " Al " "hacer clic "" sobre
" " ellos
" " "asignarán
" " " " los " " " valores
" " " ‘sentido=0’
"" " y" ‘sentido=1’,
" " " " " respecti- " " "
" " vamente.
"" Para ello, " se comienza
" " visualizando
" " la ventana command
" " haciendo
" clic
" " "sobre "el "icono " " ," si" no" estaba" ya" visualizada" en" el" interface" gráfico" del" simulador.
" " " Escriba a continuación" " del" símbolo
" de" prompt
" " (>) " de la ventana
" " " el
command " "
" comando define button " " " "
“right”,”sentido=0” " ""y pulse enter (Figura V.6).
" " " " " " " " " " " " " "
" " " " " ""

"
"
FigurA V.6. introducción de unA orden en lA VentAnA de command.
" " "
"" "
" " " "
" " " "" " "" " " " "

"" " " " " "" " "" " " " " "" " " " " " " " " " "
" """ " " " "" " " """ " " " " " "" "" " " " " " " " " " "
" " " " " "" " "" " " " "" " " " " " " " "" " "
108 Prácticas de laboratorio de sistemas electrónicos digitales
"
" " " " " " " " " " "
A continuación teclee el otro comando define button “left”,”sentido=1” y
" pulse" enter. " El" resultado
" es la "ventana
" con dos
" botones que aparece " " en "la Figura
" " "
" " V.7." Tenga
" presente
" " esto
que " sólo tiene
" "sentido
" en" el simulador.
" " En una "aplicación
" " " "
" "ejecutándose
" " " una
sobre " placa con" un microcontrolador
" " real" se podría
" "controlar
" el "
" " sentido
" de activación,
" " leyendo
" " el valor que" se introduzca
" " por
" otro" pin
" de un puer-
" " " "
" " to "determinado. "

"
"
"
"
FigurA V.7. V
" entAnA
" con
" doS
" botoneS
" " pArA" interActuAr
" " con
" el progrAmA
" .

" " Ejecute "el programa


" " " " a paso
paso " y vea
" cómo evolucionan
" " las señales
" " en" el ana- " "
"
lizador " Experimente
lógico. " " pulsando
" " "los
" botones
" "
right " "y vea
y left " cómo "afectan
" " "
a" las señales
" " en el analizador.
" " " Reflexione " sobre
" " los cambios
" " que " se producen.
" " En " " "
" la Figura
" " V.8 se "visualiza" una" porción
" de las señales cuando la variable sentido
vale cero.
" "

" " " " " " " " "


FigurA V.8. SeñAleS
" " p0.[0..3]
" cuAndo
" lA
" " VAriAble
" Sentido
" " VAle
" cero.
" " " " " " " " " " " " " " " " "
" " " " " "
Otra posibilidad de visualizar las señales del puerto P0 es mostrando su
ventana a través del menú Peripheralsà gPio Fast interfaceà Port 0 (Figu-
ra V.9).
"
" " " " " " " " " " "
" " "
aneXo V - simUlación " PUertos
de los "" " el"analiZador
en
" " "lógico
" " " " " " """ " " " " " 109" "
" "" " " " " " " " " " "" " " " " " " " " "
" " " " " "

"
FigurA V.9. " ViSuAlizAción
" " de
" " lA VentAnA
" " del" puerto
" 0. "
" " " " " " " " " " "" " "" " " " " " " "" " " " " "
La ventana que aparece es la de la Figura V.10. Ejecute el programa paso a
" " " " " " " "
" " se" activan
" " " " " " los
" pines P0.[0..3].
" " " " " " "
paso y observe cómo progresivamente
" " " " " "

"
" " " " " " " " "
" FigurA V.10. V
" entAnA
" de" ViSuAlizAción
" " del
" " " p0.
puerto

"

" " " " " " "


" " " " " " "
Anexo VI

GuíA de confIGurAcIón del AdAptAdor J-lInk pArA cArGA


y depurAcIón

VI.1. IntroduccIón

En este anexo se abordará la configuración del entorno de depuración Keil


µVision®4 para posibilitar la utilización del adaptador J-Link de Segger para la
depuración de programas. Esta configuración tiene dos partes, por un lado, la
carga del controlador del dispositivo J-Link conectado al ordenador a través de un
puerto USB, y por otro lado, la configuración del programa Keil µVision®4 para
el empleo del adaptador J-Link en la depuración de programas on-chip. Además
se proponen una serie de ejercicios a realizar en el laboratorio a partir de un pro-
grama ejemplo, que a su vez sirve para que el usuario pueda comprobar que el
adaptador ha sido instalado y configurado correctamente. Dicho programa se
encuentra en el Aula Virtual y se denomina DepuracionJLINK.

VI.2. InstAlAcIón del controlAdor de usB del AdAptAdor J-lInk

Antes de utilizar el adaptador J-Link de Segger se debe instalar el controlador


del dispositivo para USB. Para ello basta con ejecutar el fichero DPInst que se
encuentra en la ruta: Keil/ARM/Segger/USBDriver/x64, tal y como se muestra en
la Figura VI.1. Si dispone de un adaptador de otro fabricante busque la carpeta
del otro fabricante, en lugar de la carpeta Segger y en caso de duda consulte con
su profesor.
" " " " " " " " "
" " " " " " " " " " " " " " " "
" " " " " " " " " " " " " " "
" " " " " " " " " " " " " "
112" " " " " " PráctIcaS" De LaboratorIo
" " " eLectróNIcoS
De SIStemaS " " " DIgItaLeS
" " "
" " " " " " " " ""

"
fIGurA" VI.1.
" r utA
" " de Acceso
" " Al InstAlAdor
" " del" controlAdor
" " " usB
" " pArA
""
el J-lInk de Segger.
" " " " " " " " " " " " " " "
" " " " " "
Una vez instalado el controlador (Driver) USB de para el adaptador J-Link,
" " " un
para depurar " programa
" " son necesarios
" "
los pasos siguientes:
" " " " " " " "
" 1. Conexión
" " de la " Tarjeta de desarrollo (LPC1768-Mini-DK2).
" 2. Configuración
" " del entorno
" de desarrollo Keil µVision®4.
3. Edición del programa.
4. Depuración del programa.
" " " " " "" "
A continuación se describe detalladamente cada uno de estos pasos.

VI.2.1. conexión de la tarjeta de desarrollo

En este ejemplo se va a trabajar con la tarjeta de desarrollo LPC1768-Mini-


DK2 alimentada por USB con el adaptador J-Link para realizar la carga y depu-
ración del programa.

1. Conecte el adaptador J-Link a la Tarjeta de desarrollo.


2. Alimente la tarjeta de desarrollo por USB conectándola al ordenador con el
cable USB-MiniUSB.
" " " " " " " " " "

" " " " " " "


" " " " " " " " " " " " " " "
" " aNexo
" vI - gUÍa" De coNFIgUracIóN
" " DeL aDaPtaDor
" " " " Para carga Y" DePUracIóN
J-LINK " " 113
" " " " " " " " " "
" 3. Conecte
" " el "adaptador
" J-Link
" al" ordenador.
" " " " " " "
Nota:
" En este ejemplo no se van a utilizar más componentes externos.
" " " " " " "" "
" VI.2.2. configuración del entorno de desarrollo keil µVision®4
" " "
" " " " " " " " "
Antes de iniciar el proceso de depuración on-chip, se debe tener el proyecto
" a depurar cargado" " en el entorno" " de desarrollo. " El" entorno de desarrollo
" Keil µVi-
®
" " sion 4" permite
" la" depuración
" on-chip
" a "través
" de" adaptadores
" " JTAG,
" " para ello" " "
debe acceder a las opciones del proyecto, options for target 1… y desde la sola-
" " " " " " " " " " " " " " "
pa Debug activar la casilla “Use <Hardware de depuración>”, tal y como mues-
" " " " " " " " " " " " " " " "
tra Figura VI.2. El tipo de hardware que se debe seleccionar en este caso es J-
" " " " " " " " " " " " " " " " "
Link.
" " " " " " " " " " " " " " "

"
fIGurA VI.2. Menú en el que se puede seleccIonAr el tIpo de depurAcIón que
" " " " " " " " " " " " " " " " " " " " "
se VA A reAlIzAr: Simulator u on-Chip

" " " " " " " " " " " " " " " " "
" Aparte
" " de" las demás opciones
" " que "proporciona
" " el cuadro
" de" diálogo
" " mostrado
""
en la Figura VI.2, es importante que no se modifiquen las librerías (cPU DLL,
" Dialog" DLL)" y Drive DLL).
" " " " " " " " " " " " "
" La" depuración" on-chip
" permite"el volcado
" " "de" programas " en la "memoria
" "
Flash, " " "
" para ello,
" se" debe seleccionar
" " el" hardware" para
" " depuración
" "" que se va a emplear
"
" " " " " " " " " " " " " " " " " " " " " "
" "
114 PráctIcaS De LaboratorIo De SIStemaS eLectróNIcoS DIgItaLeS
" " " " " " " " " " " " " " " "
" desde" la solapa
" " de
Utilities " las mismas" opciones
" " " "según "se muestra
del proyecto, " " "
" "en la" Figura
" "
VI.3. " " " " " " " " " " " "
" " " " " " " " " "

"
fIGurA VI.3. Menú que perMIte seleccIonAr el hArdwAre con el que se VA A
" " " " " " " " "
reAlIzAr el VolcAdo en flAsh de los proGrAMAs A depurAr.

" " " " " " " " " " " " " " " "
" " "Una "vez seleccionado
" " "
el Hardware "de depuración,
" " se pulsa" " " "y en el " "
Settings "
" " " siguiente " cuadro
" "
de diálogo, " " " Flash "Download,
solapa " " se seleccionan " las" caracte-
" " " "
" rísticas
" " de la Flash" del LPC1768,
" " " según
" se" muestra
" " en la" Figura " VI.4." A" esta" " "
" misma
" " ventana
" " también se tiene
" " acceso pulsando
" " el botón
" Settings
" del cuadro
" " de " "
" " diálogo
" mostrado
" en la Figura
" " VI.2.
" " "
" "

" " " " " " "


" " " " " " " " " " " " " " " " " " " " " "
" "

" " " "" " " " " " " " " " " "
" " " " " " " " " " " " " "
" " " vI "- gUÍa De "coNFIgUracIóN
aNexo " " "DeL aDaPtaDor
" J-LINK" Para carga" Y DePUracIóN
" " " 115 " " "
" " " " " " " " " "

"
fIGurA VI.4. especIfIcAcIones soBre lA MeMorIA flAsh del lpc1768.
" " " " " " " " "

" " Desde " esa misma " " "ventana," en la pestaña
" " "Debug se debe
" seleccionar
" " como
" " "
" " interface
" " el USb, mientras
" " " " " " ® " " "
que el propio Keil µVision 4 actualiza los datos" " " "
" " " referidos " al" J-Link, como
" son" el" número
" " serie" (SN)
de " y la versión
" de" Hardwa- " " " "
" re" (HW). " Si se desea " hacer" el" seguimiento
" " " en tiempo
" " real" de una
" variable
" " se " " "
" " seleccionar
debe " " " como Port" el "SW (serial" wire) " y pulsar
" "
sobre auto clk" para " " "
" " que " tome la frecuencia
" " reloj
de " " del dispositivo.
" Las "opciones que deben estar
seleccionadas se muestran en la Figura VI.5, resaltando aquellas que es nece-
" " sario modificar.

" " " " " " "


116 PráctIcaS De LaboratorIo De SIStemaS eLectróNIcoS DIgItaLeS
" " " " " " "

"
fIGurA VI.5. especIfIcAcIones de depurAcIón del J-lInk.
" " " " " " "

" " La pestaña


" " permite seleccionar
trace " " las "opciones
" " " " de la" toma
de configuración " " " "
" " de traza
" por" el J-Link." Se" deben tener
" activadas
" " " " " que se
las opciones " muestran
" "en " " "
" "
la Figura VI.6. Entre ellas, las más importantes son:
" " • Pc sampling,
" " define
" " " " " " " "
la frecuencia de muestreo del ordenador sobre la tar-
" " "
" jeta. El " intervalo
" " de" muestreo debe ser" lo suficientemente
" " "
elevado como" " "
" "permitir
para " un" refresco
" "adecuado
" " de los" datos. La" casilla
" " data R/W
“on " " "
" " "Simple” debe
" " estar activada para
" " " permitir que
" " el PC realice
" " un muestreado
"
" de las
" lecturas" y escrituras " " de memoria.
" " " " " " " " "
• timestamps permite reescalar los datos que se muestran en la pantalla del
"
analizador lógico.
" " " " " " " " " " " " " " "
" " " " " " " " " " " "
" " " " " " " " " " " " " " "
" " " " " " " " " " " " "
" " - gUÍa De coNFIgUracIóN
aNexo vI " " DeL" aDaPtaDor
" J-LINK
" " Para carga Y" DePUracIóN
" " " " 117 "
"

"
fIGurA
"
VI.6. opcIones
" "
requerIdAs pArA el Muestreo AdecuAdo de VArIABles en
" " " " " " " " "
depurAcIón.
"
" "
Una vez configuradas las opciones anteriores, la depuración on-chip se reali-
" " " "los mismos
za siguiendo " pasos que "en "la opción de "Simulación,
" " iniciándola
" con " "
" " opción
la " " Start/Stop
" " Debug
" " ver Figura" VI.7.
Session, " " " " " "
"" " " " " " " " " "

"
fIGurA VI.7.
" " opcIón
" de
" InIcIo
" " de
" lA depurAcIón
" " J-lInk.
eMpleAndo
"

" " "" " " " " " " " " " "
El entorno Keil µVision®4 también permite la compilación de un mismo pro-
" " " " " " " " " " " " " " "
yecto para ser depurado en simulación o cualquier otro medio, como el J-Link.
" " " " " " " " " " " " " " "
Para ello se pueden generar distintos proyectos de manera paralela y que se modi-
" " " " " " " " " " " " " " "
" " " " " " " " " " " " " " " " "
" " " " " " " " " " " " " " "
" " " " " " " " " " " " " " " "
" " " " " " " " " " " " " " " "
" " " " " " " " " " " " "
" " " " " " " " " " " " " " "
" " "

118 PráctIcaS De LaboratorIo De SIStemaS eLectróNIcoS DIgItaLeS


"
" " " " " " " " " "
fican de manera simultánea. Para usar esta opción se debe crear un nuevo pro-
"
yecto "
utilizando " el gestor " "
de componentes " " del proyecto. " " Se " pulsa " con " el" botón " "
derecho sobre el nombre del proyecto (Figura VI.8a) y se selecciona la opción "
" " " "" " " " " "" " " " """ "" "" " " "
" " " " " " " " " " " " " " "
manage
" " "" componentes…"" " " " A" continuación" " " " se pulsa " " sobre " " " "el "icono dentro " " "del " grupo " " ""
Project
" " "targets "" " y se" introduce
"" " ""un nuevo " " "nombre " " "para
" el"" proyecto " " " " " (Figura
" VI.8b).
"" " ""
"
Por ejemplo" " " "
en uno" de" los proyectos " "
" " se le" " " puede "
" " poner " " LPc1768 " " " J-Link " " "
y se" con- "" "
"
" " " " " " " " " " " " " " " "" " "
figura con " las" opciones " de "depuración " " "
on-chip, y "el otro" LPc1768 " "Simulación,
"
" " "" " " " " " " "
" necesarias " " "
" " poder
" " " " " " " " "
" " " "" ""
que tendrá
"
las opciones " " " "
para " " "
simularlo. " " " " " " "
" " " " " " " " " " " " "
" " " " " " " " " " " " " " " "
" " " " " " " " " " " " " " " "
" " " " " " " " " " " " "

"
"
a) """"""""""""""""""""""""""""""""""""""""""""""""" b)
"
"""""""""""""""""""""""""""""" "
fIGurA VI.8. creAr nueVo proyecto utIlIzAndo el Gestor de coMponentes.
" " " " " " " " " " "
"""""""""""""""""""""""""""""" " """"""""""""""""""""""""""""""""""""""""""""""""" "
" " " " " " " " " " " " " " " " " "
" Una" vez generadas " " las dos copias
"" "" " " " " "
del proyecto, "" " " " "es
una "
posible
" " " "cambiar
" de
"
copia a la otra usando el menú desplegable situado en la barra de comandos, como
se" recoge
"
en la" Figura
" "
VI.9." " " " " " " " " " " " "
" " " " " " " " " " " " " " " "

"
" " " " " " " " " " " " " " "

" "

"
fIGurA VI.9.
" " Menú
" despleGABle
" " que
" perMIte
" " seleccIonAr
" " " el
" "tIpo
" de proyecto
"
que se está depurAndo.
"
"
"
" " " " " " "
" VI.2.3. depuración del programa
" " " " " " "
El programa que se va a utilizar como punto de partida es el programa llamado
DepuracionJLINK, cuyo funcionamiento consiste en hacer parpadear el LED 1. La
" " "
aNexo vI - gUÍa De coNFIgUracIóN DeL aDaPtaDor J-LINK Para carga Y DePUracIóN 119
"
" " "
cadencia" de" encendido
" " "
y apagado " LED se multiplica
del " por 2 si se mantiene pulsa-
" " "
do el pulsador KEY2. Este programa está formado "por dos ficheros .C (Depura-
" " " " " " " " "
" " " "" "" "" "
y" un fichero
" " " " " "
cionJLINK.c y delay.c) include (delay.h)." Debe añadir los dos ficheros
" " "" " " "" " " " " " " "
.C al proyecto, pero no el fichero " include, ya que éste se añade automáticamente.
" " " " " " " " " " "
" Una vez " generado
" " " " el proyecto
" " basado " " en el" programa " " DepuracionJLINK
" " y de "
" " " "haber " configurado
" " el adaptador
" " " " " J-Link,
" " se "debe " proceder
" "" " " a realizar
" " el volcado
" " del "
" " " " "" " en "la memoria
programa "" " " " Flash
" " " del " " microcontrolador
"" " " "" pulsando" " Start Debug
" " Ses- "
" " " " " " " " " " "
" " sion " ( " " ) "" y" debe" aparecer la pantalla del
"" depurador. Los pasos" para" depurar" " "
el
" " "" " " " " " " "" " " "
" programa
" " empleando" " " el J-Link "son los siguientes:
" " " " " " " " " " " " " " "
" " 1. El" primer " " " "paso " para " " comprobar
" " " " el" "funcionamiento" " "" del" programa
" " es "realizar" "
" " " una "ejecución " " " paso " " a "paso del " mismo." " " "Para " " " ello,
" " coloque " " breakpoints " " en las "
" " " " " " líneas "" " " " " " " " " " " ""
del programa en las que se produce un cambio en el estado del pin " " " "

" " 3.25" de salida " " que lleva " "conectado el LED1. " " " " " " " "
" " " " " " " " "
2.
" Una " vez " puestos
" " los "breakpoints " se puede " " realizar
" " una" ejecución " "continua
" " "
" " " " " " " " """ " " " " "que" "la "ejecución " " " " ""
del" programa, " comprobando se "para en la" línea " "
que pro-
" " " " " " " " " " " "
" "
duce "
el encendido
" "
del LED " "
D1, tal"
y como "
se
"
muestra "
en la Figura
" "
VI.10, "
" " " y que " cambia
" " "" " el" estado " " del " LED " " de "" la "tarjeta. " " " " " " " " " "
" " " 3. A " continuación
"" " " " " "" se debe " " hacer" " " un " seguimiento
" " "" " " del
" estado
" " " de los " pines a
través de la ventana del puerto GPIO 1 del Fast Interface. En esta ven-
" " " tana se debe " " ver " reflejado
" " " del"
el estado pin" 3.25" " durante " " la "ejecución
" " " "
del
"
programa. " " " " " " " " " " " " " " " " "
" " " " "

" "
" " fIGurA
" VI.10.
" d" epurAcIón
" " " " ""
eMpleAndo" breakpointS
" " del proGrAMA
" "" eJeMplo.

" " " " " " "" " " " " "" "" " " " "" " " " " "
" " " " " " " " " " "" " " "" " " " " " " "" " " " " " " "
" " " " " " " "
"" " " "
" " " " " " "
" " " " " " " " " " " " " " "
" " " " " " " " " " " "
120 PráctIcaS De LaboratorIo De SIStemaS eLectróNIcoS DIgItaLeS

4. También se puede hacer un seguimiento del estado del pin 3.25 empleando
el analizador lógico, tal y como se estudió en la parte no presencial. Para
ello, basta con añadir el registro fIo3pIn.25 al analizador lógico. Depu-
rando en ejecución continua y manteniendo los breakpoints se puede deter-
minar el tiempo que está encendido y apagado el LED pulsando y sin pul-
sar el pulsador KEY2.

programa depuracionJlInk.c
" "
A continuación se muestra el código del Programa VI.1 DepuracionJLINK.c
empleado " como punto de partida
"
para el estudio de la depuración con el J-Link.
" programa
Este " produce
" " el" parpadeo
" " del LED " D1
" con una frecuencia
" que" depende
" "
" " " " " " " " " " " " " " " " "
de la pulsación del KEY2.
" " " " " " " " " " " "
1,"ockp0e",1"
%kpenwfg"$fgnc{0j$"
%kpenwfg"$nre39zz0j$"
"
xqkf"eqphkiaIRKQ"*xqkf+"
}"
""NREaIRKQ5/@HKQFKT"~?"*3>>47+=" " 1,"R5047"fghkpkfq"eqoq"ucnkfc",1""
""NREaIRKQ4/@HKQFKT"(?"\*3>>34+=" " 1,"R4034"fghkpkfq"eqoq"gpvtcfc",1""
""NREaIRKQ5/@HKQUGV"~?"*3>>47+=" " 1," crciq" gn" NGF" eqpgevcfq" c" R5047"
,1"
"
""""""
""kpv"ockp"*xqkf+"
}""
"""
eqphkiaIRKQ*+="
yjkng*3+"}"
"
""kh"**NREaIRKQ4/@HKQRKP"("*3>>34++??2+}""1,"rwnucfqt"rwnucfqA",1"
""""NREaIRKQ5/@HKQRKP"~?"*3>>47+=""""""" " 1,"crciq"NGF",1"
""""fgnc{a3ou"*422+=" " " """ 1,"tgvctfq"fg"422ou",1"
""""NREaIRKQ5/@HKQRKP"(?"\*3>>47+=""""""""1,"gpekgpfq"NGF",1"
""""fgnc{a3ou"*622+=" " " """ 1,"tgvctfq"fg"622ou",1"
"""" "
""gnug"}"
""""NREaIRKQ5/@HKQRKP"~?"*3>>47+=" " 1,"crciq"gn"NGF",1"
""""fgnc{a3ou"*322+=" " " " 1,"tgvctfq"fg"322ou",1"
""""NREaIRKQ5/@HKQRKP"(?"\*3>>47+=" " 1,"gpekgpfq"gn"NGF",1"
""""fgnc{a3ou"*422+=" " " " 1,"tgvctfq"fg"422ou",1"
"""" ""
"" "
"
"
"
"
" " "
" "
"
"
"
" " "
""""
"""" " "
""
"" "
" "
"
""""
"""" "
" " " "
" " " "
" "
" " " "
" "
"
""""
"""" "
" "
" "
" "
" "
" "
" "
" " " "
" " "
""""
"""" "
" " " "
""" "
" "
" " " "
" " "
""""
"""" "
" "
" "
" "
" "
" "
" "
" " " "
" " "
""""
"""" "" ""
"" " "
""
aNexo vI - gUÍa De coNFIgUracIóN DeL aDaPtaDor J-LINK Para carga Y DePUracIóN 121
"
"
"
"
"
"
"
"
"
1,"fgnc{0e",1" " "
"
%kpenwfg"$nre39zz0j$" "
"
"
"
"
"
"
"
xqkf"fgnc{a3ou*wkpv54av"ou+" " "
}""
"""" wkpv54av"k="
"""" " "
""""
"""" hqt*k?2=k>ou,364:5=k--+=" "
"
"
"
"
"
"
1,"fgnc{0j",1"
" " "
"
"
"
"
xqkf"fgnc{a3ou*wkpv54av"ou+=
" " "
"
"
"
proGrAMA VI.1. códIGo del proGrAMA DepuraCionJlink.C.
"" "" "" "" ""

"" "" "" "" "" "" ""


Anexo VII
"

BIBlIotecAs stdInt.h y lPc17xx.h. Algunos AsPectos ImPortAntes


" " " " " "
" "
"
stdint.h
"
"El estándar" C99" incluye" la "definición de" nuevos
" tipos
" de "datos
" con el
" objetivo
" " " "
de facilitar la "portabilidad
" " de códigos.
" Estos
" nuevos
" "tipos están declarados
" " " en "el "
fichero cabecera stdint.h:
"
1,"gzcev/ykfvj"ukipgf"kpvgigt"v{rgu",1"
v{rgfgh"ukipgf"ejct"" " kpv:av=""11":"dkvu"
v{rgfgh"ukipgf"ujqtv"kpv"" kpv38av="11"38"dkvu"
v{rgfgh"ukipgf"kpv"" " kpv54av="11"54"dkvu"
v{rgfgh"ukipgf"aakpv86""" kpv86av="11"86"dkvu"
"
1,"gzcev/ykfvj"wpukipgf"kpvgigt"v{rgu",1"
v{rgfgh"wpukipgf"ejct"" " wkpv:av="
v{rgfgh"wpukipgf"ujqtv"kpv"" wkpv38av="
v{rgfgh"wpukipgf"kpv"" " wkpv54av="
v{rgfgh"wpukipgf"aakpv86"" wkpv86av="
"

LPC17xx.h"
" " " " " " " " " " " " "
Para facilitar la programación en lenguaje C de los microcontroladores de
" " " " " " " " " " "
la familia LPC17xx, ARM proporciona el fichero lPc17xx.h. En dicho
" " " " " " " " " " "
fichero se puede encontrar la definición de los registros estudiados anterior-
" "
mente, utilizando la misma nomenclatura que en Manual de Usuario del
LPC17xx.
" " " " " " " " " " " " "
En el caso
" de" los
" puertos
" "GPIO,
" " la estructura
" LPC_GPIO_TypeDef
" " " " defi- " " "
ne la estructura de dichos puertos. Como se puede ver en la tabla siguiente
" " " " " " " " " " " " " " "
" " " " " " " " " " " " " " "
"
"
" " "" "
"
"
" " " " " " "
" " " " " " " "
" " " " " " " " " " " " " "
124 " " " " de
Prácticas " laboratorio
" " electrónicos
de sistemas " " "digitales
" "
" "

"dicha
" "estructura
" " " formada
está " " "
por varias " se definen
uniones, donde " " los "regis-
" "
" " " " " " " " " " " " "
tros de configuración. En dichas uniones se puede ver que se declaran los " " "
" " " " " " " " " " " " " " " "
registros enteros, divididos en parte alta y parte baja, y divididos en cuatro
" " " " " " " " " " " " " " "
bytes.
"
"

"

Tgikuvtq"HKQFKT"gpvgtq"

Rctvg"dclc"{"cnvc"fgn"tgikuvtq"HKQFKT""

"

Nqu"ewcvtq"d{vgu"fgn"tgikuvtq"HKQFKT""

"

" " " " " " "


" "
"
"

"
"
"
" " " " " "" " "
"
"
"
"
"
" "
ÈÈÈÈÈÈÈÈÈÈ00"
"
4̋̌Æœßøæ"(+1%.4"̋ºß̋øæ"
""
2̇øß̋"̈̇ª̇" "̇Øß̇"¸̋Ø"ø̋̌Æœßøæ"(+1%.4""
"
"
.æœ"̊­̇ßøæ"̈ ß̋œ"¸̋Ø"ø̋̌Æœßøæ"(+1%.4""

"
"
" "
En el "fichero LPC17xx.h,
" " "
también se " encuentran
"
definidas:

" "
u " " "base
La dirección " de" la" zona de" memoria
" " "de los GPIO:

""""" " """"""""" "

" " " " " " "

" """""""" " " "


" """""""" " " "
anexo vii - bibliotecas stdint.h y lPc17xx.h. algunos asPectos imPortantes 125

#define LPC_GPIO_BASE (0x2009C000)

u La dirección base de cada puerto:

#define LPC_GPIO0_BASE (LPC_GPIO_BASE + 0x00000)


#define LPC_GPIO1_BASE (LPC_GPIO_BASE + 0x00020)
#define LPC_GPIO2_BASE (LPC_GPIO_BASE + 0x00040)
#define LPC_GPIO3_BASE (LPC_GPIO_BASE + 0x00060)
#define LPC_GPIO4_BASE (LPC_GPIO_BASE + 0x00080)

Punteros del tipo LPC_GPIO_TypeDef a la dirección base del puerto:

#define LPC_GPIO0 ((LPC_GPIO_TypeDef *) LPC_GPIO0_BASE)


#define LPC_GPIO1 ((LPC_GPIO_TypeDef *) LPC_GPIO1_BASE)
#define LPC_GPIO2 ((LPC_GPIO_TypeDef *) LPC_GPIO2_BASE)
#define LPC_GPIO3 ((LPC_GPIO_TypeDef *) LPC_GPIO3_BASE)
#define LPC_GPIO4 ((LPC_GPIO_TypeDef *) LPC_GPIO4_BASE)

Las definiciones vistas anteriormente brindan la posibilidad de acceder a los


diferentes registros de los puertos utilizando una nomenclatura sencilla. Esto se
puede ver en el siguiente ejemplo:

LPC_GPIO0->FIOSET=0x0000000A; //Activar las sali-


das P0.1 y P0.3
LPC_GPIO0->FIOSET |= ((1<<3)| (1<<1));

En ambas líneas de código se escribe un ‘1’ en los bits 1 y 3 del registro FIO-
SET del Puerto 0, sin necesidad de recordar la localización de memoria de dicho
registro.
Anexo VIII

Resumen del mAnejo de InteRRupcIones en el lpc1768

VIII.1. IntRoduccIón

Este anexo presenta un resumen del sistema de gestión de interrupciones del


Cortex M3 y de la configuración y manejo de las Interrupciones Externas en el
LPC1768 que puede servir de base para la programación de interrupciones del
LPC1768. También se presenta la biblioteca de funciones CMSIS definidas para
homogeneizar el acceso a algunos recursos de procesadores basados en la arqui-
tectura Cortex M3 y utilizado en la gestión de interrupciones.
Como información adicional se incluyen la tabla de vectores del LPC1768 y
los nombres de las funciones de interrupción utilizados por Keil µVision®4 en la
versión V4. 21.
La información está obtenida fundamentalmente del “LPC17xx User Manual
Rev4.1” proporcionado por NXP y de la documentación incluida en la ayuda de
Keil µVision®4.

VIII.2. modelo de excepcIones del coRtex m3

Al enfrentarse por primera vez a un microcontrolador es importante analizar


cómo funciona su sistema de gestión de excepciones e interrupciones, conocer
cómo se tratan sus prioridades y cómo y dónde se configuran, saber dónde está la
tabla de vectores y saber realizar funciones de atención a las diferentes excepcio-
nes. También es importante saber las interrupciones externas de las que dispone
y cómo se configuran.
Una excepción es un evento que se puede producir por diferentes causas y que,
cuando se produce, si está habilitado, provoca la ejecución inmediata de una ruti-
na de atención a la excepción interrumpiendo el programa que se estuviera eje-
cutando en ese momento. En la mayor parte de las excepciones, al finalizar la ruti-
na de excepción, se produce un retorno al programa que se estaba ejecutando.
128 Prácticas de laboratorio de sistemas electrónicos digitales

La dirección de salto asociada a cada una de las excepciones se encuentra en


la llamada “Tabla de Vectores” donde el primer elemento es el “Vector de Reset”.
Después de conectar el chip p ejecutar un reset la tabla de vectores está situada
en la posición de memoria 0x00000000 aunque se podría trasladar a otro lugar si
fuera necesario. En la tabla de vectores hay una entrada por cada una de las posi-
bles excepciones (112 en el LPC1768) (apartados 6.4 y 34.4.3.5 del “LPC17xx
User Manual Rev4.1”).
Las interrupciones son un caso particular de excepciones donde el evento es
producido por un periférico de la CPU (situados dentro del microcontrolador) o
por interrupciones externas a través de algún pin. El Cortex M3 distingue entre la
atención a interrupciones (ISR) y la atención al resto de excepciones (Reset, Fault
handlers y System handlers). A continuación se desarrolla más en profundidad la
gestión de interrupciones, sin entrar de momento en la gestión del resto de excep-
ciones.
Todas las excepciones tienen asociado un número de excepción, un número de
interrupción y una prioridad (34.3.3 del “LPC17xx User Manual Rev4.1”):

• El número de excepción va de 1 a 15 para las excepciones que no son inte-


rrupciones y del 16 en adelante para las interrupciones.
• El número de interrupción (IRQ Number) toma valores del 0 en adelante.
• La prioridad es configurable salvo en el Reset en la NMI y HardFault (las
tres primeras) que tienen las prioridades más altas posibles (-3 -2 y -1res-
pectivamente). Se puede asignar a cada excepción un nivel de prioridad del
0 al 31, siendo el 0 el más prioritario. Tras el Reset, todas las excepciones
de prioridad configurable tienen como nivel de prioridad el 0. La prioridad
de las excepciones (salvo las interrupciones) se configura con los registros
SHPR1 – SHPR3 (34.4.3.9 del “LPC17xx User Manual Rev4.1”) y las de
las interrupciones en los registros IPR0 – IPR8 (apartado 6.5 y 34.4.2.7 y
del “LPC17xx User Manual Rev 4.1”).

Las interrupciones pueden estar en tres estados: inactiva, pendiente y ejecu-


tándose (inactive, pending, run -active-) (34.4.2.9.1 del “LPC17xx User Manual
Rev4.1”):

• inactive: no se tiene registro de que se haya producido el evento asociado


a la excepción.
• Pending: se ha detectado el evento asociado a una excepción y se ha regis-
trado pero todavía no se está ejecutando la rutina de atención correspon-
diente. Se puede saber si una interrupción está pendiente o no con la lectu-
ra de los registros ISPRn o ICPRn.
anexo Viii - interruPciones externas del lPc1768 129

• run: se está ejecutando la rutina de atención correspondiente, o se comen-


zó a ejecutar estando ahora “parada”. Se puede saber si una interrupción
está activa con la lectura del registro IABRn.

Se puede forzar el paso de una interrupción a pendiente mediante la escritura


de un 1 en el lugar correspondiente del registro ISPRn y se puede formar el paso
de pendiente a inactiva mediante la escritura de un 1 en el lugar correspondiente
del registro ICPRn.
Existen tres registros relacionados con el enmascaramiento de interrupciones
para evitar que sean atendidas cuando están pendientes (34.3.1.3.6 del “LPC17xx
User Manual Rev4.1”):

• Escribir un 1 en el registro PRIMASK enmascara la activación de todas las


interrupciones de prioridad configurable, es decir todas excepto la NMI y
el HardFault.
• Escribir un 1 en el registro FAULTMASK enmascara la activación de todas
las interrupciones excepto la NMI. El procesador borra el FAULTMASK al
finalizar la atención de cualquier excepción, salvo de la NMI.
• Mediante la escritura del registro BASEPRI se define el nivel de prioridad
máxima que es atendido. Las interrupciones de nivel de prioridad igual o
inferior al de BASEPRI no se atienden. Si BASEPRI vale cero no tiene nin-
gún efecto.

Tras la ejecución de cada instrucción de ensamblador, se evalúan las interrup-


ciones que están en estado PENDING y que no están enmascaradas. Si hay algu-
na en esta situación, se produce un salto a su rutina de interrupción asociada tras
obtener la dirección de salto de la “Tabla de Vectores”.
Si en un determinado momento, hay más de una interrupción en estado PEN-
DING, se ejecutará la rutina de interrupción asociada a la interrupción más prio-
ritaria (con mayor valor de prioridad). En caso de estar pendientes varias inte-
rrupciones del mismo nivel de prioridad, se atenderá a la que tenga menor núme-
ro de excepción.
Si cuando está ejecutándose una rutina de atención a una interrupción, una
interrupción de mayor nivel de prioridad no enmascarada pasa a estado PEN-
DING, interrumpirá a la interrupción en curso anidando interrupciones. En cam-
bio, si la interrupción es del mismo nivel de prioridad que la que se está ejecu-
tando, no será interrumpida, esperando a que finalice la rutina de interrupción en
ejecución para ser atendida.
Existe la posibilidad de dividir el nivel de prioridad en dos campos (grupo y
subgrupo) que se puede configurar con el campo PRIGROUP del registro AIRCR
130 Prácticas de laboratorio de sistemas electrónicos digitales

(apartados 34.4.3.6 y 34.3.3.6 del “LPC17xx User Manual Rev4.1”). En este


caso, el anidamiento de interrupciones sólo se produce cuando está pendiente una
interrupción de un grupo superior y está en ejecución una de un grupo inferior.
La NMI (Non Maskable Interrupt – Interrupción no enmascarable) es una
excepción asociada a un pin del microcontrolador que siempre que se active, pro-
duce una interrupción. En el LPC1768 la NMI está en el pin 53 y comparte fun-
cionalidad con el P2.10 y EINT0. NMI es la tercera función del pin y por tanto,
para que esté activa, es necesario configurar un 10 en los bits 21:20 del registro
PINSEL4 (Pin Function Select Register 4).. La escritura de un 1 fuerza el paso de
la NMI a estado pendiente lo que provoca la entrada inmediata de su función de
atención asociada ya que es la interrupción más prioritaria y no enmascarable. Al
entrar en la rutina se borra el estado de pendiente.

VIII.3. InteRRupcIones exteRnAs del lpc1768

Las interrupciones externas permiten que un cambio del nivel de un pin de


entrada del microcontrolador, provoque la ejecución de una rutina de atención a
esa interrupción. Las interrupciones externas suelen utilizarse para que el proce-
sador responda a eventos de elementos de hardware externos.
Las interrupciones externas se pueden configurar activas por nivel (alto o
bajo) o activas por flanco (bajada o subida). Una interrupción activa por nivel
implica que permanecerán activas mientras el nivel asociado se mantenga.
Normalmente las interrupciones activas por nivel se utilizan para atender un
evento de un dispositivo externo que desactiva la interrupción cuando es aten-
dido.
El LPC1768 dispone de 4 entradas de interrupción externas específicas (/EINT0
a /EINT3) situadas en los pines P2.10 a P2.13 como primera función alternativa por
lo que para seleccionarlas es necesario escribir un 01 en los bits adecuados del
registro PINSEL4. Además de estas cuatro líneas, se pueden configurar como inte-
rrupciones externas cualquiera de los pines de los puertos P0 y P2.

Interrupciones externas dedicadas

Las interrupciones externas /EINT0 - /EINT3 tienen asociados los números


de interrupción IRQ18 – IRQ21 (Tabla 50 del “LPC17xx User Manual Rev4.1”)
y, como el resto de las interrupciones, se configuran con el acceso a los regis-
tros generales del NVIC (6.5 del “LPC17xx User Manual Rev4.1”), habilitán-
dolas y deshabilitándolas mediante los registros ISER0 e ICER0 (bits 18 al 21),
anexo Viii - interruPciones externas del lPc1768 131

configurando su nivel de prioridad con los registros IPR4 e IPR5 y consultan-


do o modificando el estado de interrupción con los registros IABR0, ISPR0 e
ICPR0.
El tipo de interrupción externa (activo por nivel o por flanco) y el nivel activo
(activa por nivel alto o bajo, o flanco de bajada o subida) se configura con los
registros EXTMODE y EXTPOLAR respectivamente (3.6 del “LPC17xx User
Manual Rev4.1”). Cuando la entrada está habilitada y se recibe un flanco o nivel
activo, se pone a 1 el flag de interrupción asociado que se puede consultar leyen-
do el registro EXTINT y que, inicia el proceso de interrupción pasando su estado
a PENDING y siendo ejecutado o no dependiendo de si están o no habilitadas y
tienen la prioridad adecuada.
Dentro de la rutina de atención a las interrupciones externas, se deben
borrar los flags de interrupción que las provocaron. Esto se realiza escribien-
do un 1 en el bit correspondiente del registro EXTINT. Esto es muy importan-
te porque si no se hace, no se detectarán eventos futuros. Si la interrupción es
activa por nivel, el flag de interrupción no se podrá borrar mientras permanez-
ca activo el nivel, relanzando la interrupción si termina la rutina antes de que
cambie el nivel de activación.
En el manual de usuario se recomienda mantener siempre la interrupción des-
activada cuando se modifique EXTMODE o EXTPOLAR y borrar el flag aso-
ciado y también su correspondiente “pending” antes de habilitarla.

Interrupciones asociadas a los pines de los puertos GpIo0 y GpIo2

Cada una de las entradas de los puertos GPIO0 y GPIO2 puede ser configura-
da como interrupción externa activa por flanco de subida, de bajada o por los dos
flancos. Esto se realiza con los registros IO0IntEnR e IO2IntEnR para la activa-
ción por flanco de subida, y los registros IO0IntEnF e IO2IntEnF para la activa-
ción por flanco de bajada (apartado 9.5.6 del “LPC17xx User Manual Rev4.1”).
Las interrupciones asociadas al GPIO0 y GPIO2 comparten en el NVIC los
recursos con la Interrupción Externa 3 (/EINT3) con el número de interrupción
IRQ21.
Los flags de interrupción asociados a cada una de las líneas de los puertos
GPIO0 y GPIO2 se almacenan en los registros IO0IntStatR e IO2IntStatR cuan-
do se produce un flanco de subida y en IO0IntStatF e IO2IntStatF cuando se pro-
duce un flanco de bajada. En el registro IOIntStatus se puede comprobar en un bit
si hay alguna interrupción pendiente del GPIO0 y en otro bit si hay alguna del
GPIO2. Para borrar los flags de interrupción asociados a cada pin de los puertos
es necesario escribir un 1 en los registros IO0IntClr e IO2IntClr.
132 Prácticas de laboratorio de sistemas electrónicos digitales

VIII.4. IntRoduccIón Al cmsIs (coRtex mIcRocontRolleR softwARe


InteRfAce stAndARd)

Con el fin de facilitar y homogeneizar el diseño de aplicaciones para diferen-


tes procesadores basados en ARM y favorecer el poder reusar código realizado
para unos procesadores en otros, ARM definió en 2008, una biblioteca de funcio-
nes que estandariza:

• La definición de los registros del Cortex-M relacionados con el NVIC,


System Control Block, SysTick, MPU así como un conjunto de funciones
de acceso al NVIC y otras funciones básicas.
• Estandariza los nombres de las excepciones.
• Introduce una función denominada SystemInit() que se encarga de inicializar
todo el sistema. Especialmente incluye la inicialización de los osciladores.
• Proporciona un conjunto de funciones que facilita el acceso a funciones
intrínsecas cuya implementación están fuera del C estándar y depende de
cada compilador.
• Proporciona funciones básicas de comunicación serie, Ethernet y SPI.
• Proporciona una forma estándar de configurar los osciladores para definir
la frecuencia de reloj del procesador.
• Funciones estándar para configurar y acceder al SYSTIC, muy utilizado
por los sistemas operativos.

Si los programadores utilizan las funciones CMSIS, su código puede ser reu-
tilizable en otros procesadores de la familia ARM y con otro entorno de compila-
ción diferente.
Para utilizar las funciones CMSIS es necesario incluir en los ficheros .C los
includes core_cm3.h y system_lPc17xx.h. Estos se incluyen automáticamente al
añadir el fichero lPc17xx.h y en el proyecto el fichero core_cm3.c. Los ficheros
.H se encuentran en el directorio C:/Keil/CMSIS/INCLUDE y el fichero .C en
C:/Keil/ARM/Startup.
anexo Viii - interruPciones externas del lPc1768 133

listado de funciones cmsis relacionadas con el acceso a los registros " del"
corex-m3
" " " " " " " " " " " " "
xqkf"aagpcdngakts"*xqkf+"
Inqdcn"Kpvgttwrv"gpcdng"*RTKOCUM"?"2+"wukpi"vjg"kpuvtwevkqp"ERUKG"k"
"
xqkf"aafkucdngakts"*xqkf+"
Inqdcn"Kpvgttwrv"fkucdng"*RTKOCUM"?"3"+"wukpi"vjg"kpuvtwevkqp"ERUKF"k"
"
wkpv54av"aaigvaEQPVTQN"*xqkf+"
Tgvwtp"Eqpvtqn"Tgikuvgt"Xcnwg"wukpi"vjg"kpuvtwevkqp"OTU""
"
xqkf"aaugvaEQPVTQN"*wkpv54av"xcnwg+""
Ugv"EQPVTQN"tgikuvgt"xcnwg"wukpi"vjg"kpuvtwevkqp"OUT""
"
wkpv54av"aaigvaKRUT"*xqkf+"
Tgvwtp"KRUT"Tgikuvgt"Xcnwg"wukpi"vjg"kpuvtwevkqp"OTU"
"
wkpv54av"aaigvaCRUT"*xqkf+"
Tgvwtp"CRUT"Tgikuvgt"Xcnwg"wukpi"vjg"kpuvtwevkqp"OTU"
"
wkpv54av"aaigvazRUT"*xqkf+"
Tgvwtp"zRUT"Tgikuvgt"Xcnwg"wukpi"vjg"kpuvtwevkqp"OTU"
"
wkpv54av"aaigvaRUR"*xqkf+""
Tgvwtp"Rtqeguu"Uvcem"Rqkpvgt"*RUR+"wukpi"vjg"kpuvtwevkqp"OTU""
"
xqkf"aaugvaRUR"*wkpv54av"VqrQhRtqeUvcem+"
Ugv"Rtqeguu"Uvcem"Rqkpvgt"*RUR+"xcnwg"wukpi"vjg"kpuvtwevkqp"OUT""
"
wkpv54av"aaigvaOUR"*xqkf+"
Tgvwtp"Ockp"Uvcem"Rqkpvgt"*OUR+"wukpi"vjg"kpuvtwevkqp"OTU""
"
xqkf"aaugvaOUR"*wkpv54av"VqrQhOckpUvcem+"
Ugv"Ockp"Uvcem"Rqkpvgt"*OUR+"wukpi"vjg"kpuvtwevkqp"OUT""
"
wkpv54av"aaigvaRTKOCUM"*xqkf+"
Tgvwtp"Rtkqtkv{"Ocum"Tgikuvgt"*RTKOCUM+"wukpi"vjg"kpuvtwevkqp"OTU"
"
xqkf"aaugvaRTKOCUM"*wkpv54av"xcnwg+""
Cuukip"xcnwg"vq"Rtkqtkv{"Ocum"Tgikuvgt"*RTKOCUM+"wukpi"vjg"kpuvtwevkqp"OUT"
"
xqkf"aagpcdngahcwnvakts"*xqkf+""
Inqdcn"Hcwnv"gzegrvkqp"cpf"Kpvgttwrv"gpcdng"*HCWNVOCUM?2+"wukpi"kpuvtwevkqp"ERUKG"h"
"
xqkf"aafkucdngahcwnvakts"*xqkf+"
Inqdcn"Hcwnv"gzegrvkqp"cpf"Kpvgttwrv"fkucdng"*HCWNVOCUM?3+"wukpi"kpuvtwevkqp"ERUKF"h"
"
wkpv54av"aaigvaDCUGRTK"*xqkf+"
"Tgvwtp"Dcug"Rtkqtkv{"*DCUGRTK+"wukpi"vjg"kpuvtwevkqp"OTU""
"
xqkf"aaugvaDCUGRTK"*wkpv54av"xcnwg+"
Ugv"Dcug"Rtkqtkv{"*DCUGRTK+"wukpi"vjg"kpuvtwevkqp"OUT"
"
wkpv54av"aaigvaHCWNVOCUM"*xqkf+"
Tgvwtp"Hcwnv"Ocum"Tgikuvgt"*HCWNVOCUM+"wukpi"vjg"kpuvtwevkqp"OTU"
"
xqkf"aaugvaHCWNVOCUM"*wkpv54av"xcnwg+"
Cuukip"xcnwg"vq"Hcwnv"Ocum"Tgikuvgt"*HCWNVOCUM+"wukpi"vjg"kpuvtwevkqp"OUT"
"
" " " " " " " " " "
"

"
" " " "
" " " " " " ""
"
" " "
" " " " " " ""
"
" " " "
" " " " " " " "
"
" " "
" " " " " " " " "
"
" " " "
" " " " " " " " " " "
134
" Prácticas de laboratorio de sistemas electrónicos digitales

" " " " " " " " " "
" listado de funciones cmsis relacionadas más concretamente con el nVic
"
xqkf"PXKEaUgvRtkqtkv{Itqwrkpi"*wkpv54av"Rtkqtkv{Itqwr+"
Ugv"vjg"Rtkqtkv{"Itqwrkpi"*Itqwru"0"Uwditqwru+""
"
wkpv54av"PXKEaIgvRtkqtkv{Itqwrkpi"*xqkf+"
" " " " " " "
Igv"vjg"Rtkqtkv{"Itqwrkpi"*Itqwru"0"Uwditqwru+""
"
xqkf"PXKEaGpcdngKTS"*KTSpaV{rg"KTSp+"
Gpcdng"KTSp""
"
" " " " "
xqkf"PXKEaFkucdngKTS"*KTSpaV{rg"KTSp+"
" "
Fkucdng"KTSp""
"
wkpv54av"PXKEaIgvRgpfkpiKTS"*KTSpaV{rg"KTSp+"
Tgvwtp"3"kh"KTSp"ku"rgpfkpi"gnug"2""
"
xqkf"PXKEaUgvRgpfkpiKTS"*KTSpaV{rg"KTSp+"
Ugv"KTSp"Rgpfkpi""
"
xqkf"PXKEaEngctRgpfkpiKTS"*KTSpaV{rg"KTSp+"
Engct"KTSp"Rgpfkpi"Uvcvwu""
"
wkpv54av"PXKEaIgvCevkxg"*KTSpaV{rg"KTSp+"
Tgvwtp"3"kh"KTSp"ku"cevkxg"gnug"2""
"
xqkf"PXKEaUgvRtkqtkv{"*KTSpaV{rg"KTSp."wkpv54av"rtkqtkv{+"
Ugv"Rtkqtkv{"hqt"KTSp"
"
wkpv54av"PXKEaIgvRtkqtkv{"*KTSpaV{rg"KTSp+"
Igv"Rtkqtkv{"hqt"KTSp""
"
wkpv54av" PXKEaGpeqfgRtkqtkv{" *wkpv54av" Rtkqtkv{Itqwr." " wkpv54av" RtggorvRtkqtkv{.""
wkpv54av"UwdRtkqtkv{+"
Gpeqfg"rtkqtkv{"hqt"ikxgp"itqwr."rtggorvkxg"cpf"uwd"rtkqtkv{""
"
xqkf" PXKEaFgeqfgRtkqtkv{" *wkpv54av" Rtkqtkv{." " wkpv54av" Rtkqtkv{Itqwr." " wkpv54av,"
rRtggorvRtkqtkv{.""wkpv54av,"rUwdRtkqtkv{+"
Fgeqfg"ikxgp"rtkqtkv{"vq"itqwr."rtggorvkxg"cpf"uwd"rtkqtkv{""
"
xqkf"PXKEaU{uvgoTgugv"*xqkf+"
Tgugvu"vjg"U{uvgo""

" " " " " " " "


VIII.5. ejemplo
" de pRoGRAmA
" que utIlIzA InteRRupcIones exteRnAs
usAndo cmsIs
" " " " " " " " " " " " " " "
" " " " " " " " " " " " "
A continuación se presenta un ejemplo de programa que conmuta un LED
" " " " " " " " " " " " " " " "
conectado
"
al
"
puerto P3.25" con "
cada activación
" "
por " flanco
" "
de bajada
" "
de la inte-
" "
rrupción" externa
" EINT3.
" " " " " " " " " "
En este
" ejemplo
" " se "utilizan las
" funciones
" " " CMSIS
" para" configurar
" " el NVIC
" " " no"
"
siendo necesario" " definir
" " " "
los registros "
correspondientes y simplificando el progra-
ma." En el" proyecto
" "del" programa" se "incluiría, los ficheros startup_lPc17xx.s y
system_lPc17xx.c y, para tener disponibles todas las funciones CMSIS el fiche-
"
ro core_3m.c,
" aunque"en este caso particular no sería necesario ya que las fun-
ciones
" que allí se implementan no se utilizan.
" " " " " " " " " " " "
"
"
" " " "
" "
"
""" " " " " " """ " " " "
" " " " " " " " " " " " " " "
" " " " " " " " " " " " "
" " " " " " " " " " " " " " " "
" " " " " " " " " " " " "
" " " " " " " " " " " "
anexo Viii "- interruPciones
" " " externas del
" lPc1768
" " " " " " " " " "135"
" " " " " " " "
" " " " " " "
En negrita se muestran las funciones CMSIS.
"
%kpenwfg">NRE39zz0J@"
"
11"Gn"rtqitcoc"eqpowvc"wp"NGF"eqpgevcfq"cn"rkp"R304;"eqp"GKPV5"
"
"
11"Hwpekqp"fg"kpkekcnk|cekqp"
xqkf"Eqphki*xqkf+"
}"
"""11"Eqphkiwtcekqp"fgn"R4035"eqoq"GKPV5"""//@"RKPUGN6048"{"RKPUGN6049"
"""NREaRKPEQP/@RKPUGN6"~?"3">>"*35,4+="
"
"""11"Eqphkiwtct"gn"rkp"R5047"eqoq"ucnkfc"//@"IRKQ5"HKQFKT047"
"""NREaIRKQ5/@HKQFKT"~?"3>>47=" " "
"
"""11"Eqphkiwtcekqp"cevkxc"rqt"hncpeq"fg"dclcfc""//@"GZVOQFG05"
"""NREaUE/@GZVOQFG"~?"3>>"5="
"
" " " " " " " "
"""11"Ug"eqphkiwtc"rtkqtkfcf"3"c"nc"kpvgttwrekqp"GKPV5"*KTS43+"//@"KRT7"
"""PXKEaUgvRtkqtkv{*GKPV5aKTSp."2z23+="
"
"""11"Jcdknkvct"nc"kpvgttwrekqp"GKPV5""//@"KUGT2043"
"""PXKEaGpcdngKTS*GKPV5aKTSp+=""
"
"
"
11"Rtqitcoc"rtkpekrcn"
xqkf"ockp*xqkf+"
}"
"""11Hwpekqp"fg"kpkekcnk|cekqp"
"""Eqphki*+="
"
"""11"Rtqitcoc"rtkpekrcn"
"""yjkng"*3+="
"
"
11Hwpekqp"fg"kpvgttwrekqp"GKPV5"
xqkf"GKPV5aKTSJcpfngt*xqkf+"
}"
"""11"Dqttct"gn"hcni"fg"nc"GKPV5"//@"GZVKPV05"
"""NREaUE/@GZVKPV"?"3">>"5="
"
"""11"Eqpowvct"gn"NGF"//@"IRKQ5"HKQRKP" "R5047"
"""NREaIRKQ5/@HKQRKP"`?"3>>47="
"
"

" " " " " " " "


VIII.6. ejemplo de pRoGRAmA que utIlIzA InteRRupcIones exteRnAs sIn
" " "
usAR cmsIs
" " " " " " " " " " " " " " "
" " " " " " " " " " " " "
A continuación se presenta un ejemplo de programa que conmuta un LED
"
conectado " "puerto" P3.25
al " con" cada" activación
" " " flanco
por " " de
" bajada
" " de la" inte-"
" " " " " " " " " ""
rrupción externa EINT3.
" " " " " " " " " " " " " " " " " "
" " " " " " " " " " " " " " " " " ""
" " " " " "

" " " " " " " " " " "
""" " " " " " " " " "
""" " " " " "
"
""" " " " " " " " " "
""" " " "
"
"

136 Prácticas de laboratorio de sistemas electrónicos digitales

" " " " " " " "


"
Este ejemplo " no utiliza
" las funciones CMSIS para configurar el NVIC por lo
que" es necesario " " definir" los" registros
" " necesarios
" al " no encontrarse
" " " definidos
" " en el"
"
lPc17xx.h. " " " " " " " " " " " "
Se" presentan
" " dos" versiones,
" " la primera
" " en la que " " se definen
" " " los" "registros" de la"
forma más sencilla posible y la segunda en la que se definen de forma similar a
" " " " " " " " " ""
la utilizada
" "en el
" lPc17xx.h.
" " " " " " " " " " " " " " "
" " " " " " " " " " " " " " " " " ""
ejemplo
" "
con definición
" " "
sencilla" de registros

"En " " se presenta


negrita " " " " "
la definición " registros
de los " " del NVIC
"
%kpenwfg">NRE39zz0J@"
"
11"Gn"rtqitcoc"eqpowvc"wp"NGF"eqpgevcfq"cn"rkp"R304;"
"
11"Fghkpkekqp"fgn"nqu"tgikuvtqu"KRT7"fgn"PXKE"
%fghkpg"NREaPXKEaKRT7"",**xqncvkng"wpukipgf"kpv",+"*2zG222G636WN++"
"
"
11"fghkpkekqp"fgn"tgikuvtqu"KUGT2"fgn"PXKE"
" " " " " " "
%fghkpg"NREaPXKEaKUGT2",**xqncvkng"wpukipgf"kpv",+"*2zG222G322WN++"
"
11"Hwpekqp"fg"kpkekcnk|cekqp"
"
xqkf"Eqphki*xqkf+"
}"
"""11"Eqphkiwtcekqp"fgn"R4035"eqoq"GKPV5"""//@"RKPUGN6048"{"RKPUGN6049"
" " " " " " "
"""NREaRKPEQP/@RKPUGN6"~?"3">>"*35,4+="
"
"""11"Eqphkiwtct"gn"rkp"R5047"eqoq"ucnkfc"//@"IRKQ5"HKQFKT047"
"""NREaIRKQ5/@HKQFKT"~?"3>>47="
"
"""11"Eqphkiwtcekqp"cevkxc"rqt"hncpeq"fg"dclcfc""//@"GZVOQFG05"
"""NREaUE/@GZVOQFG"~?"3>>"5="
"
"""11"Ug"eqphkiwtc"rtkqtkfcf"3"c"nc"kpvgttwrekqp"GKPV5"*KTS43+"//@"KRT7"
"""NREaPXKEaKRT7"~?"*2z23">>"5+>>"*:","3+="
"
"""11"Jcdknkvct"nc"kpvgttwrekqp"GKPV5""//@"KUGT2043"
"""NREaPXKEaKUGT2"?"3>>43="
"
"
11"Rtqitcoc"rtkpekrcn"
xqkf"ockp*xqkf+"
}"
"
"""11Hwpekqp"fg"kpkekcnk|cekqp"
"""Eqphki*+="
"
"""11"Rtqitcoc"rtkpekrcn"
"""yjkng"*3+="
"
"
11Hwpekqp"fg"kpvgttwrekqp"GKPV5"
xqkf"GKPV5aKTSJcpfngt*xqkf+"
}"
""" " " " " " " " " "
""" " " " " "
"
""" " " " "" " " " " "
""" " " "
"
"
""
"""
""" "" "" ""
"""
""" ""
""
""" ""
""" "" ""
"""
""" "" ""
""
""
anexo Viii - interruPciones externas del lPc1768 137
"" "" "" ""
"" ""
""
"""11"Dqttct"gn"hcni"fg"nc"GKPV5"//@"GZVKPV05"
""" " " " " " " " " "
"""NREaUE/@GZVKPV"?"3">>"5="
""" " " " " "
""
"""11"Eqpowvct"gn"NGF""//@"IRKQ3"HKQRKP"
""" " " " "" " " " ""R5047"
"
"""NREaIRKQ5/@HKQRKP"`?"3>>47"
""" " " "
""
""
""
"" "" "" "" "" "" "" "" "" "" ""
"" ejemplo con definición de registros similar a la utilizada en lPc17xx.H
"" "" "" "" "" "" "" "" "" "" ""
En negrita se presenta la definición de los registros del NVIC
""
"
%kpenwfg">NRE39zz0J@""
""
" " " " " " " " "
11"Gn"rtqitcoc"eqpowvc"wp"NGF"eqpgevcfq"cn"rkp"R304;" "
""
" " " " " " "
11"Fghkpkekqp"fg"nqu"tgikuvtqu"KRT"fgn"PXKE" "
"
v{rgfgh"uvtwev"}"" "
""" " "
"""aaKQ"wkpv54av"KRT]4:_=" "
"
"NREaPXKEaKRTaV{rgFgh=""
""
" "" " "
%fghkpg"NREaPXKEaKRT""**NREaPXKEaKRTaV{rgFgh",+"*2zG222G622WN++""
""
" " " " " " "
11"fghkpkekqp"fg"nqu"tgikuvtqu"KUGT"fgn"PXKE" "
"
v{rgfgh"uvtwev"}"" "
""" " "
"""aaKQ"wkpv54av"KUGT2=" " " "
""" " "
"""aaKQ"wkpv54av"KUGT3=" "
"""aaKQ"wkpv54av"KUGT4="
"""aaKQ"wkpv54av"KUGT5="
"" "" "" "" "" "" "" ""
"NERaPXKEaKUGTaV{rgFgh="
"
%fghkpg"NREaPXKEaKUGT"**"NERaPXKEaKUGTaV{rgFgh",+"*2zG222G322WN++"
"
"
11"Hwpekqp"fg"kpkekcnk|cekqp"
xqkf"Eqphki*xqkf+"
}"
"""11"Eqphkiwtcekqp"fgn"R4035"eqoq"GKPV5"""//@"RKPUGN6048"{"RKPUGN6049"
"""NREaRKPEQP/@RKPUGN6"~?"3">>"*35,4+="
"
"""11"Eqphkiwtct"gn"rkp"5047"eqoq"ucnkfc"//@"IRKQ5"HKQFKT047"
"""NREaIRKQ5/@HKQFKT"~?"3>>47="
"
"""11"Eqphkiwtcekqp"cevkxc"rqt"hncpeq"fg"dclcfc""//@"GZVOQFG05"
"""NREaUE/@GZVOQFG"~?"3>>"5="
"
"""11"Ug"eqphkiwtc"rtkqtkfcf"3"c"nc"kpvgttwrekqp"GKPV5"*KTS43+"//@"KRT7"
"""NREaPXKEaKRT/@KRT]7_"~?"*2z23">>"5+>>"*:","3+="
"
"""11"Jcdknkvct"nc"kpvgttwrekqp"GKPV5""//@"KUGT2043"
"""NREaPXKEaKUGT/@KUGT2"?"3>>43="
"
"
"
11"Rtqitcoc"rtkpekrcn"
xqkf"ockp*xqkf+"
"
""" " " "
""" "
"
""" " " "
""" " "
""" " " " "
"
""" " " " " " " " " " " " "
""" " " " " " " " "
"
""" " " " " "" " "
""" " " "
"
138
"
Prácticas de laboratorio de sistemas electrónicos digitales
"
" " "
xqkf"ockp*xqkf+"
}"
"""11Hwpekqp"fg"kpkekcnk|cekqp"
"""Eqphki*+="
"
"""11"Rtqitcoc"rtkpekrcn"
"""yjkng"*3+="
"
"
11Hwpekqp"fg"kpvgttwrekqp"GKPV5"
xqkf"GKPV5aKTSJcpfngt*xqkf+"
}"
"""11"Dqttct"gn"hcni"fg"nc"GKPV5"//@"GZVKPV05"
"""NREaUE/@GZVKPV"?"3">>"5="
"
"""11"Eqpowvct"gn"NGF""//@"IRKQ3"HKQRKP" "R5047"
"""NREaIRKQ5/@HKQRKP"`?"3>>47="
"
"
" " " " " " "
"
" " " " " " " " " "
VIII.7.
" tAblA de nombRes y númeRo de InteRRupcIón
" " " " " " " "
Esta tabla se encuentra en el fichero lPc17xx.h.
"
1,,,,,,""Eqtvgz/O5"Rtqeguuqt"Gzegrvkqpu"Pwodgtu",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1"
""PqpOcumcdngKpvaKTSp"""""""""""?"/36.""""""1,#>"4"Pqp"Ocumcdng"Kpvgttwrv""""""""""""""""""""""""",1"
""Ogoqt{OcpcigogpvaKTSp"""""""""?"/34.""""""1,#>"6"Eqtvgz/O5"Ogoqt{"Ocpcigogpv"Kpvgttwrv"""""""""",1"
""DwuHcwnvaKTSp"""""""""""""""""?"/33.""""""1,#>"7"Eqtvgz/O5"Dwu"Hcwnv"Kpvgttwrv"""""""""""""""""",1"
""WucigHcwnvaKTSp"""""""""""""""?"/32.""""""1,#>"8"Eqtvgz/O5"Wucig"Hcwnv"Kpvgttwrv"""""""""""""""",1"
""UXEcnnaKTSp"""""""""""""""""""?"/7."""""""1,#>"33"Eqtvgz/O5"UX"Ecnn"Kpvgttwrv""""""""""""""""""",1"
""FgdwiOqpkvqtaKTSp"""""""""""""?"/6."""""""1,#>"34"Eqtvgz/O5"Fgdwi"Oqpkvqt"Kpvgttwrv""""""""""""",1"
""RgpfUXaKTSp"""""""""""""""""""?"/4."""""""1,#>"36"Eqtvgz/O5"Rgpf"UX"Kpvgttwrv""""""""""""""""""",1"
""U{uVkemaKTSp""""""""""""""""""?"/3."""""""1,#>"37"Eqtvgz/O5"U{uvgo"Vkem"Kpvgttwrv""""""""""""""",1"
"
1,,,,,,""NRE39zz"Urgekhke"Kpvgttwrv"Pwodgtu",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1"
""YFVaKTSp""""""""""""""""""""""?"2.""""""""1,#>"Ycvejfqi"Vkogt"Kpvgttwrv""""""""""""""""""""""""",1"
""VKOGT2aKTSp"""""""""""""""""""?"3.""""""""1,#>"Vkogt2"Kpvgttwrv""""""""""""""""""""""""""""""""",1"
""VKOGT3aKTSp"""""""""""""""""""?"4.""""""""1,#>"Vkogt3"Kpvgttwrv""""""""""""""""""""""""""""""""",1"
" " " " " "
""VKOGT4aKTSp"""""""""""""""""""?"5.""""""""1,#>"Vkogt4"Kpvgttwrv""""""""""""""""""""""""""""""""",1" "
""VKOGT5aKTSp"""""""""""""""""""?"6.""""""""1,#>"Vkogt5"Kpvgttwrv""""""""""""""""""""""""""""""""",1"
""WCTV2aKTSp""""""""""""""""""""?"7.""""""""1,#>"WCTV2"Kpvgttwrv"""""""""""""""""""""""""""""""""",1"
""WCTV3aKTSp""""""""""""""""""""?"8.""""""""1,#>"WCTV3"Kpvgttwrv"""""""""""""""""""""""""""""""""",1"
""WCTV4aKTSp""""""""""""""""""""?"9.""""""""1,#>"WCTV4"Kpvgttwrv"""""""""""""""""""""""""""""""""",1"
""WCTV5aKTSp""""""""""""""""""""?":.""""""""1,#>"WCTV5"Kpvgttwrv"""""""""""""""""""""""""""""""""",1"
""RYO3aKTSp"""""""""""""""""""""?";.""""""""1,#>"RYO3"Kpvgttwrv""""""""""""""""""""""""""""""""""",1"
""K4E2aKTSp"""""""""""""""""""""?"32."""""""1,#>"K4E2"Kpvgttwrv""""""""""""""""""""""""""""""""""",1"
""K4E3aKTSp"""""""""""""""""""""?"33."""""""1,#>"K4E3"Kpvgttwrv""""""""""""""""""""""""""""""""""",1"
""K4E4aKTSp"""""""""""""""""""""?"34."""""""1,#>"K4E4"Kpvgttwrv""""""""""""""""""""""""""""""""""",1"
""URKaKTSp""""""""""""""""""""""?"35."""""""1,#>"URK"Kpvgttwrv"""""""""""""""""""""""""""""""""""",1"
""UUR2aKTSp"""""""""""""""""""""?"36."""""""1,#>"UUR2"Kpvgttwrv""""""""""""""""""""""""""""""""""",1"
""UUR3aKTSp"""""""""""""""""""""?"37."""""""1,#>"UUR3"Kpvgttwrv""""""""""""""""""""""""""""""""""",1"
""RNN2aKTSp"""""""""""""""""""""?"38."""""""1,#>"RNN2"Nqem"*Ockp"RNN+"Kpvgttwrv""""""""""""""""""",1"
""TVEaKTSp""""""""""""""""""""""?"39."""""""1,#>"Tgcn"Vkog"Enqem"Kpvgttwrv"""""""""""""""""""""""",1"
""GKPV2aKTSp""""""""""""""""""""?"3:."""""""1,#>"Gzvgtpcn"Kpvgttwrv"2"Kpvgttwrv""""""""""""""""""",1"
""GKPV3aKTSp""""""""""""""""""""?"3;."""""""1,#>"Gzvgtpcn"Kpvgttwrv"3"Kpvgttwrv""""""""""""""""""",1"
""GKPV4aKTSp""""""""""""""""""""?"42."""""""1,#>"Gzvgtpcn"Kpvgttwrv"4"Kpvgttwrv""""""""""""""""""",1"
""GKPV5aKTSp""""""""""""""""""""?"43."""""""1,#>"Gzvgtpcn"Kpvgttwrv"5"Kpvgttwrv""""""""""""""""""",1"
""CFEaKTSp""""""""""""""""""""""?"44."""""""1,#>"C1F"Eqpxgtvgt"Kpvgttwrv"""""""""""""""""""""""""",1"
""DQFaKTSp""""""""""""""""""""""?"45."""""""1,#>"Dtqyp/Qwv"Fgvgev"Kpvgttwrv""""""""""""""""""""""",1"
""WUDaKTSp""""""""""""""""""""""?"46."""""""1,#>"WUD"Kpvgttwrv"""""""""""""""""""""""""""""""""""",1"
""ECPaKTSp""""""""""""""""""""""?"47."""""""1,#>"ECP"Kpvgttwrv"""""""""""""""""""""""""""""""""""",1"
""FOCaKTSp""""""""""""""""""""""?"48."""""""1,#>"Igpgtcn"Rwtrqug"FOC"Kpvgttwrv"""""""""""""""""""",1"
""K4UaKTSp""""""""""""""""""""""?"49."""""""1,#>"K4U"Kpvgttwrv"""""""""""""""""""""""""""""""""""",1"
""GPGVaKTSp"""""""""""""""""""""?"4:."""""""1,#>"Gvjgtpgv"Kpvgttwrv""""""""""""""""""""""""""""""",1"
""TKVaKTSp""""""""""""""""""""""?"4;."""""""1,#>"Tgrgvkvkxg"Kpvgttwrv"Vkogt"Kpvgttwrv""""""""""""",1"
""OERYOaKTSp""""""""""""""""""""?"52."""""""1,#>"Oqvqt"Eqpvtqn"RYO"Kpvgttwrv"""""""""""""""""""""",1"
""SGKaKTSp""""""""""""""""""""""?"53."""""""1,#>"Swcftcvwtg"Gpeqfgt"Kpvgthceg"Kpvgttwrv""""""""""",1"
""RNN3aKTSp"""""""""""""""""""""?"54."""""""1,#>"RNN3"Nqem"*WUD"RNN+"Kpvgttwrv"""""""""""""""""""",1"
""WUDCevkxkv{aKTSp""""""""""""""?"55."""""""1,#>"WUD"Cevkxkv{"Kpvgttwrv"" " " "
" " "",1"
anexo Viii - interruPciones externas del lPc1768 139

VIII.8. defInIcIón de los nombRes de RutInAs de AtencIón " "

" "
" A lAs InteRRupcIones " " " " " " " "
"
Tabla de nombres de las diferentes rutinas de interrupción obtenidas de la
" " " " " " " " " " " " " " " "
Tabla de Vectores
"
de Interrupción
" " " "
definida en"" el archivo startup_lPc17xx.h.
""""""""""""""""FEF"""""TgugvaJcpfngt"""""""""""""="Tgugv"Jcpfngt"
""""""""""""""""FEF"""""POKaJcpfngt"""""""""""""""="POK"Jcpfngt"
""""""""""""""""FEF"""""JctfHcwnvaJcpfngt"""""""""="Jctf"Hcwnv"Jcpfngt"
""""""""""""""""FEF"""""OgoOcpcigaJcpfngt"""""""""="ORW"Hcwnv"Jcpfngt"
""""""""""""""""FEF"""""DwuHcwnvaJcpfngt""""""""""="Dwu"Hcwnv"Jcpfngt"
""""""""""""""""FEF"""""WucigHcwnvaJcpfngt""""""""="Wucig"Hcwnv"Jcpfngt"
""""""""""""""""FEF"""""2"""""""""""""""""""""""""="Tgugtxgf"
""""""""""""""""FEF"""""2"""""""""""""""""""""""""="Tgugtxgf"
""""""""""""""""FEF"""""2"""""""""""""""""""""""""="Tgugtxgf"
""""""""""""""""FEF"""""2"""""""""""""""""""""""""="Tgugtxgf"
""""""""""""""""FEF"""""UXEaJcpfngt"""""""""""""""="UXEcnn"Jcpfngt"
""""""""""""""""FEF"""""FgdwiOqpaJcpfngt""""""""""="Fgdwi"Oqpkvqt"Jcpfngt"
""""""""""""""""FEF"""""2"""""""""""""""""""""""""="Tgugtxgf"
""""""""""""""""FEF"""""RgpfUXaJcpfngt""""""""""""="RgpfUX"Jcpfngt"
""""""""""""""""FEF"""""U{uVkemaJcpfngt"""""""""""="U{uVkem"Jcpfngt"
""""""""""""""""="Gzvgtpcn"Kpvgttwrvu"
""""""""""""""""FEF"""""YFVaKTSJcpfngt""""""""""""="38<"Ycvejfqi"Vkogt"
""""""""""""""""FEF"""""VKOGT2aKTSJcpfngt"""""""""="39<"Vkogt2"
""""""""""""""""FEF"""""VKOGT3aKTSJcpfngt"""""""""="3:<"Vkogt3"
""""""""""""""""FEF"""""VKOGT4aKTSJcpfngt"""""""""="3;<"Vkogt4"
""""""""""""""""FEF"""""VKOGT5aKTSJcpfngt"""""""""="42<"Vkogt5"
""""""""""""""""FEF"""""WCTV2aKTSJcpfngt""""""""""="43<"WCTV2"
""""""""""""""""FEF"""""WCTV3aKTSJcpfngt""""""""""="44<"WCTV3"
""""""""""""""""FEF"""""WCTV4aKTSJcpfngt""""""""""="45<"WCTV4"
""""""""""""""""FEF"""""WCTV5aKTSJcpfngt""""""""""="46<"WCTV5"
""""""""""""""""FEF"""""RYO3aKTSJcpfngt"""""""""""="47<"RYO3"
""""""""""""""""FEF"""""K4E2aKTSJcpfngt"""""""""""="48<"K4E2"
""""""""""""""""FEF"""""K4E3aKTSJcpfngt"""""""""""="49<"K4E3"
""""""""""""""""FEF"""""K4E4aKTSJcpfngt"""""""""""="4:<"K4E4"
""""""""""""""""FEF"""""URKaKTSJcpfngt""""""""""""="4;<"URK"
""""""""""""""""FEF"""""UUR2aKTSJcpfngt"""""""""""="52<"UUR2"
""""""""""""""""FEF"""""UUR3aKTSJcpfngt"""""""""""="53<"UUR3"
""""""""""""""""FEF"""""RNN2aKTSJcpfngt"""""""""""="54<"RNN2"Nqem"*Ockp"RNN+"
""""""""""""""""FEF"""""TVEaKTSJcpfngt""""""""""""="55<"Tgcn"Vkog"Enqem"
""""""""""""""""FEF"""""GKPV2aKTSJcpfngt""""""""""="56<"Gzvgtpcn"Kpvgttwrv"2"
""""""""""""""""FEF"""""GKPV3aKTSJcpfngt""""""""""="57<"Gzvgtpcn"Kpvgttwrv"3"
""""""""""""""""FEF"""""GKPV4aKTSJcpfngt""""""""""="58<"Gzvgtpcn"Kpvgttwrv"4"
""""""""""""""""FEF"""""GKPV5aKTSJcpfngt""""""""""="59<"Gzvgtpcn"Kpvgttwrv"5"
""""""""""""""""FEF"""""CFEaKTSJcpfngt""""""""""""="5:<"C1F"Eqpxgtvgt"
""""""""""""""""FEF"""""DQFaKTSJcpfngt""""""""""""="5;<"Dtqyp/Qwv"Fgvgev"
""""""""""""""""FEF"""""WUDaKTSJcpfngt""""""""""""="62<"WUD"
""""""""""""""""FEF"""""ECPaKTSJcpfngt""""""""""""="63<"ECP"
""""""""""""""""FEF"""""FOCaKTSJcpfngt""""""""""""="64<"Igpgtcn"Rwtrqug"FOC"
""""""""""""""""FEF"""""K4UaKTSJcpfngt""""""""""""="65<"K4U"
""""""""""""""""FEF"""""GPGVaKTSJcpfngt"""""""""""="66<"Gvjgtpgv"
""""""""""""""""FEF"""""TKVaKTSJcpfngt""""""""""""="67<"Tgrgvkvkxg"Kpvgttwrv"Vkogt"
""""""""""""""""FEF"""""OERYOaKTSJcpfngt""""""""""="68<"Oqvqt"Eqpvtqn"RYO"
""""""""""""""""FEF"""""SGKaKTSJcpfngt""""""""""""="69<"Swcftcvwtg"Gpeqfgt"Kpvgthceg"
""""""""""""""""FEF"""""RNN3aKTSJcpfngt"""""""""""="6:<"RNN3"Nqem"*WUD"RNN+"
""""""""""""""""FEF"""""WUDCevkxkv{aKTSJcpfngt""""="6;<"WUD"Cevkxkv{"kpvgttwrv"vq"ycmgwr"
""""""""""""""""FEF"""""ECPCevkxkv{ KTSJcpfngt""""="72<"ECP"Cevkxkv{"kpvgttwrv"vq"ycmgwr"
"
" " " " " " " " " " " " "
Por ejemplo, las funciones de interrupción de las interrupciones externas de
" " " "
definen
""""""" así:"
"
" " " "
""""""" "
"
" " " "
""""""" "
"
" " " "
""""""" "
"""""""""""""""" """"" """""""""""" " " " " "
"""""""""""""""" """"" """""""""""" " " "
"""""""""""""""" """"" """"""""""" " " "
"""""""""""""""" """"" """""""""""" " " " " "
"""""""""""""""" """"" """""""""" " " " " "
"""""""""""""""" """"" """""""""""" " " " " "
"""""""""""""""" """"" """"""""""" " " " " " "
"""""""""""""""" """"" """" " " " " " " "
"""""""""""""""" """"" """" " " " " " " "
140
" Prácticas de laboratorio de sistemas electrónicos digitales
" " " " " " " " " " " " "
xqkf"GKPV2aKTSJcpfngt"*xqkf+"}"
"""""""ÈÈ0"
"
xqkf"GKPV3aKTSJcpfngt"*xqkf+"}"
"""""""ÈÈ0"
"
xqkf"GKPV4aKTSJcpfngt"*xqkf+"}"
"""""""ÈÈ0"
"
xqkf"GKPV5aKTSJcpfngt"*xqkf+"}"
"""""""ÈÈ0"

" " " " " " "


Anexo Ix

entrAdAs AnAlógIcAs y conversIón Adc en tArjetA


con lPc1768_H

Ix.1. IntroduccIón

Este anexo presenta un resumen de los registros, y su manejo, necesarios para


configurar correctamente el periférico de conversión analógico-digital y los pines
del controlador a los que se conectan las entradas analógicas.
La información está obtenida fundamentalmente del “LPC17xx User Manual
Rev4.1” proporcionado por NXP.

Ix.2. el conversor AnAlógIco-dIgItAl

Se trata de un conversor de aproximaciones sucesivas de 12-bit de resolución,


que presenta las siguientes características

• 8 entradas analógicas multiplexadas.


• Modo Power-down.
• Rango de medida entre las tensiones de referencia VREFN hasta VREFP
conectadas al chip (valor típico 3 V; NO SE PUEDE EXCEDER DEL
NIVEL DE TENSIÓN VDDA).
• Conversión en 12 bit hasta 200 kS/s.
• Conversión continua (burst conversion) para una o múltiples entradas.

El Reloj para la conversión A/D se obtiene a partir del reloj del APB. Cada
conversor incluye un divisor para obtener a partir de este reloj el reloj final de
conversión que necesita el proceso de aproximaciones sucesivas (máximo 13
MHz).
142 Prácticas de laboratorio de sistemas electrónicos digitales

Ix.3. descrIPcIón de PInes relAcIonAdos con el Adc

Los pines en los que se conectan las entradas analógicas son AD0.7…AD0.0
(pines configurables de P0 y P1) accesibles varias de ellas en la tarjeta LPC1768-
Mini-DK2.
Los pines de las tensiones de referencia VREFN y VREFP suministran los
niveles de tensión de referencia para el conversor.
Los pines de alimentación analógica y masa VDDA y VSSA alimentan al blo-
que de conversión.
" " " " " " "

"

" " " " " "


" " " " " " " " " " " " " " " "
" " " "
anexo ix - entradas analógicas y conversión adc en tarjeta con lPc178_h 143
"

Ix.4. descrIPcIón de los regIstros ImPlIcAdos.


" " " " " "
"Los registros
" implicados
" " "en la conversión
" " ADC
" se" listan
" " en la siguiente
" " "tabla, " "
y algunos" se describen "resumidamente
" " a continuación.

"
"
"registro de control A/d (Ad0cr - 0x4003 4000)
" La funcionalidad de los bits del registro es, entre otras:

• Seleccionar cuál o cuáles de las 8 entradas analógicas se desean muestrear


y convertir a señales digitales.
• Programar el divisor para obtener la frecuencia de funcionamiento de apro-
" ximaciones sucesivas (debe ser menor
" de 13 Mhz).
" " " " " "
• Programar conversión continua (burst) que se repetirá con una frecuencia
de muestreo de hasta 200kS/s (multiplexados para todas las entradas selec-
cionadas).
• Activar el conversor o ponerlo en modo Power-Down.
" " " " " " " " " "

" " " " " " " " " " " " " " " "
" ""
" " " " " " " "" " " "
" " " "" " "
144 " " " "
Prácticas de" laboratorio
" " " " electrónicos
de sistemas " "digitales
" "
" " " " " " " " "
•" " " cuándo " y" cómo se
Controlar " "realiza " la conversión" si no se ha programado
" " " "
conversión continua. " " " " " " " " " " "
"

"

" " " " " " "


anexo ix - entradas analógicas y conversión adc en tarjeta con lPc178_h 145

registro de datos A/d global data register (Ad0gdr - 0x4003 4004)


" " " " " " "
Este " registro
" "mantiene
" el" dato " de la conversión
" " "más reciente
" que
" se ha com-
pletado, incluyendo copia de los flag de estado asociados a esa conversión. (Otra
forma " de leer " los datos
" " de "conversión
" " "
es leer " Registros
los " " de" Datos
" de los" dife- "
" " " " " " " " " " " " " " " " " "
rentes canales “A/D Channel Data Registers”)
" " " " " " " " " " " " " "
Los bits correspondientes a este registro se muestran y describen a continua-
"
ción. " " " " " " " " " " "

" " " " " " " " "


•" Indica cuando
" " se" ha" completado
" " una conversión (DONE).
•" Suministra
" " el
" valor
" " de la
" conversión.
"
•" Indica" el canal
" "
que ha
" " "
sido convertido.
" " " " " " " "
" •Indica si el resultado se ha sobrescrito sin leer el valor de conversión anterior.

"
" " " " " " " " " " "
" "
registro de habilitación de Interrupciones. A/d Interrupt enable register
" " " " " " " " " " " " "
(Ad0Inten
" "
- 0x4003" "
400c)" " " " " " " " " " "
" " " " " " " " " "
Este registro permite controlar qué canal(es) del A/D genera una interrup-
" ción cuando se completa la conversión de datos. Hay que recordar que cuando
" se convierten varios canales, se empieza la conversión por el de índice menor
0,1,2, etc.
146 Prácticas de laboratorio de sistemas electrónicos digitales

" "

"
"

"
" " " " " " " " " " " " " "
"
registros de datos. A/d. data registers (Ad0dr0 to Ad0dr7 - 0x4003
" " " " "
4010 to 0x4003 402c) " " " " " " " " " " " "
" " " " " " " " " " " " " " "
" " " " " " " " " " " " " " " " "
Contienen
" " "el dato de la" última" conversión
" " " de cada canal.
" " También
" " incluyen
" los
" "
flags
" " que indican
" "si la conversión
" se ha completado y si ha ocurrido una sobres-
critura (se produjo una nueva conversión de datos y no se había consultado el
resultado de la anterior). Como se comentó, el resultado de las conversiones tam-
bién se puede ir consultando en a/d global data register según se va produ-
ciendo la conversión.

"
"
"
" " " " " " " " " " " " " "
"
" " " " " " " " " " " " " " " " "
" " " " " " " " " " " " " " "
" " " " " " " " " " " " " " " " "
anexo ix - entradas analógicas y conversión adc en tarjeta con lPc178_h
" " " " " " " " " " " " "
147
" "
" " " " "

"
"
"registros de estados. A/d status register (AdstAt - 0x4003 4030)
" " " " " " "
" "
Este "registro
" " " comprobar
permite " " estado " de
el " todos" los canales
" simultánea-
mente " " " " " " "
" " " " " " " " " " "

"
" " " " " " "" " "
" " " " " " " " " " " " " " " " "
" " " " " " " " " " " " " ""
148 Prácticas de laboratorio de sistemas electrónicos digitales

registro de Ajuste. A/d trim register (AdtrIm - 0x4003 4034)


"
Este "registro
" es" inicializado
" " por "el código" de
" arranque.
" Contiene
" los valores de
ajuste para el ADC. El valor de corrección de offset del ADC puede ser modifi-
cado" por el" usuario.
" " " " " " " " " " " " " " "
" " " " " " " " " " " " " ""

"
"

" " " " " " " "

You might also like