En este primer tema vamos a definir que entendemos por un sistema digital y vamos a hacerlo a través de un par de ejemplos. Desde el punto de vista de la ingeniería, un sistema es un conjunto de objetos o de elementos interconectados entre sí, que realizan una cierta función. Un sistema puede ser físico en el sentido de tangible, como por ejemplo un televisor o una nevera, o puede ser abstracto conceptual como por ejemplo un software. Un sistema físico, que es el tipo de sistema que nos va a interesar es un sistema caracterizado por unas señales de entrada, unas señales de salida, y una relación entre señales de entrada y de salida que define la función del sistema. Cada una de las señales de entrada y salida, a su vez viene definida por el tipo de señal, puede ser una tensión, una fuerza, una temperatura, etcétera, etcétera, y por el rango de valores que puede tomar esta señal, por ejemplo una señal puede ser una señal de tensión en el rango de 0 a 5 voltios. Vamos a ver un primer ejemplo muy sencillo de sistema físico. Un sistema de control de una caldera de calefacción. La función de este sistema es controlar la temperatura de una vivienda, a partir de un selector, en el cual nosotros podemos escoger la temperatura a la que queremos tener la casa y además tiene un sensor de temperatura que va midiendo contínuamente la temperatura real de la vivienda. El objetivo de este sistema de control de temperatura es conseguir que la temperatura marcada en el selector coincida lo máximo posible con la temperatura medida por el sensor. La posición de este selector, es decir, la temperatura a la que deseamos mantener la casa entra en forma de una señal que llamaremos "pos" y la temperatura real medida por el sensor entra en forma de una señal "temp", temperatura medida por el sensor. En función de estos dos valores, el dispositivo genera una señal de salida que llamaremos "onoff", que es una señal binaria que puede estar en on y en off, y que lo que hace es encender o apagar la caldera, Vamos a ver un poco cual es el tipo y rango de las señales de entrada y salida. Primero: "pos" es una señal que puede tomar cualquier valor entre, vamos a suponer, entre 10 y 30 grados, es decir, "pos" es una variable contínua en el rango de 10 a 30 grados. "Temp" es también una variable contínua, puesto quer puede tomar cualquier valor, y vamos a suponer que puede tomar cualquier valor en el rango de 0 a 50 grados, simplemente porque vamos a suponer que el sensor con el que trabajamos solo puede medir con fiabilidad temperaturas que se encuentran en este rango de valores. "Onoff" otra vez, ya lo hemos dicho, es una señal que solo puede tener dos valores: enciende la caldera o apaga la caldera. La relación entre las entradas y las salidas, es decir, el funcionamiento del sistema podemos expresarlo mediante un algoritmo como este. Un loop que contínuamente, lo que vamos a ir haciendo, es mirar si la temperatura de la habitación, "temp", es menor que la que deseamos, "pos", menos medio grado, esto será un márgen de tolerancia, un márgen de tolerancia que estableceremos si la temperatura medida por el sensor es menor que la que deseamos menos 0,5 grados, entonces ponemos en marcha la caldera, y en caso contrario si la temperatura medida por el sensor es mayor que la temperatura que deseamos más este medio grado de tolerancia, entonces apagaremos la caldera porque hace demasiado calor. Y este proceso de comparación lo iremos repitiendo cada 10 segundos. Las señales como "pos" y "temp" que pueden tomar cualquier valor dentro de un conjunto contínuo y por lo tanto infinito de valores reciben el nombre de señales analógicas. Las señales como "onoff" que solo pueden tomar un conjunto finito de valores, en este caso concreto solo dos, on y off, reciben el nombre de señales digitales o señales discretas. Así pues podríamos resumir nuestro controlador de la caldera diciendo que es un sistema físico que recibe dos entradas analógicas "pos" y "temp" con unos rangos de 10 a 30 y de 0 a 50 grados, y que genera una señal digital "onoff" que solo puede tomar los valores on y off, y cuyo comportamiento viene resumido por el algoritmo que acabamos de ver. Vamos a ver un segundo ejemplo de sistema físico. Un cronómetro o, más exactamente, un controlador de tiempos de un cronómetro que mide tiempos comprendidos entre 0 y 24 horas con una precisión de las décimas de segundo. El cronómetro tiene tres pulsadores, "start", "stop" y "reset". "start" lo pone en marcha, "stop" lo para y "reset" lo reinicializa a 0. Para medir el tiempo que ha pasado desde que hemos pulsado la señal de "start", necesitamos una señal cuadrada como ésta. Una señal que solo toma dos valores, por ejemplo vamos a poner 0 voltios y 1 voltio. Esta señal es la que se va a recibir por el entrada "ref". Esta señal además va a tener un periodo muy estable, de forma que medir el tiempo, en el fondo, va a significar medir el número de pulsos de esta señal que han llegado al dispositivo desde que pulsamos el "start". En este ejemplo hemos optado por utilizar una señal con un período de 0,1 segundos, de manera que cuando han llegado 10 ciclos de esta señal cuadrada, entendemos que ha pasado un segundo desde que se pulsó la señal de "start". El cronómetro tiene un display que lo tenemos representado aquí formado por siete módulos 7-segmentos, que visualizan el tiempo transcurrido en forma de horas, con dos dígitos, minutos, segundos y décimas de segundo. Nuestro sistema representado exactamente por esta cajita que pone "cálculo de tiempo" va a recibir cuatro entradas, la señal de "reset", la señal "start", "stop" y esta señal cuadrada que me va a permitir medir el tiempo, y va a generar cuatro salidas, "h", "m", "s" y "t" que van a representar respectivamente las horas, minutos, segundos y décimas de segundo. Aquí la "t" viene de décimas en inglés, "tenths", que han transcurrido desde que se ha pulsado el pulsador de "start". La salida "h" solo puede tomar valores entre 0 y 23, "m" y "s", minutos y segundos, son números enteros que solo pueden tomar valores en el rango de 0 a 59 y "t", las décimas de segundo, es una señal entera que solo puede tomar los valores de 0 a 9. En este ejemplo definiremos las relaciones entre las entradas y las salidas, primero utilizando el lenguaje natural y más adelante trataremos de formalizarlo en forma de un algoritmo, en forma de pseudocódigo. Bueno, este sistema viene gobernado por tres reglas: La primera, cuando se pulsa "reset", las salidas de horas, minutos, segundos y décimas de segundo se ponen a 0. Segunda, cuando se pulsa "start", el cronómetro comienza a contar aumentando una décima de segundo cada vez que por la entrada "ref" le llega un flanco de subida. ¿Qué entendemos por un flanco de subida? Si decíamos que la señal "ref" era una señal cuadrada con un período determinado que además era exactamente de 0,1 segundos; por flanco de reloj entendemos estos cambios desde 0 a 1. Este es un flanco de reloj, este es otro flanco de reloj, etc. Cuando las décimas de segundo llegan al valor 9, el siguiente flanco pone a 0 las décimas de segundo y aumenta en 1 el número de segundos. Tercera regla: Cuando se pulsa "stop", el cronómetro deja de contar manteniendo los últimos valores alcanzados por las señales, horas, minutos, "h", "m", "s" y "t". Bueno os dejo ahora mismo una pregunta sencilla, responder para comprobar si habéis entendido correctamente el funcionamiento de este sistema. Respecto al tipo y rango de las señales vemos que en este caso todas las señales entradas, salidas, son discretas; "reset", "start", "stop" y "ref" son señales que solo pueden tomar dos valores, "h" es una señal que puede tomar 24 valores en el rango de 0 a 23. "m" y "n", significando minutos y segundos, puede tomar 60 valores en el rango de 0 a 59 y t, y las décimas de segundo puede tomar 10 valores en el rango de 0 a 9. Bien, estos sistemas en los cuales todas las señales de entrada y de salida son digitales, reciben el nombre de Sistemas Digitales y son el objetivo de este curso. Os propongo ahora un ejercicio que, bueno, si no os sale no debéis preocuparos demasiado porque a lo largo del curso tendréis ocasión de practicar este tipo de ejercicios en muchas ocasiones. Pero me gustaría que antes de ver cómo podemos describir de una manera formal al comportamiento de este sistema, os tomáseis un tiempo para pensar como lo haríais vosotros. El reto es: Describir formalmente, con un pequeño bloque de pseudocódigo, el funcionamiento del controlador del cronómetro. Para poder hacerlo, primero, necesitaremos una variable que vamos a llamar "ref_flanco_positivo", que tome el valor verdadero, o el valor 1 si queréis, cuando se produce un flanco positivo en la señal "ref". Os recuerdo que la señal "ref" era la señal cuadrada y los flancos se referían a los cambios de 0s a 1s. Primera pista: Utilizar esta variable "ref_flanco_positivo". Y vamos a suponer que previamente hemos definido un procedimiento que vamos a llamar update(h,m,s,t), que cada vez que es invocado, cada vez que se le llama, suma una décima de segundo al tiempo transcurrido. Bien, podéis utilizar cualquiera de estas estructuras: If..then..else, while..then, loops, y otras similares. Os dejo que lo penséis un poco y a continuación os doy la solución. Esto es una posible solución al problema. De hecho estos problemas no suelen tener una solución única. Vemos aquí, en esta porción de código, que tenemos un loop que empieza y acaba al principio y al final de todo el código y que nos dice que continuamente vamos a estar repitiendo estas instrucciones. Estas instrucciones ¿que nos dicen?: En primer lugar miramos si tenemos pulsado el "reset". Si hay pulsado el "reset", ponemos, inicializamos, horas, minutos, segundos y decimas de segundos a 0. En caso contrario, si no está pulsado el "reset", nos preguntamos si se ha pulsado el pulsador de "start" o no. Si tenemos pulsado el "start", entonces mientras no pulsemos el "stop", es lo que dice aqui, ejecutamos este if interno y miramos ... cada vez que llega un flanco positivo, que es así como hemos definido esta variable, cada vez que llegue un flanco positivo por la señal "ref", entonces actualizamos las horas, minutos, segundos, y décimas de segundo sumándole uno a las décimas de segundo. En el momento que pulsemos "stop" ya no se cumple la condición del while con lo cual salimos de este loop y volvemos, llegamos, al end if, que nos obliga a volvernos a preguntar si el "reset" está "on". Si esta "on" inicializamos, y sino esperamos hasta que "start" se pone en "on", hasta que se pulsa "start" y volvemos a reiniciar otra vez este proceso. ¿De acuerdo? ¿De acuerdo? Bien, pues esto sería una descripción formal del controlador de tiempos del cronómetro. Para finalizar esta lección, un pequeño resumen: Hemos visto el concepto de señales digitales y de sistema digital como aquel sistema físico que todas sus entradas, salidas son señales digitales o discretas Hemos visto un sistema como una especie de caja negra con entradas y salidas, y con una relación entre entradas y salidas que nos define el comportamiento del mismo y hemos visto un par de ejemplos en los que hemos descrito esta relación de entrada, salida, utilizando un algoritmo, utilizando un pseudocódigo.