You are on page 1of 11

..

..
..
..
..

Página Web: http://atc1.aut.uah.es/~infind
e-mail: david.jurado@uah.es
Despacho: E-232
Departamento de Automática

Práctica 1

Programación de
la E/S del PC.
.
.

.

.

.

.

.

Control de un display de
7 segmentos desde
el puerto paralelo.

Laboratorio de Informática Industrial I

.

.

.

El aspecto del display podría ser el siguiente: a a Vcc f b f Vcc b g g e e d c c pd pd d Las patillas no tienen por qué coincidir de un fabricante a otro por lo que es fundamental identificarlas correctamente antes de hacer cualquier montaje. Se concede permiso para copiar. Una copia de la licencia está incluida en la sección titulada GNU Free Documentation License. Descripción del Display El display de 7 segmentos es un elemento usado ampliamente en los circuitos electrónicos para mostrar información numérica. y por otro lado retomar el desarrollo de programas en C/C++ bajo Windows. En el caso de tratarse de un display en el que los LEDs están configurados en modo de ánodo común. Versión 1. distribuir y/o modificar este documento bajo los términos de la Licencia de Documentación Libre de GNU. sin Secciones Invariantes ni Textos de Cubierta Delantera ni Textos de Cubierta Trasera. Está constituido internamente por 8 diodos LED que forman el dígito. Más concretamente se deberá realizar el control de un display de 7 segmentos desde un programa de Windows a través del puerto paralelo del PC. el esquema eléctrico interno es el siguiente: Vcc a Laboratorio de Informática Industrial II b c d 2 e f g pd Dpto Automática . Objetivo Esta práctica tiene como doble objetivo conocer una de las posibilidades de acceso a dispositivos electrónicos básicos desde el PC.Acceso directo al Hardware en Windows 2000/XP Copyright ©2006 David Jurado González. Con esto se persigue presentar una introducción al control de dispositivos electrónicos sencillos a través del ordenador personal. más un LED que hace la función de punto decimal.2 o cualquier otra versión posterior publicada por la Free Software Foundation.

La tensión V típica está comprendida entre 1 y 1. en el que también están presentes varias líneas de masa. Con esto podremos encender los LEDs llevando uno de los terminales de la resistencia a masa. por tanto. La siguiente figura muestra el circuito necesario para que el display muestre el número 7: Vcc a b c d e f g pd 330 330 Vcc quedaría: Si el display fuera de cátodo común la excitación se realizaría usando lógica positiva y el circuito Vcc Vcc Vcc 330 330 a b c d e f g pd La excitación de los LEDs la realizaremos directamente desde los terminales de datos del puerto paralelo del PC. la resistencia que se acople en serie debe ser aproximadamente de 330 . Pines del puerto paralelo La siguiente figura muestra los pines del puerto paralelo. Práctica 2 3 Acceso a dispositivos . Ya qua la intensidad de funcionamiento está comprendida entre 10mA y 15mA. usaremos 8 resistencias de 330Ω en serie con los LEDs tal como aparecen en las figuras. habría que aplicarles Vcc.5 V. Los de datos corresponden al rango de patillas 2 a 9. lo que obliga a tener que usar la configuración del display en cátodo común si no contamos con fuente de alimentación externa.5V y 4V a su cátodo. para que luzca un LED. tendremos que aplicarle entre 3.Para excitarlos es necesario aplicar una tensión inferior a Vcc en los cátodos correspondientes a cada segmento. si hacemos Vcc = 5V. Como única medida de limitación de intensidad. Para que no luzcan. o bien dejarlos en alta impedancia. Lamentablemente no se puede obtener directamente la tensión Vcc de ninguna de las líneas del cable.

Byte de datos 13 12 25 S7 11 24 S6 10 23 S5 D7 D6 D5 D4 D3 D2 D1 D0 9 8 7 6 5 4 3 2 22 S4 21 20 19 18 17 16 1 15 14 S3 Byte de estado C3 C2 C1 C0 Byte de control Vista de la base del interfaz paralelo centronics desde el conector hembra del PC. La topología del cable es la siguiente: Byte de datos 1 D0 D1 D2 D3 D4 D5 D6 D7 2 3 4 5 6 7 8 9 14 15 16 17 18 19 20 21 10 22 11 23 12 24 13 25 Hilo Rojo Masa 14 15 16 17 18 19 20 21 22 23 24 25 1 3 5 7 9 10 11 12 2 4 6 8 13 Datos Vista de la base del interfaz paralelo centronics desde el conector macho del cable. Para mayor comodidad contaremos con un cable plano extensor del puerto que podremos conectar directamente a una placa entrenadora de circuitos electrónicos a través de un conector de inserción de zócalo DIP. Laboratorio de Informática Industrial II 4 Dpto Automática .

