Está en la página 1de 11

..

..
..
..
..

Pgina Web: http://atc1.aut.uah.es/~infind


e-mail: david.jurado@uah.es
Despacho: E-232
Departamento de Automtica

Prctica 1

Programacin de
la E/S del PC.
.
.

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

Laboratorio de Informtica Industrial I

Acceso directo al Hardware en


Windows 2000/XP

Copyright 2006 David Jurado Gonzlez. Se concede permiso para copiar, distribuir y/o modificar este documento bajo los
trminos de la Licencia de Documentacin Libre de GNU, Versin 1.2 o cualquier otra versin posterior publicada por la Free
Software Foundation; sin Secciones Invariantes ni Textos de Cubierta Delantera ni Textos de Cubierta Trasera. Una copia de la
licencia est incluida en la seccin titulada GNU Free Documentation License.

Objetivo
Esta prctica tiene como doble objetivo conocer una de las posibilidades de acceso a
dispositivos electrnicos bsicos desde el PC, y por otro lado retomar el desarrollo de programas en
C/C++ bajo Windows. Con esto se persigue presentar una introduccin al control de dispositivos
electrnicos sencillos a travs del ordenador personal.
Ms concretamente se deber realizar el control de un display de 7 segmentos desde un
programa de Windows a travs del puerto paralelo del PC.

Descripcin del Display


El display de 7 segmentos es un elemento usado ampliamente en los circuitos
electrnicos para mostrar informacin numrica. Est constituido internamente por 8 diodos LED
que forman el dgito, ms un LED que hace la funcin de punto decimal.
El aspecto del display podra ser el siguiente:

Vcc

b
f

Vcc

b
g
g

e
e

c
pd

pd

Las patillas no tienen por qu coincidir de un fabricante a otro por lo que es fundamental
identificarlas correctamente antes de hacer cualquier montaje.
En el caso de tratarse de un display en el que los LEDs estn configurados en modo de nodo
comn, el esquema elctrico interno es el siguiente:

Vcc

Laboratorio de Informtica Industrial II

pd

Dpto Automtica

Para excitarlos es necesario aplicar una tensin inferior a Vcc en los ctodos correspondientes a
cada segmento.
La tensin V tpica est comprendida entre 1 y 1,5 V, por tanto, si hacemos Vcc = 5V, para que
luzca un LED, tendremos que aplicarle entre 3,5V y 4V a su ctodo. Para que no luzcan, habra que
aplicarles Vcc, o bien dejarlos en alta impedancia.
Ya qua la intensidad de funcionamiento est comprendida entre 10mA y 15mA, la resistencia
que se acople en serie debe ser aproximadamente de 330 . Con esto podremos encender los LEDs
llevando uno de los terminales de la resistencia a masa. La siguiente figura muestra el circuito necesario
para que el display muestre el nmero 7:

Vcc

pd

330

330

Vcc
quedara:

Si el display fuera de ctodo comn la excitacin se realizara usando lgica positiva y el circuito

Vcc

Vcc

Vcc

330

330

pd

La excitacin de los LEDs la realizaremos directamente desde los terminales de datos del puerto
paralelo del PC, en el que tambin estn presentes varias lneas de masa. Lamentablemente no se puede
obtener directamente la tensin Vcc de ninguna de las lneas del cable, lo que obliga a tener que usar la
configuracin del display en ctodo comn si no contamos con fuente de alimentacin externa. Como
nica medida de limitacin de intensidad, usaremos 8 resistencias de 330 en serie con los LEDs tal como
aparecen en las figuras.

Pines del puerto paralelo


La siguiente figura muestra los pines del puerto paralelo. Los de datos corresponden al rango de
patillas 2 a 9.

Prctica 2

Acceso a dispositivos

Byte de datos

13

12
25

S7

11
24

S6

10
23

S5

D7

D6

D5

D4

D3

D2

D1

D0

22

S4

21

20

19

18

17

16

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.

