1 of 23

Puertos para Microcontroladores

Taller - Sistemas Electrónicos Digitales – 5to Año Técnica

Casa Pio IX – Profesores: Tomás Zuran y Héctor Albano

Puertos para Microcontroladores

2 of 23

¿Qué tengo que hacer para poder usar los pines del microcontrolador como entrada y salida?

Puertos para Microcontroladores

Taller - Sistemas Electrónicos Digitales – 5to Año Técnica – Casa Pio IX – Profesores: Tomás Zuran y Héctor Albano 2

  • El microcontrolador tiene cinco puertos (A, B, C, D y E) que pueden ser configurados como GPIO, entre otras cosas.

  • No todos los puertos tienen las mismas especificaciones (chequear PINOUT en la datasheet).

  • Como con todos los periféricos del microcontrolador, debemos seguir una serie de pasos para inicializar los GPIO y poder usarlos.

3 of 23

Puertos para Microcontroladores

Taller - Sistemas Electrónicos Digitales – 5to Año Técnica – Casa Pio IX – Profesores: Tomás Zuran y Héctor Albano 3

Registros que nos van a resultar útiles:

Para inicialización de los GPIOS: SIM_SCGC5 - PORTx_PCRn - GPIOx_PDDR

Para lectura de entradas: GPIOx_PDIR

Para escritura de salidas: GPIOx_PDOR - GPIOx_PSOR - GPIOx_PCOR - GPIOx_PTOR

4 of 23

Puertos para Microcontroladores

Taller - Sistemas Electrónicos Digitales – 5to Año Técnica – Casa Pio IX – Profesores: Tomás Zuran y Héctor Albano 4

Pasos para inicializar un GPIO (1/3)

Para empezar, debo habilitar la compuerta de clock en el puerto que yo necesite. Esto se hace en el registro SIM_SCGC5. Por defecto comienzan apagados. Recuerden que ante cualquier duda hay que chequear el manual de usuario.

Por ejemplo, si quisiera prender el PUERTO B:

SIM_SCGC5 |= SIM_SCGC5_PORTB_MASK;

5 of 23

Puertos para Microcontroladores

Taller - Sistemas Electrónicos Digitales – 5to Año Técnica – Casa Pio IX – Profesores: Tomás Zuran y Héctor Albano 5

Pasos para inicializar un GPIO (2/3)

Después debo configurar el multiplexor del pin elegido. Recordemos que por defecto no comienzan conectados al GPIO. Esto pueden verlo en el pinout del micro (hoja 44 de la datasheet). Para configurar el multiplexor debemos modificar el registro PORTx_PCRn.

Por ejemplo, si en el pinout veo que el multiplexor debe estar en la alternativa 1:

PORTB_PCR1 = PORT_PCR_MUX(1);

Notar que en este registro es donde debo configurar la resistencia de pullup si así lo quiero (ver bits PE y PS en el manual de usuario).

6 of 23

Puertos para Microcontroladores

Taller - Sistemas Electrónicos Digitales – 5to Año Técnica – Casa Pio IX – Profesores: Tomás Zuran y Héctor Albano 6

Pasos para inicializar un GPIO (2/3)

En la hoja 44 de la datasheet encontramos el pinout:

7 of 23

Puertos para Microcontroladores

Taller - Sistemas Electrónicos Digitales – 5to Año Técnica – Casa Pio IX – Profesores: Tomás Zuran y Héctor Albano 7

Pasos para inicializar un GPIO (2/3)

En detalle:

Por ejemplo, si en el pinout veo que el multiplexor debe estar en la alternativa 1:

PORTB_PCR1 = PORT_PCR_MUX(1);

8 of 23

Puertos para Microcontroladores

Taller - Sistemas Electrónicos Digitales – 5to Año Técnica – Casa Pio IX – Profesores: Tomás Zuran y Héctor Albano 8

Pasos para inicializar un GPIO (3/3)

Lo último que nos falta hacer es determinar si el pin va a ser una salida o una entrada. Esto lo podemos modificar en el registro de direcciones GPIOx_PDDR.

Por ejemplo, para configurar el pin PTE19 como salida:

GPIOE_PDDR |= 1 << 19;

Por ejemplo, para configurar el pin PTB4 como entrada:

GPIOE_PDDR &= ~(1 << 4);

Para configurar el GPIO ‘n’ del puerto ‘x’ como salida, debemos poner el bit ‘n’ en 1. Para entrada, el bit ‘n’ debe estar en 0.

9 of 23

Puertos para Microcontroladores

Taller - Sistemas Electrónicos Digitales – 5to Año Técnica – Casa Pio IX – Profesores: Tomás Zuran y Héctor Albano 9

Código de ejemplo para inicializar como entrada el PTC4

Habilito la compuerta del clock del puerto C, que es el que estoy configurando.

