COMENTARIO TECNICO Mundo EDUKIT08 Por: Ing. Roberto Simone Ingeniero de aplicaciones Freescale robertosimone@arnet.com.ar Ing. Daniel Di Lella D.F.A.E www.edudevices.com.ar dilella@arnet.com.ar (MDO_EDUKIT_013) EDU_NA005 Mouse PS/2 Emulado por el EDUKIT08... Primera Parte. E.E.T. Henry Ford Coordinador: Prof. Pablo E. Lanfranco planfranco@henryford.esc.edu.ar Alumnos: - Nicolás Antuña - Gustavo Bentancor - Sacha Landesmann - Cristian Faroppa Esta serie de artículos estará dedicada a los muy buenos proyectos realizados por las diferentes escuelas técnicas que participaron de programas de entrenamiento con el sistema didáctico EDUKIT08. En esta primera serie de artículos presentaremos el proyecto realizado por los alumnos de la Escuela Técnica Henry Ford una de las escuelas participantes de dicho programa.
Descripción: La nota de aplicación trata el Protocolo PS/2 y la Interface PS/2 para Mouse, y como utilizar un microcontrolador de la familia HC908 para emular un Mouse PS/2. El EDUKIT08 se configura para utilizar uno de los puertos de uso general (CN4), que se conectará a un ordenador (PC o Computadora Portátil) con conector para Mouse PS/2. Las rutinas cargadas en el EDUKIT08 emulan un Mouse PS/2 estándar para engañar al ordenador haciéndole creer que hay conectado un Mouse, también se posee control del cursor con los interruptores SW1 a SW4 y el botón izquierdo del Mouse emulado por el interruptor SW7 (IRQ1). Las rutinas son fácilmente adaptables a cualquier HC908. El protocolo para Mouse/Teclado PS/2 Reseña Los mouses vienen en un sinnúmero de formas y tamaños (e interfaces). El tipo más común es probablemente el mouse PS/2, sin embargo los que utilizan el puerto USB están ganando popularidad. Hace unos años, los mouses con conector para puerto serie (RS-232) fueron también muy populares, pero los fabricantes de ordenadores están abandonándolo en apoyo de los dispositivos USB y PS/2. Este documento sólo se aplica a los mouses PS/2 y no se hará referencia a lo relacionado con teclados PS/2 que comparten el mismo protocolo. Conexión Física El puerto PS/2 para ratón utiliza el conector denominado mini-din de 6 pines. El estándar DIN fue creado por la Organización de Normalización Alemana (Deutsches Institut fuer Norm). Su sitio web está en http://www.din.de (el sitio está en alemán, pero la mayoría de sus páginas también están disponibles en Inglés.). Aquí se presenta un diagrama del conector PS/2 utilizado por los mouses: Macho Hembra Mini-DIN 6 pines (PS/2): Mouse Ordenador 1 Data 2 No implementado 3 Ground 4 Vcc (+5V) 5 Clock 6 No implementado
Interface eléctrica Vcc y Ground le proveen energía al mouse, la tensión de operación puede estar entre 4,5V y 5,5V. La corriente de consumo del mouse no debe superar los 275mA y se deben evitar picos de corriente, los cuales se presentan al conectar el mouse al ordenador encendido. Originalmente el mouse PS/2 no fue diseñado para conectarse con la computadora encendida. Es decir, si se desconecta el mouse y se lo vuelve a conectar este no responderá hasta que se reinicie el ordenador. Sin embargo, se consiguen mouses que permiten esta modalidad y se auto configuran al conectarse. Las líneas Data y Clock son ambas del tipo colector abierto con resistencias a Vcc (pullup). Una interface a "colector abierto" tiene dos estados: bajo, o de alta impedancia. Esto es útil para buses que pueden llegar enviar información cruzada al mismo tiempo y podrían llegar a quemarse los buffers de las las salidas. En el estado "bajo", el transistor conecta la línea a masa (ground). En "alta impedancia", la interfaz actúa como un circuito abierto y la línea no tiene un estado alto o bajo definido, por ello la resistencia de "pullup" se encarga de llevar el estado de la línea a alto si ninguno de los dispositivos (mouse o computadora) lo tienen en bajo. El valor de esta resistencia no es muy importante (1 ~ 10 kohms), un valor más alto de resistencia disminuye el consumo de energía y uno menor disminuye el tiempo de flanco de subida. Para este caso se utiliza la siguiente interface: +5V HC908 10K 10K PORTC.2 PORTC.3 PORTC.4 1K CLOCK DATA +V PS/2 10K GND PS/2 Para lograr que un microcontrolador que no posee salidas a colector abierto funcione como tal, se puede resolver de la siguiente manera: El estado lógico del puerto debe ajustarse con valor de salida 0, y el estado en el pin se podrá controlar cambiando la configuración del puerto poniéndolo como entrada o salida. Cuando lo ponemos como salida tendremos un estado bajo, pero cuando lo configuremos como entrada el estado será llevado a alto por la resistencia de pullup.
Comunicación. Descripción General El mouse PS/2 implementa un protocolo bidireccional serie sincrónico, el bus está en reposo (idle) cuando ambas líneas están en alto. Este es el único estado donde el mouse puede enviar información al ordenador. El ordenador siempre tiene el control sobre el bus, y puede inhibir la comunicación en cualquier momento llevando la línea de Clock a un estado bajo. El mouse es el que siempre genera la señal del reloj. Si el ordenador quiere enviar datos, primero debe inhibir la comunicación llevando la línea de Clock a un estado bajo. Luego lleva la línea Data a bajo y libera a Clock (alto). Este estado se denomina Request to Send (petición de envío) y le indica al mouse que empiece a generar pulsos de reloj. Estados del bus: Data = 1, Clock = 1 : En reposo (Idle) Data = 1, Clock = 0 : Comunicación Inhibida Data = 0, Clock = 1 : Petición de envío por parte de ordenador Todos los datos son enviados de a un byte por vez en un paquete de 11 a 12 bits con el siguiente formato: - 1 bit de arranque. Siempre vale 0-8 bits de datos. El bit menos significativo primero - 1 bit de paridad (paridad impar) - 1 bit de parada. Siempre vale 1-1 bit de reconocimiento (solo cuando el ordenador envía) El bit de paridad vale 1 si el número de 1 s en el byte de datos es una cantidad par y vale 0 si la cantidad es impar. La cantidad de 1 s que hay en el byte de datos de 8 bits junto con la paridad (en total 9 bits) siempre es impar (de ahí el nombre paridad impar). Esto sirve para detección de errores en la comunicación. El mouse debe chequear este bit y si es incorrecto debe responder como si hubiera recibido un comando equivocado. Los datos enviados del mouse al ordenador son leídos en el flanco de bajada de la señal de reloj, y los datos enviados desde el ordenador deben ser leídos por el mouse en el flanco de subida. El rango de frecuencia del reloj puede ir de 10KHz a 16,7KHz. Esto quiere decir que el reloj debe estar en alto de 30 a 50 microsegundos y bajo de 30 a 50 microsegundos. Cuando el mouse envía información se recomienda hacer el cambio de estado en la línea de datos de 15 a 25 microsegundos antes de que baje el reloj, y si los datos son enviados por el ordenador, conviene leerlos de 15 a 25 microsegundos antes de que el reloj suba.
Comunicación. Mouse a Ordenador El estado del bus para que el mouse pueda enviar información debe ser el de reposo (idle), como se menciona en el apartado anterior. Si la línea Clock está en bajo, es porque el ordenador está inhibiendo la comunicación y el mouse entonces debe mantener los datos a enviar y debe esperar a que salga de ese estado para enviar la información. Clock debe estar continuamente en alto por al menos 50 microsegundos antes de que el mouse pueda comenzar a transmitir. Como se mencionó antes, el paquete de bits que será enviado al ordenador consiste en un conjunto de 11bits (1 bit de arranque, 8 bits de datos, 1 bit de paridad y 1 bit de parada). El mouse debe escribir los datos mientras la línea Clock está en alto y el ordenador los leerá mientras Clock está en bajo. La siguiente figura muestra el timing de la comunicación: El tiempo desde el flanco de subida del reloj al momento de cambiar la línea de datos debe ser al menos de 5 microsegundos, y el tiempo desde el cambio de datos al flanco de caída del reloj debe ser al menos 5 microsegundos y no más grande que 25 microsegundos. El ordenador puede inhibir la comunicación en cualquier momento poniendo en bajo la línea de Clock por al menos 100 microsegundos. Si la transmisión es inhibida antes 11avo pulso de reloj, el mouse deberá enviar nuevamente el paquete de datos completo que estaba enviando al momento de la inhibición. Esto quiere decir que si el mouse estaba enviando un paquete de tres bytes y la comunicación quedó inhibida durante el envío del tercer byte, se deberán enviar nuevamente los tres bytes. Si el ordenador inhibe la comunicación antes de la primera transición de alto a bajo de la línea de Clock o después del flanco de caída del último pulso de reloj, el mouse no deberá retransmitir ninguna información. Comunicación. Ordenador a Mouse La forma en que se envía el paquete de bits desde el ordenador al mouse es un tanto diferente al caso anterior. Si el ordenador quiere enviar datos primero debe poner el bus en el modo Request to Send (petición de envío), para ello primero debe inhibir la comunicación llevando la línea de Clock a 0 por al menos 100 microsegundos, luego lleva al bus al estado de Request to Send poniendo la línea Data en bajo y liberando la línea Clock (estado alto ).
El mouse debe chequear este estado de a intervalos que no superen los 10 milisegundos. Cuando el mouse detecte este estado comenzará a enviar pulsos de reloj. El ordenador cambia los datos cuando la línea Clock esta en bajo y el mouse los lee cuando Clock está en alto (al contrario de lo que sucedía con la comunicación Mouse a Ordenador). Después de que el bit de parada es recibido, el mouse deberá enviar un bit de reconocimiento llevando la línea Data a un estado bajo y luego generar el último pulso de reloj. Si el ordenador no libera la línea Data luego del último pulso de reloj, el mouse deberá seguir generando pulsos hasta que se libere Data, y luego se deberá comunicar el error al ordenador. El ordenador puede abortar la transmisión antes del 11avo pulso de reloj (bit de reconocimiento) llevando la línea Clock a 0 por al menos 100 microsegundos. La figura siguiente muestra el timing del bus mientras se envía información del ordenador al mouse. Observe el cambio en el timing durante el bit de reconocimiento (ACK), el mismo cambia cuando Clock está en alto y no cuando está en bajo como el resto de los bits, esto es porque ese bit lo envía el mouse. En la próxima figura puede observarse como manejan las líneas de datos y reloj, el mouse y ordenador por separado, cuando este envía un dato. Hay varios tiempos que el ordenador analiza cuando tiene que enviar un dato: a) es el tiempo que toma el mouse en empezar a generar los pulsos de reloj desde que el ordenador inicialmente inhibió la comunicación llevado Clock a un estado bajo, este tiempo no debe superar los 15ms. b) Es el tiempo que toma el paquete de bits para ser enviado, el cual no debe ser mayor a 2ms. Si alguno de estos límites de tiempo no es respetado, el ordenador generará un error. Inmediatamente después de que el bit de reconocimiento es recibido por el ordenador, este puede inhibir la comunicación para procesar la información. Si el comando enviado por el ordenador requiere una respuesta, el mouse no deberá tardar más de 20ms en responder después de que el ordenador libere el bus, si no hay respuesta del mouse, el ordenador generará un error.
Para facilitar la comprensión del protocolo de comunicación se adjuntan los siguientes diagramas de flujo:
Diagrama de flujo: Comunicación Mouse a Ordenador Inicio Libera el Bus: CLOCK=1, DATA=1 Carga en X la cant. de datos a enviar (DataSize) Clocks=10 (bit arranque + 8bits de datos + paridad) BXH=1 (bit de paridad) BXL=Dato a enviar (indexado por X) CLOCK=1 por al menos 50µs? Petición de envío? ( DATA=0?) C=0 (bit de arranque) DATA=C CLOCK=0 Espera 30µs CLOCK=1 Hay inhibición por más de 100µs? Se enviaron los 8bits de datos? Copia la paridad para enviarla. BXL=BXH Prepara el bit a ser enviado, lo almacena en C: lsr BXL Calcula la paridad y la guarda en BXH Decrementa Clocks. llegó a 0? DATA=1 (bit de parada) CLOCK=0 Espera 30µs CLOCK=1 Decrementa X llegó a 0? Se libera el BUS. CLOCK=1 DATA=1 Retorna
Diagrama de flujo: Comunicación Ordenador a Mouse Inicio Libera el Bus: CLOCK=1, DATA=1 Clocks=9 (8 bits de datos + paridad) Limpia BXL (Dato a recibir) Limpia BXH (paridad) Petición de envío? ( CLOCK=1 DATA=0?) Hay bit de parada? ( DATA=1?) DATA=0 (bit de reconocimiento) Devuelve Error (BXL=$80) Espera 30µs (bit de arranque) CLOCK=0 Espera 30µs (el ordenador fija DATA) CLOCK=1 CLOCK=0 (último pulso de reloj) Espera 30µs Libera el BUS (DATA=1, CLOCK=1) Hay inhibición por más de 100µs? Se libera DATA? ( DATA=1?) Devuelve Error (BXL=$80) y sigue enviando pulsos de reloj hasta que se libere DATA Lee el bit recibido y lo coloca en C Calcula la paridad en BXH Almacena el bit en BXL: rol BXL CLOCK=0 Carga el acumulador con el valor a devolver. A=BXL Retorna Decrementa Clocks. llegó a 0? La paridad es correcta? ( BXH=1?) Devuelve Error (BXL=$80) Espera 30µs CLOCK=1 Hay inhibición por más de 100µs? Continuará...
El lector puede encontrar este y otros artículos anteriores del Mundo EDUKIT08, así como el código de ejemplo, en el sitio web dedicado a la educación y al kit didáctico y sus programas de ejemplo: http://www.edudevices.com.ar/articulos_edukit.htm Solicite información en: EduDevices. www.edudevices.com.ar e-mail: info@edudevices.com.ar