09 - SD-Programas UART
09 - SD-Programas UART
09 - SD-Programas UART
COMUNICACIÓN ASÍNCRONA
Programas desarrollados en clase.
Los diagramas esquemáticos, diagramas de flujo y características de las funciones son los vistos en clase.
Programa 01
/***************************************************************************/
/***************************************************************************/
/***** PONTIFICIA UNIVERSIDAD CATÓLICA DEL PERÚ *****/
/***** FACULTAD DE CIENCIAS E INGENIERÍA *****/
/***** SISTEMAS DIGITALES *****/
/***** Semestre 2016 I *****/
/***************************************************************************/
/***** Tema: Comunicación Serial UART *****/
/***** Proyecto: Prog01_UART_ECO *****/
/***************************************************************************/
/***** Microcontrolador: TM4C123GH6PM *****/
/***** EvalBoard: Tiva C Series TM4C123G LaunchPad *****/
/***** Autor: Rolando Sánchez Ponce *****/
/***** Fecha: Mayo 2016 *****/
/***************************************************************************/
/***** Estado: PROBADO EN MÓDULO *****/
/***************************************************************************/
/***** 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_RCGCUART_R |= SYSCTL_RCGCUART_R0;
while(!(SYSCTL_PRUART_R & SYSCTL_PRUART_R0));
// 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, recepción y transmisión
UART0_CTL_R |= (UART_CTL_RXE | UART_CTL_TXE | UART_CTL_UARTEN);
int main(void){
uint8_t datoRx;
ConfiguraUART0();
while(1){
// Esperamos mientras Buffer Rx esté vacío
while(UART0_FR_R & UART_FR_RXFE);
// Leemos dato recibido
datoRx = UART0_DR_R;
// Esperamos mientras Buffer Tx esté lleno
while(UART0_FR_R & UART_FR_TXFF);
// Escribimos el dato para su transmisión
UART0_DR_R = datoRx;
}
}
/***************************************************************************/
/***** F I N D E L P R O G R A M A *****/
/***************************************************************************/
Programa 02
/***************************************************************************/
/***************************************************************************/
/***** PONTIFICIA UNIVERSIDAD CATÓLICA DEL PERÚ *****/
/***** FACULTAD DE CIENCIAS E INGENIERÍA *****/
/***** SISTEMAS DIGITALES *****/
/***** Semestre 2016 I *****/
/***************************************************************************/
/***** Tema: Comunicación Serial UART *****/
/***** Proyecto: Prog02_UART_EcoCadMay *****/
/***************************************************************************/
/***** Microcontrolador: TM4C123GH6PM *****/
/***** EvalBoard: Tiva C Series TM4C123G LaunchPad *****/
/***** Autor: Rolando Sánchez Ponce *****/
/***** Fecha: Mayo 2016 *****/
/***************************************************************************/
/***** Estado: PROBADO EN MÓDULO *****/
/***************************************************************************/
/***** Enunciado: *****/
/***** Mediante el UART0 se espera la recepción de una cadena de carac-*****/
/***** teres ASCII, una vez recibida se retransmite toda la cadena en *****/
/***** mayúsculas. *****/
/***************************************************************************/
/***************************************************************************/
#include <stdint.h>
#include "tm4c123gh6pm.h"
#define LF 10 // Nueva línea
#define FF 12 // Nueva página
#define CR 13 // Retorno de carro
void ConfiguraUART0(void){
// UART0 a 9600, 8, N, 1 y FIFOs habilitados
// UART0 conectado a PA0 y PA1
SYSCTL_RCGCUART_R |= SYSCTL_RCGCUART_R0;
while(!(SYSCTL_PRUART_R & SYSCTL_PRUART_R0));
UART0_CTL_R &= ~UART_CTL_UARTEN;
UART0_IBRD_R = (UART0_IBRD_R & 0xFFFF0000) | 104;
UART0_FBRD_R = (UART0_FBRD_R & 0xFFFFFFC0) | 11;
UART0_LCRH_R = (UART0_LCRH_R & 0xFFFFFF00) | 0x70;
UART0_CTL_R |= (UART_CTL_RXE | UART_CTL_TXE | UART_CTL_UARTEN);
SYSCTL_RCGCGPIO_R |= SYSCTL_RCGCGPIO_R0;
while(!(SYSCTL_PRGPIO_R & SYSCTL_PRGPIO_R0));
GPIO_PORTA_AMSEL_R &= ~(0x03);
GPIO_PORTA_PCTL_R = (GPIO_PORTA_PCTL_R&0xFFFFFF00)|0x00000011;
GPIO_PORTA_AFSEL_R |= 0x03;
GPIO_PORTA_DEN_R |= 0x03;
}
uint8_t EsperaByte(void){
uint8_t datoRx;
while(UART0_FR_R & UART_FR_RXFE);
datoRx = UART0_DR_R;
return datoRx;
}
void SiguienteLinea(void){
TransmiteByte(LF);
TransmiteByte(CR);
}
int main(void){
uint8_t MiCadena[25];
ConfiguraUART0();
while(1){
RecibeCadena(MiCadena);
SiguienteLinea();
CadMayuscula(MiCadena);
TransmiteCadena(MiCadena);
SiguienteLinea();
}
}
Programa 03
/***************************************************************************/
/***************************************************************************/
/***** PONTIFICIA UNIVERSIDAD CATÓLICA DEL PERÚ *****/
/***** FACULTAD DE CIENCIAS E INGENIERÍA *****/
/***** SISTEMAS DIGITALES *****/
/***** Semestre 2016 I *****/
/***************************************************************************/
/***** Tema: Comunicación Serial UART *****/
/***** Proyecto: Prog03_UART_SenX *****/
/***************************************************************************/
/***** Microcontrolador: TM4C123GH6PM *****/
/***** EvalBoard: Tiva C Series TM4C123G LaunchPad *****/
/***** Autor: Rolando Sánchez Ponce *****/
/***** Fecha: Mayo 2016 *****/
/***************************************************************************/
/***** Estado: PROBADO EN MÓDULO *****/
/***************************************************************************/
/***** Enunciado: *****/
/***** Se solicita el ingreso de un ángulo entre 0 y 90 grados, luego *****/
/***** se transmite el seno de dicho ángulo. *****/
/***** Se hace uso de la tabla TablaSeno. *****/
/***************************************************************************/
/***************************************************************************/
#include <stdint.h>
#include "tm4c123gh6pm.h"
#define FALSE 0
#define TRUE 1
#define LF 10 // Nueva línea
#define FF 12 // Nueva página
#define CR 13 // Retorno de carro
SYSCTL_RCGCGPIO_R |= SYSCTL_RCGCGPIO_R0;
while(!(SYSCTL_PRGPIO_R & SYSCTL_PRGPIO_R0));
GPIO_PORTA_AMSEL_R &= ~(0x03);
GPIO_PORTA_PCTL_R = (GPIO_PORTA_PCTL_R&0xFFFFFF00)|0x00000011;
GPIO_PORTA_AFSEL_R |= 0x03;
GPIO_PORTA_DEN_R |= 0x03;
}
uint8_t EsperaByte(void){
uint8_t datoRx;
while(UART0_FR_R & UART_FR_RXFE);
datoRx = UART0_DR_R;
return datoRx;
}
void SiguienteLinea(void){
TransmiteByte(LF);
TransmiteByte(CR);
}
numero=0;
pot10=1;
for(i=0; i<NumDig; i++){
numero+=ArregloDigitos[NumDig-1-i]*pot10;
pot10*=10;
}
return numero;
}
void FormaCadNum(uint8_t ArregloNum[], uint16_t numero){
uint16_t div10;
uint16_t i;
div10=10000;
for(i=1; i<=5; i++){
ArregloNum[i]=numero/div10 + '0';
numero %= div10;
div10 /= 10;
}
ArregloNum[i]=0;
ArregloNum[0]=ArregloNum[1];
ArregloNum[1]='.';
}
int main(void){
uint8_t ArregloNumero[10];
uint8_t ERROR, angulo;
uint16_t senAng;
ConfiguraUART0();
while(1){
do{
ERROR=FALSE;
TransmiteCadena(MSG_SOLICITA);
angulo = SolicitaNumeroUART(2);
if(angulo>90){
TransmiteCadena(MSG_ERROR);
SiguienteLinea();
ERROR = TRUE;
}
}while(ERROR);
senAng = SenAprox(angulo);
FormaCadNum(ArregloNumero, senAng);
TransmiteCadena(MSG_RESULTADO);
TransmiteCadena(ArregloNumero);
SiguienteLinea();
}
}
/***************************************************************************/
/***** F I N D E L P R O G R A M A *****/
/***************************************************************************/
Programa 04
/***************************************************************************/
/***************************************************************************/
/***** PONTIFICIA UNIVERSIDAD CATÓLICA DEL PERÚ *****/
/***** FACULTAD DE CIENCIAS E INGENIERÍA *****/
/***** SISTEMAS DIGITALES *****/
/***** Semestre 2016 I *****/
/***************************************************************************/
/***** Tema: Comunicación Serial UART *****/
/***** Proyecto: Prog04_UART_GPIO_Snd *****/
/***************************************************************************/
/***** Microcontrolador: TM4C123GH6PM *****/
/***** EvalBoard: Tiva C Series TM4C123G LaunchPad *****/
/***** Autor: Rolando Sánchez Ponce *****/
/***** Fecha: Mayo 2016 *****/
/***************************************************************************/
/***** Estado: PROBADO EN MÓDULO *****/
/***************************************************************************/
/***** Enunciado: *****/
/***** Se espera recibir por el puerto serial un caracter numérico (en-*****/
/***** tre '0' y '9') y se transmite una cadena de caracteres con el *****/
/***** nombre del número o una cadena con el número en romanos. *****/
/***** Se cambia el modo de transmisión al presionar el pulsador SW2. *****/
/***** El led rojo se enciende para indicar que se está en modo romano *****/
/***** y el led azul indica que se está en modo nombre. *****/
/***************************************************************************/
/***************************************************************************/
#include <stdint.h>
#include "tm4c123gh6pm.h"
#define TRUE 1
#define FALSE 0
#define SW2 0x00000001 // Conectado a PF0
#define ledROJO 0x00000002 // Conectado a PF1
#define ledAZUL 0x00000004 // Conectado a PF2
#define ledVERDE 0x00000008 // Conectado a PF3
#define SW1 0x00000010 // Conectado a PF4
#define ROJO ledROJO
#define VERDE ledVERDE
#define AZUL ledAZUL
#define MAGENTA ledROJO|ledAZUL
#define AMARILLO ledROJO|ledVERDE
#define CIAN ledAZUL|ledVERDE
#define BLANCO ledROJO|ledVERDE|ledAZUL
#define NEGRO 0
void ConfiguraPuertos(void){
SYSCTL_RCGCGPIO_R |= SYSCTL_RCGCGPIO_R5;
while(!(SYSCTL_PRGPIO_R & SYSCTL_PRGPIO_R5));
GPIO_PORTF_AMSEL_R &= ~(0x1F);
GPIO_PORTF_PCTL_R = (GPIO_PORTF_PCTL_R&0xFFF00000)|0x00000000;
GPIO_PORTF_DIR_R |= 0x0E;
GPIO_PORTF_DIR_R &= ~(0x11);
GPIO_PORTF_LOCK_R = 0x4C4F434B;
GPIO_PORTF_CR_R |= 0x01;
GPIO_PORTF_AFSEL_R &= ~(0x1F);
GPIO_PORTF_PUR_R |= 0x11;
GPIO_PORTF_DR8R_R |= 0x0E;
GPIO_PORTF_DEN_R |= 0x1F;
GPIO_PORTF_DATA_R &= ~(0x0E);
}
void ConfiguraUART0(void){
// UART0 a 9600, 8, N, 1 y FIFOs habilitados
// UART0 conectado a PA0 y PA1
SYSCTL_RCGCUART_R |= SYSCTL_RCGCUART_R0;
while(!(SYSCTL_PRUART_R & SYSCTL_PRUART_R0));
UART0_CTL_R &= ~UART_CTL_UARTEN;
UART0_IBRD_R = (UART0_IBRD_R & 0xFFFF0000) | 104;
UART0_FBRD_R = (UART0_FBRD_R & 0xFFFFFFC0) | 11;
UART0_LCRH_R = (UART0_LCRH_R & 0xFFFFFF00) | 0x70;
UART0_CTL_R |= (UART_CTL_RXE | UART_CTL_TXE | UART_CTL_UARTEN);
SYSCTL_RCGCGPIO_R |= SYSCTL_RCGCGPIO_R0;
while(!(SYSCTL_PRGPIO_R & SYSCTL_PRGPIO_R0));
GPIO_PORTA_AMSEL_R &= ~(0x03);
GPIO_PORTA_PCTL_R = (GPIO_PORTA_PCTL_R&0xFFFFFF00)|0x00000011;
GPIO_PORTA_AFSEL_R |= 0x03;
GPIO_PORTA_DEN_R |= 0x03;
}
void SiguienteLinea(void){
TransmiteByte(LF);
TransmiteByte(CR);
}
#include <stdint.h>
#include "tm4c123gh6pm.h"
#define SW2 0x00000001 // Conectado a PF0
#define ledROJO 0x00000002 // Conectado a PF1
#define ledAZUL 0x00000004 // Conectado a PF2
#define ledVERDE 0x00000008 // Conectado a PF3
#define SW1 0x00000010 // Conectado a PF4
void ConfiguraPuertos(void){
SYSCTL_RCGCGPIO_R |= SYSCTL_RCGCGPIO_R5;
while(!(SYSCTL_PRGPIO_R & SYSCTL_PRGPIO_R5));
GPIO_PORTF_AMSEL_R &= ~(0x1F);
GPIO_PORTF_PCTL_R = (GPIO_PORTF_PCTL_R&0xFFF00000)|0x00000000;
GPIO_PORTF_DIR_R |= 0x0E;
GPIO_PORTF_DIR_R &= ~(0x11);
GPIO_PORTF_LOCK_R = 0x4C4F434B;
GPIO_PORTF_CR_R |= 0x01;
GPIO_PORTF_AFSEL_R &= ~(0x1F);
GPIO_PORTF_PUR_R |= 0x11;
GPIO_PORTF_DR8R_R |= 0x0E;
GPIO_PORTF_DEN_R |= 0x1F;
GPIO_PORTF_DATA_R &= ~(0x0E);
}
void ConfiguraUART1(void){
// 9600, 8, N, 1
SYSCTL_RCGCUART_R |= SYSCTL_RCGCUART_R1;
while(!(SYSCTL_PRUART_R & SYSCTL_PRUART_R1));
UART1_CTL_R &= ~UART_CTL_UARTEN;
UART1_IBRD_R = (UART1_IBRD_R & 0xFFFF0000) | 104;
UART1_FBRD_R = (UART1_FBRD_R & 0xFFFFFFC0) | 11;
UART1_LCRH_R = (UART1_LCRH_R & 0xFFFFFF00) | 0x70;
UART1_CTL_R |= (UART_CTL_RXE | UART_CTL_TXE | UART_CTL_UARTEN);
SYSCTL_RCGCGPIO_R |= SYSCTL_RCGCGPIO_R1;
while(!(SYSCTL_PRGPIO_R & SYSCTL_PRGPIO_R1));
GPIO_PORTB_AMSEL_R &= ~(0x03);
GPIO_PORTB_PCTL_R = (GPIO_PORTB_PCTL_R&0xFFFFFF00)|0x00000011;
GPIO_PORTB_AFSEL_R |= 0x03;
GPIO_PORTB_DEN_R |= 0x03;
}
uint8_t EsperaByte(void){
uint8_t datoRx;
while(UART1_FR_R & UART_FR_RXFE);
datoRx = UART1_DR_R;
return datoRx;
}
void SiguienteLinea(void){
TransmiteByte(LF);
TransmiteByte(CR);
}
int main(void){
uint8_t datoRx, color;
ConfiguraPuertos();
ConfiguraUART1();
while(1){
datoRx = EsperaByte();
datoRx = aMayuscula(datoRx);
color = BuscaColor(datoRx);
if (color<8){
TransmiteCadena(MSG_LED);
TransmiteCadena(&TextoColor[color][1]);
SiguienteLinea();
colorLED(color*2);
}
else TransmiteCadena(MSG_ERROR);
}
}