Ascensor

De UNALIX

Contenido

Simulación de ascensor controlado mediante el puerto paralelo

Trabajo final del curso arquitectura de microcomputadores - Universidad Nacional de Colombia

Imagen:Ascensor.jpg

Objetivos

General:

•Comprender, diseñar e implementar los conceptos básicos de la arquitectura de un computador mediante la programación de una interfaz, desde el punto de vista funcional, sistemas de tiempo real y el uso de lenguajes embebidos.


Específico:

•Definir un procedimiento para el manejo de puertos y el uso de C.

Desarrollo

El puerto paralelo:

La dirección base llamada BASE, puede ser: 0x378, 0x278, 0x3bc. Dependiendo del puerto a utilizar (/dev/lp0, /dev/lp1, /dev/lp2).

El puerto BASE llamado también como el Data Port controla las señales de datos D0..D7, cada señal es un bit [0,1] que corresponde a los valores de tensión 0v y +5v. Cuando escribimos en el puerto el valor se queda "congelado" el los pines D0..D7

El puerto BASE+1 llamado el Status Port el cual solo es de solo lectura, nos permite leer el estado del puerto, este puerto se compone como el anterior de 8 señales:

0 RESERVADO 1 RESERVADO 2 IRQ STATUS 3 ERROR 4 SLCT 5 PE 6 ACK 7 BUSY

Todas estas señales se reflejan en el Pin-out del conector de 25-pins. Las especificaciones de IBM dicen que los pines 1, 14, 16 y 17 las salidas de control trabajan en colector abierto.


El lenguaje C

Para enviar información al puerto paralelo, utilizando las funciones de bajo nivel para el manejo de I/O. Para utilizar las funciones de manejo de I/O mapeadas se tiene que tener en cuenta que se tiene que dar permiso a un rango de direcciones a las cuales se tiene que acceder, para ello utilizamos la funcion ioperm. No nos extrañemos si nos falla el programa y nos da un error de Permission denied eso sera por no dar permiso al I/O deseado.

El parametro rango es para indicar el rango de direcciones a dar permiso y el parametro activar 1 = Dar permiso o 0 = Quitar permiso.

         .
         .
    if(ioperm(BaseAddr,3,1)) {
       perror("Dando permisos");
       exit(1);
    }
         .
         .
    // Utilizamos el BaseAddr
         .
         .
    if(ioperm(BaseAddr,3,0)) {
       perror("Quitando permisos");
       exit(1);
    }

Una vez dado el permiso al rango de direcciones a utilizar, se podran utilizar funciones del estilo outb inb, etc ... Para poder usar estas funciones de bajo nivel se tiene que incluir el header sys/io.h y para compilar el programa utilizaremos el parametro -O2.

$ gcc -O2 -o mi_prog mi_prog.c


El puerto paralelo, a parte de controlar dispositivos estilo: impresoras, ZIP, etc ... Tambien lo podemos utilizar para nuestro proposito utilizando asi sus 8 señales de salidas para por ejemplo controlar 8 relés.

Potencia en el puerto paralelo

El puerto paralelo de un PC tiene varias salidas y entradas que funcionan a 5v. Las salidas son las que nos permitirán activar los motores, no obstante, cada salida del puerto paralelo solo puede entregar del orden de 2,6mA de corriente. Puesto que los motores que utilizamos consumen un mínimo de 60mA y un máximo de 300mA según sus hojas de especificaciones. Si se conectan los motores directamente a las salidas del puerto paralelo, los motores “pedirán” más corriente de la que pueden entregar estas salidas del puerto y “en su afán de entregar dicha corriente” se quemará el puerto paralelo. Por tanto, para poder entregar a dichos motores tal corriente, manteniendo el control, necesitamos una etapa de potencia. Una etapa de potencia es un circuito capaz de “aumentar” los 2,6mA entregados por las salidas del puerto paralelo en mucho más, para poder mover los motores.


Fue necesario usar un circuito integrado ULN2803 de esta forma:


Con este motor:

Para la interfaz gráfica se usó glade, un diseñador de interfáz gráfica, muy fácil de usar y entrega el código en C con GTK+.

-primero se hizo una interfaz sencilla con todos los parámetros necesarios para manejar un motor paso a paso:


Montaje

Materiales: Acrilico, barras de aluminio y silicona caliente:

Se trabajó para que quede de esta forma:

Y las primeras pruebas al unir la maqueta, el motor y el software:

El software tenía un problema, cuando se le ordenaba realizar una tarea (como girar 20 pasos a la derecha) se bloqueaba totalmente hasta que terminara su proceso. Esto hacía dificil la simulación, pues si alguien en el tercer piso tocaba llamaba el asensor, entonces nadie mas podia llamarlo hasta que este llegara a al tercer piso.

Este problema es debido a que el subproceso que mueve el asensor es el mismo de la GUI (interfaz gráfica de usuario), la idea inicial fue crear otro subproceso, pero luego se decidio usar un timeout que hace un llamado periodico a una función.


El display de 7 segmentos

Como se han usado 5 lineas (cables o alambres) del cable UTP (8 lineas), tenemos 3 que sobran, suficientes para contar de 1 a 5 (el número de pisos). Para mostrar el número binario o BCD en el desplay de siete segmentos se usó el circuito integrado 74LS47. Nuevamente el problema de la potencia del puerto, y pues el ULN2803 solo funciona cortandole la tierra al circuito (y se necesita +5V o 0V). Pero como con el 74LS47 al conectar una entrada (o dos), él toma el resto como si se encontraran en 5V, por lo tanto se trabajó con el inverso de cada número binario, por ej para mostrar el 8 que sería 1000, entonces la salida por el puerto es 0111.


Interfaz gráfica

Este es un pantallazo de la interfaz con la que se controla el ascensor:

Imagen:GUI_Ascensor.png

Conclusiones

  • faltan las conclusiones


Agradecimientos

  • Nerio Montoya: Por su ayuda con el motor paso a paso y su control.
  • Jorge Torres: Por la ayuda con GTK+
  • Todos los miembros de UNALIX.


Integrantes del trabajo

  • Carlos Duque.
  • David Saldaña.