Configuro el multiplexor del pin en la alternativa 1, según figura en el pinout.

Configuro el pin como entrada (pongo un 0 en el registro de direcciones).

10 of 23

Puertos para Microcontroladores

Taller - Sistemas Electrónicos Digitales – 5to Año Técnica – Casa Pio IX – Profesores: Tomás Zuran y Héctor Albano 10

Cómo leer una entrada

Para leer el estado de las entradas debemos leer el registro de datos de entrada GPIOx_PDIR. El estado de cada pin nos va a indicar qué estoy leyendo en la entrada.

Por ejemplo, para leer el PTB17:

unsigned char lectura1 = (GPIOB_PDIR >> 17) & 0x01;

Por ejemplo, para leer un número binario formado por el PTE20 y el 19, siendo el 20 el más significativo:

uint8_t lectura2 = (GPIOE_PDIR >> 19) & 0x03; // 0x03 = 0b00000011

11 of 23

Puertos para Microcontroladores

Taller - Sistemas Electrónicos Digitales – 5to Año Técnica – Casa Pio IX – Profesores: Tomás Zuran y Héctor Albano 11

Ejemplo de código para inicializar y leer una entrada en el PTB6

Inicialización como fue explicada anteriormente.

En otra parte del código, cuando quiera o lo necesite, puedo leer el puerto para saber el estado de la entrada. No es necesario crear una variable para guardar la lectura, podría usar la lectura del registro sin guardarla.

12 of 23

Puertos para Microcontroladores

Taller - Sistemas Electrónicos Digitales – 5to Año Técnica – Casa Pio IX – Profesores: Tomás Zuran y Héctor Albano 12

Cómo escribir una salida (1/4)

Este microcontrolador nos brinda diferentes maneras de escribir salidas, similares a efectos prácticos, pero que según el programa que estemos haciendo son más o menos convenientes, por lo que nos puede convenir alguna de ellas en específico según nuestro caso. Tendremos 3 formas distintas de poner las salidas en 0 o en 1:

Registro de datos de salida: GPIOx_PDOR

Registros de set y clear de salida: GPIOx_PSOR y GPIOx_PCOR

Registro de cambio (o toggle) de salida: GPIOx_PTOR

13 of 23

Puertos para Microcontroladores

Taller - Sistemas Electrónicos Digitales – 5to Año Técnica – Casa Pio IX – Profesores: Tomás Zuran y Héctor Albano 13

Cómo escribir una salida - Registro de datos de salida (2/4)

En este registro, debemos escribir un 1 en el bit ‘n’ si queremos que la salida tenga un ‘1’ lógico, un 0 si queremos un ‘0’ lógico.

Por ejemplo, para poner en 1 la salida PTA8:

GPIOA_PDOR |= 1 << 8;

Por ejemplo, para poner en 0 la salida PTC2:

GPIOC_PDOR &= ~(1 << 2);

14 of 23

Puertos para Microcontroladores

Taller - Sistemas Electrónicos Digitales – 5to Año Técnica – Casa Pio IX – Profesores: Tomás Zuran y Héctor Albano 14

Cómo escribir una salida - Registros de set y clear (3/4)

De la misma manera que en un SR Flip Flop, debemos escribir el registro de set para prender las salidas, y el de clear para apagarlas. Ambos registros funcionan con 1. Para prender la salida ‘n’, debo poner el bit ‘n’ del registro de set en 1. Para apagar la salida ‘m’, debo poner el bit ‘m’ del registro de clear en 1. Escribir un 0 en cualquiera de los registros no tiene efecto.

Por ejemplo, para poner en 1 la salida PTA8:

GPIOA_PSOR |= 1 << 8;

Por ejemplo, para poner en 0 la salida PTC2:

GPIOC_PCOR |= 1 << 2;

15 of 23

Puertos para Microcontroladores

Taller - Sistemas Electrónicos Digitales – 5to Año Técnica – Casa Pio IX – Profesores: Tomás Zuran y Héctor Albano 15

Cómo escribir una salida - Registros de toggle (4/4)

De la misma manera que en un T Flip Flop, debemos escribir el registro de toggle para cambiar de estado la salida. Es decir, si la salida estaba en 1 y escribo un 1 en el registro de toggle, la salida pasará a estar en 0. Pasa lo contrario si la salida empieza en 0. Escribir un 0 en este registro no tiene efecto.

Por ejemplo, para cambiar de estado la salida PTB1:

GPIOB_PTOR |= 1 << 1;

Por ejemplo, para cambiar de estado la salida PTD4:

GPIOD_PTOR |= 1 << 4;

16 of 23

Puertos para Microcontroladores

Taller - Sistemas Electrónicos Digitales – 5to Año Técnica – Casa Pio IX – Profesores: Tomás Zuran y Héctor Albano 16