interfaz con el compilador. En esta primera práctica usaremos MinGW. Existen principalmente dos conversiones a Windows de este compilador: Gygwin y MinGW. * Como es sabido. cuyo objetivo es conseguir la uniformidad entre diferentes Sistemas Operativos. Notas: * Las siglas POSIX hacen referencia a una especificación de bibliotecas de programación. y otras aplicaciones asociadas. se asume que también es capaz de compilar programas escritos en C puro.. administración de recursos. etc. pero debido a la incorporación de una numerosa cantidad de herramientas auxiliares. Cualquier editor de texto ASCII-ANSI-UTF8 es válido para escribir los programas. búsqueda avanzada de código. y además a algunos antiguos. que nos dan facilidades a la hora de mantener un proyecto de programación. depuración. dada su compatibilidad hacia atrás. MinGW es una implementación minimalista del conjunto de herramientas GNU sobre plataforma Windows (Minimalist GNU for Windows). gcc ha sido portado a la práctica totalidad de sistemas de desarrollo modernos. el significado cambia al de GNU Compiler Collection. e incorpora extensiones propias. como es el caso de la adaptación para el microcontrolador 68HC11 de Motorola. lo que entre otras cosas conseguía una gran integración con el Sistema Operativo. En un principio utilizaba la biblioteca de C de tiempo de ejecución de Microsoft. y además incluye varias bibliotecas de funciones portadas del proyecto GNU entre las que cabe destacar Glibc. Cygwin es una solución muy completa que incluye además un gran soporte de compatibilidad con POSIX en Windows. en las que se incluye la posibilidad de desarrollo cruzado. Incorpora casi todas las órdenes típicas de línea de comandos de un sistema UNIX.. y se empleen funciones nativas Win32 ó Win64 en su lugar. además de gcc existe una gran cantidad de compiladores comerciales de C++ para Windows como Visual C++. y en diferentes lenguajes. comandos de Sistema Operativo (de línea de órdenes). La denominación gcc se debía al acrónimo GNU C Compiler. ayuda en línea. Microsoft tan solo ha portado una pequeña parte de la biblioteca de funciones POSIX para el trabajo con sus compiladores de C/C++. En Windows existe una gran variedad de compiladores de C++. Entornos de Desarrollo Integrado Los compiladores de C++ toman el código fuente de un archivo de texto plano. Ciñéndonos a esta especificación nuestros desarrollos serán más portables. aunque recomienda que no sea usada en la medida de lo posible. En la actualidad utiliza también las bibliotecas GNU estándar. comportamiento del sistema. Este compilador surge del proyecto GNU (acrónimo recursivo de "GNU's Not Unix") con el objetivo de tener un compilador con el que poder desarrollar un Sistema Operativo estilo UNIX de libre distribución y fuentes abiertas. El Sistema Operativo Windows en su implementación actual casi no ofrece soporte POSIX. Podemos considerar al lenguaje C++ como un súper conjunto que engloba la práctica totalidad del lenguaje C. Se trata de un compilador optimizador multiplataforma de última generación que soporta ampliamente el estándar ANSI-ISO. como son el coloreado del código. Por otra parte existen los llamados Entornos de Desarrollo Integrados (IDE). que impone una escasa sobrecarga a los programas que genera debido a la alta integración con Windows. Esto lo hacen idóneo como solución de desarrollo en aplicaciones portables entre sistemas operativos. de los que destacaremos los basados en el compilador GNU llamado gcc. Sin embargo su uso no es libre.. Compiladores de C/C++ para Windows Cuando se habla de un compilador de C++.Desarrollo de programas Windows 2000/XP en C/C++ Para desarrollar esta práctica es necesaria la configuración de un entorno de trabajo basado en el lenguaje C/C++ del que también nos serviremos para poder compilar algunos de los programas que se vayan a realizar a lo largo del curso. Práctica 2 5 Acceso a dispositivos .

