Diferencia entre revisiones de «C6 - Microcontroller Ports»
Ir a la navegación
Ir a la búsqueda
| Línea 61: | Línea 61: | ||
*En el código de arriba se muestra como inicializar y interactuar con algunos puertos que son los que estan asignados al switch de la placa y a los leds. | *En el código de arriba se muestra como inicializar y interactuar con algunos puertos que son los que estan asignados al switch de la placa y a los leds. | ||
*Lo primero con lo que nos encontramos es ''#include "tm4c123ge6pm.h"'' | *Lo primero con lo que nos encontramos es ''#include "tm4c123ge6pm.h"'' | ||
**Este include tiene las definiciones de los registros para que sea más fácil utlizarlos | |||
**Por ejemplo, , este define asigna la dirección de memoria del registro para que en vez de que tengamos que poner esa dirección en nuestro código, pongamos algo más fácil de memorizar | |||
*Luego vemos una declaración de variables (que nos serviran para guardar el estado de cada pin) y vemos una función que se llama ''PortF_Init()''. Esta función es la encargada de inicializar los pines que vamos a necesitar en nuestro programa (en este caso inicializa el Puerto F) | *Luego vemos una declaración de variables (que nos serviran para guardar el estado de cada pin) y vemos una función que se llama ''PortF_Init()''. Esta función es la encargada de inicializar los pines que vamos a necesitar en nuestro programa (en este caso inicializa el Puerto F) | ||
**El primer paso es activar el reloj del puerto F ''SYSCTL_RCGC2_R |= 0x00000020;'' | |||
***Cada dispositivo tiene un reloj que puede activarse | |||
***El bit 5 de este registro se activa para activar el reloj del puerto F | |||
**Ponemos un delay para asegurarnos de que el clock se ha iniciado ''delay = SYSCTL_RCGC2_R;'' | |||
**Desbloqueamos el puerto a utilizar ''GPIO_PORTF_LOCK_R = 0x4C4F434B;'' | |||
***Esto solo es necesario para los pines PC3-0, PD7 y PF0 | |||
***El número hexadecimal que se asigna al registro de desbloqueo lo indica la tabla que he puesto al final de esta explicación | |||
***Luego de desbloquearlo tenemos que activar los bits del ''GPIO_PORTF_CR_R'' (no se para que sirve este registro, pero se tiene que hacer así) | |||
**El siguiente paso es deshabilitar la función analógica (en nuestro programa queremos que los pines sean digitales), por lo tanto se escribe en el registro ''GPIO_PORTF_AMSEL_R = 0x00'' | |||
**Los pines serán digitales y su función será de I/O, por lo tanto se selecciona la función I/O ''GPIO_PCTL_R = 0x00000000'' (Esto es lo que se ve en la tabla de la sección anterior) | |||
void PortF_Init(void){ volatile unsigned long delay; | |||
SYSCTL_RCGC2_R |= 0x00000020; // 1) activate clock for Port F | |||
delay = SYSCTL_RCGC2_R; // allow time for clock to start | |||
GPIO_PORTF_LOCK_R = 0x4C4F434B; // 2) unlock GPIO Port F | |||
GPIO_PORTF_CR_R = 0x1F; // allow changes to PF4-0 | |||
// only PF0 needs to be unlocked, other bits can't be locked | |||
GPIO_PORTF_AMSEL_R = 0x00; // 3) disable analog on PF | |||
GPIO_PORTF_PCTL_R = 0x00000000; // 4) PCTL GPIO on PF4-0 | |||
GPIO_PORTF_DIR_R = 0x0E; // 5) PF4,PF0 in, PF3-1 out | |||
GPIO_PORTF_AFSEL_R = 0x00; // 6) disable alt funct on PF7-0 | |||
GPIO_PORTF_PUR_R = 0x11; // enable pull-up on PF0 and PF4 | |||
GPIO_PORTF_DEN_R = 0x1F; // 7) enable digital I/O on PF4-0 | |||
} | |||
Revisión del 08:23 25 jul 2014
C6.1 - Puertos de TM4C123 Launchpad I/O
![]()
En la imagen de arriba se ven los 43 puertos del TM4C123:
- 8 puesrtos UART
- 4 puertos SSI
- 4 puertos I2C
- 2 convertidores ADC de 12bits
- 12 timers
- 1 puerto CAN
- 1 puerto USB
- 16 puertos PWM
Los pines se pueden configurar como:
- digital I/O
- analog input
- timer I/O
- serial I/O
TABLA 6.1
- En el registro GPIOPCTL se configuran las funciones altrenativas de los pines (0 significa que se configura el pine como un puerto I/O normal).
- Los pines que van de PC3-PC0 no salen en la tabla porque estan reservados para el debugger JTAG y no se pueden usar como puertos I/O normales.
- Algunas funciones altrenativas solo pueden estar en un pin determinado y otras pueden estar en varios pines (por ejemplo CAN0Rx puede estar mapeado en los pines PB4, PE4 o PF0)
- Esta es la placa Tiva LaunchPad basada en el chip LM4F120H5QR o TM4C123GH6PM.
- Incluye integrado un In-Circuit Debug Interface (ICDI) que nos permite programar y hacer debug al controlador.
- Un puerto USB sirve para el ICDI y el otro para desarrollar aplicaciones que se comuniquen por usb.
- El switch de power permite que la placa se alimente por el usb del ICDI o por el otro USB.
- Los pines PA1 y PA0 se utilizan como puerto serial para conectar el debugger al PC
- Los pines PD4 y PD5 se utilizan para el USB
- Los pines de PC3 a PC0 son para el debugger JTAG
- El pin PB6 se conecta al PD0 mediante un resistor (R9)
- El pin PB7 se conecta al PD1 mediante un resistor (R10)
- Para usar los 4 pines individualmente se ha de desoldar el resistor R9 y R10
- La placa tiene dos switches de logica negativa y requieren que se active la resistencia pull-up interna
- La placa tiene 3 leds de colores de logica positiva (PF3-PF1)
C6.2 - Conecptos básicos de los puertos de Entrada y Salida
- En esta imagen se puede ver como funciona un puerto en las operaciones de lectura y escritura.
- En el ciclo de lectura el triestado pasa las señales input que estan en los pines al bus de datos.
- En el ciclo de escritura el microcontrolador pone la información en el bus de datos y esa información se pasa al flip-flop de tipo D mediante una señal de reloj
- El flip-flop que pone "Write to port direction register" es el encargado de hacer que el puerto sea de entrada o salida.
- Cuando en el registro de dirección ponemos un 0 se deshabilita el triestado de salida y las señales del puerto pasan al bus de datos
- Cuando en el registro de dirección ponemos un 1 se habilita el triestado de salida y entonces las señales del microcontrolador pasan al puerto
- En el ciclo de escritura (salida) también está habilitado la lectura. Podemos leer el valor que acabamos de escribir en el puerto
C6.3 - Programación de los I/O y el Registro de Dirección
code
- En el código de arriba se muestra como inicializar y interactuar con algunos puertos que son los que estan asignados al switch de la placa y a los leds.
- Lo primero con lo que nos encontramos es #include "tm4c123ge6pm.h"
- Este include tiene las definiciones de los registros para que sea más fácil utlizarlos
- Por ejemplo, , este define asigna la dirección de memoria del registro para que en vez de que tengamos que poner esa dirección en nuestro código, pongamos algo más fácil de memorizar
- Luego vemos una declaración de variables (que nos serviran para guardar el estado de cada pin) y vemos una función que se llama PortF_Init(). Esta función es la encargada de inicializar los pines que vamos a necesitar en nuestro programa (en este caso inicializa el Puerto F)
- El primer paso es activar el reloj del puerto F SYSCTL_RCGC2_R |= 0x00000020;
- Cada dispositivo tiene un reloj que puede activarse
- El bit 5 de este registro se activa para activar el reloj del puerto F
- Ponemos un delay para asegurarnos de que el clock se ha iniciado delay = SYSCTL_RCGC2_R;
- Desbloqueamos el puerto a utilizar GPIO_PORTF_LOCK_R = 0x4C4F434B;
- Esto solo es necesario para los pines PC3-0, PD7 y PF0
- El número hexadecimal que se asigna al registro de desbloqueo lo indica la tabla que he puesto al final de esta explicación
- Luego de desbloquearlo tenemos que activar los bits del GPIO_PORTF_CR_R (no se para que sirve este registro, pero se tiene que hacer así)
- El siguiente paso es deshabilitar la función analógica (en nuestro programa queremos que los pines sean digitales), por lo tanto se escribe en el registro GPIO_PORTF_AMSEL_R = 0x00
- Los pines serán digitales y su función será de I/O, por lo tanto se selecciona la función I/O GPIO_PCTL_R = 0x00000000 (Esto es lo que se ve en la tabla de la sección anterior)
- El primer paso es activar el reloj del puerto F SYSCTL_RCGC2_R |= 0x00000020;
void PortF_Init(void){ volatile unsigned long delay;
SYSCTL_RCGC2_R |= 0x00000020; // 1) activate clock for Port F delay = SYSCTL_RCGC2_R; // allow time for clock to start GPIO_PORTF_LOCK_R = 0x4C4F434B; // 2) unlock GPIO Port F GPIO_PORTF_CR_R = 0x1F; // allow changes to PF4-0 // only PF0 needs to be unlocked, other bits can't be locked GPIO_PORTF_AMSEL_R = 0x00; // 3) disable analog on PF GPIO_PORTF_PCTL_R = 0x00000000; // 4) PCTL GPIO on PF4-0 GPIO_PORTF_DIR_R = 0x0E; // 5) PF4,PF0 in, PF3-1 out GPIO_PORTF_AFSEL_R = 0x00; // 6) disable alt funct on PF7-0 GPIO_PORTF_PUR_R = 0x11; // enable pull-up on PF0 and PF4 GPIO_PORTF_DEN_R = 0x1F; // 7) enable digital I/O on PF4-0
}

