DESARROLLO E IMPLEMENTACIÓN DE UN TELÉFONO DE TEXTO PARA LA COMUNICACIÓN ENTRE PERSONAS NO OYENTES UNIVERSIDAD DEL VALLE DE GUATEMALA Facultad de Ciencias y Humanidades Departamento de Ingeniería Electrónica DESARROLLO E IMPLEMENTACIÓN DE UN TELÉFONO DE TEXTO PARA LA COMUNICACIÓN ENTRE PERSONAS NO OYENTES UMVEIMAL Da VALLE &E GLIPaAll TRABAJO DE GRADUACIÓN PRESENTADO PARA OPTAR AL TÍTULO DE LICENCIADO EN INGENIERÍA ELECTRÓNICA CARLOS MANUEL DE LEON VALLE Guatemala 2003 Vo. Be.: Asesor Tribunal: 1̀-20,;1 ( 1 Dr. Ing. Manuel Antonio pez (O //tic, Ing. Gonzalo Antonio Palarea Murga (9 Asesor Fecha de aprobación: 16 de enero de 2004 Le dedico este trabajo de graduación a Dios, a mis papás, mis hermanos y a mi novia. ÍNDICE Página LISTA DE TABLAS vi LISTA DE FIGURAS vii RESUMEN ix Capítulos I. II. INTRODUCCIÓN ANTECEDENTES 1 3 A. Historia de 'UY 3 B. Diferentes protocolos para los teléfonos de texto 4 1. Protocolo Baudot 4 2. Otros protocolos 5 C. Modulación digital BFSK (Binary Frequency Shift Keying) 6 1. Espectro de BEISK 7 2. Receptor para señales BFSK 7 D. Teclado PS2 8 III. OBJETIVOS 11 A. Generales 11 B. Específicos 1I IV. MÉTODO DE TRABAJO 12 A. Interfase de transmisión y recepción entre persona no oyente y teléfono de texto... 12 B. Forma de transmisión del TTY 13 1. Modulación FSK 13 2. Transmisión de la señal ala línea telefónica «POTS» 14 C. Forma de recepción del TTY 16 1. Recepción de la línea de teléfono «POTS» 16 2. Demodulación FSK 17 D. Modo de operación 18 1. Recepción 18 2. Transmisión 18 3. Saludo (Handshake) 18 iv E. Circuito del teléfono de texto 20 F. Lógica del programa 21 G. Modo de implementación 29 1. Alimentación 29 2. Menú 29 3. Transmisión 29 4. Recepción 30 a. Recepción con detección de ring 31 b. Recepción sin detección de ring 32 1-1. Implementación por personas no oyentes 32 I. Costos 32 V. RESULTADOS 34 A. Generales 34 B. Específicos 34 VI. OBSERVACIONES 38 VII. CRONOGRAMA 39 FUENTES DE INFORMACIÓN 40 APÉNDICES 40 A. Código fuente del teléfono de texto 41 B. Código para teclado PS2, set 2 121 C. Encuesta a personas no oyentes que probaron los dos teléfonos de texto por una semana 123 LISTA DE TABLAS Página Tabla 1. Valores de voltaje 6 2. Pines de conector PS/2 (Mini-Din) 9 3. Estados del bus 9 4. Modulación FSK 14 5. Costos de un teléfono de texto 33 6. Velocidades de transmisión 34 7. Código (Scan Code Set 2) para teclado de 101, 102 y 104 teclas 121 vi LISTA DE FIGURAS Página Figura 1. Teléfono de texto 3 2. Espectro de la señal vámsw 7 3. Conector PS/2 (Mini-Din) macho 8 4. Conector PS/2 (Mini-Din) hembra 8 5. Líneas de reloj y de datos para comunicación de dispositivo a host 10 6. Circuito que sirve de interface para pantalla LCD, lámpara y teclado PS2 13 7. Circuito modulador de FSK con convertidor digital-analógico escalera R-2R 14 8. Circuito transmisor a línea telefónica «POTS» 15 9. Circuito de recepción 17 10. Diagrama de flujo del saludo o handshake 19 11. Circuito del teléfono de texto 20 12. Diagrama de flujo de inicialización del programa y de menú de entrada 21 13. Diagrama de flujo de la transmisión 22 14. Diagrama de flujo de la recepción con detección de ring 23 15. Diagrama de flujo de la recepción sin detección de ring 24 16. Diagrama de flujo de la conversación 24 17. Diagrama de flujo del teclado 25 18. Diagrama de flujo del VCO 26 19. Diagrama de flujo de la onda senoidal 27 20. Diagrama de flujo de la demodulación FSK 28 21. Menú que despliega la pantalla LCD 29 22. Mensaje de «LÍNEA» en la pantalla LCD 29 23. Mensaje de «OCUPADO» en la pantalla LCD 30 24. Mensaje de «CONECTANDO» en la pantalla LCD 30 25. Mensaje de «ERROR EN CONEXIÓN» en la pantalla LCD 30 26. Mensaje de «ESPERANDO LLAMADA» en la pantalla LCD 31 27. Mensaje de «RING» en la pantalla LCD 31 28. Señal modulada 35 29. Onda cuadrada que sale del circuito de recepción 36 vii 30. Señal modulada y señal demodulada que entra al puerto serial 36 viii RESUMEN El objetivo principal de este trabajo de graduación es diseñar, construir e implementar un teléfono de texto para lineas «POTS» (plain old telephone service), por el cual las personas no oyentes podrán establecer una comunicación telefónica, sin necesitar ayuda de una persona oyente y a un precio menor que los ya existentes. Todo esto se logró, mediante la transmisión por la línea telefónica «POTS» de una señal serial asíncrona, la cual utiliza una modulación y demodulación de FSK por software. El teléfono de texto diseñado tiene un costo de $82.74 y una velocidad de transmisión de 285 bits por segundo. Con esto, el usuario logra comunicarse a una velocidad máxima de 342 palabras por minuto. Además, el teléfono de texto es capaz de detectar una llamada entrante por medio del encendido y apagado de un led y una lámpara que se le conecte a éste. También, tiene la capacidad de detectar si la linea a la cual se está llamando se encuentra ocupada o no, al igual de detectar el momento en que se establece conexión con el teléfono de texto receptor. ix I. INTRODUCCIÓN Desde la invención del teléfono por Graham Bell en 1876, millones de personas han visto mejorada su calidad de vida con un servicio que, sin embargo, ha permanecido inaccesible para el colectivo de personas no oyentes hasta que se desarrollaron los primeros teléfonos de texto. Estas terminales posibilitan la comunicación a través de un intercambio de caracteres en tiempo real, sustituyendo los dispositivos de habla y de escucha de una terminal telefónica convencional, por un teclado y una pantalla que permiten al usuario escribir la frase que desea enviar a su interlocutor, y leer lo que éste responde. Estos teléfonos de texto, mejor conocidos como TTY (teletypewriters), han venido evolucionando con el paso del tiempo, logrando así, la comunicación telefónica de personas no oyentes en los países desarrollados. El problema con estos teléfonos de texto cs que su costo es muy elevado y que la interfase con la persona no oyente depende del modelo de teléfono y del país en que se adquiera, pues en Estados Unidos ni siquiera se utiliza el mismo protocolo que en Europa. Asimismo, estos no detectan si está ocupada la otra línea o no, además de no detectar el momento en que se establece conexión. De igual forma, para un país subdesarrollado como Guatemala, estos teléfonos están prácticamente fuera del alcance de las personas no oyentes, pues sus precios son elevados y no se encuentran disponibles en el mercado. El objetivo del proyecto en que se enmarca el presente trabajo de graduación es crear un teléfono de texto a un costo menor que los teléfonos de texto actuales, así como lograr la comunicación inasistida entre personas no oyentes. Esto se logrará al diseñar, construir e implementar un teléfono de texto, por el cual personas no oyentes podrán establecer una comunicación telefónica completa, sin necesitar de alguna ayuda de una persona oyente. Este teléfono de texto tendrá como interfase con el usuario un teclado PS2 y una pantalla LCD de 80 caracteres. Mediante el uso del teclado, el usuario podrá ingresar su conversación y por medio de la pantalla, el usuario podrá leer tanto lo que él escribe como lo que le escribe su interlocutor. Además, el TTY (se refiere al teléfono de texto) tendrá dos modos de implementación: de transmisión y de recepción. Al encontrarse en transmisión, el usuario sabrá si la línea está ocupada o no, además de poder reconocer el momento en que se establece conexión con otro TTY. Cuando el teléfono de texto se encuentre en recepción, éste prenderá y apagará una luz constantemente cuando se detecta una llamada entrante. Además, el usuario también podrá reconocer el momento en que se establece conexión con el TTY transmisor. La forma de modulación y demodulación a utilizar será de FSK (fi-equency shift keying), la cual utilizará dos señales de distintas frecuencias para la transmisión de datos por la línea de teléfono «POTS». La 2 modulación y la demodulación de los datos se realizarán por software, mediante la utilización de un microcontrolador PIC16F877. II. ANTECEDENTES A. Historia de TTY El teléfono de texto, conocido en la comunidad no oyente como TTY, fue desarrollado por un físico no oyente, el Dr. Robert Weitbrecht, a mediados de 1960, basado en la tecnología de teletipo, «teletype» ya existente. Usada para la transmisión de telegramas y usos militares. La red de TTY creció dentro de la comunidad no oyente porque la tecnología, aunque antigua y lenta, es confiable y trabaja bien en un ambiente de voces. Desafortunadamente, el TTY utiliza un código, frecuencia y velocidad de transmisión de datos diferente de los utilizados por las computadoras. Figura 1. Teléfono de texto En Europa, el teléfono de texto se desarrolló después que en Estados Unidos. A diferencia de los Estados Unidos, la telefonía de texto tendió a desarrollarse por medio del diseño y decreto de las autoridades centrales de varios países europeos. Como resultado, existen varios tipos diferentes de protocolos usados para los teléfonos TTY, los que son incompatibles. Las personas que utilizan el TTY no tienen el alto nivel de conectividad que las personas que utilizan comunicación por voz: ellos no pueden llamar a otros teléfonos de texto en otros paises. Dick Brandt, un experto en comunicaciones, miembro de varios grupos de estándares, se interesó en este problema cuando empezó a consultar con el Programa de Gravamen de Tecnología y cómo mejorar los estándares de TTY americanos en una forma tal que se mejorara el trabajo entre TTY y computadores. Brandt reconoció inmediatamente la necesidad de una especificación internacional que llevara a la inclusión de los protocolos de TTY en los formas de datos convencionales. Brandt desarrolló un esquema de interconexión que permite que un modem convencional se comunique con varios protocolos TTY, y este esquema, ahora estandarizado como V.18, fue el último 3 4 estudio aprobado por el Grupo de Estudio 14 de la Oficina Internacional de la Unión y Estandarización de Telecomunicaciones (CCITT). El desarrollo del V.18 fue asistido con el diseno y especificación del Programa de Gravamen de Tecnología de la Universidad de Gallaudet, con inversiones de fabricantes americanos de teléfonos TTY y la asistencia de investigadores europeos. El grupo de Consumidores de Telecomunicaciones para los Sordos Inc. copatrocinó las reuniones americanas para discutir el desarrollo del V.I8. El trabajo de Gallaudet fue patrocinado por el Departamento de Educación/NIDDR de los Estados Unidos al crear un Centro de Rehabilitación de Ingeniería e Investigación en Realce de Audición y Dispositivos de Asistencia. La ITU recomienda la interconexión del V.18 con los siguientes protocolos de TTY: Baudot @ 45 45 baud (TTY de Estados Unidos) Baudot @ 50 baud (usado en Inglaterra, Australia, y y Sudáfrica, también conocido como Baudot internacional) V.21/Bell 103/versión de teléfono de texto (usado en Suecia, Noruega y Finlandia). DTMF (usado en Dinamarca, Holanda y otros países) EDT (Teléfono de Sordos Europeo, «European Deaf Telephone», usado en Alemania, Austria, Suiza y otros países) Las llamadas con teléfonos de texto son llamadas silenciosas cuando son contestadas. Los usuarios tienen que presionar alguna tecla para llamadas salientes para que sepan que es una llamada TTY. Además, los TTY tienen dos modos de conexión. La mayormente usada es la conexión por acoplamiento acústico. El otro tipo es la conexión directa. B. Diferentes protocolos para los teléfonos de texto 1. Protocolo Baudot. Este protocolo es el más usado y el más antiguo. Es un protocolo asíncrono half dupla, el cual utiliza dos frecuencias: 1400 Hz y 1800 Hz. No requiere un «handshake» para establecer conexión entre los dos TTY. No utiliza código ASCII. Usa un código que tiene dos sets de caracteres: letras y figuras. Soporta un total de 60 caracteres que incluyen del O al 9, sólo mayúsculas de la A a la Z y otros caracteres especiales. No posee corrección de errores. Además, utiliza 1 bit de inicio, «start bit», 5 bits de datos y 1 bit de fin, «stop bit». Existen dos tipos de protocolo Baudot. Se encuentra el Baudot @ 45.45 baud, el cual tiene una velocidad de transmisión de 45 bits por segundo y es usado en Estados Unidos y Canadá, y el Baudot @ 50 5 baud, también conocido como Baudot internacional. Éste tiene una velocidad de transmisión de 50 bits por segundo, usado en Inglaterra, Australia y Sudáfrica. Estos dos protocolos tienen que tener una tolerancia para mandar datos del 1% y para recibir del 5%. 2. Otros protocolos. El protocolo que salió como mejora del Baudot es el Turbo Code. Éste manda 7 bits de datos en lugar de 5 bits, como era el caso del Baudot. El Turbo Code fue creado por Ultratec, compañía que hace teléfonos de texto. Éste le permite escribir a la persona a una velocidad alrededor de 100 palabras por minuto pues tiene una velocidad de transmisión de 110 baudios (bits por segundo). Éste utiliza en su protocolo un interrupto, con el que una persona puede interrumpir a otra cuando está escribiendo. Además, es un protocolo half duplex y solo los modelos nuevos de TTY de Ultratec lo tienen. Otro protocolo que existe es el Bell 103, también llamado ASCII Code. Éste es similar al estándar internacional V.21 pero utiliza diferentes frecuencias. Éste puede serjull duplex o hall- duplex, por lo que utiliza dos canales y 4 frecuencias. Tiene una velocidad de transmisión de 110 bits por segundo o de 300 bits por segundo. Éste utiliza 8 o 7 bits de datos, además de 1 bit de control de paridad. No es muy popular entre los usuarios, debido a su dificultad de configuración y a que el costo de los TTY que traen este protocolo es más elevado. Antes de poder realizar una llamada usando Bell 103, hay que configurar si el TTY es origen o destino (se va a realizar llamada o a contestarla) y si se va a utilizar 110 bps o 300 bps como velocidad de transmisión. Además, hay que configurar si se va a utilizar 8 bits de datos o 7 bits de datos, así como si se utilizará paridad impar o par. El protocolo EDT (European Deaf Telephone) usa la modulación de la norma V.2I pero con un sólo canal, lo que quiere decir que es hall. duplex. La velocidad de transmisión es de 110 bits por segundo. Se usa principalmente en Alemania, Suiza, Austria, Italia, España, Malta y algunos otros países. En Francia y en Bélgica se utiliza el protocolo Minitel V.23. Éste es una versión especial, llamada Minitel Dialogue, que ofrece un terminal Minitel Videotex. Este protocolo utiliza un módem V.23 estándar. Además, en Finlandia, Suecia y Noruega se utiliza el protocolo V.21 Nórdico. En éste, los datos son enviados con una modulación de acuerdo con la norma V.21 y a 300 bits por segundo. El protocolo de comunicación que se utiliza en Holanda y en Dinamarca es el DTMF. Éste está basado en las mismas combinaciones tonales que utilizan los teléfonos convencionales para marcación. Utiliza combinaciones de 1 hasta 4 caracteres tonales para poder representar alfabetos enteros. Por la diversa cantidad de protocolos TTY, se estableció recientemente el estándar V.I8 como se mencionó anteriormente. Éste soporta los protocolos DTMF, EDT, V.21 y V.23, usados en Europa, así 6 como el Baudot usado en Estados Unidos. Este estándar fue desarrollado con la ayuda de organizaciones para no oyentes, pero muy pocos usuarios no oyentes han tenido la oportunidad de probarlo en su ambiente. Se observaron los diferentes modelos de teléfonos de texto que tienen a la venta una de las compañías más grande de TTY, Ultratec. Los precios van desde $250.00, siendo un TTY que solo acepta el código Baudot y el cual tiene una pantalla solamente de 24 caracteres; hasta los $1200.00, un TTY que se utiliza como teléfono público, el cual acepta el protocolo Baudot, el Turbocode y el ASCII. Los teléfonos que poseen una pantalla de 40x2 caracteres y aceptan estos tres protocolos oscilan alrededor de los $400.00. Solamente existe un teléfono de texto en Ultratec que acepta ciertos modelos de teléfonos celulares, la mayoría siendo TDMA, el cual es el Compact/C. Éste cuesta, en Estados Unidos, alrededor de $300.00 y trae una pantalla 40x2 caracteres y soporta los protocolos Baudot y Turbocode. C. Modulación digital BFSK (Binary Frequency Shift Keying) En BFSK, la onda de datos binaria d(t) genera una señal binaria 17131(S'K = 72* P * cos[roo * 1 + d(t)* 12 *t], en ésta, d(t) =+1 ó -I, lo que corresponde a los niveles lógicos de uno o cero de la señal de datos. La señal transmitida es de amplitud 72 * P., y es una de las dos que se muestran a continuación: vBISK ■ = 72* P * coskcoo +12)* t] V Bpsw = 72* P, * coskcoo — 1-2)*t] La señal transmitida tiene una frecuencia angular (1)0 + 52 ó wo - 12, siendo O una constante que se le suma o resta a la frecuencia nominal portadora wo. Esta constante es la frecuencia angular de corte del filtro pasa baja por el que se pasa la señal original. Se llamará la frecuencia mayor cok = cuo + S2 y la frecuencia menor ok = wo — a Para la modulación BFSK se utilizan dos moduladores. Uno con la portadora (oh y el segundo con oh, como portadora. Los valores de voltaje de ph(t) y de pL(t) son relacionados a los valores de voltaje de d(t) (vid tabla 1). Tabla 1. Valores de voltaje d(t) MI) PLO) +1V +1V OV - 1 V OV +1V 7 Se puede observar que d(t) cambia de +1 a -I cuando ph(t) cambia de de uno a cero y pj(t) cambia de cero a uno. En cualquier momento ph(t) o pi (t) pueden ser uno pero no lo pueden ser a la vez, para que así la frecuencia angular sea (oh o cuy. 1. Espectro de BFSK. En términos de las variables ph(t) o pe(t) la señal BFSK es V BPSK = * P, * p„*cos(2* 7I * f„ * t)+.12* P, * pil *cos(2*77- * ft * t) en donde se asume que cada una de las dos señales son independientes, con oh = 2* 7/ *fi y mc = 2* g* fL , en donde f i = fc + f8 y ft = fc — f,,. Siendo fc la frecuencia portadora y Al la frecuencia de corte del filtro pasa baja o la velocidad de transmisión (V.T.) dividido dos. Al observar su espectro en la siguiente figura, se observa claramente que f„ — fL = 2 * fE . Por lo que se concluye que el ancho de banda (BW) para BFSK está dado por BW(BFSK)= 4* f il = 4* V.T. = 2* V.T. 2 Figura 2. Espectro de la señal Vtil SK fc-2fb fc-fb fc fc+fb fc+2fb BW = 4fb 2. Receptor para señales BFSK. Una señal BFSK es remodulada usualmente por el siguiente sistema. La señal pasa por dos filtros pasa banda, en donde uno tiene frecuencia central ft, y el otro ft . Las frecuencias escogidas para los filtros no se traslapan y cada filtro es lo suficientemente ancho para contener el lóbulo principal en el espectro. Las salidas de los filtros son aplicadas cada una a un detector de envolvente y finalmente las salidas de los detectores de envolvente son comparadas por un circuito comparador. Este comparador genera una salida binaria, la cual está a un nivel o a otro dependiendo de cual señal de entrada es mayor. A la salida del comparador la señal d(t) será reproducida. 8 Cuando se encuentra ruido presente, la salida del comparador puede variar. Entonces, en sistemas prácticos se usa un sincronizador de bits y un integrador para así realizar un muestreo de la salida del comparador una vez al final de cada intervalo T. D. Teclado PS2 La interfase de comunicación PS/2 es un prototipo planteado por la IBM para comunicar dispositivos seriales en forma sincrónica, tanto teclado como mouse. En la actualidad la mayoría de los teclados corresponden a este tipo con las siguientes características: Gran número de teclas (101 a 104). Conector de 5 o 6 pines (incluyen adaptadores). - Protocolo de comunicación serial bidireccional (PS/2). Garantizan sólo el conjunto 2 de los scan codes. Contestan todos los comandos enviados, sin embargo, no actúan en todos ellos. La interfase física que usualmente se utiliza se muestra a continuación: Figura 3. Conector PS/2 (Mini-Din) macho Figura 4. Conector PS/2 (Mini-Din) hembra 9 Tabla 2. Pines de Conector PS/2 (Mini-Din) 1 Datos 2 No Implementado 3 Tierra 4 Vcc (+5V) 5 Reloj 6 No Implementado La alimentación del teclado/mouse corresponde a Vcc—F5V y una corriente máxima de 100 mA. Se recomienda no conectar el teclado a la tarjeta mientras se encuentre prendida. Las líneas de Data y Clock son ambas de colector abierto, con resistencias de «pull-up» para fijar ambas líneas en alto. El mouse y teclado PS/2 implementan un protocolo de comunicación serial bidireccional. El bus de comunicación se encuentra en estado «idle» cuando ambas líneas (data y clock) se encuentran en alto. Éste es el único estado en que al dispositivo (teclado o mouse) le está permitido enviar información al host (computadora o en este caso P1C16F877). El host tiene el control último sobre el bus y puede inhibir la comunicación en cualquier instante, colocando la línea de clock en nivel bajo. El dispositivo siempre genera la señal de clock. Si el host desea enviar datos, debe primero inhibir la comunicación desde el dispositivo, colocando la línea de clock en nivel bajo. Luego debe colocar en nivel bajo la línea de data y subir la línea de clock. Este estado es conocido como «Request to Senck, con lo cual el host señaliza al dispositivo que comience a generar pulsos de reloj a través de la línea clock para enviar los datos. Por lo tanto el bus puede estar en uno de los tres estados que se muestran en la siguiente tabla. Tabla 3. Estados del bus Datos Reloj Estado Alto Alto «Idle» Alto Bajo «Comunicación Inhibida» Bajo Alto «Request to Send» Todos los datos son mandados de un byte por vez y cada byte es enviado dentro de un frame o trama de 11 o 12 bits: 1 bit de inicio: siempre es O. 8 bits de datos: se comienza por el menos significativo. 1 bit de paridad. se utiliza paridad impar. - 1 bit de parada: siempre es 1. 1 bit de confirmación: sólo para comunicación desde el host al dispositivo. 10 El bit de paridad es colocado en alto si hay un número par de 1 en los bits de datos, y colocado en bajo si hay un número impar. La idea es que el número de 1 de los bits de datos más el bit de paridad siempre sean un número impar (paridad impar). Esto se utiliza para la detección de errores en la transmisión. Si el dispositivo detecta un error responde como que se le ha enviado un comando inválido. En el caso de comunicación del dispositivo al host (caso que será utilizado) el siguiente diagrama ejemplifica la situación: Figura 5. Líneas de reloj y de datos para comunicación de dispositivo a host CLOCK LF en line DATA cc 1•• cC á N C1 •tl• < in u:, s- - 1- < 1- < s- E < < < < < < < vo cz ocioomoo a In La frecuencia del reloj es de 10-16.7 kHz. Cuando el teclado o mouse desean mandar información deben asegurarse que la línea de reloj debe estar en alto por lo menos 50 ps antes de que el dispositivo pueda comenzar a enviar datos. El teclado/mouse escribe un bit en la línea de datos cuando el reloj está en alto. Además, es leído en el host cuando el reloj está bajo. Como se trata de comunicación desde el host hacia el dispositivo, no se envía un bit de confirmación. En los teclados se distinguen distintos conjuntos de scan codes (códigos de teclado) para identificar la tecla o teclas que se presionan. Se utiliza por defecto el conjunto 2 (set 2). Cada tecla tiene asociado un scan code compuesto de dos códigos: un make code, que se emite cada vez que se presiona una tecla, y un break code, que se emite cuando se suelta la tecla. En general estos códigos suelen tener entre 2 y 1 byte, pero existen ciertos scan codes que son más largos debido a que corresponden a una combinación de teclas más elaborada. III. OBJETIVOS A. Generales 1. Diseñar y construir un teléfono de texto (TTY) a un costo menor que los teléfonos de texto actuales. 2. Lograr la comunicación telefónica inasistida entre dos personas no oyentes. B. Específicos I. Desarrollar un protocolo de transmisión, el cual transmita a una velocidad mayor de 100 bits por segundo. 2. Lograr una transmisión serial asíncrona half duplex por la línea de teléfono «POTS» mediante la utilización de FSK. 3. Al realizar una llamada, que la persona no oyente logre reconocer si el teléfono al que desea comunicarse se encuentra ocupado o no. 4. Lograr que la persona no oyente sea capaz de detectar una llamada entrante. 5. Lograr que tanto el receptor como el transmisor pueda reconocer el momento en el que se establece conexión con el otro teléfono de texto. 6. Lograr que la persona no oyente, se logre comunicar con una velocidad mayor a las 100 palabras por minuto. 11 IV. MÉTODO DE TRABAJO El método de trabajo utilizado, consistió en diseñar e implementar los diferentes elementos que se necesiten para poder realizar dos estaciones de teléfonos de texto, TTY (teletypewriter), que se comuniquen por medio de la línea telefónica «POTS» (plain old telephone service). A continuación se presentan los elementos que componen, logran y prueban el funcionamiento de cada una de las estaciones TTY. A. Interfase de transmisión y recepción entre persona no oyente y teléfono de texto Se utilizó un teclado PS2 conectado a un microcontrolador PICI6F877 por los puertos rb0 y rb I (vid figura 6). Éste utiliza una transmisión serial síncrona con una línea de reloj y otra de datos. La línea de reloj entra por el puerto rbl, mientras que la línea de datos utiliza el rb0. Los datos son transmitidos en código ASCII. Este teclado se utiliza para transmitir la información que la persona desee. Además, se utilizó una pantalla LCD (liquid Crystal display) 40x2 paralela conectada al microcontrolador PICI6F877 usando 8 pines de datos y 3 pines de control (vid figura 6). Los puertos de datos son del ra0 al ra3 y del rc0 al rc3. Siendo el ra0 el bit menos significativo y el rc3 el más significativo. Los tres pines de control son el rb2 utilizado como el «read/write» (lectura/escritura), el rb3 utilizado como el RS (selecciona datos o instrucciones) y el rb4, el cual es el enable (habilita señal). Esta pantalla sirve de interfase entre la persona que no oye y el teléfono para recepción y transmisión, pues tanto el teclado como el puerto serial de recepción le manda el caracter a desplegar. Para la detección de una llamada entrante (ring), se utilizó una lámpara y un led, los cuales se encienden de manera intermitente hasta que se contesta el teléfono de texto (vid figura 6). Esta lámpara, al ser conectada a una espiga hembra que está conectada a un relé, es encendida y apagada al cerrar y abrir este relé que es abierto o cerrado mediante el puerto re2 del PICI6F877. 12 o no o Figura 6. Circuito que sirve de interfase para pantalla LCD, lámpara y teclado PS2 13 Keyboard 012 Maniaco 71-1—j—HV5 12Vdt 179mA 1 T 'ter" 1 21 5:041H-4-il 110V AC 120V1POI — R43 Ok e 2 C114_111'232_< 11,T B. Forma de transmisión del TTY La forma de transmisión del teléfono de texto tanto de entrada, como de salida es de forma serial asíncrona half duplex a 285 bps (bits por segundo), usando I stop bit, 1 start bit y 8 bits de información en código ASCII. 1. Modulación FSK. La señal a transmitir es modulada utilizando FSK (frequency shift keying) para mandarla por la línea de teléfono «POTS». Esta modulación se hace por software en el microprocesador PICI6F877 de la siguiente manera: Se convierte la señal digital a una señal analógica por software adentro del PIC16F877, en donde un «O» digital equivale a una señal senoidal de frecuencia 2.63 kHz y un «1» digital en una señal senoidal a una frecuencia de 1.49 kHz. Los valores de estas señales senoidales salen por el puerto D (8 bits) del PIC16F877, siendo el rd0 el bit menos significativo y el rd7 el bit más significativo. Después pasa esta señal por un DAC (convertidor digital-analógico) de tipo escalera R-2R (vid figura 7), en donde se vuelve analógica la señal y está lista para ser enviada por la línea de teléfono «POTS» por medio del circuito transmisor que se presentará más adelante. Frecuencia de señal analógica Señal digital 2.63 kHz 0 1.49 kHz Figura 7. Circuito modulador de FSK con convertidor digital-analógico escalera R-2R TX ESK 0e R37 F 39k R20 R21 R22 R23 R29 R25 R26 R27 10k 10k 10k 10k 10k 10k 10k 10k R29 20k vO w V w R28 R35 R39 --- C7 R36 Hp lOnF 20k R33 •R32 20k 20k ■ 20 20k 20k 20 1 1 R30 20k Vs 1111111 ah auw 0. Cr. D... Cu a. mumw aa. am a. U5 ary 1 1 1 1 1 1 1 1 1 1 1 1 1 I U6 Crystal TTL P9 7 41411 Vsw 5V 78L05 o OUT COM Trans for 12Vdc 179mA ± Batería " 1 14 Tabla 4. Modulación FSK 2. Transmisión de la señal a la línea telefónica «POTS». La transmisión por la línea de teléfono «POTS» de la señal modulada se realiza de la siguiente manera: Para el acoplamiento de la línea telefónica «POTS» se utiliza un puente de diodos, W04, de IA y 400V. Éste tiene dos propósitos, uno es que no importando la polaridad de la línea, siempre va a estar la polaridad correcta en el circuito transmisor. El segundo es que el puente ofrece una forma conveniente de mandar señales de audio a la línea telefónica «POTS». Un lado de este puente se conecta al conector RJ11 que va a la línea telefónica «POTS», llevando entre el puente y el conector un fusible de 1A, mientras en el otro lado del puente se conecta una terminal a la tierra del circuito y la otra terminal al circuito que baja la línea telefónica «POTS». El circuito que se utiliza para conectar la línea telefónica «POTS» consta de un transistor npn y un pnp. Estos transistores, Q3 ECG157 y Q2 ECG39, tienen que resistir el voltaje alto del ring por lo que Transmisión RII ECG11 47 Vcc 15 tienen un voltaje de colector a emisor de 300V. Lo que realiza este circuito a base de un transistor npn y un transistor pnp es un switch, el cual no está conectado cuando no hay voltaje en la terminal «switch de teléfono», lo que hace que el diodo D3 no conduzca y no se cierre el switch creado por Q3. Entonces la base de Q2 queda abierta y no deja conducir corriente por R16 (47n). Cuando se conecta la línea para así poder transmitir y recibir de la línea telefónica «POTS», se alimenta un voltaje de 5V en la terminal «switch de teléfono». Esto hace que el diodo D3 conduzca y se cierre el switch creado por Q3. Lo que produce que halla una corriente en la base de Q2 lo que hace que fluya una corriente en el colector por R16 y se cierre el switch de Q2 con lo que se baja la linea «POTS». Figura 8. Circuito transmisor a línea telefónica «POTS» Q2 ECG39 Girador 0 Switch Teléfono Q3 O © 4.41-1-1 1E1148 aoak 01 R5 ECG157 '. 1k Re 55 z688 =R=R1, 568812 100071 06.'2E\ 103V9 CG1 Vsw • I 08 c5 D5VI (-100uF Vcc 1-1 C2 Our 134148 D7 3AP Ja Ray TR3 FSK 1 LED1 D4 El circuito girador es el que sirve corno el transmisor de la señal a la línea telefónica «POTS». Este circuito tiene dos funciones. La primera es la de no dejar pasar la señal AC entrante de la línea telefónica «POTS», pues sirve como un simulador de inductancia al ofrecer una alta impedancia para las frecuencias deseadas. Al no dejar fluir la señal AC entrante de la línea, ésta no puede ser disipada en este circuito, lo que permite que ésta pase directo al circuito de recepción que se discutirá más adelante. El girador es un amplificador de corriente de base de un transistor npn. Este transistor es Q4 ECG11 en la figura 8. La base es mantenida a un voltaje usando las resistencias R9 y RIO como un divisor de voltaje. El colector es la entrada del girador y la salida es el emisor. El capacitor C2 de 10uF que está conectado en paralelo con la resistencia debajo de la base simula una inductancia aproximada a 51-1. Por lo que el girador usa al transistor para convertir la capacitancia en la base en una inductancia simulada en el colector. Al ser la entrada del girador la señal DC de la línea telefónica «POTS», entonces la base es mantenida a un voltaje estable y el girador permanece en un estado estable de conducción. Cuando se encuentra una señal AC en el colector, una fracción de ésta trata de aparecer en la base, pero al pasar por la resistencia RI O y el capacitor C2, estos actúan como un filtro pasa baja y solo permite que fluya por la base señales de baja frecuencia. Entonces, al no haber corriente alterna fluyendo en la base, el transistor no 16 actúa como amplificador para las señales AC que entran de la línea telefónica «POTS» por lo que aparenta una alta impedancia para ellas. La segunda función que tiene el circuito girador es la de amplificar la señal que proviene de la escalera R-2R y de mandarla por la línea telefónica «POTS». Como se mencionó anteriormente, el girador es fundamentalmente un amplificador de corriente. Al estar R9 conectada entre la base y C2 (vid figura 8), permite que una señal independiente de audio sea aplicada a la base por medio de C8, un capacitor de acoplamiento de 10pF. Esto permite que el girador no solamente bloquee la señal AC, sino que amplifique la señal generada en el PICI6F877 y la introduzca a la línea. Esto se obtiene gracias a que la señal AC proveniente de la escalera R-2R no es filtrada antes de llegar a la base por lo que es amplificada por Q4. C. Forma de recepción del TTY La recepción del teléfono de texto consta de dos partes. La primera es la recepción de la linea de teléfono «POTS», mientras que la segunda es acerca de la recepción y demodulación FSK que se hace por software utilizando el PIC16F877. 1. Recepción de la línea de teléfono «POTS». La recepción de la señal proveniente de la línea de teléfono «POTS» se realiza de la siguiente manera: Para la recepción de la señal AC que viene en la línea telefónica «POTS» se utiliza un capacitor de acople C6 y un transformador de audio 1:1 con 60012 de impedancia en ambos lados. Un lado del transformador se conecta a la línea telefónica «POTS» acoplada por el capacitor C6; mientras en el lado secundario del transformador, una de las terminales se une a la tierra del circuito del teléfono de texto y la otra terminal es la que lleva la señal AC que se va a del-nodular. Esta señal pasa por un zener D9 de 5.1V para no dejar pasar señales mayores a los 5.1V corno sería el caso del ring. La señal AC ya desacoplada de la línea telefónica «POTS» se suma con una señal DC de referencia de 2V por medio de un circuito sumador no inversor realizado con un amplificador operacional LM324. Esta señal que contiene a la señal AC sobre un voltaje de referencia se pasa por un comparador no inversor, el cual tiene como voltaje de referencia el mismo que fue sumado a la señal de entrada para poder detectar solamente la señal AC. De esta manera se logra que en la salida del comparador (vid figura 9) se encuentre una onda cuadrada con la misma frecuencia que la señal AC y con un ciclo de trabajo del 50%, el cual es indispensable para la demodulación de la señal. Vsw R18 10k R15 10 C6 T2 lOnF ltol Vsw RX FSK F2 lA 17 Figura 9. Circuito de recepción 2. Demodulación FSK. La demodulación de la señal se realiza cuando la onda cuadrada que sale del comparador entra al puerto rb7 del PICI6F877. Ésta se lleva a cabo de la siguiente manera: Este puerto utiliza el interrupto por cambio de flanco al igual que el módulo del Timerl (cuenta las instrucciones) con un pre-scaler de 1:4. El rb7 es utilizado de esta forma para poder detectar la frecuencia de la onda entrante y así poder demodular la misma. Lo que hace el programa para demodular la onda es lo siguiente: al momento que hay un cambio de flanco en la señal, ocurre un interrupto; entonces, se guarda el valor del Timerl en una variable y se bora el registro del Timerl. Después se revisa para ver si el valor que se guardó del Timerl está en el rango de 2.3kHz y 2.8kHz o en el rango de 1.3kHz a 1.7kHz. Si está dentro del rango de 2.3kHz y 2.8kHz pone un «O» en el puerto rb5. Si se encuentra dentro del otro rango pone un «I» en el rb5. Si no está adentro de estos dos rangos, va a revisar si en el cambio de flanco anterior estuvo en alguno de los dos rangos. Si tampoco estuvo en algún rango, entonces se sale y deja en «1» el puerto rb5. El puerto rb5 está conectado al puerto reo del PICI6F877. Este puerto es utilizado por el módulo USART (universal synchronous asynchronous receiver transmitter) del PICI 6E877 como el puerto de recepción cuando este módulo está utilizado en modo asíncrono a 285 bps, con un start bit, 8 bits de datos, sin paridad y un stop bit. De ésta forma, la señal demodulada que sale por rb5 entra al receptor del puerto serial y al momento que tiene un byte, el puerto serial realiza un interrupto y manda a desplegar en la pantalla LCD el caracter enviado. 18 D. Modo de operación El teléfono de texto funciona únicamente en líneas «POTS». A continuación se presenta el modo de operación del TTY para líneas telefónicas «POTS». 1. Recepción. El teléfono de texto se conecta a la linea de teléfono «POTS» mediante un conector Rin. Éste, al encontrarse como receptor, detecta el ring de la siguiente forma: la señal del ring pasa por el circuito de recepción y entra al puerto rb7 del microcontrolador. En éste ocurre un interrupto por flanco y lo despierta, es aquí donde se va a revisar el tiempo muerto (tiempo en que se queda muda la línea telefónica «POTS»). Si es menor de 4.2 segundos, se está detectando un ring, mientras que si es mayor quiere decir que no se detectó el ring y se despliega un mensaje en la pantalla LCD que dice «ERROR EN CONEXIÓN». Al detectar el ring, el puerto re2 genera una onda cuadrada, la cual activa un relé que prende y apaga una lámpara. Además, un led parpadea a la vez. Este led es utilizado, dado el caso en que el teléfono de texto estuviera alimentado por una batería. La lámpara y el led indican que está entrando una llamada. Se contesta el teléfono de texto al presionar la tecla ENTER en el teclado. En el momento que se presiona ENTER, el ring se apaga y por consiguiente la lámpara también. Se pone en alto el puerto rb6 el cual está conectado a la terminal «switch teléfono» en el circuito transmisor de la figura 8 con lo que se conecta la línea telefónica «POTS». Además, el TTY receptor empieza a establecer la conexión con el TTY transmisor. Los dos TTY hacen un «saludo» (handshake) y encienden un led al poner en alto el puerto re2; para así, avisar a los usuarios que ya están conectados y pueden empezar la comunicación. 2. Transmisión. El teléfono de texto transmisor luego de haber marcado en un teléfono normal, procede a chequear si da línea o está ocupada la línea. Por medio del circuito de recepción, cualquiera de las dos señales entran por el puerto rb7 y hacen un interrupto por cambio de flanco y se va a revisar los tiempos muertos. Si el tiempo muerto es menor de 0.5 segundos, indica que está ocupado, y despliega «OCUPADO». Si el tiempo muerto es mayor de 0.5 segundos y menor que 4.2 segundos, significa que está dando línea, por lo que despliega en la pantalla «LINEA». 3. Saludo (Handshake). Cuando se contesta el TTY receptor, el TTY transmisor ya no detecta las frecuencias que indican si está dando línea o está ocupado. El transmisor espera 4 segundos para empezar el «saludo» entre los dos teléfonos de texto. Al momento de empezar el saludo el TTY transmisor despliega en la pantalla «CONECTANDO». Este saludo o handshake se basa en mandar del teléfono transmisor un byte con la letra «S» (de enviar en inglés) en código ASCII cada segundo para que se oiga un tono repetitivo en el teléfono receptor. Así el receptor sabrá que es una llamada TTY, si se da el caso que Prende Led de conexión en el transmisor y receptor 19 levante alguien oyente el teléfono, para que proceda a presionar la tecla ENTER en el TTY receptor (vid figura 10). El TTY transmisor sigue mandando la letra «S» cada segundo hasta que el receptor se encuentre conectado y la reciba. En ese momento, el receptor manda un byte de reconocimiento (acknowledge) con la letra «A». En el momento de mandar la «A» el receptor pone en alto el puerto re2 del PIC16F877, el cual prende un led que indica que el TTY receptor se encuentra conectado. Cuando la «A» es recibida en el TTY transmisor, éste pone en alto el puerto re2 del PIC16F877, el cual prende un led indicando que el TTY transmisor se encuentra conectado. Es aqui donde se puede iniciar la conversación. Si el TTY transmisor no ha recibido un reconocimiento del receptor (un acknowledge) después de 20 segundos, el transmisor despliega un mensaje en la pantalla LCD que dice «ERROR EN CONEXIÓN» y pone en cero el puerto rb6. Figura 10. Diagrama de flujo del saludo o handshake Despliega en LCD «ERROR EN CONEXION» 20 E. Circuito del teléfono de texto El circuito completo del teléfono de texto se muestra a continuación. Este circuito incluye al circuito transmisor, al circuito receptor, al convertidor digital-analógico y la conexión del PICI 6E877 con el resto de los circuitos. Figura 11. Circuito del teléfono de texto SZ 10Mea Hia_cr:3114, ,; r 100k —t — - E io 6 9 — O —1 100 TX RX con ring RX sin ring 21 F. Lógica del programa A continuación se muestran los diferentes bloques que conforman el programa realizado y compilado en MPLAB 6.3. Además, el código completo del programa se encuentra en el apéndice A. Figura 12. Diagrama de flujo de inicialización del programa y de menú de entrada Inicialización de variables, módulos y pantalla LCD Se despliega menú en la pantalla LCD 22 Figura 13. Diagrama de flujo de la transmisión TX Conecta la línea de teléfono Espera tono de línea • Chequea tono de línea y marcado de teléfono • Chequea tiempos muertos con interrupto por flanco Si ocupado F Si da línea F Si mudo>4.2s F V y Mensaje de «LINEA» en la LCD Establece conexión Conversación Mensaje de «OCUPADO» en la LCD Si ring>20s F Si int teclado F • Conversación Si tecla=enter F V Despliega en LCD (ERROR EN CONEX ION» • Establece conexión RX con Ring • SLEEP y Detección de ring Prende y apaga lámpara Apaga lámpara Conecta la línea de teléfono Figura 14. Diagrama de flujo de la recepción con detección de ring 23 • Conecta la línea de teléfono Conversación RX sin ring Establece conexión Si int recepción F Si int teclado F V Si int flanco F Despliega carácter recibido en LCD Teclado Sale de interrupto Conversación Demodulación FSK 24 Figura 15. Diagrama de flujo de la recepción sin detección de ring Figura 16. Diagrama de flujo de la conversación Si tecla = FA o F4 F V Si tecla = FO o E O F V Acuse de teclado a PIC Sale de interrupto Bandera FO o E0 =I Sale de interrupto Figura 17. Diagrama de flujo del teclado Teclado Recibe byte 25 Si tecla=caps, num o scroll F Si tecla = esc F V V TX a teclado para prender led de caps, num o scroll Desconecta linea Llama tabla para valor de carácter en W Sale de interrupto Si bandera caps =I F V Prende bit 5 de caracter T4 Despliega caracter en LCD VCO Figura 18. Diagrama de Rujo del VCO VCO 26 Llama tono alto para start bit • Contador = 8 • Rota bit de caracter a la derecha Si bit rotado = 1 F V • Llama tono alto • Llama tono bajo • Decrementa contador Si contador = O F V Llama tono bajo para stop bit • Sale de interrupto • • W = STEPA + puntero tabla W= 127 and W Llama tabla para valor de senoidal en W • Si bit7 de W = 1 F V W = 255 - W • • Nexivalue = W PORTD = Nextvalue + Decremente SINECOUNTH Si SINECOUNTH = O F V SINECOUNTH = 100 Para 285bps Figura 19. Diagrama de flujo de la onda senoidal 27 Sale de la función Si free está 2.3 a 2.8kHz F Si free está 1.3 a 1.7kHz F Demodulación FSK Chequea frecuencias con interrupto por flanco y TMRI Pone «O» en rb5 Sale de interrupto Pone «1» en rb5 Sale de interrupto Pone «O» en rb5 Sale de interrupto Si free está 2.3 a 2.8kHz F Si free está 1.3 a 1.7kHz F Sale de interrupto CI equea medio período anterior Pone «1» en rb5 Sale de interrupto 28 Figura 20. Diagrama de flujo de la demodulación FSK 29 G. Modo de implementación Para la implementación del teléfono de texto, el usuario tendrá que escoger ciertas opciones antes de poder lograr la comunicación telefónica. Antes de encender el TTY, el usuario tendrá que escoger el tipo de alimentación del dispositivo. 1. Alimentación. Si desea utilizar una batería cuadrada de 9V, deberá mover el switch de encendido ala derecha. Si desea conectarlo a la red eléctrica (110V), deberá mover el switch de encendido a la izquierda y conectar el TTY al transformador de 110V/12V y así conectar el transformador al tomacorriente de 110V. Al haber realizado lo anterior, el teléfono de texto se encuentra encendido y se procede a escoger la opción deseada de transmisión o recepción. 2. Menú. Al momento de encender el TTY, aparecerá en la pantalla LCD un menú (vid figura 21). Este menú le indica que presione 1 si se va a realizar una transmisión (se va a realizar una llamada), que presione 2 si va a realizar una recepción con detección de ring o que presione 3 si se va a realizar una recepción sin ring (se va a contestar una llamada). Figura 21. Menú que despliega la pantalla LCD 1 T X 2 R X o N R N G 3 R X S N R N 3. Transmisión. Si se desea realizar una transmisión, de primero se escoge en el menú de la pantalla del teléfono de texto la primera opción. En este momento se prende un led indicando que se conectó la línea telefónica «POTS». Después, se levanta el teléfono y se marca el número de teléfono. Al terminar de marcar se cuelga el teléfono. En este momento, el TTY procede a chequear si da línea o está ocupado. Si se da línea, entonces se despliega en la pantalla «LINEA» (vid figura 22), mientras si está ocupado, se despliega «OCUPADO» (vid figura 23). Figura 22. Mensaje de «LÍNEA» en la pantalla LCD L N E A En el momento en que se establece conexión, se prende un led en el TTY transmisor y se pone la pantalla en blanco. En este momento, el usuario puede empezar la conversación. Cuando se desee terminar la conversación y colgar el teléfono, se presiona en el teclado la tecla ESC y se cuelga la línea. Entonces se apaga el teléfono o si se desea hacer una transmisión o recepción, se presiona el botón de reset, o el de ESC nuevamente y se repite la operación descrita anteriormente. 4. Recepción. Existen dos formas de lograr una recepción en el TTY. Cuando éste se enciende, se muestra un menú en la pantalla (vid figura 21). En el menú se muestran dos opciones para realizar una recepción. Si se desea dejar el 1TY en modo de recepción con detección de ring, se presiona 1. Si se o P A U o c o e N T N E c o A o o R E N E N E N R R X o o o 30 Figura 23. Mensaje de «OCUPADO» en la pantalla LCD En el momento que se contesta la llamada, el TTY despliega un mensaje en la pantalla «CONECTANDO» (vid figura 24). Mientras aparezca este mensaje en la pantalla, el TTY transmisor está intentando establecer conexión con un TTY receptor. Figura 24. Mensaje de «CONECTANDO» en la pantalla LCD Si no se establece la conexión después de 20 segundos, el TTY transmisor despliega en la pantalla el mensaje «ERROR EN CONEXIÓN» (vid figura 25). En este momento se procede a cortar la llamada y a volver a intentar la transmisión si se deseara, al presionar el botón de reset, o el de ESC en el teclado. Después se procede a repetir la operación descrita anteriormente. Figura 25. Mensaje de «ERROR EN CONEXIÓN» en la pantalla LCD 31 desea hacer una recepción sin detección de ring, se presiona 2. A continuación se describen más a fondo estas opciones. a. Recepción con detección de ring. Antes de haber escogido esta opción, se conecta una lámpara para la detección del ring en la espiga del teléfono de texto si éste se encuentra conectado al tomacorriente. Al haber escogido esta opción, el teléfono de texto entra en SLEEP, estado en donde el consumo de potencia es mínimo. Además, se despliega en la pantalla LCD el mensaje «ESPERANDO LLAMADA» (vid figura 26). Figura 26. Mensaje de «ESPERANDO LLAMADA» en la pantalla LCD E S p E R A N D O L L A M A A El TTY receptor detectará una llamada entrante al detectar el ring. En ese momento, la lámpara empezará a prenderse y apagarse, indicando que entra una llamada. Si estuviese alimentado por una batería, el TTY receptor detecta el ring por medio de un led que parpadea. Además, el TTY desplegará en la pantalla «RING» a la vez que la lámpara y el led parpadean (vid figura 27). Para contestar la llamada, se presiona la tecla de ENTER en el teclado durante el lapso que el led y la lámpara se encuentren apagados. En este momento se prende un led indicando que se conectó la línea telefónica «POTS». Además, empieza a establecer la conexión con el TTY transmisor y despliega «CONECTANDO» en la pantalla (vid figura 24). Cuando establece la conexión, se borra la pantalla, el receptor prende un led, el cual indica que ya se estableció la conexión y se puede empezar la comunicación. Figura 27. Mensaje de «RING» en la pantalla LCD R N G Si por algún motivo ya no entra un ring, el TTY desplegará el mensaje en la LCD «ERROR EN CONEXIÓN» (ver figura #25). Si se desea volver a intentar la recepción, se presiona el botón de reset, o el de ESC en el teclado y se procede a repetir la operación descrita anteriormente. 32 b. Recepción sin detección de ring. Esta opción se escoge cuando se recibe una llamada TTY y el receptor no se encuentra conectado antes de recibirla. Es usada principalmente por usuarios que son oyentes. Cuando ya se ha contestado la llamada, el TTY receptor tiene 20 segundos para encenderse y ponerse en modo de recepción sin detección de ring. Ya escogida esta opción, el TTY receptor empieza a establecer la conexión con el TTY transmisor y despliega en la pantalla «CONECTANDO» (vid figura 24). A la vez, prende un led indicando que se conectó la línea telefónica «POTS». Cuando se logra la conexión, se borra la pantalla y el receptor prende un led, el cual indica que ya se estableció la conexión y se puede empezar la comunicación. Si el led no se enciende, la conexión no se logró establecer, desplegando en la pantalla «ERROR EN CONEXIÓN» (vid figura 25) y desconectando la línea de teléfono «POTS». Entonces hay que presionar el botón de reser si se desea volver a probar o se apaga el teléfono de texto. En el momento que ya se ha establecido la conexión del TTY transmisor con el receptor, el primero que debe de empezar la comunicación es el TTY transmisor. Se debe procurar avisar cuando termina de escribir uno con alguna clave o frase. Se puede utilizar la tecla de ENTER que muestra «71» en la pantalla. Otra opción es la frase comúnmente utilizada en esta clase de teléfono, «GA» (go ahead), siga adelante. Una de estas dos opciones se utiliza al final de cada vez que alguno termine de escribir y espere una respuesta para indicar que ha terminado de escribir. Además, si por alguna razón existiera ruido en la línea telefónica «POTS» y el TTY no funcionara correctamente, se procede a repetir la transmisión hasta que se logre la transmisión sin ningún error. H. Implementación por personas no oyentes Dos personas no oyentes probaron por el lapso de una semana el funcionamiento de las dos estaciones TTY. Estas personas conectaron cada estación TTY en la línea telefónica «POTS» de sus casas y se comunicaron sin la ayuda de personas oyentes por medio de los dos teléfonos de texto. I. Costos En la tabla 5 se presenta el costo en quetzales de cada parte que compone una estación TTY. También se muestra el costo total en quetzales y en dólares. No incluye lámpara. Tabla 5. Costos de un teléfono de texto Cantidad Descripción unidad (Q) subtotal (Q) 1 PIC16F877 Q77.25 Q77.25 1 Pantalla LCD 40x2 Q244.12 Q244.12 1 Teclado Genius PS2 KB-06XE Q56.03 Q56.03 1 Cristal TTL 4 MHz Q16.20 Q16.20 1 Conector hembra RJ1 I Q3.66 Q3.66 1 Conector hembra PS2 MiniDin 6 pines Q6.10 Q6.10 1 Conector hembra para transformador Q3.99 Q3.99 Batería Alkalina Cuadrada 9V Q14.50 Q14.50 1 Transformador 110V/12V Q37.36 Q37.36 1 Transformador de audio 1:1, 6000/6000 Q15.87 Q15.87 1 Regulador 5V 7805 Q2.36 Q2.36 1 OpAmp 14A17324 Q4.50 Q4.50 1 OpAmp HA 17358 Q3.50 Q3.50 1 Relé 120V Q20.00 Q20.00 2 Tomacorrientes hembra Q1.50 Q3.00 2 Espiga macho Q1.50 Q3.00 1 Conector para batería 9V Q6.43 Q6.43 2 Potenciómetro de 50k 114W Q1.50 Q3.00 1 Resistencia 47Q 1/2W Q0.23 Q0.23 36 Resistencias variadas 1/4W Q0.23 Q8.28 1 Capacitor cerámico 10n F 250V Q3.36 Q3.36 2 Capacitores cerámicos varios 50V Q0.56 Q1.12 4 Capacitores electrolíticos variados 25V Q0.56 Q2.24 3 Transistor NPN ECG123AP QI.12 Q3.36 1 Transistor NPN ECG157 Vce=300V Q4.48 Q4.48 1 Transistor PNP ECG39 Vce=300V Q6.72 Q6.72 1 Transistor NPN ECG11 Ic=2A Q2.24 Q2.24 1 Puente de diodos W04 300V I A Q5.60 Q5.60 2 Diodo Si 1N4148 Q0.84 Q1.68 4 Diodos Zener 1W variados Q1.68 Q6.72 2 Led 1.4V Q1.00 Q2.00 1 Fusible 1A Q0.67 Q0.67 1 Portafusible Q2.24 Q2.24 2 Metro de alambre calibre 24 QI.25 Q2.50 1 Caja de aluminio Q100.00 Q100.00 Total en quetzales Q674.31 Total en dólares $82.74 33 V. RESULTADOS A. Generales Se desarrolló e implementó un teléfono de texto para líneas «POTS». Con este teléfono de texto realizado se logró la comunicación telefónica inasistida de dos personas no oyentes durante el período de una semana (vid apéndice C). Como se observa en la tabla 5, el costo del teléfono de texto creado es de $82.74. Éste es mucho menor a los ya existentes en el mercado estadounidense. Pues, el TTY más barato, cuesta $250.00 (de ULTRATEC) y su pantalla es de 24 caracteres con una velocidad de 45 bps. Además, el teléfono de texto diseñado en este trabajo de graduación, tiene muchas funciones adicionales que los teléfonos de textos existentes no poseen. Por lo que se demuestra que se logró un costo menor a los teléfonos de textos existentes. B. Específicos 1. Se logró una velocidad mayor a los 100 bits por segundo. La velocidad de transmisión del teléfono de texto desarrollado en este trabajo de graduación es de 285 bits por segundo. 2. La comunicación entre personas no oyentes se realiza a 1710 caracteres por minuto. Con esto, se logra una comunicación con una velocidad de 342 palabras por minuto. Esto se puede observar en la tabla 6. Tabla 6. Velocidades de transmisión Bits por segundo 285 Caracteres por segundo 28.5 Caracteres por minuto 1710 Palabras por minuto 342 3. Se logró una transmisión serial asíncrona half duplex a 285 bps con 8 bits de datos en código ASCII, 1 start bit y 1 stop bit. Ésta se realizó por la línea de teléfono «POTS» mediante la utilización de FSK para la transmisión de datos. 34 35 La modulación de la señal se realizó por software en el PICI6F877. De éste sale la señal por un puerto de 8 bits, de donde pasa por un convertidor digital-analógico de tipo escalera R-2R, en donde ya se encuentra la señal modulada. Un «1» equivale a una frecuencia de 1.49kHz y un «0» equivale a una frecuencia de 2.63kHz. A continuación, se muestra la señal modulada de la letra «i» en código ASCII. Figura 28. Señal modulada "i" modulada 11}11111111111,1111.11111111)111 ¡III lilaila keit 1~11111 IMIL11111. s-: 1 0.5 0 -0.007 0.003 0.013 0.023 0.033 (s) La demodulación de la señal transmitida se realizó por software en el microcontrolador P1C16F877. Para lograr esta demodulación, de primero la señal transmitida se convierte en una onda cuadrada. Para esto se utilizó el circuito receptor que se muestra en la figura 9. En la figura 29 se muestra la señal de onda cuadrada que sale del circuito receptor, la cual equivale a la letra «i» en código ASCII. Esta señal es la que demodula el microcontrolador. Éste detecta las dos frecuencias y saca la señal demodulada por el puerto rb5. Esta señal se observa en la figura 30. La señal demodulada entra al receptor del puerto serial en donde se finaliza la demodulación FSK. "i" cuadrada 1 1111 11 I 1 'Hin i IL ni 1 11111111 III 11111 I I I 11111111111111111111111111111111111111111111111 1011111111111111111111111 111111 111 1 111111 11111 1 11111111111111 1 11 1111111111111111111111111111101 11111111111111 111111111 1 1 1 1111 0111111111 111111111101111 111111111111111 111111111 11111011111111111110111111111111111111111 H1lIll1II 11111111111 0.003 0.008 O 013 0.018 0.023 0.028 0.033 (s) 36 Figura 29. Onda cuadrada que sale del circuito de recepción Figura 30. Señal modulada y señal demodulada que entra al puerto serial S [ —"i" demodulada —"i" modulada Mal S111 11.1 TWITirnMPITTIPEr Magálfin alistain o 0.003 o 0.013 , , 0;023 0.033: (s) 4. La implementación del teléfono de texto en líneas de teléfono «POTS» se logró mediante la utilización del circuito de transmisión mostrado en la figura 8 y el circuito de recepción mostrado en la figura 9. 37 5. El teléfono de texto es capaz de reconocer si el teléfono al que desea comunicarse se encuentra ocupado o no, por medio de un mensaje que se despliega en la pantalla LCD. Además, logra reconocer el momento en el que se establece conexión con otro TTY mediante un led que se enciende en dicho momento. 6. El teléfono de texto es capaz de detectar una llamada entrante. Esto lo realiza al prender y apagar de forma intermitente un led y una lámpara hasta que se conteste la llamada en el teléfono de texto. VI. OBSERVACIONES Al inicio de este proyecto se había pensado utilizar tanto un modulador como un demodulador FSK por hardware (externo del PIC I6F877). La señal con los datos saldría del PICI6F877 en forma digital y habría un modulador FSK, en este caso un VCO (voltage controller oscillator) y ya se introduciría la señal en forma analógica a la línea telefónica «POTS». Como modulador FSK, se utilizó el «Voltage-Controlled Oscillator» XR2207 en la configuración mostrada en la página 18 figura 20 «Multi-channel FSK Generation» del manual «XR-2207 Voltage-Controlled Oscillator» y no se logró la modulación deseada. Este resultado se pudo deber al uso aproximado de valores de capacitancia y resistencia. La demodulación FSK de la señal proveniente de la línea telefónica «POTS» la realizaría un demodulador FSK y de ahí este demodulador pasaría la señal digital al P1C16F877. Como demodulador FSK, se utilizó el «FSK Demodulator» Xl222 I I en la configuración mostrada en la figura 3 «Generalized Circuit Connection for FSK and Tone Detection» del manual «XR-22 1 I FSK Demodulator/Tone Decoder» y no se logró la demodulación debido a la inestabilidad que surgía de la señal demodulada debido al constante desajuste del potenciómetro usado en RO. Se trató de utilizar resistencias que daban el valor ajustado por el potenciómetro pero no se logró encontrar una combinación exitosa de resistencias en la cual el demodulador permaneciera estable por un período mayor de 2 horas. Además, se utilizó el demodulador «Phase Locked Loop» LM565 en la configuración mostrada en el primer circuito de la página 6 del manual «LM565/LM565C Phase Locked Loop» y no se logró la demodulación debido a que no se logró el correcto funcionamiento de dicho circuito utilizando las fórmulas indicadas en este manual. Este problema se pudo deber al uso aproximado de valores de capacitancia y de resistencia. Debido a la problemática encontrada al utilizar estos circuitos integrados se procedió a realizar la modulación y demodulación FSK por software en el PICI6F877. Esta implementación disminuye tanto la complejidad de la circuitería utilizada, como los costos de la estación TTY. 38 VII. CRONOGRAMA Actividad Semana 1 2 3 4 5 6 7 8 9 10 Planificación y diseño del teléfono de texto Interface de transmisión y recepción Transmisión y recepción de la señal Construcción final de las dos estaciones TTY , Pruebas preliminares de las dos estaciones TTY Pruebas finales de las dos estaciones TTY por personas no oyentes t 39 FUENTES DE INFORMACIÓN Chapweske, Adam. PS/2 Mouse/Keyboard Protocol [en línea]. 1999. [Consulta: 20-mayo-2003]. Harkins, Judy y N. Williams. TTY Basics [en línea]. Gallaudet University, 1998.. [Consulta: 17-junio-2003]. Holmes, Pamela. Comments [en línea]. Wisconsin: Ultratec, 1998. [Consulta: 9-junio- 20031. LM565/LM565C Phase Locked Loop. 1999. National Semiconductor Corporation. 11 págs. Predko, Myke. 2002. Programming and customizing PlCmicro MCU Microcontrollers. New York, McGraw-Hill. 1192 págs. Taub, Herbert y D. Schilling. 1986. Principies oí communication systems. 20 ed. New York, McGraw-Hill Book Company. 758 págs. XR-2207 Voltaje-Controlled Oscillator. 1997. EXAR Corporation. California. 24 págs. XR-22 1 I FSK Demodulator/Tone Decoder. 1997. EXAR Corporation. California. 24 págs. 40 APÉNDICES A. Código fuente del teléfono de texto list p=16f877 # include "p16f877.inc" CONFIG HS OSC & CP OFF & WDT OFF & PWRTE ON & LVP OFF & BODEN ON _ _ _ _ _ errorlevel -302 ; elimina mensaje "register not in bank 0" ******************** Oscilador HS de 4 Mhz Code Protection Off Watchdog Timer Off Power up Timer Off Low Voltaje Programming Off ******************** ******************** VARIABLES BANCO O ******************** cblock 0x20 KEYBD ;guarda byte de teclado TEMP ;temporal para escribir a LCD 41 42 CONTI ;variable de retrasos CONT2 ;variable de retrasos CONT3 ;variable de retrasos CONT4 ;variable de retrasos CONT5 ;variable de retrasos CONT6 ;variable de retrasos CONT FA ;contador para leds de teclado CONT_DIS ;contador para LCD CONT DIS2 ;contador temporal para LCD CONT_TEMP ;contador para esperar tonos dtmf FLAGS ;contiene banderas del teclado W_SAVE ;temporal de W STAT_SAVE ;temporal de STATUS PCLH_SAVE ;temporal de PCLATH LEDS ;guarda banderas de leds de teclado TEMP I ;temporal para LCD CONTROL ;banderas de control de línea de teléfono CONTROL2 ;banderas de control de línea y de llamada DELAY ;variable de retrasos ende ******************** VARIABLES COMPARTIDAS ************************************************************************************* ******************** cblock 0x70 CON1 ;contador para leer memoria de programa POINTERA ;contador del valor de la onda senoidal 43 SINECOUNTH ;contador que da la duración de la onda STEPA ;obtiene tamaño de salto para cierta free. ALLONES ;obtiene la parte alta o baja de la onda NEXTVALUE ;temporal para valor de onda senoidal TO_count ;mira medio periodo Tlast ;mira medio periodo anterior RX ;guarda byte recibido WORD ;fin de puntero de memo. programa DATH ;guarda 2 byte de memo. programa PA I ;puntero para menús de pantalla ende ******************** 5 Definición de las variables de bits (banderas) ******************** #DEFINE bien_r FLAGS, O ((DEFINE parity FLAGS, 1 #DEFINE rx_err FLAGS, 2 ((DEFINE tx_err FLAGS, 3 ((DEFINE dat err FLAGS, 4 #DEFINE FO_flag FLAGS, 5 ((DEFINE E0 flag FLAGS, 6 #DEFINE inicio CONTROL, O #DEFINE linea CONTROL, 1 #DEFINE da_IineaCONTROL, 2 fiDEFINE ocupadoCONTROL, 3 44 #DEFINE offhook CONTROL, 4 #DEFINE ocupado2 CONTROL, 5 #DEFINE linetemp CONTROL, 6 #DEFINE ring CONTROL, 7 #DEFINE pico CONTROL2, O #DEFINE picosleep CONTROL2, I #DEFINE lineaerror CONTROL2, 2 #DEFINE lineauno CONTROL2, 3 #DEFINE rx_tty CONTROL2, 4 #DEFINE tx_tty CONTROL2, 5 #DEFIN E tonoinicio CONTROL2, 6 #DEFINE fin CONTROL2, 7 ******************** ******************** BANCOO MACRO BCF STATUS, RPO BCF STATUS, RPI ENDM BANCO! MACRO BCF STATUS, RPI BSF STATUS, RPO ENDM BANCO2 MACRO BSF STATUS, RP I BCF STATUS, RPO ENDM BANCO3 MACRO BSF STATUS, RP I BSF STATUS, RPO EN DM ******************** ******************** org Ox00 goto INICIO org 0x04 goto INTERR org 0)(06 ******************** Tabla de media onda senoidal. Son las 128 muestras positivas. ;*******************************************************************•***************** ******************** SINELOOKUP addwf PCL,F ;suma W a PC sinstart retlw .127 retlw .130 45 retlw .133 retlw .136 retlw .140 retlw .143 retlw .146 retlw .149 retlw .152 retlw .155 retlw .158 retlw .161 retlw .164 retlw .167 retlw .170 retlw .173 retlw .176 retlw .179 retlw .182 retlw .185 retlw .187 retlw .190 retlw .193 retlw .195 retlw .198 retlw .201 retlw .203 retlw .206 retlw .208 retlw .211 retlw .213 retlw .215 retlw .218 retlw .220 retlw .222 46 retlw .224 retlw .226 retlw .228 retlw .230 retlw .232 retlw .233 retlw .235 retlw .237 retlw .238 retlw .240 retlw .241 retlw .243 retlw .244 retlw .245 retlw .246 retlw .248 retlw .249 retlw .249 retlw .250 retlw .251 retlw .252 retlw .253 retlw .253 retlw .254 retlw .254 retlw .254 retlw .255 retlw .255 retlw .255 retlw .255 retlw .255 retlw .255 retlw .255 47 retlw .254 retlw .254 retlw .254 retlw .253 retlw .253 retlw .252 retlw .251 retlw .250 retlw .249 retlw .249 retlw .248 retlw .246 retlw .245 retlw .244 retlw .243 retlw .241 retlw .240 retlw .238 retlw .237 retlw .235 retlw .233 retlw .232 retlw .230 retlw .228 retlw .226 retlw .224 retlw .222 retlw .220 retlw .218 retlw .215 retlw .213 retlw .211 retlw .208 48 retlw .206 retlw .203 retlw .201 retlw .198 retlw .195 retlw .193 retlw .190 retlw .187 retlw .185 retlw .182 retlw .179 retlw .176 retlw .173 retlw .170 retlw .167 retlw .164 retlw .161 retlw .158 retlw .155 retlw .152 retlw .149 retlw .146 retlw .143 retlw .140 retlw .136 retlw .133 retlw .130 ******************** Rutina de Inicialización del Programa 49 .****************** ******************** 50 INICIO clrf LEDS clrf CONT_DIS movlw .1 movwf CONTFA bsf STATUS, RPO bsf INTCON, INTE bsf INTCON, RBIE ;borra banderas de leds ;borra contador LCD ;pone 1 en contador de led mayusculas ;***banco I*** ;hab. interrupto externo en REO ;habilita rb7 interrupto bcf OPTION REG, INTEDG ;interr. en flanco de caída de RBO bcf OPTION_REG, TOCS ;inicializando Timer O, modo Timer bcf OPTION_REG, PSA ;prescaler asignado al Timer O bsf OPTION_REG, 7 ;pullups off bcf OPTIONREG, PSI bsf OPTION REG, PS2 bcf OPTION_REG, PSO ;Timer 0 prescaler 1:32 movlw 6'00000110' movwf ADCON I ;pone en digital porta y porte clrf TRISA ;PONE COMO SALIDAS PORTA PARA LCD ;LSBITS Y RAS PARA LAMPARA movlw 6'011' movwf TRISE movlw 19'11110000' movwf TRISC ;REO ES CONTROL DE FSK, RE2 ES LED DE ;CONEXION ;pone corno entrada a rc7 para RX, ;y salida rc0-rc3 para msbits para lcd clrf TRISD movlw B'10000111' movwf TRISB ;El puerto D corno salida PARA SENOIDAL ;RB3, RB4, RB5, RB6 como salida ;RB7 corno demod FSK, ;RBO,RBI PARA KBOARD 51 clrf PIE 1 ;deshabilita interruptos de periféricos BANCOO clrf PORTD ;PONE EN CERO EL PORTD PARA SENOIDAL clrf PORTE ;PONE EN CERO EL PORTE PARA CONECCION bsf PORTB, 5 ;PONE EN ALTO RB5 QUE ES SALIDA DEMOD ;FSK Y ENTRA A RC7 bcf PORTB, 6 ;APAGA LINEA DE TELEFONO nop ******************** CONFIGURACION TMR2 ******************** CLRF T2CON ;para Timer2, Prescaler = 1:1, ;Postscaler = 1:1 CLRF TMR2 ;borra Timer2 clrf PIRI ;borra flag int. de periféricos movlw B'00000001' ;TMR2 PRESCALER 1:4 movwf T2CON ;Timer2 apagado bsf T2CON, TMR2ON ;Timer2 empieza a incrementar ******************** CONFIGURACION DEL SERIAL ******************** BANC01 bcf TXSTA, BRGH ;BAUD RATE low SPEED movlw .218 movwf SPBRG ;PONER BAUD RATE PARA 285 BPS BSF PIE1,RCIE ;prende interrupto de recepción bcf STATUS, RPO ;BANCO O bsf RCSTA, CREN ;RECIBE CONTINUO bsf RCSTA, SPEN ;YA SE PUEDE RECIBIR EN ASINCRONO bcf INTCON, O ;CERO LA FLAG DE RB7 bsf INTCON, 6 ;PERIPHERAL INT ON ******************** INICIALIZA VARIABLES, BANDERAS Y LCD .*********************************************************************•*************** ******************** clrf POINTERA movlw .255 movwf ALLONES clrf NEXTVALUE ;inicializa variables de sendtone 52 call DELAY2 call DELAY2 can RutinaLCD nop clrf CONTROL clrf CONTROL2 movlw .7 movwf CONTTEMP call UNO bsf inicio bsf pico ;llama DELAY2 ;inicializa LCD ;borra banderas de control ;inicializa contador de dtmf ;prende flag de inicio ;prende flag de picos en la linea ;simulada 53 bcf INTCON, RBIE ;deshabilita rb7 interrupto call DELAY2 bsf INTCON, GIE ;habilitando los interruptos call DELAY2 call DELAY2 ;************************************************************************************* ******************** ESPERA OPCION DE MENU ******************** MAININICIO btfsc inicio goto MAININICIO ;si no se ha escogido opción se ;queda aquí btfss linea ;salta si es transmisión goto MAIN ;se escogió recepción bcf INTCON, INTE ;deshab. interrupto externo en RBO 54 bsf INTCON, RBIE ;habilita rb7 interrupto bsf tonoinicio ;flag de espera de tono de inicio sleep ;espera detección de tono en la línea ******************** DETECTA TONO INICIAL DE LINEA TELEFONICA ******************** MAININICIOLINEA bsf linetemp ;prende bandera de tono inicial SEGTEMP movlw D'2' movwf CONT3 movlw D'5' movwf CONT2 movlw D'188' movwf CONT I ;inicializa retraso SEGITEMP decfsz CONT1,F goto SEGITEMP decfsz CONT2,F goto SEG1TEMP decfsz CONT3,F goto SEGITEMP bcf linetemp bsf lineauno ;si pasa más de 0.2seg salta ;apaga bandera de tono inicial ;prende bandera de espera de dtmf ******************** ESPERA QUE MARQUE EL NUMERO DE TELEFONO ;*•*******************************************************************************•*** ******************** MARCADO nop sleep nop btfsc lineauno ;si ya terminó de marcar salta goto MARCADO ;regresa pues no ha terminado ;de marcar bsf lineaerror ;prende bandera de primer vez ocupado bsf da_linea ;prende bandera de dar línea goto MAININICIOTEMPLINEA ;va a rutina de chequeo de ;dar línea ******************** RUTINA QUE CHEQUEA SI ESTA OCUPADO ******************** MAININICIO1 bsf ocupado ;prende bandera de ocupado 55 MEDIOSEG movlw 56 movwf CONT3 movlw D'205' movwf CONT2 movlw D'66' movwf CONT I ;inicializa espera de 0.5seg MEDIOSEGI bcf decfsz goto decfsz goto decfsz goto bcf bcf bsf PORTE, 2 CONT I ,F MEDIOSEG1 CONT2,F MEDIOSEGI CONT3,F MEDIOSEGI ocupado2 ocupado da linea ;parpadea led de conexión si ocupado ;si pasa 0.5seg se va a chequear si ;da línea ;borra bandera de ocupado2 ;borra bandera de ocupado ;prende bandera de dar línea •************************************************************************************* ******************** RUTINA QUE CHEQUEA SI DA LINEA ******************** MAININICIOTEMPLINEA movlw D'22' movwf CONT6 movlw D'100' 57 movwf CONT5 movlw D'1O1' movwf CONT4 ;inicializa espera de 4.2seg MAININICIOTEMP ;si pasan 4.2seg empieza conexión bcf PORTE, 2 ;parpadea led de conexión si da línea btfsc ocupado2 ;si está ocupado se va a MAININICIOI goto MAININICIOI decfsz CONT4,F goto MAININICIOTEMP decfsz CONT5,F goto MAININICIOTEMP decfsz CONT6,F goto MAININICIOTEMP btfss da_linea ;regresa a main inicio goto MAININICIOI ;si esta mudo pero no dio linea btfsc ocupado2 goto MAININICIOI bcf linea ;borra bandera de inicio bcf da linea bsf INTCON, RBIE ;habilita rb7 interrupto bcf INTCON, INTE ;deshab. interrupto externo en RBO bcf PORTE, 2 ;apaga led goto MAIN I ******************** RUTINA QUE ESPERA RECEPCION DE RING ******************** MAIN bcf INTCON, INTE ;deshab. interrupto externo en RBO bcf PORTE, 2 ;APAGA LAMPARA TEMPORAL bsf INTCON, RBIE ;habilita rb7 interrupto nop btfsc ring ;si es RX SIN RING no se va a sleep sleep nop btfsc picosleep ;chequea si hay picos en la línea goto MAIN ;si hay al principio regresa a MAIN btfss ring ;si RX CON RING salta goto MAIN 1.0 ;si RX SIN RING va a MAINI.O bsf INTCON, INTE ;hab. interrupto externo en RBO ;************************************************************************************* ******************** RUTINA PARA DETECTAR RING ******************** RINGER: movlw D22' movwf CONT6 movlw D' 1 00' movwf CONT5 58 59 movlw D'I01' movwf CONT4 ;inicializa espera de 4.2seg bcf PORTE, 2 ;apaga led y lámpara RINGERI btfsc picosleep goto MAIN bcf PORTE, 2 btfss ring goto MAIN 1.0 decfsz CONT4,F goto RINGERI decfsz CONT5,F goto RINGERI decfsz CONT6,F goto RINGERI goto RXTTY2 ;si picos regresa a MAIN ;apaga led y lámpara ;si ya contestó se va a MAIN I.0 ;SI PASAN 4.2 SEG DA ERROR EN CONEXION ;************************************************************************************* ******************** RUTINA PARA HABILITAR/DESHABILITAR INTERRUPTOS ******************** MAIN 1.0 bsf INTCON, RBIE ;habilita rb7 interrupto bcf INTCON, INTE ;deshab. interrupto externo en RBO ******************** RUTINA PARA CONEXION DE RX O TX ******************** MAIN1 call RutinaLCD clrf CONT_DIS call RETRASO call CUATRO btfsc rx_tty goto RXTTY btfsc tx tty goto TXTTY ;inicializa LCD ;borra contador LCD ;escribe CONECTANDO ;si RX se va a RXTTY ;si TX se va a TXTTY ******************** RUTINA QUE INICIALIZA CONVERSACION ******************** MAIN2 call RutinaLCD ;inicializa LCD clrf CONT_DIS ;borra contador LCD call RETRASO bsf offhook ;prende bandera de teléfono descolgado bsf INTCON, INTE ;hab. interrupto externo en RBO bsf PORTE, 2 ;PRENDO LED DE CONECCION ******************** RUTINA DE CONVERSACION 60 ******************** MAIN3 btfss offhook goto MAINEXIT nop nop nop nop nop nop goto MAIN3 ;si presionó ESC cuelga ;y se va a MAINEXIT ******************** RUTINA DE FIN DE CONVERSACION ******************** MAINEXIT btfss fin goto INICIO nop nop goto MAIN3 ;si presionó ESC se va a INICIO ;reinicia TTY ;********************************************************************•**************** ******************** RECEPCION DEL HANDSHAKE 61 ******************** RXTTY movlw .67 movwf CONT3 movlw .53 movwf CONT2 movlw .173 movwf CONT I ;inicializa espera de I3seg 62 RXTTY I btfss rx_tty goto MAIN2 decfsz CONT I ,F goto RXTTY1 decfsz CONT2,F goto RXTTY1 decfsz CONT3,F goto RXTTY1 btfss rx_tty goto MAIN2 ;si hace conexión se va a MAIN2 ;si más de 13seg da error en conexión ;si hace conexión se va a MAIN2 RXTTY2 call RutinaLCD clrf CONT_DIS call RETRASO call CINCO bsf fin ;inicializa LCD ;borra contador LCD ;escribe error en conexión ;prende bandera de fin de conversación 63 bcf PORTB, 6 ;apago línea bcf ring ;apago bandera de ring bs f INTCON, INTE ;hab. interrupto externo en RBO goto MAINEXIT ;se va a MAINEXIT ******************** TRANSMISION DEL HANDSHAKE ******************** TXTTY movlw D'20' movwf CONT4 TXTTY2OSEG movlw D'6' movwf CONT3 movlw D'24' movwf CONT2 movlw D'169' movwf CONT I ;inicializa espera de 20seg TXTTY I movlw 'S' movwf TEMP btfss tx_tty goto MAIN2 ;guarda S en TEMP ;si recibe A se va a MAIN2 decfsz CONT I ,F gofo TXTTY1 decfsz CONT2,F goto TXTTY 1 decfsz CONT3,F goto TXTTY I ;si menor de I seg regresa a TXTTY1 bcf INTCON, RBIE ;habilita rb7 interrupto call VCO call RETRASO ;cada I seg manda S bsf INTCON, RBIE ;habilita rb7 interrupto decfsz CONT4,F goto TXTTY2OSEG ;se va a TXTTY2OSEG btfss tx tty ;si recibe A se va a MAIN2 goto MAIN2 call RutinaLCD ;inicializa LCD clrf CONT LAS ;borra contador LCD call RETRASO call CINCO ;escribe error en conexión bsf fin ;prende badera de fin de conexión bcf PORTB, 6 ;apago línea bsf INTCON, INTE ;hab. interrupto externo en RBO goto MAINEXIT ;se va a MAINEXIT 64 ******************** Rutina para escribir menus de inicio ******************** UNO clrf CON I movlw .20 movwf WORD goto MENUS ;mueve a word el valor donde finaliza ;el puntero de programa ;va a leer memoria de programa ******************** Rutina para escribir linea ******************** DOS movlw .20 movwf CON I movlw .23 movwf WORD goto MENUS ;mueve a word el valor donde finaliza ;el puntero de programa ;va a leer memoria de programa ******************** Rutina para escribir ocupado ;********************************************************************•**************** ******************** 65 TRES 66 movlw .23 movwf CON1 movlw .27 ;mueve a word el valor donde finaliza movwf WORD ;el puntero de programa goto MENUS ;va a leer memoria de programa ******************** Rutina para escribir conectando ******************** CUATRO movlw .27 movwf CON I movlw .32 movwf WORD goto MENUS ;mueve a word el valor donde finaliza ;el puntero de programa ;va a leer memoria de programa ******************** Rutina para escribir error en conexión ;*************************************•*********************************************** ******************** CINCO movlw .32 movwf CON1 movlw .41 ;mueve a word el valor donde finaliza movwf WORD ;el puntero de programa goto MENUS ;va a leer memoria de programa 67 ;************************************************************************************* ******************** Rutina para escribir RING ;************************************************************************************* ******************** SEIS movlw .9 movwf CONI movlw .11 movwf WORD goto MENUS ;mueve a word el valor donde finaliza ;el puntero de programa ;va a leer memoria de programa ******************** Rutina para escribir esperando llamada ;****************************************************************************••••••*** ******************** SIETE movlw .41 movwf CONI movlw .50 movwf WORD goto MENUS ;mueve a word el valor donde finaliza ;el puntero de programa ;va a leer memoria de programa ******************** Rutina para leer memoria de programa 68 ;************************************************************************************* ******************** MENUS: BSF STATUS,RPI BCF STATUS, RPO MOVLW B'00011000' MOVWF EEADRH MOVF CON1, W MOVWF EEADR BSF STATUS, RPO BSF EECON I , EEPGD BSF EECON I , RD NOP NOP ;BANCO 2 ;MSBBYTE DEL PROGRAM ADDRESS ;MANDA A W EL CON 1 ;LSBBYTE DEL PROGRAM ADDRESS ;BANCO 3 ;APUNTE A MEMORIA DE PROGRAMA ;LEE BANCO2 BCF STATUS, C RLF EEDATH, W MOVWF DATH BCF STATUS, C RLF EEDATA, W BTFSC STATUS, C BSF DATH, O MOVF DATH, W BCF STATUS,RPI call RETRASO BANCO2 MOVF DATH, W BCF STATUS,RPI call Mayus_ptro ;CARRY EN O ;CORRO EL MSBYTE LEFT ;LO MANDO A DATE-I ;CARRY EN O ;SACO EL BIT DE MSBYTE AL CARRY ;MIRA SI SE PRENDIO EL CARRY ;PRENDE EL LSB DEL MSBYTE SI EL CARRY ;ERA UNO ;EN W ESTA EL MSBYTE ;BANCO O ;EN W ESTA EL MSBYTE ;BANCO O ;MANDA LA PRIMERA LETRA GUARDADA EN call DELAYO call DELAYO BANCO2 BCF EEDATA, 7 MOVF EEDATA, W BANCO() call Mayus otro INCE CON I,F MOVF WORD, W XORWF CON I, W BTFSS STATUS, Z GOTO MENUS return ;LINEA DE PROGRAMA ;BORRO EL BIT QUE NO SIRVE ;EN W ESTA EL LSBYTE ;MANDA LA SEGUNDA LETRA GUARDADA EN ;LINEA DE PROGRAMA ;AUMENTA CONI PARA CAMBIAR DE LINEA ;DE PROGRAMA ;MANDA A W LO DE WORD ;SI W ES IGUAL A CONI SALTE LINEA 69 ******************** Rutina para chequear que opción de inicio se presionó ******************** CHECKINICIO MOVWF KEYBD MOVLW 111;AT XORWF KEYBD, W BTFSC STATUS, Z GOTO TX MOVLW 2' XORWF KEYBD, W BTFSC STATUS, Z ;COMPARA SI ES I LA OPCION ;SI ERA DIFERENTE SE SALTEA ;SI ES 1 SE VA A TX ;COMPARA SI ES 2 LA OPCION ;SI ERA DIF SE SALTEA GOTO RXCONRING MOVLW XORWF KEYBD, W BTFSC STATUS, Z GOTO RXSINRING retum ;SI ES 2 SE VA A RX CON RING ;COMPARA SI ES 3 LA OPCION ;SI ERA DIE SE SALTEA ;SI ES 3 SE VA A RX SIN RING '7O ******************** Rutina para chequear que opción de inicio se presionó ******************** TX bsf PORTB, 6 bcf inicio bsf linea bsf tx_tty goto RutinaLCD ;contesta la línea ;baja bandera de inicio ;prende bandera de linea u ocupado ;sube bandera de transmisión del tty ;borra LCD ******************** Rutina para chequear que opción de inicio se presionó ******************** RXCONRING bcf inicio ;baja bandera de inicio bsf ring ;sube bandera de ring bsf rx_tty ;sube bandera de recepción del tty 71 call RutinaLCD ;inicializa LCD clrf CONTDIS ;borra contador LCD call RETRASO call SIETE ;escribe esperando llamada retum ******************** Rutina para chequear que opción de inicio se presionó ******************** RXSINRING bsf PORTB, 6 ;contesta la línea bcf inicio ;baja bandera de inicio bsf rx_tty ;sube bandera (le recepción del tty goto RutinaLCD ;borra LCD ******************** Rutina de Inicialización de LCD ******************** RutinaLCD bcf STATUS, RPO bcf STATUS, RP I bcf PORTE, 4 goto InicLCD ;asegurando estar en ;***banco O*** ;pin E = O ;borra LCD InicLCD ;Rutina de inicialización del LCD 72 bcf PORTB, 3 ;pin RS = O movlw b'00111100' ;modo de 2 líneas call Enable ;display on movlw 6'00001111' ;Display On, cursor On call Enable ;blink On movlw b'00000001' call Enable2 ;borra Display movlw b'00000111' ;modo de incrementar call Enable ;shift on retum ******************** Retraso de LCD ******************** Enable movwf TEMPI andlw 6'00001111' movwf PORTA swapf TEMPI, W andlw b'00001111' movwf PORTC bsf PORTB, 4 ;PONE LOS LSB1TS EN RAO-RA4 PARA LCD ;PONE LOS MSBITS EN RCO-RC3 PARA LCD ;pin E — 1 DELAYO movlw .75 movwf CONT I ;inicializa retraso DelayE decfsz CONTI, f ;si contador-0 salta goto DelayE bcf PORTB, 4 ;pin E = O return 73 ******************** Retraso 2 de LCD ******************** Enable2 movwf TEMPI andlw b'00001111' movwf PORTA swapf TEMPI, W andlw b'00001111' movwf PORTC bsf PORTB, 4 DELAYI clrf TMRO ;PONE LOS LSBITS EN RAO-RA4 PARA LCD ;PONE LOS MSBITS EN RCO-RC3 PARA LCD ;pin E = 1 ;borra TMRO DelayE2 movlw .35 xorwf TMRO, W BTFSS STATUS, Z goto DelayE2 ;si TMR0=35 salta 74 bef PORTB, 4 ;pin E = O reten ******************** Retraso de TMRO overflow ******************** DELAY2 clrf TMRO DelayE3 btfss INTCON, 2 goto DelayE3 bef PORTB, 4 return ;borra TMRO ;si hay overflow, TOIF=1 ;se sale de retraso y pin E = O ******************** Retraso de I .5mseg ******************** RETRASO movlw D2' movwf CONT2 movlw D'241' movwf CONTI LOOPRETRASO decfsz CONTI, F goto LOOPRETRASO ;inicializa retraso de I .5mseg 75 decfsz CONT2, F ;si contadores = O salta goto LOOPRETRASO return ******************** Retraso de 0.66seg ******************** RETRAS01.0 movlw .6 movwf CONT3 movlw .24 movwf CONT2 movlw .168 movwf CONT I RETRASO LOS decfsz CONT I ,F goto RETRASO I .0S decfsz CONT2,F goto RETRAS01.0S decfsz CONT3,F goto RETRASO LOS return ;inicializa retraso de 0.66seg ;si contadores = O salta ******************** Retraso de 0.33seg ;**************************•********************************************************** ******************** RETRAS00.33 76 movlw D'2' movwf CONT3 movlw D'174' movwf CONT2 movlw D'141' movwf CONTI ;inicializa retraso de 0.33seg RETRASO0J3S decfsz CONTI,F gofo RETRAS0033S decfsz CONT2,F gofo RETRAS0033S decfsz CONT3,F gozo RETRAS0033S retum ;si contadores = O salta ******************** Retraso de 39uSeg ******************** RETRASO39uSEG movlw D'12' movwf CONTI ;inicializa retraso de 39useg RETRASO39uSEGI decfsz CONTI,F ;si contador = O salta goto RETRAS039uSEGI retum ******************** 77 Rutina de Interrupto (inicio) ************************************************************************************* ******************** INTERR bcf STATUS, RPO bcf STATUS, RP I ;***banco O*** movwf W_SAVE ;guarda el cont. de W en W SAVE movf STATUS, w movwf STAT_SAVE ;guarda STATUS movf PCLATH, w movwf PCLII_SAVE ;guarda PCLATH ************************************************************************************* ******************** Rutina de Interrupto (determinación de fuente) ******************** btfsc PI R I ,RCIF ;FUE EL RCREG LLENO goto RECEPCION btfsc INTCON,RBIF ;FUE EL RB7? goto CHANGEPIN ;SE VA A RUTINA PARA DEMODULAR FREC DET_INTERR btfsc INTCON, 1NTF ;fue el rbO/INTO? ******************** Rutina de Teclado ************************************************************************************* ******************** TECLADO 78 call RECIBIR ;si -> Recibir, no -> Final call Chequeo goto FIN_INTERR ******************** Rutina de Interrupto (final) ******************** FIN_INTERR clrf STATUS movf PCLH SAVE, w movwf PCLATH movf STAT SAVE, w movwf STATUS swapf W_SAVE, f swapf W_SAVE, w bcf parity retfie ;***banco O*** ;restaura los registros ;STATUS, PCLATH y W ;mueve W_SAVE a w sin afectar ;el STATUS ;************************************************************************************* ******************** Rutina de Demodulación de FSK ******************** CHANGEPIN btfsc linea ;si bandera= I se va a CHECKLINEA goto CHECKLINEA 79 btfsc ring goto RINGON btfsc PIRI, TMR2IF goto clr_overflow movfw TO_count movwf Tlast movfw TMR2 movwf TO_count clrf TMR2 ;si bandera=1 se va a RINGON ;si hay overflow en TMR2 se sale ;guarda en Tlast lo pasado de TMR2 ;lee Timer 2 ;lo guarda en TO_count ;inicializa el timer2 FSKLIIGH movlw .43 subwf TO_count, W btfss STATUS, C goto FSKLOW movlw .53 subwf TO_count, W btfsc STATUS, C goto FSKLOW bcf PORTB,5 goto clubintf ;SI >-= 45 ENTONCES SALTA ;SI < 55 ENTONCES ES 2.5KHZ ;pone en O rb5 FSKLOW movlw .76 subwf TO count, W btfss STATUS, C ;SI >= 78 ENTONCES SALTA goto FSKANTES movlw .90 subwf TO_count, W btfsc STATUS, C goto FSKANTES bsf PORTB,5 goto clutintf ;SI < 88 ENTONCES ES 1.5KHZ ;pone en 1 en rb5 FSKANTES movlw .43;.45 subwf Tlast, W btfss STATUS, C goto FSKLOW2 ;SI >= 45 ENTONCES SALTA movlw .51;.55 subwf Tlast, W btfsc STATUS, C goto FSKLOW2 bcf PORTB,5 goto clubintf ;SI < 55 ENTONCES ES 2.5KHZ ;pone O en rb5 FSKLOW2 movlw .76 subwf Tlast, W btfss STATUS, C gota clr_rbintfl movlw .90 ;.88 subwf Tlast, W btfsc STATUS, C goto clr_rbintfl ;SI >= 78 ENTONCES SALTA ;SI <88 ENTONCES ES 1.5KHZ 80 81 bsf PORTB,5 ;pone l en rb5 goto clr rbintf clroverflow bcf PIR I, TMR2IF ;borra flag de TMR2 clrrbintfl nop ** ****** *a*** ****** 9 Rutina para salir de interrupto de flanco clrrbintf movf PORTB, F ;lee portb para quitar el mismatch bcf INTCON, RBIF ;borra bandera de int por flanco ;del portb goto FIN_INTERR .************************************************************************************* ** *************** *** Rutina de RING ***************** *** RINGON BANCOO btfsc pico ;si es pico se va a PICOCHECK goto PICOCHECK nop bef picosleep ;borra bandera de picos call RutinaLCD clrf CONT DIS bsf PORTE, 2 ;PRENDE LAMPARA call RETRASO call SEIS ;manda RING a LCD 82 movlw D22' movwf CONT6 movlw D' 1 00' movwf CONTS movlw D'I01' movwf CONT4 goto clr rbintf PICOCHECK bcf pico call RETRASO call RETRASO bsf picosleep goto clutintf ;inicializa espera ;borra bandera de picos ;borra la otra bandera de picos ******************** Rutina de chequeo si ocupado o da linea o tono inicial ******************** CHECKLINEA 83 btfsc tonoinicio ;si esta prendida se va a TONOINICIAL goto TONOINICIAL btfsc lineauno ;si esta prendida se va a ESPERAR goto ESPERAR btfsc ocupado ;si esta prendida se va a OCUPADO goto OCUPADO btfsc da_linea ;si esta prendida se va a LINEA goto LINEA btfss linetemp ;si esta prendida se va a LINETEMP goto clubintf ;si ninguna está prendida se sale goto LINETEMP ******************** Rutina para empezar a detectar tono inicial ******************** TONOINICIAL bcf tonoinicio ;baja bandera de tono inicial call RETRASO goto clr rbintf ******************** Rutina de detección de tono inicial ******************** LINETEMP call RutinaLCD ;borra LCD clrf CONT_DIS call RETRASO movlw D2' movwf CONT3 movlw movwf CONT2 movlw D' 188' movwf CONT I goto clr_rbintf ;borra contador LCD ;reinicializa vars de espera 84 ******************** Rutina de chequeo si da linea ;****** ******************** LINEA movfw TMR2 ;lee Timer 2 movwf TO_count ;lo guarda en TO_count para la próxima clrf TMR2 ;inicializa el timer2 movlw .192 subwf TOcount, W btfss STATUS, C gofo LINEACONTINUA2 bsf PORTE, 2 call RutinaLCD ;si < 192 -> es frec.mayor a 600Hz ;y se sale ;parpadea led indicando dar línea ;borra LCD 85 clrf CONT_DIS can RETRASO btfsc ocupado2 goto OCUPADOTEMP movlw .18 subwf CONT6, W btfss STATUS, C goto LINEATEMP movlw .22 subwf CONTÓ, W btfsS STATUS, C goto OCUPADOTEMP ;si está ocupado se va a OCUPADOTEMP ;SI >= 18 ENTONCES SALTA ;si no se va a LINEATEMP ;SI <21 ENTONCES VA A OCUPADOTEMP LINEATEMP bsf da_linea ;prende bandera de dar línea call DOS ;escribe LINEA en LCD LINEACONTINUA movlw D'22' movwf CONT6 movlw D'100' movwf CONT5 movlw D'I01' movwf CONT4 goto clubintf ;reinicializa vars. de espera LINEACONTINUA2 btfsc PIRI, TMR2IF ;hay overflow en TMR2 goto clr overflowl ;si no hay overflow se sale 86 goto LINEACONTINUA ;si hay se va a LINEACONTINUA OCUPADOTEMP bsf PORTE, 2 ;prende led bsf ocupado2 ;prende bandera ocupado2 goto LINEACONTINUA ******************** Rutina de esperar entre cada dtmf ******************** ESPERAR call RETRAS00.33 decfsz CONT TEMP,F goto clubintf bcf lineauno goto clr_rbintf clroyerflowl ;retraso de 0.33seg ;si acaba de marcar se sale ;borra bandera de dtmf bcf PIRI, TMR2IF ;borra flag de TMR2 goto clr_rbintf ******************** Rutina de chequeo si ocupado ******************** OCUPADO movfw TMR2 ;lee Timer 2 movwf TO_count ;lo guarda en TO_count para la próxima clrf TMR2 ;inicializa el timer2 movlw .192 subwf TO_count, W btfss STATUS, C ;SI < 192 -> FREC. MAYOR A 600HZ ;Y SE SALE goto OCUPADOCONTINUA2 btfsc lineaerror ;si primera vuelta se va a ESPERAR2 goto ESPERAR2 bsf PORTE, 2 ;parpadea led indicando estar ocupado call RutinaLCD ;borra LCD clrf CONTDIS ;borra contador LCD call RETRASO call TRES ;escribe ocupado en LCD OCUPADOCONTINUA movlw D'3' movwf CONT3 movlw D'205' movwf CONT2 movlw D'66' movwf CONT I goto clr rbintf ;reinicializa vars. de espera 87 OCUPADOCONTINUA2 btfsc PIRI, TMR2IF ;si hay overflow en TMR2 goto clr_overflow2 goto OCUPADOCONTINUA ;se va a OCUPADOCONTINUA ESPERAR2 call RETRAS01.0 ;llama retraso lseg bsf PORTE, 2 ;prende led bcf lineaerror ;borra bandera de lineaerror goto OCUPADOCONTINUA clr_overflow2 bcf PIRI, TMR2IF ;borra flag de TMR2 goto c Ir_rbint f ******************** RUTINA DE RECEPCION ******************** RECEPCION MOVF RCREG, W MOVWF RX ;MANDO LO DE RCREG A RX movf RX, w ;chequea si presionó I3ACKSPACE para ;borrar letra xorlw 6'11010000' ;0x66 88 89 btfsc STATUS, Z goto RXERRASE ;VA A BORRAR ULTIMA LETRA movf RX, w xorlw 6' l I I111001 btfsc STATUS, Z goto ESCAPAR btfsc rx_tty goto RECEPCIONTTYRX btfsc tx_tty goto RECEPCIONTTYTX ;chequea si presionó ESCAPE para ;cortar llamada ;VA A BORRAR ULTIMA LETRA ;si está en RX se va a RECEPCIONTTYRX ;si está en TX se va a RECEPCIONTTYTX bcf PORTB, 4 bsf PORTB, 3 movf RX, W cal! Mayus_otro call RETRASO goto FIN_INTERR ;pin E = O ;pin RS = I ;escribe lo recibido en LCD ;sale ******************** Rutina para contestar handshake del TTY RX ******************** RECEPCIONTTYRX movf RX, w xorlw 'S' btfss STATUS, Z goto FIN_INTERR bcf rx_tty call RETRASO ;CHEQUEA SI SE RECIBIO UNAS PARA ;EL ACKNOWLEDGE ;borra bandera de conexión en RX 90 call RETRASO movlw 'A' movwf TEMP call VCO goto FIN _INTERR ;manda A al TTY TX **YA*** *********** ** Rutina de recepción de acknowledge de TTY TX ************** ****** RECEPCIONTTYTX movf RX, w xorlw 'A' btfss STATUS, Z goto FIN INTERR bcf tx_tty goto FIN _INTERR ;CHEQUEA SI SE RECIBIO UNA A PARA ;EL ACKNOWLEDGE ;borra bandera de conexión en TX ****** *** ** **** ***** 9 Rutina para terminar conversación *Mg*** ** ** *** ****** ESCAPAR bcf offhook bcf PORTB, 6 bcf PORTE, 2 bsf fin bcf INTCON, RBIE ;apaga bandera de linea abierta ;apaga linea de teléfono ;apaga led de conección ;prende bandera de final programa ;apaga interrupto de rb7 goto FIN_INTERR ******************** Rutina para henar ultima letra en LCD ******************** RXERRASE cal( ERRASE ;VA A BORRAR ULTIMA LETRA goto FIN_INTERR ******************** Rutina de Recepción de la señal del teclado ******************** RECIBIR ;estarnos en ***banco 0*** btfsc PORTB, O ;revisa el 'start bit' goto SalirR ;si -> RecKeybd, no -> salir de rutina 91 RecKeybd btfsc PORTB, 1 goto RecKeybd movlw b'l 1110000' andwf FLAGS, f clrf KEYBD ;revisa el pin de clock, si está bajo ;->salte, no -> loop ;borra las cuatro banderas inferiores ;borra el byte de dato del teclado 92 movlw Ox08 movwf CONTI ;inicializa el contador para ;recibir 8 bits RecLoop call DelayCambioBadlama a rutina de delay basado en ;estado de clock btfsc rx en- ;error en recepción? si -> salir, ;no -> continuar goto SalirR bcf STATUS, C btfsc PORTB, O bsf STATUS, C rrf KEYBD, f decfsz CONTI, f goto RecLoop ;borra el carry ;revisa el pin RBO: set -> C = 1, ;no -> C = O ;rote KEYBD a la derecha a través de C ;decremente el contador, salte ;si da cero RevParidad ;rutina para revisión de paridad call DelayCambioBit btfsc rx err goto Sal irR RecStopBit call DelayCambioBit;espera cambio de bit btfsc rx err goto SalirR btfsc PORTB, O ;Stop Bit: O -> SalirR bsf bien r ;1 -> enciende la bandera bien r 93 goto SalirR DelayCambioBit bcf INTCON, TOIF ;borra bandera del Timer O clrf TMRO ;borra el Timer O DelayCambioBa btfsc INTCON, TOIF ;revisa si ha ocurrido un overflow ;del Timer O goto SalirDelay ;si -> Salir, no -> skip btfss PORTB, 1 ;revisa el clock, espera q' se ponga goto DelayCambioBa ;en alto para continuar DelayCambioBb btfsc INTCON, TOIF goto SalirDelay btfsc PORTB, 1 ;revisa clock, espera q' se ponga goto DelayCambioBb;en bajo para regresar a rutina return ;de recepción SalirDelay bsf ncerr return SalirR bcf INTCON, INTF ;borra la bandera de interru