que toma un programa ejecutable y ofrece un amplio abanico de posibilidades para controlar y supervisar su ejecución. La depuración que consiste en eliminar fallos de software se realiza mediante el programa gdb acrónimo de GNU debugger. La interacción con gcc y gdb que se realizara tradicionalmente con la línea de comandos queda oculta por Dev-C++. el programa almacenado en la ROM BIOS copia las direcciones I/O de los 3 primeros puertos paralelos que se detecten en las posiciones de memoria 0x00000408 y sucesivas. Acceso al puerto paralelo desde un programa en Windows Los microprocesadores x86 que incluyen los PCs permiten acceder a dispositivos de dos maneras distintas: como si se trataran de simples posiciones de memoria. Para poder conocer exactamente la posición sería preciso consultarla mediante llamadas al API (Application Programming Interface) Win32. y no a la RAM. no codificables directamente en lenguaje C. se encuentra la de depuración a nivel de código fuente. Esta forma de direccionamiento poco a poco va quedando en desuso. de los que sólo nos interesa el byte de Datos.2 para x86 al que se le ha incorporado una gran cantidad de funciones de biblioteca. el microprocesador activa una línea adicional que indica que la dirección puesta en su bus de direcciones va destinada a un dispositivo. Las direcciones de los puertos se expresan con palabras de 16 bits. o bien utilizar alguna utilidad que pase por alto esta limitación.Para esta práctica vamos a ver un sencillo IDE llamado Dev-C++ compuesto principalmente por editor de textos. Esta última se diferencia de la primera en que en el momento de acceder al dispositivo. Esta es una característica básica de los depuradores modernos. con el que interactuamos a través de una cómoda interfaz gráfica. compilador. El editor presenta coloreado de la sintaxis y funciones de autocompletar entre otras. Su objetivo último es traducir programas escritos en C/C++ a código máquina ejecutable. con la que se nos permite tener sesiones de depuración en las que contamos con el mismo código que utilizamos en la elaboración del programa. Se trata de un depurador avanzado. La versión actual del compilador es gcc 3. Estado. En el proceso de arranque del PC. aunque por simplicidad podemos verla directamente en las Propiedades del puerto de Impresora dentro del Administrador de dispositivos del sistema. y depurador que nos permitirá compilar programas de una forma rápida y cómoda. El acceso a los dispositivos de esta forma requiere instrucciones en ensamblador específicas. que es el más usado en entornos GNU. La documentación para acceder directamente al driver está en Kit de Desarrollo de Laboratorio de Informática Industrial II 6 Dpto Automática . El sistema tampoco nos dará acceso al puerto directamente por lo que es necesario hacer llamadas directamente al driver del puerto paralelo. Cada entrada de puerto paralelo estándar consta de 3 bytes consecutivos: Datos. Entre las posibilidades que ofrece. Normalmente el único puerto paralelo que se incluye se sitúa en la posición 0x0378. Se utiliza mayormente para mantener la compatibilidad con periféricos antiguos. y Control. por lo que no es posible consultar directamente dichas direcciones. o como posiciones especiales de Entrada/Salida (I/O). Windows 2000 por lo general no permite leer de posiciones de memoria absolutas que no hayan sido reservadas previamente.

