Práctica 8 Lab. Micros

Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 7

Manual de Prácticas

Microprocesadores
División: Ingeniería Departamento: Ingeniería Electrónica
Eléctrica

Puertos de entrada/salida (2)


N° de práctica: 8

Nombre completo del alumno Firma

Pérez Ortiz Román

N.° de brigada: Fecha de elaboración: 12/05/2020 Grupo:


Manual de Prácticas
Microprocesadores
División: Ingeniería Departamento: Ingeniería Electrónica
Eléctrica

1. Seguridad en la Ejecución

Peligro o fuente de energía Riesgo asociado

1 Manejo de Corriente Alterna Electrochoque

2 Manejo de corriente Continua Daño al equipo

2. Objetivos de aprendizaje.

El alumno programará los Puertos de Entrada/Salida del procesador ARM M4 en lenguaje C, para
emplearlos como puertos digitales de Propósito General, e implementará la conexión de hardware
externo al microcontrolador tomando en cuenta los parámetros eléctricos nominales de las
terminales.

Material y equipo.

- Hoja de datos del microcontrolador TM4C1294NCPDT.


- Guía mínima, Worksheet Impresa.
- Sistema de desarrollo.
- Cable BNC y Osciloscopio.
- Leds, Switches N.O. y resistencias de 330Ohms a 1kOhm, alambre AWG22.

3. Actividad de investigación.

a. ¿Para qué sirve la directiva #define?

La directiva #define especifica un nombre que será reemplazado por un cierto valor en todos los
lugares del programa donde se haga referencia. Se crean fuera de cualquier función o clase
normalmente en la parte inicial del archivo.
b. ¿Qué es una variable global y una local?

Variable global: Son todas las funciones que componen el programa, cualquier función puede
acceder a dichas variables para leer y escribir en ella. Es decir, se puede hacer referencia a su
dirección de memoria en cualquier parte del programa.

Variable local: Sólo pueden accederse desde la función o bloque de instrucciones en donde se
declaran. Las variables locales se contraponen a las variables globales.

c. ¿Cómo se hace referencia a una dirección de un registro en lenguaje C empleando la


directiva #define?

Se coloca la directiva #define seguido de la dirección del registro que se quiere utilizar,
por ejemplo: ​#define SYSCTL_PRGPIO_R

d. Describa el modo de funcionamiento de bits direccionables (o direccionamiento de bits


específico) en un puerto GPIO.

La memoria direccionable como bit y como byte está formada por las 16 posiciones de
RAM interna. Es importante tener en cuenta que la Memoria Bit es realmente parte de la
RAM Interna. Las 128 variables bit ocupan los 16 bytes de RAM Interna.

El direccionamiento de bit es un mecanismo de acceso a bits específicos, ya sea de una


determinada posición de memoria o de un registro en particular.
Este tipo de direccionamiento sólo nos indicará si determinado bit de una posición de
memoria es 1 ó 0. Recuérdese que para realizar este tipo de consultas se puede utilizar un
mecanismo basado en máscaras.

- En los programas, main.c y main2.c complete los valores de configuración faltantes


(marcados como (a), (b), etc… ) considerando para el procesador empleado TM4C1294.
Tome en cuenta los operadores lógicos en C : ^= , |= , &= .

main.c
#define GPIO_PORTF_DATA_BITS_R 0x4005D000
#define GPIO_PORTF_DIR_R (*(volatile unsigned int *)0x4005D400)
#define GPIO_PORTF_DEN_R (*(volatile unsigned int *)0x4005D51C)
#define SYSCTL_RCGCGPIO_R (*(volatile unsigned int *)0x400FE608)
#define SYSCTL_PRGPIO_R (*(volatile unsigned int *)0x400FEA08)
#define PORTbit4 0x40
#define PORTbit0 0x04
#define PORTFbits (GPIO_PORTF_DATA_BITS_R|PORTbit4|PORTbit0)
#define PF40 (*(volatile unsigned int *)PORTFbits) //#define PF21 (*
(volatile uint32)0x4005D044)
int tiempo;

void main(void){
// Habilita reloj en Puerto F
SYSCTL_RCGCGPIO_R |= ​0x20 ​;
// Espera a que esté listo el puerto
while((SYSCTL_PRGPIO_R & 0x20)==0);
// Bits 4 y 1 del PTO F como salidas, los demas bits entradas
GPIO_PORTF_DIR_R |=​ 0x12​;
// Habilita el modo Digital de los pines 4 y 1
GPIO_PORTF_DEN_R |= ​0x12​ ;
// valor inicial de los pines (hay Leds conectados en la
tarjeta)
PF40 = 0x01; // PF4 = 0, PF0 = 1
while(1) {
PF40 ^= 0x10; // cambia el estado lógico de
los pines 4 y 1
tiempo 1325;
}
}

main2.c
#define GPIO_PORTF_DATA_BITS_R 0x4005D000
#define GPIO_PORTF_DIR_R (*(volatile unsigned int *)0x4005D400)
#define GPIO_PORTF_DEN_R (*(volatile unsigned int *)0x4005D51C)
#define SYSCTL_RCGCGPIO_R (*(volatile unsigned int *)0x400FE608)
#define SYSCTL_PRGPIO_R (*(volatile unsigned int *)0x400FEA08)
#define PORTbit4 0x40
#define PORTbit0 0x04
#define PORTFbits (GPIO_PORTF_DATA_BITS_R|PORTbit4|PORTbit0)
#define PF40 (*(volatile unsigned int *)PORTFbits) //#define PF21 (*(volatile
uint32)0x4005D044)

#define GPIO_PORTJ_DATA_BITS_R 0x40060000


