Está en la página 1de 82

Taller de Firmware

Técnicas de Manejo de E/S

Facultad de Ingeniería
Instituto de Computación
Introducción (1/1)

• Los distintos tipo de dispositivos de hardware


con los que se debe interactuar tienen
particularidades que debemos contemplar.
• También los recursos de interfaz muchas
veces son escasos por lo que hay que
aprovecharlos al máximo y reutilizarlos de ser
posible.
• Todo esto lleva al desarrollo de técnicas de
manejo de dispositivos que deberán estar
implementadas adecuadamente en el
software.
Contenido

• Efecto Rebote

• Optimización de Entradas

• Optimización de Salidas

• Modulación por Ancho de Pulso


Efecto Rebote
• Aspectos Mecánicos
• Efecto Rebote
• Ataque por hardware
• Ataque por software
Aspectos Mecánicos (1/3)

• Las llaves y botones (incluyendo las “teclas”)


son, normalmente, dispositivos mecánicos
que cierran un circuito poniendo en contacto
dos láminas metálicas.
• En el caso de las teclas actualmente se
utilizan también otros tipos de métodos (ej: el
capacitivo) que no presentan el fenómeno
estudiado.
Aspectos Mecánicos (2/3)

Tomado del Catálogo de Cherry Corporation


Aspectos Mecánicos (3/3)

Tomado del Catálogo de Cherry Corporation


Efecto Rebote (1/3)

• Las láminas metálicas utilizadas en la


construcción de las llaves/botones poseen,
inherentemente, elasticidad.
• Por ello al intentar ponerlas en contacto se
genera un choque que produce un movimiento
en sentido contrario que aleja las láminas.
• Este proceso se repite hasta disipar la energía
cinética adquirida por la lámina móvil.
Efecto Rebote (2/3)

• Este fenómeno es conocido como efecto


rebote.
• El efecto se manifiesta en el hecho que el cierre
(apertura) del circuito no es instantáneo.
• Durante un cierto tiempo la llave (ó el botón)
oscila entre cerrado y abierto.
• El fenómeno se puede dar tanto al cerrar el
circuito como al abrirlo.
Efecto Rebote (3/3)

ON

OFF
t
Ataque por Hardware (1/4)

• La forma mas sencilla de minimizar el problema


por hardware es mediante el uso de un circuito
RC.

Tomado de www.embedded.com
Ataque por Hardware (2/4)

• El circuito RC si bien no evita el rebote, logra


que no haya una oscilación entre cerrado y
abierto.
• Esto se logra porque el condensador debe
perder (ó ganar) su carga (a través de la
resistencia) lo que demora un cierto tiempo.
• Esto “suaviza” la evolución en el tiempo del nivel
de la entrada de la compuerta y permite que su
salida no siga los vaivenes de la apertura y
cierre de la llave.
Ataque por Hardware (3/4)

• Los valores de R1, R2 y C se eligen de forma


que la constante de tiempo del circuito de carga
((R1+R2) * C) y descarga (R2 * C) sean
similares al tiempo de establecimiento del
contacto (el que demora la lámina móvil en
detenerse).
Ataque por Hardware (4/4)

0
ON

Vin
OFF
t
Ataque por Software (1/5)

• Una de las formas de resolver el problema por


software es con una técnica de “cambio de
estado demorado”.
• Esta técnica consiste en cambiar el estado de
la entrada conectada a la llave un cierto tiempo
después que se haya detectado el primer
cambio e ignorando todo cambio intermedio
que haya.
• Ese tiempo debe ser superior al de
establecimiento de la llave.
Ataque por Software (2/5)

• Ejemplo de código de implementación:

if (in(LLAVE) != valor_llave) {
delay(T_ESTABLECIMIENTO);
valor_llave = !valor_llave;
}
Ataque por Software (3/5)

• Otra forma de resolver el tema es por la técnica


de “cambio de estado confirmado”.
• Consiste en cambiar de estado solamente
luego que un cierto número de muestras
periódicas y consecutivas de la entrada
coincidan en un nuevo valor.
• El número de muestras se debe elegir en
función de la frecuencia de muestreo y del
tiempo de establecimiento de la llave.
Ataque por Software (4/5)

• Ejemplo de código de implementación (polling):