Nota: Aunque WinIO soluciona un problema común para el programador de bajo nivel en Windows. Si no se encontrara presente en el sistema. es que todo está correctamente configurado. El programa debe quedar en C:\Dev-C++ o en cualquier ruta que no incluya espacios intermedios. que sólo tendría utilidad en la programación en C++. podríamos sustituir la línea por getchar(). Nos aparece un cuadro de diálogo en el que seleccionaremos proyecto de tipo consola al que damos un nombre identificativo. Se creará un archivo similar al siguiente al que habrá que comentar o eliminar la primera línea. Lo único que hace este sencillo programa es llamar a la orden PAUSE del sistema. Para poder usar WinIO copiaremos los archivos WinIo.VXD. En tales casos sería necesario ceñirse a llamadas a la función DeviceIOControl de acceso a dispositivos en Win32. seleccionamos ArchivoNuevoProyecto en el menú principal. Sin embargo tenemos otra opción que nos brindan algunos programas de uso libre basadoas en eliminar la protección de Windows haciendo uso de ciertas llamadas al sistema no documentadas. que es complicado de usar. WINIO. Además hay que indicarle al enlazador que use la biblioteca libwinio. Guardarlo dentro de una carpeta creada con igual nombre dentro de Mis documentos. Puesta a punto de un puesto de trabajo Los pasos necesarios para poder programar nuestros programas en C son los siguientes: Instalar Dev-C++ en el directorio raíz del disco duro C.Drivers (DDK) de Windows.sys. al estilo de los antiguos programas para MS-DOS.a a la carpeta del proyecto. Tal es el caso de WinIO que permite que una aplicación pueda acceder selectivamente a los recursos que necesite.a en la caja de diálogo Opciones de proyecto. char *argv[]) { system("PAUSE"). WinIo. Este modo nos permite realizar programas que utilicen la entrada/salida estándar de C con funciones como printf y scanf. y libwinio. //#include <iostream> #include <stdlib.dll. Las aplicaciones tipo consola tienen una interfaz basada en texto.h> int main(int argc. } Si podemos compilar el programa seleccionando EjecutarCompilar y ejecutar. Práctica 2 7 Acceso a dispositivos . return 0. se desaconseja su uso en aplicaciones comerciales ya que entraña cierto peligro de corrupción de datos para otras aplicaciones que intenten acceder a los mismos recursos. Para crear un nuevo proyecto. a la par que se crea una aplicación Windows nativa (posibilidad de hacer llamadas al API Win32 ó Win64).

} Laboratorio de Informática Industrial II 8 Dpto Automática . Después de llamar a InitializeWinIo. 0x0f. // se puede llamar a _inp/_outp en lugar de usar GetPortVal/SetPortVal // // 0x378 es el puerto más habitual para impresoras SetPortVal(0x378. // Esperar 3000 milisegundos SetPortVal(0x378. BYTE bPortVal. if (bResult) { // Bajo Windows NT/2000/XP.h> #include <stdio. Sleep(3000). 1). DWORD dwMemVal. PBYTE pbLinAddr.h> #define WINIO_DLL #include "winio. // Llamar a InitializeWinIo para iniciar la biblioteca WinIo. // Esperar a que se presione Enter // Cuando se termine de usar WinIo. // Escribe 0xf0 GetPortVal(0x378. (int) bPortVal). bool bResult.h" int main() { DWORD dwPortVal. // Verificar que se ha escrito printf("En el puerto hay 0x%X.\n"). getchar(). bResult = InitializeWinIo(). // Verificar que se ha escrito printf("En el puerto hay 0x%X.\n". // Escribe 0x0f GetPortVal(0x378. 0xf0. llamar a ShutdownWinIo ShutdownWinIo(). (int) bPortVal). 1).\n". HANDLE hPhysicalMemory. } return 0. (DWORD*) &bPortVal. (DWORD*) &bPortVal. 1). 1). } else { printf("Error durante el inicio de WinIo.Introducir ahora el siguiente programa: #include <windows.

Ejecuta el código hasta salir de la subrutina actual.Ejecuta paso a paso normalmente. Estrategias de depuración Los depuradores suelen implementar un conjunto de funcionalidades básicas: Práctica 2  Ejecutar la aplicación hasta el final o hasta la siguiente condición de ruptura. o Salir de subrutina. sino que lo hace de una vez. se detendrá la ejecución del mismo. Las llamadas a GetPortVal no son necesarias en este programa y sólo figuran para comprobar que se ha establecido el dato como era de esperar. ó 4. Para ello es necesario indicarle al enlazador (linker) que incorpore al ejecutable información adicional con los datos necesarios para el depurador consistentes principalmente en tablas de símbolos con equivalencias entre nombres lógicos y direcciones más offsets... La función Sleep detiene la ejecución durante el número de milisegundos que se especifique.. entraremos en la misma para seguir ejecutando sus líneas de código.. Cuando nos encontremos sobre la llamada a una subrutina de la que disponemos de su código fuente. Existen tres posibilidades básicas de ejecución paso a paso: o Paso a paso continuando por subrutinas.Las llamadas a InitializeWinIo y ShutdownWinIo sirven respectivamente para iniciar y terminar el uso de la biblioteca WinIO. Esta opción es muy útil para permitir comprobar la evolución interna del programa.  Ejecución paso a paso.Detienen la ejecución del programa en un punto determinado. o Paso a paso sin entrar en subrutinas. 9 Acceso a dispositivos . Depuración en Dev-C++ Como ejemplo vamos a realizar una sesión de depuración con este programa.  Puntos de comprobación (watchpoints). el programa escribirá 0x0f y 0xf0 en el puerto paralelo. 2. También se añade al ejecutable el código fuente de los archivos que han intervenido en la compilación del programa oal menos una referencia a los mismos. La función SetPortVal escribe datos en el puerto especificado. no la ejecuta internamente paso a paso... podremos ver que el tamaño ha aumentado considerablemente.Permite ejecutar el código línea a línea de tal forma que podamos comprobar la correcta marcha del programa. La Función GetPortVal obtiene el contenido del puerto especificado en su primer argumento copiándolo a la dirección que se le indique en su segundo argumento.Vinculan una condición bolean a una expresión del lenguaje (habitualmente una variable).  Puntos de ruptura (breakpoints). Una vez compilado. Para habilitar el depurador abrimos el diálogo ProyectoOpciones de proyectoConfiguración y seleccionamos Yes en la opción de Generar Información de Debug Tras recompilar el programa. El tercer argumento indica el número de bytes a copiar: 1. lo que nos sirve para comprobar que el circuito funciona correctamente. Cuando esa condición se cumpla.Ejecuta paso a paso normalmente pero al llegar a una llamada a subrutina.