#define GPIO_PORTJ_DIR_R (*(volatile unsigned int *)0x40060400)
#define GPIO_PORTJ_DEN_R (*(volatile unsigned int *)0x4006051C)
#define GPIO_PORTJ_PUR_R (*(volatile unsigned int *)0x40060510)
#define PJ0 (*(volatile unsigned int
*)(GPIO_PORTJ_DATA_BITS_R|PORTbit0))

void main(void){
// Habilita reloj en Puerto F y J
SYSCTL_RCGCGPIO_R |=​ 0x220​ ;

// Espera a que esté listo el puerto


while((SYSCTL_PRGPIO_R & 0x120)==0);

// Bits 4 y 1 del PTO F como salidas, los demas bits entradas


GPIO_PORTF_DIR_R |= ​0x12​ ;

// Habilita el modo Digital de los pines 4 y 1 Puerto F


GPIO_PORTF_DEN_R |=​ 0x12​ ;
// Bit PJ0 como entrada, Habilita resistencia de Pull-up PJ0
GPIO_PORTJ_DIR_R |= ​ 0x01 ​ ;
GPIO_PORTJ_PUR_R |= ​0x01​ ;

// Habilita Modo digital PJ0


GPIO_PORTJ_DEN_R |= ​0x01​ ;
// valor inicial de los pines (hay Leds conectados en la tarjeta)
PF40 = 0x01; // PF4 = 0, PF0 = 1

while(1){
if(!PJ0) {
//while (!PJ0);
PF40 ^= ​0x10​ ; // cambiar el estado lógico de los pines 4 y 1
}
}

5. Escriba el código para implementar un retardo de aproximadamente 1 segundo y


agregarlo entre cada cambio de estado del LED(2).

#include “tm4c1294ncpdt.h”
#include <stdint.h>
int tiempo;

int main(void) //inicio de la funcion


{
SYSCTL_RCGCGPIO_R = 0X280; // activa puerto H y K
// configuración de puerto H como salida
GPIO_PORTH_AHB_DIR_R = 0X03;
GPIO_PORTH_AHB_DEN_R = 0X03;

//configuracion de puerto K como entrada en K5


GPIO_PORTK_DIR_R = 0X00;
GPIO_PORTK_DEN_R = 0XA0;

while(1) // ciclo continuo


{
if(GPIO_PORTK_DATA_R ==0x20) //compara el dato leido
GPIO_PORTH_AHB_DATA_R = 0x01; // manda encendido de led
tiempo = 1000;

else if(GPIO_PORTK_DATA_R == 0x80) // comparacion


GPIO_PORTH_AHB_DATA_R = 0x02; //enciende el led
tiempo = 1000;
else if(GPIO_PORTK_DATA_R == 0x00) // comparacion
GPIO_PORTH_AHB_DATA_R = 0x00; //no enciende ningun led
tiempo = 1000;

} // fin del ciclo


return 0;
}

6. Desarrollo.
Implemente una rutina de inicialización para las terminales PH0 y PH1 como de salida digital y
las terminales PK5 y PK7 como de entrada digital. Identifique las terminales. Conecte en las
terminales de salida un Led en cada una empleando una resistencia limitadora de corriente. Su
activación se hará con lógica positiva. Conecte en las terminales de entrada un Switch en cada
una alambrados con lógica positiva.
Implemente un ciclo continuo para leer el estado de los switches y reflejarlo en los Leds de
acuerdo a la siguiente tabla:
Determine si es necesario configurar el registro de resistencias de Pull-up o Pull-down. Declare
en el archivo fuente, los nombres de los registros empleados y sus direcciones empleando la
directiva #define. Consulte el archivo tm4c1294ncpdt.h

Código
7. Cuestionario.
Sea el registro GPIO_PORTA_DATA_R un registro definido en lenguaje C conteniendo el dato
0x92. ¿qué operación realiza las siguientes sentencias en lenguaje C? Especifique el resultado en
formato binario y hexadecimal.
Explique qué función realiza cada sentencia según la “máscara” (valor del lado derecho del
signo “igual”).

GPIO_PORTA_DATA_R ^= 0x01
LDR R1,=GPIO_PORTA_DATA_R
LDR R0, [R1]; anterior
EOR R0; R0, #0x01 ; establecer el bit 1
Resultado: Hex = 0x93; Bin = 10010011

GPIO_PORTA_DATA_R |= 0x01: Eleva el PA


LDR R1,=GPIO_PORTA_DATA_R
LDR R0, [R1]; anterior
ORR R0; R0, #0x01 ; establecer el bit 1
Resultado: Hex = 93; Bin = 10010011

GPIO_PORTA_DATA_R &= 0x10


LDR R1,=GPIO_PORTA_DATA_R
LDR R0, [R1]; anterior
AND R0; R0, #0x01 ; establecer el bit 1
Resultado: Hex = 0; Bin = 0

GPIO_PORTA_DATA_R &= (~0x10); Baja el PA


LDR R1,=GPIO_PORTA_DATA_R
LDR R0, [R1]; anterior
BIC R0; R0, #0x01 ; bit claro 1
Resultado: Hex =; Bin =

8. Conclusiones.

Para esta práctica se programaron los Puertos de Entrada/Salida K y J del procesador ARM M4
en lenguaje C, para emplearlos como puertos digitales de Propósito General, de esta forma se dan
por cumplidos los objetivos de la práctica.

9. Bibliografía.

ARM Assembly Language Tools v15.12.0.LTS - User's Guide. Literature Number: SPNU118O
January 2016. Disponible en
http://downloads.ti.com/docs/esd/SPNU118/index.html

También podría gustarte