C6 - Microcontroller Ports

De Proyectos
Ir a la navegación Ir a la búsqueda

C6


I/O pins configuration: los pines de un microcontrolador pueden tener varias funciones

  • Parallel I/O
  • Alternative functions
    • UART (Universal asyncronous reciever/transmietter) - The UART can be used for serial communication between computers. It is asynchronous and allows for simultaneous communication in both directions.
    • SSI (Synchronous serial interface) - 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 (Inter-integrated circuit) - I2C is a simple I/O bus that we will use to interface low speed peripheral devices.
    • Timer (Periodic interrupts, input capture, and output compare) - Input capture and output compare will be used to create periodic interrupts and measure period, pulse width, phase, and frequency.
    • PWM (Pulse width modulation) - 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.
    • ADC (Analog to digital converter, measure analog signals) - The ADC will be used to measure the amplitude of analog signals and will be important in data acquisition systems.
    • Analog comparator (Compare two analog signals) - The analog comparator takes two analog inputs and produces a digital output depending on which analog input is greater.
    • QEI (Quadrature encoder interface) - The QEI can be used to interface a brushless DC motor.
    • USB (Universal serial bus) - USB is a high-speed serial communication channel.
    • Ethernet (High-speed network) - The Ethernet port can be used to bridge the microcontroller to the Internet or a local area network.
    • CAN (Controller 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

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
 }