Para que la ejecución se detenga en un punto determinado.Muestra el contenido de las variables visibles en ese momento.  Mostrar las posiciones de memoria específicas. A la izquierda de la barra aparecen los botones de ejecución paso a paso..  Inspección de expresiones. A la derecha se encuentra el botón Añadir watch que permite añadir las expresiones que señalemos a la caja central donde se mostrará el contenido de las mismas. pondremos un punto de interrupción haciendo clic sobre la banda negra en la línea donde deseemos detenerla.Muestra el resultado de evaluar expresiones sencillas relativas al programa. Para iniciar la depuración presionamos [F8] o bien el botón . por el que podremos avanzar y retroceder para conocer cuál ha sido la secuencia de llamadas hasta el punto actual.  Contenido de las variables. Laboratorio de Informática Industrial II 10 Dpto Automática . Mostrar los registros de la CPU..  Mostrar el contenido de la pila.

no lo es)..  1 Placa entrenadora de circuitos (protoboard).Proceso de desarrollo 1. Utilizando arrays y bucles según sean necesarios. 5.  Hilos eléctricos de interconexión. Una cuenta de 9 a 0 con un intervalo entre valor y valor de 250 ms. 2. Evaluación de la práctica Para el desarrollo de la práctica se tiene 2 semanas. Al menos 2 largos para conectar a la fuente de alimentación si fuera necesario (si el display es de cátodo común. Realizar un programa en C para que aparezca en el display la siguiente secuencia: a. Una ruleta que de 20 vueltas y encienda los LEDs del dígito 0 uno a uno según el sentido antihorario con un intervalo entre valor y valor de 100 ms. Identificar los terminales del display así como los del cable plano suministrado alargador del puerto paralelo (mirar en la figura).. Procurar que todas las resistencias y el CI tengan la misma orientación de lectura. pinzas. El programa en C ha de estar correctamente realizado con las líneas alineadas y con los comentarios necesarios. Comprobar que aparecen en el otro extremo del cable plano. d. Material necesario para el desarrollo de la práctica  1 Display de 7 segmentos (LEDs) de cátodo común. Práctica 2 11 Acceso a dispositivos . Una ruleta que de 20 vueltas y encienda los LEDs del dígito 0 uno a uno según el sentido horario con un intervalo entre valor y valor de 100 ms. alicates de uso electrónico. Una cuenta de 0 a 9 con un intervalo entre valor y valor de 250 ms.  Material eléctrico variado: Cortahilos. c. 4. Se entregará funcionando a la 3ª. Para esta primera práctica no se pide memoria.  8 Resistencias de 330 . Se mostrará la el circuito controlado por el PC. b. Hacerlo LO MÁS COMPACTO POSIBLE. 3. Realizar un programa básico en C que ofrezca combinaciones de tensión por los pines de datos del puerto paralelo (se puede usar el de ejemplo). Conectar el circuito completo y hacer pruebas con el programa C definitivo (hallar previamente las combinaciones de segmentos para dar los símbolos requeridos). En el display deberán aparecer los 10 dígitos decimales.. Realizar el montaje del circuito completo.