Diferencia entre revisiones de «C6 - Microcontroller Ports»
Sin resumen de edición |
|||
| Línea 1: | Línea 1: | ||
= C6 = | = C6 = | ||
<br> | <br> | ||
I/O pins configuration: los pines de un microcontrolador pueden tener varias funciones | |||
*Parallel I/O | |||
*Alternative functions | |||
**UART (Universal asyncronous reciever/transmietter) | |||
**SSI (Synchronous serial interface) | |||
**I2C (Inter-integrated circuit) | |||
**Timer (Periodic interrupts, input capture, and output compare) | |||
**PWM (Pulse width modulation) | |||
**ADC (Analog to digital converter, measure analog signals) | |||
**Analog comparator (Compare two analog signals) | |||
**QEI (Quadrature encoder interface) | |||
**USB (Universal serial bus) | |||
**Ethernet (High-speed network) | |||
**CAN (Controller area network) | |||
<br> | <br> | ||
The UART can be used for serial communication between computers. It is asynchronous and allows for simultaneous communication in both directions. The SSI is alternately called serial peripheral interface (SPI). It is used to interface medium-speed I/O devices. In this book, we will use it to interface a graphics display. We could use SSI to interface a digital to analog converter (DAC) or a secure digital card (SDC). I2C is a simple I/O bus that we will use to interface low speed peripheral devices. Input capture and output compare will be used to create periodic interrupts and measure period, pulse width, phase, and frequency. PWM outputs will be used to apply variable power to motor interfaces. In a typical motor controller, input capture measures rotational speed, and PWM controls power. A PWM output can also be used to create a DAC. The ADC will be used to measure the amplitude of analog signals and will be important in data acquisition systems. The analog comparator takes two analog inputs and produces a digital output depending on which analog input is greater. The QEI can be used to interface a brushless DC motor. USB is a high-speed serial communication channel. The Ethernet port can be used to bridge the microcontroller to the Internet or a local area network. The CAN creates a high-speed communication channel between microcontrollers and is commonly found in automotive and other distributed control applications. | |||
<br> | |||
= C6.1 - Puertos de TM4C123 Launchpad I/O = | = C6.1 - Puertos de TM4C123 Launchpad I/O = | ||
<br/> | <br/> | ||
Revisión del 15:47 26 feb 2015
C6
I/O pins configuration: los pines de un microcontrolador pueden tener varias funciones
- Parallel I/O
- Alternative functions
- UART (Universal asyncronous reciever/transmietter)
- SSI (Synchronous serial interface)
- I2C (Inter-integrated circuit)
- Timer (Periodic interrupts, input capture, and output compare)
- PWM (Pulse width modulation)
- ADC (Analog to digital converter, measure analog signals)
- Analog comparator (Compare two analog signals)
- QEI (Quadrature encoder interface)
- USB (Universal serial bus)
- Ethernet (High-speed network)
- CAN (Controller area network)
The UART can be used for serial communication between computers. It is asynchronous and allows for simultaneous communication in both directions. The SSI is alternately called serial peripheral interface (SPI). It is used to interface medium-speed I/O devices. In this book, we will use it to interface a graphics display. We could use SSI to interface a digital to analog converter (DAC) or a secure digital card (SDC). I2C is a simple I/O bus that we will use to interface low speed peripheral devices. Input capture and output compare will be used to create periodic interrupts and measure period, pulse width, phase, and frequency. PWM outputs will be used to apply variable power to motor interfaces. In a typical motor controller, input capture measures rotational speed, and PWM controls power. A PWM output can also be used to create a DAC. The ADC will be used to measure the amplitude of analog signals and will be important in data acquisition systems. The analog comparator takes two analog inputs and produces a digital output depending on which analog input is greater. The QEI can be used to interface a brushless DC motor. USB is a high-speed serial communication channel. The Ethernet port can be used to bridge the microcontroller to the Internet or a local area network. The CAN creates a high-speed communication channel between microcontrollers and is commonly found in automotive and other distributed control applications.
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
#include "tm4c123ge6pm.h"
unsigned long In; // input from PF4
unsigned long Out; // output to PF2 (blue LED)
// Function Prototypes
void PortF_Init(void);
// 3. Subroutines Section
// MAIN: Mandatory for a C Program to be executable
int main(void){ // initialize PF0 and PF4 and make them inputs
PortF_Init(); // make PF3-1 out (PF3-1 built-in LEDs)
while(1){
In = GPIO_PORTF_DATA_R&0x10; // read PF4 into Sw1
In = In>>2; // shift into position PF2
Out = GPIO_PORTF_DATA_R;
Out = Out&0xFB;
Out = Out|In;
GPIO_PORTF_DATA_R = Out; // output
}
}
// Subroutine to initialize port F pins for input and output
// PF4 is input SW1 and PF2 is output Blue LED
// Inputs: None
// Outputs: None
// Notes: ...
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
}
En el código de arriba se muestra un pequeño programa que iniciliza e interactua 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 6.1)
- Configuramos los pines que seran input y los que seran output GPIO_DIR_R = 0x0E
- En nuestro código el pin 4 y el 0 son input (switches) y los pines 1, 2 y 3 son outpus (leds). 0 para input, 1 para output, entonces queda 01110 que en hexa es E
- Deshabilitamos las funciones alternativas en el registro ASFEL GPIO_PORTF_AFSEL_R = 0x00
- En este caso necesitamos de las pull-up internas, por lo tanto las activamos GPIO_PORTF_PUR_R = 0x11
- Activamos el registro de datos de los pines que vamos a usar GPIO_PORTF_DEN_R = 0x1F
- El primer paso es activar el reloj del puerto F SYSCTL_RCGC2_R |= 0x00000020;
Al acabar la inicialización viene el programa en si
while(1){
In = GPIO_PORTF_DATA_R&0x10; // read PF4 into Sw1
In = In>>2; // shift into position PF2
Out = GPIO_PORTF_DATA_R;
Out = Out&0xFB;
Out = Out|In;
GPIO_PORTF_DATA_R = Out; // output
}