Para mayor comodidad contaremos con un cable plano extensor del puerto que podremos
conectar directamente a una placa entrenadora de circuitos electrnicos a travs de un conector de
insercin de zcalo DIP. La topologa del cable es la siguiente:
Byte de datos

D0

D1

D2

D3

D4

D5

D6

D7

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

10

11 12

13

Datos
Vista de la base del interfaz paralelo centronics desde el conector macho del cable.

Laboratorio de Informtica Industrial II

Dpto Automtica

Desarrollo de programas Windows 2000/XP en C/C++


Para desarrollar esta prctica es necesaria la configuracin de un entorno de trabajo basado en el
lenguaje C/C++ del que tambin nos serviremos para poder compilar algunos de los programas que se
vayan a realizar a lo largo del curso.

Compiladores de C/C++ para Windows


Cuando se habla de un compilador de C++, se asume que tambin es capaz de compilar
programas escritos en C puro, dada su compatibilidad hacia atrs. Podemos considerar al lenguaje C++
como un sper conjunto que engloba la prctica totalidad del lenguaje C.
En Windows existe una gran variedad de compiladores de C++, de los que destacaremos los
basados en el compilador GNU llamado gcc. Este compilador surge del proyecto GNU (acrnimo
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 distribucin y fuentes abiertas, y otras aplicaciones asociadas. La
denominacin gcc se deba al acrnimo GNU C Compiler, pero debido a la incorporacin de una numerosa
cantidad de herramientas auxiliares, en las que se incluye la posibilidad de desarrollo cruzado, y en
diferentes lenguajes, el significado cambia al de GNU Compiler Collection. Se trata de un compilador
optimizador multiplataforma de ltima generacin que soporta ampliamente el estndar ANSI-ISO, e
incorpora extensiones propias. gcc ha sido portado a la prctica totalidad de sistemas de desarrollo
modernos, y adems a algunos antiguos, como es el caso de la adaptacin para el microcontrolador
68HC11 de Motorola.
Existen principalmente dos conversiones a Windows de este compilador: Gygwin y MinGW.
Cygwin es una solucin muy completa que incluye adems un gran soporte de compatibilidad
con POSIX en Windows. Incorpora casi todas las rdenes tpicas de lnea de comandos de un sistema
UNIX, y adems incluye varias bibliotecas de funciones portadas del proyecto GNU entre las que cabe
destacar Glibc. Esto lo hacen idneo como solucin de desarrollo en aplicaciones portables entre sistemas
operativos.
MinGW es una implementacin minimalista del conjunto de herramientas GNU sobre
plataforma Windows (Minimalist GNU for Windows). En un principio utilizaba la biblioteca de C de tiempo
de ejecucin de Microsoft, lo que entre otras cosas consegua una gran integracin con el Sistema
Operativo. En la actualidad utiliza tambin las bibliotecas GNU estndar.
En esta primera prctica usaremos MinGW, que impone una escasa sobrecarga a los programas
que genera debido a la alta integracin con Windows.
Notas:
* Las siglas POSIX hacen referencia a una especificacin de bibliotecas de programacin,
comandos de Sistema Operativo (de lnea de rdenes), comportamiento del sistema,... cuyo
objetivo es conseguir la uniformidad entre diferentes Sistemas Operativos. Cindonos a
esta especificacin nuestros desarrollos sern ms portables.
El Sistema Operativo Windows en su implementacin actual casi no ofrece soporte POSIX.
Microsoft tan solo ha portado una pequea parte de la biblioteca de funciones POSIX para
el trabajo con sus compiladores de C/C++, aunque recomienda que no sea usada en la
medida de lo posible, y se empleen funciones nativas Win32 Win64 en su lugar.
* Como es sabido, adems de gcc existe una gran cantidad de compiladores comerciales de
C++ para Windows como Visual C++. Sin embargo su uso no es libre.

Entornos de Desarrollo Integrado


Los compiladores de C++ toman el cdigo fuente de un archivo de texto plano. Cualquier
editor de texto ASCII-ANSI-UTF8 es vlido para escribir los programas. Por otra parte existen los
llamados Entornos de Desarrollo Integrados (IDE), que nos dan facilidades a la hora de mantener un
proyecto de programacin, como son el coloreado del cdigo, ayuda en lnea, administracin de recursos,
depuracin, bsqueda avanzada de cdigo, interfaz con el compilador, etc.

Prctica 2

Acceso a dispositivos

Para esta prctica vamos a ver un sencillo IDE llamado Dev-C++ compuesto principalmente
por editor de textos, compilador, y depurador que nos permitir compilar programas de una forma rpida
y cmoda.
El editor presenta coloreado de la sintaxis y funciones de autocompletar entre otras.
La versin actual del compilador es gcc 3.2 para x86 al que se le ha incorporado una gran
cantidad de funciones de biblioteca. Su objetivo ltimo es traducir programas escritos en C/C++ a cdigo
mquina ejecutable.
La depuracin que consiste en eliminar fallos de software se realiza mediante el programa gdb
acrnimo de GNU debugger, que es el ms usado en entornos GNU. Se trata de un depurador avanzado,
que toma un programa ejecutable y ofrece un amplio abanico de posibilidades para controlar y supervisar
su ejecucin. Entre las posibilidades que ofrece, se encuentra la de depuracin a nivel de cdigo fuente,
con la que se nos permite tener sesiones de depuracin en las que contamos con el mismo cdigo que
utilizamos en la elaboracin del programa. Esta es una caracterstica bsica de los depuradores modernos.
La interaccin con gcc y gdb que se realizara tradicionalmente con la lnea de comandos queda
oculta por Dev-C++, con el que interactuamos a travs de una cmoda interfaz grfica.

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, o como posiciones especiales de
Entrada/Salida (I/O). Esta ltima se diferencia de la primera en que en el momento de acceder al
dispositivo, el microprocesador activa una lnea adicional que indica que la direccin puesta en su bus de
direcciones va destinada a un dispositivo, y no a la RAM. El acceso a los dispositivos de esta forma
requiere instrucciones en ensamblador especficas, no codificables directamente en lenguaje C. Las
direcciones de los puertos se expresan con palabras de 16 bits. Esta forma de direccionamiento poco a
poco va quedando en desuso. Se utiliza mayormente para mantener la compatibilidad con perifricos
antiguos.
En el proceso de arranque del PC, 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. Windows 2000 por lo general no permite leer de posiciones de memoria
absolutas que no hayan sido reservadas previamente, por lo que no es posible consultar directamente
dichas direcciones. Para poder conocer exactamente la posicin sera preciso consultarla mediante
llamadas al API (Application Programming Interface) Win32, aunque por simplicidad podemos verla
directamente en las Propiedades del puerto de Impresora dentro del Administrador de dispositivos del sistema.

Normalmente el nico puerto paralelo que se incluye se sita en la posicin 0x0378. Cada
entrada de puerto paralelo estndar consta de 3 bytes consecutivos: Datos, Estado, y Control, de los que slo
nos interesa el byte de Datos. El sistema tampoco nos dar acceso al puerto directamente por lo que es
necesario hacer llamadas directamente al driver del puerto paralelo, o bien utilizar alguna utilidad que pase
por alto esta limitacin. La documentacin para acceder directamente al driver est en Kit de Desarrollo de
Laboratorio de Informtica Industrial II

Dpto Automtica

Drivers (DDK) de Windows, que es complicado de usar. Sin embargo tenemos otra opcin que nos
brindan algunos programas de uso libre basadoas en eliminar la proteccin de Windows haciendo uso de
ciertas llamadas al sistema no documentadas. Tal es el caso de WinIO que permite que una aplicacin
pueda acceder selectivamente a los recursos que necesite.
Nota: Aunque WinIO soluciona un problema comn para el programador de bajo nivel en Windows, se
desaconseja su uso en aplicaciones comerciales ya que entraa cierto peligro de corrupcin de datos para otras aplicaciones que
intenten acceder a los mismos recursos. En tales casos sera necesario ceirse a llamadas a la funcin DeviceIOControl de
acceso a dispositivos en Win32.

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 raz del disco duro C. El programa debe quedar en
C:\Dev-C++ o en cualquier ruta que no incluya espacios intermedios.
Para crear un nuevo proyecto, seleccionamos ArchivoNuevoProyecto en el men principal.
Nos aparece un cuadro de dilogo en el que seleccionaremos proyecto de tipo consola al que
damos un nombre identificativo.

Guardarlo dentro de una carpeta creada con igual nombre dentro de Mis documentos.
Se crear un archivo similar al siguiente al que habr que comentar o eliminar la primera lnea,
que slo tendra utilidad en la programacin en C++.
//#include <iostream>
#include <stdlib.h>
int main(int argc, char *argv[])
{
system("PAUSE");
return 0;
}

Si podemos compilar el programa seleccionando EjecutarCompilar y ejecutar, es que todo est


correctamente configurado. Lo nico que hace este sencillo programa es llamar a la orden PAUSE del
sistema. Si no se encontrara presente en el sistema, podramos sustituir la lnea por getchar().
Las aplicaciones tipo consola tienen una interfaz basada en texto, al estilo de los antiguos
programas para MS-DOS. Este modo nos permite realizar programas que utilicen la entrada/salida
estndar de C con funciones como printf y scanf, a la par que se crea una aplicacin Windows nativa
(posibilidad de hacer llamadas al API Win32 Win64).
Para poder usar WinIO copiaremos los archivos WinIo.sys, WINIO.VXD, WinIo.dll, y
libwinio.a a la carpeta del proyecto. Adems hay que indicarle al enlazador que use la biblioteca
libwinio.a en la caja de dilogo Opciones de proyecto.

Prctica 2

Acceso a dispositivos

Introducir ahora el siguiente programa:


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

Dpto Automtica

Las llamadas a InitializeWinIo y ShutdownWinIo sirven respectivamente para iniciar y


terminar el uso de la biblioteca WinIO. La Funcin GetPortVal obtiene el contenido del puerto
especificado en su primer argumento copindolo a la direccin que se le indique en su segundo
argumento. El tercer argumento indica el nmero de bytes a copiar: 1, 2, 4. La funcin SetPortVal
escribe datos en el puerto especificado. La funcin Sleep detiene la ejecucin durante el nmero de
milisegundos que se especifique.
Una vez compilado, el programa escribir 0x0f y 0xf0 en el puerto paralelo, lo que nos sirve para
comprobar que el circuito funciona correctamente. Las llamadas a GetPortVal no son necesarias en este
programa y slo figuran para comprobar que se ha establecido el dato como era de esperar.

Depuracin en Dev-C++
Como ejemplo vamos a realizar una sesin de depuracin con este programa. Para ello es
necesario indicarle al enlazador (linker) que incorpore al ejecutable informacin adicional con los datos
necesarios para el depurador consistentes principalmente en tablas de smbolos con equivalencias entre
nombres lgicos y direcciones ms offsets. Tambin se aade al ejecutable el cdigo fuente de los archivos
que han intervenido en la compilacin del programa oal menos una referencia a los mismos.
Para habilitar el depurador abrimos el dilogo ProyectoOpciones de proyectoConfiguracin y
seleccionamos Yes en la opcin de Generar Informacin de Debug

Tras recompilar el programa, podremos ver que el tamao ha aumentado considerablemente.

Estrategias de depuracin
Los depuradores suelen implementar un conjunto de funcionalidades bsicas:

Prctica 2

Ejecutar la aplicacin hasta el final o hasta la siguiente condicin de ruptura.

Puntos de ruptura (breakpoints).- Detienen la ejecucin del programa en un punto


determinado. Esta opcin es muy til para permitir comprobar la evolucin interna del
programa.

Puntos de comprobacin (watchpoints).- Vinculan una condicin bolean a una expresin


del lenguaje (habitualmente una variable). Cuando esa condicin se cumpla, se detendr
la ejecucin del mismo.

Ejecucin paso a paso.- Permite ejecutar el cdigo lnea a lnea de tal forma que
podamos comprobar la correcta marcha del programa. Existen tres posibilidades bsicas
de ejecucin paso a paso:
o Paso a paso continuando por subrutinas.- Ejecuta paso a paso normalmente.
Cuando nos encontremos sobre la llamada a una subrutina de la que
disponemos de su cdigo fuente, entraremos en la misma para seguir
ejecutando sus lneas de cdigo.
o Paso a paso sin entrar en subrutinas.- Ejecuta paso a paso normalmente pero al
llegar a una llamada a subrutina, no la ejecuta internamente paso a paso, sino
que lo hace de una vez.
o Salir de subrutina.- Ejecuta el cdigo hasta salir de la subrutina actual.
9

Acceso a dispositivos

Mostrar los registros de la CPU.

Mostrar las posiciones de memoria especficas.

Mostrar el contenido de la pila, por el que podremos avanzar y retroceder para conocer
cul ha sido la secuencia de llamadas hasta el punto actual.

Inspeccin de expresiones.- Muestra el resultado de evaluar expresiones sencillas


relativas al programa.

Contenido de las variables.- Muestra el contenido de las variables visibles en ese


momento.
Para que la ejecucin se detenga en un punto determinado, pondremos un punto de
interrupcin haciendo clic sobre la banda negra en la lnea donde deseemos detenerla.

Para iniciar la depuracin presionamos [F8] o bien el botn

A la izquierda de la barra aparecen los botones de ejecucin paso a paso. A la derecha se


encuentra el botn Aadir watch que permite aadir las expresiones que sealemos a la caja central donde
se mostrar el contenido de las mismas.

Laboratorio de Informtica Industrial II

10

Dpto Automtica

Proceso de desarrollo
1. Identificar los terminales del display as como los del cable plano suministrado alargador del puerto
paralelo (mirar en la figura).
2. Realizar el montaje del circuito completo. Procurar que todas las resistencias y el CI tengan la misma
orientacin de lectura.
3. Realizar un programa bsico en C que ofrezca combinaciones de tensin por los pines de datos del
puerto paralelo (se puede usar el de ejemplo). Comprobar que aparecen en el otro extremo del cable
plano.
4. Realizar un programa en C para que aparezca en el display la siguiente secuencia:
a. Una cuenta de 0 a 9 con un intervalo entre valor y valor de 250 ms.
b. Una ruleta que de 20 vueltas y encienda los LEDs del dgito 0 uno a uno segn el sentido
horario con un intervalo entre valor y valor de 100 ms.
c. Una ruleta que de 20 vueltas y encienda los LEDs del dgito 0 uno a uno segn el sentido
antihorario con un intervalo entre valor y valor de 100 ms.
d. Una cuenta de 9 a 0 con un intervalo entre valor y valor de 250 ms.
5. Conectar el circuito completo y hacer pruebas con el programa C definitivo (hallar previamente las
combinaciones de segmentos para dar los smbolos requeridos).

Evaluacin de la prctica
Para el desarrollo de la prctica se tiene 2 semanas. Se entregar funcionando a la 3.
Se mostrar la el circuito controlado por el PC. En el display debern aparecer los 10 dgitos
decimales.
El programa en C ha de estar correctamente realizado con las lneas alineadas y con los
comentarios necesarios. Hacerlo LO MS COMPACTO POSIBLE. Utilizando arrays y bucles segn sean
necesarios.
Para esta primera prctica no se pide memoria.

Material necesario para el desarrollo de la prctica

1 Display de 7 segmentos (LEDs) de ctodo comn.

8 Resistencias de 330 .

1 Placa entrenadora de circuitos (protoboard).

Hilos elctricos de interconexin. Al menos 2 largos para conectar a la


fuente de alimentacin si fuera necesario (si el display es de ctodo comn, no lo es).

Material elctrico variado: Cortahilos, pinzas, alicates de uso electrnico,...

Prctica 2

11

Acceso a dispositivos