if (in(LLAVE) != valor_llave){
cont = 0;
while ((in(LLAVE) != valor_llave) && (cont <
MAX_CONT_REBOTE)) {
delay(T_MUESTRA);
cont++;
}
if (cont >= MAX_CONT_REBOTE)
valor_llave = !valor_llave;
}
Ataque por Software (5/5)

• Ejemplo de código de implementación


(interrupción):
void interrupt timer() {
if ((in(LLAVE) != valor_llave)&& (cont != 0)) {
cont++;
if (cont >= MAX_CONT_REBOTE) {
valor_llave = !valor_llave;
cont = 0;
}
} else {
if (in(LLAVE) != valor_llave)
cont = 1;
else
cont = 0;
}
Resumen (1/1)

• El efecto rebote aparece en toda llave o


botón (switch) implementado por medios
mecánicos.
• Puede ser resuelto por hardware (típicamente
mediante un circuito RC).
• Puede ser resuelto por software
– por “cambio demorado”
– por “cambio confirmado”
Optimización de Entradas
• Escasez de Puertos de E/S
• Codificación de Entradas
• Multiplexado en el tiempo
• Organización Matricial
• Precauciones a considerar
Escasez de Puertos de E/S (1/2)

• Los puertos de E/S son, normalmente, un


recurso escaso en los microcontroladores.
• Es poco común encontrar microcontroladores
que tengan más de algunas decenas de
puertos.
– 8, 16, 32 son números habituales
• Son además compartidos entre entrada y
salida.
– muchos microntroladores permiten elegir la
función de cada puerto por programación.
Escasez de Puertos de E/S (2/2)

• El problema es cuando tengo más señales


lógicas de entrada a considerar que los
puertos disponibles.
• Por ejemplo consideremos el caso de un
teclado.
– Aún si el teclado es solamente numérico se
necesitarían 10 entradas (una para cada tecla
asociada a un dígito) y un par más para “aceptar”
y “borrar”, por ejemplo.
– Un teclado de PC tiene más de 100 teclas.
Codificación de Entradas (1/5)

• Una forma directa de resolver el problema


sería la codificación de las entradas.
• De esta forma si tenemos N señales de
entrada precisaríamos:
puertos = log2 (N+1)

nota 1: α = parte entera superior de α


nota 2: el 1 es para reservar un código (ej: el 0) para
cuando no hay señal activa
Codificación de Entradas (2/5)

Microcontrolador

D7
D6

Codificador
PE2 c D5
PE1 b D4 Señales
a D3
PE0
D2
D1
Codificación de Entradas (3/5)

• El problema fundamental de esta técnica es


que solamente puede identificar una señal de
entrada por vez.
• Si más de una señal de entrada se activa al
mismo tiempo la codificación que aparecerá
en los puertos de entrada dependerá de
cómo se realice el codificador, pero
probablemente sea errónea.
Codificación de Entradas (4/5)

• El siguiente es un circuito codificador sencillo,


pero que falla si hay dos señales activas a la
vez:
Codificación de Entradas (5/5)

• Este circuito codificador es más elaborado y


resuelve el problema de la simultáneidad
asignando jerarquía.
Multiplexado en el Tiempo (1/3)

• Una forma habitual de resolver el problema


de la escasez de puertos es reutilizando las
mismas entradas para distintas señales en
momentos de tiempo distinto.
• Esto se logra multiplexando las señales en
el tiempo.
• De esta forma un puerto de entrada estará
asociado a una señal diferente en cada
instante.
Multiplexado en el Tiempo (2/3)

• El ahorro se comprueba de la siguiente forma:


– Supongamos que tengo 8 señales.
– Si no las multiplexara precisaría 8 puertos (de
entrada) para manejarlas.
– Pero si las multiplexo me alcanza con 4 puertos
• 3 de salida para seleccionar la señal a presentar
• 1 de entrada para recibir el valor
– Otra forma sería:
• 2 de salida para seleccionar una pareja de
señales
• 2 de entrada para recibir los valores
Multiplexado en el Tiempo (3/3)

PS2 c
Microcontrolador

D7
PS1 b D6

Multiplexor
PS0 a D5
D4 Señales
D3
D2
D1
PE0 S D0

• En general para N señales se necesitan:

puertos = log2 N + 1
Organización Matricial (1/3)

• Para el caso particular de los teclados se


suelen emplear estrategias intermedias, en
función de la cantidad de puertos disponibles.
• El objetivo es simplificar el circuito externo,
evitando el uso de mutiplexores y/o
codificadores.
• Se utiliza el arreglo matricial de las teclas.

puertos = m + n, con m.n ≥ N


Organización Matricial (2/3)

• Veamos el ejemplo del teclado numérico:


– 10 teclas de dígitos
– 1 tecla de “Aceptar” y 1 tecla de “Borrar”

• Son 12 teclas en total.


• Se precisarían:
– 12 entradas (método directo)
– 4 (codificado)
– 5 (multiplexado en el tiempo estándar)
Organización Matricial (3/3)

• En el caso de la organización matricial vamos a


requerir 7 puertos en el ejemplo.
PS3
1 2 3
Microcontrolador

PS2
4 5 6
PS1
7 8 9
PS0
B 0 A
PE2
PE1
PE0
Precauciones a Considerar (1/1)

• En el caso de utilizar codificación hay que


recordar que no se pueden detectar distintas
señales en forma simultánea, por lo que está
reservado a unos pocos casos particulares.
• En el caso de multiplexado en el tiempo, el
problema de simultaneidad no se da, pero la
frecuencia de muestreo debe ser
significativamente superior a la frecuencia
más alta de las señales de entrada.
Resumen (1/1)

• Los puertos de un microcontrolador son un


recurso escaso a cuidar.
• Para optimizar su uso se puede recurrir a
técnicas de codificación, multiplexado en el
tiempo ú organización matricial de las entradas.
• Cada técnica tiene sus limitaciones y
condiciones de aplicabilidad.
Optimización de Salidas
• Escasez de Puertos de E/S
• Codificación de Codificación
• Multiplexado en el tiempo
– Latch Externo
– Ciclo de Trabajo
• Organización Matricial
• Precauciones a considerar
Escasez de Puertos de E/S (1/1)

• Al igual que en el caso de las entradas el


problema de contar con un número limitado
de puertos también se da con las salidas.
• El tipo de soluciones pasa más o menos por
los mismos lugares ya vistos, con algunas
particularidades por tratarse, en este caso, de
salidas.
Codificación de Salidas (1/3)

• Al igual que en las entradas es posible la


codificación de las salidas.
• De esta forma si tenemos N señales de
salida precisaríamos:
puertos = log2 (N+1)

nota 1: α = parte entera superior de α


nota 2: el 1 es para reservar un código (ej: el 0) para
cuando no hay ninguna salida activa
Codificación de Salidas (2/3)

Microcontrolador

D7

Decodificador
D6
PS2 c D5
PS1 b D4 Señales
a D3
PS0
D2
D1
Codificación de Salidas (3/3)

• El problema fundamental de esta técnica es


que solamente puede identificar una señal de
salida por vez.
• Si bien en este caso no hay problema de
error de codificación, la restricción de no
simultaneidad es mucho más restrictiva: sólo
puede haber una salida activa en cada
instante del tiempo.
Multiplexado en el Tiempo (1/3)

• En el caso de las salidas también es factible


el multiplexado en el tiempo.
• En este caso en cada instante un puerto de
salida tendrá el valor de una determinada
señal de salida.
• El principal problema aquí es cuando las
señales de salida deben ser persistentes en
el tiempo, o sea deben tener un nivel
constante.
Multiplexado en el Tiempo (2/3)

PS2 c
Microcontrolador

D7

Demultiplexor
PS1 b D6
PS0 a D5
D4 Señales
D3
D2
G D1
PS3
Multiplexado en el Tiempo (3/3)

• Por esto es que normalmente la técnica de


multiplexado se acompaña de mecanismos
complementarios que viabilicen su uso:
- Latch Externo
- Ciclo de Trabajo
Multiplexado en el Tiempo
Latch Externo (1/2)

• En este caso se procede a colocar Flip-Flops


externos al microcontrolador para guardar los
estados de las señales de salida.
• Se puede usar el reloj del sistema para
sinronizar o se puede generar un flanco de reloj
mediante un puerto de salida del
microcontrolador
Multiplexado en el Tiempo
Latch Externo (2/2)

D Q

D7 CE

Decodificador
D6 Señales
Microcontrolador

PS2 c D5
PS1 b D4
PS0 a D3 D Q
D2
D1
D0 CE

PS3

CLK
Multiplexado en el Tiempo
Ciclo de Trabajo (1/7)

• Otra forma muy habitual de multiplexar salidas


en el tiempo es utilizar algunas características
físicas de los fenómenos que se quieren
manipular con las señales de salida.
• Típicamente:
– constantes de tiempo térmicas en fenómenos de
transferencia de energía.
– persistencia de las retinas de los seres humanos.
Multiplexado en el Tiempo
Ciclo de Trabajo (2/7)

• Las mencionadas características están


vinculadas al denominado “ciclo de trabajo”.
• Este parámetro caracteriza una onda cuadrada
(o mejor dicho rectangular) y establece la
relación entre la duración del estado “alto”
respecto a la del ciclo completo en un período.
• Una onda cuadrada “perfecta” tiene un ciclo de
trabajo del 50%.
Multiplexado en el Tiempo
Ciclo de Trabajo (3/7)

• El multiplexado en el tiempo con ciclo de


trabajo compensado, busca generar el mismo
valor medio de la señal en el ciclo completo.
• Si estoy multiplexando N señales, entonces el
valor de salida deberá ser N veces más grande
durante el “time-slot” que le corresponda a la i-
ésima señal, para compensar su falta en el
resto del ciclo.
Multiplexado en el Tiempo
Ciclo de Trabajo (4/7)

• Como muchos fenómenos físicos responden al


valor medio (o a la integral en el tiempo) de la
señal, entonces no ven afectado su efecto por
el uso del multiplexado.
• Ejemplo:
– supongamos que tengo que entregar 50 Joules a
una resistencia para calentar un horno de precisión,
usando una fuente de 5 Volts.
Multiplexado en el Tiempo
Ciclo de Trabajo (5/7)

– La forma directa es entregarle 10 A en forma


constante en el tiempo.
• P = V.I = 5 V . 10 A = 50 Watts
• E = ∫ P dt = 50 Joules (en cada segundo)
– Si multiplexo en el tiempo la señal de “activación”
del horno con otras 4, entonces ahora la función
potencia tiene un valor P durante 200 ms y 0
durante 800 ms.
– Para que la integral siga valiendo lo mismo,
entonces debe ser P = 250 W, lo que significa un
valor 5 veces mas alto de corriente, I = 50 A.
Multiplexado en el Tiempo
Ciclo de Trabajo (6/7)

• Esto es efectivamente equivalente y funciona,


porque lo que importa es la integral en el
tiempo y no el valor instantáneo de la señal de
salida.
• Y esto es así en los fenómenos físicos que
impliquen capacidad de acumulación por parte
de los elementos intervinientes.
Multiplexado en el Tiempo
Ciclo de Trabajo (7/7)

• En el caso de lámparas y/o LEDs el fenómeno


que se utiliza es similar, basado en la
cracterística de persistencia del ojo humano.
• El ojo humano no es capaz de seguir el
parpadeo de una fuente de luz que destelle a
más de 20 y tantas veces por segundo.
• Esta característica es la que permite, entre
otras cosas, la técnica del cine.
Organización Matricial (1/4)

• En algunos casos se utiliza la organización


matricial de las salidas, típicamente junto a la
técnica de multiplexado en el tiempo.
• Un ejemplo clásico es el de los displays de 7
segmentos, que se manejan con 7 salidas para
los segmentos y M salidas de activación, una
por cada display.
– usa el hecho que los display son un conjunto de
LEDs con cátodo común.
Organización Matricial (2/4)

• En el caso de la organización matricial vamos a


requerir 10 puertos en el ejemplo.
PS6
PS5
Microcontrolador

PS4
PS3
PS2
PS1
PS0

PS9
PS8
PS7
Organización Matricial (3/4)

• Un ejemplo más “radical” de organización


matricial y multiplexado en el tiempo es el que
utilizan los letreros en base a LEDs (usados en
aplicaciones de anuncios, por ej. en algunas
líneas de transporte colectivo).
• En este caso se codifican las columnas de LED
(se activa una por vez).
– Al igual que en el caso anterior no se muestran las
resistencias limitadoras de corriente
Organización Matricial (4/4)

PS7
PS6
PS5
PS4
Microcontrolador

PS3
PS2
PS1
PS0
PS15
PS14 Decodificador
PS13
PS12
PS11
PS10
PS9
PS8
Precauciones a Considerar (1/2)

• En el caso de utilizar manejo del ciclo de


trabajo se deben cuidar los valores máximos
de corriente que acepten los dispositivos
involucrados.
• Si bien en materia de disipación de calor no
hay cambio, el valor de pico de corriente es
mucho más alto, lo que puede no ser
soportado por los dispositivos.
Precauciones a Considerar (2/2)

• En el caso particular de LEDs ó lámparas


también hay que cuidar que la frecuencia de
muestreo sea superior a 25 Hz, de forma de
utilizar la persistencia del ojo.
• En términos generales la frecuencia de
muestreo debe ser coherente con las
constantes de tiempo de los sistemas
involucrados.
Resumen (1/1)

• Lo mismo que se ha analizado para los puertos


que actúan vale para los de salida.
• Las técnicas para su optimización son similares,
aunque su aplicación es más restrictiva.
• El muestreo con compensación del ciclo de
trabajo es una técnica muy utilizada que se
basa en la existencia de “inercia” en la
naturaleza, incluyendo el ojo humano.
Modulación Ancho de Pulso
• Introducción a PWM
• Implementación Hardware
• Implementación Software
• Aplicaciones PWM
– transmisión de información
– control de potencia
Introducción a PWM (1/5)

• La Modulación por Ancho de Pulso (PWM =


Pulse Width Modulation) es una técnica de
modulación que utiliza la modificación del
ciclo de trabajo de una onda rectangular.
• Esa alteración del ciclo de trabajo resulta en
la modificación del valor medio de la onda, en
forma proporcional a ese cambio.
Introducción a PWM (2/5)

0
0 αT T t
Introducción a PWM (3/5)

• El valor medio de la señal es:


T
s= ∫ s(t )dt
1
T
0
dada la forma de la onda:

1
s = αTV  = αV
T
Introducción a PWM (4/5)

• Es decir el valor medio de la señal es


proporcional a la relación on-off de su ciclo
de trabajo (el “ancho” del pulso).
• Esta propiedad me permite, entre otras
cosas, codificar información en ese ancho.
Introducción a PWM (5/5)

• Existen tres tipos de PWM:


– Centrada: el pulso está centrado en la ventana de
tiempo correspondiente a un ciclo de la onda.
– Flanco Inicial: el pulso comienza junto con la
ventana de tiempo correspondiente al ciclo.
– Flanco Final: el pulso termina junto con la ventana
de tiempo correspondiente al ciclo.
Implementación Hardware (1/2)

• Es muy común que los microcontroladores


dispongan de circuitos “timer” programables.
• Estos timers muchas veces permiten ser
configurados como generadores de PWM.
• Para ello se le configuran los parámetros:
– período
– relación on/off
Implementación Hardware (2/2)

• Una forma de utilizarlos es programandolos


para que generen una interrupción cada vez
que lleguen al período.
• En la rutina de atención se procede a
escribirles un nuevo valor de relación on/off,
generando así la variación en el ancho del
pulso que se desee.
Implementación Software (1/3)

• Cuando no se dispone de un timer con PWM


se puede recurrir a técnicas de software, ya
sea “puras” o con el soporte de un “timer”
común (sin PWM).
• Sin “timer”
aux = in(SALIDA);
out(SALIDA, aux | 1);
ancho = (valor / VALOR_MAX) * T;
delay (ancho);
out(SALIDA, aux & 0xFE);
delay (T - ancho);
Implementación Software (2/3)

• Con “timer” en Programa Principal


void interrupt timer() {
tics++;
}

tics_ancho = (valor / VALOR_MAX) * (T / Ptimer);


aux = in(SALIDA);
out(SALIDA, aux | 1);
tics = 0;
while (tics < tics_ancho);
out(SALIDA, aux & 0xFE);
while (tics < (T / Ptimer);
Implementación Software (3/3)

• Con “timer” en Rutina Interrupción


void interrupt timer() {
if (tics == 0) {
aux = in(SALIDA);
out(SALIDA, aux | 1);
}
tics++;
if (tics == (valor / VALOR_MAX) * (T / Ptimer)){
aux = in(SALIDA);
out(SALIDA, aux & 0xFE);
}
if (tics > (T / Ptimer))
tics = 0;
}
Aplicaciones PWM (1/1)

• La técnica de modulación por ancho de pulso se


aplica en diversas áreas.
• Si bien por ser una técnica de modulación se la
puede utilizar para transmitir información, sus
aplicaciones más habituales están en el campo
de la electrónica de control, aplicada
típicamente a motores y otro tipo de dispositivos
que puedan ser controlados variando el valor
medio de una magnitud (ej: la corriente o la
diferencia de potencial).
Aplicaciones PWM
Transmisión de Información (1/3)

• Esta aplicación es la “directa” asociada al


concepto de modulación.
• La forma de onda transporta en sí misma
información codificada en el ancho del pulso.
• La forma de codificarla es la vista para generar
el pulso del ancho requerido (en función del
“valor” a codificar).
Aplicaciones PWM
Transmisión de Información (2/3)

• La decodificación requiere determinar el


comienzo del pulso y calcular el ancho relativo
del pulso respecto al período de la onda
rectangular original.
• Una forma sencilla de hacerlo es alimentar la
señal a decodificar a un puerto de entrada que,
además, genere una interrupción por flanco
ascendente.
Aplicaciones PWM
Transmisión de Información (3/3)

void interrupt senial() {


tics = 0;
termino_pulso = FALSE;
}
void interrupt timer() {
if (((in(ENTRADA) & 1) == 0) && (!termino_pulso)) {
valor = VALOR_MAX * (tics / (T / Ptimer));
termino_pulso = TRUE;
}
}
Aplicaciones PWM
Control de Potencia (1/5)

• En este caso se utiliza la proporcionalidad del


valor medio de la señal al ancho del pulso, para
controlar la potencia que se le aplica a un
dispositivo.
• La forma mas sencilla de pensar esto es
suponer que con la señal atacamos una “llave
electrónica” (ej. un transistor) para permitir el
pasaje de corriente solo durante el pulso.
Aplicaciones PWM
Control de Potencia (2/5)

• Esto generará que la reacción del dispositivo


sea proporcional a la energía que está
recibiendo y por tanto adapte su
comportamiento a la misma.
• Ejemplos:
– un calentador generará más ó menos calor
– un LED brillará más ó menos
– un motor girará más ó menos rápido (aplica a
determinados tipos de motores)
Aplicaciones PWM
Control de Potencia (3/5)

• Para que esto sea efectivamente así se debe


cumplir que la frecuencia de trabajo del PWM
sea convenientemente alta.
• La mayoría de los sistemas físicos se comportan
como un “pasabajos”, reaccionando al valor
medio de la señal y no siguiendo los cambios
instantáneos que se produzcan.
• La frecuencia de trabajo debe ser superior a la
“frecuencia de corte” equivalente.
Aplicaciones PWM
Control de Potencia (4/5)

• En aplicaciones de precisión se debe tener


presente que las curvas de comportamiento de
los dispositivos muchas veces no son lineales.
• Ejemplo:
– la iluminación de un LED no es siempre proporcional
a la corriente que lo circula, ya que su curva de
respuesta no es una recta perfecta.
• Por esto si se requiere precisión se deben
implementar factores de corrección.
Aplicaciones PWM
Control de Potencia (5/5)

• Los factores de corrección muchas veces


son formulas en función del ancho relativo
del pulso (α), del estilo:
f = cos(α . π/4)
• Estas funciones se implementan como
tablas estáticas numéricas para no
despediciar preciosos recursos de CPU
haciendo el cálculo cada vez.
Resumen (1/1)

• La Modulación por Ancho de Pulso (PWM) es


una técnica muy utilizada a nivel de
microcontroladores.
• Permite tanto transmitir información (en
formato “digital”) como realizar el control de la
potencia aplicada a dispositivos que acepten
“filtrar” los cambios rápidos y reaccionen sólo
siguiendo los valores medio (de potencia,
corriente, voltaje, etc).
Preguntas