Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Laboratorio 4
Programación del UART (Universal Asynchronous Receiver\Transmitters)
Programación del temporizador del sistema (SysTick timer)
I. OBJETIVO
Comprender el funcionamiento del temporizador del sistema y del dispositivo de comunicación
serial que dispone el microcontrolador TM4C123GH6PM.
Programar correctamente utilizando sus registros de configuración que presentan ambos periféricos.
Una característica importante de todos los microcontroladores es la comunicación serial con otros
dispositivos. Se estudiará en el Laboratorio la programación del módulo serial UART del
microcontrolador TM4C123GH6PM.
Trama de una comunicación serial del UART, es programable:
Ejemplo:
Si el Reloj de UART fuese 8 Mhz entonces:
BRDI(Parte entera) + BRDF(Parte Fraccional) = 52.083333
La parte entera será BRDI = 52
La parte Fraccional es: 0.08333 y debe extraerse la parte entera de la siguiente operación INT(Fracc*64 + 0.5)
La parte Fraccional quedaría: BRDF = INT(5.83) = 5
Donde:
COUNT ENABLE
0; La cuenta no ha llegado a 0 0:SysTick desactivado
1: La cuenta ha llegado a 0 1: Systick activado
Secuencia de configuración
1. Desactivar el SysTick (ENABLE=0)
NVIC_ST_CTRL_R &= ~NVIC_ST_CTRL_ENABLE;
2. Programar valor de recarga (STRELOAD)
NVIC_ST_RELOAD_R
Considere:
TTEMP=TCLK_SYST(RELOAD + 1)
Si FSYS_CLK = 8 Mhz para temporizar cada 0.5 seg RELOAD = 3999999 =0X3D08FF
<NVIC_ST_RELOAD_R |= 0x3D08FF;
3. Borrar valor actual (STCURRENT)
Escribir cualquier valor en NVIC_ST_CURRENT_R
4. Configurar SysTick (STCTRL)
El Hyperterminal
Para conectar el módulo TIVA con el puerto serial de la PC, se emplea un software de comunicación
serial, en este caso el Hyperterminal. La computadora personal solo servirá como un terminal, el CPU que
procesa el programa es la que corresponde al del microcontrolador TIVA y no al de la PC.
Pasos a seguir:
1. Ejecute el Hyperterminal, y abrir una nueva Conexión le pedirá un nombre de sesión, por ejemplo
escriba Tiva_serial, como se observa en la Figura 1.
Figura 1
2. Luego seleccione el puerto serial activo, en la Figura 2, se ha seleccionado el puerto de
comunicaciones COM42 de la PC, el cual está conectado al puerto serial del módulo LaunchPad
TIVA (Puede ser también otro dirección del Puerto diferente a COM42, revise en Administrador de
dispositivos/Puertos )
Figura 3
Figura 2
3. Luego, ingrese los parámetros de transmisión serial, por ejemplo como se muestra en la Figura 3 con
los siguientes datos:
PUTTY
Es otra aplicación portable que nos permite conectarnos entre dos computadoras, en este caso el Módulo
TIVA y la PC. Es gratuito y de código abierto de interfaz sencilla y manejable.
Crea una sesión de nombre Serial_Tiva, seleccione en Connection la pestaña Serial e ingrese los
parámetros de Transmisión serial del UART del TIVA y la PC, como se observa en las siguientes figuras.
Luego, presione Open para ingresar a la pantalla virtual donde se mostrarán nuestros resultados del
programa en ejecución.
Figura 4 Figura 5
ADMINISTRADOR DE DISPOSITIVOS
Estando conectado la tarjeta TIVA LaunchPad con la PC, para ver el puerto serial activo, ingrese a
Admistrador de dispositivos y presione la pestaña Puertos. En la siguiente Figura se observa que el
puerto activo es COM34.
Programa 1
Ejemplo con el UART0
Se utiliza el UART0 para realizar el programa ECO que significa que el microcontrolador ha recibido un
dato de la PC por su puerto serial (bit a bit) y lo transmite serialmente por el mismo puerto.
Ejemplo: Si se presiona la Tecla “H”, el microcontrolador recibe este carácter por su puerto serial, luego
lo retransmite, observando este carácter en la pantalla virtual de la PC denominado Hyperterminal.
(También se puede usar Putty).
Diagrama de Flujo
/***************************************************************************/
/***** Proyecto: Prog01_UART_ECO *****/
/***************************************************************************/
/***** Microcontrolador: TM4C123GH6PM *****/
/***** EvalBoard: Tiva C Series TM4C123G LaunchPad *****/
/***** Autor: Rolando Sánchez Ponce *****/
/***** Fecha: Mayo 2016 *****/
//***** Enunciado: *****/
/***** Se utiliza el UART0 para realizar ECO: dato recibido por el *****/
/***** puerto serial lo transmite por el mismo puerto. *****/
/***************************************************************************/
#include <stdint.h>
#include "tm4c123gh6pm.h"
void ConfiguraUART0(void){
// Habilitamos reloj para el UART0
SYSCTL_RCGC1_R |= SYSCTL_RCGC1_UART0;
// Habilitamos reloj para GPIOA
SYSCTL_RCGC2_R |= SYSCTL_RCGC2_GPIOA;
// Inhabilitamos el UART0
UART0_CTL_R &= ~UART_CTL_UARTEN;
// Velocidad 9600bps (Fsysclk = 16MHz)
UART0_IBRD_R = (UART0_IBRD_R & 0xFFFF0000) | 104;
UART0_FBRD_R = (UART0_FBRD_R & 0xFFFFFFC0) | 11;
// 8, N, 1, FIFOs habilitados
UART0_LCRH_R = (UART0_LCRH_R & 0xFFFFFF00) | 0x70;
// Habilitamos el UART0
UART0_CTL_R |= UART_CTL_UARTEN;
// Desactivamos modo analógico en PA0 y PA1
GPIO_PORTA_AMSEL_R &= ~(0x03);
// Conectamos UART0 a PA0 y PA1
GPIO_PORTA_PCTL_R = (GPIO_PORTA_PCTL_R&0xFFFFFF00)|0x00000011;
// Activamos funciones alternas en PA0 y PA1
GPIO_PORTA_AFSEL_R |= 0x03;
// Activamos funciones digitales en PA0 y PA1
GPIO_PORTA_DEN_R |= 0x03;
}
int main(void){
unsigned char datoRx;
ConfiguraUART0();
while(1){
// Esperamos mientras Buffer Rx esté vacío
while(UART0_FR_R & UART_FR_RXFE);
// Se lee el dato recibido
datoRx = UART0_DR_R;
// Esperamos mientras Buffer Tx esté lleno
while(UART0_FR_R & UART_FR_TXFF);
// Se escribe el dato para su transmisión
UART0_DR_R = datoRx;
} //Fin de while
} // Fin de main
Resultado
Programa 2
Ejemplo con el UART0 para adivinar una palabra oculta grabada en memoria
Implemente un sistema basado en el microcontrolador TM4C123GH6PM que, conectado por su puerto
serial a una computadora personal en la cual se ejecuta el programa HyperTerminal, cumpla con realizar
la siguiente aplicación:
El programa debe permitir recibir caracteres ingresados por el teclado, para comparar con una palabra
oculta grabada en su memoria. Al inicio, la palabra debe ser mostrada en pantalla virtual como asteriscos
para luego ser reemplazados con cada carácter acertado.
Parámetros UART: 9600bps, 8 bits de datos 1 bit de parada, sin paridad, habilitación del FIFO.
Diagrama de flujo
INICIO
Configuración de UART
Transmitir texto
¿aciertos < longitud de palabra[]?
No “Palabra correcta”
Sí
Recibir carácter
Sí No
aciertos ß aciertos + 1
Transmitir oculta[]
/* Proyecto: Palabra_Oculta
* Autor: Ing. Fedra Trujillano
* Semestre: 2016-1
* Descripcion:
* El programa recibe los caracteres ingresados por el teclado e
* identifica si pertenecen a una palabra oculta. Al inicio la
* palabra se muestra en pantalla como asteriscos y se reemplazan
* por el caracter correspondiente una vez acertado.
* Parámetros UART: 9600bps, 8 bits dedatos 1 bit de parada,
* sin paridad, habilitacióndel FIFO.
*/
#include"tm4c123gh6pm.h"
#include"stdint.h"
SYSCTL_RCGC1_R |= SYSCTL_RCGC1_UART0;
// Se activa el reloj del UART
temp = SYSCTL_RCGC2_R; // Espera de unos ciclos de reloj
SYSCTL_RCGC2_R |= SYSCTL_RCGC2_GPIOA;
// Se activa el reloj del puerto A
// PA0 (U0Rx) PA1( U0Tx)
temp = SYSCTL_RCGC2_R; // Espera de unos ciclos de reloj
UART0_CTL_R &= ~ UART_CTL_UARTEN; // Se desactiva el UART
UART0_IBRD_R = (UART0_IBRD_R & ~UART_IBRD_DIVINT_M)|104; // Se configura DIVINT
// 16MHz/(16*9600)
// Parte entera
UART0_FBRD_R = (UART0_FBRD_R & ~UART_FBRD_DIVFRAC_M)|10; //Se configura DIVFRAC
//Parte fraccionaria*64
UART0_LCRH_R = ((UART0_LCRH_R & ~0x000000FF)|(UART_LCRH_WLEN_8)|(UART_LCRH_FEN));
// Se configuran los bits de datos, 1 bit de parada, sin paridad y habilita el FIFO
UART0_CTL_R |= UART_CTL_UARTEN; // Se habilita el UART
GPIO_PORTA_AFSEL_R |= 0x03; // Se activan las funciones alternas de PA0 y
PA1.
GPIO_PORTA_DEN_R |= 0x03; // Habilitación PA0 y PA1 para señales
digitales.
}
/*Función para la transmisión de un caracter*/
void txcar_uart0(uint32_t car){
uint8_t temp;
return temp;
}
void main(void){
/*Mensajes a utilizar*/
uint8_t mInicio[]= "Ingrese letra\n\r";
uint8_t mFin[]= "Palabra correcta\n\r";
uint8_t oculta[]= "************\n\n\r"; // Arreglo para guardar las letras
acertadas
uint8_t palabra[]= "TivaLauchpad";
uint8_t aciertos=0; // Contador de aciertos
uint8_t letra, i;
uint8_t longPalabra;
letra= rxcar_uart0();
if ((letra == palabra[i])&&(oculta[i]=='*')){
oculta[i]= letra;
aciertos++;
} // Se reemplazan los asteriscos por la letra correspondiente
} // y se incrementa el número de aciertos siempre que no hayan
// sido previamente reemplazados
txmens_uart0(oculta);
}
while (1);
}
Resultado
Se observa los resultados obtenidos, luego de ejecutar el programa con la aplicación hyperterminal.
Diagrama de flujo:
Inicio
Configuración puertos,
configuración Systick
incrementar ß 0
Sí
¿Llegó a 0 el Conmutar Led
temporizador?
No Sí
¿incrementar =
No 0?
¿Se presionó y
soltó SW1?
Sí cuenta ß cuenta +1
incrementar ß incrementar +1
No
¿cuenta>=5?
Sí
cuenta ß 0
temporizador ß tiempo[cuenta]
incrementar ß 0
/* Proyecto: Temporizador
* Autor: Ing. Fedra Trujillano
* Semestre: 2016-1
* Descripción:
* El programa hace parpadear el led D1 del módulo Tiva Launchpad con distintos
* Periodos que son variados de manera cíclica al presionar y soltar el pulsador SW1.
* Los periodos son los siguientes:
* 0.5seg, 0.25seg, 0.125seg, 0.0625seg y 0.03125seg.
*/
#include "tm4c123gh6pm.h"
#include "stdint.h"
void config_pulsador_led(void) {
unsigned long temp;
int main(void) {
uint32_t temp;
uint8_t cuenta = 0;
uint8_t SwNoPresionado = 1; // Bandera que ayuda a determinar si
// el pulsador ya ha sido presionado
uint8_t incrementa = 0;
config_pulsador_led();
configSystick(cuenta); // Inicia con el parpadeo en 0.5 seg
while (1) {
// Se espera que la cuenta del Systick llegue a cero y se sondea
// durante la espera el pulsador SW1.
if (SwNoPresionado == 0) {
if (incrementa == 1) {
cuenta += 1;
if (cuenta == 5) {
cuenta = 0;
}
}
}
Programa 4
Ejemplo con el Systick Timer y UART
Desarrolle un programa, en base a la tarjeta de desarrollo Tiva Launchpad, que genere una cuenta
ascendente del 1 al 9 de forma continua, la cuenta se incrementará en intervalos de 0.5 seg; esta cuenta se
podrá visualizar en un emulador terminal por comunicación serial (Hyperterminal o PuTTY). Con el
pulsador SW1 podrá detener la cuenta, y esta se reanudará cuando vuelva a presionar y soltar el mismo
pulsador, cada vez que presione y suelte el SW2 podrá reiniciar la cuenta.
Los pulsador SW2 (PF0) y SW1 (PF4) son los que se encuentran en la tarjeta Tiva.
Configuración Serial del UART: 115.2k, 8bits, 1bit de parada, sin paridad.
Diagrama de Flujo
Inicio
Configuración Uart
Configuración de Systick
Configuración de puerto F
Inicialización variables
1
S N
I=I+1 í ¿Pasó 0.1seg? o
N
N N o
¿SW1 ¿SW2
Presionado?
o Presionado?
o I>5
S S S
í í í
N N I=0
¿SW1 o ¿SW2 o Actualizar Cuenta
Soltado? Soltado?
S Txcar_Uart(Cuenta)
í Cuenta = 1
N I=0
¿SW1 o
Presionado
y Soltado?
Sí
Txcar_Uart(Cuenta)
/* Proyecto: Contador_serial
* Autor: Ing. Jhonnell Fernandez
* Semestre: 2016-1
* Descripción:
Este programa genera una cuenta del 1 al 9 en intervalos de 0.5 seg.
Se podrá visualizar mediante un emulador de terminal serial.
El pulsador SW1 detiene la cuenta y el pulsador SW2 reinicia la cuenta
Uart Conf: 115.2K, 8bits, 1 bit de parada, sin paridad */
#include "tm4c123gh6pm.h"
#include "stdint.h"
int temp;
SYSCTL_RCGC1_R |= SYSCTL_RCGC1_UART0; // Se activa UART0
temp = SYSCTL_RCGC1_R;
temp = SYSCTL_RCGC2_R;
UART0_CTL_R &= ~UART_CTL_UARTEN; // Se recomienda deshabilitar el UART para
// cambiar los parametros
void main(void)
{
unsigned long j;
uint8_t i=0;
uint8_t cuenta=1;
config_uart0();
config_systick();
Config_puertoF();
while(1)
{
// Para generar mayor maniobrabilidad con los pulsadores se configuro intervalos de
// espera de 0.1s de forma que cuando ocurran 5 veces, la cuenta se incremente en
// una unidad
while( (NVIC_ST_CTRL_R & NVIC_ST_CTRL_COUNT)== 0);
i++;
}
else if((GPIO_PORTF_DATA_R&0x01)==0) // Revisa si se presiono SW2
{
for (j=0;j>500000;j++); // Retardo
Problemas Propuestos:
1. Se tiene el microcontrolador del módulo LaunchPad Tiva conectado a una PC en la que se está
ejecutando el Hyperterminal. Desarrollar un programa que divida dos números enteros positivos. Los
parámetros de comunicación son: 4800, 8, E, 2
2. Con respecto al manejo del módulo LaunchPad Tiva conectado con el puerto serial de la
computadora personal, implementar un programa que permita mediante el pulsador SW1, al
presionar y soltarlo, mostrar en la pantalla hyperterminal una lista de ocho números aleatorios de 3
cifras (entre 100 y 999). Luego de mostrar ambas listas, el programa espera que el usuario presione
otro pulsador del módulo E/S Tiva para realizar una aplicación como se indica a continuación:
Si se presiona el pulsador SW2 se muestra la lista generada de aleatorios en orden descendente, si se
presiona SW3 o SW4 se muestra el menor y el mayor de la lista generada.
Para poder tener acceso al sistema debe ingresar una contraseña (se retransmite con asteriscos) que
es su apellido paterno en un tiempo de 5 segundos, de lo contrario indicará incorrecto.
Parámetros de Tx del UART: 4800, 8, e, 1
Conexiones:
SW1, SW2, SW3 Y SW4 conectados a PA4, PA3, PA2 y PA5 respectivamente. (Ver las conexiones
en el módulo E/S Tiva)
Ejemplo:
Guias_iee256_/2016-2/zcm/