Ejemplo de código para inicializar y escribir una entrada en el PTD2

17 of 23

¿Qué es una interrupción? ¿Cómo puedo interrumpir el microcontrolador con un pin?

KBI para Microcontroladores

Taller - Sistemas Electrónicos Digitales – 5to Año Técnica – Casa Pio IX – Profesores: Tomás Zuran y Héctor Albano 17

  • Otra funcionalidad del módulo PORT del micro son las interrupciones por teclado (en inglés keyboard interrupt, o KBI para abreviar).

  • Nos permite poder generar interrupciones por factores (o fuentes de interrupción) externas a este. Distinto del caso del TPM u otros periféricos que interrumpen al microcontrolador pero se ubican dentro del mismo.

  • Es útil para la lectura de flancos o para la lectura de teclados, aunque no es su único uso.

  • Únicamente se pueden usar el puerto A y el puerto D

18 of 23

KBI para Microcontroladores

Taller - Sistemas Electrónicos Digitales – 5to Año Técnica – Casa Pio IX – Profesores: Tomás Zuran y Héctor Albano 18

Podemos dividir a las fuentes de interrupción en dos tipos: interrupciones por flanco o interrupciones por nivel. En el primer caso, el microcontrolador se interrumpiría cada vez que la señal de entrada esté en cierto nivel lógico previamente configurado, en el segundo únicamente se interrumpiría en los flancos ascendentes, descendentes, o ambos, según se haya configurado previamente.

19 of 23

KBI para Microcontroladores

Taller - Sistemas Electrónicos Digitales – 5to Año Técnica – Casa Pio IX – Profesores: Tomás Zuran y Héctor Albano 19

Cómo configurar un pin como KBI - Registros útiles

SIM_SCGC5

PORTx_PCRn

NVIC_ICPR

NVIC_ISER

20 of 23

KBI para Microcontroladores

Taller - Sistemas Electrónicos Digitales – 5to Año Técnica – Casa Pio IX – Profesores: Tomás Zuran y Héctor Albano 20

Cómo configurar un pin como KBI (1/3)

Registro SIM_SCGC5

En primer lugar, de la misma manera que cuando lo queríamos configurar como GPIO, debemos habilitar la compuerta de clock del puerto que queramos configurar como se explicó en los pasos para inicializar un GPIO, con el registro SIM_SCGC5.

Por ejemplo, si quiero usar el puerto A: SIM_SCGC5 |= SIM_SCGC5_PORTA_MASK;

21 of 23

KBI para Microcontroladores

Taller - Sistemas Electrónicos Digitales – 5to Año Técnica – Casa Pio IX – Profesores: Tomás Zuran y Héctor Albano 21

Cómo configurar un pin como KBI (2/3)

Registro PORTx_PCRn

En este registro debemos configurar el parámetro IRQC

El multiplexor no tiene que estar necesariamente configurado para el funcionamiento de las KBI. Suele ser útil configurarlo como GPIO también.

En parámetro IRQC configuraremos cuál será la fuente de interrupción, en nuestro caso nos interesan los casos del 8 al 12 inclusive.

Por ejemplo, para configurar las interrupciones del PTD4 por flancos descendentes:

PORTD_PCR4 = PORT_PCR_IRQC(0b1010);

22 of 23

KBI para Microcontroladores

Taller - Sistemas Electrónicos Digitales – 5to Año Técnica – Casa Pio IX – Profesores: Tomás Zuran y Héctor Albano 22

Cómo configurar un pin como KBI (3/3)

Registros del NVIC

Con estos registros lo que hacemos es habilitar las interrupciones del puerto A o D según queramos. En las páginas 52-54 del manual de usuario del KL25Z podemos ver los distintos tipos de fuente de interrupciones. Debemos buscar el número de la fuente de interrupción del puerto A o D (según necesitemos).

Nota: para ver en detalle la función de cada uno de estos registros, ver páginas 87 en adelante del manual de usuario del procesador.

Para habilitar las interrupciones por pin del puerto A:

NVIC_ICPR |= 1 << 30;

NVIC_ISER |= 1 << 30;

Para habilitar las interrupciones por pin del puerto D:

NVIC_ICPR |= 1 << 31;

NVIC_ISER |= 1 << 31;

23 of 23

Puertos para Microcontroladores

Taller - Sistemas Electrónicos Digitales – 5to Año Técnica – Casa Pio IX – Profesores: Tomás Zuran y Héctor Albano 23

Ejemplo de código para inicializar las interrupciones por flanco ascendente en el PTD5

Habilito la compuerta de clock del puerto D

Configuro el multiplexor en la alternativa del GPIO, configuro las interrupciones por flanco ascendente

Habilito las interrupciones del puerto D

Le aviso al microcontrolador que ya pude atender la interrupción