Documentos de Académico
Documentos de Profesional
Documentos de Cultura
LABORATORIO 2
I. OBJETIVO
• Aprender a desarrollar programas elementales en lenguaje C para programar los puertos de E/S
del microcontrolador TM4C123GH6PM.
II. MATERIALES
• Computadora personal
• Entorno de desarrollo Keil uVision 4.74
• Módulo de desarrollo Tiva Launchpad EK-TM4C123GXL de Texas Instruments.
• 1 cable de extensión USB.
III. PROCEDIMIENTO
Mediante 3 proyectos desarrollados se practicará con el entorno IDE Keil uVision 4.74 para aprender a
programar el microcontrolador TM4C123GH6PM de la tarjeta Tiva Launchpad.
• El primer proyecto consiste en desarrollar un programa que calcule el menor de tres números
ingresados con los pulsadores y el promedio de los dos mayores, haciendo uso de la librería
TivaES.
• El segundo proyecto consiste en alternar el color del led RGB (rojo, verde y azul) cada vez que se
pulse tres veces el pulsador SW2.
• El tercer proyecto consiste en generar un número aleatorio y mostrarlo en el led RGB del Tiva
Launchpad.
En la figura 1a, se observa que tanto los pulsadores como los leds se encuentran físicamente conectados
a algunos pines del puerto F; específicamente: PF4, PF0 (pulsadores SW1 y SW2) y PF1, PF2 y PF3 (leds
rojo, azul y verde respectivamente).
En esta etapa del curso controlaremos dichos periféricos haciendo uso de una librería precompilada, la
librería TivaES, que contiene procedimientos y funciones ya probadas para el control del led RGB y los
pulsadores SW1 y SW2, mediante la manipulación del puerto F.
Utilice los mismos pasos que los mencionados en la guía 1 del curso para crear el proyecto.
Con fines de orden, podemos crear un nuevo grupo de archivos fuente. Ver figura 3.
Podemos cambiar el nombre de grupo creado haciendo clic izquierdo sostenido sobre el nombre y
editándolo.
Como parte de la experiencia se les hará llegar los archivos TivaES.h y TivaES.obj, los cuales deberán
copiarlos a la carpeta actual del proyecto. Lo que sigue es simplemente añadir dichos archivos al proyecto,
en el nuevo grupo creado. Luego de añadir dichos archivos, su proyecto deberá quedar:
Nótese que se incluye el archivo objeto (código máquina) mas no el archivo fuente (codigo C) al proyecto,
haciendo que su uso sea transparente al usuario. Es decir, que no conocemos y no tenemos porque saber
cómo la librería realiza específicamente su trabajo, simplemente la invocamos y la tarea se realiza.
La inspección del archivo TivaES.h nos lleva a un listado rápido de las tareas que permite realizar la
librería, una descripción del funcionamiento de cada una de ellas (comentarios) y los argumentos con los
que trabaja (mediante el análisis de la declaración o prototipo de la función).
Por ejemplo, la figura 6 muestra la declaración de la función TivaES_inicializa. Los comentarios (en verde)
describen claramente el funcionamiento de la función, es decir, configurar los pines del puerto F para poder
manejar los periféricos. Tanto los comentarios como la declaración de la función especifican que la función
no necesita ningún argumento de entrada para realizar su labor y en la salida de la función tampoco existe
alguna variable como resultado de la llamada a la función.
Las ocho constantes definidas para su uso con la variable color, son:
De esta manera, para hacer parpadear el led RGB 15 veces en color cian, escribiríamos la siguiente
línea de código en nuestro programa:
TivaES_LedParpadeo(CIAN, 15);
El primer argumento indica el número de dígitos que espera la función antes de terminar su tarea,
mientras que el segundo argumento indica si se activa o no el indicador luminoso (led RGB) para cada
paso del proceso de adquisición del número.
Ejemplo: Si deseo ingresar un número de tres dígitos (unidades, decenas y centenas) con el indicador
luminoso activado, se deberá escribir en mi código fuente:
Luego, una vez llegado al punto de ejecución de la función, el microcontrolador empieza a ejecutar la
función y SÓLO SALDRA DE ELLA una vez que se haya COMPLETADO el proceso de adquisición
del número, tal y como se describe en el comentario asociado a la función (figura 9).
Es decir, si el usuario desea ingresar el número 241 al sistema, deberá activar los pulsadores SW1 y
SW2 del TivaLaunchpad en el siguiente orden:
SW1 SW1 SW2 SW1 SW1 SW1 SW1 SW2 SW1 SW2
2 4 1
Luego de activar los pulsadores en el orden descrito la función regresará el valor 241 y la almacenará
en la variable número.
V. EJEMPLOS
Desarrollar un programa para el TM4C123GH6PM tal que el usuario pueda ingresar tres números de dos
dígitos cada uno, hasta 99 inclusive, para acto seguido hacer el cálculo del menor de dichos números y
hallar el promedio sin considerar el menor de los tres números. Se muestra el promedio mediante
parpadeos en color blanco del led RGB.
Es decir, si el promedio en mención es 7, entonces se hará parpadear 7 veces en color blanco el led RGB.
Hacer uso de las funciones de la librería TivaES.
Diagrama de flujo
Fig. 10 Diagrama de flujo del ejemplo 1: calcular el menor y el promedio de tres números
Pseudocódigo
Algoritmo Calcula_MenorDeTresNumeros_PromediaMayores
Constantes
BLANCO
Variables
Entero: nota1, nota2, nota3, menor, promedio
Inicio
ConfigurarPuerto()
Mientras (Verdadero)
nota1 SolicitaNumero ()
nota2 SolicitaNumero ()
nota3 SolicitaNumero ()
menor NotaMenor(nota1, nota2, nota3)
promedio (nota1 + nota2 + nota3 – menor)/2
ParpadeaLed(promedio, BLANCO)
FinMientras
FinAlgoritmo
Codificación
/****************************************************************************************/
/****************************************************************************************/
/***** PONTIFICIA UNIVERSIDAD CATÓLICA DEL PERÚ *****/
/***** PONTIFICIA UNIVERSIDAD CATÓLICA DEL PERÚ *****/
/***** FACULTAD DE CIENCIAS E INGENIERÍA *****/
/***** SISTEMAS DIGITALES *****/
/****************************************************************************************/
/***** Tema: Programación de puertos de E/S con TivaES *****/
/***** Proyecto: Lab2_ejemplo1 *****/
/****************************************************************************************/
/***** Microcontrolador: TM4C123GH6PM *****/
/***** EvalBoard: Tiva C Series TM4C123G LaunchPad *****/
/***** Autor: Rolando Sánchez Ponce *****/
/***** Fecha: Abril 2019 *****/
/***** *****/
/****************************************************************************************/
/***** Enunciado: *****/
/***** El programa calcula el promedio de tres notas sin considerar la menor de *****/
/***** ellas. El usuario ingresa las tres notas mediante los pulsadores y visualiza *****/
/***** el promedio en el led RGB. *****/
/****************************************************************************************/
/****************************************************************************************/
#include <stdint.h>
#include "tm4c123gh6pm.h"
#include "TivaES.h"
/****************************************************************************************/
/***** numMenor3() *****/
/****************************************************************************************/
/***** Determina el menor de tres números. *****/
/****************************************************************************************/
/***** ENTRADAS: a, b, c: Tres números de 8 bits. *****/
/***** SALIDA: El menor de los tres números *****/
/****************************************************************************************/
/****************************************************************************************/
/***** P R O G R A M A P R I N C I P A L *****/
/****************************************************************************************/
int main(void) {
uint8_t nota1, nota2, nota3, promedio, notaMenor;
TivaES_Inicializa();
while(1){
nota1 = TivaES_SolicitaNumero(2, TRUE);
nota2 = TivaES_SolicitaNumero(2, TRUE);
nota3 = TivaES_SolicitaNumero(2, TRUE);
notaMenor = numMenor3(nota1, nota2, nota3);
promedio = (nota1 + nota2 + nota3 - notaMenor)/2;
TivaES_LedParpadeo(BLANCO, promedio);
}
}
/****************************************************************************************/
/***** F I N D E L P R O G R A M A *****/
/****************************************************************************************/
Fig. 11 Código del ejemplo 1: determinación del menor y el promedio de tres números
Copiamos el código fuente (figura 11) al archivo main.c y luego procedemos a compilar nuestro proyecto
con la herramienta Project->Build Target de la barra de menú. Hasta este punto no deberían mostrarse
errores tal como se muestra en la figura 12.
0 Error (S)
Utilizamos el simulador como herramienta de depuración (debug). Para ello en la barra de menú
seleccionamos Project->Options for Target, pestaña Debug, seleccionamos Use Simulator. Acto
seguido iniciamos la depuración mediante la opción Debug->Start/Stop Debug sesión, o mediante el
icono asociado .
Recordar que las opciones de menú Debug y Peripherals contienen herramientas para utilizar en este
entorno de depuración (figura 13). En este contexto podemos destacar las diferentes secciones resaltadas:
sección de variables locales, herramientas de depuración y el simulador visual TExaS LaunchPadDLL.
Utilizamos la herramienta Step Over (F10) para avanzar por el código de nuestro programa. Así,
ubicados en la sentencia TivaES_Inicializa(); (figura 13, línea de código resaltada en verde) al hacer clic
en la herramienta Step Over o pulsando F10 el simulador ejecutará TODAS las acciones internas a la
función TivaES_Inicializa y por lo tanto realizará la tarea completa, es decir, configurará todos los registros
necesarios del puerto F para hacer uso de los periféricos conectados a el: led RGB, pulsadores SW1 y
SW2.
Es importante recordar que esta función deberá utilizarse SIEMPRE cada vez que se necesite controlar
los periféricos de la tarjeta TivaLaunchpad.
Fig. 14 Capturas de pantalla antes y después de depurar la sentencia TivaES_Inicializa con F10 (Step Over). Nótese que el
puntero de programa paso de la línea 47 a la 48 en la figura, vale decir, la función TivaES_Inicializa se ejecutó en forma
completa.
Realicemos la misma prueba, pero ahora con la opción de depuración Step Into (F11). Para ello
reiniciemos la depuración y estando en el punto de ejecución de la sentencia TivaES_Inicializa();
procedemos a depurar esta vez con Step Into (F11) . Podemos notar que la ejecución del programa
se traslada a la ventana Disassembly, la cual recorre la ejecución de la función, pero esta vez en lenguaje
ensamblador, ya no en C.
Fig. 15 Capturas de pantalla antes y después de depurar la sentencia TivaES_Inicializa con F11 (Step Into). Nótese que la
ejecución del programa (depuración) se traslada a la ventana Disassembly. En ella se ejecutan las instrucciones en lenguaje
ensamblador cada vez que se pulse F11 (cursor amarillo).
Podemos concluir entonces que, dado que la operación en lenguaje ensamblador no está contemplado en
esta etapa del curso, todas las funciones de la librería TivaES las procederemos a depurar con la
herramienta Step Over (F10).
Cuando lleguemos a la depuración de esta sentencia, al igual que con cualquier otra que incluya funciones
de la librería TivaES, lo haremos con Step Over (F10). Al depurar así esta sentencia el simulador realiza,
o intenta realizar, todas las acciones necesarias hasta salir de la función. Sin embargo, el diseño de esta
función es tal que solo se saldrá cuando se haya completado la formación del número según las reglas de
adquisición de la función (ver figura 9).
Entonces, para que esto suceda, deberá realizarse dicho procedimiento utilizando el simulador grafico
TExaS LaunchPadDLL.
Inicio de la depuración:
Los cursores amarillo y cian apuntan
ambos a la línea a depurar.
El simulador grafico (TExaS
LaunchPadDLL) no muestra actividad.
También se puede ver el valor de los
registros del puerto F (DATA, DIR, DEN,
PUR).
Variables locales con valor desconocido.
De la misma manera continuamos la depuración para las siguientes dos variables: nota2 y nota3.
La figura 17 muestra la captura de pantalla justo después de ejecutar Step Into (F11) en la depuración de
la variable notaMenor. Puede notarse que ambos cursores se trasladan a la definición de la función
numMenor3, además las variables nota1, nota2 y nota3 quedan con los valores ingresados con los
pulsadores: 12, 3 y 10 respectivamente.
Fig. 18 Resultado final de la depuración. La variable promedio queda con valor 12 y la variable notaMenor con valor 3. El led
RGB deberá parpadear 12 veces en color blanco.
Conecte la tarjeta Tiva LauchPad a su computador. En la pestaña Debug, seleccionamos Use Simulator.
Verifique que el panel de configuración de la derecha correspondiente al hardware de depuración del
microcontralador cumpla con las especificaciones entregadas en la Guía_Lab01_2022_2.pdf (pag12).
Acto seguido iniciamos la depuración mediante la opción Debug->Start/Stop Debug sesión, o mediante
el icono asociado .
Como usted ya tiene un programa que ha logrado ejecutar exitosamente en la simulación, haga clic en
Run (F5). Proceda a ingresar los números con los pulsadores (acceda a los registros asociados al
módulo de entrada salida GPIO puerto F, al visualizador de variables del programa y memoria del
microcontrolador) y observe en el led RGB el resultado esperado.
Fig. 20 Depuración de la función TivaES_SolicitaNumero con el comando Step Over (F10) en la tarjeta de evaluación Tiva
Launchpad. Una vez ejecutado el comando (F10) se procede a la ejecución de la función. En la foto, cada vez que se ingresan
las decenas del número se prende el led RGB en color azul.
Ejemplo 2. Alternar el color del led RGB (rojo, verde y azul) cada vez que se presione y
suelte tres veces el pulsador SW2.
Desarrollar un programa para el TM4C123GH6PM tal que al inicio el led tricolor RGB esté prendido en
color ROJO, se esperen tres pulsos de SW2 para pasar a color AZUL y se esperen tres pulsos más del
mismo pulsador para pasar al color VERDE. El funcionamiento es cíclico.
Hacer uso de las funciones de la librería TivaES.
Diagrama de flujo
Fig. 21 Diagrama de Flujo del ejemplo 2: Alternar el color del led RGB con tres pulsos de SW2
Pseudocódigo
Algoritmo AlternarColorLedRGB_con_SW2
Constantes
ROJO
AZUL
VERDE
SW2
Variables
Entero: color, pulsos
Inicio
ConfigurarPuerto()
color Rojo
Mientras(Verdadero)
PrenderLed(color)
pulsos 0
Mientras (pulsos <= 3)
EsperaPulsarSoltarPulsador(SW2)
pulsos pulsos + 1
FinMientras
Codificación
/****************************************************************************************/
/****************************************************************************************/
/***** PONTIFICIA UNIVERSIDAD CATÓLICA DEL PERÚ *****/
/***** FACULTAD DE CIENCIAS E INGENIERÍA *****/
/***** SISTEMAS DIGITALES *****/
/****************************************************************************************/
/***** Tema: Programación de puertos de E/S con TivaES *****/
/***** Proyecto: Lab2_ejemplo2 *****/
/****************************************************************************************/
/***** Microcontrolador: TM4C123GH6PM *****/
/***** EvalBoard: Tiva C Series TM4C123G LaunchPad *****/
/***** Autor: Rolando Sánchez Ponce *****/
/***** Fecha: Marzo 2019 *****/
/****************************************************************************************/
/***** Enunciado: *****/
/***** El led RGB toma los colores rojo, azul y verde alternadamente, para cambiar *****/
/***** de color se debe presionar tres veces el pulsador SW2. *****/
/****************************************************************************************/
/****************************************************************************************/
#include <stdint.h>
#include "tm4c123gh6pm.h"
#include "TivaES.h"
int main(void) {
uint8_t pulsos, color;
TivaES_Inicializa();
color = ROJO;
while(1){
/****************************************************************************************/
/***** F I N D E L P R O G R A M A *****/
/****************************************************************************************/
Fig. 22 Código del ejemplo 2: Alternar el color del led RGB con tres pulsos de SW2
Como en el ejemplo anterior podemos depurar el proyecto mediante la opción Step Over (F10) y ver en el
simulador gráfico (TExaS LaunchPadDLL) los cambios que produce la ejecución de cada sentencia de
nuestro programa.
Para este ejemplo usemos la opción de depuración Run (F5) para depurar el proyecto.
La figura 23 muestra los resultados de la depuración del ejemplo Lab2_ejemplo2. Debido a la naturaleza
de la aplicación nos conviene usar la opción Run (F5) para mostrar el funcionamiento completo del
ejemplo. Esta opción no nos permite depurar las variables intermedias en la programación, entonces, la
interacción con el simulador gráfico TExaS LaunchPadDLL es lo más apropiado.
Desarrollar un programa para el TM4C123GH6PM tal que cuando el usuario pulse SW1 se inicie el cálculo
de un número aleatorio mayor o igual que 0 y menor o igual que 7. El cálculo termina cuando se suelta
SW1. Además, cuando el usuario pulse SW2 se muestre ese número en el led RGB.
Hacer uso de las funciones de la librería TivaES. No hacer uso de la librería matemática o ninguna otra
para el cálculo del número aleatorio.
Diagrama de flujo
INICIO
INICIO
InicializaPuerto( )
aleatorio 0
SI
aleatorio aleatorio+1
SI NO
aleatorio 0
¿Presiona y Suelta NO
SW2?
SI
LedColor(aleatorio)
Fig. 24 Diagrama de Flujo del ejemplo 3: Alternar el color del led RGB con SW1
Pseudocódigo
Algoritmo CalcularNumeroAleatorio_con_SW1_mostrar_con_SW2
Constantes
SW1
SW2
NIVEL_BAJO
Variables
Entero: color, aleatorio
Inicio
ConfigurarPuerto()
aleatorio 0
Mientras(Verdadero)
EsperaPulsadorPresionado(SW1)
Hacer
aleatorio aleatorio + 1
Si (aleatorio = 8) entonces
Aleatorio 0
FinSi
Mientras (LeerPulsador(SW1) = NIVEL_BAJO)
EsperaPulsarSoltarPulsador (SW2)
color aleatorio << 1
PrenderLed(color)
FinMientras
FinAlgoritmo
Codificación
La generación del número aleatorio se realiza incrementando en uno la variable aleatorio indefinidamente
mientras el usuario mantenga pulsado SW1, y acotándolo entre 0 y 7 inclusive. Cuando se suelta SW1 se
da por generado el número aleatorio y es el que se muestra en el led RGB.
Nótese que hemos utilizado tres diferentes funciones para el manejo de los pulsadores:
…………………………………………………………………………………………………………………………
…………………………………………………………………………………………………………………………
…………………………………………………………………………………………………………………………
/****************************************************************************************/
/****************************************************************************************/
/***** PONTIFICIA UNIVERSIDAD CATÓLICA DEL PERÚ *****/
/***** FACULTAD DE CIENCIAS E INGENIERÍA *****/
/***** SISTEMAS DIGITALES *****/
/****************************************************************************************/
/***** Tema: Programación de puertos de E/S con TivaES *****/
/***** Proyecto: Lab2_ejemplo3 *****/
/****************************************************************************************/
/***** Microcontrolador: TM4C123GH6PM *****/
/***** EvalBoard: Tiva C Series TM4C123G LaunchPad *****/
/***** Autor: Rodia Santivañez Santivañez *****/
/***** Fecha: Abril 2020 *****/
/****************************************************************************************/
/***** Enunciado: *****/
/***** Cuando se presiona SW1 se calcula un numero aleatorio entre 0 y 7 inclusive *****/
/***** Cuando se presiona SW2 se muestra el numero en el led RGB *****/
/****************************************************************************************/
/****************************************************************************************/
#include <stdint.h>
#include "tm4c123gh6pm.h"
#include "TivaES.h"
int main(void) {
uint8_t color, aleatorio = 0;
TivaES_Inicializa();
while(1){
TivaES_EsperaPresionarPulsador(SW1);
do
{
aleatorio++;
if(aleatorio == 8) aleatorio = 0;
}while(TivaES_LeePulsador(SW1) == LOW);
TivaES_EsperaPulsador(SW2);
color = aleatorio<<1;
TivaES_LedColor(color);
}
}
/****************************************************************************************/
/***** F I N D E L P R O G R A M A *****/
/****************************************************************************************/
Fig. 25 Código del ejemplo 3: Alternar el color del led RGB con SW1
Cuestionario
• ¿Por qué es necesaria la sentencia color = aleatorio<<1; en la línea 40 y que es lo que realiza
exactamente?
• ¿Por qué el led enciende de color amarillo?
• Complete la tabla de correspondencia entre el valor aleatorio generado y el color que deberá
prenderse el led RGB.
Problemas propuestos
Los siguientes problemas propuestos se implementan para el microcontrolador TM4C123GH6PM.
Tarjeta de evaluación: EK-TM4C123GXL
se pide:
• Diagrama de flujo
• Código en lenguaje C, debidamente comentado
• Simulación del programa
1. Se ingresa tres números a través de los pulsadores SW1 y SW2, para formar los lados de un
triángulo. Si el triángulo es escaleno, se enciende el led verde. Si es isósceles se enciende el led
rojo y si el triángulo es equilátero se enciende el led VERDE. Si el triángulo no existe se prende el
led de color blanco. Escriba el programa que cumpla con las condiciones dadas.
3. La tarjeta de evaluación EK-TM4C123GXL cuenta con dos pulsadores (SW1 y SW2) y tres diodos
leds (rojo, verde y azul). Implemente un programa que permita realizar las siguientes tareas:
Al presionar y soltar “n” veces el pulsador SW1 se muestra “n-1” parpadeos de color amarillo y “n”
parpadeos de color magenta luego se repite la secuencia en forma cíclica. Al inicio los leds están
apagados y el pulsador sin presionar.
Al presionar y soltar “n” veces el pulsador SW2 se muestra “n” parpadeos de color azul y “n+1”
parpadeos de color blanco, luego se repite la secuencia en forma cíclica. (El programa
implementado debe ser el mismo para cualquier valor de n, solo deberá modificar el valor de una
variable o una constante. Para las pruebas considere n=5).
4. Desarrolle la función:
Toma como entrada un número de tres dígitos (entre 0, y 999) calcula la suma de los tres dígitos
que conforman el número y los muestra mediante parpadeos del color indicado.
Ejemplo:
5. Desarrollar un programa que solicite el ingreso de tres números en base 10 de tres dígitos y muestre
la suma de los dígitos del mayor de ellos mediante parpadeos azules, seguidamente muestre la
suma de los dígitos del número intermedio en parpadeos CIAN y finalmente la suma de los dígitos
del menor de ellos en verde.
6. Escribir un programa que permita leer tres números de 2 cifras y realizar operaciones entre ellos.
Para ingresar los números y visualizarlos se utilizan los pulsadores SW1 y SW2 y el diodo led RGB
Los requerimientos del programa son:
2) Al accionar el pulsador SW2, se debe mostrar un número aleatorio entre 3 y 9 (se incluye
3 y 9) con pulsos de color blanco.
7. Un circuito basado en el módulo EK-TM4C123GXL cuenta con dos pulsadores y tres diodos leds
(led RGB). Escriba un programa que controle una cuenta de tres bits y su visualización es como
sigue:
1. Inicialmente, la cuenta está en CERO (leds apagados).
2. Al presionar y soltar el pulsador 1 (SW1), la cuenta aumenta en 1, al llegar a su valor máximo
igual a 7, comienza otra vez desde 1 y se repite cíclicamente por cada pulsada.
3. Al presionar y soltar el pulsador 2 (SW2), la cuenta disminuye en 1 y al llegar a su valor mínimo
que es 1, la cuenta se reinicia desde 7 y se repite cíclicamente.
La cuenta es presentada como una secuencia de pulsos de color azul; la cantidad de pulsos
mostrada por el led corresponde al valor de la cuenta.
Clave incorrecta:
En caso se ingrese una clave incorrecta se encenderá el led rojo y se volverá a pedir
el ingreso de una clave. Sólo se permitirán 3 intentos. Si los 3 intentos son errados el
led rojo comenzará a parpadear indefinidamente indicando un estado de alarma y no
se permitirá volver a ingresar una contraseña.
Clave correcta:
Si la clave fue correcta se mostrará el led verde por un tiempo y se volverá a bloquear
el sistema.
Referencias Bibliográficas:
• Valvano, Jonathan W. 2014
Embedded systems: real-time interfacing to ARM¿ Cortex?-M microcontrollers
San Bernardino: s.e., 2014.
• Texas Instruments.
Tiva TM4C123GH6PM Microcontroller Datasheet
• Guías de laboratorio del curso de Sistemas Digitales 2020-1. PUCP
Autores
Material del Laboratorio 02 del curso de Sistemas Digitales, elaborado por:
Ing. Rodia Santivañez rsantivanez@pucp.pe
Ing. Zenón Cucho zcucho@pucp.pe