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
¿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
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
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;
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).
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:
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);
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.
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).
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
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.
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
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);
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;
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;
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
¿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
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.
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
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;
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);
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;
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