Universidad ORT Uruguay Facultad de Ingenierı́a Procesador para control multiprotocolar Entregado como requisito para la obtención del tı́tulo de Ingeniero en Telecomunicaciones Alan Cohn - No 137033 Rossana Morales - No 67756 Tutor: Ing. Matias Nogueira 2007 Agradecimientos Agradecemos a todas aquellas personas que han aportado su granito de arena para ayudarnos en esta experiencia, desde lo conceptual hasta lo material, especialmente a nuestro tutor, el Ing. Matı́as Nogueira por el apoyo y la constante asistencia a favor del proyecto. Queremos destacar la colaboración de los ingenieros Martı́n Szmulewicz y Pablo Hoffman, ası́ como también a las empresas Ikatu y Sonda Uruguay. Finalmente a nuestras familias y amigos por brindarnos su apoyo incondicional en cada momento. 2 Abstract La evolución de la tecnologı́a y la invención de nuevos protocolos vienen acompañadas de un cambio de paradigmas a la hora de controlar los diferentes dispositivos que funcionan en base a la implementación de protocolos. Mientras en el pasado se buscaba mantener el control individual de cada equipo dedicando un control especı́fico para cada aplicación -, en estos tiempos, mediante la creación de plataformas y arquitecturas es menester la domótica y la automatización de sistemas. La Internet es una red de redes, miles de redes basadas en tecnologı́as heterogéneas se comunican en ella ofreciendo un conjunto ilimitado de servicios. La familia de protocolos TCP / IP es la base de la Internet que sirve para enlazar computadores que utilizan diferentes sistemas operativos. Cada vez son más y mejores las aplicaciones que utilizan este set de protocolos para brindar conectividad total entre usuarios y equipos. La automatización y la domótica tienden al uso de la Internet como la plataforma que permite la conexión y la comunicación entre dispositivos para su uso doméstico o industrial. El proyecto consiste en la investigación, diseño y construcción de un sistema capaz de ofrecer el uso de determinados protocolos a través de una interfaz Ethernet. Se busca crear un dispositivo dedicado a intercomunicar un conjuntos de protocolos incompatibles. Se implementa el control sobre distintos protocolos, donde se ha investigado y estudiado especı́ficamente sobre los siguientes: Ir, RS232 y entradas / salidas digitales. El estudio concreto de los protocolos anteriormente mencionados corresponde a su gran inserción en el mercado de la ingenierı́a. Dichos protocolos fueron los elegidos para ser implementados. El sistema consta de un bloque central y varios módulos exteriores, cumpliéndose la condición que cada módulo exterior maneja, controla y permite el funcionamiento de un único protocolo. La cantidad de módulos exteriores que componen el sistema está sujeta a las preferencias del usuario, permitiendo el uso máximo de 16 módulos por sistema. Esta experiencia no solo consistió en la realización del proyecto en sı́, sino también en el aprendizaje relativo a la gestión de un proyecto. Para su gestión se emplearon distintas herramientas que facilitaron el diseño y el avance du3 rante el mismo. En este documento se incluyen apuntes, decisiones de diseño y conclusiones, sobre la evolución y progreso del proyecto. 4 Índice Capı́tulo 1. Proyecto 1.1. Introducción . . . . . . . . . . . . . 1.1.1. Domótica y automatización 1.1.2. Protocolos . . . . . . . . . . 1.1.3. Descripción del sistema . . . 1.2. Motivación . . . . . . . . . . . . . . 1.3. Objetivos . . . . . . . . . . . . . . 1.4. Gestión del proyecto . . . . . . . . 1.4.1. Planificación y desarrollo . . 1.5. Implementación . . . . . . . . . . . 1.6. Estructura del documento . . . . . 1.7. Referencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Parte I - Sistemas Embebidos Capı́tulo 2. Sistemas Embebidos 2.1. Introducción . . . . . . . . . 2.2. Marco teórico . . . . . . . . 2.2.1. Protocolo OSGI . . . 2.3. Placas Rabbit . . . . . . . . 2.3.1. RCM3700 . . . . . . 2.3.2. RCM3720 . . . . . . 2.3.3. Dynamic C . . . . . 2.3.4. Precios . . . . . . . . 2.4. Placas Digi . . . . . . . . . 2.4.1. ConnectCore 7U . . 2.4.2. Prestaciones . . . . . 2.4.3. Consideraciones . . . 2.4.4. Precios . . . . . . . . 2.5. Placas PC104 . . . . . . . . 2.5.1. TS-7200 ARM . . . . 2.5.2. Prestaciones . . . . . con interfaz . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 11 11 12 13 13 14 14 15 18 18 20 21 Ethernet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 22 23 23 26 26 26 27 28 28 28 28 29 30 30 30 30 5 ÍNDICE 2.5.3. Consideraciones . 2.5.4. Precios . . . . . . 2.6. Comparación de placas . 2.6.1. Precio . . . . . . 2.6.2. Dimensiones . . . 2.6.3. Caracterı́sticas . 2.6.4. Soporte . . . . . 2.6.5. ¿Por qué Rabbit? 2.7. Referencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 32 32 32 32 32 33 33 35 Capı́tulo 3. Desarrollando con Rabbit 3.1. Introducción . . . . . . . . . . . . . . . . . . 3.2. Marco teórico . . . . . . . . . . . . . . . . . 3.2.1. Protocolo HTTP . . . . . . . . . . . 3.2.2. Protocolo SMTP . . . . . . . . . . . 3.2.3. Protocolo HTML . . . . . . . . . . . 3.2.4. Telnet . . . . . . . . . . . . . . . . . 3.3. Prestaciones del RCM3700 . . . . . . . . . . 3.3.1. Dimensiones . . . . . . . . . . . . . . 3.3.2. Kit de desarrollo . . . . . . . . . . . 3.3.3. Referencia del hardware . . . . . . . 3.3.4. Prestaciones con Ethernet . . . . . . 3.3.5. Prestaciones con Dynamic C . . . . . 3.4. Estrategia de programación y desarrollo . . 3.4.1. Formas de programación de la placa . 3.4.2. Debugging . . . . . . . . . . . . . . . 3.4.3. Gestión ante errores y problemas . . 3.5. Pruebas . . . . . . . . . . . . . . . . . . . . 3.5.1. BotonEnviaCaracter.c . . . . . . . . 3.5.2. Autentificación.c . . . . . . . . . . . 3.5.3. Leds.c . . . . . . . . . . . . . . . . . 3.5.4. LedsAutenti.c . . . . . . . . . . . . . 3.5.5. EnviaMail.c . . . . . . . . . . . . . . 3.5.6. FormAsociada.c . . . . . . . . . . . . 3.6. Referencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37 37 38 38 40 42 42 43 43 43 44 48 58 62 64 64 65 66 66 67 67 68 68 68 69 Parte II - Manejo y control de protocolos 71 Capı́tulo 4. Arquitectura multiprotocolar 72 4.1. Introducción . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72 4.2. Marco teórico . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72 4.2.1. Protocolo CEBus . . . . . . . . . . . . . . . . . . . . . . 72 6 ÍNDICE 4.2.2. Protocolo SCP . . . . . . . . . . . . . . . . . . . . . . . 4.2.3. Protocolo EIB . . . . . . . . . . . . . . . . . . . . . . . . 4.2.4. Protocolo LonWorks . . . . . . . . . . . . . . . . . . . . 4.2.5. Protocolo EHS . . . . . . . . . . . . . . . . . . . . . . . 4.2.6. Protocolo RS485 . . . . . . . . . . . . . . . . . . . . . . 4.2.7. Protocolo GPIB . . . . . . . . . . . . . . . . . . . . . . . 2 4.2.8. Protocolo I C . . . . . . . . . . . . . . . . . . . . . . . . 4.2.9. Cable par trenzado . . . . . . . . . . . . . . . . . . . . . 4.3. Creación de un protocolo propio . . . . . . . . . . . . . . . . . . 4.4. Definiciones relativas a la arquitectura multiprotocolar . . . . . 4.5. Descripción del protocolo por capas . . . . . . . . . . . . . . . . 4.5.1. Capa fı́sica . . . . . . . . . . . . . . . . . . . . . . . . . . 4.5.2. Capa de conexión . . . . . . . . . . . . . . . . . . . . . . 4.5.3. Capa de acciones . . . . . . . . . . . . . . . . . . . . . . 4.6. Análisis de velocidades y tiempos . . . . . . . . . . . . . . . . . 4.6.1. Tiempo de transferencia del mensaje (Ttm ) . . . . . . . . 4.6.2. Tiempo de transferencia de las notificaciones (Ttn ) . . . . 4.6.3. Retardo de propagación de los integrados utilizados (Rp ) 4.6.4. Tiempo de espera entre intento e intento (Te ) . . . . . . 4.6.5. Tiempo máximo del ciclo de consulta del Rabbit (Tcm ) . 4.6.6. Tiempo de inicialización de los módulos exteriores (Ti ) . 4.6.7. Tiempo entre envı́o y envı́o de bytes (Tb ) . . . . . . . . . 4.6.8. Tiempo mı́nimo entre acciones consecutivas al mismo módulo exterior (Tac ) . . . . . . . . . . . . . . . . . . . . 4.7. Funcionamiento . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.7.1. Ciclo de consulta . . . . . . . . . . . . . . . . . . . . . . 4.7.2. Acciones del Rabbit . . . . . . . . . . . . . . . . . . . . 4.7.3. Eventos esporádicos . . . . . . . . . . . . . . . . . . . . . 4.7.4. Consideraciones . . . . . . . . . . . . . . . . . . . . . . . 4.8. Implementación en la placa Rabbit . . . . . . . . . . . . . . . . 4.8.1. Universalidad de IDs . . . . . . . . . . . . . . . . . . . . 4.8.2. Procedimiento . . . . . . . . . . . . . . . . . . . . . . . . 4.9. Implementación en los módulos exteriores . . . . . . . . . . . . . 4.9.1. Procedimiento . . . . . . . . . . . . . . . . . . . . . . . . 4.9.2. Aspectos a considerar . . . . . . . . . . . . . . . . . . . . 4.9.3. Pines de utilización genérica . . . . . . . . . . . . . . . . 4.9.4. Archivos base . . . . . . . . . . . . . . . . . . . . . . . . 4.9.5. Programación en el PIC . . . . . . . . . . . . . . . . . . 4.10. Solución no implementada . . . . . . . . . . . . . . . . . . . . . 4.10.1. Principio de funcionamiento . . . . . . . . . . . . . . . . 4.10.2. Cálculo de probabilidad . . . . . . . . . . . . . . . . . . 4.10.3. Inconveniente . . . . . . . . . . . . . . . . . . . . . . . . 4.11. Referencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73 74 74 75 76 76 81 83 84 84 85 85 90 96 98 98 98 99 99 100 100 100 101 101 101 101 102 102 103 103 103 105 105 107 107 108 108 109 110 112 113 113 7 ÍNDICE Capı́tulo 5. Módulos exteriores 5.1. Introducción . . . . . . . . . . . . . . 5.2. Marco teórico . . . . . . . . . . . . . 5.2.1. Protocolo Ir . . . . . . . . . . 5.2.2. Protocolo RS232 . . . . . . . 5.2.3. Amplificación en clase A . . . 5.3. El PIC 16F628A . . . . . . . . . . . 5.3.1. Propiedades . . . . . . . . . . 5.3.2. Pinout . . . . . . . . . . . . . 5.4. Fundamentos comunes . . . . . . . . 5.4.1. Pines de utilización genérica . 5.4.2. Direccionamiento . . . . . . . 5.4.3. Circuito de reset . . . . . . . 5.5. Modulo exterior Ir . . . . . . . . . . 5.5.1. Proceso de implementación . . 5.5.2. Desarrollo final . . . . . . . . 5.5.3. Puertos adicionales de I/O . . 5.5.4. Interrupciones utilizadas . . . 5.6. Módulo exterior RS232 . . . . . . . . 5.6.1. Consideraciones . . . . . . . . 5.6.2. Puertos adicionales de I/O . . 5.6.3. Interrupciones utilizadas . . . 5.7. Módulo exterior de salidas digitales . 5.7.1. Consideraciones . . . . . . . . 5.7.2. Puertos adicionales de I/O . . 5.7.3. Interrupciones utilizadas . . . 5.8. Módulo exterior de entradas digitales 5.8.1. Consideraciones . . . . . . . . 5.8.2. Puertos adicionales de I/O . . 5.8.3. Interrupciones utilizadas . . . 5.9. Referencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115 . 115 . 116 . 116 . 123 . 128 . 129 . 129 . 130 . 130 . 131 . 131 . 131 . 133 . 133 . 139 . 139 . 139 . 140 . 140 . 141 . 142 . 142 . 142 . 142 . 142 . 142 . 142 . 143 . 143 . 144 Parte III - Conclusiones 146 Capı́tulo 6. Mejoras pendientes 6.1. Introducción . . . . . . . . . . . . . . . . . . 6.2. Mejoras relativas al bloque central . . . . . . 6.2.1. Funcionalidad del reset por software . 6.2.2. Universalidad de módulos exteriores . 6.2.3. Aplicación del protocolo Telnet . . . 6.2.4. Software de configuración y firmware 6.2.5. Utilización del servidor FTP . . . . . 147 . 147 . 147 . 147 . 148 . 148 . 148 . 149 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 ÍNDICE 6.2.6. Compresión de archivos en el servidor HTTP . 6.2.7. Interfaz gráfica de manejo . . . . . . . . . . . 6.2.8. Aumento de la velocidad de transmisión . . . 6.2.9. Escalabilidad de Rabbits y control central . . 6.3. Mejoras en los módulos exteriores . . . . . . . . . . . 6.3.1. Generación de una base de datos infrarroja . . 6.3.2. Fuente de corriente para módulo exterior Ir . . 6.3.3. Alimentación directa del bus . . . . . . . . . . 6.3.4. Manejo de mayor cantidad de protocolos . . . 6.4. Mejoras de fabricación . . . . . . . . . . . . . . . . . 6.4.1. Protección ante inclemencias del ambiente . . 6.4.2. Fabricación de un circuito impreso . . . . . . 6.4.3. Protección ante interferencia electromagnética 6.5. Referencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Capı́tulo 7. Cierre del proyecto 149 149 149 150 150 150 150 150 151 151 151 151 152 152 153 Bibliografı́a 155 Parte IV - Anexos 161 Anexo A. Herramientas de gestión de proyecto A.1. Introducción . . . . . . . . . . . . . . . . . . A.2. TWiki . . . . . . . . . . . . . . . . . . . . . A.3. UltraVNC . . . . . . . . . . . . . . . . . . . A.4. Pic Simulator IDE . . . . . . . . . . . . . . A.5. Referencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Anexo B. Esquemáticos Anexo C. Códigos Fuentes C.1. Introducción . . . . . . . . . . C.2. Código ModRs232.asm . . . . C.3. Código ModIR.asm . . . . . . C.4. Código ModIN.asm . . . . . . C.5. Código ModOUT.asm . . . . C.6. Código IrAiwa.asm . . . . . . C.7. Código ArquitecturaRabbit.c . C.8. Código PaginaWeb.txt . . . . C.9. Código BotonEnviaCaracter.c C.10.Código Autentificacion.c . . . C.11.Código Leds.c . . . . . . . . . 162 162 162 165 166 167 169 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173 173 173 184 199 206 220 231 240 241 243 244 9 ÍNDICE C.12.Código EnviaMail.c . . . . . . . . . . . . . . . . . . . . . . . . . 246 C.13.Código AutentiLeds.c . . . . . . . . . . . . . . . . . . . . . . . . 247 Anexo D. Hojas de datos, tablas y licencias D.1. Hojas de datos . . . . . . . . . . . . . . D.1.1. Microprocesador Rabbit 3000 . . D.1.2. Microprocesador PIC 16F628A . D.1.3. MAX232 . . . . . . . . . . . . . . D.1.4. MAX485 . . . . . . . . . . . . . . D.1.5. Compuerta NOR MC14001 . . . D.1.6. Multiplexor 74HC153 . . . . . . . D.1.7. Demultiplexor CD4555 . . . . . . D.1.8. Regulador LM7805 . . . . . . . . D.1.9. Transistor BC547 . . . . . . . . . D.1.10.Emisor Ir L53SF4BT . . . . . . . D.2. Tablas . . . . . . . . . . . . . . . . . . . D.2.1. Tabla RC5 . . . . . . . . . . . . . D.3. Licencias . . . . . . . . . . . . . . . . . . D.3.1. Licencia GNU . . . . . . . . . . . D.3.2. Licencia BSD . . . . . . . . . . . Anexo E.1. E.2. E.3. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 250 . 250 . 250 . 250 . 250 . 250 . 250 . 250 . 251 . 251 . 251 . 251 . 251 . 251 . 251 . 251 . 251 E. Decodificación infrarroja 252 Introducción . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 252 Decodificación de los comandos . . . . . . . . . . . . . . . . . . 252 Forma de onda de los comandos . . . . . . . . . . . . . . . . . . 254 10 Capı́tulo 1 Proyecto 1.1. 1.1.1. Introducción Domótica y automatización Los sistemas actuales integran informática, automatización y nuevas tecnologı́as. La domótica trata de aplicar la tecnologı́a de la automatización y el control al hogar. Según el diccionario “Larrouse”de la Real Academia de la Lengua Francesa, la domótica es el “conjunto de servicios proporcionados por sistemas tecnológicos integrados, como el mejor medio para satisfacer estas necesidades básicas de seguridad, comunicación, gestión energética y confort, al servivio del hombre y de su entorno más cercano”. Ver [Domoticaviva, 2002]. Basado en [DomoDesk, 2002], los dispositivos de un sistema pueden clasificarse en: Controlador: central en la cual reside la inteligencia y que gestiona el sistema. Actuador: dispositivo de salida capaz de recibir una orden del controlador y realizar una acción. Sensor: equipo que constantemente monitorea el entorno con el objetivo de generar un evento a ser procesado por el controlador. Existen equipos que son controladores/sensores/actuadores al mismo tiempo, lo que permite disponer en un único equipo de la inteligencia necesaria para medir una variable fı́sica, procesarla y actuar en consecuencia. La mayorı́a de las soluciones del mercado, se construyen diferenciando los sensores de los actuadores con el objetivo de aportar mayor flexibilidad y menor precio de cara a la instalación e integración en una vivienda. Según [Wikipedia1, 2007], desde el punto de vista del sistema existen varias arquitecturas posibles: 11 CAPÍTULO 1. PROYECTO Arquitectura centralizada - un controlador centralizado recibe información de varios sensores, la procesa y genera comandos hacia otros actuadores. Arquitectura distribuida - la inteligencia del sistema está distribuida entre módulos sensores o actuadores. Arquitectura mixta - sistemas descentralizados en cuanto a que disponen de pequeños dispositivos capaces de adquirir y procesar la información de múltiples sensores y transmitirlos al resto de los equipos distribuidos en la vivienda. Figura 1.1: Arquitecturas 1.1.2. Protocolos El intercambio de información y datos, ası́ como también la comunicación entre sistemas, es la base de la teorı́a de redes. En ingenierı́a, al lenguaje que emplean los distintos elementos que componen las redes se lo denomina “protocolo”. Como definición más formal, se considera un protocolo de comunicación al conjunto de reglas que controlan la secuencia de mensajes que ocurren durante una comunicación entre entidades que forman una red. Ver [Wikipedia2, 2007]. Las entidades son vistas como dispositivos electrónicos y automatismos que interactúan, o el software que permite su aplicación. Suelen convertirse en estándares, los protocolos implementados en sistemas de comunicación que tienen gran impacto. Existen consorcios empresariales, que tienen como propósito proponer recomendaciones de estándares que se deben respetar para asegurar la interoperabilidad de productos y sistemas. En este documento se especifican los distintos protocolos que forman parte del proyecto, los cuales corresponden a especificaciones de capa fı́sica y apli12 CAPÍTULO 1. PROYECTO cación. La investigación, el análisis de los mismos y sus caracterı́sticas permitió la concepción e implementación de la arquitectura multiprotocolar y los módulos exteriores. 1.1.3. Descripción del sistema El sistema está constituido por un bloque central y al menos un módulo exterior. El sistema es escalable hasta un máximo de 16 módulos exteriores. Los datos arriban por la interfaz Ethernet, son procesados por el bloque central y luego transmitidos hacia los módulos exteriores. La figura 1.2 muestra un gráfico referido a la composición del sistema. MÓDULO EXTERIOR 1 BLOQUE CENTRAL MÓDULO EXTERIOR 2 MÓDULO EXTERIOR n Figura 1.2: Diagrama en bloques del sistema La personalización apunta al empleo de distintos módulos exteriores controlados por la misma interfaz, ası́ como también a la utilización de varios de éstos, del mismo tipo. Se establece la propiedad de plug & play, pudiéndose integrar y retirar del sistema la cantidad de módulos exteriores que el usuario desee. 1.2. Motivación Se ha optado por el desarrollo de un procesador de usos múltiples, el cual ofrece la integración de varias aplicaciones e interfaces en un mismo sistema. Los productos disponibles en el mercado brindan soluciones para la automatización y control centralizado, manejan distintos protocolos integrados dentro de un mismo sistema, pero no permiten la minimización y personalización del hardware y de las aplicaciones que son utilizadas (según la jerga de este proyecto, el uso y manejo de módulos exteriores de acuerdo a las necesidades de cada usuario). Asimismo, el diseño de éstos productos corresponde a una solución integrada dentro un mismo espacio fı́sico, situándolo próximo a los dispositivos a controlar y teniendo como limitante la distancia máxima que soporta la conexión 13 CAPÍTULO 1. PROYECTO fı́sica hacia cada uno de ellos. Se restringe el campo de acción de los protocolos a la ubicación del producto. Es intensión, brindar al mercado un sistema de bajo costo, escalable y personalizable, que presente la posibilidad de elegir los protocolos a emplear, con el objetivo que el usuario final pueda configurar su producto para cada situación en particular. También es motivo de desarrollo, la ubicación de los módulos exteriores a una distancia considerable del módulo central y cerca de los equipos a controlar. De esta forma, es posible ubicar el módulo central en un espacio dedicado y los módulos exteriores concurrentes con cada una de las aplicaciones deseadas. Por ejemplo: ubicar el módulo exterior Ir próximo a una televisión. localizar el bloque central adjunto a un router o modem ADSL. colocar el módulo exterior de salidas digitales junto a relées que permiten la apertura de determinada puerta. 1.3. Objetivos Los objetivos del proyecto son: Estudio de una estructura multiprotocolo. Establecer un protocolo general para manejar los distintos módulos exteriores. Proporcionar escalabilidad y versatilidad de módulos exteriores. Posibilidad de comandar el sistema vı́a Ethernet. Obtener un prototipo funcionando (pequeño, compacto y de fácil manejo). Su debida gestión. 1.4. Gestión del proyecto La gestión de un proyecto es el proceso por el cual se planifica, dirige y controla el desarrollo de un sistema dentro de un perı́odo de tiempo especifico. Se destacan las siguientes etapas: 14 CAPÍTULO 1. PROYECTO • Fase de planificación o Se establece la forma en la cual el equipo de trabajo determinará: alcance de las prestaciones planificación temporal coste o Definición de objetivos • Fase de ejecución o Realización de actividades propiamente dichas del proyecto o Monitoreo del trabajo, analizando las diferencias entre el progreso y la planificación inicial • Fase de entregables o Culminación de tareas: documentación prototipo funcionando o Testeo del sistema La interacción entre la gestión y la realización del proyecto podrı́a definirse según la figura 1.3 El control, la coordinación y las decisiones fueron etapas realizadas con la ayuda del tutor del proyecto, para facilitar el cometido del know - how técnico. Adicionalmente de las responsabilidades de diseño e implementación, se debió cumplir el papel de directores de proyecto. Una gestión errónea desemboca, a menudo, en el no cumplimiento de los objetivos trazados. Las causas pueden ser omisiones realizadas durante el desarrollo del mismo, definiciones imprecisas de objetivos y deficientes técnicas de estimación de tareas y tiempos. Una planificación detallada da consistencia al proyecto y evita sorpresas. Éstas consideraciones fueron obtenidas de los informes [Wikipedia3, 2007] y [GETEC, 2005]. 1.4.1. Planificación y desarrollo La siguiente es una breve descripción del plan de trabajo llevado a cabo: Las primeras dos semanas fueron dedicadas exclusivamente a la planificación del proyecto. Se fijaron las pautas generales a seguir, las etapas a cubrir, objetivos, plazos y expectativas. Además, se escogieron las herramientas a utilizar para realizar el seguimiento y la gestión. También, se consideró la viabilidad y los requisitos que deberá satisfacer el sistema. 15 CAPÍTULO 1. PROYECTO Figura 1.3: Integración entre la gestión y el preyecto Seguidamente, se comenzó con la investigación de los distintos sistemas embebidos con interfaz ethernet. Habiendo decidido la utilización de una placa Rabbit como módulo central, se estudiaron y establecieron los primeros protocolos que fueron implementados. Se realizaron las pruebas correspondientes al manejo del stack de protocolos TCP/IP y a las aplicaciones concurrentes con los distintos puertos seriales de la placa Se discutieron, analizaron y profundizaron conceptos relevantes a la arquitectura multiprotocolar y al diseño de los módulos exteriores. Localizando la atención en cada módulo, se programó cada uno para que cumpliera con las consideraciones preestablecidas. Se programó la placa Rabbit y se verificó que cumpliera con las condiciones del protocolo diseñado. Finalmente, se testeó y depuró el sistema. 16 CAPÍTULO 1. PROYECTO Cronograma Figura 1.4: Cronograma de trabajo 17 CAPÍTULO 1. PROYECTO 1.5. Implementación Habiendo determinado la magnitud del proyecto, realizado el análisis y las investigaciones correspondientes, a medida que se efectuó la compra de los materiales y los componentes necesarios, se comenzó con la implementación de la solución. Cabe destacar que esta etapa retroalimentó el análisis y la investigación, ya que al desplegar las soluciones surgieron distintos inconvenientes que demandaron un nuevo estudio de las condiciones existentes, replanteando la teorı́a y realizando nuevas pruebas. En el Capitulo 4 se describe la forma en la cual la implementación de la solución teórica no tuvo soporte práctico, de aquı́ la necesidad de volver a pensar una nueva alternativa. 1.6. Estructura del documento El documento se encuentra dividido en cuatro partes. Las partes expresan una temática abarcada durante el desarrollo del proyecto. Cada capı́tulo abarca la etapa de investigación y análisis seguida de la implementación, las pruebas y las conclusiones correspondientes. Para la primera etapa, se describe una base teórica, que busca la consistencia y coherencia de la solución. Se dispone de 7 capı́tulos y 5 apéndices. Ellos son: Capı́tulo 1. Proyecto Realiza una introducción del proyecto presentando las motivaciones, objetivos y aspiraciones del mismo. Se describe el proceso de gestión y la planificación del plan de trabajo. Capı́tulo 2. Sistemas embebidos con interfaz Ethernet Describe los distintos sistemas embebidos con interfaz Ethernet considerados para el desarrollo del proyecto. Se emplean argumentos y consideraciones para la elección de la placa RCM3700 de Rabbit Semiconductor como el módulo central del sistema. Capı́tulo 3. Desarrollando con Rabbit Profundiza en las prestaciones del Rabbit RCM3700, especificando claramente posibilidades de desarrollo en Dynamic C. Se analizan las librerı́as concurrentes a los objetivos del proyecto y se aclara la estrategia de imple- 18 CAPÍTULO 1. PROYECTO mentación seguida durante el transcurso del mismo. Se adjunta una descripción de las pruebas realizadas. Capı́tulo 4. Arquitectura multiprotocolar Puntualiza plenamente la concepción de la arquitectura multiprotocolar, definiéndola capa por capa, en sus 3 niveles. Detalla su implementación en el Rabbit, como también, en los módulos exteriores. Sobre le final del capı́tulo se expone una solución que no fue implementada por limitaciones del hardware elegido. Capı́tulo 5. Módulos exteriores Detalla las consideraciones efectuadas para el desarrollo de cada módulo exterior, precisando consideraciones de hardware y aspectos recurrentes a la programación de los PIC. Se especifican, en profundidad, los avances para lograr el control sobre el protocolo Ir. Capı́tulo 6. Mejoras pendientes Este capı́tulo es una revisión de los temas pospuestos para futuras mejoras de la solución. Especifica mejores relativas al bloque central, los módulos exteriores y la fabricación del producto. Capı́tulo 7. Conclusiones y cierre del proyecto Resalta las conclusiones obtenidas, la evaluación final del trabajo y las lecciones durante el transcurso del proyecto. Bibliografı́a Conceptualiza las distintas fuentes que sirvieron como base para el desarrollo del proyecto. Apéndice A. Herramientas de gestión de proyecto Se describen las herramientas utilizadas durante el proyecto que se emplearon en beneficio de la gestión del mismo. Apéndice B. Esquemáticos Contiene los esquemáticos completos del procesador para control multiprotocolar. 19 CAPÍTULO 1. PROYECTO Apéndice C. Código fuente Formaliza la implementación en la placa Rabbit y en PIC por medio del código fuente. El lenguaje de programación es C para Rabbit y Assembler para el PIC. Apéndice D. Hojas de datos, tablas y licencias Señala distintos links para las hojas de datos de todos los componentes mencionados en la documentación. También, adiciona un enlace especificando las licencias que permiten la utilización de las herramientas de gestión de proyecto. Apéndice E. Decodificación infrarroja Se especifica la decodificación de los comandos infrarrojos del radiograbador Aiwa y sus correspondientes formas de onda. 1.7. Referencias [GETEC, 2005] GETEC. 2005.Etapas de un proyecto .[online] Disponible en Internet: <http://www.getec.etsit.upm.es/docencia/gproyectos/ planificacion/etapas.htm> [DomoDesk, 2002] DOMODESK SL. 1998.Domótica ”La Lı́nea Violeta”.[online] Disponible en Internet: <http://www.domodesk.com/ content.aspx?co=51&t=21&c=43> [Domoticaviva, 2002] DOMOTICAVIVA. 2002.Qué es la domótica.[online] Disponible en Internet: <http://www.domoticaviva.com/portada/ quesdomotica.htm> [Wikipedia1, 2007] WIKIPEDIA. 2007.Domótica .[online] Disponible en Internet: <http://es.wikipedia.org/wiki/Dom %C3 %B3tica> [Wikipedia2, 2007] WIKIPEDIA. 2007.Protocolo de red .[online] Disponible en Internet: <http://es.wikipedia.org/wiki/Protocolo de red> [Wikipedia3, 2007] WIKIPEDIA. 2007.Proyecto .[online] Disponible en Internet: <http://es.wikipedia.org/wiki/Proyecto> 20 Parte I Sistemas Embebidos Capı́tulo 2 Sistemas Embebidos con interfaz Ethernet 2.1. Introducción Los microcontroladores de 8 bits generalmente son fáciles de usar pero habitualmente tienen poca memoria interna y su velocidad de procesamiento es limitada para algunas aplicaciones. Éstos, pueden acceder a más memoria, pero ciertas veces es insuficiente. La conexión con chips de decodificación ocupa espacio de circuito impreso y lleva tiempo de desarrollo y depurado, lo que implica un incremento de costos en el producto final. Los microcontroladores de 16 bits son más difı́ciles de utilizar, soportan más memoria, pero a veces tampoco es suficiente. Por otra parte, suelen ser más caros y la conexión entre memorias y periféricos a los buses suele traer problemas en ambientes donde el ruido y la interferencia están presentes. Además, necesitan chips de decodificación con las caracterı́sticas asociadas que estos implican. Procesadores de 32 bits o más suelen ser más complejos de usar. No obstante, en velocidad y capacidad de memoria superan a las otras familias de microporcesadores. El trabajo con DSP (Digital Signal Processor, sistema basado en un microprocesador que posee un juego de instrucciones, un hardware y un software optimizados para aplicaciones que requieren operaciones numéricas a muy alta velocidad) es engorroso, el diseño del hardware suele ser muy complicado, necesitando chips muy veloces que consumen más corriente, arduos circuitos de wait-states y memorias muy ágiles. Tendiendo un claro panorama de las metas propuestas, se comenzó por rea22 CAPÍTULO 2. SISTEMAS EMBEBIDOS CON INTERFAZ ETHERNET lizar una investigación con el objetivo de determinar “el corazón del sistema”: el dispositivo de trabajo adecuado que funcionarı́a como bloque central. Los sistemas embebidos son dispositivos utilizados para controlar o asistir la operación de diversos equipamientos. Su hardware, se diseña normalmente a nivel de chips o de interconexión de PCBs, buscando la mı́nima circuiterı́a y el menor tamaño para una aplicación particular. Ver [Wikipedia4, 2007]. A diferencia de los computadores de propósito general, un sistema embebido realiza una serie de tareas determinadas para cumplir unos requerimientos muy especı́ficos. No esta dentro del alcance del proyecto resolver la comunicación entre la interfaz Ethernet y los distintos protocolos a nivel de sistema operativo, la solución en capas bajas debe estar ya implementada. Por lo cual, se consideró únicamente el uso de sistemas embebidos con interfaz Ethernet ya que éstos cuentan con un desarrollo avanzado y permiten lograr funcionalidades y aplicaciones sobre una base de directivas estables. También, se investigó el protocolo OSGI y se encontró que se correspondı́a plenamente con los objetivos trazados, este podrı́a establecer la comunicación correspondiente entre los módulos exteriores y la red externa, tomando como base una plataforma de software ya resuelta. Como criterios de evaluación para la elección del sistema embebido se tomaron en cuenta: • prestaciones y caracterı́sticas de las distintas placas • precios • consideraciones elocuentes a la posibilidad de implementación y desarrollo sobre el mismo • protocolos de operación que sirvan como plataforma a futuras aplicaciones 2.2. Marco teórico 2.2.1. Protocolo OSGI La Open Service Gateway Initiative (OSGI) es una asociación de empresas creada en marzo de 1999 con el objetivo de definir un estándar abierto para el desarrollo y diseño de pasarelas residenciales que sean capaces de brindar 23 CAPÍTULO 2. SISTEMAS EMBEBIDOS CON INTERFAZ ETHERNET múltiples servicios en el mercado residencial y automotriz. Las pasarelas residenciales son dispositivos que conectan las infraestructuras de telecomunicaciones de la vivienda (datos, control, automatización, etc.) a una red pública de datos. Según [Casadomo, 1999]. OSGI ofrece una arquitectura completa y una solución extremo a extremo que cubre todas las necesidades del proveedor de servicios, del cliente y de los distintos dispositivos instalados en la vivienda. Estudio basado en [OSGI, 2005], [IBM, 2003] y [OSGI, 2004]. Descripción No escoge una única tecnologı́a de conexión en red para los múltiples dispositivos de la vivienda, siendo su propósito definir una interfase común para todos ellos dejando la responsabilidad a los fabricantes de construir controladores adecuados. Define una plataforma de software basada en Java, independiente del hardware. Los componentes de software son librerı́as o aplicaciones que dinámicamente pueden descubrir y usar otros protocolos. Las especificaciones de OSGI son extensamente aplicables, ya que conforman una capa pequeña que permite múltiples componentes basados en JavaTM , para cooperar eficientemente en una sola máquina virtual de Java (JVM). Las pasarelas OSGI pueden utilizar distintas tecnologı́as: • conexiones inalámbricas: IrDa, HomeRF, IEEE 802.11x., Bluetooth, etc. • cables telefónicos: HomePNA, etc. • redes de baja tensión: HomePlug, Lonworks, EIB/KNX, etc. • otras conexiones: Ethernet, USB, etc. • distintos protocolos: HAVI, UPnP, Jini, etc. Caracterı́sticas Detalla un conjunto de APIs (Application Program Interfaces) que son el principal soporte de los servicios. Los rasgos principales que definen la especificación son: • Estandarizada: poseer una plataforma común para los fabricantes de equipos y los proveedores de servicios e impedir que un único fabricante monopolice el mercado. 24 CAPÍTULO 2. SISTEMAS EMBEBIDOS CON INTERFAZ ETHERNET • Abierta: no se define ninguna estructura de red domótica ni se decreta el uso de ningún protocolo ni tecnologı́a en concreto. La única condición es que las tecnologı́as deben ser compatibles con las APIs predefinidas. • Fiable: debe funcionar las 24 hrs. del dı́a sin caı́das del sistema. • Segura: obliga un nivel de seguridad e integridad con el objetivo que los proveedores ofrezcan múltiples servicios sobre la misma plataforma sin interferirse entre ellos. • Escalable: la operación de las distintas pasarelas debe ser flexible, personalizable y escalable acorde a las nuevas necesidades del proveedor del sistema. Arquitectura Figura 2.1: Arquitectura OSGI Funcionamiento Los bundles pueden instalarse remotamente, comenzando, parando y desintalandose sin requerir un reboot y proporcionan una determinada funcionalidad a otros paquetes o directamente al usuario final. Éstos, residen sobre un elemento central llamado Plataforma de Servicios OSGI situada en la red local y conectada al proveedor de servicios a través de una pasarela en la red del operador; este elemento permite la interacción entre redes de dispositivos que empleen distintas tecnologı́as para la comunicación. 25 CAPÍTULO 2. SISTEMAS EMBEBIDOS CON INTERFAZ ETHERNET El registro de servicio actúa como un servicio de directorios en el que los bundles se registran y pueden localizar otros bundles para articular otros servicios. En la especificación se definieron APis básicas: logging, servidor HTTP y DAS (Device Access Specification). Con el DAS se definen los bundles de red - encargados de descubrir nuevos dispositivos y protocolos, empleando el protocolo de descubrimiento-, una vez alcanzada esta información, deben adquirirse del proveedor de servicios el bundle de dispositivo correspondiente al dispositivo declarado que se instalará en la plataforma y se registrará en el Registro de Servicios OSGI, creando la asociación correspondiente con el proveedor del servicio para que puedan interactuar. 2.3. Placas Rabbit Son placas fabricadas por la empresa Rabbit Semiconductor. Considerando las prestaciones brindadas y el equilibrio precio/funcionalidad se investigó el módulo RCM3700 y el RCM3720 para su utilización. 2.3.1. RCM3700 • Módulo Ethernet de bajo costo basado en el procesador Rabbit 3000 a 22.1 MHz. • Ethernet 10Base-T, RJ-45. • Hasta 512K Flash / 512K SRAM. • 1MB de Memoria Flash Serie. • Conexión para baterı́a externa. • 33 E/S digitales / Bus de E/S alternado. • 4 puertos serie (IrDA, HDLC, asynch, SPI). • Tamaño: 7.5 cm x 3.0 cm x 2.2 cm. 2.3.2. RCM3720 • Módulo Ethernet de bajo costo basado en el procesador Rabbit 3000 a 22.1 MHz. 26 CAPÍTULO 2. SISTEMAS EMBEBIDOS CON INTERFAZ ETHERNET • Ethernet 10Base-T, RJ-45. • 512K Flash y 256K SRAM. • 1MB de Memoria Flash Serie. • Conexion para bateria externa. • 33 E/S digitales / Bus de E/S alternado. • 4 puertos serie (IrDA, HDLC, asynch, SPI). • Tamaño: 7.5 cm x 3.0 cm x 2.2 cm. 2.3.3. Dynamic C Dynamic C es un software de desarrollo en lenguaje C industrialmente probado. Opera en cualquier PC bajo Windows 95, 98, NT, ME, 2000 y XP e incluye: • Rápido compilador C que permite compilaciones de un solo paso, enlace y bajada al destino; varias funciones en las librerı́as de código fuentes y un editor fácil de utilizar. • Debugging en tiempo real de completa prestación a nivel fuente y/o ensamblaje. • Un cable inteligente, provisto con el kit de desarrollo, que conecta el puerto serial de la PC con uno de los puertos seriales Rabbit mientras el procesador esta corriendo en el sistema destino, quitando la necesidad de emuladores, simplificando de esta forma los desarrollos. • El desarrollo de software con Dyanamic C es sencillo: un programa puede ser escrito en código C, Assembler o intermezclado de C con Assembler. Los programas pueden ser escritos, compilados y testeados sin la necesidad de salir del ambiente de desarrollo Dynamic C. Prestaciones Está especı́ficamente confeccionado para sistemas dedicados. Se puede compilar un programa y rutinas de librerı́as aplicables y bajar simultáneamente el código compilado hacia el sistema destino de forma muy rápida. Breakpoints, single stepping, observaciones de variables en un programa en ejecución son soportados para ayudar a debbugear. También, incluye poderosas extensiones de lenguaje para multitareas cooperativas, gran velocidad en punto flotante, librerı́as matemáticas y controladores para los periféricos integrados de Rabbit. 27 CAPÍTULO 2. SISTEMAS EMBEBIDOS CON INTERFAZ ETHERNET Producto RCM3700 RCM3720 Development kit Development kit Descripción Precio en U$S por unidad 512 KB RAM and 512 KB Flash 59 256 KB RAM and 512 KB Flash 49 con placa RCM3700 299 con placa RCM3720 299 Tabla 2.1: Precios placas Rabbit Posee un stack de protocolos TCP/IP completo. Sus capacidades incluyen Ethernet, PPP, cliente DHCP, http (incluye facilidades para SSI, rutinas CGI, cookies y autenticaciones básicas), SMTP, POP3, FTP y TFTP. 2.3.4. Precios Ver tabla 2.1 Los precios estan basados según [Rabbitsemiconductor1, 2007]. 2.4. Placas Digi Son placas fabricadas por la empresa Digi International. Ver [Digi, 2006]. 2.4.1. ConnectCore 7U Considerando las prestaciones brindidas y el equilibrio precio / funcionalidad se investigó únicamente el módulo ConnectCore 7U para su utilización. 2.4.2. Prestaciones • Procesador de 32 bits • Reloj de 55 MHz. • 16 MB de memoria RAM • 8 KB de memoria EEPROM • Hasta 8 MB de memoria flash • Placa Ethernet 10/100 base-T • 2 puertos USART y SPI • Trabaja sobre un sistema operativo Linux 28 CAPÍTULO 2. SISTEMAS EMBEBIDOS CON INTERFAZ ETHERNET • 2 timers de 27 bits. • Interface JTAG on-board • Tamaño: 6.28 cm x 1.85 cm x 1.04 2.4.3. Consideraciones Para desarrollar sobre la placa se necesita la plataforma LxNETES 2.3 (linux) o la plataforma NET+OS 6.0. Cada una de estas plataformas está desarrollada en un development kit. • El LxNETES 2.3 incluye: • Programación en flash • UClinux kernel v2.4.22 • GNU development tool • Sistema de archivos que soporta CRAMFS, JFFS2, NFS. • Servicio PPP • Cliente Samba • Web server embebido • Debugging via Ethernet o serial • Códigos de ejemplo y documentación • El NET+OS 6.0 incluye: • Debugging via JTAG • GNU development tool • Stack de protocolos TCP/IP • Asignación IP universal (Static IP, DHCP, BOOTP, auto -ip) • Web server embebido • SSL/TLS w/DES, 3DES, AES • Compilador HTML a C • Códigos de ejemplo y documentación Los kits de desarrollo no incluyen la placa, por lo cual para el desarrollo de una aplicación especı́fica se debe comprar la placa más el kit de desarrollo especı́fico. 29 CAPÍTULO 2. SISTEMAS EMBEBIDOS CON INTERFAZ ETHERNET Producto Descripción ConnectCore 7U 16 MB SDRAM, 2 MB flash 16 MB SDRAM, 8 MB flash 32 MB SDRAM, 16 MB flash, 180 MHz LxNETES Linux NET+OS Development kits Precio en U$S por unidad 99 159 49 299 1495 Tabla 2.2: Precios placas Digi 2.4.4. Precios Ver tabla 2.2 Los precios estan basados según [Mouser, 2006]. 2.5. Placas PC104 El estándar PC/104 fue establecido en 1992 por 12 compañı́as. El bus ISA, establecido por la especificación IEEE P996, está completamente soportado por la tecnologı́a PC/104. Se investigó teniendo en cuenta [Technologic, 2006] y [PC/104, 2006]. 2.5.1. TS-7200 ARM Considerando las prestaciones brindadas y el equilibrio precio / funcionalidad se investigó únicamente la placa TS-7200 ARM SBC para su utilización. 2.5.2. Prestaciones La TS-7200 es compacta, con caracterı́sticas completas de Single Board Computer (SBC) basada sobre la CPU del Cirrus EP9302 ARM9. Las caracterı́sticas del EP9302 y un avanzado procesador de 200 Mhz con una unidad de gerencia de memoria (MMU) permiten soportar sistemas operativos de alto nivel, tales como Linux, Windows CE y otros sistemas operativos embebidos. El propósito general del procesador es proveer un conjunto estándar de periféricos en la placa y un conjunto completo de sistemas Technologic que ofrecen los periféricos vı́a el estándar PC/104. Las caracterı́sticas ofrecidas son: • TS-Linux sistema operativo instalado. • 200 MHz ARM9 CPU con MMU 30 CAPÍTULO 2. SISTEMAS EMBEBIDOS CON INTERFAZ ETHERNET • 8 MB memoria flash on-board (bootea a Linux) • 32 MB RAM • True IDE Compact Flash socket (socket para memoria adicional) • 2 puertos USB 2.0 compliant Full Speed host (OHCI) - 12 Mbps max • 2 puertos seriales • 10/100 Megabit Ethernet port • 20 E/S digitales • Watchdog Timer • PC/104 bus de expansión • SPI bus interface • Interfaz alfanumérica LCD • Single +5VDC,450 mA • Tamaño: 9.5 cm x 11.25 cm 2.5.3. Consideraciones Para desarrollar sobre la placa se necesita un Kit de desarrollo especı́fico: • Caracteristicas: • 256 or 512 MB memoria flash • ejemplos de códigos y rutinas de test • Lector de memorias USB • 5 VDC power supply • Cable de adaptación DB9 - 10 pines • Cables para varias conexiones (LCD, Keypad, etc.) • CD con códigos fuente, manuales, ejemplo de código, etc. El kit de desarrollo no incluye la placa, por lo cual para el desarrollo de una aplicación especı́fica se debe comprar la placa más el kit de desarrollo. 31 CAPÍTULO 2. SISTEMAS EMBEBIDOS CON INTERFAZ ETHERNET Producto Descripción TS-7200 SBC 32 MB RAM and 8 MB Flash 32 MB RAM and 16 MB Flash USB 802.11g wireless network interface 512 MB Compact Flash Card Precio en U$S por unidad 149 165 35 105 Tabla 2.3: Precios placas PC/104 2.5.4. Precios Ver tabla 2.3 Los precios están basados según [Technologic, 2006] 2.6. Comparación de placas Valorando las diferentes opciones y visualizando las caracterı́sticas de las placas se tomaron ciertos criterios para establecer la comparación entre las mismas: precio, dimensiones, caracterı́sticas y soporte ante fallas. 2.6.1. Precio Las placas Rabbit son las más baratas, no solamente por el costo de la placa en sı́, sino también por el kit de desarrollo de Rabbit que incluye la placa. Vale la pena recalcar que ésta es una gran consideración ya que no es posible desarrollar alguna solución sin un kit de desarrollo. Las limitantes económicas del proyecto están definidas por la Universidad ORT. 2.6.2. Dimensiones Como la finalidad del sistema embebido consiste en ser el “corazón del sistema”vale establecer que sus dimensiones deberán ser pequeñas. Tanto las placas Rabbit como Digi poseen dimensiones pequeñas, la dimensión de la PC/104 es la mayor. 2.6.3. Caracterı́sticas Cuanto mayores son las capacidades de las placas, mayor es el rendimiento a sacarles. Visto y considerando los objetivos, no es necesario el desarrollo sobre una SBC, las cuales poseen prestaciones excesivas para los alcances de este proyecto. 32 CAPÍTULO 2. SISTEMAS EMBEBIDOS CON INTERFAZ ETHERNET Cabe resaltar que tanto las placas Digi como la PC/104 corren sobre un sistema operativo basado en Linux. Rabbit es un microcontrolador que no está desarrollado sobre un sistema operativo booteable. Las capacidades de memoria de Digi como la de PC/104 son ampliamente superables a Rabbit, pero poseer un contenido de memoria excesivo, no es una apreciación valorable para el desarrollo del proyecto. Como los módulos exteriores poseen “su inteligencia”, el uso de la memoria está distribuido entre dichos módulos y el bloque central. La velocidad de procesamiento es una consideración importante, el procesador de Rabbit trabaja a una velocidad de 22.1 MHz, Digi a 46 o 55 MHz y la PC/104 a 200MHZ. Cuanto mayor velocidad, más rápido es la ejecución de instrucciones, pero 22.1 MHZ es una velocidad de procesamiento considerable. 2.6.4. Soporte Navegando en Internet es posible encontrar aplicaciones desarrolladas para las tres placas. Tanto Rabbit como Digi ofrecen como valor agregado a su producto un support que brinda ayuda las 24 hrs., pudiendo ser contactado tanto por e-mail como por teléfono. A la hora de considerar el desarrollo de un producto es bueno valorar la posibilidad externa de ayuda ya que cualquier impedimento en el desarrollo puede acarrear una pérdida de tiempo considerable en el avance del proyecto. PC/104 ofrece ayuda en distintos foros para los desarrolladores. Digi y Rabbit brindan un servicio más serio que PC/104, ya que dedican recursos de sus compañı́as para brindar un Tech Support amigable y accesible. 2.6.5. ¿Por qué Rabbit? La primera consideración fue no excederse de los recursos económicos brindados por la Universidad ORT para la realización del proyecto. Los procesadores de la linea Rabbit unifican muchas de ventajas: • El Rabbit es un microprocesador: su bus es accesible. • Su bus de direcciones es de 20 bits, lo que implica 1MB de direccionamiento posible. • Su bus de datos es de 8 bits: menos lı́neas de conexión. 33 CAPÍTULO 2. SISTEMAS EMBEBIDOS CON INTERFAZ ETHERNET • Su arquitectura es compatible con el Z-80: conocido, con gran cantidad de software disponible. • Es un microcontrolador: I/O ports, USARTs (seriales), timers, WDT (watch-dog), RTC (real-time clock), todos incluı́dos en un chip. • Serial boot: siempre es posible cargar la última versión, sin parches. • Slave port: facilita la interconexión de procesadores, incluso puede bootear del slave port. • Su performance es comparable a la de muchos DSP del mercado. • El kit de desarrollo viene acompañado por un potente entorno de programación C con bibliotecas de funciones, soporte multitarea, TCP/IP (sin regalı́as), e ICD (In-Circuit Debugging). • Las dimensiones de la placa son pequeñas. Core Modules Si bien el procesador no posee memoria interna, en vez de comprar el procesador por separado y diseñar la placa de circuito impreso, existe la posibilidad de adquirir los core-modules: módulos pre-armados con cierta capacidad de memoria ya instalada, pines para la conexion con el mundo exterior, controlador Ethernet y jack RJ-45. Éstos módulos, son un recurso probado en ambientes conflictivos, económicos y de fácil implementación: pueden soldarse o conectarse con un zócalo a la placa principal, en el cual el diseñador no necesita preocuparse por los buses ni por el timming, sino que puede trabajar con las entradas y salidas como en cualquier microcontrolador. En caso de necesitar mas memoria para el proyecto, en vez de portar el diseño a un controlador de gama superior, simplemente se puede remplazar el modulo por uno de mayor capacidad. TCP/IP sobre Ethernet Ésta es la caracteristica más interesante del producto. Cualquier desarrollador podrı́a: elegir un procesador, desarrollar la interfaz Ethernet, conseguir un stack TCP/IP reducido que ha sido recortado y compactado para caber en memoria; con la placa Rabbit sólo es necesario conectar el patch-cord y comenzar a desarrollar en base a librerı́as predefinidas. 34 CAPÍTULO 2. SISTEMAS EMBEBIDOS CON INTERFAZ ETHERNET Dynamic C El compilador es una implementación de C con el agregado de funciones especı́ficas para Rabbit, soporte multitarea cooperativo, y bibliotecas de funciones que resuelven gran cantidad de tareas en aplicaciones tı́picas. Sı́ntesis En resumen, se trata de un micro de propositos generales, con gran cantidad de puertos de I/O, posibilidad de conexion al bus, alta velocidad de operación, amplia capacidad de RAM y Flash, programación en C, con modulos pre armados que facilitan la velocidad de desarrollo y un gran stack de directivas TCP/IP para implementar. Habiendo realizado un balance en base a prestaciones/precios, y contemplando exhaustivamente las limitaciones económicas del proyecto se consideró no adquirir una placa de desarrollo con un sistema operativo basado en Linux o Windows. Examinando las distintas opciones y la investigación llevada a cabo, se opto por la compra del sistema embebido RCM3700 de la empresa Rabbit Semiconductor. No se consideró la implementación del protocolo OSGI, tal cual desarrollado, ya que la placa RCM3700 no corre sobre un sistema operativo. No es posible instalarle una Java Virtual Machine. Según el contacto establecido con Tom Finn (gerente de ventas de Rabbit Semiconductor para América Latina), la única forma de implementar OSGI serı́a realizar una máquina virtual capaz de interpretar byte core de Java, lo cuál no es muy eficiente para la placa Rabbit. El estudio exhaustivo de las caracterı́sticas y funciones de Rabbit, y las pruebas realizadas se encuentran documentadas en el capı́tulo 3. 2.7. Referencias [Casadomo, 1999] Casadomo Soluciones S.L. 1999.Pasarela Residenical.[online] Disponible en Internet: <http://www.casadomo.com/ noticiasDetalle.aspx?c=49&m=15&idm=60&pat=14&n2=14> [Digi, 2006] Digi. 1996 .ConnectCore 7U.[online] Disponible en Internet: <http://www.digi.com/products/embeddedsolutions/devkits/ connectcore7udevkit.jsp> 35 CAPÍTULO 2. SISTEMAS EMBEBIDOS CON INTERFAZ ETHERNET [IBM, 2003] IBM. Managed mobile clients with OSGi: Managed smart clients.[online] Disponible en Internet: <http://www-128.ibm.com/developerworks/library/wi-osgi/index.html> [Mouser, 2006] Mouser Electronics. 1996 .Digi International.[online] Disponible en Internet: <http://www.mouser.com/digi/> [OSGI, 2005] The OSGI Alliance. 2000 .OSGi Service Platform Core Specification.[online] Disponible en Internet: <http://www.osgi.org> [OSGI, 2004] The OSGI Alliance. 2000 .About the OSGi Service Platform.[online] Disponible en Internet: <http://www.osgi.org> [PC/104, 2006] PC/104 Embedded PC Modules. 1992 . PC/104 Consortium.[online] Disponible en Internet: <http://www.pc104.org/> [Rabbitsemiconductor1, 2007] Rabbit Semiconductir. 1999 .RCM3700 RabbitCore.[online] Disponible en Internet: <http://www.rabbitsemiconductor.com/ products/rcm3700/> [Technologic, 2006] Technologic Systems. 1984 .TS-7200.[online] Disponible en Internet: <http://www.embeddedarm.com/epc/ ts7200-spec-p.php#7200pricing> [Wikipedia4, 2007] Wikipedia. 2007.Microprocesadores y sistemas embebidos .[online] Disponible en Internet: <http://es.wikipedia.org/wiki/ Sistema integrado#Microprocesadores y sistemas embebidos> 36 Capı́tulo 3 Desarrollando con Rabbit 3.1. Introducción Aprender una nueva tecnologı́a presenta un gran desafı́o, dominar las herramientas de desarrollo requiere tiempo, y comprender la documentación tiene sus dificultades. Desarrollar, investigar, y volver a desarrollar, es la base de la ingenierı́a. Una vez adquirida la modalidad de trabajo (objetivos - implementación - programación), la automatización de las mejores prácticas en el ciclo de vida del desarrollo del prototipo, concluyen en una labor concisa y efectiva. Habiendo tomado la decisión y efectuado la compra del RCM3700, se procedió al estudio profundo de sus prestaciones. Dicho estudio, abarcó lecturas de manuales, notas de aplicación y referencias. Conjuntamente con los ejemplos de base, se comenzó a desarrollar. Si bien la documentación de Rabbit es precisa y correcta, es necesario recorrerla varias veces para poder encontrar lo que se busca, y comprender la máxima expresión de cada aplicación. No es la finalidad de este capı́tulo reproducir una copia del manual, sino que este intenta resaltar las propiedades más significativas de la placa, las cuales llevaron a la correcta implementación de la solución. Resulta sustancial mantener una determinada estrategia para concordar entre el desarrollo y los objetivos del proyecto. Este capı́tulo intenta explicar el camino seguido y sus avances correspondientes, finalizando con una serie de pruebas que denotan pequeñas funcionalidades del bloque central. El marco teórico busca comprender y justificar las prestaciones elegidas, focalizar el desarrollo por una via especı́fica y ser soporte de consulta ante inconvenientes de implementación. Se estudiaron los protocolos HTTP, SMTP, 37 CAPÍTULO 3. DESARROLLANDO CON RABBIT HTML y Telnet. 3.2. 3.2.1. Marco teórico Protocolo HTTP El Protocolo de Transferencia de HiperTexto (Hypertext Transfer Protocol) es un protocolo cliente-servidor que articula los intercambios de información entre los clientes Web y los servidores HTTP. Desde el punto de vista de las comunicaciones, está soportado sobre los servicios de conexión TCP/IP, y funciona de la misma forma: un proceso servidor escucha en un puerto de comunicaciones TCP (por defecto, el 80), y espera las solicitudes de conexión de los clientes Web. Una vez que se establece la conexión, el protocolo TCP se encarga de mantener la comunicación y garantizar un intercambio de datos libre de errores. HTTP se basa en sencillas operaciones de solicitud/respuesta. Un cliente establece una conexión con un servidor y envı́a un mensaje con los datos de la solicitud. El servidor responde con un mensaje similar, que contiene el estado de la operación y su posible resultado. Todas las operaciones pueden adjuntar un objeto o recurso sobre el que actúan. Cada objeto Web (documento HTML, fichero multimedia o aplicación CGI) es conocido por su URL. Etapas de una transacción HTTP Cada vez que un cliente realiza una petición a un servidor, se ejecutan los siguientes pasos: • Un usuario accede a una URL, seleccionando un enlace de un documento HTML o introduciéndola directamente en el campo Location del cliente Web. • El cliente Web descodifica la URL, separando sus diferentes partes. Identifica el protocolo de acceso, la dirección DNS o IP del servidor, el posible puerto opcional (el valor por defecto es 80) y el objeto requerido del servidor. • Se abre una conexión TCP/IP con el servidor, llamando al puerto TCP correspondiente. • Se realiza la petición. Se envı́a el comando necesario (GET, POST, HEAD,. . . ), la dirección del objeto requerido (el contenido de la URL 38 CAPÍTULO 3. DESARROLLANDO CON RABBIT que sigue a la dirección del servidor), la versión del protocolo HTTP empleada (casi siempre HTTP/1.0) y un conjunto variable de información, que incluye datos sobre las capacidades del browser y datos opcionales para el servidor • El servidor devuelve la respuesta al cliente como un código de estado y el tipo de dato MIME de la información de retorno, seguido de la propia información. • Se cierra la conexión TCP. Ejemplo de un diálogo HTTP Para obtener un recurso con el URL http://www.tuhost.example/index.html. Se abre un socket con el host www.tuHost.example, puerto 80 que es el puerto por defecto para HTTP. Se envı́a un mensaje en el estilo siguiente: GET /index.html HTTP/1.0 From: [email protected] User-Agent: HTTPTool/1.0 [Lı́nea en blanco] La respuesta del servidor está formada por encabezados seguidos del recurso solicitado, en el caso de una página web: HTTP/1.0 200 OK Date: Fri, 31 Dec 2003 23:59:59 GMT Content-Type: text/html Content-Length: 1221 <html> <body> <h1>Página principal de tuHost</h1> (Contenido) . . . </body> </html> Al recibirse la respuesta, el servidor cierra la comunicación. Cabe señalar que los principales navegadores web no muestran al usuario los encabezados 39 CAPÍTULO 3. DESARROLLANDO CON RABBIT HTTP del recurso. Para visualizarlos, pueden utilizarse herramientas conocidas genéricamente como “visores HTTP”. El estudio de HTTP fue basado en [ProgramacionWeb2, 2007],[Del Castillo, 2002] y [Webopedia2, 2007]. 3.2.2. Protocolo SMTP Según [Postela, 1982], [ProgramacionWeb1, 2007],[Webopedia1, 2007], el SMTP (Simple Mail Transfer Protocol o protocolo simple de transferencia de correo electrónico) es un protocolo de red basado en texto que se utiliza para el intercambio de mensajes de correo electrónico entre computadoras o distintos dispositivos. Se basa en el modelo cliente-servidor, donde un cliente envı́a un mensaje a uno o varios receptores. En el conjunto de protocolos TCP/IP, el SMTP va por encima del TCP, usando normalmente el puerto 25 en el servidor para establecer la conexión. Ejemplo de una comunicación SMTP En primer lugar se ha de establecer una conexión entre el emisor (cliente) y el receptor (servidor). Esto puede hacerse automáticamente con un programa cliente de correo o mediante un cliente telnet. El ejemplo a continuación muestra una conexión tı́pica. con la letra C se nombra al cliente y con S al servidor: S: 220 Servidor ESMTP C: HELO S: 250 Hello, please meet you C: MAIL FROM: [email protected] S: 250 Ok C: RCPT TO: [email protected] S: 250 Ok C: DATA S: 354 End data with <CR><LF>.<CR><LF> C: Subject: Campo de asunto C: From: [email protected] C: To: [email protected] C: C: Hola, C: Esto es una prueba. C: Adios. C: . S: 250 Ok: queued as 12345 40 CAPÍTULO 3. DESARROLLANDO CON RABBIT C: quit S: 221 Bye Todas las órdenes, réplicas o datos son lı́neas de texto, delimitadas por el carácter, llevando un código numérico al comienzo de la lı́nea. Cuando un cliente establece una conexión con el servidor SMTP, espera a que éste envı́e un mensaje “220 Service ready” o “421 Service non available”. Se envı́a un HELO y el servidor se identifica. Esto puede usarse para comprobar si se conectó con el servidor SMTP correcto. El cliente comienza la transacción del correo con la orden MAIL. Como argumento, se puede pasar la dirección de correo al que el servidor notificará cualquier fallo en el envı́o del correo. El servidor responde “250 OK”. Luego se comunica el destino, la orden es RCPT TO:¡destinohost¿, es posible notificar tantas órdenes RCPT como destinatarios del correo queramos. Por cada destinatario, el servidor contestará “250 OK”, o bien “550 No such user here”si no encuentra al destinatario. Finalizada esta tarea, el cliente manda una orden DATA para indicar que a continuación se envı́an los contenidos del mensaje. El servidor responde “354 Start mail input, end with .”. Esto indica la forma en que el cliente notificará el fin del mensaje. Seguidamente, éste envı́a el cuerpo del mensaje - lı́nea a lı́nea - finalizando con un . (la última lı́nea será un punto), a lo que el servidor contestará “250 OK”, o un mensaje de error apropiado. Tras el envı́o, si no se tienen que enviar más correos, se corta la conexión con la orden QUIT. También, puede utilizar el comando TURN, con el cual el se intercambian roles entre cliente y servidor. Finalmente, si tiene más menajes que entregar, repite el proceso hasta completarlos. En el ejemplo pueden verse las órdenes básicas de SMTP: • HELO, para abrir una sesión con el servidor. • MAIL FROM, para indicar quien envı́a el mensaje. • RCPT TO, para indicar el destinatario del mensaje. • DATA, para indicar el comienzo del mensaje, éste finalizará cuando haya una lı́nea únicamente con un punto. • QUIT, para cerrar la sesión. Las respuestas que da el servidor pueden ser de varias clases: • 2XX, para una respuesta afirmativa. • 3XX, para una respuesta temporal afirmativa. 41 CAPÍTULO 3. DESARROLLANDO CON RABBIT • 4XX, para una respuesta de error, pero se espera a que se repita la instrucción. • 5XX, para una respuesta de error. Una vez que el servidor recibe el mensaje, puede almacenarlo si es para un destinatario que pertenece a su dominio, o bien retransmitirlo a otro servidor para que finalmente llegue a un servidor del dominio del receptor. Formato del mensaje El mensaje está compuesto por dos partes: • Cabecera - en el ejemplo anterior, las tres primeras lı́neas del mensaje corresponden a la cabecera. Se usan palabras claves para definir los campos del mensaje, quienes ayudan a los clientes de correo a organizarlos y mostrarlos. Tı́picamente son subject (asunto), from (emisor) y to (receptor). A los dos últimos no hay que confundirlos con las órdenes MAIL FROM y RCPT TO, que pertenecen al protocolo, pero no al formato del mensaje. • Cuerpo del mensaje - es el mensaje propiamente dicho. Está compuesto únicamente por texto, y finaliza con una lı́nea en la que el único carácter es un punto. 3.2.3. Protocolo HTML Es el acrónimo de HyperText Markup Language, lenguaje de marcación diseñado para estructurar textos y presentarlos en forma de hipertexto, siendo éste el formato estándar de las páginas web. Habiendo realizado el estudio correspondiente, se especifican en [HTML, 2007] las estructuras propias del protocolo HTML. Se consideró que su inclusión dentro de este documento no aportarı́a valor alguno. Dichas notas, fueron escritas según [Utem, 2006], 9, [Wikipedia5, 2007]. 3.2.4. Telnet Emula una terminal remota, permite que un usuario en una red lejana trabaje sobre un servidor como si estuviera conectado a una terminal ası́ncrona en un puerto serie local. Transfiere teclado y pantalla de forma transparente. Emplea TCP como capa de transporte, utilizando el puerto 23. Por medio de una serie de negociaciones determina la mejor forma de adaptar terminal y sistema. 42 CAPÍTULO 3. DESARROLLANDO CON RABBIT Caracterı́sticas Microprocesador Flash Memory SRAM Serial Flash Memory Serial Port RCM3700 Rabbit 3000 corriendo a 22.1 MHz 512K 512K 1 Mbyte •4 compartidos de alta velocidad, 3.3 V CMOS puertos compatibles •los 4 son configurables como puerto serie asincronico •3 son configurables como puerto serie registrado (SPI) y 1 es configurable como puerto serie HDLC •opción para un segundo puerto serie HDLC a expensas de 2 puertos SPI Tabla 3.1: Caracteristicas de las placas Rabbit Posee métodos de autenticación. Por lo general, el sistema está configurado para requerir información de login, identificando al usuario y ejecutando un intérprete de comandos, que le permite el acceso al sistema. Opera siempre en modo cliente/servidor, permitiendo múltiples conexiones en el servidor (el proceso master en el servidor crea un esclavo por conexión). Éstas consideraciones fueron obtenidas profundizando sobre [Postelb, 2001]. 3.3. Prestaciones del RCM3700 Consultando en [Rabbitsemiconductor6, 2007] y en [Rabbitsemiconductor5, 2007], se señalan los distintos aspectos descritos en la Tabla 3.1. 3.3.1. Dimensiones Ver figura 3.1. 3.3.2. Kit de desarrollo El kit de desarrollo contiene el hardware y software necesario para usar el RCM3700: Modulo RCM3700 43 CAPÍTULO 3. DESARROLLANDO CON RABBIT Figura 3.1: Dimensiones core module Placa de desarrollo RCM3700 Cable de programación Dynamic C CD-ROM Accesorios para la placa de desarrollo 3.3.3. Referencia del hardware La figura 3.2 describe los componentes de hardware y los principales subsistemas de hardware del RCM3700. Figura 3.2: Procesador Rabbit 3000 La figura 3.3 muestra los puertos disponibles: 44 CAPÍTULO 3. DESARROLLANDO CON RABBIT Figura 3.3: Puertos en RCM3700 Puertos E/S El procesador Rabbit 3000 dispone de 56 lineas de entrada/salida repartidas en siete puertos de 8 bits designados como puertos A, B, C, D, E, F y G. La mayorı́a de los pines utilizados tienen funciones alternativas, como puerto serie o chip select strobe. Los puertos D, E, F y G tienen la capacidad de sincronizar sus salidas con un timer. Todos ellos menos el E pueden configurarse como open drain. Puertos series Existen 6 puertos series designados como A, B, C, D, E y F. Todos pueden funcionar en modo asincrónico, pero los puertos A, B, C y D pueden funcionar también en modo sincrónico. Los puertos E y F soportan comunicaciones SDLC/HLDC, poseen una FIFO de 4 bytes, y presentan pines separados de clock para transmisión y recepción. Todos los puertos soportan opcional RZ (Return to Zero) con timing de 3/16 (SIR) o 1/4 (MIR) de bit: esta opción se utiliza normalmente para IrDA. La estructura de registros de los puertos es la siguiente: SxDR: Serial (A, B, C, D, E, F) Data Register, contiene el dato recibido (lectura), o se le escribe el dato a transmitir. SxAR: Alternate Data Register, se utiliza para generar un noveno bit en el modo de señalización de inicio de mensaje. También puede emplearse para generar un bit de paridad en modos de 8 bits. 45 CAPÍTULO 3. DESARROLLANDO CON RABBIT SxLR: Long Stop Register, se utiliza en modos con dos bits de stop o para generar el bit de paridad en modos de 8 bits. SxSR: Status Register, contiene los flags que indican el estado del puerto, condición de interrupción, y errores. SxCR: Control Register, configura el modo de operación y la prioridad de las interrupciones. SxER: Extended Register, configura opciones adicionales de sincronización, incluyendo 16x o 8x para modo sincrónico y RZI para HDLC e IrDA. La opción 16x/8x provee los dos timings IrDA. Reloj del sistema La frecuencia especificada para el RCM3700 de 22,1 MHz es generado utilizando un cristal de 11.06 MHz. Es posible, ya que el Rabbit 3000 permite duplicar o dividir por ocho la frecuencia, a modo de elegir entre velocidad de ejecución y potencia consumida. Ésta propiedad puede ser modificada desde el BIOS. Los registros principales son: • GCSR: Global Control/Status Register, los bits 4, 3 y 2 controlan la fuente del clocking: o 000 = reloj del procesador y de los periféricos tomando del oscilador a cristal, dividido por ocho. o 001 = reloj del procesador tomado del oscilador al cristal. o 010 = reloj del procesador y de los periféricos tomando del oscilador al cristal. o 011 = reloj del procesador y de los periféricos tomando del oscilador al cristal, dividido por dos. o 110 = reloj del procesador y de los periféricos tomando del oscilador al cristal, dividido por cuatro. o 111 = reloj del procesador y de los periféricos tomando del oscilador al cristal, dividido por seis. o 100 = reloj del procesador y de los periféricos tomando del clock de 32.768 KHz. o 101 = reloj del procesador y de los periféricos tomando del clock de 32.768 KHz, apaga el oscilador a cristal. 46 CAPÍTULO 3. DESARROLLANDO CON RABBIT GCDR: Global Clock Double Register, controla la operación del circuito de clock de doubler. Funciona mediante la técnica de demora y or-exclusiva, por lo que controlando la demora se opera sobre el ciclo de trabajo resultante. Los bits 3, 2 ,1 y 0 permiten seleccionar la demora, la combinación 0000 inhabilita el clock doubler. GPSCR: Global Power Save Control Register, contiene opciones de control del timming de generación de chip selects para permitir operaciones a muy baja frecuencia. Timers Existen dos sistemas denominados timer A y timer B. El timer A está compuesto por 7 registros de 8 bits de cuenta regresiva (A1, A2, A3, A4, A5, A6, A7), que pueden recargarse. Se controla mediante los siguientes registros: TACSR: Timer A Control/Status Register, contiene los flags de cuenta regresiva de cada uno de los timers en modo lectura, y controla el estado de la interrupcion de cada timer, en modo escritura. Cada bit controla el timer respectivo, el bit 0 controla la operación del sistema Timer A. TATxR: Timer Ax Time Constant Register, aloja la constante de cuenta para cada timer. TACR: Timer A Control Register, los bits 2 al 7 controlan el uso o no del timer A1 como prescaler para cada timer respectivo. Los bits 1, 0 definen la prioridad de la interrupcion (00 = no habilitada). El timer B está compuesto por un contador de 10 bits que puede leerse pero no escribirse y dos registros de comparación que generan un pulso cuando el valor del contador iguala al del registro. Opera mediante los siguientes registros: TBCSR: Timer B Control/Status Register, contiene los flags de comparación de cada uno de los timers en modo lectura, cada bit controla el registro respectivo. TBCR: Timer B Control Register, controla la prioridad de la interrupción y la fuente del reloj del contador. Captura de eventos Las entradas de captura se utilizan para determinar el momento en que se produce un evento especı́fico. Se señala mediante un flanco (positivo, negativo o ambos) en alguno de los 16 pines que pueden ser configurados para este 47 CAPÍTULO 3. DESARROLLANDO CON RABBIT propósito. Para llevar la cuenta del tiempo, cada módulo emplea un contador de 16 bits que recibe el clock del Timer A8. Existen dos tipos de eventos que pueden usarse para registrar la cuenta en el momento de producirse el evento, o bien para fines especı́ficos: condición de inicio - se utiliza para iniciar la cuenta. condición de detención - empleado para detener la cuenta. Además, puede medirse la duración de un pulso, dado que puede configurarse el contador para comenzar en un pulso y detenerse en el otro. 3.3.4. Prestaciones con Ethernet Habiéndose investigado en [Rabbitsemiconductor3, 2007] y [Rabbitsemiconductor3, 2007], se resaltan las consideraciones elocuentes de la interfaz Ethernet. Soporta los siguiente tipos de conexiones Ethernet: No LAN - se conecta la placa Rabbit al puerto Ethernet de la computadora mediante un cable de red cruzado. Micro - LAN - se conecta la placa y la computadora a un hub 10Base-T usando cables de red derechos. LAN - se conecta la placa a una red LAN preferentemente a la que está conectada la computadora (Se debe obtener una dirección IP). WAN - Se conecta la placa a Internet pero se recomienda programar y debuggear en la red local antes de conectar la placa a Internet. Utiliza una conexión 10/100Base-T a una velocidad de 10 Mbps. Cada RCM3700 tiene su propia MAC address. No soporta IPv6, sólo IPv4. Si no se busca acceder al RCM3700 por Internet, es posible situarlo en la red interna utilizando una IP estática o bien por DHCP. Cuando se accede por Internet, es posible situar la placa detrás de un firewall, configurándolo de forma tal que traduzca y mande paquetes de Internet al RCM3700. Configuración del stack TCP/IP Para correr el stack TCP/IP, un host debe conocer la dirección IP de cada interfaz. La intefaz Ethernet también necesita una máscara de red. La combinación entre éstas dos, forma la subred. Describe la comunidad de hosts que pueden comunicarse directamente a este host, sin necesidad de pasar por un 48 CAPÍTULO 3. DESARROLLANDO CON RABBIT TCPCONFIG Ethernet PPP DHCP Runtime 1 Si No No No 2 No Si No No 3 Si No Si No 4 Si Si No No 5 Si No Si No 6 Si No No Si 7 Si No Si No 8 No Si Si No Tabla 3.2: Configuraciones de TCP predeterminadas router. Para la comunicación local también se necesita un gateway host. Inicialización La función sock init() debe llamarse cerca del comienzo de la rutina del main() para inicializar el stack TCP/IP. El feedback debe indicar éxito antes de llamar otras rutinas referentes a TCP/IP. La función realiza lo siguiente: Llama a rutinas de inicializaciones correspondientes a TCP, UDP, DNS y ARP. Testea si sock init() fue ejecutado anteriormente; si la afirmación es correcta, devuelve un OK, de lo contrario sigue los pasos correspondientes. Resetea el hardware y borra los buffers de recepción. Borra las tablas del servidor. Cuando se usa Ethernet espera aproximadamente 1 segundo para que el hardware correspondiente a Ethernet inicialice. Las intefases son inicializadas según lo predefinido. Configuraciones predeterminadas Se utilizan las configuraciones predeterminadas de la librerı́a tcp config.lib, tanto para configuraciones estáticas o dinámicas. Definiendo un macro especı́fico, es posible elegir entre las configuraciones predeterminadas. El macro se muestra en la tabla 3.2. #define TCPCONFIG No 49 CAPÍTULO 3. DESARROLLANDO CON RABBIT Configuraciones manuales Para una configuración estática especı́fica se emplea el siguiente código: #define IFCONFIG ETH0 IFS IPADDR, aton(”192.168.1.102”), \ IFS NETMASK, aton(”255.255.255.0”), \ IFS ROUTER SET, aton(”192.168.1.1”), \ IFS UP Ante una configuración dinámica con DHCP se emplea la opción de configuración predefinida No 3 y el siguiente código: #define USE DHCP #define IF DEFAULT 0 #define IFCONFIG ETH0 IFS DHCP, 1, IFS UP #use ”dcrtcp.lib” 50 CAPÍTULO 3. DESARROLLANDO CON RABBIT Arquitectura del servidor web La figura 3.4 muestra todos los elementos relevantes de cualquier aplicación que corra sobre el servidor web. Figura 3.4: Arquitectura del servidor web Bloque de aplicación Consiste en cinco sub-bloques y representa el código que se debe crear. Todo lo que se encuentra capas más abajo es brindado por las distintas librerı́as, pero se debe especificar parte de las interfaces de los diferentes componentes. Compile-time initialization Incluye selección de las librerı́as apropiadas, inicialización de las estructuras estáticas y tablas, selección de la configuración de red predeterminada e inclusión de los recursos estáticos por medio del #ximport. La MIME Table le indica al browser como será presentado el contenido por el usuario. Se utiliza ésta estructura dado que no se tiene un sistema 51 CAPÍTULO 3. DESARROLLANDO CON RABBIT operativo que resuelva esas tareas y se le debe especificar al servidor el significado de cada cosa. La Rule Table se aplica ante el empleo de un filesystem (FS2, FAT). Es utilizado para aplicar permisos a los recursos contenidos en un filesystem; es necesario ya que no todos los filesystems pueden asociar derechos de acceso con archivos individuales. Program flash representa la carga de los archivos de recursos en la memoria de programa por medio del #ximport. Runtime initialization El main() necesita llamar a ciertas funciones especı́ficas una sola vez cuando comienza: sock init(): inicializa el sistema de acceso a la red sspec automount(): es opcional, inicializa los filesystems http init(): inicializa el servidor HTTP. Main loop El código final es el main(), quien necesita convocar continuamente a la función http handler(), encargada de permitir el procesamiento de peticiones en el servidor HTTP. Application specifies and I/O Es el bloque en el cual se comunica la aplicación con el servidor HTTP. CGI functions CGI (Common Gateway Interface), en dynamic C refiere a una función C que es llamada por el servidor HTTP para generar contenido dinámico para el browser. Bloque HTTP El servidor es el responsable de procesar peticiones del mundo exterior. Cada petición es analizada para identificar al usuario que está haciendo uso de la misma, el recurso que solicita, y si se encuentra autorizado a obtener dicho recurso. Si es usuario es conocido y el recurso está disponible, éste se transmite al browser. 52 CAPÍTULO 3. DESARROLLANDO CON RABBIT #web Variables Es el medio de comunicación entre la aplicación y el servidor. Las web variables son variables en C, arrays o estructuras determinadas. SSI Es la manera clásica de generar contenido dinámico. El SSI (Server Side Includes) es también un lenguaje script que puede llamar a funciones .cgi. Bloque TCP/IP Es el pipeline al mundo exterior: el browser. Bloque Zserver Oficia de manejador de recursos, controla el acceso a muchos de los otros bloques. Tiene aplicación en el servidor FTP, ya que provee una interfaz consistente para los diferentes tipos de recursos. Tiene la responsabilidad de mapear varios filesystems y tipos de recursos en una sola API. Ésta API no solo cuida de las diferencias entre los filesystems, sino que también permite emular algunas funciones que no son soportadas por el filesystem subyacente. Zserver debe asociar datos del metadata y authorization con cada recurso. Control de acceso Si la aplicación que se está corriendo permite la actualización del controlador en forma remota, es importante agregar seguridad. La forma más fácil de lograr el cometido es definiendo: un set de usuarios un método de autenticación permisos a cada recurso de acuerdo al usuario User Table Es una de las tablas en la cual se define lo anterior. Contiene la lista de la identificación de usuarios e información de autenticación (password). Cada entrada en la tabla contiene una máscara de grupo, que indica el nombre del 53 CAPÍTULO 3. DESARROLLANDO CON RABBIT grupo al cual el usuario pertenece. Es posible definir hasta 16 grupos y cada usuario puede pertenecer a uno o más de ellos. Rule Table Es la última tabla en que se termina de definir el control de acceso. Contiene una lista de información asociada con cada recurso llamada ”permisos”. Cada recurso tiene la siguiente información: La máscara de grupo de los grupos que tienen el permiso de ”solo lectura”. La máscara de grupo de los grupos que tienen el permiso de ”leer/modificar”. Los servidores que no prohı́ben ningún acceso a este recurso. El método de autenticación que es recomendado. El MIME type del recurso. Librerı́a de uso general (Zserver.lib) El manejador de recursos contiene las estructuras, funciones y constantes para permitirles a los servidores HTTP y FTP, compartir datos e información de autenticación mientras están en funcionamiento. La funcionalidad básica de Zserver es la habilidad de traducir nombres de recursos (URLs en el caso de HTTP) en referencias a filesystems y objetos de memoria. También, provee soporte para formularios HTML. Las estructuras relativas a ésta librerı́a son: MIMETypeMap ServerSpec ServerAuth ServerPermissions RuleEntry FormVar SSpecFileHandle 54 CAPÍTULO 3. DESARROLLANDO CON RABBIT MIMETypeMap Asocia la extensión de un archivo con una clase MIME (Multipurpose Internet Mail Extension) y una función que maneja dicha clase. Por ejemplo para crear un servidor HTTP que maneje archivos .html y .gif el siguiente algoritmo es requerido en el código: SSPEC MIMETABLE START SSPEC MIME(”.html”, ”text/html”), SSPEC MIME(”.gif”, ”image/gif”), SSPEC MIMETABLE END ServerSpec Es utilizada por la tabla de recursos estática y dinámica. La diferencia entre tablas es que una es una constante (inicializada en tiempo de compilación) y la otra es creada en tiempo de corrida del programa en la RAM, y por tanto, modificable. Se llaman por medio de los macros SSPEC RESOURCE. ServerAuth Define un array global como una lista de pares nombre de usuario- contraseña. ServerPermissions Lleva a cabo los permisos de acceso para un recurso o un grupo de recursos. RuleEntry Asocia un prefijo del nombre del recurso a una estructura de ServerPermissions. La RULE Table es un array de éstas estructuras. FormVar Un array de FormVar representa las variables de un formulario HTML. La estructura contiene: Un ı́ndice server spec que refiere a las variables que serán modificadas. Una función de integridad que asegura que las variables estén fijadas en valores válidos. 55 CAPÍTULO 3. DESARROLLANDO CON RABBIT Valores máximos y mı́nimos para variables numéricas. Largo de las variables. Un puntero a un arreglo de valores (cuando el valor debe ser especı́fico de una lista de valores). Es posible especificar si la variable está fijada a través de una entrada de texto o un menú, y también, si su valor se considera inalterable. El array de FormVar se pone en una estructura de ServerSpec usando la función sspec addform (). Las entradas de ServerSpec que representan variables son agregadas al array de FormVar utilizando la función sspec addfv (). SSpecFileHandle Es utilizada internamente por Zserver para desarrollar nuevos filesystems que pueden ser incorporados a Zserver. Soporte de archivos comprimidos Es posible ejecutar en el servidor HTTP archivos comprimidos. Se utiliza la directiva #zimport en vez de #ximport, quien realiza la misma función pero comprime el archivo invocando utilidades de compresión antes de enviar el archivo. Para agregar un archivo comprimido a la tabla de recursos estática, se utiliza el macro SSPEC RESOURSE ZMEMFILE. Cada servidor utiliza un buffer para la descompresión. Servidor HTTP El servidor HTTP permite que páginas HTML y otros recursos sean alcanzables por los clientes (browsers). Se implementa por medio de la librerı́a HTTP.lib y utiliza la librerı́a Zserver para manejar los distintos recursos y controles de acceso. Un puntero a HttpState es el primer parámetro a todas las funciones CGI que son llamadas desde el servidor HTTP. Cliente FTP La librerı́a FTP CLIENT.LIB implementa el protocolo FTP para el lado de la conexión del cliente. Soporta una sola sesión FTP ya que el estado de la sesión es mantenido en una sola estructura global en la memoria. Es posible subir y bajar archivos a la memoria estática o bien tener un función que devuelva un puntero de datos capaz de implementar largas transferencias 56 CAPÍTULO 3. DESARROLLANDO CON RABBIT de archivos es varios buffers, o generar procesos de datos con un buffer mı́nimo. Se puede especificar una conexión FTP pasiva. Al hacerlo, el cliente abrirá activamente el puerto de la transferencia de datos en el servidor, evitando la necesidad del servidor de penetrar el firewall (si lo hubiese) con una conexión activa del exterior. Servidor FTP La librerı́a FTP SERVER.LIB implementa el protocolo FTP para el lado de la conexión del servidor. El servidor realiza una conexión FTP pasiva en el puerto 21 y queda escuchando por un cliente. Brinda la posibilidad de crear, leer y borrar archivos. Cliente SMTP El servidor SMTP espera que se conecten los clientes, generalmente, en el puerto 25 de TCP. Cliente POP3 POP3 es la forma más común de recuperar un E-mail de un servidor remoto. Es una conversación de texto a través de un socket TCP, normalmente utilizando el puerto 110 TCP. Existen dos formas de utilizar la librerı́a POP3.LIB: Descargar completamente el E-mail (header y texto), con toda la información. Descargar el E-mail separando header y texto. Pasos para recibir un E-mail pop3 init() es llamada una sola vez con el objetivo de proporcionar los datos entrantes. pop3 getmail() es llamada para empezar el E-mail que es recibido y para proveer a la librerı́a la información de la cuenta del E-mail. pop3 tick() es llamada para hacer correr la librerı́a mientras no es llamada. Telnet La librerı́a Vserial.lib implementa el protocolo Telnet. La implementación es un gateway telnet-serial y serial-telnet. 57 CAPÍTULO 3. DESARROLLANDO CON RABBIT 3.3.5. Prestaciones con Dynamic C Dynamic C es el nombre del entorno de desarrollo que se utiliza para implementar en Rabbit. Es también, el nombre del lenguaje de programación, una extensión al lenguaje ANSI C. Se permiten realizar las siguientes operaciones: edición compilación linkeado carga en el procesador depuración Caracterı́sticas Compila compila la totalidad del código del archivo fuente y las librerı́as. Soporta código assembler. Permite implementar co-sentencias (costatements). Tolera la implementación de co-funciones (cofunctions). Propiedades Si una variable es inicializada en su declaración (int x=0), será guardada en memoria flash y no puede ser alterada más tarde por una nueva asignación. Para inicializar variables estáticas en SRAM, se emplean las secciones #GLOBAL INIT. Al declarar una variable, la clase por defecto es auto. Utiliza la directiva #use para proveer la información automática de las librerı́as. Dynamic C compila directamente en la memoria del sistema objeto. Tipos de variables Se especifcan en tabla 3.3 58 CAPÍTULO 3. DESARROLLANDO CON RABBIT Variable integer long integer unsigned char unsigned integer unsigned long single floating point Tamaño 2 bytes 4 bytes 1 byte 2 bytes 4 bytes 4 bytes Tabla 3.3: Tipos de variables Librerı́a de funciones Incluye archivos en código fuente con funciones. Su extensión es .lib. Utiliza las funciones y los datos de las librerı́as para compilarlas junto con el programa de aplicación. Un programa (extensión .C) consiste en un archivo fuente que contiene una función llamada main() y otras funciones definidas por el usuario. Manejo de memoria Si el programa es pequeño, el código puede ubicarse en el área de memoria denominada root. Cuando el programa es más grande, parte del mismo tiene que ser compilado a la memoria extendida - segmento xmem -, ventana de 8 Kbytes en el espacio de 0xE000 a 0xFFFF. Para que ésto ocurra, se debe indicar en el código la sentencia #memmap xmem. Tanto las funciones como las variables pueden ser ubicadas en el área root o xmem. La estructura de la memoria se puede ver en la figura 3.5. Memoria Flash Se ubica por defecto a partir de la dirección 0x00000 y se controla mediante CS0/OE0/WE0. Si el sistema necesita actualizar constantemente información en la flash, debe saberse que existe un ”tiempo muerto”durante el cual la memoria está siendo escrita y el procesador no puede acceder a ella para ejecutar instrucciones. Memoria SRAM La RAM estática se ubica por defecto a partir de la dirección fı́sica 0x80000. Puede tener una pila de respaldo para tener un resguardo ante una pérdida de alimentación. 59 CAPÍTULO 3. DESARROLLANDO CON RABBIT Figura 3.5: Estructura de la memoria Procesamiento multitarea cooperativo En un entorno multitarea, pueden aparentar ejecutarse más de una tarea en paralelo, salvo que exista más de un procesador, ya que un procesador puede ejecutar solo una instrucción a la vez. El software multitarea cooperativo aprovecha las demoras naturales en cada tarea para mejorar el desempeño del sistema, cada tarea realiza parte de su trabajo mientras las otras están esperando que transcurra algún evento; de esta forma, las tareas se ejecutan casi en paralelo. Co-sentencias Simulan procesos paralelos concurrentes en un mismo programa y simplifican la implementación de tareas múltiples. La estructura de un costate es lista ordenada de operaciones a realizar. Cada costate tiene su propio puntero de programa para determinar que lugar de la lista debe ejecutarse cuando se le asigna la oportunidad, funciona internamente como una máquina de estados: while (1) { costate { sentencia de control //cede la ejecución a otros costates ... } 60 CAPÍTULO 3. DESARROLLANDO CON RABBIT } costate { sentencia de control //cede la ejecución a otros costates ... } Co-funciones Simulan procesos cooperativos en un mismo programa. Son similares a las costates, pero su formato es similar a las funciones: es posible pasarles argumentos y devuelven un resultado. Son llamadas desde un costate para ejecutar una determinada función. cofunc int nombre (int parametro) { ... sentencia de control //cede la ejecución a otros costates ... return(resultado) } Sentencias de control Se utilizan para delegar el procesamiento entre las distintas tareas, detectando los estados de espera y cediendo voluntariamente el control del procesador a otras tareas. waitfor (expresión): No es una función. Cualquier función que retorne algún valor puede ser utilizada como parámetro de espera. La ejecución se suspende hasta tanto la expresión utilizada devuelva un valor distinto de cero. waitfordone (tarea);: Se ve a la tarea como una cofunction: se la llama por primera vez, donde inicializa su operación, y continua a través de sucesivas llamadas durante el loop del programa. El fin ocurre cuando se satisface la condición waitfordone. yield;: Cede el control voluntariamente ante determinado evento. Es muy útil cuando se debe realizar una tarea mientras se controla una temporización determina 61 CAPÍTULO 3. DESARROLLANDO CON RABBIT Procesamiento multitarea con derecho preferente Las tareas no ceden el control voluntariamente, son programadas según el nivel de prioridad o por cierto timeout. Se logran mediante la utilización del µC/OS-II real - time kernel. 3.4. Estrategia de programación y desarrollo Como primera consideración, se buscó un simulador de la placa Rabbit pero ningún fabricante de Rabbit o terceras empresas ha desarrollado uno. Con el RCM3700 es posible debuggear sin estar conectado a la placa, pero no permite visualizar el debugging en tiempo real una vez programada la placa: correr las instrucciones paso a paso a medida que se ejecutan. Seguidamente, se investigó como programar la placa: conexión del cable de programación y seteos correspondientes. (Ver 3.4.1). Se corrió un ejemplo básico sobre Dynamic C (provisto de fábrica), y se analizó el mecanismo que realizaba el RCM3700 durante el proceso - compilación, bajada del archivo a la placa y ejecución -. Se resolvió que la manera más eficiente serı́a compilar en la memoria flash y ejecutar las aplicaciones en la SRAM. Se debió probar su eficiencia y capacidad para poder llevar a cabo los objetivos planteados. La estrategia de programación fue la siguiente: • Hacer funcionar un puerto serie. • Ver como implementar una página web con código HTML o Buscar la forma de autentificarse. o Probar el envı́o de mails cada vez que se realiza una acción en la página web. • Investigar la implementación de los protocolos y manejar el puerto serie por red. • Implementar una pequeña web por HTML para el manejo del puerto serie utilizando varias opciones. o Probar forms que manejen propiedades. o Definir acciones y mediante el click en estructuras, obtener distintos strings por el puerto serie. 62 CAPÍTULO 3. DESARROLLANDO CON RABBIT Se comenzó el desarrollo realizando pruebas con los distintos puertos series de la placa, cuando se vio el claro manejo de los puertos, se buscó la forma de cargarle a la placa un pequeño servidor web. La programación del mismo, constituyó en la implementación del protocolo HTTP, mediantes las librerı́as relacionadas; las páginas web se programaron en lenguaje HTML. Una vez alcanzado el objetivo se buscó la forma de restringir el acceso al servidor web por medio de usuarios y contraseñas, por lo cual, valiéndose de las librerı́as concurrentes, se implementó un método de autenticación. En otro orden, habiendo sido consideradas las amplias librerı́as que Rabbit ha desarrollado para el manejo del stack de directivas TCP/IP, se intentó realizar el envı́o de correos electrónicos por medio de la librerı́a SMTP cada vez que se llevaba a cabo un evento especı́fico en el servidor web. Fueron programadas distintas forms dentro del servidor, probándose las que despliegan propiedades y las que brindan la posibilidad de insertar texto. La intensión fue ofrecer un conjunto de opciones a ser procesadas luego. Se descubrió, que el manejo de las mismas no es del todo flexible, ya que permiten un único estilo de estructura y visualización: la imagen es en blanco y negro y no fue posible cambiar la definición de los campos principales dentro de las columnas; es una herramienta que se basa en un modelo estándar. El empleo de estructuras del tipo .CGI garantizó el método para controlar los distintos cambios en la web. Monitoreando el estado de las mismas, fue posible realizar varias acciones y notificar al servidor de la actualización de las variables correspondientes. Es engorrosa la programación con una gran cantidad de estructuras .CGI. Se envı́o una consulta al Tech Support de Rabbit comentando esta situación - y recomendaron el uso de RabbitWeb. RabbitWeb es una extensión de desarrollo para Dynamic C para simplificar la presentación de los objetos del lenguaje C (variables, estructuras) en un browser. Permite la escritura en un scripting especial que facilita la implementación de funciones en el servidor HTTP. El precio de esta extensión es de USD 150, lo que hizo prohibitiva su compra. Se tomó la decisión de implementar el menor número de estructuras .CGI, sólo las necesarias para cumplir con los objetivos propuestos. Teniendo en cuenta que no se habı́a trabajado anteriormente con ningún procesador Rabbit se decidió programar aplicando el procesamiento multitarea cooperativo. Tomando como base los ejemplos básicos, la literatura especı́fica y la ayuda del soporte online de Rabbitsemiconductor se comenzó a trabajar con las co-sentencias y las co-funciones, logrando evitar programar por medio de máquinas de estado. La utilización del µC/OS-II no fue evaluada ya que 63 CAPÍTULO 3. DESARROLLANDO CON RABBIT no se disponı́a de la documentación necesaria para aprender su funcionamiento. Las pruebas fueron el artı́fice de la solución; habiendo probando las capacidades de la placa, y determinando el poderı́o de Rabbit para realizar el trabajo como bloque central del sistema, se avanzó con el desarrollo de la arquitectura multiprotocolar. Luego de diseñado el protocolo de comunicación, se implementó la solución correspondiente, considerando la comunicación half-duplex por el puerto serie, la interacción con el servidor HTTP y el manejo de la librerı́a SMTP. 3.4.1. Formas de programación de la placa Inicialmente, habiendo leı́do cierta literatura no oficial de Rabbit, se consideró que existı́a la forma de programar el RCM3700 por Ethernet. Visto y considerando que los manuales oficiales de Rabbit no mencionaban este tema se envió una consulta al Tech Support de Rabbit preguntando sobre esta prestación; la respuesta fue clara: no es posible programar la placa por Ethernet. La única forma de programación de la placa es mediante el puerto serie de la pc utilizando el cable de programación que viene incluı́do en el kit de desarrollo. El software utilizado para la programación es también Dynamic C. Para configurar la comunicación serial hay que entrar al menú Options\ Project Options\Comunications: en el campo Connection Type se debe marcar la opción Use Serial Connection. en Serial Options\Serial Port elegimos el puerto COM correspondiente y se setea Stop Bits 1. es necesario marcar Enable Processor verification para compilar en la memoria flash. 3.4.2. Debugging De las múltiples herramientas para debuggear que permite Dynamic C, se utilizaron las siguientes: Sentencia printf() - despliega mensajes en la ventada de la Stdio. Breakpoints - detiene la ejecución, y permite examinar el recorrido del programa. 64 CAPÍTULO 3. DESARROLLANDO CON RABBIT Paso a paso - ejecuta una sentencia por vez. Prendido de leds - dos leds de la placa pueden prenderse y apagarse para indicar una variedad de condiciones. En [Rabbitsemiconductor2, 2007] pág 68 se describen las ventajas y desventajas de las diferentes herramientas que soporta Dynamic C para debuggear. 3.4.3. Gestión ante errores y problemas Durante el desarrollo de las aplicaciones, surgieron inconvenientes que fueron más allá de un error de sintaxis o semántica en el momento de la compilación. Un error de funcionamiento puede darse por directivas de software mal definidas, o bien, el hardware utilizado (si se emplea) está dañado. Ante éstas inclemencias, se siguió un procedimiento riguroso para gestionar la solución de los mismos: Localizar la existencia del problema. Aislar la fuente del mismo. Identificar las causas del problema. Determinar la solución. Aplicar las medidas correspondientes y testear. Ejemplo concreto Durante las pruebas realizadas para visualizar el comportamiento del puerto serie C de la placa, surgió un inconveniente. La prueba consistı́a en implementar una comunicación half - duplex entre el puerto COM de la computadora y el puerto C de la placa, habilitando la emisión y recepción de caracteres en ambas partes. La transmisión desde el puerto serie C y la recepción en la hyperterminal de la computadora se realizaba correctamente, no ası́, la transmisión desde la computadora hacia el puerto C; la comunicación inversa no funcionaba. Primeramente, se verificó que las configuraciones entre puertos seriales fueran las correctas: baudrate, paridad, control de flujo, cantidad de datos y puerto COM. Teniendo la misma configuración, se probó con otra computadora. Ocurrió lo mismo. Luego, se debuggeó el código implementado en lenguaje C (generando mensajes en la Stdio) y no se constataron errores. 65 CAPÍTULO 3. DESARROLLANDO CON RABBIT Seguidamente, se configuró el RCM3700 (empleando jumpers) de forma tal, de transmitir un caracter por el puerto C hacia el puerto D y hacer el echo correspondiente: transmitir hacia el puerto C el caracter recibido en el D. La prueba funcionó correctamente. Se determinó que el problema radicaba en el medio de comunicación, un cable null modem básico: GND1 - GND2, Tx1 - Rx2, Rx1 - Tx2, conectado entre el puerto serie y el puerto C de la placa. Se examinaron las conexiones y se descubrió que la soldadura del pin 3 de la ficha DB9 hembra conectada al puerto COM contenı́a una burbuja de aire, la cual impedı́a la conexión fı́sica entre los pares. Se volvió a soldar la ficha y se testeó el programa inicial. La prueba fue realizada en forma correcta. 3.5. Pruebas Aquı́ se explica sólo el funcionamiento de las pruebas relevantes. Las otras pruebas realizadas sirvieron como guı́a para delimitar el alcance del módulo Rabbit y aportar al desarrollo de cada prueba relevante. Los códigos se encuentran plasmados en el Anexo C. 3.5.1. BotonEnviaCaracter.c El programa transmite y recibe un string ASCII por los puertos C y E, y despliega en pantalla el mensaje recibido en ambos puertos. Presionando y soltando el botón S1 de la placa, se envı́a el mensaje desde el puerto C al E. Se realiza función inversa, presionando y soltando el botón S2. La velocidad de cada puerto está seteada a 19200. En el prototyping board se debe conectar, por medio de jumpers, el TxC con el RxE y el RxC con el TxC. 66 CAPÍTULO 3. DESARROLLANDO CON RABBIT 3.5.2. Autentificación.c Permite que los usuarios se registren con usuario y password. Se visualiza una página web que contiene una imagen y un mensaje. Se pueden configurar los usuarios que se deseen, por imposición, se estable por defecto para tres usuarios. Las opciones de autenticación están implementadas en el código con un case. El main ejecuta un menú y según lo que el usuario presione establece las distintas opciones: habilitar/deshabilitar el usuario 1, habilitar/deshabilitar el usuario 2, habilitar/deshabilitar el usuario 3, autentificación básica, autentificación con resumen o sin autentificación. Se maneja el uso del protocolo HTTP con autentificación. La figura 3.6 muestra la imagen de la autenticación. Figura 3.6: Autentificación.c 3.5.3. Leds.c Permite controlar por medio de una página web el prendido y apagado de los leds DS1 y DS2 de la placa de desarrollo. La especificación de las opciones de prendido/apagado, para cada uno de los botones, se realiza en el main. Al iniciar el programa, el led1 comienza prendido y el led2 apagado. Luego, se setea la placa con las configuraciones HTTP correspondientes y se entra en loop ofreciendo la posibilidad que se cambie el estado de los leds mediante la presión de los botones correspondientes en la página web. Se emplea el uso del protocolo HTTP y las funciones .CGI asociadas. 67 CAPÍTULO 3. DESARROLLANDO CON RABBIT 3.5.4. LedsAutenti.c Permite autentificar usuarios (como lo hace el codigo Autentificacion.c) y maneja el prendido y apagado de los leds DS1 y DS2 de la placa de desarrollo. Es una mezcla entre las pruebas Leds.c y Autentificación.c. Se emplea el protocolo HTTP con autentificación y sin autentificación. La figura 3.7 muestra la imagen del encendido/apagado de los leds. Figura 3.7: Botones 3.5.5. EnviaMail.c Detecta la presión de alguno de los dos botones ubicados en la placa de desarrollo. Si se cumple la condición, se envia un mail notificando lo ocurrido. Se utiliza el protocolo SMTP. 3.5.6. FormAsociada.c Carga en el servidor HTTP una form con opciones para setear un puerto serie determinado y enviar un string. Muestra la form y opciones; no permite el uso del puerto serie. Al iniciar, pide la autenticación del usuario. El ID es usuario y el pass es usuario. La figura 3.8 muestra la imagen del formulario. 68 CAPÍTULO 3. DESARROLLANDO CON RABBIT Figura 3.8: Form 3.6. Referencias [Del Castillo, 2002] Del Castillo San Félix, Alvaro. 1999.1.3. El protocolo HTTP .[online] Disponible en Internet: <http://acs.barrapunto.org/ articulos/trunk/LinuxActual/Apache/html/x49.html> [HTML, 2007] HTML. 2007.Investigación del protocolo HTML .[online] Disponible en Internet: <http://z0.saladeteletipos.com/twiki/bin/view/ ProcesadorMultiprotocolar/ProtocoloHTML> [Postela, 1982] Postel, Jonathan B. 1982. SIMPLE MAIL TRANSFER PROTOCOL. RFC 821 [online]. Disponible en Internet: <http://www.ietf.org/rfc/ rfc0821.txt> [Postelb, 2001] Postel, J. 1983.Especificación del protocolo TELNET . RFC 854 [online] Disponible en Internet: <http://www.rfc-es.org/rfc/rfc0854es.txt> [Programación, 2006] Programación. 1999.Protocolo HTML .[online] Disponible en Internet: <http://www.programacion.com/html/foros/2/> [ProgramacionWeb1, 2007] CopyLeft. 2003.El protocolo SMTP .[online] Disponible en Internet: <http://www.programacionweb.net/articulos/ articulo/?num=412> [ProgramacionWeb2, 2007] CopyLeft. 2003.El protocolo HTTP .[online] Disponible en Internet: <http://www.programacionweb.net/articulos/ articulo/?num=409> 69 CAPÍTULO 3. DESARROLLANDO CON RABBIT [Rabbitsemiconductor2, 2007] Rabbit Semiconductor. 1999 .Dynamic C: User’s Manual.[online] Disponible en Internet: <http://www.rabbitsemiconductor.com/ documentation/docs/manuals/DC/DCUserManual/DCPUM.pdf> [Rabbitsemiconductor3, 2007] Rabbit Semiconductor. 1999 .Dynamic C TCP/IP Volume 1.[online] Disponible en Internet: <http://www.rabbitsemiconductor.com/ documentation/docs/manuals/TCPIP/UsersManualV1/tcpV1.pdf> [Rabbitsemiconductor4, 2007] Rabbit Semiconductor. 1999 .Dynamic C TCP/IP Volume 2.[online] Disponible en Internet: <http://www.rabbitsemiconductor.com/ documentation/docs/manuals/TCPIP/UsersManualV1/tcpV2.pdf> [Rabbitsemiconductor5, 2007] Rabbit Semiconductor. 1999 .RabbitCore RCM3700.[online] Disponible en Internet: <http://www.rabbitsemiconductor.com/ documentation/docs/manuals/RCM3700/RC3700UM.pdf> [Rabbitsemiconductor6, 2007] Rabbit Semiconductor. 1999 .Rabbit 3000 User manual.[online] Disponible en Internet: <http://www.rabbitsemiconductor.com/ documentation/docs/manuals/Rabbit3000/UsersManual/R3000UM.pdf> [Utem, 2006] UTEM. 1994.Manual HTML .[online] Disponible en Internet: <hhttp://www.utem.cl/web/form.htm> [Webopedia1, 2007] Webopedia. 2007.SMTP .[online] Disponible en Internet: <http://www.webopedia.com/TERM/S/SMTP.html> [Webopedia2, 2007] Webopedia. 2007.HTTP .[online] Disponible en Internet: <http://www.webopedia.com/TERM/H/HTTP.html> [Wikipedia5, 2007] WIKIPEDIA. 2007.HTML .[online] Disponible en Internet: <http://es.wikipedia.org/wiki/HTML> 70 Parte II Manejo y control de protocolos Capı́tulo 4 Arquitectura multiprotocolar 4.1. Introducción Es fundamental una buena planificación del trabajo de investigación para desarrollar un protocolo. Esta organización permite lograr que al final los datos registrados puedan ser evaluables o de escasa validez, faltos de credibilidad o insuficientes para arrojar luz sobre la hipótesis que motivó el desarrollo del mismo. Como en toda actividad, resultan muy importantes los conocimientos, la experiencia y el sentido común. Si un estudio no ha sido bien planificado, en la fase de análisis será muy difı́cil subsanar los errores. Este desarrollo contempla definiciones concurrentes al entorno de trabajo y a la coherencia en la elección de variables, velocidades y tiempos. Las posibles operaciones deben estar claramente estructuradas y las relaciones de interdependencia completamente detalladas. Dicho protocolo puede verse como un “juego repetido”, una sucesión de interacciones entre dos entidades expresamente definidas: el bloque central y los módulos exteriores. Las particularidades fı́sicas y el contenido de la información intercambiada se describen en este capı́tulo. 2 También, son parte del estudio los protocolos RS485, GPIB e I C, ası́ como también, se hace referencia a los estándares dedicados a la domótica. 4.2. 4.2.1. Marco teórico Protocolo CEBus Según [CEBus, 1999], CEBus (Consumer Electronics Bus) es un estándar que ha sido desarrollado por la Asociación de Industrias Electrónicas (EIA- 72 CAPÍTULO 4. ARQUITECTURA MULTIPROTOCOLAR Electronic Industries Association). Surgió en 1984 cuando la EIA se propuso unificar los protocolos de señalización infrarroja para el control de remoto de electrodomésticos. En 1992, se extendió a todo el ámbito de control domótico. Los objetivos del estándar son facilitar el desarrollo de módulos de interfaz de bajo coste que puedan ser integrados fácilmente en electrodomésticos, soportar la distribución de servicios de audio y vı́deo tanto en formato analógico como digital, evitar la necesidad de un controlador central, distribuyendo la inteligencia de la red entre todos los dispositivos. Los comandos y los informes de estados se transmiten por el canal de control en forma de mensajes. El formato de los mensajes CEBus es independiente del medio de fı́sico utilizado (red eléctrica, cable par trenzado, cable coaxial, infrarrojo, radio frecuencia, fibra óptica o bus audio-vı́deo). Cada mensaje contiene la dirección de destino de receptor, de esta forma CEBus forma una red uniforme a nivel lógico en forma de bus. Como parte de la especificación CEBus se ha definido un lenguaje común para el diseño y especificación de la funcionalidad de un nodo llamado CAL (Common Application Language) y esta orientado a objetos (estándar EIA600). 4.2.2. Protocolo SCP Según [SCP, 1999], SCP (Simple Control Protocol) es un intento de Microsoft y General Electric, de crear un protocolo para redes de control en todas las aplicaciones de automatización de edificios y viviendas. Se trata de auspiciar la convergencia de protocolos existentes hacia un protocolo abierto y libre de regalı́as, además de desarrollar un conjunto de productos que cubran todos los requisitos de automatización. Se trata de asegurar la conexión punto a punto entre dispositivos y definir un conjunto de funciones distribuidas extremo a extremo que permita el desarrollo de múltiples servicios en las viviendas con un bajo coste y de forma segura. A nivel fı́sico el SCP ha escogido una solución basada la transmisión de datos por las lı́neas de baja tensión (ondas portadoras) que ya estaba desarrollada, el CEBus. Está diseñado para funcionar sobre redes de control con un ancho de banda muy pequeño (menor a 10 Kbps) y optimizado para las condiciones de ruido 73 CAPÍTULO 4. ARQUITECTURA MULTIPROTOCOLAR caracterı́sticas de las lı́neas de baja tensión. 4.2.3. Protocolo EIB Según [EIB, 2006], EIB (European Installation Bus) es un sistema para la domótica auspiciado por la Unión Europea. El objetivo fue crear un estándar con el suficiente número de fabricantes, instaladores y usuarios, que permita comunicarse a todos los dispositivos de una instalación eléctrica (contadores, equipos de climatización, de custodia y seguridad, de gestión energética y electrodomésticos). Está basado en la estructura de niveles OSI y tiene una arquitectura descentralizada. Define una relación extremo a extremo entre dispositivos que permite distribuir la inteligencia entre los sensores y los actuadores instalados en la vivienda. Como medio fı́sico, en un principio se contempló solo la utilización de un cable de dos hilos, pero luego se tomaron en cuenta: EIB.TP - par trenzado a 9600 bps. EIB.PL - corrientes portadoras sobre 230 V ac/50 Hz. a 1200/2400 bps. NET - ethernet a 10 Mbps. EIB.RF - radiofrecuencia usando varias portadoras. EIB.IR - infrarrojo 4.2.4. Protocolo LonWorks Según [LonWorks, 2006], LonWorks es una tecnologı́a presentada por Echelon, que ha tenido éxito en instalaciones profesionales, en las que importa más la fiabilidad y robustez que el precio. Ofrece una solución con arquitectura descentralizada, extremo a extremo, que permite distribuir la inteligencia entre los sensores y los actuadores instalados en la vivienda y cubre desde el nivel fı́sico al nivel de aplicación de la mayorı́a de los proyectos de redes de control. Su arquitectura es un sistema abierto a cualquier fabricante que quiera usar esta tecnologı́a sin depender de sistemas propietarios, que permite reducir los costos y aumentar la flexibilidad de la aplicación de control distribuida. 74 CAPÍTULO 4. ARQUITECTURA MULTIPROTOCOLAR Cualquier dispositivo LonWorks (también llamado nodo) está basado en un microcontrolador especial llamado Neuron Chip, el cual: Tiene un identificador único, el Neuron ID, que permite direccionar cualquier nodo de forma unı́voca dentro de una red de control LonWorks. Este identificador de 48 bits se graba en la memoria EEPROM durante la fabricación del circuito. Es independiente del medio fı́sico sobre el que funciona, los datos pueden transmitirse sobre cables de par trenzado, ondas portadoras, fibra óptica, radiofrecuencia y cable coaxial, entre otros. El firmware que implementa el protocolo LonTalk, proporciona servicios de transporte y routing extremo a extremo. Está incluido un sistema operativo que ejecuta y planifica la aplicación distribuida y que maneja las estructuras de datos que se intercambian los nodos. Los datos pueden tener dos formatos, un mensaje explı́cito o una variable de red. Los mensajes explı́citos son la forma más sencilla de intercambiar datos entre dos aplicaciones residentes en dos nodos del mismo segmento LonWorks. Por el contrario, las variables de red proporcionan un modelo estructurado para el intercambio automático de datos distribuidos en un segmento LonWorks. 4.2.5. Protocolo EHS Según [EHS, 1990], EHS (European Home Systems) es un intento de la industria europea, auspiciada por la Comisión Europea, de crear una tecnologı́a que permitiera la implantación de la domótica en el mercado residencial de forma masiva. Como medio fı́sico se utilizan: PL-2400 - ondas portadoras a 2400 bps. TP0 - par trenzado a 4800 bps. TP1 - par trenzado/coaxial a 9600 bps. TP2 - par trenzado a 64 Kbps. IR-1200 - infrarrojo a 1200 bps. RF-1100 - radiofrecuencia a 1100 bps. Define un protocolo, basado en el modelo OSI, que pretende: 75 CAPÍTULO 4. ARQUITECTURA MULTIPROTOCOLAR Parámetro Modo de operación Número de conductores y receptores Longitud máxima del cable Máxima velocidad de transmisión Máximo modo común de voltaje Mı́nimo nivel de producción del conductor con carga Mı́nimo nivel de producción del conductor sin carga Carga mı́nima del conductor Lı́mite de corriente de cortocircuito de la salida Mı́nima impedancia de entrada Sensibilidad del receptor Valor Diferencial 32 conductores 32 receptores 1200 metros 10 MBaudios 12V a -7V +/- 1.5 +/- 6 60 Ω 150 mA a GND, 250 mA a -7 o 12V 12 KΩ +/- 200 mV Tabla 4.1: Estándar RS485 Compatibilidad total entre dispositivos EHS. Configuración automática de los dispositivos, movilidad de los mismos y ampliación sencilla de las instalaciones. Compartir un mismo medio fı́sico entre diferentes aplicaciones sin interferencia entre las mismas. 4.2.6. Protocolo RS485 Los estándares se han desarrollado para asegurar compatibilidad entre las unidades proporcionadas por diferentes fabricantes. La EIA (Electronics Industry Association) ha producido el estándar RS485 para comunicación de datos. Según [tyco Electronics, 2002], RS485 es una lı́nea balanceada que opera en modo half-duplex y permite distancias de transmisión hasta 1200 metros. El estándar está especificado en la tabla 4.1. Como señala [RS485, 2007], las señales diferenciales ayudan a anular los efectos de los cambios de tierra y de las señales de ruido inducidas, que pueden aparecer como voltajes de modo común en una red. 4.2.7. Protocolo GPIB El bus GPIB (General Purpose Instrument Bus) es un bus digital de corto alcance que fue inventado por Hewlett-Packard en 1974 para simplificar la interconexión de instrumentos de medidas con la computadora y brindar una interfaz estándar entre instrumentos de diferentes compañı́as. Fue adoptado 76 CAPÍTULO 4. ARQUITECTURA MULTIPROTOCOLAR como IEEE STD 488 en 1978. Un máximo de 15 dispositivos pueden existir en el bus, y se describen según sus funciones: controladores, transmisores y receptores. Algunos dispositivos pueden tener más de una función. Descripción Figura 4.1: Sistema GPIB El sistema más simple consiste en un controlador y un transmisor o receptor. Los controladores tienen la habilidad de enviar comandos, transmitir datos y escuchar al resto de los dispositivos. Es viable tener más de un controlador en el bus, pero sólo uno podrá estar activo en cualquier momento. Los dispositivos son direccionables como transmisores y receptores. Cada uno, tiene una dirección primaria entre 0 y 30. También, alcanzan direcciones secundarias que se utilizan para tratar funciones secundarias o direccionar otros canales. Ciertos dispositivos pueden ser seteados como sólo recepción o sólo transmisión. Pueden convivir en el bus dos dispositivos sin la necesidad de un controlador. La interfaz incorpora ocho lı́neas de datos, cinco lı́neas de control y tres lı́neas de handshake. Caracterı́sticas fı́sicas Los dispositivos se pueden conectar por lineas directas, en forma de estrella o combinadas. La conexión general es en daisy chain (según [Wikipedia6, 2007], es un cableado de forma tal que el equipo A se conecta al equipo B, el B se conecta al C, y ası́ sucesivamente, donde las conexiones no realizan un loop back desde el último dispositivo al primero). 77 CAPÍTULO 4. ARQUITECTURA MULTIPROTOCOLAR El conector estándar IEEE-488 utiliza 24 pines, teniendo un plug hembra y uno macho en las dos puntas. Se especifica una distancia máxima de bus de 20 metros, donde los dispositivos pueden estar separados por un máximo de 2 metros. Ésta consideración, limita la velocidad de trabajo. El bus utiliza la lógica negativa del estándar TTL. La figura 4.2 muestra un conector GPIB Figura 4.2: Conector GPIB La tabla 4.2 especifica el uso de cada pin del conector. Señales DIO1–DIO8 - Data input/output bits. Estas lı́neas son usadas para leer y escribir los 8 bits de datos o el comando a transmitir por el bus. NRFD - Not ready for data. Lı́nea de handshake activada por los receptores para indicar que no están prontos para recibir un nuevo dato. DAV - Data valid. Lı́nea de handshake que señala la validez del valor enviando por DIO1-DIO8. NDAC - Not data accepted. Lı́nea de handshake activada por los receptores que indica no haber leı́do el contenido de las lı́neas DIO. ATN - Attention. Se levanta para advertir que las lı́neas DIO contienen un byte de comandos y no un byte de datos. EOI - End-or-identify. Se levanta con el último byte de datos para indicar el fin del mensaje. IFC - Interface clear. El controlador levanta la lı́nea por 100 µseg. para resetear el bus y hacerse cargo del sistema. REN - Remote enable. El controlador levanta la lı́nea y habilita a los dispositivos a entrar en el modo remoto. SRQ - Service request. Los dispositivos pueden levantar la lı́nea para requerir servicio del controlador. 78 CAPÍTULO 4. ARQUITECTURA MULTIPROTOCOLAR Número de pin 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 Lı́nea del bus DIO1 DIO2 DIO3 DIO4 EOI DAV NRFD NDAC IFC SRQ ATN SHIELD DIO5 DIO6 DIO7 DIO8 REN GND GND GND GND GND GND Descripción Data input/output bit Data input/output bit Data input/output bit Data input/output bit End-or-identify Data valid Not ready for data Not data accepted Interface clear Service request Attention Data input/output bit Data input/output bit Data input/output bit Data input/output bit Remote enable wire twisted with DAV wire twisted with NRFD wire twisted with NDAC wire twisted with IFC wire twisted with SRQ wire twisted with ATN Tabla 4.2: Pines conector GPIB 79 CAPÍTULO 4. ARQUITECTURA MULTIPROTOCOLAR Comando MLA MTA LAD TAD SAD UNL UNT Función My listen address (controlador a sı́ mismo) My talk address (controlador a sı́ mismo) Device listen address (0-30) Device talk address (0-30) Secondary Device address Unlisten (LAD 31) Listen (TAD 31) Tabla 4.3: Comandos de dirección Comando LLO DCL PPU SPE SPD Función Local lockout Device clear Parallel poll unconfigure Serial poll enable Serial poll disable Tabla 4.4: Comandos Universales Mensajes de la interfaz Comandos de dirección La tabla 4.3 especifica la función de los comandos de dirección. Comandos universales La tabla 4.4 muestra la función de cada comando universal. Comandos de dirección para los receptores Se establecen los comando de dirección por medio de la tabla 4.5 Velocidades y tiempos El dispositivo más lento participa en el control y handshake para determinar la velocidad de transmisión. El bus opera a esa velocidad, por esta razón es difı́cil estimar la velocidad de transmisión ya que depende de los dispositivos. Los datos se transfieren de forma ası́ncrona utilizando las lineas de handshaking en lugar de un reloj. 80 CAPÍTULO 4. ARQUITECTURA MULTIPROTOCOLAR Comando SDC GTL GET PPC TCT Función Selected device clear Go to local Device trigger Parallel poll configure Take control Tabla 4.5: Comandos de dirección para los receptores Figura 4.3: Velocidades y Tiempos La información desplegada anteriormente esta basada en [Interfacebus, 2006], [ICS, 2007] y [Tech Soft, 2007]. 4.2.8. 2 Protocolo I C Es un protocolo desarrollado por Philips Semiconductors, es una abreviación de Integer Integrated Circuit bus (IIB). Estructura fı́sica Según [ESAcademy1, 2000], el bus fı́sico está compuesto por dos lı́neas activas bidireccionales llamadas Datos (SDA) y Reloj (SCL). Cuando el bus está en un estado de IDLE, las lı́neas están en alta impedancia. Si el bus 81 CAPÍTULO 4. ARQUITECTURA MULTIPROTOCOLAR está siendo empleado para transmitir, los demás chips no tienen el acceso permitido para transmitir. La figura 4.4 muestra la topologı́a del bus. Figura 4.4: BUS Especificación Cada dispositivo del bus tiene su propia dirección y puede actuar como transmisor o receptor, es un bus multi-master. El protocolo especifica que la entidad que inicia una transferencia es considerada el maestro, por lo cual el resto de los dispositivos serán esclavos. El diálogo comienza con una condición de START, a partir de la cual los esclavos esperarán información. Luego, se envı́a el ADDRESS que se desea acceder. Seguidamente, cada esclavo comparará esta dirección con su address y si conicide enviará un ACKNOWLEDGE. A partir de ese instante, comenzará la transmisión de información entre los dos dispositivos, hasta que se envı́a la señal de STOP. START - primero tira la lı́nea SDA a un estado bajo y luego, hace lo mismo con SCL. ADDRESS - la figura 4.5 muestra la especificación: ACKNOWLEDGE - el esclavo que enviará un ACK, tira la lı́nea SDA a un estado bajo inmediatamente después de la recepción del octavo bit transmitido, en caso de ser un byte de ADRESS, después de su evaluación. STOP - primero lanza a un estado alto SCL y luego SDA. Estudio realizado en base a [ESAcademy2, 2000]. 82 CAPÍTULO 4. ARQUITECTURA MULTIPROTOCOLAR Figura 4.5: Address I 2 C 4.2.9. Cable par trenzado Existen dos tipos de cables de par trenzado: cable de par trenzado sin apantallar (UTP) y par trenzado apantallado (STP). Se agrupan una serie de hilos y se encierran en un revestimiento protector para formar un cable. La cantidad total de pares que hay en un cable puede variar. El trenzado elimina el ruido eléctrico de los pares adyacentes y de otras fuentes como ser motores, relés y transformadores. El cable UTP, es el tipo más conocido y ha sido el cableado LAN más utilizado en los últimos años. El STP utiliza una envoltura con cobre trenzado, más protectora y de mayor calidad que la usada en el cable UTP. Utiliza una lámina rodeando cada uno de los pares, permitiendo soportar mayores tasas de transmisión que UTP. Los estándares definen categorı́as de UTP, ver [Monografias, 2007] y [Wikipedia7, 2007]: Categorı́a 1 - adecuado para transmitir voz, pero no datos. Categorı́a 2 - para transmisión de datos de hasta 4 Mbps. Categorı́a 3 - soporta transferencia de datos de hasta 16 Mbps. Categorı́a 4 - permite transmitir datos hasta 20 Mbps. Categorı́a 5 - velocidades hasta 100 Mbps. Categorı́a 5e - desempeño posible hasta frecuencias de 100 MHz. Categorı́a 6 - capacidad hasta 250 MHz. Categorı́a 6a - aplicaciones futuras hasta 10 Gbps. Categorı́a 7 - tolera frecuencias hasta 600 MHz. 83 CAPÍTULO 4. ARQUITECTURA MULTIPROTOCOLAR 4.3. Creación de un protocolo propio Teniendo en cuenta - por un lado los protocolos existentes y por el otro la creación de un protocolo propio -, sabiendo que los protocolos dedicados a la automatización se adaptan perfectamente a los objetivos del proyecto y conociendo sus facilidades, se decidió por la concepción de un nuevo protocolo. Se buscó plasmar en el mismo, una arquitectura multiprotocolar para ahondar en las distintas etapas de realización del mismo, investigar sus problemas teórico - prácticos y encontrar las soluciones. No se buscó toparse con problemas de uso de un protocolo especı́fico (implementando una solución hecha), sino toparse con inconvenientes propios del diseño. Para este primer prototipo se decidió implementar 16 módulos exteriores para ser comandados. Se tomó esta restricción como hipótesis de trabajo sabiendo que para futuras versiones se podrán comandar mayores cantidades de módulos - ya que el protocolo lo permite -. 4.4. Definiciones relativas a la arquitectura multiprotocolar Se establece un modo de conexión maestro - esclavos. El Rabbit realiza la labor de maestro (coordina la comunicación), en tanto que los módulos exteriores son los esclavos, y solo responden ante consultas del Rabbit. Los módulos exteriores se identifican en el sistema a través de un ID o address, un tipo de módulo y un número serial. El usuario deberá establecer el ID en cada uno de éstos. Vale recalcar que cada módulo exterior controla y permite el funcionamiento de un único protocolo. El término “acción”hace referencia al empleo de éste último. Periódicamente, el Rabbit realiza un “ciclo de consulta”, cuestionando la existencia de módulos en cada dirección. Para especificar el destinatario de la comunicación, el primer campo del mensaje es el ID correspondiente. Se define “la regla de los tres intentosçomo el mecanismo por el cual el Rabbit retransmite un mensaje al mismo módulo exterior. Cada mensaje, puede transmitirse tres veces - generando de ésta forma - tres intentos de transmisión. El concepto, abarca también, un intervalo de espera entre intento e intento. Al envı́o de información desde el Rabbit hacia los módulos se lo denomina 84 CAPÍTULO 4. ARQUITECTURA MULTIPROTOCOLAR “mensaje”, mientras que la comunicación con origen en los módulos y destino el Rabbit, se la define como “notificaciones”. La figura 4.6 muestra esta interacción. Figura 4.6: Interacción 4.5. Descripción del protocolo por capas El protocolo se encuentra detallado y analizado capa por capa. La arquitectura está compuesta por tres capas: capa fı́sica, capa de conexión y capa de acciones. La figura 4.7 muestra un diagrama de las mismas Figura 4.7: Capas 4.5.1. Capa fı́sica En esta sección se describe el análisis efectuado para la implementación de la capa fı́sica de la arquitectura multiprotocolar. Se especifican las decisiones tomadas para su elección y las consideraciones prácticas, elocuentes a su utilización. El primer parámetro de diseño fue la utilización del PIC 16F628A, como el manejador de la ”inteligencia”para los módulos exteriores. La elección fue tomada en base a: • bajo costo y disponibilidad en el mercado local (USD 5 empresa Eneka). • amplias facilidades y caracterı́sticas conocidas. Ver sección 5.2: 85 CAPÍTULO 4. ARQUITECTURA MULTIPROTOCOLAR o 16 pines de entrada/salida. o 3 timers configurables. o módulo PWM. o 2 comparados de tensión. o USART integrada. o Oscilador de 4 MHz. • conocimiento de funcionamiento por previo empleo. Investigación inicial Para la implementación de la capa fı́sica se consideraron las siguientes posibilidades: 1. Arquitectura basada en el bus IEEE - 488 (GPIB) Como se vio anteriormente, el protocolo GPIB utiliza 24 pines. Si se quiere implementar el protocolo en sı́, el Rabbit podrı́a destinar esta cantidad de pines, pero el PIC 16F628A, no. Existen pines que no aportan valor para la instrumentación de la arquitectura multiprotocolar, por tanto, tomando como base el bus 488, se decidió considerar: • cuatro lı́neas de datos (en vez de ocho) para enviar 2 nibbles, primero los 4 bits menos significativos y luego los restantes 4. • cinco lı́neas de handshaking: o NRFD - no está preparado para recibir un nuevo dato. o DAV - dato válido. o EOI - identifica el último nibble que se transmitió. o IFC - resetea el bus y lo limpia. o SRQ - cuando un esclavo pide servicio porque está fallando. • una lı́nea de tierra. Sumando conexiones, serı́an necesarias diez lı́neas para la implementación propia de la capa fı́sica. La ocupación de los puertos de E/S del PIC estarı́a casi saturada (faltarı́a considerar los pines utilizados para el direccionamiento del módulo exterior y las señales de alarma). La recepción y transmisión de datos se realizarı́a por polling e insumirı́a varias temporizaciones, ya que el protocolo debe satisfacer las necesidades temporales de cada lı́nea de control. 86 CAPÍTULO 4. ARQUITECTURA MULTIPROTOCOLAR La conexión entre módulos exteriores serı́a en modo daisy-chain, por lo cual se necesitarı́a elaborar una lógica que permitiese el funcionamiento en caso de fallas en algún módulo. La gran ventaja, es su estructura de bus paralelo, todos los módulos pueden conectarse paralelamente, lı́nea a lı́nea. Contrariamente, las salvedades entre distancias serı́a un impedimento - distancia entre módulo y módulo, y distancia máxima del bus -. 2. Arquitectura cimentada en el bus I C 2 2 El I C no es un protocolo probado a nivel industrial, se emplea generalmente en comunicaciones entre dispositivos internos de una placa. Es un bus serial, pero los dispositivos se conectan en paralelo. El Rabbit 2 puede implementar una interfaz I C por software (tiene una librerı́a dedica2 da), pero el PIC no. Como información adicional, un PIC con interfaz I C es más caro que el 16F628A. Las restricciones en las distancias son una consideración importante. 3. Implementación de una interfaz serial RS232 con lógica operativa El RS232 es un protocolo pensado para entornos no industriales y de corta distancia. Ver sección 5.2. Serı́a necesario implementar cierta lógica digital de control, utilizando buffers tri-state y otros integrados, con el propósito de no generar colisiones ni cortocircuitos cuando dos o más módulos exteriores estén transmitiendo al mismo tiempo. Se trabajarı́a sobre un bus paralelo enviando strings seriales. El mayor obstáculo residirı́a en la distancia máxima del bus y la complejidad de la lógica. 4. Arquitectura sustentada en el protocolo RS485 Es un protocolo muy utilizado en ambientes industriales. Se podrı́a separar el bloque central de los módulos exteriores una distancia considerable, dado que soporta distancias de hasta 1000 metros. Con una conexión mediante par tranzado se puede transmitir hasta distancias de 100 metros (dependiendo del aislamiento del cable, etc), siendo ésta, una distancia excesiva como puntualidad de diseño. Este protocolo permite conectar los dispositivos en forma de bus, de tal 87 CAPÍTULO 4. ARQUITECTURA MULTIPROTOCOLAR forma, que el maestro puede establecer un contacto directo con cada uno de los módulos exteriores. Otra ventaja es la reducción de costos, ya que se instala solo un par de cables. Decisión final Para la decisión final se consideraron los siguientes aspectos: Distancias máximas alcanzables. Velocidad de transmisión del medio fı́sico. Limitaciones de adquisición de hardware. Facilidad de implementación. Localización de fallas. Se resolvió que el protocolo de capa fı́sica que brindarı́a mayor flexibilidad, granularidad y escalabilidad, serı́a el RS485. Según las consideraciones anteriores, cumple los mayores requisitos para la implementación de un protocolo propio. Ası́, se conectarı́an dispositivos en paralelo pero el modo de transmisión serı́a serial TTL. Hardware Para generar un bus RS485, se decidió la compra de integrados MAX485. Dichos integrados tienen un costo accesible (USD 4) y están disponibles en plaza. Pueden conectarse hasta 32 estaciones en un mismo bus. Según la hoja de datos, ver Anexo D, es necesario adaptar impedancias a través del método del stub para reducir la reflexión de señales a través de la lı́nea de transmisión. Allı́ se recomienda utilizar una resistencia de 120 Ω en la terminación del bus. Ésta recomendación es debida a la impedancia caracterı́stica del cable par trenzado. El circuito de recepción tiene una resistencia de entrada de 12 KΩ, solo absorbe una pequeña parte de la corriente. Cuando la intensidad llega al final de la lı́nea se refleja, pero al estar en paralelo con una resistencia de 120 Ω, la suma de intensidades produce una disminución entre ellas. Asimismo, se desprende calor y emisiones electromagnéticas (EMI). Si el bus estuviese formado por la cantidad máxima de módulos exteriores (16), la resistencia de entrada vista serı́a: Rve = 1 16 ( 12KΩ ) = 750Ω. 88 CAPÍTULO 4. ARQUITECTURA MULTIPROTOCOLAR Considerando la adaptación de 120 Ω, la resistencia equivalente serı́a: Re = 1 1 ( 750Ω+1/120Ω ) = 103, 45Ω. Considerando una alimentación de 5V, la potencia disipada serı́a V = 216, 6mW. Re 2 P = Según [AN723, 1983], pág 6, se utiliza una resistencia de pull-up y otra de pull-down, para normalizar la situación en la cual el bus se encuentra en estado “idle”(nivel en alta impdancia), se recomienda el uso de dos resistencias de 1 KΩ. No fue necesaria esta consideración, ya que la solución implementada no emplea estados de alta impedancia. El mecanismo por el cual funciona el MAX485 es el siguiente: El receptor, en una linea diferencial, recibe sólo la diferencia de tensión entre las dos señales (A y B). Ambas señales, son opuestas y complementrarias. La mı́nima diferencia de tensión entre ambas señales debe ser de 200mV. El cable que conecta los dispositivos MAX485 es un par trenzado UTP CAT5, ya que es el de mayor uso en el mercado. En la figura 4.8 se muestra lo expresado anteriormente. Figura 4.8: Arquitectura de la Capa Fisica Los integrados deben alimentarse por una fuente de 5 VDC. Para generar este voltaje se emplea un regulador de tensión LM7805. según la recomendación de la hoja de datos - ver Anexo D - se debe alimentar el circuito con 89 CAPÍTULO 4. ARQUITECTURA MULTIPROTOCOLAR una fuente de 12VDC para generar una señal estable a la salida del regulador. Por lo tanto, cada componente del sistema (bloque central y módulos exteriores) deben alimentarse con una fuente de continua de 12 VDC, 500 mA. Para resetear el Rabbit (ante fallas no deseadas), se conectó un pulsador con una resistencia en pull-up. El circuito de reset de los módulos exteriores está especificado en el Capı́tulo 5 Por información concreta de conexionado, ver Anexo (B) 4.5.2. Capa de conexión Cualquier medio de transmisión debe ser capaz de proporcionar una transmisión sin errores, es decir, un tránsito de datos fiable a través de un enlace fı́sico. Debe crear y reconocer los lı́mites de las tramas, ası́ como resolver los problemas derivados del deterioro o pérdida de tramas. La capa de conexión se ocupa del direccionamiento fı́sico de la información, la notificación de errores y de la distribución ordenada de tramas. Comunicación protocolar Se diseñó un protocolo capaz de cumplir los siguientes requisitos: comunicación lineal [comando, respuesta] - facilidad de adaptación a una conexión serial. comandos y respuestas simples - entendibles para no ocupar demasiada capacidad de procesamiento ni memoria. empleo de caracteres ASCII - para poder ser depurado desde una terminal de texto (Hyperterminal). Mensaje El mensaje es un recado que envı́a el Rabbit a los módulos exteriores. Existen comandos de configuración y comandos de funcionamiento que se emplean para los siguientes usos: buscar la cantidad de módulos exteriores presentes en el sistema. exigirle a un módulo exterior especı́fico la realización de cierta acción. consultarle a un módulo exterior de entradas digitales si tiene algún anuncio esporádico para notificarle. 90 CAPÍTULO 4. ARQUITECTURA MULTIPROTOCOLAR Intento Valor 0 Primera vez que se envı́a 1 Segunda vez que se envı́a 2 Tercera vez que se envı́a Tabla 4.6: Significado del campo Intento Estructura La figura 4.9 muestra la estructura del mensaje. Figura 4.9: Estructura del mensaje Especificación DIRECCIÓN = dirección del módulo de salida (dos números en formato ASCII). INTENTO = cantidad de veces que se envió el mensaje (número en formato ASCII). COMANDO = comando dirigido a los módulos de salida (caracter ASCII). PARÁMETRO = parámetro del comando (dos números en formato ASCII) PARIDAD = función de paridad calculada sobre la DIRECCIÓN, el INTENTO, el COMANDO y el PARÁMETRO. el LSB calcula la paridad de todos los LSB de los campos involucrados, el segundo de todos los segundos bits de los campos, y ası́ sucesivamente. Se expresa en hexadecimal. LF = fin de lı́nea (caracter ASCII 10). Intento La tabla 4.6 define el significado de cada valor del campo intento. Comando de configuración U Significado: Are you. Pregunta si existe un módulo de salida con la dirección correspondiente. 91 CAPÍTULO 4. ARQUITECTURA MULTIPROTOCOLAR Comandos de funcionamiento A Significado: Action. Ordena al módulo exterior la ejecución de una determinada acción. Q Significado: Question. Consulta a un módulo exterior de entradas digitales sobre la llegada de algún evento esporádico. R Significado: Reset. Exige el reseteo del módulo exterior. S Significado: Stop. Solicita que el módulo exterior deje de ejecutar la acción enviada anteriormente. Parámetro El significado del campo parámetro, se establece por la tabla 4.7. Paridad El byte de paridad se emplea para verificar la integridad del mensaje cunado éste arriba a los módulos exteriores. Los tipos de paridad se especifican según la tabla 4.8. Notificaciones Se definen como las reacciones de los módulos exteriores a los distintos eventos que ocurren. Existen 3 tipos: Notificación de presencia - confirma la existencia del ID consultado, explicitando el tipo de módulo exterior y una identificación propia. Notificación de respuesta - certifica la recepción de la acción solicitada. 92 CAPÍTULO 4. ARQUITECTURA MULTIPROTOCOLAR Parametro 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 Significado No ejecutar ninguna acción Ejecutar acción número 1 Ejecutar acción número 2 Ejecutar acción número 3 Ejecutar acción número 4 Ejecutar acción número 5 Ejecutar acción número 6 Ejecutar acción número 7 Ejecutar acción número 8 Ejecutar acción número 9 Ejecutar acción número 10 Ejecutar acción número 11 Ejecutar acción número 12 Ejecutar acción número 13 Ejecutar acción número 14 Ejecutar acción número 15 Ejecutar acción número 16 Ejecutar acción número 17 Ejecutar acción número 18 Ejecutar acción número 19 Ejecutar acción número 20 Ejecutar acción número 21 Ejecutar acción número 22 Ejecutar acción número 23 Ejecutar acción número 24 Ejecutar acción número 25 Ejecutar acción número 26 Ejecutar acción número 27 Ejecutar acción número 28 Ejecutar acción número 29 Ejecutar acción número 30 Ejecutar acción número 31 Ejecutar acción número 32 Tabla 4.7: Significado del campo Parametro 93 CAPÍTULO 4. ARQUITECTURA MULTIPROTOCOLAR Tipo de paridad 1 0 Significado Paridad impar Paridad par Tabla 4.8: Significado del campo paridad Notificación de evento esporádico - comunica la llegada de un evento esporádico (solo para módulos exteriores de entradas digitales). Estructura de la notificación de presencia Ver figura 4.10 Figura 4.10: Notificación de presencia Estructura de la notificación de respuesta Ver figura 4.11 Figura 4.11: Notificación de respuesta Estructura de la notificación de evento esporádico Ver figura 4.12 Especificación IDENTIFICADOR = identificador de respuesta (caracter ASCII). TIPO = tipo de módulo de salida (número en formato ASCII) No SERIE = no serial de reconocimiento del módulo (caracter ASCII) PARÁMETRO = parámetro del comando (número en formato ASCII). LF = fin de lı́nea (caracter ASCII 10). Identificador Los identificadores se muestran en la tabla 4.9. 94 CAPÍTULO 4. ARQUITECTURA MULTIPROTOCOLAR Figura 4.12: Notificación de evento esporádico Identificador R P E Traducción Respuesta a mensaje del Rabbit Réplica de presencia Aviso de evento esporádico Tabla 4.9: Significado del campo Identificador Tipo Los tipos de módulos que pueden definirse se especifican en la tabla 4.10. Número de serie Es un número caracterı́stico de cada módulo de salida, se representa a través de un caracter ASCII. Parámetro El significado del campo parámetro, se establece por la tabla 4.11. Ejemplo de comunicación 010U00 Rabbit consulta por la existencia de un módulo en el address 1. P3A El módulo exterior 1 notifica su presencia. Tipo 0 1 2 3 Traducción Módulo de salida Ir Módulo de salida RS232 Módulo de salidas digitales Módulo de entradas digitales Tabla 4.10: Significado del campo tipo 95 CAPÍTULO 4. ARQUITECTURA MULTIPROTOCOLAR Parámetro 0 1 2 3 4 Traducción Ejecutar acción número Ejecutar acción número Ejecutar acción número Ejecutar acción número Ejecutar acción número 0 1 2 3 4 Tabla 4.11: Significado del campo Parámetro 010Q00 Rabbit le pregunta si ocurrió un evento esporádico. E4 El módulo exterior 1 notifica que se debe realizar la acción no 5. 151A28 Rabbit le exige al módulo 15 la realización de la acción 28. R El módulo exterior 15 confirma la recepción de la orden. 4.5.3. Capa de acciones La tabla 4.12 define la capa de acciones. Esta capa busca la coherencia entre las acciones realizadas en los diversos módulo exteriores. Un número de acción determinado se corresponde con una labor especı́fica. Por ejemplo: Para hacer funcionar el Power en cualquier módulo exterior Ir habrá que ejecutar la acción no 1. Para utilizar el Vol + en cualquier módulo exterior Ir habrá que ejecutar la acción no 5. Para activar la salida no 3 en cualquier módulo exterior de salidas habrá que ejecutar la acción no 3. Para actuar sobre el puerto serial 1 en un módulo exterior RS232 habrá que ejecutar acciones desde la 1 a la 16. Para trabajar con el puerto serial 2 en un módulo exterior RS232 habrá que ejecutar acciones desde la 17 a la 32. 96 CAPÍTULO 4. ARQUITECTURA MULTIPROTOCOLAR Acción 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 Módulo Ir Sin acción No 1 No 2 No 3 No 4 No 5 No 6 No 7 No 8 No 9 No 0 Power Tv/Av Channel + Channel Vol + Vol Open/Close Play/Pause Stop Track + Track Arriba Abajo Derecha Izquierda Enter Menu Clear Zoom Mute Rew FF Módulo Salidas Sin acción Salida 1 Salida 2 Salida 3 Salida 4 Salida 5 Salida 1,2 Salida 1,3 Salida 1,4 Salida 1,5 Salida 2,3 Salida 2,4 Salidas 2,5 Salidas 3,4 Salidas 3,5 Salidas 4,5 Salidas 1,2,3 Salidas 1,2,4 Salidas 1,2,5 Salidas 1,3,4 Salidas 1,3,5 Salidas 1,4,5 Salidas 2,3,4 Salidas 2,3,5 Salidas 2,4,5 Salidas 3,4,5 Salidas 1,2,3,4 Salidas 1,2,3,5 Salidas 1,2,4,5 Salidas 1,3,4,5 Salidas 2,3,4,5 Salidas 1,2,3,4,5 Sin acción Módulo RS232 Sin acción Accionar puerto serial Accionar puerto serial Accionar puerto serial Accionar puerto serial Accionar puerto serial Accionar puerto serial Accionar puerto serial Accionar puerto serial Accionar puerto serial Accionar puerto serial Accionar puerto serial Accionar puerto serial Accionar puerto serial Accionar puerto serial Accionar puerto serial Accionar puerto serial Accionar puerto serial Accionar puerto serial Accionar puerto serial Accionar puerto serial Accionar puerto serial Accionar puerto serial Accionar puerto serial Accionar puerto serial Accionar puerto serial Accionar puerto serial Accionar puerto serial Accionar puerto serial Accionar puerto serial Accionar puerto serial Accionar puerto serial Accionar puerto serial 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 Tabla 4.12: Capa de Acciones 97 CAPÍTULO 4. ARQUITECTURA MULTIPROTOCOLAR 4.6. Análisis de velocidades y tiempos Establecida la comunicación en 9600 baudios 8N1, se calcularon los tiempos relevantes. Este estudio, intenta argumentar el motivo de elección de un valor especı́fico del tiempo de espera entre intento e intento, para la transmisión de un mensaje. Adicionalmente, se calculan otros tiempos relevantes a la implementación de la solución. La velocidad de transmisión se define como el número de bits transmitidos por segundo al enviar un flujo continuo de datos, calculándose de la siguiente forma: simbolos bits Vt = · seg ssmbolo Como cada baudio (sı́mbolo) está formado por 10 bits (1 bit de start, 8 bits de datos y 1 bit de stop), la Vt = 9600 · 10 = 96kbps Seguidamente, se concluye que el tiempo de bit es de 1 = 10, 417µseg 96kbps Fı́sicamente, el bus formado a través del MAX485 soporta velocidades hasta 250 Kbps, por lo cual la velocidad de transmisión implementada no fue un impedimento. 4.6.1. Tiempo de transferencia del mensaje (Ttm ) Como una trama está compuesta por 8 bytes, el tiempo de transferencia de trama es de 1 · 8 = 833, 33µseg 9600 Para su cálculo práctico, es necesario agregar el delay correspondiente a la ejecución de las rutinas de carga del byte en el buffer de transmisión y su correspondiente envı́o. 4.6.2. Tiempo de transferencia de las notificaciones (Ttn ) El Ttn de cada notificación se calcula multiplicando la cantidad de bytes 1 · k. La (k) de cada trama por el tiempo de transferencia de un byte: Ttn = 9600 tabla 4.13 muestra el Ttn para cada notificación. 98 CAPÍTULO 4. ARQUITECTURA MULTIPROTOCOLAR Notificación De presencia De evento esporádico De respuesta Traducción 4 3 2 Ttn 416,66 µseg. 312,5 µseg. 208,33 µseg. Tabla 4.13: Tiempo de transferencia de las notificaciones Integrado Rp MAX485 90 nseg. MC14001 125 nseg. CD4555 200 nseg. 74HC153 10 nseg. Tabla 4.14: Retardo de propagación de los integrados 4.6.3. Retardo de propagación de los integrados utilizados (Rp ) Los datos escritos en la tabla 4.14, fueron obtenidos de las hojas de datos correspondientes. Ver Anexo D. El uso de estos integrados se encuentra especificado en el capitulo 5. 4.6.4. Tiempo de espera entre intento e intento (Te) Al ser el Te relevante a la respuesta de los módulos exteriores y como la trama más larga de las notificaciones es la de presencia, resulta coherente aguardar un tiempo proporcional α a este tiempo de trama. Por lo tanto, Te = α · (Ttn + σ) siendo σ la sumatoria de todos los retardos de propagación de los integrados implicados. Tomando el caso de pérdida de sincronismo entre tramas (byte LF), y considerando que esperar un número impar de tramas no propagará el error de sincronización, un α = 52 es un tiempo coherente para lograr la comunicación con los módulos exteriores, permitirles el procesamiento del mensaje para que luego envı́en la notificación correspondiente. El σ máximo queda determinado por los módulos exteriores RS232, dado que en éstos, la información que fluye hacia el Rabbit circula por un mayor número de integrados. Se debe considerar el retardo de propagación del 99 CAPÍTULO 4. ARQUITECTURA MULTIPROTOCOLAR MAX485, del CD455 y del MC14001 σmax = (90nseg. + 200nseg. + 125nseg.) · 4bytes = 1, 66µseg. Este valor representa un 0,39 % del tiempo de transferencia de las notificaciones. Por su poca injerencia, fue despreciado. Por lo tanto, Te = 4.6.5. 5 2 · 416, 66µseg = 1, 042mseg. Tiempo máximo del ciclo de consulta del Rabbit (Tcm ) El tiempo del ciclo de consulta del Rabbit se refiere al tiempo que demora el Rabbit en preguntar por la presencia de todos los módulos exteriores. Para su valor máximo, hay que considerar el peor caso: existe un solo módulo exterior presente en el sistema. responde en el tercer intento de consulta, luego de transcurridos (Te Ttm ) segundos. Tcm = (T e − T tm) + 2 · Te + 15 · Te · 3 = 49, 60mseg. 4.6.6. Tiempo de inicialización de los módulos exteriores (Ti) Denota el tiempo mı́nimo que debe aguardar el Rabbit para transmitir un mensaje al módulo 00 (siempre que esté presente), cuando se reinicia el sistema. Se considera el reinicio simultáneo del bloque central y el módulo exterior. Para su medida, se controló el tiempo que tardan los módulos exteriores en estar preparados para la llegada de un byte, una vez reiniciado el sistema. El valor fue obtenido del PIC Simulator IDE, corriendo instrucción por instrucción de cada implementación de código. La demora de cada módulo está especificada en la tabla 4.15. Ti = 991 µseg. Por cuestiones prácticas se estableció en 1mseg. 4.6.7. Tiempo entre envı́o y envı́o de bytes (Tb ) Es el tiempo fijo mı́nimo, entre envı́o y envı́o de byte, que debe esperar el Rabbit para que los módulos exteriores puedan procesar la información y guardarla en las variables correspondientes. También se empleó la herramienta PIC Simulator IDE, constatándose la necesidad de aguardar 350 µseg para realizar las funciones correspondientes. 100 CAPÍTULO 4. ARQUITECTURA MULTIPROTOCOLAR Módulo exterior Demora en inicialización Ir 991 µseg. Salidas digitales 170 µseg. Rs232 165 µseg Entradas digitales 195 µseg. Tabla 4.15: Tiempo de inicialización de los módulos exteriores 4.6.8. Tiempo mı́nimo entre acciones consecutivas al mismo módulo exterior (Tac ) Se define como la demora fija mı́nima que debe aguardar el Rabbit para enviar dos acciones seguidas al mismo módulo exterior. Está definida por la acción más larga, la cual se corresponde con el envió de una trama infrarroja. Considerando la duración de la trama infrarroja, (Ver sección 5.2) un tiempo coherente serı́a 90 mseg. 4.7. Funcionamiento Ésta sección refiere al trabajo del sistema, estableciendo consideraciones y prioridades ante situaciones determinadas. 4.7.1. Ciclo de consulta El Rabbit pregunta por el ID0 hasta el ID15. Cada módulo exterior aguarda la consulta por su ID. Si cumplida la regla de los tres intentos ningún módulo exterior ha respondido, el Rabbit pasará a buscar el siguiente ID. Cada módulo exterior responde con una notificación de presencia. 4.7.2. Acciones del Rabbit El Rabbit envı́a una orden a un módulo exterior especı́fico. Si el mensaje recibido tiene un error de paridad, comparando el valor del campo paridad del mensaje con la paridad calculada, no se responde el mensaje. Si luego de tres intentos se percibe la misma situación, el módulo exterior enciende una señal de alarma diagnosticando una falla (prende un led). 101 CAPÍTULO 4. ARQUITECTURA MULTIPROTOCOLAR Si el valor del campo comando es desconocido, no se responde el mensaje. Si luego de tres intentos se observa el mismo escenario, el módulo exterior enciende una señal de alarma (el mismo led que la circunstancia anterior). Si el mensaje recibido es correcto, el módulo exterior cursa una notificación de respuesta. Si cumplida la regla de los tres intentos el módulo no ha respondido, el Rabbit encenderá una señal de alarma diagnosticando la desconexión momentánea de un módulo en el sistema (un aviso en la página web). 4.7.3. Eventos esporádicos Si existen módulos exteriores de entradas digitales presentes en el sistema, el Rabbit consulta por la aparición de algún evento esporádico. Si el módulo ha detectado la aparición de un evento, envı́a una notificación de evento esporádico. Si el Rabbit continua consultando, vencida la regla de los 3 intentos, éste, enciende una señal de alarma comunicando no haber podido despachar la notificación correspondiente (prende un led). Si el módulo no ha advertido un evento esporádico, no realiza ninguna acción. Si cumplida la regla de los tres intentos, el Rabbit no recibe la notificación correspondiente, determina que no ha llegado ningún evento esporádico. 4.7.4. Consideraciones Seguidamente a un ciclo de consulta, el Rabbit buscará módulos exteriores de entradas digitales para cuestionarlos sobre la llegada de un evento esporádico. Éste proceso se realizará cada tres segundos. Sabido es que el sistema permanecerá la mayor parte del tiempo en un estado de ”standby”(aguardando una acción del servidor o la llegada de un evento esporádico), por lo cual, aguardar tres segundos para realizar un nuevo ciclo de consulta resulta es un tiempo sumamente prudencial. Las acciones que realizan los módulos exteriores se efectúan una vez enviada la notificación de respuesta. Ante la presencia de dos o más módulos exteriores con el mismo address, se decreta la ausencia de esa ID. Para agregar un nuevo módulo exterior al sistema, simplemente se lo debe conectar al bus. 102 CAPÍTULO 4. ARQUITECTURA MULTIPROTOCOLAR Para cambiar el ID de un módulo exterior en pleno funcionamiento del sistema, se debe realizar el cambio y luego resetear el módulo. 4.8. Implementación en la placa Rabbit Tomando como base las pruebas especificadas en el Capı́tulo 3. Sección 5 se comenzó con la programación de la solución. La base de esta implementación es la creación de tres buffers de manejo, a saber: buffer de IDs (ids mod[ ]): contine los IDs activos dentro del sistema buffer de tipos de módulos (tipo mod[ ]): denota los tipos de módulos exteriores presentes. buffer de números de serie (nserie mod[ ]): abarca la identificación de cada módulo. 4.8.1. Universalidad de IDs En cada ciclo de consulta se actualizan los valores de los buffers mencionados anteriormente. El comportamiento del servidor web - dándose un cambio en una estructura .CGI -, genera mensajes hacia los módulos exteriores con comandos de comportamiento. Las acciones están predefinidas ante un cambio en cualquier estructura, es decir, el Rabbit conoce el destinatario (tipo de módulo y número serial) y el contenido del mensaje a enviar, pero no el ID correspondiente. Para entregar el mensaje al módulo correspondiente, recorre los buffers de manejo y establece la ubicación del mismo dentro del sistema. De esta forma, se logra la üniversalidad de IDs”, siendo el ID una variable independiente de la programación del Rabbit. 4.8.2. Procedimiento La programación del modulo central se realizo en Dynamic C según el siguiente procedimiento: • 1. Realiza todas las configuraciones y seteos. • 2. Preguntar por el ID 00. o A. Espera un tiempo Te (Tiempo de espera entre intento e intento) para preguntar otra vez. 103 CAPÍTULO 4. ARQUITECTURA MULTIPROTOCOLAR o B. Si vencida la regla de los tres intentos el ID0 no responde, se decreta la no existencia de ese ID en el sistema. o C. Si el ID envı́a una notificación de respuesta, se actualizan los buffers ids mod[ ], tipo mod[ ] y nserie mod[ ]. • 3. El Rabbit ejecuta un ciclo de consulta completo cada tres segundos. • 4. Seguidamente, verifica en el buffer tipo mod[ ] la existencia de módulos exteriores de entradas digitales. o A. Si existen, envı́a un mensaje consultando por eventos esporádicos. Ante una notificación de evento esporádico, realiza las acciones correspondientes • 5. Solicitando autenticación, de acuerdo a la acción que se solicite al servidor HTTP, se envı́a el mensaje por módulos: o A. Aguarda un tiempo Te o B. Aplica la regla de los 3 intentos y retransmite el mensaje. Si se viola la regla, avisa que el módulo no se encuentre presente en el sistema. o C. Si el módulo responde con una notificación de respuesta, continúa con el envı́o de mensajes hacia otro módulo. Implementación de la página web La página web está programada en lenguaje HTML y se compone de imágenes y texto. Tanto la realización de una acción como el estado de los módulos en el sistema, corresponden a estructuras .CGI: Las acciones especı́ficas se realizan mediante el toggle de los distintos componentes de la web. Éste varı́a entre realizar una acción o detenerla. De acuerdo al estado del buffer ids mod[ ], cada vez que refresca la página, se notifica la presencia de cada módulo en el sistema por el prendido y apagado de un led en su lugar correspondiente. El sistema está configurado para que inicialmente los toggles estén en estado de standby. El código fuente en lenguaje HTML se encuentra publicado en Apéndice D. Código fuente. 104 CAPÍTULO 4. ARQUITECTURA MULTIPROTOCOLAR 4.9. Implementación en los módulos exteriores La solución se implementó programando en lenguaje Assembler en el PIC, utilizando el programa MPLAB IDE. La primer consideración se apoyó en la realización de una plataforma común para todos los módulos, sin excepción. Debe existir un mecanismo general que permita el diálogo entre entidades sin importar el tipo de módulo, la programación no es particular, es global. 4.9.1. Procedimiento La programación de la plataforma general se realizó de acuerdo al siguiente procedimiento: 1. Realizar todas las configuraciones y seteos (consumar un manejador de interrupciones). 2. Determinar el ID del módulo y guardar dicho valor en memoria. 3. Habilitar interrupciones. 4. Aguardar un mensaje del Rabbit. 5. Procesar la información 6. Responder el mensaje. 7. Ejecutar la acción si fuese necesario. 8. Esperar para recibir otro mensaje 1. Realizar todas las configuraciones y seteos Primariamente, se limpian las variables a utilizar (bytes reservados en la memoria RAM). Luego, se setean los distintos bloques del PIC que forman parte de la implementación del protocolo a controlar. Éstos pueden ser: Lectura de la EEPROM y guardado en la RAM Módulo PWM Periférico USART Puertos de E/S 105 CAPÍTULO 4. ARQUITECTURA MULTIPROTOCOLAR Seguidamente, se establece el tipo de módulo exterior y el número de serie que lo identifica. El manejador de interrupciones define la acción a tomar ante la ocurrencia de una determinada interrupción. La única interrupción común a todos los módulos es la interrupción de recepción de la USART. 2. Determinar el ID del módulo y guardar dicho valor en memoria Se busca el valor de los primeros bits del puerto A y se realiza la conversión ASCII correspondiente, guardando las decenas y las unidades del ID en forma separada. 3. Habilitar interrupciones De acuerdo al tipo de módulo se habilitan las interrupciones pertinentes. Es obligación habilitar la interrupción GIE para disponer del resto. La interrupción de recepción de la USART es común a todos los módulos. 4. Aguardar un mensaje del Rabbit A medida que se genera una interrupción de recepción de la USART, se guarda cada byte en un variable distinta. Este mecanismo se detiene ante la llegada de un caracter ASCII 10. 5. Procesar la información Aquı́ se realiza otro nuevo procedimiento a saber: Deshabilitar la interrupción de recepción de la USART. Fijarse si el mensaje corresponde a ese módulo, de lo contrario vuelve a esperar por un nuevo mensaje. Determinar si el comando recibido es correcto, si es erróneo vuelve a esperar por un nuevo mensaje. Verificar violación de intentos, si se supera la cantidad de intentos (observando el campo intentos del mensaje) se activa la alarma correspondiente. Cotejar y calcular la paridad, si existe una diferencia, se vuelve a esperar por un nuevo mensaje. Decidir Respuesta, de acuerdo al comando recibido se decide la notificación. 106 CAPÍTULO 4. ARQUITECTURA MULTIPROTOCOLAR 6. Responder el mensaje Se envı́a la notificación correspondiente. 7. Ejecutar la acción si fuese necesario Se verifica el campo parámetro del mensaje y de acuerdo a su valor, se realiza la acción correspondiente. Al finalizar la acción, se vuelve a habilitar la interrupción de recepción de la USART. 8. Esperar para recibir otro mensaje Aguarda un nuevo mensaje del Rabbit y reitera el proceso. 4.9.2. Aspectos a considerar La sincronización entre el Rabbit y el módulo exterior se realiza por medio del caracter ASCII 10. Se habilita la recepción interruptiva de la USART cada vez que se termina de ejecutar una acción o bien un módulo exterior de entradas digitales notifica un evento esporádico. Puede ocurrir, que al estar ejecutando una determinada acción, un módulo pierda parte del mensaje que envió el Rabbit o un mensaje entero. No resulta un inconveniente, ya que Rabbit retransmite hasta un máximo de 3 intentos. El Tac asegura que no se perderán tramas entre mensajes consecutivos a un mismo módulo exterior. Al utilizarse un bus como el medio compartido por el cual se realiza la comunicación entre las entidades, cada vez que los módulos exteriores participan de la comunicación, reciben una copia de la información enviada. Se utiliza un nuevo pin de control en cada PIC para lograr que un mismo módulo no reciba la información que vierte al medio compartido (se lleva el MAX485 a un estado de alta impedancia). Un módulo exterior- recibe también - un duplicado de la notificación que envió otro módulo al sistema, por lo cual cuando un PIC recibe una notificación cualquiera ignora dicha información y queda a la espera de un mensaje del Rabbit. 4.9.3. Pines de utilización genérica La utilización de esta plataforma genérica derivó en la utilización de pines comunes en los PIC, permitiendo que todas las subrutinas generales controlen 107 CAPÍTULO 4. ARQUITECTURA MULTIPROTOCOLAR las mismas consideraciones en cada puerto. Estos pines, están especificados claramente en la sección 5.4. 4.9.4. Archivos base Los siguientes, son los archivos especı́ficos de cada módulo. La plataforma general está programada dentro de cada uno: mod ir.asm - programa para el módulo exterior Ir. mod rs232.asm - programa para el módulo exterior RS232. mod in.asm - programa para el módulo exterior de entradas digitales. mod out.asm - programa para el módulo exterior de salidas digitales. El código fuente de cada archivo se encuentra publicado en el Anexo C 4.9.5. Programación en el PIC La herramienta de programación utilizada fue el Easy ICD2. Es un hardware compatible con el MPLAB IDE que consta de dos partes: La primera provee la interfaz hacia el PC, permitiendo la comunicación y programación. La segunda es la interfaz de conexión con el PIC. La figura 4.13 es una fotografı́a de ésta herramienta de hardware. Figura 4.13: Easy ICD2 108 CAPÍTULO 4. ARQUITECTURA MULTIPROTOCOLAR 4.10. Solución no implementada Tomando las mismas consideraciones de capa fı́sica y capa de acciones, primariamente, se consideró la implementación de una solución basada en multimasters (un módulo exterior de entradas digitales pudiendo funcionar como un cuasi-maestro). El Rabbit oficiarı́a de maestro para el resto de los módulos y un cuasi-esclavo, en determinados momentos, para los módulos de entradas digitales. El prefijo cuasi, refiere que no se cumplirı́a la totalidad de la función, sino la gran mayorı́a: los módulos interrumpirı́an la actividad del Rabbit para notificarle de un evento esporádico, pero no comandarı́an otros módulos. Éstos, volverı́an a su función de esclavo cuando el Rabbit les confirmara la recepción de dicho evento. Diseñando de ésta forma, se producirı́an colisiones. El manejo de las mismas estarı́a resuelto en la capa de conexión. Éstas colisiones se darı́an en los siguientes casos: El Rabbit enviase un mensaje y un módulo exterior de entradas notificase un evento esporádico. Un módulo exterior cualquiera transmitiese una notificación de presencia o respuesta, y un módulo exterior de entradas notificase un evento esporádico. El Rabbit enviase un mensaje y un módulo exterior remitiese una notificación de presencia. Para resolver las colisiones se pensó una solución basada en intentos con probabilidad. Obteniendo números randómicos, se determinarı́a el permiso de transmisión para cada entidad según una probabilidad que variarı́a en cada intento: 1er intento - probabilidad 100 % 2do intento - probabilidad 50 % 3er intento - probabilidad 25 % 4to intento - probabilidad 12,5 % 5to intento - probabilidad 6,25 % Ésta medida eliminarı́a las temporizaciones fijas y solucionarı́a la transmisión de mensajes y notificaciones, de una manera estadı́stica. Se pasarı́a de intento a intento cada vez que: 109 CAPÍTULO 4. ARQUITECTURA MULTIPROTOCOLAR El Rabbit no recibiese una notificación de respuesta o presencia. El módulo exterior de entradas digitales no recogiese una confirmación del Rabbit. Un módulo exterior cualquiera recibiese un mensaje con el número de intento mayor al anterior. Un módulo exterior cualquiera no recibiese una confirmación del Rabbit ante un envió de notificación de presencia. 4.10.1. Principio de funcionamiento El principio de funcionamiento ahondarı́a en lo siguiente: Inicialización del bus Mediante consulta del Rabbit: El Rabbit preguntarı́a por el ID1 hasta el ID16. Cada módulo exterior aguardarı́a que le consulten por su ID. Si cumplida la regla de los cinco intentos ningún módulo exterior hubiese respondido, el Rabbit pasarı́a a buscar el siguiente ID. Cada módulo exterior responderı́a con una notificación de presencia. El Rabbit ratificarı́a la presencia del módulo exterior con un mensaje de confirmación. Mediante identificación propia de los módulos exteriores: Cada módulo exterior envı́arı́a una notificación de presencia al inicializar. El Rabbit certificarı́a la presencia del módulo exterior por medio de un mensaje de confirmación. Si cumplida la regla de los cinco intentos el módulo exterior no recibiese confirmación, permanecerı́a en espera hasta que el Rabbit consultase por su ID. 110 CAPÍTULO 4. ARQUITECTURA MULTIPROTOCOLAR Acciones del Rabbit El Rabbit enviarı́a mensajes con una determinada ID para un módulo exterior especı́fico: • Si el mensaje recibido tuviese un error de paridad (habiendo comparado la paridad enviada con la calculada) o el comando recibido fuese desconocido, los módulos exteriores no transmitirı́an una notificación de respuesta. Si luego de 5 intentos, el mensaje continuase siendo erróneo, el módulo exterior encenderı́a una señal de alarma diagnosticando una falla (prenderı́a un led). • Si el mensaje recibido fuese correcto, el módulo exterior cursarı́a una notificación de respuesta. o Si el módulo exterior volviese a recibir el mismo mensaje del Rabbit con número de intento mayor, despacharı́a nuevamente una notificación de respuesta. • Si cumplida la regla de los cinco intentos el módulo no hubiese respondido, el Rabbit prenderı́a una señal de alarma diagnosticando la desconexión de un módulo. Eventos esporádicos Un módulo exterior de entradas advierte al Rabbit de la aparición de un evento esporádico mediante una notificación. El Rabbit responde con un mensaje de confirmación. El Rabbit envı́a un mensaje de acción para el módulo exterior especı́fico y continua con el proceso de acciones del Rabbit. Si cumplida la regla de los cinco intentos con el módulo exterior de entradas no ha recibido un mensaje de confirmación, enciende una señal de alarma diagnosticando que no pudo notificar del evento esporádico. Observaciones Los envı́os de mensajes y notificaciones se efectuarı́an bajo la regla de los cinco intentos con probabilidad. Las acciones de los módulos exteriores se realizarı́an una vez que éstos hubiesen enviado la respuesta correspondiente. 111 CAPÍTULO 4. ARQUITECTURA MULTIPROTOCOLAR 4.10.2. Cálculo de probabilidad Se implementarı́a el calculo de probabilidad en el Rabbit mediante la función random() del lenguaje C. Estableciéndole condiciones de desigualdades a ese número randómico, se podrı́a dirigir la transmisión entre intento e intento. La implementación en el PIC consistirı́a en lo siguiente: Se deberı́a configurar el Timer 1 para su constante ejecución, el número randómico se obtendrı́a mediante una muestra de su valor. Realizando una simple regla de tres, se convertirı́a ese valor hexadecimal en un número proporcional a 100 (considerando 100 como probabilidad ”1”). Hacer todas las configuraciones y seteos. • Fijarse que ID son y guardarlo en memoria. • Habilitar interrupciones (recepción de la USART). • Enviar una notificación de presencia al rabbit. • Esperar a recibir el mensaje de confirmación del Rabbit. • Aplicar la probabilidad • Esperar a recibir un mensaje del rabbit. • Fijarse si el mensaje corresponde a ese módulo exterior. • Fijarse si el comando que llegó es correcto. • Calcular la paridad del mensaje y verificar intento • Responder el mensaje. • 2 opciones: o Ejecutar la acción si fuese necesario. o Prender led si se violó la regla de los cinco intentos. • Esperar para recibir otro mensaje. 112 CAPÍTULO 4. ARQUITECTURA MULTIPROTOCOLAR 4.10.3. Inconveniente A pesar que el protocolo RS485 permite una comunicación full duplex, el bus formado por el MAX485 no puede implementarla. Solo funciona en modo half - duplex, por lo cual las colisiones no solo afectarı́an la capa de conexión, sino también, la capa fı́sica - pudiéndose generar cortocircuitos en los pines de transmisión y recepción del MAX485 -. La solución al inconveniente serı́a desplegar una lógica de hardware capaz de establecer la conexión en modo full - duplex. Se necesitarı́a emplear 2 lı́neas de transmisión, una para el envı́o de mensajes y otra para el envı́o de notificaciones. Siempre, se tomó como requisito de diseño el empleo del chip MAX485, por lo cual emular la lı́nea de transmisión para las notificaciones llevarı́a a la misma deficiencia descrita anteriormente. Tener múltiples transmisores resultarı́a imposible, razón atribuida a las limitaciones del MAX485. Ergo, se decidió rehacer la solución por medio de una arquitectura maestro esclavo fija. El Rabbit cede el privilegio de transmisión cada vez que envı́a un mensaje. De este modo, la transmisión se hace más eficiente y no se necesitan 5 intentos para transmitir. Cabe destacar que existen implementaciones con chips MAX1480, que solucionan este inconveniente, como se puede ver en [AN2116, 1983]. Éstos no están disponibles en la plaza uruguaya. 4.11. Referencias [AN723, 1983] MAXIM, Dallas Semiconductor. 1997.Selecting and Using RS-232, RS-422, and RS-485 Serial Data Standards. Application Note AN723 [online] [citado 29 Diciembre 2000]. Disponible en Internet: <http://pdfserv.maxim-ic.com/en/an/AN723.pdf> [AN2116, 1983] MAXIM, Dallas Semiconductor. 1997.RS-485 Data Interface Gives Isolated, Full-Duplex Operation. Application Note AN723 [online] [citado 9 Julio 1998]. Disponible en Internet: <http://pdfserv.maximic.com/en/an/AN2116.pdf> [CEBus, 1999] CEBus. 1999.CEBus .[online] Disponible en Internet: <http://www.casadomo.com/noticiasDetalle.aspx? c=19&m=164&idm=26&pat=148&n2=148> [EHS, 1990] EHS. 1990.ehs .[online] Disponible en Internet: <http://www.tecnociencia.es/monograficos/gestion domotica hogar/sistemaehs.html> 113 CAPÍTULO 4. ARQUITECTURA MULTIPROTOCOLAR [EIB, 2006] EIB. 2006.EIB .[online] Disponible en Internet: <http://odisea.ii.uam.es/esp/recursos/bus eib.htm> [ESAcademy1, 2000] ESAcademy. 2000.The I2C Bus Hardware Structure .[online] Disponible en Internet: <http://www.esacademy.com/faq/i2c/ general/i2chardw.htm> [ESAcademy2, 2000] ESAcademy. 2000.The I2C Bus Protocol .[online] Disponible en Internet: <http://www.esacademy.com/faq/i2c/general/ i2cproto.htm> [ICS, 2007] Interfacebus. 1978.GPIB 101 - A TUTORIAL ABOUT THE GPIB BUS .[online] Disponible en Internet: <http://www.icselect.com/ pdfs/ab48 11.pdf> [Interfacebus, 2006] Interfacebus. 1998.GPIB Bus .[online] Disponible en Internet: <http://www.interfacebus.com/Design Connector GPIB.html> [LonWorks, 2006] LonWork. 2006.lonworks .[online] Disponible en Internet: <http://odisea.ii.uam.es/esp/recursos/Lonwork.htm> [Monografias, 2007] Sinexi S.A. 1997.Normas ANSI. ISO. IEEE para cableado UTP .[online] Disponible en Internet: <http://www.monografias.com/trabajos11/utp/utp.shtml> [RS485, 2007] RS485.com. 2007. QUICK REFERENCE FOR RS485, RS422, RS232 AND RS423 .[online] Disponible en Internet: <http://www.rs485.com/rs485spec.html> [SCP, 1999] SCP. 1999.SCP .[online] Disponible en Internet: <http://www.casadomo.com/noticiasDetalle.aspx?c=21&m=164&idm =28&pat=148&n2=148> [Tech Soft, 2007] Tech Soft. 1997.HTBasic GPIB Tutorial .[online] Disponible en Internet: <http://www.techsoft.de/htbasic/tutgpibm.htm?tutgpib.htm> [tyco Electronics, 2002] Crompton. 2002.RS485 & Modbus Protocol Guide .[online] Disponible en Internet: <http://www.crompton-instruments.com/ rs485.pdf> [Wikipedia6, 2007] WIKIPEDIA. 2007.Daisy chain .[online] Disponible en Internet: <http://en.wikipedia.org/wiki/Daisy chain> [Wikipedia7, 2007] WIKIPEDIA. 2007.Category 5 cable .[online] Disponible en Internet: <http://en.wikipedia.org/wiki/Category 5 cable> 114 Capı́tulo 5 Módulos exteriores 5.1. Introducción Diseñar hardware es más restrictivo que hacerlo en software, solamente, puede utilizarse una combinación de componentes ya desarrollados: circuitos integrados, microcontroladores, resistencias, etc. Un componente no disponible en las cantidades necesarias, puede arruinar la solución. La comunidad del software (acostumbrada a una mayor flexibilidad y habilidad para modificar diseños y producir infinitas copias), encuentra este concepto difı́cil de asimilar. Como contrapartida, los componentes electrónicos han evolucionando a través del tiempo. Dı́a a dı́a, son mas pequeños y complejos. Los circuitos integrados ofrecen cada vez mayor velocidad y confiabilidad. Las pautas de diseño deben estar bien definidas, ya que constantemente pueden agregarse nuevas funcionalidades a un sistema, controlando su implementación para no entorpecer los objetivos iniciales. Los módulos exteriores manejan, controlan y permiten el funcionamiento de un único protocolo. Este capı́tulo, ahonda sobre el diseño del hardware utilizado - indicando conexiones y señales necesarias para el funcionamiento de los mismos - y la programación del microcontrolador elegido para convertirse en el çerebro”de los diversos módulos. El marco teórico establece las restricciones necesarias para la implementación de la solución y el manejo de cada protocolo. 115 CAPÍTULO 5. MÓDULOS EXTERIORES 5.2. 5.2.1. Marco teórico Protocolo Ir Por muchos años, la industria del consumidor de la electrónica ha estado desarrollando controles remotos infrarrojos para el manejo de televisores, videograbadores, etc. Si bien, el protocolo IrDA fue estandarizado en 1993 y - según [Millar, 1998] - se aplica para comunicaciones infrarrojas de corto alcance (hasta 1.5 metros), el protocolo empleado por controles remotos no es genérico ni está estandarizado. Las siguientes escrituras fueron realizadas en base a [Davshomepage, 2006], [Tonks, 2007], [UST, 2006] y [UCAR, 2005]. Teorı́a de la luz infrarroja El infrarrojo es una radiación de energı́a con una frecuencia por debajo de la sensibilidad de nuestros ojos. La luz infrarroja es un tipo de radiación electromagnética con mayor longitud de onda que la luz visible y menor que la de las microondas. Su longitud de onda, entre 0,75 micrómetros y un milı́metro, es la siguiente en longitud al rojo. El espectro infrarrojo se puede subdividir en infrarrojo lejano (1 mm a 10 µm longitud de onda), infrarrojo medio (10 a 2.5 µm longitud de onda), e infrarrojo cercano (2,5 a 0,75 µm longitud de onda). La figura 5.1 muestra ésta aseveración. Figura 5.1: Espectro electromagnético Infrarrojo en electrónica El infrarrojo, al ser fácil y barato de generar - y no sufrir interferencia electromagnética -, se utiliza para comunicación y control. No es perfecto ya que 116 CAPÍTULO 5. MÓDULOS EXTERIORES otras luces pueden contener emisiones infrarrojas e interferir con la comunicación. Para permitir una buena comunicación y evitar esas señales “falsas”, es imprescindible utilizar una “clave” mediante la cual el receptor reconozca los verdaderos datos transmitidos. Ésta, es la modulación. Se hace parpadear la luz infrarroja a una determinada frecuencia, coherentemente con el receptor infrarrojo, para que éste ignore los datos falsos. Caracterı́sticas La tı́pica señal infrarroja utilizada por controles remotos está formada por tres capas: el infrarrojo, la modulación y los datos. La capa infrarroja es el medio de transmisión, la luz infrarroja. Generalmente, la capa de modulación modula la luz infrarroja a una frecuencia entre 32,5 KHz y 56,8 KHz. Ésta capa es opcional porque algunos controles remotos no modulan la salida con el objetivo de ampliar la duración de la baterı́a del control y disminuir su costo. La capa de datos lleva la información conteniendo el comando. Para incrementar la distancia entre el emisor y el receptor, la corriente que circula por el led emisor debe ser lo más alta posible. Debe existir una relación de equilibrio entre las propiedades del led, la duración de la baterı́a - si es que hubiese - y la distancia máxima del control remoto. Propiedades de la codificación Por el hecho de no ser un protocolo estandarizado, varias compañı́as diseñaron su propia codificación para sus equipos. Debajo se detallan las especificaciones de las codificaciones estudiadas. 1. Código Philips RC-5 El código utiliza modulación Manchester con una frecuencia portadora de 36 KHz. Todos los bits tienen el mismo largo: 1,778 mseg, donde la mitad del tiempo de bit se llena con la portadora y la otra mitad no se envı́an datos. Se denominan “marca “espacio”, respectivamente. 2 Un “1”lógico se representa con la segunda mitad del tiempo de bit con marca y un “0”lógico con la primer mitad del tiempo de bit con marca. Ésto se expresa gráficamente en la figura 5.2. Como se ve en la figura 5.3, se emplean 14 bits para el mensaje con una 117 CAPÍTULO 5. MÓDULOS EXTERIORES Figura 5.2: Representacion “1”lógico en código Philips RC-5 duración de 25 mseg. Estos son: los primeros 2 bits corresponden a los bits de comienzo. el tercer bit es un bit de toggle, se invierte cada vez que se suelta y se vuelve a presionar un botón. los siguientes 5 bits corresponden a la dirección del equipo infrarrojo. los últimos 6 bits brindan información del comando en sı́. Para los campos dirección y comando se envı́a primero el MSB y al final el LSB. Figura 5.3: Código Philips RC-5 Philips confeccionó una lista estándar que mapea equipos con direcciones y comandos para asegurar la compatibilidad entre equipos de la misma marca. Ver Anexo D. 2. Código Philips RC-6 Es el sucesor del RC-5. Se modula igual que el código RC-5, pero el ciclo de trabajo debe estar comprendido entre 25 % y 50 %. La unidad de sincronización 118 CAPÍTULO 5. MÓDULOS EXTERIORES es 1t, que es 16 veces el perı́odo de la portadora: ( 1 ) · 16 = 444µseg. 36Khz La figura 5.4 muestra la duración del pulso inicial, el cual tiene un tiempo de marca de 6t (2,666 mseg.) y un tiempo de espacio de 2t (0,889 mseg.). Figura 5.4: Pulso inicial código Philips RC-6 La figura 5.5 denota la duración del pulso de cola, un tiempo de marca de 2t (0,889 mseg.) y un tiempo de espacio de 2t (0,889 mseg.) Figura 5.5: Pulso de cola código Philips RC-6 El comando es una concatenación de informaciones dispares como se ve en la figura 5.6 Figura 5.6: Comando RC-6 La cabecera tiene tres componentes distintos: El pulso inicial (LS) se utiliza normalmente para setear la ganancia del equipo receptor. El bit de inicio (SB) debe ser “1 se emplea para sincronizar al receptor. 2 Los bits mb2..mb0 transmiten el modo de operación. 119 CAPÍTULO 5. MÓDULOS EXTERIORES TR es el bit de cola y le permite distinguir al receptor entre un nuevo comando o un comando repetido. El campo Control está formado por 8 bits que se utilizan como dirección. Pueden controlarse hasta 256 equipos utilizando ésta codificación. El byte de Información representa al comando. Cada equipo puede tener asignado un máximo de 256 comandos. El tiempo sin señal es un perı́odo donde no deben transmitirse datos y se utiliza para notificarle al receptor la terminación del último mensaje. Evita repeticiones incorrectas. Esta duración es de 6t (2,666 mseg.). 3. Código JVC Utiliza la modulación por largo de pulso a una frecuencia portadora de 38 KHz. Cada pulso tiene una duración de 256 µseg. Como muestra la figura 5.6, Un “1”lógico demora 2,10 mseg. en transmitirse, un “0”lógico tiene una duración de 1,05 mseg. Figura 5.7: Comando RC-6 Como se ve en la figura 5.8, el mensaje comienza con una cabecera de 9,5 mseg y luego un espacio de 4,0 mseg. Luego se envı́a la dirección y el comando. Para este código el LSB se transmite antes que el MSB. Cuando se mantiene apretado un botón, sólo en el primer comando se transmite la cabecera. Las repeticiones se realizan cada 50-60 mseg. Figura 5.8: Codigo JVC 4. Código NEC Utiliza la modulación por largo de pulso a una frecuencia portadora de 40 KHz. Cada pulso tiene una duración de 550 µseg. Como se observa en la figura 120 CAPÍTULO 5. MÓDULOS EXTERIORES Figura 5.9: Codigo NEC 5.9, un “1”lógico demora 2,25 mseg. en transmitirse y un “0”lógico tiene una duración de 1,12 mseg. Como se divisa en la figura 5.10, el mensaje comienza con una cabecera de 9 mseg. (para setear la ganancia del receptor), seguido por un espacio de 4,5 mseg. Luego se envı́an 32 bits divididos en 4 grupos de 8 bits que representan dirección, complemento de la dirección, comando y complemento del mismo, respectivamente. Se utiliza el complemento para comprobar la integridad del mensaje. En todos los casos el LSB se envı́a antes que el MSB. Cuando se mantiene apretado un botón, sólo se envı́a el comando la primera vez. A su vez, se transmite un código de repetición cada 110 mseg. que está formado por una cabecera de 9 mseg. y un espacio de 2,25 mseg. Figura 5.10: Codigo NEC 5. Código RCA Utiliza la modulación por largo de pulso a una frecuencia portadora de 56 KHz. Cada pulso tiene una duración de 500 µseg. Como se vislumbra en la figura 5.11, un “1”lógico demora 2,5 mseg. en transmitirse, un “0”lógico tiene una duración de 1,5 mseg. Como se contempla en la figura 5.12, el mensaje comienza con una cabecera de 4 mseg., seguido por un espacio de 4 mseg. Luego se envı́an 24 bits divididos en 4 grupos, siendo el primero y el tercero de 4 bits y los restantes de 8 bits. Representan dirección, comando, complemento de la dirección y complemento del comando, respectivamente. Se utiliza el complemento para comprobar la integridad del mensaje. En todos los casos el MSB se envı́a antes que el LSB. Cuando se mantiene apretado un botón, se repite el mensaje cada 64 mseg. 121 CAPÍTULO 5. MÓDULOS EXTERIORES Figura 5.11: Codigo RCA Figura 5.12: Codigo RCA 6. Código Daewoo Utiliza la modulación por largo de pulso a una frecuencia portadora de 38 KHz. Cada pulso tiene una duración de 550 µseg. Un “1”lógico demora 2 mseg. en transmitirse, un “0”lógico tiene una duración de 1 mseg. Como se ve en la figura 5.13, el mensaje comienza con una cabecera de 8 mseg., seguido por un espacio de 4 mseg. Luego, se transmiten 7 bits correspondientes a la dirección. A continuación le sigue una cabecera de 550 µseg. seguida por un espacio de 4 mseg. Después, se envı́an 7 bits del comando y como stop bit, una nueva cabecera igual a la cabecera que separa la dirección del comando. En todos los casos el LSB se envı́a antes que el MSB. Cuando se mantiene apretado un botón, se repite el mensaje cada 60 mseg. Figura 5.13: Codigo Daewoo 7. Código Panasonic Utiliza la modulación por largo de pulso a una frecuencia portadora de 38 KHz. Un “1”lógico demora 3,7 mseg. en transmitirse, un “0”lógico tiene una duración de 1,8 mseg. 122 CAPÍTULO 5. MÓDULOS EXTERIORES Como se muestra en la figura 5.14, el mensaje comienza con una cabecera y un espacio. Luego se envı́an 5 bits correspondientes a la dirección y 6 bits correspondientes al comando. A continuación le sigue el complemento de la dirección y del comando. El stop bit es un “1”lógico. Figura 5.14: Codigo Panasonic 8. Código Sony Utiliza la modulación por largo de pulso a una frecuencia portadora de 40 KHz. Como se observa en la figura 5.15, un “1”lógico demora 1,2 mseg. en transmitirse, un “0”lógico tiene una duración de 0,6 mseg. Figura 5.15: Codigo Sony Como se percibe en la figura 5.16, el mensaje comienza con una cabecera de 2,4 mseg., seguido por 7 bits del comando y 5 bits de la dirección. En todos los casos el LSB se envı́a antes que el MSB. Cuando se mantiene apretado un botón, se repite el mensaje cada 45 mseg. Figura 5.16: Codigo Sony 5.2.2. Protocolo RS232 Es un estándar desarrollado en los años 60 por la EIA, conjuntamente con los laboratorios Bell y los fabricantes de equipos, con la finalidad inicial de 123 CAPÍTULO 5. MÓDULOS EXTERIORES intercomunicar un equipo terminal de datos (DTE) y un equipo de comunicación de datos (DCE), empleando un intercambio de datos binarios en forma serial. Desde su incursión, se introdujeron tres modificaciones, la más reciente la EIA-RS232-F en 1997. El estándar define caracterı́sticas de la señal eléctrica, caracterı́sticas mecánicas de la conexión, descripción funcional de los circuitos de intercambio y secuencia de procedimientos. Ésta investigación se realizó en base a [UAB, 2005],[Strangio, 2006] y [ZyTrax, 2007]. Caracterı́sticas de la señal eléctrica La interfaz emplea conexiones eléctricas no balanceadas - el nivel de señal es relativo a la tierra de señal -, son más susceptibles al ruido y emplean velocidades menores a las conexiones balanceadas - un par de hilos por señal, no referido a tierra - (Ver 4.2.6). Es una interfaz de bajo voltaje que opera entre -15 V. y +15 V. donde: Voltajes entre - 3 V. y - 15 V. corresponden a un “1”lógico. Voltajes entre + 3 V. y + 15 V. corresponden a un “0”lógico. Voltajes entre - 3 V. y + 3 V. corresponden a una región de transición o seguridad. La región de transición funciona como un margen donde no se define un estado lógico ya que los cables pueden estar sometidos a ruidos e interferencias eléctricas. Pueden llevar a transiciones de estado no deseadas, y si aumenta la velocidad de transmisión la señal se vuelve susceptible a pérdidas de voltaje por efecto de las altas frecuencias - motivadas por la resistencia, inductancia y capacidad del cable como lı́nea de transmisión -. Éstas, aumentan con la longitud del cable. El ancho de la región de seguridad determina el margen de ruidos y limita directamente la velocidad máxima de transmisión de datos sin pérdidas. Caracterı́sticas mecánicas de la conexión Establece que el DCE dispondrá de un conector hembra y el DTE de un conector macho donde se especifican números de identificación para cada pin. El tipo y medidas de los conectores son establecidos por la ISO (International Standars Organization). Los conectores más utilizados son los de nueve pines (DB-9) y veinticinco pines (DB-25) - ver figura 5.17-. 124 CAPÍTULO 5. MÓDULOS EXTERIORES Figura 5.17: Conectores DB9 y DB25 DB-25 2 3 4 5 6 7 8 20 22 24 DB-9 RJ-45 3 6 2 5 7 8 8 7 6 1 5 4 1 2 4 3 9 1 - Nombre TxD RxD RTS CTS DSR GND CD DTR RI RTxC Función Transmisión de datos (out) Recepción de datos (in) Pedido de envı́o (out) Dispuesto a enviar (in) Dispositivo de datos listo (in) Común (ground) Detección de portadora (in) Terminal de datos lista (out) Indicador de llamada (in) Reloj de transmisión/recepción (out) Tabla 5.1: Funciones de los pines de los distintos conectores Caracterı́sticas funcionales de la conexión El RS232 es una interfaz serie, lo que implica entrega de información en forma secuencial, bit por bit. En la Tabla 5.1 se especifica la función de cada pin en los distintos conectores. Existe un juego secundario de señales que incluyen las señales de control. Son utilizadas para enviar información de configuración al extremo remoto, solicitar retransmisiones y funciones de control. Con el fin de asegurar la fiabilidad del medio, tı́picamente trabajan a velocidades muy bajas. Pin 13 - Secondary Clear to Send (SCTS) Pin 14 - Secondary Transmitted Data (STxD) Pin 16 - Secondary Received Data (SRxD) Pin 19 - Secondary Request to Send (SRTS) 125 CAPÍTULO 5. MÓDULOS EXTERIORES Las señales en un DTE y un DCE deben tener el mismo nombre, aunque el pin 2 del DTE “transmita” y el pin 2 del DCE “reciba”, ambas señales son Transmit Data. Secuencia de procedimientos Su funcionamiento puede ser sincrónico como ası́ncrono. Transmisión sı́ncrona Se requieren señales de timming. Los pines 15, 17 y 24 se utilizan únicamente en modo sincrónico. Transmisión ası́ncrona No Parity (sin paridad) - No se transmite bit de paridad. Even Parity (paridad “par”) - El bit de paridad es uno (1) si el caracter lleva un cantidad par de unos. Odd Parity (paridad “impar”) - El bit de paridad es uno (1) si el caracter lleva una cantidad impar de unos. Mark Parity (paridad de “marca”) - El bit de paridad siempre es uno. Space Parity (paridad de “espacio”) - El bit de paridad siempre es cero. El estándar no establece como representar caracteres (7 u 8 bits es la forma más común, pero podrı́an ser 5 o 6). Cuando no se envı́an datos la señal se debe mantener en estado de marca. La siguiente figura 5.18 la transmisión asincónica de un sı́mbolo correspondiente al caracter ASCII A. El control de flujo puede realizarse por hardware (RTS/CTS) o sofware (Xon/Xoff). Por Software: El caracter Xoff (ASCII 19) es utilizado por el receptor para indicar que su buffer está lleno y el emisor debe esperar. Cuando vuelva a tener espacio en el buffer, enviará el caracter Xon (ASCII 17), informando que puede volver a trasmitir. Esto economiza cables en la interconexión, pero ocupa espacio en el canal. En la figura 5.19 se muestra el método de funcionamiento. 126 CAPÍTULO 5. MÓDULOS EXTERIORES Figura 5.18: Transmisión asincónica de un sı́mbolo correspondiente al caracter ASCII A Por Hardware: Requiere la conexión de dos hilos entre dispositivos: RTS y CTS. Cuando el buffer del receptor se llena le avisa al transmisor que espere, desactivando la señal CTS. Cuando vuelva a tener espacio en el buffer, activará nuevamente el CTS para decir que está listo. Tiempos Para las señales de control el tiempo de transición por la región de seguridad debe ser menor a 1 mseg. Para las señales de datos y reloj, el tiempo de transición por la región de seguridad deben ser: menores a 1 mseg. para señales con perı́odos mayores a 25 mseg. 4 % del perı́odo para señales con perı́odo entre 125 microseg. y 25 mseg. menores a 5 µseg. para señales con perı́odo menor a 125 µseg. Inconvenientes y problemas Funcionamiento incorrecto de comunicación (DTE-DCE) para el cable en uso, dado por la inversión de las lı́neas de transmisión, recepción y handshaking. Tipo de conexión incorrecta por error de género o por configuración de pines. No se pueden lograr velocidades de transmisión mayores a 64 kbps por la modalidad de trabajo no balanceada. 127 CAPÍTULO 5. MÓDULOS EXTERIORES Figura 5.19: Control de flujo Puede comunicarse con un solo dispositivo por conexión. 5.2.3. Amplificación en clase A En esta operación, el amplificador reproduce totalmente la señal de entrada. La corriente de colector es distinta de cero todo el tiempo, y en general el transistor de salida se polariza en el punto central de la recta de carga, de forma tal de obtener la máxima excursión simétrica. En la figura 5.20 se ilustran las curvas caracterı́sticas tı́picas de esta operación ante una señal senoidal. Figura 5.20: Amplificador clase A La corriente de polarización ICQ está dada por la ecuación: ICQ = −( 1 Vcc ) · Vce + Rc Rc 128 CAPÍTULO 5. MÓDULOS EXTERIORES Si en la base del transistor se aplica una entra de pequeña señal, la alteración de la corriente de base producirá una variación en la corriente de colector. Polarizando el transistor en la zona activa, la variación del punto de operación sobre la recta de carga al variar IC , produce una tensión de salida amplificada. La corriente de colector está dada por la ecuación: IC = β · Ib. 5.3. El PIC 16F628A El PIC 16F628A es un microprocesador de propósito general versátil y económico. Pertenece a la popular familia de microprocesadores PICmicro de la empresa norteamericana Microchip cuya sede se ubica en Chandler, Arizona (Estados Unidos). Sus tres caracterı́sticas más importantes son: Procesador tipo RISC Procesador segmentado Arquitectura HARVARD Es capaz de ejecutar instrucciones en un ciclo de instrucción. Con la estructura segmentada se puede ejecutar una instrucción y buscar las siguiente. La separación de los dos tipos de memoria (datos e instrucciones) es la base de la arquitectura Harvard, esto permite acceder en forma simultánea e independiente a ambos tipos. El tamaño de los datos es de un byte, mientras que el de las instrucciones es de 14 bits. 5.3.1. Propiedades Conjunto reducido de 35 instrucciones RISC. Oscilador interno de 4 MHz (si se utiliza este clock, el ciclo de máquina es de 1 µseg.). Frecuencia máxima de reloj externo de 20 MHz (ciclo de máquina de 200 ns). Las instrucciones se ejecutan en un sólo ciclo de máquina (goto y call requieren 2 ciclos). Memoria de programa: 2048 palabras. 129 CAPÍTULO 5. MÓDULOS EXTERIORES Memoria RAM: 224 bytes. Memoria EEPROM: 128 bytes. 16 terminales de E/S que soportan corrientes de hasta 25 mA. 3 Temporizadores Módulos de comunicación serie, comparadores y PWM. Maneja bancos de registros, que se clasifican como de uso general (GPR) y de uso especı́fico (FSR).Los de uso general pueden ser utilizados directamente por el programador, sin restricciones. Los de uso especı́ficos no pueden ser usados directamente por el usuario ya que controlan todo el funcionamiento del microcontrolador. Más información se encuentra disponible en la hoja de datos correspondiente. Ver Anexo D. 5.3.2. Pinout La figura 5.21 muestra el pinout del PIC en empaquetado DIP-18. Figura 5.21: PIC 16F628A 5.4. Fundamentos comunes Para el diseño de los módulos exteriores, se tomó como primer medida, establecer las consideraciones generales que debı́an cumplir todos ellos - sin excepción -. Esto llevó a diagramar la solución de manera global, y luego atenerse a las caracterı́sticas particulares de cada módulo. 130 CAPÍTULO 5. MÓDULOS EXTERIORES Pin RA0 RA1 RA2 RA3 RA4 RA5 RA6 RA7 RB1 RB2 E/S E E E E S E S S E S Módulo Ir ADDR0 ADDR1 ADDR2 ADDR3 Alarma RESET SOFT RESET DE MAX485 USART RX USART TX Módulo RS232 ADDR0 ADDR1 ADDR2 ADDR3 Alarma RESET SOFT RESET DE MAX485 USART RX USART TX Módulo Salidas ADDR0 ADDR1 ADDR2 ADDR3 Alarma RESET SOFT RESET DE MAX485 USART RX USART TX Módulo entradas ADDR0 ADDR1 ADDR2 ADDR3 Alarma RESET SOFT RESET DE MAX485 USART RX USART TX Tabla 5.2: Pines Comunes Las siguientes propiedades y circuitos, fueron implementadas para cumplir con el funcionamiento de la arquitectura multiprotocolar. 5.4.1. Pines de utilización genérica En la Tabla 5.2 se especifican los pines de utilización genérica. Los primeros cuatro pines se utilizan para la funcion de direccionamiento. RA4 es el pin de alarma(prende un led). RA5 y RA6 corresponden a la función circuito de Reset. RA7 controla la tarnsmisión half-duplex. RB1 es el pin de recepción de la USART y RB2 el de transmisión. 5.4.2. Direccionamiento Los puertos RA0, RA1, RA2 y RA3 son los encargados de establecer el ID del módulo exterior. Dicho ID, se establece a través del manejo de un dip-switch de 4 contactos. El circuito encargado de generar los distintos direccionamientos puede verse en la figura 5.22. Cuando el contacto está abierto, circula corriente hacia el puerto RAx, instaurándose un estado lógico ”1”. Al encontrarse cerrado, genera un estado lógico ”0”en el pin. Se referencia Jx como el contacto asociado al pin RAx. La Tabla 5.3 muestra las posibles direcciones del módulo según el estado lógico de cada pin. 5.4.3. Circuito de reset Los puertos RA5 y RA6 toman parte en la función reset del módulo. Cada módulo puede reseterse por hardware (por medio de un pulsador) o por software (a través de una orden del rabbit). El pin RA5 (pin negado) es el Master Clear del PIC, y el RA6 actúa ante un llamado del Rabbit. La siguiente figura muestra el circuito empleado para dicha función. 131 CAPÍTULO 5. MÓDULOS EXTERIORES Figura 5.22: Circuito direccionamiento Figura 5.23: Circuito Reset Como la integración en el circuito de una compuerta OR y una compuerta NOT requiere el uso de dos integrados, se decidió la utilización del integrado MC14001. Éste, está formado por cuatro compuertas NOR de dos entradas. Las razones que llevaron a su empleo fueron las siguientes: con 2 compuertas NOR es posible emular una compuerta OR. con 1 compuerta NOR es posible emular una compuerta NOT. solo se utiliza un integrado, ya que cada MC14001 posee 4 compuertas NOR de dos entradas. El delay de propagación por la acumulación de compuertas no es significativo para la función reset. El circuito final se observa en la figura 5.24. Por más especificaciones del MC14001 ver Anexo D 132 CAPÍTULO 5. MÓDULOS EXTERIORES RA3 RA2 RA1 RA0 ID 0 0 0 0 00 0 0 0 1 01 0 0 1 0 02 0 0 1 1 03 0 1 0 0 04 0 1 0 1 05 0 1 1 0 06 0 1 1 1 07 1 0 0 0 08 1 0 0 1 09 1 0 1 0 10 1 0 1 1 11 1 1 0 0 12 1 1 0 1 13 1 1 1 0 14 1 1 1 1 15 Tabla 5.3: Direcciones del módulo según el estado lógico de cada pin 5.5. 5.5.1. Modulo exterior Ir Proceso de implementación Primariamente, se diseñó una interfaz RS232 —> Ir para el manejo (desde una PC), de un radiograbador con lector de cd, marca Aiwa, siendo el PIC 16F628A “el cerebro”de la misma. Se consideró como pauta principal de diseño, la implementación de la mayor funcionalidad del sistema por medio de la programación; menos hardware se traduce en menor probabilidad de error y menor costo. Análisis de la trama infrarroja Mediante el circuito de la figura 5.25, se pudo analizar la trama infrarroja. Colocando el control remoto del radiograbador muy próximo al fototransistor L51P3C, se decodificó la trama de cada comando. El instrumento que permitió dicho estudio fue un osciloscopio digital. El control remoto utiliza modulación por largo de pulso. Cada trama está formada por cuatro campos: una secuencia inicial, un encabezado, un código y una secuencia final. La figura 5.26 muestra su composición. La secuencia inicial se decodifica como un tiempo alto de larga duración más un tiempo bajo de mediana duración. El encabezado es común a todos los comandos y tiene un 133 CAPÍTULO 5. MÓDULOS EXTERIORES Figura 5.24: Circuito Reset final Especificación Tiempo alto de secuencia inicial Tiempo bajo de secuencia inicial Tiempo alto de bit Tiempo bajo “1” lógico Tiempo bajo “0”lógico Tiempo (mseg.) 9,00 4,50 0.55 0.55 1.65 Tabla 5.4: Tiempos de la trama IR largo de 26 bits. El código es particular de cada uno y está constituido por 16 bits. La secuencia final está formada por un bit de stop. Los adjetivos “larga” y “mediana” se aplicaron considerando un sistema de referencia temporal de 50 µseg. Cada bit se traduce como un tiempo alto más un tiempo bajo. Tiene la misma duración un tiempo alto de bit, en un “1” y un “0”lógico, pero el tiempo bajo del “0” es más prolongado que el del “1”. La frecuencia de la portadora es de 38 KHz. En la Tabla 5.4 aparecen los tiempos implicados, obtenidos por medio de la observación en el osciloscopio. La decodificación de cada uno de los comandos y su correspondiente forma de onda se encuentra explicitada en el Anexo E. Concepción de la solución - Hardware La implementación del hardware se dividió en cuatro bloques: bloque traductor, bloque conexión serial, bloque del PIC y bloque amplificación. 134 CAPÍTULO 5. MÓDULOS EXTERIORES Figura 5.25: Circuito para analizar la trama infrarroja Figura 5.26: Trama IR genérica Bloque traductor Bloque encargado de traducir los niveles de tensión del puerto serie RS232 (-12V/+12V) a los niveles de tensión TTL/CMOS del PIC (0V/5V). Se utilizó el integrado MAX232, según la recomendación de su hoja de datos. Ver Anexo D. Este, se conecta al PIC por los pines T 1in (pin 11) y R1out (pin 12), y al puerto serie a través de los pines T 1out (pin 14) y R1in (pin 13). Bloque conexión serial Por intermedio de este bloque el PC se comunica con la interfaz. Consta de un conector serial hembra. Bloque del PIC Bloque principal del circuito. En el PIC, se traducen los caracteres ASCII 135 CAPÍTULO 5. MÓDULOS EXTERIORES que llegan por el puerto serie RS232 a comandos IR que serán enviados al radiograbador por medio del emisor. Por otra parte, también posee un pulsador, conectado a uno de los pines del PIC, para resetear el sistema. Bloque amplificación Es el encargado de lograr una correcta amplificación de la señal infrarroja. Como amplificador se utilizó un transistor NPN BC546 polarizado en la zona activa. La salida PWM del PIC se conectó a la base del transistor mediante una resistencia de 4K7 ω. Para transmitir la señal infrarroja se utilizó un emisor infrarrojo L53SF4BT. La figura 5.27 muestra los componentes de este bloque. En la modulación PWM se utilizan pulsos de igual amplitud - cuya duración depende de la amplitud de la señal de entrada -, en este caso, el bit de la señal infrarroja. Figura 5.27: Amplificación Infraroja Haciendo referencia del marco teórico, se eligieron los valores de las resistencias R1 y R2 según las siguientes consideraciones: R2 = Ic ≤ β · Ib , por lo que Ib ≥ Vcc 5V = 100Ω = Ic 50mA β Ic = Rb = R1 < 50mA 100ω = 500µA 5V = 10KΩ 500µA Realizando las pruebas correspondientes, se constató que la distancia máxima de separación entre la Interfaz y el radiograbador fue de aproximadamente 136 CAPÍTULO 5. MÓDULOS EXTERIORES 7 metros. Circuito completo Figura 5.28: Amplificación Infraroja AIWA Componentes utilizados: 1 x PIC 16F628A 1 x MAX232 1 x regulador de tensión 7805 1 x conector hembra DB9 1 x pulsador 1 x emisor IR L53SF4BT 5 x condensadores electrolı́ticos de 1 µF 3 x condensadores cerámicos de 0.1 µF 1 x LED rojo 5mm 1 x resistencia de 2k2 Ω (1/4 W) 1 x resistencia de 10k Ω (1/4 W) 1 x resistencia de 100 Ω (1/4 W) 137 CAPÍTULO 5. MÓDULOS EXTERIORES 1 x resistencia de 4k7 Ω (1/4 W) 1 x transistor NPN BC546 Concepción de la solución - Programación del PIC La siguiente es una breve descripción del mecanismo que realiza el PIC cada vez que se resetea: Borra la memoria RAM (utilizada para guardar las variables del programa y los códigos IR). Lee la EEPROM y se guarda cada byte de código IR en una variable determinada de la RAM. Tanto para el borrado de la memoria como para la lectura de la EEPROM y el guardado de los códigos se utilizó el direccionamiento indirecto como método de programación. Setea los módulos del PIC, configura el bloque PWM, el Timer 0, los puertos de entrada y salida, el periférico RS232 y habilitación las interrupciones correspondientes. Envı́a un mensaje de bienvenida para indicarle al usuario que el dispositivo está pronto para ser utilizado. Se verifica si se produjo una interrupción de la USART y si no se produjo se espera a que se produzca, quedándose el programa en un loop infinito. Consideraciones de diseño Como los comandos Ir están modulados por una portadora de 38KHz se consideró utilizar el módulo PWM del PIC (puerto RB3), ya que despliega una onda cuadrada. Originariamente se habı́a considerado utilizar una compuerta NAND schmmit trigger y un transistor PNP para amplificar. La compuerta era alimentada por la salida PWM y por el bit especı́fico de cada comando Ir, pero se pudo programar el PIC para realizar ésta operación lógica. Para implementar los tiempos de bit y de encabezado se consideró tomar el mı́nimo común múltiplo entre ellos: 0.5 mseg. Se trabajó con el Timer 0 de forma interruptiva cada vez que éste producı́a un overflow. Contando la cantidad de overflows fue posible implementar los tiempos de bit. El mecanismo para cargar los comandos Ir dentro del programa es el siguiente: 138 CAPÍTULO 5. MÓDULOS EXTERIORES Interrupción Uso Recepción de la USART Recibir el mensaje Overflow del Timer 0 Temporizaciones para transmisiones Ir Tabla 5.5: Interrupciones utilizadas se escribe una sola vez la memoria EEPROM con la información de los comandos. cuando se resetea el PIC, se leen de la EEPROM y se almacenan en la memoria RAM. Durante el funcionamiento normal, los valores se leen de la RAM, ya que ésta es más rápida que la EEPROM, y además, el tiempo de vida útil de la EEPROM es menor al tiempo de vida útil de la RAM. Se trabajó por medio de la recepción interruptiva de la USART. Posteriormente, se decodificaron los comandos de un DVD (marca WNR, modelo KM-218), y se implementó su funcionamiento en la interfaz. Ante su correcto funcionamiento, se comprobó que la interfaz diseñada tiene el funcionamiento de un control remoto universal. Es posible realizar esta aseveración, ya que los tiempos de estado alto y bajo de cada bit, son generados mediante una rutina genérica. No es relevante, el modo de modulación de la señal infrarroja (largo de pulso o codificación Manchester). 5.5.2. Desarrollo final La interfaz desarrollada es el modelo del módulo exterior Ir. Los mensajes de acción del Rabbit, recibidos a través del MAX485, son decodificados y convertidos en emisiones infrarrojas. El circuito final del módulo está detallado en el Anexo B. 5.5.3. Puertos adicionales de I/O Adicionalmente de los pines de utilización genérica, se utiliza el puerto RB3 para generar la señal PWM. 5.5.4. Interrupciones utilizadas La Tabla 5.5 denota el manejo de las interrupciones del PIC para este módulo. 139 CAPÍTULO 5. MÓDULOS EXTERIORES 5.6. Módulo exterior RS232 5.6.1. Consideraciones Para implementar el protocolo RS232, se necesita un transceiver que adapte los niveles de señal TTL a RS232 bidireccionalmente. Según [ZyTrax, 2007], para elegir un buen transceiver se debe considerar: Requerimientos de la fuente de alimentación Consumo de potencia Velocidades que maneja Coherencia con los niveles estándar de la señal Aislamiento Protección contra descargas electrostáticas Precio El MAX232 (empresa Maxim) es un integrado que reune las caracterı́sticas suficientes para satisfacer las necesidades descritas anteriormente. Es un transceiver de gran inserción dentro del mercado de la robótica. Permite el manejo de hasta dos conexiones bidireccionales. Como patrón de diseño se consideró la implementación de dos conexiones seriales por módulo exterior, definiéndolas como puerto serial 1 y puerto serial 2. Se implementó una solución de hardware para suplir el siguiente inconveniente: • El PIC está constituido solamente por una USART, por lo cual, existe un sólo pin de recepción y un solo pin de transmisión. Tal cual definido, el protocolo RS232, no puede comunicar más de un dispositivo por conexión. Debe existir una lógica capaz de comunicar las siguientes conexiones: o el puerto RB2/Tx del PIC con: - pin Tx del puerto serial 1 - pin Tx del puerto serial 2 - pin Di del MAX485 o el puerto RB1/Rx del PIC con: 140 CAPÍTULO 5. MÓDULOS EXTERIORES Puerto Conexión RB3 S1 MUX RB4 S0 MUX RB5 B DEMUX RB6 A DEMUX Tabla 5.6: Puertos adicionales - pin Rx del puerto serial 1 - pin Rx del puerto serial 2 - pin Ro del MAX485 Para suplir el inconveniente de la transmisión, se utilizó un demultiplexor CD4555, y con finalidad de solucionar la recepción, se empleó un multiplexor 74HC153. Ambos integrados están disponibles en plaza. La lógica implementada, está controlada por medio del PIC (a través de los puertos de I/O), quienes están conectados a los pines de control de los integrados. El pinout de los integrados implicados, puede verse en sus respectivas hojas de datos. Ver Anexo D. Una observación a tener en cuenta es que la entrada de datos E del demultiplexor es negada, por lo cual hay que invertir la señal del pin RB2/TX para que se transmita el sı́mbolo tal cual. Existen dos formas de llevarlo a cabo: A. Programar el PIC de forma tal de negar el bit a ser transmitido. B. Utilizar la compuerta NOR restante del integrado MC14001 para emular un inversor. Siguiendo el patrón de conducta - al aplicar los conocimientos relevantes para resolver la mayor funcionalidad de un sistema por medio de la programación -, se optó por la opción A. La solución implementada permite la configuración de cada puerto serial según las necesidades del usuario, pero no se resolvió el control de flujo. El circuito final del módulo exterior RS232 está detallado en el Anexo B. 5.6.2. Puertos adicionales de I/O Los puertos adicionales a los pines de utilización genéricas están publicados en la Tabla 5.6. 141 CAPÍTULO 5. MÓDULOS EXTERIORES Puerto Conexión RB0 OUT RB4 OUT RB5 OUT RB6 OUT RB7 OUT Tabla 5.7: Puertos adicionales modulo exterior de entradas 5.6.3. Interrupciones utilizadas No se utilizan interrupciones adicionales a la interrupción de recepción de la USART. 5.7. 5.7.1. Módulo exterior de salidas digitales Consideraciones El módulo exterior de salidas digitales provee una interfaz paralela de salida hacia otro sistema por medio de 5 lı́neas digitales. Se establece un estado lógico alto a través del envı́o de un mensaje que contiene el comando A (Action). Si el Rabbit envı́a el comando S (Stop), se establece el estado lógico bajo. Las acciones del módulo están determinadas por medio de la capa de acciones de la arquitectura multiprotocolar. 5.7.2. Puertos adicionales de I/O Los puertos adicionales a los pines de utilización genéricas son los especificados en la Tabla 5.7. 5.7.3. Interrupciones utilizadas No se utilizan interrupciones adicionales a la interrupción de recepción de la USART. 5.8. 5.8.1. Módulo exterior de entradas digitales Consideraciones El módulo exterior de entradas digitales brinda una interfaz paralela de entrada para permitir el diálogo entre el procesador multiprotocolar y otro sis- 142 CAPÍTULO 5. MÓDULOS EXTERIORES Pin Acción solicitada RB0 Acción no 1 RB4 Acción no 2 RB5 Acción no 3 RB6 Acción no 4 RB7 Acción no 5 Tabla 5.8: Acciones tema. Mapea el arribo de estı́mulos como una notificación de evento esporádico. Este módulo, agrega flexibilidad al procesador, ya que una señal proveniente de otro sistema permite la realización de una o más acciones en los otros módulos exteriores. Considérese el siguiente ejemplo: Un módulo de entradas recibe un pulso en uno de sus puertos avisando la activación de cierta alarma (tomando como ejemplo una alarma de robo). Cuando el Rabbit lo consulta, éste envı́a una notificación de evento esporádico. La programación del Rabbit puede determinar que ante la llegada de un evento en ese puerto, active la salida de un pin de un módulo exterior de salidas digitales. Dicho pin, puede activar un candado digital y prohibir el acceso a determinado espacio. Los módulos exteriores de entradas digitales definen una extensión para la capa de acciones de la arquitectura multiprotocolar. La acción generada, identifica un patrón de conducta a seguir por el Rabbit. La Tabla 5.8 muestra la correspondencia entre los puertos de entrada y las acciones. Controlando los tiempos de instrucción correspondientes, la duración mı́nima del estı́mulo (pulso) en cualquiera de los puertos deberá ser de 68 µseg. A medida que se producen los eventos esporádicos el PIC los latchea para luego ser entregados al Rabbit. 5.8.2. Puertos adicionales de I/O Los puertos adicionales a los pines de utilización genéricas son los concurrentes en la Tabla 5.9. 5.8.3. Interrupciones utilizadas La Tabla 5.10 muestra el manejo de las interrupciones del PIC para este módulo. 143 CAPÍTULO 5. MÓDULOS EXTERIORES Puerto Conexión RB0 IN RB4 IN RB5 IN RB6 IN RB7 IN Tabla 5.9: Puertos adicionales Interrupción Uso Recepción de la USART Recibir el mensaje Flanco positivo en RB0 Llegada de acción 1 Cambio de estado en puertos RB4:RB7 Llegada de acciones 2 a 5 Tabla 5.10: Interrupciones utilizadas 5.9. Referencias [AN2020, 2003] MAXIM, Dallas Semiconductor. 1997.Choosing the Right RS-232 Transceiver. Application Note AN2020 [online] [citado 11 Mayo 2003]. Disponible en Internet: <http://www.maxim-ic.com/appnotes.cfm/ appnote number/2020/> [Davshomepage, 2006] Davshomepage. 2006.The IrDA Standards for HighSpeed Infrared Comunications. [online]. Disponible en Internet: <http://users.pandora.be/davshomepage/> [Millar, 1998] Millar, Iain. 1994.The IrDA Standards for High-Speed Infrared Comunications. [online]. Disponible en Internet: <http://www.irda.org/associations/2494/file [Strangio, 2006] Strangio, Christopher E. 1993.The RS232 Standard. [online]. Disponible en Internet: <http://www.camiresearch.com/ Data Com Basics/RS232 standard.html> [Tonks, 2007] Tonks, Daniel. 1998.NEC IR Code Format. [online]. Disponible en Internet: <http://www.remotecentral.com/features/irdisp4.htm> [UAB, 2005] UAB. 2005.Comunicaciones. [online]. Disponible en Internet: <http://eq3.uab.es/personal/baeza/comunicaciones/comunica.htm> [UCAR, 2005] UCAR. 1995.Radiaccion Infrarroja. [online]. Disponible en Internet: <http://www.windows.ucar.edu/tour/link=/physical science/ magnetism/em infrared.sp.html> 144 CAPÍTULO 5. MÓDULOS EXTERIORES [UST, 2006] UST Research, INC. 1993.InfraRed Remote Control. [online]. Disponible en Internet: <http://www.ustr.net/infrared/infrared1.shtml> [ZyTrax, 2007] ZyTrax, Inc., 1994.Serial Interface Primer. [online]. Disponible en Internet: <http://www.zytrax.com/tech/layer 1/cables/heavy.htm> 145 Parte III Conclusiones Capı́tulo 6 Mejoras pendientes 6.1. Introducción En todo proyecto existe una etapa de mejoras. Éstas, se realizan una vez cumplidos los objetivos de diseño iniciales. En este capı́tulo se especifican las posibles mejoras relevantes al procesador para control multiprotocolar. Se divide el capı́tulo en tres secciones: mejoras relativas al bloque central, mejoras en los módulos exteriores y mejoras de fabricación. Vale recalcar que no fue objetivo del proyecto la elaboración de un producto, sino de un prototipo. 6.2. 6.2.1. Mejoras relativas al bloque central Funcionalidad del reset por software Tal cual está definido el protocolo, el Rabbit puede enviarle un mensaje a un módulo exterior solicitándole su respectivo reset. Esta función no está implementada por medio de una determinada aplicación, solo se brinda la plataforma para poder realizarla. Un ejemplo de utilización serı́a el siguiente caso: Si cumplido el ciclo de consulta el Rabbit detectase la aparición de un nuevo módulo exterior, y se cumpliese el caso que al direccionarle una orden especı́fica, éste no enviase una notificación de respuesta (luego de la regla de los tres intentos), el Rabbit avisarı́a con una alarma la desconexión del módulo. Si en el siguiente ciclo de consulta no apareciese el módulo en ninguna de las IDs, y el address ocupada anteriormente por el módulo se encontrase vacı́a, el Rabbit podrı́a enviar un comando de reset a dicho ID. De esta forma, se intentarı́a volver a establecer el contacto con el módulo sin la necesidad de molestar al usuario. 147 CAPÍTULO 6. MEJORAS PENDIENTES 6.2.2. Universalidad de módulos exteriores Los módulos exteriores tienen asociadas tres variables para su debida ubicación dentro del sistema: ID, tipo de módulo y número serial. Actualmente, el ID es una variable independiente del sistema, el seteada por el usuario y puede variar según su preferencia sin interferir con el funcionamiento normal del procesador. Las restantes variables están programadas en el Rabbit y en el PIC. Una mejora sustancial serı́a manejar la variable tipo de módulo en forma independiente. Para determinar el tipo de módulo podrı́a implementarse una lógica de hardware que conectada al PIC interpretara dicho valor. El número serial es caracterı́stico de cada módulo y no necesita ser independiente, realizando un paralelismo con las tarjetas de red, el número serial serı́a una dirección MAC. 6.2.3. Aplicación del protocolo Telnet Un sistema integrado, que corra una aplicación mejor desarrollada, hace crecer el valor de la solución. Un producto completo puede considerarse como un prototipo acompañado de un software que actúe sobre el mismo. Por ejemplo: un desarrollador de software realiza una implementación en .NET, capaz de conectarse con el procesador y solicitarle la realización de acciones mediante comandos Telnet. La librerı́a Telnet del Rabbit es la puerta de acceso hacia la interacción entre el prototipo y una plataforma de software determinada. 6.2.4. Software de configuración y firmware El producto podrı́a pasar por varias etapas antes de llegar al usuario final. Una entidad intermediaria entre el fabricante y el usuario final podrı́a ser una empresa que brinda soluciones de automatización. Como la universalidad de módulos exteriores viene acompañada de una versatilidad mayor en el momento de la configuración del sistema, serı́a necesario desarrollar un software capaz de configurar las preferencias del usuario final: acciones que debe realizar cada módulo ante el llamado de una determinada estructura .CGI. Para la realización de un software, las herramientas a seleccionar para su implementación son el lenguaje de programación y el toolkit gráfico. Este último es la API utilizada para el manejo, control y creación de una aplicación 148 CAPÍTULO 6. MEJORAS PENDIENTES con interfaz gráfica. La principal consideración de diseño, debe ser desarrollar un entorno de trabajo amigable para que terceras personas puedan configurar el sistema. Según [Wikipedia8, 2007], el firmware es un bloque de instrucciones de programa para propósitos especı́ficos, grabado en una memoria tipo EPROM, que establece la lógica de más bajo nivel que controla el comportamiento de los circuitos integrados. Serı́a conveniente elaborar un firmware que pueda actualizar las funcionalidades del sistema. En el módulo exterior Ir, estos momentos, la memoria EEPROM del PIC guarda las tramas Ir que serán transmitidas. 6.2.5. Utilización del servidor FTP El servidor FTP (Ver Sección 3.3.4) puede ser utilizado para subir un nuevo firmware al Rabbit, de esta forma se evitarı́a la programación en Dynamic C ante actualizaciones. Un aspecto a tener en cuenta serı́a el tamaño del archivo del firmware, cabiendo la posibilidad de que pueda exceder la capacidad de memoria. 6.2.6. Compresión de archivos en el servidor HTTP Considerando que el RCM3700 permite la carga de archivos comprimidos al servidor HTTP (Ver Sección 3.3.4) se podrı́a reducir el espacio ocupado de memoria dentro del mismo y ası́ lograres prestaciones en cuanto a la visualización de la interfaz gráfica. 6.2.7. Interfaz gráfica de manejo La interfaz gráfica que el usuario observa a través de la web no es una caracterı́stica menor. Cuanto más sofisticada, más funcionalidad permite; a pesar de que puede traer complicaciones a la hora de manejar las distintas estructuras .CGI. Se debe generar un equilibrio entre la complejidad de la interfaz y las funcionalidades especı́ficamente requeridas. 6.2.8. Aumento de la velocidad de transmisión En estos momentos, la velocidad del medio de transmisión es de 9600 baudios. Como el MAX485 permite velocidades de hasta 250 Kbps, serı́a conveniente aprovechar dicha posibilidad y aumentar la velocidad del medio de transmisión a 19200 baudios, logrando ası́ disminuir los tiempos relevantes en el sistema: Ttm , Ttn , Te y Tcm . 149 CAPÍTULO 6. MEJORAS PENDIENTES 6.2.9. Escalabilidad de Rabbits y control central El primer nivel de escalabilidad del sistema consiste en la inclusión de hasta dicisesis módulos exteriores dentro del sistema. Una segunda estratificación podrı́a resultar una topologı́a compuesta por dos o más módulos RCM3700 y un control central desde un servidor determinado. Dicha funcionalidad lograrı́a conectar varias habitaciones o espacios entre sı́ controlado más de un ambiente en forma conjunta. Implementando rutinas de la librerı́a Telnet se podrı́a lograr dicha comunicación. 6.3. 6.3.1. Mejoras en los módulos exteriores Generación de una base de datos infrarroja Existen, en el mercado nacional e internacional, muchos dispositivos que pueden controlarse por infrarrojo. Cada dispositivo tiene un control remoto asociado, donde los comandos son (generalmente) compatibles entre dispositivos de la misma marca. Esto genera que los comandos de los equipos, con funcionalidades dispares, sean decodificados de igual forma. El firmware podrı́a resultar ser una herramienta capaz de actualizar una base de datos con códigos infrarrojos para su posible utilización a través del procesador. Un programa de configuración, permitirı́a mapearlos con las distintas aplicaciones para que puedan ser utilizados. 6.3.2. Fuente de corriente para módulo exterior Ir Los distintos emisores Ir funcionan por corriente y no por voltaje. En estos momentos, el módulo exterior Ir permite el manejo de un único dispositivo. Ası́ como el módulo exterior RS232 brinda la posibilidad de utilizar dos conexiones seriales, serı́a una mejora apreciable conectar dos o más emisores Ir en paralelo y ofrecer el control de varios dispositivos a través del mismo módulo exterior Ir. Para dicha implementación, deberı́a utilizarse una fuente de corriente. 6.3.3. Alimentación directa del bus Los elementos que forman parte del sistema deben alimentarse separadamente. El simple hecho de tener un bloque central y dieciséis módulos exteriores funcionando en forma conjunta, lleva al empleo de diecisiete fuentes de alimentación. 150 CAPÍTULO 6. MEJORAS PENDIENTES Al utilizar cable par trenzado es posible, cargar el bus y lograr que los módulos infrarrojos se alimenten del mismo. La manera más eficiente de hacerlo serı́a alimentar el bloque central y modular esa alimentación para poder trasladarla por el bus. Los módulos exteriores deberı́an tener una circuiterı́a capaz de demodular la señal. 6.3.4. Manejo de mayor cantidad de protocolos Al lograr una plataforma general donde las acciones están completamente identificadas, serı́a posible controlar mayor cantidad de protocolos. Implementar el protocolo X10 serı́a de utilidad (se emplea para usos domóticos). En estos momentos, están surgiendo una gran cantidad de protocolos, para el manejo digital del hogar, por ejemplo el protocolo DALI (DIgital Addressable Lighting Interface) para control de iluminación. Generalmente, éstos protocolos, funcionan en base a comandos y respuestas, por lo cual habrı́a que establecer una comunicación bidireccional entre los controladores y el PIC. 6.4. 6.4.1. Mejoras de fabricación Protección ante inclemencias del ambiente Considerando la aplicación primordial del sistema en la domótica, no es de descartar su inserción dentro de ambientes industriales: las largas distancias están contempladas pero no ası́ la protección del bloque central ni los módulos exteriores. Para el trabajo en dichas circunstancias, se requiere que el procesador sea un sistema robusto ante las inclemencias del ambiente de trabajo - capaz de operar en entornos húmedos, polvorientos y corrosivos -, que esté protegido bajo aislamiento y por ende sin posibilidades de ventilación. Además, debe contemplarse su ubicación en espacios de difı́cil acceso y sometido a vibraciones. Otro aspecto a considerar es la inclusión de repetidores RS485 para agrandar las distancia entre el bloque central y los módulos exteriores. 6.4.2. Fabricación de un circuito impreso Cuando se cuenta con el diseño final del producto, es conveniente realizar un circuito impreso. El circuito impreso esta constituido por una placa aislante (en una o en sus dos caras) de conductores planos metalizados cuyo objeto es 151 CAPÍTULO 6. MEJORAS PENDIENTES asegurar las correctas conexiones eléctricas entre el conjunto de los componentes electrónicos dispuestos en su superficie. De esta forma se podrá obtener mejores desempeños en cuanto a velocidad y ruido, y reducir la probabilidad de falla por mal conexionado. 6.4.3. Protección ante interferencia electromagnética Debido a la utilización de un bus de datos, se hace indispensable un estudio pormenorizado de la interferencia electromagnética generada y recibida por los componentes de forma de poder diseñar una distribución óptima para minimizar dichos problemas. Para atacar el problema de raı́z, habrı́a que fabricar un circuito impreso teniendo en cuenta los siguiente puntos: evitar los loops en las pistas de alta frecuencia colocar los componentes de alta frecuencia lo más próximos posible utilizar planos de tierra Otra consideración de protección radica en la utilización de una carcasa metálica que oficie como “Jaula de Faraday”. Según [Wikipedia9, 2007], el efecto Jaula de Faraday provoca que el campo electromagnético en el interior de un conductor en equilibrio sea nulo, anulando el efecto de los campos externos. 6.5. Referencias [Wikipedia8, 2007] WIKIPEDIA. 2007.Firmware .[online] Disponible en Internet: <http://en.wikipedia.org/wiki/Firmware> [Wikipedia9, 2007] WIKIPEDIA. 2007.Jaula de Faraday .[online] Disponible en Internet: <http://es.wikipedia.org/wiki/Jaula de Faraday> 152 Capı́tulo 7 Cierre del proyecto La autoevaluación tiene tintes de subjetividad; pensar, elaborar y desarrollar un proyecto propio concluye, necesariamente, en una valoración positiva. Más aún, si los objetivos trazados se cumplieron: La arquitectura multiprotocolar está compuesta por tres capas claramente definidas: capa fı́sica, capa de conexiones y capa de acciones. Esta solución maestro - esclavo eliminó las colisiones, estableciéndose el intercambio de información por medio de mensajes y notificaciones. Los módulos exteriores pueden crecer hasta un máximo de dieciséis por sistema. El ID de cada módulo es una variable independiente del sistema, fijada a través del usuario. Rabbit oficia como nexo entre el mundo exterior y los protocolos a controlar. El servidor HTTP es el desencadenante de las acciones solicitadas por medio de la web, y los módulos exteriores de entradas digitales proveen una interfaz paralela de entrada. Conceptualizando el diseño por el estudio de un marco teórico e implementado la mayor funcionalidad del sistema, aprovechando al máximo los recursos accesibles que brindan los microcontroladores (programación del PIC, desarrollo en Rabbit), se obtuvo un prototipo funcionando. Automatizando procesos, empleando herramientas especı́ficas y mediando entre los avances y las metas propuestas, se establece un mecanismo de gestión de proyecto capaz de dirigir el desarrollo y la implementación, para que las soluciones lleguen a buen cauce. La elección del procesador Rabbit RCM3700, como bloque central, fue acertada. Sus prestaciones son amplias, las librerı́as ofrecen una variedad de funciones que permiten una gran versatilidad a la hora de constituir una solución 153 CAPÍTULO 7. CIERRE DEL PROYECTO en particular. La implementación real del proyecto resulta la concepción práctica de la arquitectura multiprotocolar. Ésta, es la responsable de compatibilizar el protocolo TCP/IP con los distintos protocolos que se controlan. La concepción en capas permite su crecimiento, pero la limitante de capa fı́sica (máximo treinta y dos transceivers 485 por bus) implica el estudio de la escalabilidad de bloques centrales. Las posibles mejoras buscan mayor robustez y flexibilidad, aumentar las prestaciones ofrecidas y transformar el prototipo en un producto final. La domótica - como rama de la ingenierı́a - tiende a ordenarse, estructurarse y estandarizarse mediante diversas iniciativas. Tanto las redes Ethernet como las inalámbricas, parecen haberse constituido en las plataformas mediante las cuales el entorno digital evolucionará, y sobre las cuales, la domótica deberá sustentarse para poder aumentar el uso de la tecnologı́a en los hogares. Como contrapartida, al usuario no le resulta atractivo conocer la tecnologı́a existente detrás un producto, un sistema o una instalación. Sólo busca funcionalidad, facilidad de uso, fiabilidad y servicio. Por lo cual resulta cada vez más importante la convergencia entre servicios, infraestructuras y equipamientos. Luego de un año de investigación y trabajo, habiendo recorrido un abanico de soluciones posibles, se encontró la respuesta a la siguiente pregunta: ¿Podrá desarrollarse una arquitectura multiprotocolar, infinitamente escalable y flexible, capaz de ajustarse a la invención de nuevos protocolos y ser sostén de los actuales? El futuro lo dirá. 154 Bibliografı́a - Casadomo Soluciones S.L. 1999.Pasarela Residenical.[online] Disponible en Internet: <http://www.casadomo.com/ noticiasDetalle.aspx?c=49&m=15&idm=60&pat=14&n2=14> - CEBus. 1999.CEBus .[online] Disponible en Internet: <http://www.casadomo.com/noticiasDetalle.aspx?c =19&m=164&idm=26&pat=148&n2=148> - CopyLeft. 2003.El protocolo SMTP .[online] Disponible en Internet: <http://www.programacionweb.net/ articulos/articulo/?num=412> - CopyLeft. 2003.El protocolo HTTP .[online] Disponible en Internet: <http://www.programacionweb.net/ articulos/articulo/?num=409> - Crompton. 2002.RS485 & Modbus Protocol Guide .[online] Disponible en Internet: <http://www.cromptoninstruments.com/ rs485.pdf> - Davshomepage. 2006.The IrDA Standards for High-Speed Infrared Comunications. [online]. Disponible en Internet: <http://users.pandora.be/davshomepage/> - Del Castillo San Félix, Alvaro. 1999.1.3. El protocolo HTTP .[online] Disponible en Internet: <http://acs.barrapunto.org/ articulos/trunk/LinuxActual/Apache/html/x49.html> - Digi. 1996 .ConnectCore 7U.[online] Disponible en Internet: <http://www.digi.com/products/embeddedsolutions/devkits/ connectcore7udevkit.jsp> 155 BIBLIOGRAFÍA - DOMODESK SL. 1998.Domótica ”La Lı́nea Violeta”.[online] Disponible en Internet: <http://www.domodesk.com/ content.aspx?co=51&t=21&c=43> - DOMOTICAVIVA. 2002.Qué domótica.[online] Disponible en <http://www.domoticaviva.com/portada/ quesdomotica.htm> - ESAcademy. 2000.The I2C Bus Structure .[online] Disponible en <http://www.esacademy.com/faq/i2c/ general/i2chardw.htm> es la Internet: Hardware Internet: - ESAcademy. 2000.The I2C Bus Protocol .[online] Disponible en Internet: <http://www.esacademy.com/faq/ i2c/general/i2cproto.htm> - GETEC. 2005.Etapas de un proyecto .[online] Disponible en Internet: <http://www.getec.etsit.upm.es/docencia/gproyectos/ planificacion/etapas.htm> - HTML. 2007.Investigación del protocolo HTML .[online] Disponible en Internet: <http://z0.saladeteletipos.com/ twiki/bin/view/ProcesadorMultiprotocolar/ProtocoloHTML> - IBM. Managed mobile clients with OSGi: Managed smart clients.[online] Disponible en Internet: <http://www-128.ibm.com/developerworks/library/wiosgi/index.html> - Interfacebus. 1978.GPIB 101 - A TUTORIAL ABOUT THE GPIB BUS .[online] Disponible en Internet: <http://www.icselect.com/ pdfs/ab48 11.pdf> - Interfacebus. 1998.GPIB Bus .[online] Disponible en Internet: <http://www.interfacebus.com/ Design Connector GPIB.html> - MAXIM, Dallas Semiconductor. 1997.Selecting and Using RS-232, RS-422, and RS-485 Serial Data Standards. Application Note AN723 [online] [citado 29 Diciembre 2000]. Disponible en Internet: <http://pdfserv.maxim-ic.com/en/an/AN723.pdf> 156 BIBLIOGRAFÍA - MAXIM, Dallas Semiconductor. 1997.RS-485 Data Interface Gives Isolated, Full-Duplex Operation. Application Note AN723 [online] [citado 9 Julio 1998]. Disponible en Internet: <http://pdfserv.maximic.com/en/an/AN2116.pdf> - MAXIM, Dallas Semiconductor. 1997.Choosing the Right RS-232 Transceiver. Application Note AN2020 [online] [citado 11 Mayo 2003]. Disponible en Internet: <http://www.maximic.com/appnotes.cfm/appnote number/2020/> - Millar, Iain. 1994.The IrDA Standards for High-Speed Infrared Comunications. [online]. Disponible en Internet: <http://www.irda.org/associations/2494/files/ Publications/high speed.pdf> - Mouser Electronics. 1996 .Digi International.[online] Disponible en Internet: <http://www.mouser.com/digi/> - OShonSoft. 2001.Pic Simulator IDE .[online] Disponible en Internet: <http://www.oshonsoft.com/pic.html> - PC/104 Embedded PC Modules. Consortium.[online] Disponible <http://www.pc104.org/> 1992 . PC/104 en Internet: - Postel, Jonathan B. 1982. SIMPLE MAIL TRANSFER PROTOCOL. RFC 821 [online]. Disponible en Internet: <http://www.ietf.org/rfc/ rfc0821.txt> - Postel, J. 1983.Especificación del protocolo TELNET . RFC 854 [online] Disponible en Internet: <http://www.rfc-es.org/rfc/rfc0854-es.txt> - Programación. 1999.Protocolo HTML .[online] Disponible en Internet: <http://www.programacion.com/html/foros/2/> - Rabbit Semiconductir. 1999 .RCM3700 Core.[online] Disponible en Internet: <http://www.rabbitsemiconductor.com/ products/rcm3700/> Rabbit- 157 BIBLIOGRAFÍA - Rabbit Semiconductor. 1999 .Dynamic C: User’s Manual.[online] Disponible en Internet: <http://www.rabbitsemiconductor.com/ documentation/docs/manuals/DC/DCUserManual/ DCPUM.pdf> - Rabbit Semiconductor. 1999 .Dynamic C TCP/IP Volume 1.[online] Disponible en Internet: <http://www.rabbitsemiconductor.com/ documentation/docs/manuals/TCPIP/UsersManualV1/ tcpV1.pdf> - Rabbit Semiconductor. 1999 .Dynamic C TCP/IP Volume 2.[online] Disponible en Internet: <http://www.rabbitsemiconductor.com/ documentation/docs/manuals/TCPIP/UsersManualV1/ tcpV2.pdf> - Rabbit Semiconductor. 1999 RCM3700.[online] Disponible en <http://www.rabbitsemiconductor.com/ documentation/docs/manuals/RCM3700/ RC3700UM.pdf> .RabbitCore Internet: - Rabbit Semiconductor. 1999 .Rabbit 3000 User manual.[online] Disponible en Internet: <http://www.rabbitsemiconductor.com/ documentation/docs/manuals/Rabbit3000/UsersManual/ R3000UM.pdf> - RS485.com. 2007. QUICK REFERENCE FOR RS485, RS422, RS232 AND RS423 .[online] Disponible en Internet: <http://www.rs485.com/rs485spec.html> - SCP. 1999.SCP .[online] Disponible en Internet: <http://www.casadomo.com/noticiasDetalle.aspx?c =21&m=164&idm=28&pat=148&n2=148> - Sinexi S.A. 1997.Normas ANSI. ISO. IEEE para cableado UTP .[online] Disponible en Internet: <http://www.monografias.com/trabajos11/utp/utp.shtml> - Strangio, Standard. Christopher E. 1993.The RS232 [online]. Disponible en Internet: 158 BIBLIOGRAFÍA <http://www.camiresearch.com/Data Com Basics/ RS232 standard.html> - Tech Soft. 1997.HTBasic rial .[online] Disponible <http://www.techsoft.de/htbasic/ tutgpibm.htm?tutgpib.htm> GPIB Tutoen Internet: - Technologic Systems. 1984 .TS-7200.[online] Disponible en Internet: <http://www.embeddedarm.com/epc/ ts7200-spec-p.php#7200pricing> - The OSGI Alliance. 2000 .OSGi Service Platform Core Specification.[online] Disponible en Internet: <http://www.osgi.org> - The OSGI Alliance. 2000 .About the OSGi Service Platform.[online] Disponible en Internet: <http://www.osgi.org> - Tigris.org. 2006.Subversion .[online] Disponible en Internet: <http://subversion.tigris.org/> - Tigris.org. 2006.TortoiseSVN .[online] Disponible en Internet: <http://tortoisesvn.tigris.org/> - TWiki.org. 1999.TWiki .[online] Disponible en Internet: <http://www.twiki.org> - Tonks, Daniel. 1998.NEC IR Code Format. [online]. Disponible en Internet: <http://www.remotecentral.com/features/irdisp4.htm> - UAB. 2005.Comunicaciones. [online]. Disponible en Internet: <http://eq3.uab.es/personal/baeza/comunicaciones/ comunica.htm> - UCAR. 1995.Radiaccion Infrarroja. [online]. Disponible en Internet: <http://www.windows.ucar.edu/tour/link=/ physical science/magnetism/em infrared.sp.html> - UltraVNC. 2006.UltraVNC .[online] Disponible en Internet: <http://www.uvnc.com/> - UST Research, INC. 1993.InfraRed Remote Control. [online]. Disponible en Internet: <http://www.ustr.net/infrared/infrared1.shtml> 159 BIBLIOGRAFÍA - UTEM. 1994.Manual HTML .[online] Disponible en Internet: <hhttp://www.utem.cl/web/form.htm> - Webopedia. 2007.SMTP .[online] Disponible en Internet: <http://www.webopedia.com/TERM/S/SMTP.html> - Webopedia. 2007.HTTP .[online] Disponible en Internet: <http://www.webopedia.com/TERM/H/HTTP.html> - WIKIPEDIA. 2007.Domótica .[online] Disponible en Internet: <http://es.wikipedia.org/wiki/Dom %C3 %B3tica> - WIKIPEDIA. 2007.Protocolo de red .[online] Disponible en Internet: <http://es.wikipedia.org/wiki/Protocolo de red> - WIKIPEDIA. 2007.Proyecto .[online] Disponible en Internet: <http://es.wikipedia.org/wiki/Proyecto> - Wikipedia. 2007.Microprocesadores embebidos .[online] Disponible <http://es.wikipedia.org/wiki/ Sistema integrado#Microprocesadores y sistemas embebidos> y en sistemas Internet: - WIKIPEDIA. 2007.HTML .[online] Disponible en Internet: <http://es.wikipedia.org/wiki/HTML> - WIKIPEDIA. 2007.Daisy chain .[online] Disponible en Internet: <http://en.wikipedia.org/wiki/Daisy chain> - WIKIPEDIA. 2007.Category 5 cable .[online] Disponible en Internet: <http://en.wikipedia.org/wiki/Category 5 cable> - ZyTrax, Inc., 1994.Serial Interface Primer. [online]. Disponible en Internet: <http://www.zytrax.com/tech/layer 1/cables/heavy.htm> 160 Parte IV Anexos Anexo A Herramientas de gestión de proyecto A.1. Introducción Con el avance de la tecnologı́a y la implementación de nuevas herramientas informáticas de software libre, es imprescindible la utilización de las mismas, ya que brindan facilidades que con “lápiz y papel”son imposibles de sobrellevar. Como agregado, permiten una versatilidad superior a la hora de gestionar un proyecto (documentación, tareas pendientes, seguimiento del proyecto, versionado de archivos guardados, acceso remoto, simulaciones, etc). A.2. TWiki Con la finalidad de gestionar el seguimiento del proyecto se eligió una herramienta capaz de cumplir con las siguientes condiciones: • guardar un registro de cambios: almacenamiento de distintas versiones con los cambios hechos. • trabajar simultaneamente: permitir la edición del contenido a varias personas en forma conjunta. • envı́o de avisos instantáneos: notificación via E-mail cuando se modifica algún contenido. • acceso en forma remota: autorizar la edición desde cualquier plataforma - Windows, Linux o Mac - o desde Internet. • documentar cada vez que se necesite: servir como herramienta para escribir la documentación a medida que se avanza con el proyecto. 162 ANEXO A. HERRAMIENTAS DE GESTIÓN DE PROYECTO • gestionar el seguimiento del proyecto: tener una lista con tareas pendientes y resposabilidades, como también un registro con tareas terminadas. • tener reglas de escritura fáciles y simples: documentar en el mismo lenguaje que se habla y no implementar reglas con nuevos formatos. • almacenar archivos: guardar archivos de distinto tipo administrándolos ordenadamente. • jerarquizar y ordenar la información: estructurar la información de forma legible y entendible. • poder insertar imágenes en los documentos: documentar utilizando imágenes Tomando como base estas afirmaciones se decidió usar TWiki, una herramienta de la familia Wiki. Ésta aplicación permite tener un sitio web cuyas páginas son editables y accesibles por los usuarios que poseen el permiso para hacerlo. En este caso, el sitio es una web pública (accesible para cualquier persona), pero la edición está limitada a los usuarios con clave de acceso. Con esta aplicación es posible editar los distintos topics de forma conjunta sin que aparezcan conflictos, ya que los cambios quedan registrados y se posibilita la consulta a versiones anteriores, brindando ası́ una gran flexibilidad de trabajo. El TWiki está publicado en http://z0.saladeteletipos.com/twiki/bin/view/ ProcesadorMultiprotocolar/WebHome La figura A.1 muestra la página principal del twiki Tomando como base éstos conceptos se decidió emplear Subversion como sistema de control de versiones y TortoiseSVN como interface de acceso a Subversion. Subversion se basa en la implementación de un Repositorio: un sistema centralizado donde se guarda información jerárquicamente en forma de “árbol”, implementando directorios y archivos. Cada usuario puede crearse una copia del Repositorio en su computadora y mediante las operaciones adecuadas tener siempre un historial con las distintas versiones de los archivos modificados. 163 ANEXO A. HERRAMIENTAS DE GESTIÓN DE PROYECTO Figura A.1: Web TWiki Existen 2 operaciones básicas: svn commit y update. Svn commit se utiliza para confirmar los cambios y subirlos al repositorio, generando una nueva revisión de los archivos. Update se emplea para mantener una versión actualizada del Repositorio. Esta herramienta permite mantener un orden de los archivos empleados - tanto para el desarrollo como para el producto final -, de forma tal de no disponer de archivos innecesarios, en los cuales el avance de versiones realizadas está especificado con un cambio de nombre con la mera finalidad de poder indentificarlo. TortoiseSVN es la interfaz para Windows que permite realizar las siguientes aplicaciones: • Subir archivos al Repositorio. • Permitir notaciones adjuntas a la revisión cada vez que se realiza un commit. • Actualizar el Repositorio local de cada computadora. • Buscar diferencias entre versiones y señalarlas. 164 ANEXO A. HERRAMIENTAS DE GESTIÓN DE PROYECTO • Graficar utilización del Repositorio central por usuario y fecha. El Respositorio se encuentra publicado en http://z0.saladeteletipos.com/svn /proyecto pero no es de acceso público por razones de privacidad; es necesario la autenticación correspondiente. Subversion es una herramienta de software libre distribuida con licencia Apache/BSD. Ver [SUBVERSION, 2006] TortoiseSVN es una herramienta de software libre distribuida con licencia GPL. Ver [TortoiseSVN, 2006] La figura A.2 muestra las funcionalidades de Subversion mediante TortoiseSVN. Figura A.2: TortoiseSVN A.3. UltraVNC Siguiendo la meta de trabajar remotamente se eligió un herramienta capaz de: • Desplegar el monitor de una computadora: controlar una computadora por internet o red local. 165 ANEXO A. HERRAMIENTAS DE GESTIÓN DE PROYECTO • Trabajar remotamente con todas las herramientas: utilizar teclado y mouse para comandar la computadora como si se tratase de una propia. UltraVNC es una herramienta para Windows por la cual es posible comandar una computadora por internet, visualizando el monitor. Consta de varias aplicaciones, pero se emplearon las aplicaciones “Server” (ejecutada en la computadora a controlar) y “Viewer”(ejecutada en la computadora en la cual se quiere visualizar la otra). Es necesario tener un router que oficie de Gateway, el cual debe configurarse apropiadamente para que fowardee determinados puertos (en este caso el 5899 y 5999) con el objetivo de establecer la conectividad mediante el UltraVNC. Se creo un usuario y un “nombre DNS”en el sitio http://www.dyndns.org con el propósito de proporcionar un hostname estático a un IP dinámico. Se conectó la placa Rabbit a una computadora especı́fica y ejecutando el UltraVNC Server mediante el hostname rossanitahome.dyndns.org se tuvo acceso a la programación y desarrollo del proyecto en forma remota. Se conectó, también, una cámara web a la computadora, y apuntando hacia la placa de desarrollo se tuvieron imágenes real-time fidedignas de los leds de estado que posee la placa, utilizados para debugear. UltraVNC es una herramienta de software libre distribuida con licencia GNU. Ver [UVNC, 2006] A.4. Pic Simulator IDE La finalidad de esta herramienta fue la simulación completa del uso del PIC 16F628A. Este software posee la cantidad necesaria de aplicaciones para generar toda interacción virtual con el PIC, brinda un ambiente gráfico de desarrollo de fácil manejo para Windows. El programa tiene las siguientes propiedades: • La interfaz principal demuestra la estructura interna del microcontrolador. • Editor de la memoria flash del programa. • Editor de la memoria eeprom. 166 ANEXO A. HERRAMIENTAS DE GESTIÓN DE PROYECTO • Interfaz del pinout del microcontrolador para simular entradas y salidas digitales. • Velocidad variable de simulación. • Administrador de breakpoints para debugear el código. • Interfaz de simulación de un módulo LCD. • Interfaz de simulación de motores de paso. • Interfaz de simulación de la UART de hardware. • Osciloscopio para la visualización de señales generadas. La figuta A.3 muestra la pantalla principal del programa: Ver [PIC, 2001] A.5. Referencias [PIC, 2001] OShonSoft. 2001.Pic Simulator IDE .[online] Disponible en Internet: <http://www.oshonsoft.com/pic.html> [SUBVERSION, 2006] Tigris.org. 2006.Subversion .[online] Disponible en Internet: <http://subversion.tigris.org/> [TortoiseSVN, 2006] Tigris.org. 2006.TortoiseSVN .[online] Disponible en Internet: <http://tortoisesvn.tigris.org/> [TWiki, 2002] TWiki.org. 1999.TWiki .[online] Disponible en Internet: <http://www.twiki.org> [UVNC, 2006] UltraVNC. 2006.UltraVNC .[online] Disponible en Internet: <http://www.uvnc.com/> 167 ANEXO A. HERRAMIENTAS DE GESTIÓN DE PROYECTO Figura A.3: PIC Simulator IDE 168 Anexo B Esquemáticos En este anexo se muestran los circuitos correspondientes a cada modulo y al blo1que central. La figura B.1 muestra el esquemático correspondiente al modulo exterior de entradas. Figura B.1: Modulo exterior de entradas La figura B.2 muestra el esquemático correspondiente al modulo exterior de salidas. La figura B.3 muestra el esquemático correspondiente al modulo exterior IR. 169 ANEXO B. ESQUEMÁTICOS Figura B.2: Modulo exterior de salidas La figura B.4 muestra el esquemático correspondiente al modulo exterior RS232. La figura B.5 muestra el esquemático correspondiente al modulo exterior RS232. 170 ANEXO B. ESQUEMÁTICOS Figura B.3: Modulo exterior IR Figura B.4: Modulo exterior RS232 171 ANEXO B. ESQUEMÁTICOS Figura B.5: Modulo Bloque Central 172 Anexo C Códigos Fuentes C.1. Introducción En esta sección se describen con diagramas de bloque las prestaciones de la placa RCM3700 y se documentan los distintos códigos utilizados para la programación de las distintas pruebas. C.2. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 Código ModRs232.asm ; ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗; ; Ó MDULO EXTERIOR RS232 ; ; −−−−−−−−−−−−−−−−−−−−− ; ; ; ; ALAN COHN ( 1 3 7 0 3 3 ) − ROSSANA MORALES ( 6 7 7 5 6 ) ; ; UNIVERSIDAD ORT URUGUAY ; ; ÑAO 2 0 0 7 ; ; ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗∗ ∗; list p=16f628A #i n c l u d e <p16F628A . i n c > errorlevel −302 ; ; l i s t d i r e c t i v e to d e f i n e p r oc e ss o r processor s p e c i f i c variable d ef i ni t io n s ; suppress m essage 3 0 2 fr om list file CONFIG CP OFF & DATA CP OFF & LVP OFF & BOREN OFF & MCLRE ON & WDT OFF & PWRTE ON & INTOSC OSC NOCLKOUT ; ∗ ∗ ∗ ∗ ∗ VARIABLE DEFINITIONS w temp EQU 0 x71 status temp EQU 0 x72 contador bytes EQU 0 x21 aux EQU 0 x22 EQU 0 x23 dato rs232 p or l a UART EQU 0 x24 flag rs232 address EQU 0 x25 exteriores address dec EQU 0 x26 address uni EQU 0 x27 address EQU 0 x28 direccion rs2321 llega EQU 0 x29 direccion rs2322 que l l e g a EQU 0x2A intento rs232 comando rs232 EQU 0x2B parametro rs2321 EQU 0x2C llega EQU 0x2D parametro rs2322 llega paridad rs232 EQU 0x2E 0x2F p a r i d a d c a l c u l a d a EQU d e l m en saje ; ; ; ; ; v a r i a b l e u sed f o r c o n t e x t s a v i n g v a r i a b l e u sed f o r c o n t e x t s a v i n g v a r i a b l e que c u e n t a l o s b y t e s que s e r e c i b e n v a r i a b l e que gu ar d a e l b y t e IR a t r a s m i t i r v a r i a b l e u sad a p a r a g u a r d a r e l d a t o r s 2 3 2 r e c i b i d o ; ; v a r i a b l e que a v i s a cuando s e p r o d u c e una i n t de Rx v a r i a b l e que gu ar d a l a ó d i r e c c i n de l o s ómdulos ; ; v a r i a b l e que gu ar d a en ASCII l a s v a r i a b l e que gu ar d a en ASCII l a s ; v a r i a b l e que gu ar d a el p r i m e r b y t e de l a ; v a r i a b l e que gu ar d a el segu n d o b y t e de l a ; ; ; v a r i a b l e que gu ar d a v a r i a b l e que gu ar d a v a r i a b l e que gu ar d a la el el e l b y t e de i n t e n t o que l l e g a b y t e d e l comando que l l e g a p r i m e r b y t e d e l áp ar m et r o que ; v a r i a b l e que gu ar d a el p r i m e r b y t e d e l áp ar m et r o que ; ; v a r i a b l e que gu ar d a v a r i a b l e que gu ar d a el el b y t e de p a r i d a d que l l e g a v a l o r de l a p a r i d a d c a l c u l a d a decenas d e l address unidades d e l address que address 173 ANEXO C. CÓDIGOS FUENTES 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 contador errores EQU mismo m en saje EQU tipo modulo EQU numero serie ómdulo e x t e r i o r 0 x30 ; v a r i a b l e que c u e n t a los e r r o r e s de p a r i d a d de un 0 x31 0 x32 ; ; v a r i a b l e que gu ar d a v a r i a b l e que gu ar d a e l t i p o d e l ómdulo e x t e r i o r e l únmero de s e r i e p r o p i o d e l ; ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗∗ ∗ ∗∗ ∗∗ ∗ ∗∗ ∗ ∗∗ ∗ ∗∗ ∗ ∗∗ ∗ ∗∗ ∗ ∗∗ ∗ ∗∗ ∗∗ ∗ ∗∗ ∗ ∗∗ ∗ ∗∗ ∗ ∗∗ ∗ ∗∗ ∗ ∗∗ ∗∗ ∗ ∗∗ ∗ ∗∗ ∗ ∗∗ ∗ ;−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ; COMIENZO DEL PROGRAMA ;−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ORG goto 0 x000 main ; processor reset ; go t o b e g i n n i n g ORG 0 x004 ; interrupt vector vector o f program location ;−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ; MANEJADOR DE INTERRUPCIONES ;−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− movwf w temp ; save o f f c u r r e n t W re g i ste r c o n t e n t s movf STATUS, w ; move s t a t u s r e g i s t e r i n t o W r e g i s t e r ; s a v e o f f c o n t e n t s o f STATUS r e g i s t e r movwf s t a t u s t e m p b t f s c PIR1 , RCIF goto Isr T0 ; RX i n t e r r u m p i o ? Fin isr movf status temp ,w movwf STATUS swap f w temp , f swap f w temp , w retfie ; ; r e t r i e v e cop y o f STATUS r e g i s t e r r e s t o r e p r e− i s r STATUS r e g i s t e r c o n t e n t s ; r e s t o r e p r e− i s r W r e g i s t e r ; return from i n t e r r u p t ; −−−−− ISR ó r e c e p c i n USART −−−−− Isr T0 bsf flag rs232 ,0 movf RCREG,W ; movwf d a t o r s 2 3 2 goto Fin isr contents ; s e t e a e l b i t 0 en 1 l e e l o que l l e g a y l o gu ar d a en W ;−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ; PROGRAMA PRINCIPAL ;−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− main ;−−−−−− I n i c i a l i z a c i o n movlw 0 x21 movwf FSR otro clrf INDF incf FSR, 1 movlw 0 x32 x o r w f FSR, 0 memoria b t f s s STATUS, 2 goto otro ;−−−−−− S e t e o s Seteos de v a r i a b l e s −−− ; e s c r i b e 2 1 h en W ; borra l a ó d i r e c c i n de memoria que á e s t en INDF ; e s c r i b e 3 2 h en W ; compara que s e hayan b o r r a d o t o d a s las d i r e c c i o n e s de c o r r e s p o n d i e n t e s −−−−−− ;−−−−−− S e t e o d e l p e r i f e r i c o RS−232 −−−−−− bsf STATUS, RP0 ; i r a l b an co 1 movlw d ’ 25 ’ ; 9 6 0 0 b a u d i o s ( 4 MHz, BRGH=1) movwf SPBRG movlw b ’ 00100100 ’ movwf TXSTA bcf STATUS, RP0 ; i r a l b an co 0 movlw b ’ 10010000 ’ ; SPEN= 1 , CREN=1 movwf RCSTA ; h a b i l i t a e l puerto s e r i e y la recepcion continua movf RCREG,W ; l e e 2 v e c e s e l RCREG p or s i h a b i a b a s u r a movf RCREG,W ;−−−−−− S e t e o s de p u e r t o s de I /O −−−−− movlw 0x2F ; pone un 0 0 1 0 1 1 1 1 en W bsf STATUS, RP0 ; i r a l b an co 1 movwf TRISA ; RA0−RA1−RA2−RA3−RA5 p i n e s de e n t r a d a , RA4−RA6−RA7 p i n e s de salida movlw 0 x02 ; pone un 0 0 0 0 0 0 1 0 en W movwf TRISB ; RB1/Rx p i n de e n t r a d a , RB0−RB2−RB3−RB4−RB5−RB6−RB7 p i n e s de s a l i d a bcf STATUS, RP0 ; i r a l b an co 0 movlw 0 x7 ; ap aga c o m p a r a d o r e s movwf CMCON bcf PORTA, 7 ; p o n e r en ” 0 ” e l MAX485 p a r a h a b i l i t a r l a ó r e c e p c i n ( p i n DE) bcf PORTB, 7 ; s e t e a r RB7 en e s t a d o b a j o 174 ANEXO C. CÓDIGOS FUENTES 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 ;−−−−− ó D e c l a r a c i n d e l movlw 0 x31 movwf t i p o m o d u l o movlw 0 x42 movwf n u m e r o s e r i e t i p o de ómdulo e x t e r i o r y únmero de ; mueve un 3 1 h ( 1 ) a W ; mueve W a t i p o m o d u l o ; pone un 4 h (B) en W ; mueve W a n u m e r o s e r i e ;−−−−− ó V e r i f i c a c i n d e l a d d r e s s R ab b i t call Verificar address ;−−−−− ó I n i c i a l i z a c i n bcf PORTB, 3 bcf PORTB, 4 de p u e r t o s propio s e r i e −−−−− d e l ómdulo e x t e r i o r y ı́ en vo de ó i d e n t i f i c a c i n p a r a p r e p a r a r s e p a r a l a ó r e c e p c i n ; p o n e r a ” 0 ” e l RB3 ; p o n e r a ” 0 ” e l RB4 d e l m en saje al d e l R ab b i t ;−−−−−− H a b i l i t a c i o n de i n t e r r u p c i o n e s −−− bsf INTCON, 7 ; h a b i l i t a l a s i n t e r r u p c i o n e s − GIE bsf INTCON, PEIE ; h abil ita interrupcion pe r i f e ri c a bsf STATUS, RP0 ; i r a l b an co 1 bsf PIE1 , RCIE ; h a b i l i t a i n t e r r u p c i o n de r e c e p c i o n de USART bcf STATUS, RP0 ; i r a l b an co 0 Loop principal btfsc flag rs232 ,0 call Recibir goto Loop principal ; Rx i n t e r r u m p i o ? ; loop forever ;−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ; SUBRUTINAS PARA LA ÓRECEPCIN Y PROCESAMIENTO DEL MENSAJE ;−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ;−−−−−− S u b r u t i n a que r e c i b e Recibir clrf flag rs232 movlw 0 x20 xorwf d ato rs232 , 0 b t f s c STATUS, 2 goto Procesar movlw 0 x45 xorwf d ato rs232 , 0 b t f s c STATUS, 2 goto Desechar movlw 0 x50 xorwf d ato rs232 , 0 b t f s c STATUS, 2 goto Desechar movlw 0 x52 xorwf d ato rs232 , 0 b t f s c STATUS, 2 goto Desechar movlw xorwf btfsc goto movlw xorwf btfsc goto movlw xorwf btfsc goto movlw xorwf btfsc goto movlw xorwf btfsc goto movlw xorwf btfsc goto 0 x00 contador bytes STATUS, 2 es direccion 1 0 x01 contador bytes STATUS, 2 es direccion 2 0 x02 contador bytes STATUS, 2 es intento 0 x03 contador bytes STATUS, 2 es com an d o 0 x04 contador bytes STATUS, 2 es parametro 1 0 x05 contador bytes STATUS, 2 es parametro 2 el m en saje y gu ar d a s u s p a r t e s en l o s campos correspondientes ; borrar f lag r s232 ; mueve un 2 0 h a W ( f i n de ı́ l n e a ) ; l o compara con e l d a t o r s 2 3 2 ; P r o c e s a r l a trama r e c i b i d a ; mueve un 4 5 h a W ( ”E” ) ; l o compara con e l d a t o r s 2 3 2 ; D e s e c h a r l a ó i n f o r m a c i n que v i e n e é d e s p u s ; mueve un 5 0 h a W ( ”P” ) ; l o compara con e l d a t o r s 2 3 2 ; D e s e c h a r l a ó i n f o r m a c i n que v i e n e é d e s p u s ; mueve un 5 2 h a W ( ”R” ) ; l o compara con e l d a t o r s 2 3 2 ; Desechar l a ó i n f o r m a c i n que v i e n e é d e s p u s ,0 ; mueve un 0 h a W ; l o compara con l a variable contador bytes ,0 ; mueve un 1 h a W ; l o compara con l a variable contador bytes ,0 ; mueve un 2 h a W ; l o compara con l a variable contador bytes ,0 ; mueve un 3 h a W ; l o compara con l a variable contador bytes ,0 ; mueve un 4 h a W ; l o compara con l a variable contador bytes ,0 ; mueve un 5 h a W ; l o compara con l a variable contador bytes ;−−−−− Guarda e l é s p t i m o b y t e que l l e g a en l a v a r i a b l e p a r i d a d r s 2 3 2 ; mueve d a t o r s 2 3 2 a W movf dato rs232 ,0 movwf p a r i d a d r s 2 3 2 ; mueve W a p a r i d a d r s 2 3 2 clrf contador bytes ; limpia variable contador bytes return ;−−−−− Guarda e l p r i m e r b y t e que es direccion 1 movf dato rs232 ,0 movwf d i r e c c i o n r s 2 3 2 1 incf contador bytes ,1 return llega en l a variable direccion rs2321 ; mueve d a t o r s 2 3 2 a W ; mueve W a d i r e c c i o n r s 2 3 2 1 ; incrementa l a v a r i a b l e c on t ad or b y t e s 175 ANEXO C. CÓDIGOS FUENTES 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 ;−−−−− Guarda e l segu n d o b y t e que l l e g a en l a v a r i a b l e d i r e c c i o n r s 2 3 2 2 es direccion 2 ; mueve d a t o r s 2 3 2 a W movf dato rs232 ,0 ; mueve W a d i r e c c i o n r s 2 3 2 2 movwf d i r e c c i o n r s 2 3 2 2 incf contador bytes ,1 ; incrementa l a v a r i a b l e c on t ad or b y t e s return ;−−−−− Guarda e l t e r c e r b y t e que es intento movf dato rs232 ,0 movwf i n t e n t o r s 2 3 2 incf contador bytes ,1 return llega ;−−−−− Guarda e l c u a r t o b y t e que es com an d o movf dato rs232 ,0 movwf c o m a n d o r s 2 3 2 incf contador bytes ,1 return llega ;−−−−− Guarda e l q u i n t o b y t e que es parametro 1 movf dato rs232 ,0 movwf p a r a m e t r o r s 2 3 2 1 incf contador bytes ,1 return llega ;−−−−− Guarda e l s e x t o b y t e que es parametro 2 movf dato rs232 ,0 movwf p a r a m e t r o r s 2 3 2 2 incf contador bytes ,1 return en l a variable intento rs232 ; mueve d a t o r s 2 3 2 a W ; mueve W a i n t e n t o ; incrementa l a v a r i a b l e en l a variable contador bytes comando rs232 ; mueve d a t o r s 2 3 2 a W ; mueve W a c o m a n d o r s 2 3 2 ; incrementa l a v a r i a b l e c on t ad or b y t e s en l a variable parametro rs2321 ; mueve d a t o r s 2 3 2 a W ; mueve W a p a r a m e t r o r s 2 3 2 1 ; incrementa l a v a r i a b l e c on t ad or b y t e s llega en l a variable parametro rs2322 ; mueve d a t o r s 2 3 2 a W ; mueve W a p a r a m e t r o r s 2 3 2 2 ; incrementa l a v a r i a b l e c on t ad or b y t e s ;−−−− D esech a l o que s i g u e é d e s p u s de l a s n o t i f i c a c i o n e s Desechar ; Rx i n t e r r u m p i o ? btfsc flag rs232 ,0 goto Recibir desechar goto Desechar ; Esperar para r e c i b i r Recibir desechar clrf flag rs232 movlw 0xA xorwf d ato rs232 , 0 b t f s c STATUS, 2 return goto Desechar ;−−−−− Se f i j a s i e l m en saje Procesar bcf INTCON, PEIE clrf contador bytes movf address dec ,0 xorwf d i r e c c i o n r s 2 3 2 1 , 0 b t f s s STATUS, 2 goto Volver recibir movf address uni ,0 xorwf d i r e c c i o n r s 2 3 2 2 , 0 b t f s s STATUS, 2 goto Volver recibir ; borrar f lag r s232 ; mueve un Ah a W ( f i n de ı́ l n e a ) ; l o compara con e l d a t o r s 2 3 2 e s p a r aé l comparando d i r e c c i o n e s ; deshabilita interrupcion p e ri f e r i c a ; limpia variable contador bytes ; mueve a d d r e s s d e c a W ; l o compara con l a v a r i a b l e d i r e c c i o n r s 2 3 2 1 ; mueve a d d r e s s u n i a W ; l o compara con l a v a r i a b l e ;−−−−− Se f i j a s i e l comando e s c o n o c i d o Bu scar com an d o movlw 0 x41 ; mueve un 4 2 h ( A) x o r w f com an d o r s232 , 0 ; l o compara b t f s c STATUS, 2 goto Verificar paridad movlw 0 x52 ; mueve un 5 2 h ( R) x o r w f com an d o r s232 , 0 ; l o compara b t f s c STATUS, 2 goto Verificar paridad movlw 0 x53 ; mueve un 5 3 h ( S ) x o r w f com an d o r s232 , 0 ; l o compara b t f s c STATUS, 2 goto Verificar paridad movlw 0 x55 ; mueve un 5 5 h ( U) ; l o compara x o r w f com an d o r s232 , 0 b t f s c STATUS, 2 goto Verificar paridad direccion rs2322 a W con l a variable comando rs232 a W con l a variable comando rs232 a W con l a variable comando rs232 a W con l a variable comando rs232 ;−−−−− V e r i f i c a s i e l campo i n t e n t o á e s t d e n t r o de l o s á p a r m e t r o s Desconocido error paridad movlw 0 x32 ; mover un 0 x32 ( 2 ) a W su b wf i n t e n t o r s 2 3 2 , 0 ; restar W a intento rs232 b t f s c STATUS, 1 ; v e r i f i c a r s i el resultado es p os it i v o goto Encender alarma clrf direccion rs2321 ; limpia variable direccion rs2321 176 ANEXO C. CÓDIGOS FUENTES 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 clrf direccion rs2322 clrf intento rs232 clrf comando rs232 clrf parametro rs2321 clrf parametro rs2322 clrf paridad rs232 bsf INTCON, PEIE return ; ; ; ; ; ; ;−−−−− V u el ve a e s t a r a t e n t a a l a Volver recibir clrf direccion rs2321 clrf direccion rs2322 clrf intento rs232 clrf comando rs232 clrf parametro rs2321 clrf parametro rs2322 clrf paridad rs232 bsf INTCON, PEIE return limpia variable direccion rs2322 limpia variable intento rs232 l i m p i a v a r i a b l e comando rs232 limpia v a ri a bl e parametro rs2321 limpia v a ri a bl e parametro rs2322 limpia variable paridad rs232 ; h a b i l i t a ó i n t e r r u p c i n é p e r i f r i c a ó r e c e p c i n ; ; ; ; ; ; ; de un nuevo b y t e limpia variable direccion rs2321 limpia variable direccion rs2322 limpia variable intento rs232 l i m p i a v a r i a b l e comando rs232 limpia v a ri a bl e parametro rs2321 limpia v a ri a bl e parametro rs2322 limpia variable paridad rs232 ; h a b i l i t a ó i n t e r r u p c i n é p e r i f r i c a ;−−−−− E n c i e n d e l a al ar m a de ó v i o l a c i n de l a r e g l a de l o s 3 i n t e n t o s ( l e d ) Encender alarma bsf PORTA, 4 ; s e t a r RA4 en e s t a d o a l t o clrf direccion rs2321 ; limpia variable direccion rs2321 ; limpia variable direccion rs2322 clrf direccion rs2322 clrf intento rs232 ; limpia variable intento rs232 ; l i m p i a v a r i a b l e comando rs232 clrf comando rs232 ; limpia v a ri a bl e parametro rs2321 clrf parametro rs2321 clrf parametro rs2322 ; limpia v a ri a bl e parametro rs2322 ; limpia variable paridad rs232 clrf paridad rs232 bsf INTCON, PEIE ; h a b i l i t a ó i n t e r r u p c i n é p e r i f r i c a return ;−−−−− á C l c u l o de p a r i d a d Verificar paridad movf direccion rs2321 ,0 ; mueve d i r e c c i o n r s 2 3 2 1 a W ; c a l c ul a l a paridad entre W y di r e c c i o n r s 2 3 2 2 2 xorwf d i r e c c i o n r s 2 3 2 2 , 0 ; c alc ul a la paridad entre W e int e n to r s 2 3 2 xorwf i n t e n t o r s 2 3 2 , 0 x o r w f com an d o r s232 , 0 ; c a l c u l a l a p ari d ad e n t r e W y comando rs232 ; c a lc ul a la paridad entre W y parametro rs2321 xorwf p arametro rs2321 , 0 xorwf p arametro rs2322 , 0 ; c a lc ul a la paridad entre W y parametro rs2322 ; gu ar d a l a p a r i d a d c a l c u l a d a en l a v a r i a b l e movwf p a r i d a d c a l c u l a d a paridad calculada ; compara p a r i d a d c a l c u l a d a con l a p a r i d a d que ó e n v i xorwf p ari d ad rs232 , 0 el rabbit b t f s c STATUS, 2 goto Decidir respuesta goto Desconocido error paridad ;−−−− D i s t i n g u e e l t i p o de r e s p u e s t a a e n v i a r ú s e g n e l comando que ó a r r i b Decidir respuesta bcf PORTA, 4 ; s e t e a r RA4 en e s t a d o b a j o bsf PORTB, 7 ; s e t e a r RB7 en e s t a d o a l t o movlw 0 x41 ; mueve un 4 2 h ( A) a W x o r w f com an d o r s232 , 0 ; l o compara con l a v a r i a b l e c o m a n d o r s 2 3 2 b t f s c STATUS, 2 goto Definir accion movlw 0 x52 ; mueve un 5 2 h ( R) a W x o r w f com an d o r s232 , 0 ; l o compara con l a v a r i a b l e c o m a n d o r s 2 3 2 b t f s c STATUS, 2 goto Resetear modulo movlw 0 x55 ; mueve un 5 5 h ( U) a W x o r w f com an d o r s232 , 0 ; l o compara con l a v a r i a b l e c o m a n d o r s 2 3 2 b t f s c STATUS, 2 goto Enviar presencia ;−−−−− H a b i l i t a l a ó r e c e p c i n Fin decidir respuesta bcf PORTB, 7 clrf direccion rs2321 clrf direccion rs2322 clrf intento rs232 clrf comando rs232 clrf parametro rs2321 clrf parametro rs2322 clrf paridad rs232 return d e l MAX485 y v u e l v e a e s p e r a r un m en saje ; ; ; ; ; ; ; ;−−−−− ı́Enva l a r e s p u e s t a y r e s e t e a Resetear modulo call Enviar respuesta call Reseteo goto Fin decidir respuesta ;−−−−− E n vi a l a r e s p u e s t a y d e f i n e Definir accion call Enviar respuesta d e l R ab b i t ; s e t e a r RB7 en e s t a d o b a j o limpia variable direccion rs2321 limpia variable direccion rs2322 limpia variable intento rs232 l i m p i a v a r i a b l e comando rs232 limpia v a ri a bl e parametro rs2321 limpia v a ri a bl e parametro rs2322 limpia variable paridad rs232 e l ómdulo e x t e r i o r l a ó a c c i n correspondiente 177 ANEXO C. CÓDIGOS FUENTES 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 call goto Ejecutar accion Fin decidir respuesta ;−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ; SUBRUTINAS PARA EL ÍENVO DE NOTIFICACIONES ;−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ;−−−−− S u b r u t i n a que e n v i a un b y t e p or l a USART E n vi o ; comf W, 0 ; complemento de W movwf TXREG ; c a r a c t e r en W bsf STATUS, RP0 ; i r a l b an co 1 testeo btfss TXSTA,TRMT ; e s p e r a h a s t a c o m p l e t a r Tx , goto testeo bcf STATUS, RP0 ; i r a l b an co 0 return testea (1) ;−−−−− S u b r u t i n a que e n v i a l a ó n o t i f i c a c i n de p r e s e n c i a a l R ab b i t Enviar presencia bcf PORTB, 5 ; pone a ” 0 ” e l p i n B d e l d e m u l t i p l e x o r bcf PORTB, 6 ; pone a ” 0 ” e l p i n A d e l d e m u l t i p l e x o r bsf PORTA, 7 ; p o n e r en 1 e l MAX485 p a r a h a b i l i t a r l a ó t r a n s m i s i n ( p i n DE) movlw ’P ’ ; mueve ’P ’ a W call E n vi o ; ı́ en va e l i d e n t i f i c a d o r de p r e s e n c i a ; mueve t i p o m o d u l o a W movf tipo modulo , 0 call E n vi o ; ı́ en va e l t i p o m o d u l o a l r a b b i t ; mueve n u m e r o s e r i e a W movf numero serie ,0 call E n vi o ; ı́ en va e l n u m e r o s e r i e a l r a b b i t movlw 0xA ; mueve e l c a r a c t e r ASCII 1 0 a W call E n vi o ; ı́ en va e l f i n de ı́ l n e a a l r a b b i t bcf PORTA, 7 ; p o n e r en ” 0 ” e l MAX485 p a r a h a b i l i t a r l a ó r e c e p c i n ( p i n DE) bsf INTCON, PEIE ; h a b i l i t a ó i n t e r r u p c i n é p e r i f r i c a goto Fin decidir respuesta ;−−−−− S u b r u t i n a que e n v i a Enviar respuesta bcf PORTB, 5 bcf PORTB, 6 bsf PORTA, 7 p i n DE) movlw ’R ’ call E n vi o movlw 0xA call E n vi o bcf PORTA, 7 p i n DE) return l a ó n o t i f i c a c i n de r e s p u e s t a al R ab b i t ; pone a ” 0 ” e l p i n B d e l d e m u l t i p l e x o r ; pone a ” 0 ” e l p i n A d e l d e m u l t i p l e x o r ; p o n e r en 1 e l MAX485 p a r a h a b i l i t a r l a ó t r a n s m i s i n ( ; mueve ’R ’ a W ; ı́ en va e l i d e n t i f i c a d o r de r e s p u e s t a ; mueve e l c a r a c t e r ASCII 1 0 a W ; ı́ en va e l f i n de ı́ l n e a a l r a b b i t ; p o n e r en ” 0 ” e l MAX485 p a r a h a b i l i t a r l a ó r e c e p c i n ( ;−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ; SUBRUTINAS QUE VERIFICAN EL ADDRESS DEL ÓMDULO ;−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ;−−−−− S u b r u t i n a que v e r i f i c a Verificar address movlw 0 x30 addwf a d d r e s s d e c , 1 addwf a d d r e s s u n i , 1 movf PORTA, 0 andlw 0xF movwf a d d r e s s b t f s c address , 3 goto fijarse resto el ; ; ; ; ; ; seguir verificando addwf a d d r e s s u n i , 1 return d e l ómdulo e x t e r i o r suma 3 0 h a a d d r e s s d e c p a r a t r a n s f o r m a r l o en ASCII suma 3 0 h a a d d r e s s u n i p a r a t r a n s f o r m a r l o en ASCII s e f i j a e s t a d o de PORTA l i m p i a l o que no e s n e c e s a r i o mueve e l e s t a d o de l o s p r i m e r o s 4 p u e r t o s a a d d r e s s b u s c a s i e l a d d r e s s á e s t e n t r e l o s p r i m e r o s 7 únmeros ; suma e l och o movlw 0 x08 goto seguir verificando ; n u eve movlw 0 x09 goto seguir verificando ; fijarse resto movlw 0 x08 xorwf address , 0 b t f s c STATUS, 2 goto och o movlw 0 x09 xorwf address , 0 b t f s c STATUS, 2 goto n u eve movlw 0x0A address v a l o r de W a l a s unidades e s c r i b e un 8 en W ; suma e l v a l o r de W a l a s unidades e s c r i b e un 9 en W ; suma e l v a l o r de W a l a s unidades ; e s c r i b e un 8 en W ; l o compara con a d d r e s s ; e s c r i b e un 9 en W ; l o compara con a d d r e s s ; e s c r i b e un 1 0 en W 178 ANEXO C. CÓDIGOS FUENTES 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 xorwf address b t f s c STATUS, 2 call address 10 movlw 0x0B xorwf address b t f s c STATUS, 2 call address 11 movlw 0x0C xorwf address b t f s c STATUS, 2 call address 12 movlw 0x0D xorwf address b t f s c STATUS, 2 call address 13 movlw 0x0E xorwf address b t f s c STATUS, 2 call address 14 movlw 0 x0F xorwf address b t f s c STATUS, 2 call address 15 return ,0 ; ; e s c r i b e un 1 1 en W ; l o compara con a d d r e s s ; e s c r i b e un 1 2 en W ; l o compara con a d d r e s s ; e s c r i b e un 1 3 en W ; l o compara con a d d r e s s ; e s c r i b e un 1 4 en W ; l o compara con a d d r e s s ; e s c r i b e un 1 5 en W ; l o compara con a d d r e s s ,0 ,0 ,0 ,0 ,0 l o compara con a d d r e s s ;−−−−− S u b r u t i n a que e s c r i b e un 1 0 en únmeros ASCII address 10 ; i n c r e m e n t a en 1 a d d r e s s d e c incf address dec ,1 return ;−−−−− S u b r u t i n a que e s c r i b e un 1 1 en únmeros ASCII address 11 incf address dec ,1 ; i n c r e m e n t a en 1 a d d r e s s d e c ; i n c r e m e n t a en 1 a d d r e s s u n i incf address uni , 1 return ;−−−−− S u b r u t i n a que e s c r i b e un 1 2 en únmeros ASCII address 12 ; i n c r e m e n t a en 1 a d d r e s s d e c incf address dec ,1 movlw 0 x02 addwf a d d r e s s u n i , 1 ; suma e l v a l o r de W a l a s u n i d a d e s return ;−−−−− S u b r u t i n a que e s c r i b e un 1 3 en únmeros ASCII address 13 ; i n c r e m e n t a en 1 a d d r e s s d e c incf address dec ,1 movlw 0 x03 addwf a d d r e s s u n i , 1 ; suma e l v a l o r de W a l a s u n i d a d e s return ;−−−−− S u b r u t i n a que e s c r i b e un 1 4 en únmeros ASCII address 14 incf address dec ,1 ; i n c r e m e n t a en 1 a d d r e s s d e c movlw 0 x04 addwf a d d r e s s u n i , 1 ; suma e l v a l o r de W a l a s u n i d a d e s return ;−−−−− S u b r u t i n a que e s c r i b e un 1 5 en únmeros ASCII address 15 incf address dec ,1 ; i n c r e m e n t a en 1 a d d r e s s d e c movlw 0 x05 ; suma e l v a l o r de W a l a s u n i d a d e s addwf a d d r e s s u n i , 1 return ;−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ; SUBRUTINAS CONCURRENTES CON LA ÓACCIN Y RESETEO DEL ÓMDULO ;−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ;−−−−− S u b r u t i n a que r e s e t a Reseteo bsf PORTA, 6 return e l ómdulo e x t e r i o r ; s e t e a RA6 en ” 1 ” ;−−−−− S u b r u t i n a que e j e c u t a l a ó a c c i n d e l ómdulo e x t e r i o r Ejecutar accion movlw 0 x30 ; mueve un 3 0 h ( 0 ) a W ; l o compara con l a v a r i a b l e xorwf p arametro rs2321 , 0 b t f s c STATUS, 2 goto comparar siguiente 0 movlw 0 x31 ; mueve un 3 1 h ( 1 ) a W ; l o compara con l a v a r i a b l e xorwf p arametro rs2321 , 0 b t f s c STATUS, 2 goto comparar siguiente 1 movlw 0 x32 ; mueve un 3 2 h ( 2 ) a W ; l o compara con l a v a r i a b l e xorwf p arametro rs2321 , 0 b t f s c STATUS, 2 goto comparar siguiente 2 parametro rs2321 parametro rs2321 parametro rs2321 179 ANEXO C. CÓDIGOS FUENTES 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 ;−−−−− Compara e l segu n d o comparar siguiente 3 movlw 0 x30 xorwf p arametro rs2322 b t f s c STATUS, 2 goto Accion 30 movlw 0 x31 xorwf p arametro rs2322 b t f s c STATUS, 2 goto Accion 31 movlw 0 x32 xorwf p arametro rs2322 b t f s c STATUS, 2 goto Accion 32 b y t e d e l áp ar m et r o p r i m e r o f u e un t r e s ,0 ; mueve un 3 0 h ( 0 ) a W ; l o compara con l a variable parametro rs2322 ,0 ; mueve un 3 1 h ( 1 ) a W ; l o compara con l a variable parametro rs2321 ,0 ; mueve un 3 2 h ( 2 ) a W ; l o compara con l a variable parametro rs2321 Terminar ejecutar bcf PORTB, 5 bcf PORTB, 6 bsf INTCON, PEIE return ; pone a ” 0 ” e l p i n B d e l d e m u l t i p l e x o r ; pone a ” 0 ” e l p i n A d e l d e m u l t i p l e x o r ; h a b i l i t a ó i n t e r r u p c i n é p e r i f r i c a ;−−−−− Compara e l segu n d o b y t e comparar siguiente 0 movlw 0 x30 xorwf p arametro rs2322 , 0 b t f s c STATUS, 2 goto Terminar ejecutar movlw 0 x31 xorwf p arametro rs2322 , 0 b t f s c STATUS, 2 goto Accion 1 movlw 0 x32 xorwf p arametro rs2322 , 0 b t f s c STATUS, 2 goto Accion 2 movlw 0 x33 xorwf p arametro rs2322 , 0 b t f s c STATUS, 2 goto Accion 3 movlw 0 x34 xorwf p arametro rs2322 , 0 b t f s c STATUS, 2 goto Accion 4 movlw 0 x35 xorwf p arametro rs2322 , 0 b t f s c STATUS, 2 goto Accion 5 movlw 0 x36 xorwf p arametro rs2322 , 0 b t f s c STATUS, 2 goto Accion 6 movlw 0 x37 xorwf p arametro rs2322 , 0 b t f s c STATUS, 2 goto Accion 7 movlw 0 x38 xorwf p arametro rs2322 , 0 b t f s c STATUS, 2 goto Accion 8 movlw 0 x39 xorwf p arametro rs2322 , 0 b t f s c STATUS, 2 goto Accion 9 ;−−−−− Compara e l segu n d o comparar siguiente 1 movlw 0 x30 xorwf p arametro rs2322 b t f s c STATUS, 2 goto Accion 10 movlw 0 x31 xorwf p arametro rs2322 b t f s c STATUS, 2 goto Accion 11 movlw 0 x32 xorwf p arametro rs2322 b t f s c STATUS, 2 goto Accion 12 movlw 0 x33 xorwf p arametro rs2322 b t f s c STATUS, 2 goto Accion 13 movlw 0 x34 xorwf p arametro rs2322 b t f s c STATUS, 2 goto Accion 14 movlw 0 x35 xorwf p arametro rs2322 s a b i e n d o que e l d e l áp ar m et r o s a b i e n d o que e l ; mueve un 3 0 h ( 0 ) a W ; l o compara con l a p r i m e r o f u e un c e r o variable parametro rs2322 ; no e j e c u t a r n i n gu n a ó a c c i n ; mueve un 3 1 h ( 1 ) a W ; l o compara con l a v a r i a b l e parametro rs2321 ; mueve un 3 2 h ( 2 ) a W ; l o compara con l a variable parametro rs2321 ; mueve un 3 3 h ( 3 ) a W ; l o compara con l a variable parametro rs2321 ; mueve un 3 4 h ( 4 ) a W ; l o compara con l a variable parametro rs2321 ; mueve un 3 5 h ( 5 ) a W ; l o compara con l a variable parametro rs2321 ; mueve un 3 6 h ( 6 ) a W ; l o compara con l a variable parametro rs2321 ; mueve un 3 7 h ( 7 ) a W ; l o compara con l a variable parametro rs2321 ; mueve un 3 8 h ( 8 ) a W ; l o compara con l a variable parametro rs2321 ; mueve un 3 9 h ( 9 ) a W ; l o compara con l a variable parametro rs2321 b y t e d e l áp ar m et r o s a b i e n d o que e l p r i m e r o f u e un uno ,0 ; mueve un 3 0 h ( 0 ) a W ; l o compara con l a variable parametro rs2322 ,0 ; mueve un 3 1 h ( 1 ) a W ; l o compara con l a variable parametro rs2321 ,0 ; mueve un 3 2 h ( 2 ) a W ; l o compara con l a variable parametro rs2321 ,0 ; mueve un 3 3 h ( 3 ) a W ; l o compara con l a variable parametro rs2321 ,0 ; mueve un 3 4 h ( 4 ) a W ; l o compara con l a variable parametro rs2321 ,0 ; mueve un 3 5 h ( 5 ) a W ; l o compara con l a variable parametro rs2321 180 ANEXO C. CÓDIGOS FUENTES 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 btfsc goto movlw xorwf btfsc goto movlw xorwf btfsc goto movlw xorwf btfsc goto movlw xorwf btfsc goto STATUS, 2 Accion 15 0 x36 parametro STATUS, 2 Accion 16 0 x37 parametro STATUS, 2 Accion 17 0 x38 parametro STATUS, 2 Accion 18 0 x39 parametro STATUS, 2 Accion 19 rs2322 ,0 ; mueve un 3 6 h ( 6 ) a W ; l o compara con l a variable parametro rs2321 rs2322 ,0 ; mueve un 3 7 h ( 7 ) a W ; l o compara con l a variable parametro rs2321 rs2322 ,0 ; mueve un 3 8 h ( 8 ) a W ; l o compara con l a variable parametro rs2321 rs2322 ,0 ; mueve un 3 9 h ( 9 ) a W ; l o compara con l a variable parametro rs2321 ;−−−−− Compara e l segu n d o comparar siguiente 2 movlw 0 x30 xorwf p arametro rs2322 b t f s c STATUS, 2 goto Accion 20 movlw 0 x31 xorwf p arametro rs2322 b t f s c STATUS, 2 goto Accion 21 movlw 0 x32 xorwf p arametro rs2322 b t f s c STATUS, 2 goto Accion 22 movlw 0 x33 xorwf p arametro rs2322 b t f s c STATUS, 2 goto Accion 23 movlw 0 x34 xorwf p arametro rs2322 b t f s c STATUS, 2 goto Accion 24 movlw 0 x35 xorwf p arametro rs2322 b t f s c STATUS, 2 goto Accion 25 movlw 0 x36 xorwf p arametro rs2322 b t f s c STATUS, 2 goto Accion 26 movlw 0 x37 xorwf p arametro rs2322 b t f s c STATUS, 2 goto Accion 27 movlw 0 x38 xorwf p arametro rs2322 b t f s c STATUS, 2 goto Accion 28 movlw 0 x39 xorwf p arametro rs2322 b t f s c STATUS, 2 goto Accion 29 b y t e d e l áp ar m et r o s a b i e n d o que e l p r i m e r o f u e un d os ,0 ; mueve un 3 0 h ( 0 ) a W ; l o compara con l a variable parametro rs2322 ,0 ; mueve un 3 1 h ( 1 ) a W ; l o compara con l a variable parametro rs2321 ,0 ; mueve un 3 2 h ( 2 ) a W ; l o compara con l a variable parametro rs2321 ,0 ; mueve un 3 3 h ( 3 ) a W ; l o compara con l a variable parametro rs2321 ,0 ; mueve un 3 4 h ( 4 ) a W ; l o compara con l a variable parametro rs2321 ,0 ; mueve un 3 5 h ( 5 ) a W ; l o compara con l a variable parametro rs2321 ,0 ; mueve un 3 6 h ( 6 ) a W ; l o compara con l a variable parametro rs2321 ,0 ; mueve un 3 7 h ( 7 ) a W ; l o compara con l a variable parametro rs2321 ,0 ; mueve un 3 8 h ( 8 ) a W ; l o compara con l a variable parametro rs2321 ,0 ; mueve un 3 9 h ( 9 ) a W ; l o compara con l a variable parametro rs2321 ;−−−−− E j e c u t a ó a c c i n o n1 ( P u e r t o Accion 1 bsf PORTB, 6 goto Terminar ejecutar ;−−−−− E j e c u t a ó a c c i n o n2 ( P u e r t o Accion 2 bsf PORTB, 6 goto Terminar ejecutar ;−−−−− E j e c u t a ó a c c i n o n3 ( P u e r t o Accion 3 bsf PORTB, 6 goto Terminar ejecutar ;−−−−− E j e c u t a ó a c c i n o n4 ( P u e r t o Accion 4 bsf PORTB, 6 goto Terminar ejecutar ;−−−−− E j e c u t a ó a c c i n o n5 ( P u e r t o Accion 5 bsf PORTB, 6 goto Terminar ejecutar ;−−−−− E j e c u t a ó a c c i n o n6 ( P u e r t o s eri a l 1) ; pone a ” 1 ” e l pin A d el demultiplexor pin A d el demultiplexor pin A d el demultiplexor pin A d el demultiplexor pin A d el demultiplexor s eri a l 1) ; pone a ” 1 ” e l s eri a l 1) ; pone a ” 1 ” e l s eri a l 1) ; pone a ” 1 ” e l s eri a l 1) ; pone a ” 1 ” e l s eri a l 1) 181 ANEXO C. CÓDIGOS FUENTES 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 Accion 6 bsf goto PORTB, 6 Terminar ejecutar ;−−−−− E j e c u t a ó a c c i n o n7 ( P u e r t o Accion 7 bsf PORTB, 6 goto Terminar ejecutar ;−−−−− E j e c u t a ó a c c i n o n8 ( P u e r t o Accion 8 bsf PORTB, 6 goto Terminar ejecutar ;−−−−− E j e c u t a ó a c c i n o n9 ( P u e r t o Accion 9 bsf PORTB, 6 goto Terminar ejecutar ;−−−−− E j e c u t a ó a c c i n o n10 ( P u e r t o Accion 10 bsf PORTB, 6 goto Terminar ejecutar ; pone a ” 1 ” e l pin A d el demultiplexor pin A d el demultiplexor pin A d el demultiplexor pin A d el demultiplexor pin A d el demultiplexor s eri a l 1) ; pone a ” 1 ” e l s eri a l 1) ; pone a ” 1 ” e l s eri a l 1) ; pone a ” 1 ” e l se ri al 1) ; pone a ” 1 ” e l ;−−−−− E j e c u t a ó a c c i n o n11 ( P u e r t o s e r i a l 1 ) Accion 11 bsf PORTB, 6 ; pone a ” 1 ” e l p i n A movlw ’ S ’ ; mueve ’ S ’ a W call E n vi o ; ı́ en va e l i d e n t i f i c a d o r de movlw ’E ’ ; mueve ’E ’ a W call E n vi o ; ı́ en va e l i d e n t i f i c a d o r de movlw ’R ’ ; mueve ’R ’ a W call E n vi o ; ı́ en va e l i d e n t i f i c a d o r de movlw ’ I ’ ; mueve ’ I ’ a W call E n vi o ; ı́ en va e l i d e n t i f i c a d o r de movlw ’A ’ ; mueve ’A ’ a W call E n vi o ; ı́ en va e l i d e n t i f i c a d o r de movlw ’ L ’ ; mueve ’ L ’ a W call E n vi o ; ı́ en va e l i d e n t i f i c a d o r de movlw 0 x20 ; mueve 0 x20 a W call E n vi o ; ı́ en va e l i d e n t i f i c a d o r de movlw ’ 1 ’ ; mueve ’ 1 ’ a W call E n vi o ; ı́ en va e l i d e n t i f i c a d o r de movlw 0xA ; mueve 0 xA a W call E n vi o ; ı́ en va e l i d e n t i f i c a d o r de goto Terminar ejecutar ;−−−−− E j e c u t a ó a c c i n o n12 ( P u e r t o Accion 12 bsf PORTB, 6 goto Terminar ejecutar ;−−−−− E j e c u t a ó a c c i n o n13 ( P u e r t o Accion 13 bsf PORTB, 6 goto Terminar ejecutar ;−−−−− E j e c u t a ó a c c i n o n14 ( P u e r t o Accion 14 bsf PORTB, 6 goto Terminar ejecutar ;−−−−− E j e c u t a ó a c c i n o n15 ( P u e r t o Accion 15 bsf PORTB, 6 goto Terminar ejecutar ;−−−−− E j e c u t a ó a c c i n o n16 ( P u e r t o Accion 16 bsf PORTB, 6 goto Terminar ejecutar ;−−−−− E j e c u t a ó a c c i n o n17 ( P u e r t o Accion 17 bsf PORTB, 5 goto Terminar ejecutar ;−−−−− E j e c u t a ó a c c i n o n18 ( P u e r t o Accion 18 bsf PORTB, 5 goto Terminar ejecutar ;−−−−− E j e c u t a ó a c c i n o n19 ( P u e r t o Accion 19 bsf PORTB, 5 goto Terminar ejecutar ;−−−−− E j e c u t a ó a c c i n o n20 ( P u e r t o del demultiplexor presencia presencia presencia presencia presencia presencia presencia presencia presencia se ri al 1) ; pone a ” 1 ” e l pin A d el demultiplexor pin A d el demultiplexor pin A d el demultiplexor pin A d el demultiplexor pin A d el demultiplexor pin B d el demultiplexor pin B d el demultiplexor pin B d el demultiplexor se ri al 1) ; pone a ” 1 ” e l se ri al 1) ; pone a ” 1 ” e l se ri al 1) ; pone a ” 1 ” e l se ri al 1) ; pone a ” 1 ” e l se ri al 2) ; pone a ” 1 ” e l se ri al 2) ; pone a ” 1 ” e l se ri al 2) ; pone a ” 1 ” e l se ri al 2) 182 ANEXO C. CÓDIGOS FUENTES 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 Accion 20 bsf PORTB, 5 movlw ’ S ’ call E n vi o movlw ’E ’ call E n vi o movlw ’R ’ call E n vi o movlw ’ I ’ call E n vi o movlw ’A ’ call E n vi o movlw ’ L ’ call E n vi o movlw 0 x20 call E n vi o movlw ’ 2 ’ call E n vi o movlw 0xA call E n vi o goto Terminar ejecutar ; pone a ” 1 ” e l p i n B ; mueve ’ S ’ a W ; ı́ en va e l i d e n t i f i c a d o r de ; mueve ’E ’ a W ; ı́ en va e l i d e n t i f i c a d o r de ; mueve ’R ’ a W ; ı́ en va e l i d e n t i f i c a d o r de ; mueve ’ I ’ a W ; ı́ en va e l i d e n t i f i c a d o r de ; mueve ’A ’ a W ; ı́ en va e l i d e n t i f i c a d o r de ; mueve ’ L ’ a W ; ı́ en va e l i d e n t i f i c a d o r de ; mueve 0 x20 a W ; ı́ en va e l i d e n t i f i c a d o r de ; mueve ’ 1 ’ a W ; ı́ en va e l i d e n t i f i c a d o r de ; mueve 0 xA a W ; ı́ en va e l i d e n t i f i c a d o r de ;−−−−− E j e c u t a ó a c c i n o n21 ( P u e r t o s e r i a l 2 ) Accion 21 bsf PORTB, 5 ; pone a ” 1 ” e l p i n B movlw ’ L ’ ; mueve ’ L ’ a W call E n vi o ; ı́ en va e l i d e n t i f i c a d o r de movlw ’U ’ ; mueve ’U ’ a W call E n vi o ; ı́ en va e l i d e n t i f i c a d o r de movlw ’ Z ’ ; mueve ’ Z ’ a W call E n vi o ; ı́ en va e l i d e n t i f i c a d o r de movlw 0 x20 ; mueve 0 x20 a W call E n vi o ; ı́ en va e l i d e n t i f i c a d o r de movlw ’A ’ ; mueve ’A ’ a W call E n vi o ; ı́ en va e l i d e n t i f i c a d o r de movlw ’U ’ ; mueve ’U ’ a W call E n vi o ; ı́ en va e l i d e n t i f i c a d o r de movlw ’D ’ ; mueve ’D ’ a W call E n vi o ; ı́ en va e l i d e n t i f i c a d o r de movlw ’ I ’ ; mueve ’ I ’ a W call E n vi o ; ı́ en va e l i d e n t i f i c a d o r de movlw ’O ’ ; mueve ’O ’ a W call E n vi o ; ı́ en va e l i d e n t i f i c a d o r de movlw 0 x20 ; mueve 0 x20 a W call E n vi o ; ı́ en va e l i d e n t i f i c a d o r de movlw ’A ’ ; mueve ’A ’ a W call E n vi o ; ı́ en va e l i d e n t i f i c a d o r de movlw ’C ’ ; mueve ’C ’ a W call E n vi o ; ı́ en va e l i d e n t i f i c a d o r de movlw ’C ’ ; mueve ’C ’ a W call E n vi o ; ı́ en va e l i d e n t i f i c a d o r de movlw ’ I ’ ; mueve ’ I ’ a W call E n vi o ; ı́ en va e l i d e n t i f i c a d o r de movlw ’O ’ ; mueve ’ 0 ’ a W call E n vi o ; ı́ en va e l i d e n t i f i c a d o r de movlw ’N ’ ; mueve ’N ’ a W call E n vi o ; ı́ en va e l i d e n t i f i c a d o r de movlw ’ ! ’ ; mueve ’ ! ’ a W call E n vi o ; ı́ en va e l i d e n t i f i c a d o r de movlw ’ ! ’ ; mueve ’ ! ’ a W call E n vi o ; ı́ en va e l i d e n t i f i c a d o r de movlw 0xA ; mueve 0 xA a W call E n vi o ; ı́ en va e l i d e n t i f i c a d o r de goto Terminar ejecutar ;−−−−− E j e c u t a ó a c c i n o n22 ( P u e r t o Accion 22 bsf PORTB, 5 goto Terminar ejecutar ;−−−−− E j e c u t a ó a c c i n o n23 ( P u e r t o Accion 23 bsf PORTB, 5 goto Terminar ejecutar ;−−−−− E j e c u t a ó a c c i n o n24 ( P u e r t o Accion 24 bsf PORTB, 5 goto Terminar ejecutar ;−−−−− E j e c u t a ó a c c i n o n25 ( P u e r t o Accion 25 bsf PORTB, 5 goto Terminar ejecutar ;−−−−− E j e c u t a ó a c c i n o n26 ( P u e r t o Accion 26 bsf PORTB, 5 del demultiplexor presencia presencia presencia presencia presencia presencia presencia presencia presencia del demultiplexor presencia presencia presencia presencia presencia presencia presencia presencia presencia presencia presencia presencia presencia presencia presencia presencia presencia presencia presencia se ri al 2) ; pone a ” 1 ” e l pin B d el demultiplexor pin B d el demultiplexor pin B d el demultiplexor pin B d el demultiplexor pin B d el demultiplexor se ri al 2) ; pone a ” 1 ” e l se ri al 2) ; pone a ” 1 ” e l se ri al 2) ; pone a ” 1 ” e l se ri al 2) ; pone a ” 1 ” e l 183 ANEXO C. CÓDIGOS FUENTES 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 goto ;−−−−− E j e c u t a ó a c c i n o n27 ( P u e r t o Accion 27 bsf PORTB, 5 goto Terminar ejecutar ;−−−−− E j e c u t a ó a c c i n o n28 ( P u e r t o Accion 28 bsf PORTB, 5 goto Terminar ejecutar ;−−−−− E j e c u t a ó a c c i n o n29 ( P u e r t o Accion 29 bsf PORTB, 5 goto Terminar ejecutar ;−−−−− E j e c u t a ó a c c i n o n30 ( P u e r t o Accion 30 bsf PORTB, 5 goto Terminar ejecutar ;−−−−− E j e c u t a ó a c c i n o n31 ( P u e r t o Accion 31 bsf PORTB, 5 goto Terminar ejecutar ;−−−−− E j e c u t a ó a c c i n o n32 ( P u e r t o Accion 32 bsf PORTB, 5 goto Terminar ejecutar 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 se ri al 2) ; pone a ” 1 ” e l pin B d el demultiplexor pin B d el demultiplexor pin B d el demultiplexor pin B d el demultiplexor pin B d el demultiplexor pin B d el demultiplexor se ri al 2) ; pone a ” 1 ” e l se ri al 2) ; pone a ” 1 ” e l se ri al 2) ; pone a ” 1 ” e l se ri al 2) ; pone a ” 1 ” e l se ri al 2) ; pone a ” 1 ” e l ;−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ; INICIALIZACION DE LA EEPROM ;−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ORG DE 0 x2100 0 x00 , 0 x01 , 0 x02 , 0 x03 END C.3. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 Terminar ejecutar ; Fi n d e l programa Código ModIR.asm ; ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗; ; Ó MDULO EXTERIOR IR ; ; −−−−−−−−−−−−−−−−−− ; ; ; ; ALAN COHN ( 1 3 7 0 3 3 ) − ROSSANA MORALES ( 6 7 7 5 6 ) ; ; UNIVERSIDAD ORT URUGUAY ; ; ÑAO 2 0 0 7 ; ; ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗∗ ∗; list p=16 f 628A #i n c l u d e <p 16F628A . i n c > errorlevel −302 ; ; l i s t d i r e c t i v e to d e f i n e p r oc e ss o r processor s p e c i f i c variable d ef i ni t io n s ; suppress m essage 3 0 2 fr om CONFIG CP OFF & DATA CP OFF & LVP OFF & PWRTE ON & INTOSC OSC NOCLKOUT ; ∗ ∗ ∗ ∗ ∗ VARIABLE DEFINITIONS w temp EQU 0x 71 s t a t u s temp EQU 0x 72 veces EQU 0 x 21 en c 1 EQU 0 x 22 en c 2 EQU 0 x 23 powera EQU 0x 24 powerb EQU 0x 25 openclosea EQU 0x 26 opencloseb EQU 0x 27 playpausea EQU 0x 28 playpauseb EQU 0x 29 stopa EQU 0 x2A stopb EQU 0 x2B trackmasa EQU 0x 2C t r ackm asb EQU 0x 2D trackmenosa EQU 0x 2E t r ackm en osb EQU 0x 2F IR arribaa EQU 0x 30 arribab EQU 0x 31 abajoa EQU 0x 32 abajob EQU 0x 33 derechaa EQU 0 x 34 ; ; ; ; ; ; list BOREN OFF & file MCLRE ON & WDT OFF & ; v a r i a b l e u sed f o r c o n t e x t s a v i n g ; v a r i a b l e u sed f o r c o n t e x t s a v i n g v a r i a b l e que c u e n t a i n t e r r u p c i o n e s d e l TMR0 v a r i a b l e que gu ar d a e l p r i m e r b y t e d e l e n c a b e z a d o IR v a r i a b l e que gu ar d a e l segu n d o b y t e d e l e n c a b e z a d o IR ; v a r i a b l e que gu ar d a e l p r i m e r b y t e d e l power IR ; v a r i a b l e que gu ar d a e l segu n d o b y t e d e l power IR ; v a r i a b l e que gu ar d a e l p r i m e r b y t e d e l o p e n c l o s e IR ; v a r i a b l e que gu ar d a e l segu n d o b y t e d e l o p e n c l o s e IR ; v a r i a b l e que gu ar d a e l p r i m e r b y t e d e l p l a y p a u s e IR ; v a r i a b l e que gu ar d a e l segu n d o b y t e d e l p l a y p a u s e IR v a r i a b l e que gu ar d a e l p r i m e r b y t e d e l s t o p IR v a r i a b l e que gu ar d a e l segu n d o b y t e d e l s t o p IR ; v a r i a b l e que gu ar d a e l p r i m e r b y t e d e l t ackm as IR ; v a r i a b l e que gu ar d a e l segu n d o b y t e d e l t r a c k m a s IR ; v a r i a b l e que gu ar d a e l p r i m e r b y t e d e l t r a c k m e n o s IR ; v a r i a b l e que gu ar d a e l segu n d o b y t e d e l t r a c k m e n o s ; v a r i a b l e que gu ar d a e l p r i m e r b y t e d e l a r r i b a IR ; v a r i a b l e que gu ar d a e l segu n d o b y t e d e l a r r i b a IR ; v a r i a b l e que gu ar d a e l p r i m e r b y t e d e l a b a j o IR ; v a r i a b l e que gu ar d a e l segu n d o b y t e d e l a b a j o IR v a r i a b l e que gu ar d a e l p r i m e r b y t e d e l d e r e c h a IR 184 ANEXO C. CÓDIGOS FUENTES 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 derechab izqa izqb entera enterb menua menub cleara clearb zooma zoomb EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU 0 x 35 0 x 36 0 x 37 0x 38 0x 39 0 x3A 0 x3B 0x 3C 0x 3D 0 x3E 0 x3F ; ; ; contador EQU aux EQU dato r s 232 EQU p or l a UART f l a g r s 232 EQU address EQU exteriores EQU a d d r e s s d ec address uni EQU address d i r e c c i o n r s 2321 EQU llega d i r e c c i o n r s 2322 EQU que l l e g a EQU i n t e n t o r s 232 EQU comando r s 232 p ar am e t r o r s 2321 EQU llega p ar am e t r o r s 2322 EQU llega EQU p a r i d a d r s 232 p a r i d a d c a l c u l a d a EQU d e l m en saje EQU contador e r r o r e s mismo m en saje EQU t i p o modulo EQU numero s e r i e ómdulo e x t e r i o r EQU contador b ytes R ab b i t 0x 40 0x 41 0x 42 ; ; ; v a r i a b l e que c u e n t a l a s v e c e s que s e r o t a un b y t e v a r i a b l e que gu ar d a e l b y t e IR a t r a s m i t i r v a r i a b l e u sad a p a r a g u a r d a r e l d a t o r s 2 3 2 r e c i b i d o 0x 43 0x 44 ; ; v a r i a b l e que a v i s a cuando s e p r o d u c e una i n t de Rx v a r i a b l e que gu ar d a l a ó d i r e c c i n de l o s ómdulos 0x 45 0x 46 ; ; v a r i a b l e que gu ar d a en ASCII l a s v a r i a b l e que gu ar d a en ASCII l a s 0x 47 ; v a r i a b l e que gu ar d a el p r i m e r b y t e de l a 0x 48 ; v a r i a b l e que gu ar d a el segu n d o b y t e de l a 0x 49 0x 4A 0x 4B ; ; ; v a r i a b l e que gu ar d a v a r i a b l e que gu ar d a v a r i a b l e que gu ar d a la el el e l b y t e de i n t e n t o que l l e g a b y t e d e l comando que l l e g a p r i m e r b y t e d e l áp ar m et r o que ; ; ; ; v a r i a b l e que gu ar d a e l v a r i a b l e que gu ar d a e l v a r i a b l e que gu ar d a e l ; v a r i a b l e que gu ar d a ; v a r i a b l e que gu ar d a v a r i a b l e que gu ar d a e l v a r i a b l e que gu ar d a e l ; v a r i a b l e que gu ar d a ; v a r i a b l e que gu ar d a v a r i a b l e que gu ar d a e l v a r i a b l e que gu ar d a e l segu n d o b y t e d e l d e r e c h a IR p r i m e r b y t e d e l i z q IR segu n d o b y t e d e l i z q IR e l p r i m e r b y t e d e l e n t e r IR e l segu n d o b y t e d e l e n t e r IR p r i m e r b y t e d e l menu IR segu n d o b y t e d e l menu IR e l p r i m e r b y t e d e l c l e a r IR e l segu n d o b y t e d e l c l e a r IR p r i m e r b y t e d e l zoom IR segu n d o b y t e d e l zoom IR decenas d e l address unidades d e l address que address 0x 4C ; v a r i a b l e que gu ar d a el p r i m e r b y t e d e l áp ar m et r o que 0x 4D 0x 4E ; ; v a r i a b l e que gu ar d a v a r i a b l e que gu ar d a el el b y t e de p a r i d a d que l l e g a v a l o r de l a p a r i d a d c a l c u l a d a 0x 4F ; v a r i a b l e que c u e n t a los 0x 50 0x 51 ; ; v a r i a b l e que gu ar d a v a r i a b l e que gu ar d a e l t i p o d e l ómdulo e x t e r i o r e l únmero de s e r i e p r o p i o d e l 0x 52 ; v a r i a b l e que c u e n t a los e r r o r e s de p a r i d a d de un b y t e s que l l e g a n desde el ; ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗∗ ∗ ∗∗ ∗∗ ∗ ∗∗ ∗ ∗∗ ∗ ∗∗ ∗ ∗∗ ∗ ∗∗ ∗ ∗∗ ∗ ∗∗ ∗∗ ∗ ∗∗ ∗ ∗∗ ∗ ∗∗ ∗ ∗∗ ∗ ∗∗ ∗ ∗∗ ∗∗ ∗ ∗∗ ∗ ∗∗ ∗ ∗∗ ∗ ;−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ; COMIENZO DEL PROGRAMA ;−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ORG goto 0x 000 main ; processor reset ; go t o b e g i n n i n g ORG 0x 004 ; interrupt vector vector o f program location ;−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ; MANEJADOR DE INTERRUPCIONES ;−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− movwf w temp ; save o f f c u r r e n t W r e g i s t e r c o n t e n t s movf STATUS, w ; move s t a t u s r e g i s t e r i n t o W r e g i s t e r movwf s t a t u s temp ; s a v e o f f c o n t e n t s o f STATUS r e g i s t e r btfsc INTCON, 2 goto I s r T0 b t f s c PIR 1 , RCIF goto I s r Rx Fi n ; TMR0 i n t e r r u m p i o ? ; RX i n t e r r u m p i o ? isr movf s t a t u s temp , w movwf STATUS swap f w temp , f swap f w temp , w retfie ; −−−−− ISR t i m e r0 −−−−−− I s r T0 movlw d’205 ’ movwf TMR0 bcf INTCON, 2 incf veces , 1 goto Fi n i s r ; ; se ; ; −−−−− ISR ó r e c e p c i n USART −−−−− I s r Rx bsf f l a g r s 232 ,0 movf RCREG,W ; movwf d a t o r s 232 goto Fi n i s r ; ; r e t r i e v e cop y o f STATUS r e g i s t e r r e s t o r e p r e− i s r STATUS r e g i s t e r c o n t e n t s ; ; r e s t o r e p r e− i s r W r e g i s t e r r e t u r n fr om i n t e r r u p t contents ; cuenta 50 microseg s e e s c r i b e e l r e g i s t r o TMR0 b o r r a e l TOIF incrementa v a r i a b l e veces ; s e t e a e l b i t 0 en 1 l e e l o que l l e g a y l o gu ar d a en W 185 ANEXO C. CÓDIGOS FUENTES 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 ;−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ; PROGRAMA PRINCIPAL ;−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− main ;−−−−−− I n i c i a l i z a c i o n movlw 0 x 21 movwf FSR otro clrf INDF incf FSR, 1 movlw 0 x 52 x o r w f FSR, 0 memoria b t f s s STATUS, 2 goto otro de v a r i a b l e s −−− ; e s c r i b e 2 1 h en W ; borra l a ó d i r e c c i n de memoria que á e s t en INDF ; e s c r i b e 5 2 h en W ; compara que s e hayan b o r r a d o t o d a s las ;−−−−−− L e c t u r a de l a EEPROM y gu ar d ad o en l a RAM−−− movlw 0 x 04 ; e s c r i b e un 4 h en W movwf aux movlw 0x 22 ; e s c r i b e un 2 2 h en W movwf FSR otros movf aux , 0 ; mueve e l c o n t e n i d o de aux a W call eeprom r d movwf INDF incf FSR, 1 incf aux , 1 movlw 0 x 40 ; comprueba que s e hayan gu ar d ad o t o d o s x o r w f FSR, 0 b t f s s STATUS, 2 goto otros ;−−−−−− S e t e o s Seteos d i r e c c i o n e s de los datos c o r r e s p o n d i e n t e s −−−−−− ;−−−−−− S e t e o d e l modulo PWM−−−− clrf CCP1CON ; bsf STATUS, RP0 movlw d ’26 ’ ; movwf PR2 ; bcf TRISB , 3 bcf STATUS, RP0 movlw 0xD ; movwf CCPR1L ; movlw b ’ 0 0 0 0 0 1 0 0 ’ ; movwf T2CON ; se s e l i m p i a e l r e g i s t r o CCP1CON ; i r a l b an co 1 s e t e a d e l p e r i o d o d e l PWM a 3 8 KHz s e e s c r i b e e l PR2 ; s e h a c e e l p i n CCP1 de s a l i d a l i m p i a n d o ; i r a l b an co 0 s e t e a d e l c i c l o de t r a b a j o d e l PWM a l 5 0 % s e e s c r i b e e l CCPR1L s e t e o s d e l TMR2 ON y l a p r e e s c a l a 1 : 1 e s c r i b e e l r e g i s t r o T2CON e l TRISB<3> ;−−−−−− S e t e o d e l p e r i f e r i c o RS−232 −−−−−− bsf STATUS, RP0 ; i r a l b an co 1 movlw d ’ 2 5 ’ ; 9 6 0 0 b a u d i o s ( 4 MHz, BRGH=1) movwf SPBRG movlw b ’ 0 0 1 0 0 1 0 0 ’ movwf TXSTA bcf STATUS, RP0 ; i r a l b an co 0 movlw b ’ 1 0 0 1 0 0 0 0 ’ ; SPEN= 1 , CREN=1 movwf RCSTA ; h a b i l i t a e l puerto s e r i e y la recepcion continua movf RCREG,W ; l e e 2 v e c e s e l RCREG p or s i h a b i a b a s u r a movf RCREG,W ;−−−−−− S e t e o s de p u e r t o s de I /O −−−−− movlw 0x 2F ; pone un 1 0 1 1 1 1 en W bsf STATUS, RP0 ; i r a l b an co 1 movwf TRISA ; RA0−RA1−RA2−RA3−RA5 p u e r t o s de e n t r a d a , RA4−RA6−RA7 p u e r t o s de s a l i d a movlw 0 x 02 ; pone un 0 0 0 0 0 0 1 0 en W movwf TRISB ; RB1/Rx p i n de e n t r a d a , RB0−RB2−RB3−RB4−RB5−RB6−RB7 p i n e s de s a l i d a bcf STATUS, RP0 ; i r a l b an co 0 movlw 0 x7 ; ap aga c o m p a r a d o r e s movwf CMCON bcf PORTA, 7 ; p o n e r en ” 0 ” e l MAX4 8 5 p a r a h a b i l i t a r l a ó r e c e p c i n ( p i n DE) bcf PORTB, 7 ; s e t e a r RB7 en e s t a d o b a j o ;−−−−− ó D e c l a r a c i n d e l movlw 0 x 30 movwf t i p o modulo movlw 0 x 41 movwf numero s e r i e t i p o de ómdulo e x t e r i o r y únmero de ; mueve un 3 0 h ( 0 ) a W ; mueve W a t i p o modulo ; pone un 4 1 h (A) en W ; mueve W a numero s e r i e ;−−−−− ó V e r i f i c a c i n d e l a d d r e s s R ab b i t call V e r i f i c a r address propio s e r i e −−−−− d e l ómdulo e x t e r i o r y ı́ en vo de ó i d e n t i f i c a c i n al ;−−−−−− H a b i l i t a c i o n de i n t e r r u p c i o n e s −−− bsf INTCON, 7 ; h a b i l i t a l a s i n t e r r u p c i o n e s − GIE bsf INTCON, PEIE ; h abil ita interrupcion pe r i f e ri c a 186 ANEXO C. CÓDIGOS FUENTES 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 bsf bsf bcf STATUS, RP0 PIE 1 , RCIE STATUS, RP0 ; Loop p r i n c i p a l b t f s c f l a g r s 232 ,0 call Recibir goto Loop p r i n c i p a l ir ; ; a l b an co 1 h a b i l i t a i n t e r r u p c i o n de r e c e p c i o n de USART i r a l b an co 0 ; Rx i n t e r r u m p i o ? ; loop forever ;−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ; SUBRUTINAS PARA LA ÓRECEPCIN Y PROCESAMIENTO DEL MENSAJE ;−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ;−−−−−− S u b r u t i n a que r e c i b e Recibir clrf f l a g r s 232 movlw 0 x 20 xorwf dato r s 232 ,0 b t f s c STATUS, 2 goto Procesar movlw 0 x 45 xorwf dato r s 232 ,0 b t f s c STATUS, 2 goto Desechar movlw 0 x 50 xorwf dato r s 232 ,0 b t f s c STATUS, 2 goto Desechar movlw 0 x 52 xorwf dato r s 232 ,0 b t f s c STATUS, 2 goto Desechar movlw xorwf btfsc goto movlw xorwf btfsc goto movlw xorwf btfsc goto movlw xorwf btfsc goto movlw xorwf btfsc goto movlw xorwf btfsc goto 0 x 00 contador bytes STATUS, 2 es di r e c c io n 1 0 x 01 contador bytes STATUS, 2 es di r e c c io n 2 0 x 02 contador bytes STATUS, 2 es intento 0 x 03 contador bytes STATUS, 2 e s comando 0 x 04 contador bytes STATUS, 2 e s p ar am e t r o 1 0 x 05 contador bytes STATUS, 2 e s p ar am e t r o 2 el m en saje y gu ar d a s u s p a r t e s en l o s campos correspondientes ; b o r r a r f l a g r s 232 ; mueve un 2 0 h a W ( f i n de ı́ l n e a ) ; l o compara con e l d a t o r s 232 ; P r o c e s a r l a trama r e c i b i d a ; mueve un 4 5 h a W ( ” E” ) ; l o compara con e l d a t o r s 232 ; D e s e c h a r l a ó i n f o r m a c i n que v i e n e é d e s p u s ; mueve un 5 0 h a W ( ” P” ) ; l o compara con e l d a t o r s 232 ; D e s e c h a r l a ó i n f o r m a c i n que v i e n e é d e s p u s ; mueve un 5 2 h a W ( ” R” ) ; l o compara con e l d a t o r s 232 ; Desechar l a ó i n f o r m a c i n que v i e n e é d e s p u s ,0 ; mueve un 0 h a W ; l o compara con l a variable contador bytes ,0 ; mueve un 1 h a W ; l o compara con l a variable contador bytes ,0 ; mueve un 2 h a W ; l o compara con l a variable contador bytes ,0 ; mueve un 3 h a W ; l o compara con l a variable contador bytes ,0 ; mueve un 4 h a W ; l o compara con l a variable contador bytes ,0 ; mueve un 5 h a W ; l o compara con l a variable contador bytes ;−−−−− Guarda e l é s p t i m o b y t e que l l e g a en l a v a r i a b l e p a r i d a d r s 232 movf dato r s 232 ,0 ; mueve d a t o r s 2 3 2 a W movwf p a r i d a d r s 232 ; mueve W a p a r i d a d r s 232 clrf contador b ytes ; l i m p i a v a r i a b l e contador b ytes return ;−−−−− Guarda e l p r i m e r b y t e que es d ir ec ci on 1 movf dato r s 232 ,0 movwf d i r e c c i o n r s 2321 incf contador bytes , 1 return llega en l a variable direccion r s 2321 ; mueve d a t o r s 2 3 2 a W ; mueve W a d i r e c c i o n r s 2321 ; incrementa l a v a r i a b l e contador bytes ;−−−−− Guarda e l segu n d o b y t e que l l e g a en l a v a r i a b l e d i r e c c i o n r s 2322 es d ir ec ci on 2 movf dato r s 232 ,0 ; mueve d a t o r s 2 3 2 a W movwf d i r e c c i o n r s 2322 ; mueve W a d i r e c c i o n r s 2322 ; incrementa l a v a r i a b l e contador bytes incf contador bytes , 1 return ;−−−−− Guarda e l t e r c e r b y t e que es intento movf dato r s 232 ,0 movwf i n t e n t o r s 232 incf contador bytes , 1 return llega ;−−−−− Guarda e l c u a r t o e s comando movf dato r s 232 ,0 llega b y t e que en l a variable intento ; mueve d a t o r s 2 3 2 a W ; mueve W a i n t e n t o ; incrementa l a v a r i a b l e en l a r s 232 contador bytes v a r i a b l e comando r s 232 ; mueve d a t o r s 2 3 2 a W 187 ANEXO C. CÓDIGOS FUENTES 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 movwf comando r s 232 incf contador bytes , 1 return ; mueve W a comando r s 232 ; incrementa l a v a r i a b l e contador ;−−−−− Guarda e l q u i n t o b y t e que e s p ar am e t r o 1 movf dato r s 232 ,0 movwf p ar am et r o r s 2321 incf contador bytes , 1 return ;−−−−− Guarda e l s e x t o b y t e que e s p ar am e t r o 2 movf dato r s 232 ,0 movwf p ar am et r o r s 2322 incf contador bytes , 1 return llega en l a variable r s 2321 p ar am e t r o ; mueve d a t o r s 2 3 2 a W ; mueve W a p ar am et r o r s 2321 ; incrementa l a v a r i a b l e contador llega en l a variable p ar am et r o bytes bytes r s 2322 ; mueve d a t o r s 2 3 2 a W ; mueve W a p ar am et r o r s 2322 ; incrementa l a v a r i a b l e contador bytes ;−−−− D esech a l o que s i g u e é d e s p u s de l a s n o t i f i c a c i o n e s Desechar b t f s c f l a g r s 232 ,0 ; Rx i n t e r r u m p i o ? goto Recibir desechar goto Desechar ; Esperar para r e c i b i r Recibir desechar clrf f l a g r s 232 movlw 0xA xorwf dato r s 232 ,0 b t f s c STATUS, 2 return goto Desechar ;−−−−− Se f i j a s i e l m en saje Procesar bcf INTCON, PEIE clrf contador b ytes movf a d d r e s s dec , 0 xorwf d i r e c c i o n r s 2321 ,0 b t f s s STATUS, 2 goto Volver r e c i b i r movf ad d r ess uni , 0 xorwf d i r e c c i o n r s 2322 ,0 b t f s s STATUS, 2 goto Volver r e c i b i r ; b o r r a r f l a g r s 232 ; mueve un Ah a W ( f i n de ı́ l n e a ) ; l o compara con e l d a t o r s 232 e s p a r aé l comparando d i r e c c i o n e s ; deshabilita interrupcion p e ri f e r i c a ; l i m p i a v a r i a b l e contador b ytes ; mueve a d d r e s s d ec a W ; l o compara con l a v a r i a b l e d i r e c c i o n r s 2321 ; mueve a d d r e s s u n i a W ; l o compara con l a v a r i a b l e r s 2322 ;−−−−− Se f i j a s i e l comando e s c o n o c i d o Bu scar comando movlw 0 x 41 ; mueve un 4 2 h ( A) ; l o compara x o r w f comando r s 2 3 2 , 0 b t f s c STATUS, 2 goto V e r i f i c a r paridad movlw 0 x 52 ; mueve un 5 2 h ( R) x o r w f comando r s 2 3 2 , 0 ; l o compara b t f s c STATUS, 2 goto V e r i f i c a r paridad movlw 0 x 53 ; mueve un 5 3 h ( S ) x o r w f comando r s 2 3 2 , 0 ; l o compara b t f s c STATUS, 2 goto V e r i f i c a r paridad movlw 0 x 55 ; mueve un 5 5 h ( U) x o r w f comando r s 2 3 2 , 0 ; l o compara b t f s c STATUS, 2 goto V e r i f i c a r paridad direccion a W con l a v a r i a b l e comando r s 232 a W con l a v a r i a b l e comando r s 232 a W con l a v a r i a b l e comando r s 232 a W con l a v a r i a b l e comando r s 232 ;−−−−− V e r i f i c a s i e l campo i n t e n t o á e s t d e n t r o de l o s á p a r m e t r o s Desconocido e r r o r pari dad movlw 0 x 32 ; mover un 0 x 3 2 ( 2 ) a W ; r e s t a r W a i n t e n t o r s 232 su b wf i n t e n t o r s 2 3 2 , 0 b t f s c STATUS, 1 ; v e r i f i c a r s i el resultado es p os it i v o goto E n cen d er al ar m a clrf d i r e c c i o n r s 2321 ; l i m p i a v a r i a b l e d i r e c c i o n r s 2321 clrf d i r e c c i o n r s 2322 ; l i m p i a v a r i a b l e d i r e c c i o n r s 2322 clrf i n t e n t o r s 232 ; l i m p i a v a r i a b l e i n t e n t o r s 232 ; l i m p i a v a r i a b l e comando r s 232 clrf comando r s 232 ; l i m p i a v a r i a b l e p ar am et r o r s 2321 clrf p ar am e t r o r s 2321 clrf p ar am e t r o r s 2322 ; l i m p i a v a r i a b l e p ar am et r o r s 2322 clrf p a r i d a d r s 232 ; l i m p i a v a r i a b l e p a r i d a d r s 232 bsf INTCON, PEIE ; h a b i l i t a ó i n t e r r u p c i n é p e r i f r i c a return ;−−−−− V u el ve a e s t a r a t e n t a a l a Volver r e c i b i r clrf d i r e c c i o n r s 2321 clrf d i r e c c i o n r s 2322 clrf i n t e n t o r s 232 clrf comando r s 232 clrf p ar am e t r o r s 2321 clrf p ar am e t r o r s 2322 ó r e c e p c i n ; ; ; ; ; ; limpia limpia limpia limpia limpia limpia de un nuevo b y t e v a r i a b l e d i r e c c i o n r s 2321 v a r i a b l e d i r e c c i o n r s 2322 v a r i a b l e i n t e n t o r s 232 v a r i a b l e comando r s 232 v a r i a b l e p ar am et r o r s 2321 v a r i a b l e p ar am et r o r s 2322 188 ANEXO C. CÓDIGOS FUENTES 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 clrf p a r i d a d r s 232 bsf INTCON, PEIE return ; l i m p i a v a r i a b l e p a r i d a d r s 232 ; h a b i l i t a ó i n t e r r u p c i n é p e r i f r i c a ;−−−−− E n c i e n d e l a al ar m a de ó v i o l a c i n de l a r e g l a de l o s 3 i n t e n t o s ( l e d ) E n cen d er al ar m a bsf PORTA, 4 ; s e t a r RA4 en e s t a d o a l t o clrf d i r e c c i o n r s 2321 ; l i m p i a v a r i a b l e d i r e c c i o n r s 2321 ; l i m p i a v a r i a b l e d i r e c c i o n r s 2322 clrf d i r e c c i o n r s 2322 ; l i m p i a v a r i a b l e i n t e n t o r s 232 clrf i n t e n t o r s 232 clrf comando r s 232 ; l i m p i a v a r i a b l e comando r s 232 ; l i m p i a v a r i a b l e p ar am et r o r s 2321 clrf p ar am e t r o r s 2321 ; l i m p i a v a r i a b l e p ar am et r o r s 2322 clrf p ar am e t r o r s 2322 clrf p a r i d a d r s 232 ; l i m p i a v a r i a b l e p a r i d a d r s 232 bsf INTCON, PEIE ; h a b i l i t a ó i n t e r r u p c i n é p e r i f r i c a return ;−−−−− á C l c u l o de p a r i d a d V e r i f i c a r paridad ; mueve d i r e c c i o n r s 2 3 2 1 a W movf d i r e c c i o n r s 2321 ,0 xorwf d i r e c c i o n r s 2322 ,0 ; c a l c u l a l a p a r i d a d e n t r e W y d i r e c c i o n r s 23222 ; c a l c u l a l a p a r i d a d e n t r e W e i n t e n t o r s 232 xorwf i n t e n t o r s 232 ,0 ; c a l c u l a l a p a r i d a d e n t r e W y comando r s 232 x o r w f comando r s 2 3 2 , 0 x o r w f p ar am et r o r s 2 3 2 1 , 0 ; c a l c u l a l a p a r i d a d e n t r e W y p ar am et r o r s 2321 x o r w f p ar am et r o r s 2 3 2 2 , 0 ; c a l c u l a l a p a r i d a d e n t r e W y p ar am et r o r s 2322 ; gu ar d a l a p a r i d a d c a l c u l a d a en l a v a r i a b l e p a r i d a d movwf p a r i d a d c a l c u l a d a calculada ; compara p a r i d a d c a l c u l a d a con l a p a r i d a d que ó e n v i xorwf p ari d ad r s 232 ,0 el rabbit b t f s c STATUS, 2 goto Decidir respuesta goto Desconocido e r r o r p ari d ad ;−−−− D i s t i n g u e e l t i p o de r e s p u e s t a a e n v i a r ú s e g n e l comando que ó a r r i b Decidir respuesta bcf PORTA, 4 ; s e t e a r RA4 en e s t a d o b a j o bsf PORTB, 7 ; s e t e a r RB7 en e s t a d o a l t o movlw 0 x 41 ; mueve un 4 2 h ( A) a W ; l o compara con l a v a r i a b l e comando r s 232 x o r w f comando r s 2 3 2 , 0 b t f s c STATUS, 2 goto Definir accion movlw 0 x 52 ; mueve un 5 2 h ( R) a W ; l o compara con l a v a r i a b l e comando r s 232 x o r w f comando r s 2 3 2 , 0 b t f s c STATUS, 2 goto R e s e t e a r modulo movlw 0 x 55 ; mueve un 5 5 h ( U) a W ; l o compara con l a v a r i a b l e comando r s 232 x o r w f comando r s 2 3 2 , 0 b t f s c STATUS, 2 goto Enviar p r e s e n c i a ;−−−−− H a b i l i t a l a ó r e c e p c i n Fi n d e c i d i r r e s p u e s t a bcf PORTB, 7 clrf d i r e c c i o n r s 2321 clrf d i r e c c i o n r s 2322 clrf i n t e n t o r s 232 clrf comando r s 232 clrf p ar am e t r o r s 2321 clrf p ar am e t r o r s 2322 clrf p a r i d a d r s 232 return d e l MAX4 8 5 y v u e l v e a e s p e r a r un m en saje ; ; ; ; ; ; ; ;−−−−− ı́Enva l a r e s p u e s t a y r e s e t e a R e s e t e a r modulo call Enviar r e s p u e s t a call Reseteo goto Fi n d e c i d i r r e s p u e s t a ;−−−−− E n vi a l a r e s p u e s t a y d e f i n e Definir accion call Enviar r e s p u e s t a call Ejecutar accion goto Fi n d e c i d i r r e s p u e s t a d e l R ab b i t ; s e t e a r RB7 en e s t a d o b a j o l i m p i a v a r i a b l e d i r e c c i o n r s 2321 l i m p i a v a r i a b l e d i r e c c i o n r s 2322 l i m p i a v a r i a b l e i n t e n t o r s 232 l i m p i a v a r i a b l e comando r s 232 l i m p i a v a r i a b l e p ar am et r o r s 2321 l i m p i a v a r i a b l e p ar am et r o r s 2322 l i m p i a v a r i a b l e p a r i d a d r s 232 e l ómdulo e x t e r i o r l a ó a c c i n correspondiente ;−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ; SUBRUTINAS PARA EL ÍENVO DE NOTIFICACIONES ;−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ;−−−−− S u b r u t i n a que e n v i a un b y t e p or l a USART E n vi o movwf TXREG ; c a r a c t e r en W bsf STATUS, RP0 ; i r a l b an co 1 testeo btfss TXSTA,TRMT ; e s p e r a h a s t a c o m p l e t a r Tx , goto testeo bcf STATUS, RP0 ; i r a l b an co 0 return testea (1) 189 ANEXO C. CÓDIGOS FUENTES 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 ;−−−−− S u b r u t i n a que e n v i a l a ó n o t i f i c a c i n de p r e s e n c i a a l R ab b i t Enviar p r e s e n c i a bsf PORTA, 7 ; p o n e r en 1 e l MAX4 8 5 p a r a h a b i l i t a r l a ó t r a n s m i s i n ( p i n DE) movlw ’P ’ ; mueve ’ P ’ a W call E n vi o ; ı́ en va e l i d e n t i f i c a d o r de p r e s e n c i a movf t i p o modulo , 0 ; mueve t i p o modulo a W call E n vi o ; ı́ en va e l t i p o modulo a l r a b b i t ; mueve numero s e r i e a W movf numero s e r i e , 0 call E n vi o ; ı́ en va e l numero s e r i e a l r a b b i t movlw 0xA ; mueve e l c a r a c t e r ASCII 1 0 a W call E n vi o ; ı́ en va e l f i n de ı́ l n e a a l r a b b i t bcf PORTA, 7 ; p o n e r en ” 0 ” e l MAX4 8 5 p a r a h a b i l i t a r l a ó r e c e p c i n ( p i n DE) bsf INTCON, PEIE ; h a b i l i t a ó i n t e r r u p c i n é p e r i f r i c a goto Fi n d e c i d i r r e s p u e s t a ;−−−−− S u b r u t i n a que e n v i a Enviar r e s p u e s t a bsf PORTA, 7 p i n DE) movlw ’R ’ call E n vi o movlw 0xA call E n vi o bcf PORTA, 7 p i n DE) return l a ó n o t i f i c a c i n de r e s p u e s t a al R ab b i t ; p o n e r en 1 e l MAX4 8 5 p a r a habilitar l a ó t r a n s m i s i n ( ; mueve ’ R ’ a W ; ı́ en va e l i d e n t i f i c a d o r de r e s p u e s t a ; mueve e l c a r a c t e r ASCII 1 0 a W ; ı́ en va e l f i n de ı́ l n e a a l r a b b i t ; p o n e r en ” 0 ” e l MAX4 8 5 p a r a h a b i l i t a r l a ó r e c e p c i n ( ;−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ; SUBRUTINAS QUE VERIFICAN EL ADDRESS DEL ÓMDULO ;−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ;−−−−− S u b r u t i n a que v e r i f i c a V e r i f i c a r address movlw 0 x 30 addwf a d d r e s s dec , 1 addwf a d d r e s s u n i , 1 movf PORTA, 0 andlw 0xF movwf a d d r e s s b t f s c address , 3 goto f i j a r s e resto el ; ; ; ; ; ; seguir verificando addwf a d d r e s s u n i , 1 return och o movlw 0 x 08 goto seguir verificando n u eve movlw 0 x 09 goto seguir verificando ; suma 3 0 h a a d d r e s s d ec p a r a t r a n s f o r m a r l o en ASCII suma 3 0 h a a d d r e s s u n i p a r a t r a n s f o r m a r l o en ASCII s e f i j a e s t a d o de PORTA l i m p i a l o que no e s n e c e s a r i o mueve e l e s t a d o de l o s p r i m e r o s 4 p u e r t o s a a d d r e s s b u s c a s i e l a d d r e s s á e s t e n t r e l o s p r i m e r o s 7 únmeros v a l o r de W a l a s unidades e s c r i b e un 9 en W ; suma e l v a l o r de W a l a s unidades e s c r i b e un 8 en W ; l o compara con a d d r e s s ; e s c r i b e un 9 en W ; l o compara con a d d r e s s ; e s c r i b e un 1 0 en W ; l o compara con a d d r e s s ; e s c r i b e un 1 1 en W ; l o compara con a d d r e s s ; e s c r i b e un 1 2 en W ; l o compara con a d d r e s s ; e s c r i b e un 1 3 en W ; l o compara con a d d r e s s ; e s c r i b e un 1 4 en W ; l o compara con a d d r e s s ; e s c r i b e un 1 5 en W ; l o compara con a d d r e s s ,0 ,0 ,0 ,0 ,0 ,0 unidades e s c r i b e un 8 en W ; suma e l v a l o r de W a l a s ; ,0 ,0 d e l ómdulo e x t e r i o r ; suma e l ; f i j a r s e resto movlw 0 x 08 xorwf address b t f s c STATUS, 2 goto och o movlw 0 x 09 xorwf address b t f s c STATUS, 2 goto n u eve movlw 0 x0A xorwf address b t f s c STATUS, 2 call address 10 movlw 0 x0B xorwf address b t f s c STATUS, 2 call address 11 movlw 0 x0C xorwf address b t f s c STATUS, 2 call address 12 movlw 0 x0D xorwf address b t f s c STATUS, 2 call address 13 movlw 0 x0E xorwf address b t f s c STATUS, 2 call address 14 movlw 0 x0F xorwf address b t f s c STATUS, 2 address 190 ANEXO C. CÓDIGOS FUENTES 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 call address 15 return ;−−−−− S u b r u t i n a que e s c r i b e un 1 0 en únmeros ASCII address 10 ; i n c r e m e n t a en 1 a d d r e s s incf a d d r e s s dec , 1 return ;−−−−− S u b r u t i n a que e s c r i b e un 1 1 en únmeros ASCII address 11 incf a d d r e s s dec , 1 ; i n c r e m e n t a en 1 a d d r e s s ; i n c r e m e n t a en 1 a d d r e s s incf ad d r ess uni , 1 return d ec d ec uni ;−−−−− S u b r u t i n a que e s c r i b e un 1 2 en únmeros ASCII address 12 incf a d d r e s s dec , 1 ; i n c r e m e n t a en 1 a d d r e s s d ec movlw 0 x 02 ; suma e l v a l o r de W a l a s u n i d a d e s addwf a d d r e s s u n i , 1 return ;−−−−− S u b r u t i n a que e s c r i b e un 1 3 en únmeros ASCII address 13 incf a d d r e s s dec , 1 ; i n c r e m e n t a en 1 a d d r e s s d ec movlw 0 x 03 ; suma e l v a l o r de W a l a s u n i d a d e s addwf a d d r e s s u n i , 1 return ;−−−−− S u b r u t i n a que e s c r i b e un 1 4 en únmeros ASCII address 14 ; i n c r e m e n t a en 1 a d d r e s s d ec incf a d d r e s s dec , 1 movlw 0 x 04 ; suma e l v a l o r de W a l a s u n i d a d e s addwf a d d r e s s u n i , 1 return ;−−−−− S u b r u t i n a que e s c r i b e un 1 5 en únmeros ASCII address 15 ; i n c r e m e n t a en 1 a d d r e s s d ec incf a d d r e s s dec , 1 movlw 0 x 05 ; suma e l v a l o r de W a l a s u n i d a d e s addwf a d d r e s s u n i , 1 return ;−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ; SUBRUTINAS CONCURRENTES CON LA ÓACCIN Y RESETEO DEL ÓMDULO ;−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ;−−−−− S u b r u t i n a que r e s e t a Reseteo bsf PORTA, 6 return e l ómdulo e x t e r i o r ; s e t e a RA6 en ” 1 ” ;−−−−− S u b r u t i n a que e j e c u t a l a ó a c c i n d e l ómdulo e x t e r i o r Ejecutar accion movlw 0 x 30 ; mueve un 3 0 h ( 0 ) a W x o r w f p ar am et r o r s 2 3 2 1 , 0 ; l o compara con l a v a r i a b l e b t f s c STATUS, 2 goto com p ar ar s i g u i e n t e 0 movlw 0 x 31 ; mueve un 3 1 h ( 1 ) a W x o r w f p ar am et r o r s 2 3 2 1 , 0 ; l o compara con l a v a r i a b l e b t f s c STATUS, 2 goto com p ar ar s i g u i e n t e 1 movlw 0 x 32 ; mueve un 3 2 h ( 2 ) a W x o r w f p ar am et r o r s 2 3 2 1 , 0 ; l o compara con l a v a r i a b l e b t f s c STATUS, 2 goto com p ar ar s i g u i e n t e 2 ;−−−−− Compara e l segu n d o b y t e com p ar ar s i g u i e n t e 3 movlw 0 x 30 x o r w f p ar am et r o r s 2 3 2 2 , 0 b t f s c STATUS, 2 goto A cci on 3 0 movlw 0 x 31 x o r w f p ar am et r o r s 2 3 2 2 , 0 b t f s c STATUS, 2 goto A cci on 3 1 movlw 0 x 32 x o r w f p ar am et r o r s 2 3 2 2 , 0 b t f s c STATUS, 2 goto A cci on 3 2 Ter m i n ar e j e c u t a r bsf INTCON, PEIE return d e l áp ar m et r o s a b i e n d o que e l p ar am et r o r s 2321 p ar am et r o r s 2321 p ar am et r o r s 2321 p r i m e r o f u e un t r e s ; mueve un 3 0 h ( 0 ) a W ; l o compara con l a variable p ar am et r o r s 2322 ; mueve un 3 1 h ( 1 ) a W ; l o compara con l a variable p ar am et r o r s 2321 ; mueve un 3 2 h ( 2 ) a W ; l o compara con l a variable p ar am et r o r s 2321 ; h a b i l i t a ó i n t e r r u p c i n é p e r i f r i c a ;−−−−− Compara e l segu n d o b y t e d e l áp ar m et r o s a b i e n d o que e l com p ar ar s i g u i e n t e 0 movlw 0 x 30 ; mueve un 3 0 h ( 0 ) a W p r i m e r o f u e un c e r o 191 ANEXO C. CÓDIGOS FUENTES 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 xorwf btfsc goto movlw xorwf btfsc goto movlw xorwf btfsc goto movlw xorwf btfsc goto movlw xorwf btfsc goto movlw xorwf btfsc goto movlw xorwf btfsc goto movlw xorwf btfsc goto movlw xorwf btfsc goto movlw xorwf btfsc goto p ar am et r o r s 2 3 2 2 , 0 STATUS, 2 Ter m i n ar e j e c u t a r 0 x 31 p ar am et r o r s 2 3 2 2 , 0 STATUS, 2 A cci on 1 0 x 32 p ar am et r o r s 2 3 2 2 , 0 STATUS, 2 A cci on 2 0 x 33 p ar am et r o r s 2 3 2 2 , 0 STATUS, 2 A cci on 3 0 x 34 p ar am et r o r s 2 3 2 2 , 0 STATUS, 2 A cci on 4 0 x 35 p ar am et r o r s 2 3 2 2 , 0 STATUS, 2 A cci on 5 0 x 36 p ar am et r o r s 2 3 2 2 , 0 STATUS, 2 A cci on 6 0 x 37 p ar am et r o r s 2 3 2 2 , 0 STATUS, 2 A cci on 7 0 x 38 p ar am et r o r s 2 3 2 2 , 0 STATUS, 2 A cci on 8 0 x 39 p ar am et r o r s 2 3 2 2 , 0 STATUS, 2 A cci on 9 ;−−−−− Compara e l segu n d o b y t e com p ar ar s i g u i e n t e 1 movlw 0 x 30 x o r w f p ar am et r o r s 2 3 2 2 , 0 b t f s c STATUS, 2 goto A cci on 1 0 movlw 0 x 31 x o r w f p ar am et r o r s 2 3 2 2 , 0 b t f s c STATUS, 2 goto A cci on 1 1 movlw 0 x 32 x o r w f p ar am et r o r s 2 3 2 2 , 0 b t f s c STATUS, 2 goto A cci on 1 2 movlw 0 x 33 x o r w f p ar am et r o r s 2 3 2 2 , 0 b t f s c STATUS, 2 goto A cci on 1 3 movlw 0 x 34 x o r w f p ar am et r o r s 2 3 2 2 , 0 b t f s c STATUS, 2 goto A cci on 1 4 movlw 0 x 35 x o r w f p ar am et r o r s 2 3 2 2 , 0 b t f s c STATUS, 2 goto A cci on 1 5 movlw 0 x 36 x o r w f p ar am et r o r s 2 3 2 2 , 0 b t f s c STATUS, 2 goto A cci on 1 6 movlw 0 x 37 x o r w f p ar am et r o r s 2 3 2 2 , 0 b t f s c STATUS, 2 goto A cci on 1 7 movlw 0 x 38 x o r w f p ar am et r o r s 2 3 2 2 , 0 b t f s c STATUS, 2 goto A cci on 1 8 movlw 0 x 39 x o r w f p ar am et r o r s 2 3 2 2 , 0 b t f s c STATUS, 2 goto A cci on 1 9 ; l o compara con l a variable p ar am et r o r s 2322 ; no e j e c u t a r n i n gu n a ó a c c i n ; mueve un 3 1 h ( 1 ) a W ; l o compara con l a v a r i a b l e p ar am et r o r s 2321 ; mueve un 3 2 h ( 2 ) a W ; l o compara con l a variable p ar am et r o r s 2321 ; mueve un 3 3 h ( 3 ) a W ; l o compara con l a variable p ar am et r o r s 2321 ; mueve un 3 4 h ( 4 ) a W ; l o compara con l a variable p ar am et r o r s 2321 ; mueve un 3 5 h ( 5 ) a W ; l o compara con l a variable p ar am et r o r s 2321 ; mueve un 3 6 h ( 6 ) a W ; l o compara con l a variable p ar am et r o r s 2321 ; mueve un 3 7 h ( 7 ) a W ; l o compara con l a variable p ar am et r o r s 2321 ; mueve un 3 8 h ( 8 ) a W ; l o compara con l a variable p ar am et r o r s 2321 ; mueve un 3 9 h ( 9 ) a W ; l o compara con l a variable p ar am et r o r s 2321 d e l áp ar m et r o s a b i e n d o que e l p r i m e r o f u e un uno ; mueve un 3 0 h ( 0 ) a W ; l o compara con l a variable p ar am et r o r s 2322 ; mueve un 3 1 h ( 1 ) a W ; l o compara con l a variable p ar am et r o r s 2321 ; mueve un 3 2 h ( 2 ) a W ; l o compara con l a variable p ar am et r o r s 2321 ; mueve un 3 3 h ( 3 ) a W ; l o compara con l a variable p ar am et r o r s 2321 ; mueve un 3 4 h ( 4 ) a W ; l o compara con l a variable p ar am et r o r s 2321 ; mueve un 3 5 h ( 5 ) a W ; l o compara con l a variable p ar am et r o r s 2321 ; mueve un 3 6 h ( 6 ) a W ; l o compara con l a variable p ar am et r o r s 2321 ; mueve un 3 7 h ( 7 ) a W ; l o compara con l a variable p ar am et r o r s 2321 ; mueve un 3 8 h ( 8 ) a W ; l o compara con l a variable p ar am et r o r s 2321 ; mueve un 3 9 h ( 9 ) a W ; l o compara con l a variable p ar am et r o r s 2321 ;−−−−− Compara e l segu n d o b y t e d e l áp ar m et r o s a b i e n d o que e l p r i m e r o f u e un d os com p ar ar s i g u i e n t e 2 movlw 0 x 30 ; mueve un 3 0 h ( 0 ) a W x o r w f p ar am et r o r s 2 3 2 2 , 0 ; l o compara con l a v a r i a b l e p ar am et r o r s 2322 b t f s c STATUS, 2 192 ANEXO C. CÓDIGOS FUENTES 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 goto movlw xorwf btfsc goto movlw xorwf btfsc goto movlw xorwf btfsc goto movlw xorwf btfsc goto movlw xorwf btfsc goto movlw xorwf btfsc goto movlw xorwf btfsc goto movlw xorwf btfsc goto movlw xorwf btfsc goto A cci on 2 0 0 x 31 p ar am et r o STATUS, 2 A cci on 2 1 0 x 32 p ar am et r o STATUS, 2 A cci on 2 2 0 x 33 p ar am et r o STATUS, 2 A cci on 2 3 0 x 34 p ar am et r o STATUS, 2 A cci on 2 4 0 x 35 p ar am et r o STATUS, 2 A cci on 2 5 0 x 36 p ar am et r o STATUS, 2 A cci on 2 6 0 x 37 p ar am et r o STATUS, 2 A cci on 2 7 0 x 38 p ar am et r o STATUS, 2 A cci on 2 8 0 x 39 p ar am et r o STATUS, 2 A cci on 2 9 r s 2322 ,0 ; mueve un 3 1 h ( 1 ) a W ; l o compara con l a variable p ar am et r o r s 2321 r s 2322 ,0 ; mueve un 3 2 h ( 2 ) a W ; l o compara con l a variable p ar am et r o r s 2321 r s 2322 ,0 ; mueve un 3 3 h ( 3 ) a W ; l o compara con l a variable p ar am et r o r s 2321 r s 2322 ,0 ; mueve un 3 4 h ( 4 ) a W ; l o compara con l a variable p ar am et r o r s 2321 r s 2322 ,0 ; mueve un 3 5 h ( 5 ) a W ; l o compara con l a variable p ar am et r o r s 2321 r s 2322 ,0 ; mueve un 3 6 h ( 6 ) a W ; l o compara con l a variable p ar am et r o r s 2321 r s 2322 ,0 ; mueve un 3 7 h ( 7 ) a W ; l o compara con l a variable p ar am et r o r s 2321 r s 2322 ,0 ; mueve un 3 8 h ( 8 ) a W ; l o compara con l a variable p ar am et r o r s 2321 r s 2322 ,0 ; mueve un 3 9 h ( 9 ) a W ; l o compara con l a variable p ar am et r o r s 2321 ;−−−−− E j e c u t a ó a c c i n o n 1 ( oN1 ) A cci on 1 call Setear timer0 bsf INTCON, 5 ; bcf goto INTCON, 5 Ter m i n ar e j e c u t a r ;−−−−− E j e c u t a ó a c c i n o n 2 ( oN2 ) A cci on 2 call Setear timer0 bsf INTCON, 5 ; bcf goto INTCON, 5 Ter m i n ar e j e c u t a r ;−−−−− E j e c u t a ó a c c i n o n 3 ( oN3 ) A cci on 3 call Setear timer0 bsf INTCON, 5 ; bcf goto INTCON, 5 Ter m i n ar e j e c u t a r ;−−−−− E j e c u t a ó a c c i n o n 4 ( oN4 ) A cci on 4 call Setear timer0 bsf INTCON, 5 ; bcf goto INTCON, 5 Ter m i n ar e j e c u t a r ;−−−−− E j e c u t a ó a c c i n o n 5 ( oN5 ) A cci on 5 call Setear timer0 bsf INTCON, 5 ; bcf goto INTCON, 5 Ter m i n ar e j e c u t a r ;−−−−− E j e c u t a ó a c c i n o n 6 ( oN6 ) A cci on 6 call Setear timer0 bsf INTCON, 5 ; bcf goto INTCON, 5 Ter m i n ar e j e c u t a r habilita ; habilita ; la la la deshabilita d e l TMR0 d e l TMR0 l a ó i n t e r r u p c i n interrupcion d e l TMR0 d e l TMR0 l a ó i n t e r r u p c i n interrupcion d e l TMR0 d e l TMR0 l a ó i n t e r r u p c i n interrupcion d e l TMR0 d e l TMR0 l a ó i n t e r r u p c i n interrupcion deshabilita habilita ; la d e l TMR0 l a ó i n t e r r u p c i n interrupcion deshabilita habilita ; la deshabilita habilita ; interrupcion deshabilita habilita ; la deshabilita d e l TMR0 d e l TMR0 l a ó i n t e r r u p c i n d e l TMR0 ;−−−−− E j e c u t a ó a c c i n o n 7 ( oN7 ) A cci on 7 193 ANEXO C. CÓDIGOS FUENTES 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 call bsf Setear timer0 INTCON, 5 bcf goto INTCON, 5 Ter m i n ar e j e c u t a r ; ;−−−−− E j e c u t a ó a c c i n o n 8 ( oN8 ) A cci on 8 call Setear timer0 bsf INTCON, 5 ; bcf goto INTCON, 5 Ter m i n ar e j e c u t a r ;−−−−− E j e c u t a ó a c c i n o n 9 ( oN9 ) A cci on 9 call Setear timer0 bsf INTCON, 5 ; bcf goto INTCON, 5 Ter m i n ar e j e c u t a r habilita ; habilita ; INTCON, 5 Ter m i n ar e j e c u t a r ; la la la d e l TMR0 d e l TMR0 l a ó i n t e r r u p c i n interrupcion d e l TMR0 d e l TMR0 l a ó i n t e r r u p c i n interrupcion deshabilita d e l TMR0 l a ó i n t e r r u p c i n interrupcion deshabilita ;−−−−− E j e c u t a ó a c c i n o n 1 0 ( oN0 ) A cci on 1 0 call Setear timer0 bsf INTCON, 5 ; habilita bcf goto interrupcion deshabilita habilita ; la deshabilita d e l TMR0 d e l TMR0 l a ó i n t e r r u p c i n d e l TMR0 ;−−−−− E j e c u t a ó a c c i n o n 1 1 (POWER) A cci on 1 1 call Setear timer0 bsf INTCON, 5 ; h a b i l i t a l a i n t e r r u p c i o n d e l TMR0 call transmitir i n i c i a l movf powera , 0 ; mueve powera a W movwf aux ; mueve e l c o n t e n i d o de W a aux clrf contador ; se l i m p i a l a v a r i a b l e contador call convertir ir movf powerb , 0 ; mueve powerb a W movwf aux ; mueve e l c o n t e n i d o de W a aux clrf contador ; se l i m p i a l a v a r i a b l e contador call convertir ir call convertir fin bcf INTCON, 5 ; d e s h a b i l i t a l a ó i n t e r r u p c i n d e l TMR0 goto Ter m i n ar e j e c u t a r ;−−−−− E j e c u t a ó a c c i n o n 1 2 (TV/AV) A cci on 1 2 call Setear timer0 bsf INTCON, 5 ; h a b i l i t a l a i n t e r r u p c i o n d e l TMR0 bcf INTCON, 5 ; d e s h a b i l i t a l a ó i n t e r r u p c i n d e l TMR0 goto Ter m i n ar e j e c u t a r ;−−−−− E j e c u t a ó a c c i n o n 1 3 (CHANNEL + ) A cci on 1 3 call Setear timer0 bsf INTCON, 5 ; h a b i l i t a l a i n t e r r u p c i o n d e l TMR0 bcf INTCON, 5 ; d e s h a b i l i t a l a ó i n t e r r u p c i n d e l TMR0 goto Ter m i n ar e j e c u t a r ;−−−−− E j e c u t a ó a c c i n o n 1 4 (CHANNEL −) A cci on 1 4 call Setear timer0 bsf INTCON, 5 ; h a b i l i t a l a i n t e r r u p c i o n d e l TMR0 bcf INTCON, 5 ; d e s h a b i l i t a l a ó i n t e r r u p c i n d e l TMR0 goto Ter m i n ar e j e c u t a r ;−−−−− E j e c u t a ó a c c i n o n 1 5 (VOL + ) A cci on 1 5 call Setear timer0 bsf INTCON, 5 ; h a b i l i t a l a i n t e r r u p c i o n d e l TMR0 bcf INTCON, 5 ; d e s h a b i l i t a l a ó i n t e r r u p c i n d e l TMR0 goto Ter m i n ar e j e c u t a r ;−−−−− E j e c u t a ó a c c i n o n 1 6 (VOL −) A cci on 1 6 call Setear timer0 bsf INTCON, 5 ; h a b i l i t a l a i n t e r r u p c i o n d e l TMR0 bcf INTCON, 5 ; d e s h a b i l i t a l a ó i n t e r r u p c i n d e l TMR0 goto Ter m i n ar e j e c u t a r ;−−−−− E j e c u t a ó a c c i n o n 1 7 (OPEN/CLOSE) A cci on 1 7 call Setear timer0 bsf INTCON, 5 ; ha bili ta la interrupcion call transmitir i n i c i a l movf openclosea ,0 ; mueve o p e n c l o s e a a W d e l TMR0 194 ANEXO C. CÓDIGOS FUENTES 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 movwf clrf call movf movwf clrf call call bcf goto aux contador convertir ir opencloseb ,0 aux contador convertir ir convertir fin INTCON, 5 Ter m i n ar e j e c u t a r ; ; mueve e l c o n t e n i d o de W a aux se l i m p i a l a v a r i a b l e contador ; ; mueve o p e n c l o s e b a W ; mueve e l c o n t e n i d o de W a aux se l i m p i a l a v a r i a b l e contador ; deshabilita l a ó i n t e r r u p c i n d e l TMR0 ;−−−−− E j e c u t a ó a c c i n o n 1 8 (PLAY/PAUSE) A cci on 1 8 call Setear timer0 bsf INTCON, 5 ; h a b i l i t a l a i n t e r r u p c i o n d e l TMR0 call transmitir i n i c i a l movf playpausea , 0 ; mueve p l a y p a u s e a a W movwf aux ; mueve e l c o n t e n i d o de W a aux clrf contador ; se l i m p i a l a v a r i a b l e contador call convertir ir movf playpauseb , 0 ; mueve p l a y p a u s e b a W movwf aux ; mueve e l c o n t e n i d o de W a aux clrf contador ; se l i m p i a l a v a r i a b l e contador call convertir ir call convertir fin bcf INTCON, 5 ; d e s h a b i l i t a l a ó i n t e r r u p c i n d e l TMR0 goto Ter m i n ar e j e c u t a r ;−−−−− E j e c u t a ó a c c i n o n 1 9 (STOP) A cci on 1 9 call Setear timer0 bsf INTCON, 5 ; h a b i l i t a l a i n t e r r u p c i o n d e l TMR0 call transmitir i n i c i a l movf stopa , 0 ; mueve s t o p a a W movwf aux ; mueve e l c o n t e n i d o de W a aux clrf contador ; se l i m p i a l a v a r i a b l e contador call convertir ir movf st op b , 0 ; mueve s t o p b a W movwf aux ; mueve e l c o n t e n i d o de W a aux clrf contador ; se l i m p i a l a v a r i a b l e contador call convertir ir call convertir fin bcf INTCON, 5 ; d e s h a b i l i t a l a ó i n t e r r u p c i n d e l TMR0 goto Ter m i n ar e j e c u t a r ;−−−−− E j e c u t a ó a c c i n o n 2 0 (TRACK + ) A cci on 2 0 call Setear timer0 bsf INTCON, 5 ; h a b i l i t a l a i n t e r r u p c i o n d e l TMR0 call transmitir i n i c i a l movf t r ackm asa , 0 ; mueve t r a c k m a s a a W movwf aux ; mueve e l c o n t e n i d o de W a aux clrf contador ; se l i m p i a l a v a r i a b l e contador call convertir ir movf t r ac k m asb , 0 ; mueve t r ac k m asb a W movwf aux ; mueve e l c o n t e n i d o de W a aux clrf contador ; se l i m p i a l a v a r i a b l e contador call convertir ir call convertir fin bcf INTCON, 5 ; d e s h a b i l i t a l a ó i n t e r r u p c i n d e l TMR0 goto Ter m i n ar e j e c u t a r ;−−−−− E j e c u t a ó a c c i n o n 2 1 (TRACK −) A cci on 2 1 call Setear timer0 bsf INTCON, 5 ; h a b i l i t a l a i n t e r r u p c i o n d e l TMR0 call transmitir i n i c i a l movf t r ackm en osa , 0 ; mueve t r a c k m e n o s a a W movwf aux ; mueve e l c o n t e n i d o de W a aux clrf contador ; se l i m p i a l a v a r i a b l e contador call convertir ir movf trackmen osb , 0 ; mueve trackmen osb a W movwf aux ; mueve e l c o n t e n i d o de W a aux clrf contador ; se l i m p i a l a v a r i a b l e contador call convertir ir call convertir fin bcf INTCON, 5 ; d e s h a b i l i t a l a ó i n t e r r u p c i n d e l TMR0 goto Ter m i n ar e j e c u t a r ;−−−−− E j e c u t a ó a c c i n o n 2 2 ( ARRIBA) A cci on 2 2 call Setear timer0 bsf INTCON, 5 ; h a b i l i t a l a i n t e r r u p c i o n d e l TMR0 call transmitir i n i c i a l movf arribaa ,0 ; mueve a r r i b a a a W movwf aux ; mueve e l c o n t e n i d o de W a aux clrf contador ; se l i m p i a l a v a r i a b l e contador call convertir ir 195 ANEXO C. CÓDIGOS FUENTES 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 movf movwf clrf call call bcf goto arribab ,0 aux contador convertir ir convertir fin INTCON, 5 Ter m i n ar e j e c u t a r ; ; mueve a r r i b a b a W ; mueve e l c o n t e n i d o de W a aux se l i m p i a l a v a r i a b l e contador ; deshabilita l a ó i n t e r r u p c i n d e l TMR0 ;−−−−− E j e c u t a ó a c c i n o n 2 3 (ABAJO) A cci on 2 3 call Setear timer0 bsf INTCON, 5 ; h a b i l i t a l a i n t e r r u p c i o n d e l TMR0 call transmitir i n i c i a l movf abajoa , 0 ; mueve a b a j o a a W movwf aux ; mueve e l c o n t e n i d o de W a aux clrf contador ; se l i m p i a l a v a r i a b l e contador call convertir ir movf ab ajob , 0 ; mueve a b a j o b a W movwf aux ; mueve e l c o n t e n i d o de W a aux clrf contador ; se l i m p i a l a v a r i a b l e contador call convertir ir call convertir fin bcf INTCON, 5 ; d e s h a b i l i t a l a ó i n t e r r u p c i n d e l TMR0 goto Ter m i n ar e j e c u t a r ;−−−−− E j e c u t a ó a c c i n o n 2 4 (DERECHA) A cci on 2 4 call Setear timer0 bsf INTCON, 5 ; h a b i l i t a l a i n t e r r u p c i o n d e l TMR0 call transmitir i n i c i a l movf derechaa , 0 ; mueve d e r e c h a a a W movwf aux ; mueve e l c o n t e n i d o de W a aux clrf contador ; se l i m p i a l a v a r i a b l e contador call convertir ir movf derechab , 0 ; mueve d e r e c h a b a W movwf aux ; mueve e l c o n t e n i d o de W a aux clrf contador ; se l i m p i a l a v a r i a b l e contador call convertir ir call convertir fin bcf INTCON, 5 ; d e s h a b i l i t a l a ó i n t e r r u p c i n d e l TMR0 goto Ter m i n ar e j e c u t a r ;−−−−− E j e c u t a ó a c c i n o n 2 5 ( IZQUIERDA) A cci on 2 5 call Setear timer0 bsf INTCON, 5 ; h a b i l i t a l a i n t e r r u p c i o n d e l TMR0 call transmitir i n i c i a l movf izqa ,0 ; mueve i z q a a W movwf aux ; mueve e l c o n t e n i d o de W a aux clrf contador ; se l i m p i a l a v a r i a b l e contador call convertir ir movf izqb ,0 ; mueve i z q b a W movwf aux ; mueve e l c o n t e n i d o de W a aux clrf contador ; se l i m p i a l a v a r i a b l e contador call convertir ir call convertir fin bcf INTCON, 5 ; d e s h a b i l i t a l a ó i n t e r r u p c i n d e l TMR0 goto Ter m i n ar e j e c u t a r ;−−−−− E j e c u t a ó a c c i n o n 2 6 (ENTER) A cci on 2 6 call Setear timer0 bsf INTCON, 5 ; h a b i l i t a l a i n t e r r u p c i o n d e l TMR0 call transmitir i n i c i a l movf entera ,0 ; mueve e n t e r a a W movwf aux ; mueve e l c o n t e n i d o de W a aux clrf contador ; se l i m p i a l a v a r i a b l e contador call convertir ir movf enterb , 0 ; mueve e n t e r b a W movwf aux ; mueve e l c o n t e n i d o de W a aux clrf contador ; se l i m p i a l a v a r i a b l e contador call convertir ir call convertir fin bcf INTCON, 5 ; d e s h a b i l i t a l a ó i n t e r r u p c i n d e l TMR0 goto Ter m i n ar e j e c u t a r ;−−−−− E j e c u t a ó a c c i n o n 2 7 (MENU) A cci on 2 7 call Setear timer0 bsf INTCON, 5 ; h a b i l i t a l a i n t e r r u p c i o n d e l TMR0 call transmitir i n i c i a l movf menua , 0 ; mueve menua a W movwf aux ; mueve e l c o n t e n i d o de W a aux clrf contador ; se l i m p i a l a v a r i a b l e contador call convertir ir movf menub , 0 ; mueve menub a W movwf aux ; mueve e l c o n t e n i d o de W a aux clrf contador ; se l i m p i a l a v a r i a b l e contador 196 ANEXO C. CÓDIGOS FUENTES 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 call call bcf goto convertir ir convertir fin INTCON, 5 Ter m i n ar e j e c u t a r ; deshabilita l a ó i n t e r r u p c i n d e l TMR0 ;−−−−− E j e c u t a ó a c c i n o n 2 8 (CLEAR) A cci on 2 8 call Setear timer0 bsf INTCON, 5 ; h a b i l i t a l a i n t e r r u p c i o n d e l TMR0 call transmitir i n i c i a l movf cleara ,0 ; mueve c l e a r a a W movwf aux ; mueve e l c o n t e n i d o de W a aux clrf contador ; se l i m p i a l a v a r i a b l e contador call convertir ir movf clearb ,0 ; mueve c l e a r b a W movwf aux ; mueve e l c o n t e n i d o de W a aux clrf contador ; se l i m p i a l a v a r i a b l e contador call convertir ir call convertir fin bcf INTCON, 5 ; d e s h a b i l i t a l a ó i n t e r r u p c i n d e l TMR0 goto Ter m i n ar e j e c u t a r ;−−−−− E j e c u t a ó a c c i n o n 2 9 (ZOOM) A cci on 2 9 call Setear timer0 bsf INTCON, 5 ; h a b i l i t a l a i n t e r r u p c i o n d e l TMR0 call transmitir i n i c i a l movf zooma , 0 ; mueve zooma a W movwf aux ; mueve e l c o n t e n i d o de W a aux clrf contador ; se l i m p i a l a v a r i a b l e contador call convertir ir movf zoomb , 0 ; mueve zoomb a W movwf aux ; mueve e l c o n t e n i d o de W a aux clrf contador ; se l i m p i a l a v a r i a b l e contador call convertir ir call convertir fin bcf INTCON, 5 ; d e s h a b i l i t a l a ó i n t e r r u p c i n d e l TMR0 goto Ter m i n ar e j e c u t a r ;−−−−− E j e c u t a ó a c c i n o n 3 0 (MUTE) A cci on 3 0 call Setear timer0 bsf INTCON, 5 ; h a b i l i t a l a i n t e r r u p c i o n d e l TMR0 bcf INTCON, 5 ; d e s h a b i l i t a l a ó i n t e r r u p c i n d e l TMR0 goto Ter m i n ar e j e c u t a r ;−−−−− E j e c u t a ó a c c i n o n 3 1 (REW) A cci on 3 1 call Setear timer0 bsf INTCON, 5 ; h a b i l i t a l a i n t e r r u p c i o n d e l TMR0 bcf INTCON, 5 ; d e s h a b i l i t a l a ó i n t e r r u p c i n d e l TMR0 goto Ter m i n ar e j e c u t a r ;−−−−− E j e c u t a ó a c c i n o n 3 2 ( FF) A cci on 3 2 call Setear timer0 bsf INTCON, 5 ; bcf INTCON, 5 goto Ter m i n ar e j e c u t a r h a b i l i t a l a i n t e r r u p c i o n d e l TMR0 ; d e s h a b i l i t a l a ó i n t e r r u p c i n d e l TMR0 ;−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ; SUBRUTINAS PARA LA ÓTRANSMISIN INFRARROJA ;−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ; −−−−− S u b r u t i n a que t r a n s m i t e e l e n c a b e z a d o áms e l i n i c i o d e l ó c d i g o IR−−− transmitir i n i c i a l movlw 0 x 39 ; mueve un 3 9 h a W call convertir ini movf en c 1 , 0 ; mueve en c 1 a W movwf aux ; mueve e l c o n t e n i d o de W a aux clrf contador ; se l i m p i a l a v a r i a b l e contador call convertir ir movf en c 2 , 0 ; mueve en c 2 a W movwf aux ; mueve e l c o n t e n i d o de W a aux clrf contador ; se l i m p i a l a v a r i a b l e contador call convertir ir clrf contador return ;−−−− S u b r u t i n a que p r e n d e l a convertir ini clrf veces call pwm on call cuenta 180 call pwm o f f clrf veces call cuenta 90 return s a l i d a PWM p a r a l a ; ; s e c u e n c i a de e n c a b e z a d o limpia v ar iab le veces ; e n c i e n d e s a l i d a PWM ; ap aga s a l i d a PWM limpia v ar iab le veces 197 ANEXO C. CÓDIGOS FUENTES 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 ;−−−− S u b r u t i n a que p r e n d e l a convertir ir clrf veces call pwm on call cuenta 11 call pwm o f f clrf veces btfsc aux , 7 call cuenta 11 btfss aux , 7 call cuenta 33 rlf aux , 1 incf contador , 1 btfsc contador , 3 return goto convertir ir ;−−−− S u b r u t i n a que convertir fin clrf veces call pwm on call cuenta 11 call pwm o f f clrf veces call cuenta 11 return tira el s a l i d a PWM ú s e g n ; ; el bit d e l ó c d i g o IR limpia v ar iab le veces ; e n c i e n d e s a l i d a PWM ; ap aga s a l i d a PWM limpia v ar iab le veces ; s e f i j a s i e l b i t 7 e s un c e r o ; se ; ; r o t a a l a i z q u i e r d a l a v a r i a b l e aux incrementa contador ; s e f i j a s i c o n t a d o r á e s t en 8 fija si el b i t 7 e s un uno b i t de p ar ad a ; ; limpia v ar iab le veces ; e n c i e n d e s a l i d a PWM ; ap aga s a l i d a PWM limpia v ar iab le veces ;−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ; SUBRUTINAS PARA EL MANEJO DE LA SALIDA PWM ;−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ;−−−−− S u b r u t i n a que pwm on movlw b ’ 0 0 0 0 1 1 0 0 ’ movwf CCP1CON return habilita la ;−−−−− S u b r u t i n a que pwm o f f movlw b ’ 0 0 0 0 0 0 0 0 ’ movwf CCP1CON return deshabilita s a l i d a CCP1 ; ó s e l e c c i n d e l modo PWM ; s e e s c r i b e e l r e g i s t r o CCP1CON ; ; se se la s a l i d a CCP1 d e s a c t i v a e l modo PWM e s c r i b e e l r e g i s t r o CCP1CON ;−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ; SUBRUTINAS QUE INSUMEN TIEMPOS ;−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ;−−−−−− S e t e o d e l TMR0 −−−−−−−−−−− Setear timer0 clrwdt ; clrf TMR0 ; se movlw d’205 ’ movwf TMR0 ; bsf STATUS, RP0 ; movlw b’00001000 ’ movwf OPTION REG bcf STATUS, RP0 ; return s e l i m p i a e l WDT l i m p i a e l r e g i s t r o TMR0 ; cuenta 50 microseg s e e s c r i b e e l r e g i s t r o TMR0 i r a l b an co 1 ; s e t e a l a c u e n t a d e l TMR0 ; s e e s c r i b e e l OPTION REG i r a l b an co 0 ;−−−−− S u b r u t i n a que c u e n t a 1 1 i n t e r r u p c i o n e s d e l TMR0 ( 0 . 5 5 mseg ) cuenta 11 movlw 0xB ; e s c r i b e un 1 1 en W xorwf veces , 0 ; compara v e c e s con 1 1 b t f s c STATUS, 2 return goto cuenta 11 ;−−−−− S u b r u t i n a que c u e n t a 3 3 i n t e r r u p c i o n e s d e l TMR0 ( 1 . 6 5 mseg ) cuenta 33 movlw 0 x 21 ; e s c r i b e un 3 3 en W xorwf veces , 0 ; compara v e c e s con 3 3 b t f s c STATUS, 2 return goto cuenta 33 ;−−−−− S u b r u t i n a que c u e n t a 9 0 i n t e r r u p c i o n e s d e l TMR0 ( 4 . 5 mseg ) cuenta 90 movlw 0 x5A ; e s c r i b e un 9 0 en W xorwf veces , 0 ; compara v e c e s con 9 0 b t f s c STATUS, 2 return goto cuenta 90 ;−−−−− S u b r u t i n a que c u e n t a 1 8 0 i n t e r r u p c i o n e s d e l TMR0 ( 9 . 0 mseg ) cuenta 180 movlw 0xB4 ; e s c r i b e un 1 8 0 en W xorwf veces , 0 ; compara v e c e s con 1 8 0 198 ANEXO C. CÓDIGOS FUENTES 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 b t f s c STATUS, 2 return goto cuenta 180 ;−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ; SUBRUTINAS PARA EL TRABAJO EN LA MEMORIA ;−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ;−−−−− S u b r u t i n a que l e e d a t o s de l a EEPROM eeprom r d bsf STATUS, RP0 ; i r a l b an co 1 movwf EEADR ; s e e s c r i b e e l d a t o en l a bsf EECON1 , 0 ; s e pone a 1 e l RD nop movf EEDATA, 0 ; s e e s c r i b e e l d a t o en W bcf STATUS, RP0 ; i r a l b an co 0 return ;−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ; INICIALIZACION DE LA EEPROM ;−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ORG DE DE 0 x 2100 0 x 0 0 , 0 x 0 1 , 0 x 0 2 , 0 x 0 3 , 0 xFF , 0 x 0 0 , 0 xD 5 , 0 x2A , 0 x 1 5 , 0 xEA , 0 xAF , 0 x 5 0 , 0 x2F , 0 xD 0 , 0 x 3D, 0 xC 2 , 0 xBD , 0 x 4 2 , 0 xBF , 0 x 40 0 x5F , 0 xA 0 , 0 xE 7 , 0 x 1 8 , 0 x7F , 0 x 8 0 , 0 x9F , 0 x 6 0 , 0 x 5D, 0 xA 2 , 0 x8D, 0 x 7 2 , 0X1F , 0 xE0 END C.4. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 direccion 4h ; Fi n d e l programa Código ModIN.asm ; ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗; ; Ó MDULO EXTERIOR RS232 ; ; −−−−−−−−−−−−−−−−−−−−− ; ; ; ; ALAN COHN ( 1 3 7 0 3 3 ) − ROSSANA MORALES ( 6 7 7 5 6 ) ; ; UNIVERSIDAD ORT URUGUAY ; ; ÑAO 2 0 0 7 ; ; ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗∗ ∗; list p=16f628A #i n c l u d e <p16F628A . i n c > errorlevel −302 ; ; l i s t d i r e c t i v e to d e f i n e p r oc e ss o r processor s p e c i f i c variable d ef i ni t io n s ; suppress m essage 3 0 2 fr om list file CONFIG CP OFF & DATA CP OFF & LVP OFF & BOREN OFF & MCLRE ON & WDT OFF & PWRTE ON & INTOSC OSC NOCLKOUT ; ∗ ∗ ∗ ∗ ∗ VARIABLE DEFINITIONS w temp EQU 0 x71 status temp EQU 0 x72 contador bytes EQU 0 x21 aux EQU 0 x22 EQU 0 x23 dato rs232 p or l a UART EQU 0 x24 flag rs232 address EQU 0 x25 exteriores address dec EQU 0 x26 address uni EQU 0 x27 address EQU 0 x28 direccion rs2321 llega direccion rs2322 EQU 0 x29 que l l e g a intento rs232 EQU 0x2A EQU 0x2B comando rs232 parametro rs2321 EQU 0x2C llega EQU 0x2D parametro rs2322 llega paridad rs232 EQU 0x2E 0x2F p a r i d a d c a l c u l a d a EQU d e l m en saje EQU 0 x30 contador errores mismo m en saje EQU 0 x31 tipo modulo EQU 0 x32 numero serie ómdulo e x t e r i o r EQU 0 x33 en trad as R B s e ó a c t i v una e n t r a d a EQU 0 x34 dato RB RB p a r a m e t r o e n t r a d a EQU 0 x35 ; ; ; ; ; v a r i a b l e u sed f o r c o n t e x t s a v i n g v a r i a b l e u sed f o r c o n t e x t s a v i n g v a r i a b l e que c u e n t a l o s b y t e s que s e r e c i b e n v a r i a b l e que gu ar d a e l b y t e IR a t r a s m i t i r v a r i a b l e u sad a p a r a g u a r d a r e l d a t o r s 2 3 2 r e c i b i d o ; ; v a r i a b l e que a v i s a cuando s e p r o d u c e una i n t de Rx v a r i a b l e que gu ar d a l a ó d i r e c c i n de l o s ómdulos ; ; v a r i a b l e que gu ar d a en ASCII l a s v a r i a b l e que gu ar d a en ASCII l a s ; v a r i a b l e que gu ar d a decenas d e l address unidades d e l el p r i m e r b y t e de l a address que ; v a r i a b l e que gu ar d a el segu n d o b y t e de l a ; ; ; v a r i a b l e que gu ar d a v a r i a b l e que gu ar d a v a r i a b l e que gu ar d a la el el e l b y t e de i n t e n t o que l l e g a b y t e d e l comando que l l e g a p r i m e r b y t e d e l áp ar m et r o que address ; v a r i a b l e que gu ar d a el p r i m e r b y t e d e l áp ar m et r o que ; ; v a r i a b l e que gu ar d a v a r i a b l e que gu ar d a el el b y t e de p a r i d a d que l l e g a v a l o r de l a p a r i d a d c a l c u l a d a ; v a r i a b l e que c u e n t a los ; ; v a r i a b l e que gu ar d a v a r i a b l e que gu ar d a e l t i p o d e l ómdulo e x t e r i o r e l únmero de s e r i e p r o p i o d e l e r r o r e s de p a r i d a d de un ; v a r i a b l e que gu ar d a el a v i s o para ; v a r i a b l e que gu ar d a el d a t o que ó l l e g el r a b b i t cuando p or el puerto ; v a r i a b l e que gu ar d a e l áp ar m et r o a e n v i a r al rabbit 199 ANEXO C. CÓDIGOS FUENTES 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 flag RB0 EQU 0 x36 ; v a r i a b l e que a v i s a cuando hubo una ó i n t e r r u p c i n de RB0 ; ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗∗ ∗ ∗∗ ∗∗ ∗ ∗∗ ∗ ∗∗ ∗ ∗∗ ∗ ∗∗ ∗ ∗∗ ∗ ∗∗ ∗ ∗∗ ∗∗ ∗ ∗∗ ∗ ∗∗ ∗ ∗∗ ∗ ∗∗ ∗ ∗∗ ∗ ∗∗ ∗∗ ∗ ∗∗ ∗ ∗∗ ∗ ∗∗ ∗ ;−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ; COMIENZO DEL PROGRAMA ;−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ORG goto 0 x000 main ; processor reset ; go t o b e g i n n i n g ORG 0 x004 ; interrupt vector vector o f program location ;−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ; MANEJADOR DE INTERRUPCIONES ;−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− movwf w temp ; save o f f c u r r e n t W re g i ste r c o n t e n t s movf STATUS, w ; move s t a t u s r e g i s t e r i n t o W r e g i s t e r ; s a v e o f f c o n t e n t s o f STATUS r e g i s t e r movwf s t a t u s t e m p btfsc goto btfsc goto btfsc goto PIR1 , RCIF Isr Rx INTCON, INTF ISR RB0 INTCON, RBIF ISR RBcambio ; RX i n t e r r u m p i o ? ; RB0 i n t e r r u m p i o ? ; RB<7:4 > ócambi de e s t a d o ? Fin isr movf status temp ,w movwf STATUS swap f w temp , f swap f w temp , w retfie ; ; r e t r i e v e cop y o f STATUS r e g i s t e r r e s t o r e p r e− i s r STATUS r e g i s t e r c o n t e n t s ; r e s t o r e p r e− i s r W r e g i s t e r ; return from i n t e r r u p t ; −−−−− ISR ó r e c e p c i n USART −−−−− Isr Rx bsf flag rs232 ,0 movf RCREG,W ; movwf d a t o r s 2 3 2 goto Fin isr ; −−−−− ISR RB0 −−−−− ISR RB0 bcf INTCON, INTF bsf flag RB0 , 0 goto Fin isr contents ; s e t e a e l b i t 0 en 1 l e e l o que l l e g a y l o gu ar d a en W ; ; s e l i m p i a e l INTF s e t e a e l b i t 0 en 1 ; −−−−− ISR cambio e s t a d o RB −−−− ISR RBcambio bcf INTCON, RBIF ; s e l i m p i a e l RBIF movf PORTB, 0 ; mueve PORTB a W movwf dato RB ; mueve W a dato RB movlw 0 xF0 ; mover un ’ 11110000 ’ a W andwf dato RB , 1 ; d e j a r a c t i v o s l o s 4 b i t s áms s i g n i f i c a t i v o s movlw 0 x00 ; mover un 0 h a W ; com p ar ar dato RB con W x o r w f dato RB , 0 b t f s c STATUS, 2 goto Fin isr swap f dato RB , 1 ; intercambiar nibbles rlf dato RB , 1 ; r o t a r dato RB un b i t a l a i z q u i e r d a ; b o r r a r p r i m e r b i t p or s i e s un ” 1 ” bcf dato RB , 0 movf dato RB , 0 ; mover dato RB a W movwf en t r ad as RB ; mover W a en trad as R B goto Fin isr ;−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ; PROGRAMA PRINCIPAL ;−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− main ;−−−−−− I n i c i a l i z a c i o n movlw 0 x21 movwf FSR otro clrf INDF incf FSR, 1 movlw 0 x36 x o r w f FSR, 0 memoria b t f s s STATUS, 2 goto otro ;−−−−−− S e t e o s Seteos de v a r i a b l e s −−− ; e s c r i b e 2 1 h en W ; borra l a ó d i r e c c i n de memoria que á e s t en INDF ; e s c r i b e 3 6 h en W ; compara que s e hayan b o r r a d o t o d a s las d i r e c c i o n e s de c o r r e s p o n d i e n t e s −−−−−− ;−−−−−− S e t e o d e l p e r i f e r i c o RS−232 −−−−−− bsf STATUS, RP0 ; i r a l b an co 1 movlw d ’ 25 ’ ; 9 6 0 0 b a u d i o s ( 4 MHz, BRGH=1) 200 ANEXO C. CÓDIGOS FUENTES 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 movwf movlw movwf bcf movlw movwf movf movf SPBRG b ’ 00100100 ’ TXSTA STATUS, RP0 b ’ 10010000 ’ RCSTA RCREG,W RCREG,W ; ; i r a l b an co 0 ; SPEN= 1 , CREN=1 h a b i l i t a e l puerto s e r i e y la recepcion continua ; l e e 2 v e c e s e l RCREG p or s i h a b i a b a s u r a ;−−−−−− S e t e o s de p u e r t o s de I /O −−−−− movlw 0x2F ; pone un 0 0 1 0 1 1 1 1 en W bsf STATUS, RP0 ; i r a l b an co 1 movwf TRISA ; RA0−RA1−RA2−RA3−RA5 p i n e s de e n t r a d a , RA4−RA6−RA7 p i n e s de salida movlw 0 xF3 ; pone un 1 1 1 1 0 0 1 1 en W movwf TRISB ; RB0−RB1−RB4−RB5−RB6−RB7 p i n e s de e n t r a d a , RB2−RB3 de salida bcf STATUS, RP0 ; i r a l b an co 0 movlw 0 x7 ; ap aga c o m p a r a d o r e s movwf CMCON bcf PORTA, 7 ; p o n e r en ” 0 ” e l MAX485 p a r a h a b i l i t a r l a ó r e c e p c i n ( p i n DE) bcf PORTB, 3 ; s e t e a r RB3 en e s t a d o b a j o ;−−−−−− bsf bsf bcf S e t e o d e l p i n RB0 −−− STATUS, RP0 OPTION REG, 6 STATUS, RP0 ;−−−−− ó D e c l a r a c i n d e l movlw 0 x33 movwf t i p o m o d u l o movlw 0 x44 movwf n u m e r o s e r i e ; ; ; i r a l b an co 1 h a b i l i t a RB0 como r a i s i n g i r a l b an co 0 t i p o de ómdulo e x t e r i o r y únmero de ; mueve un 3 3 h ( 3 ) a W ; mueve W a t i p o m o d u l o ; pone un 4 4 h (D) en W ; mueve W a n u m e r o s e r i e ;−−−−− ó V e r i f i c a c i n d e l a d d r e s s R ab b i t call Verificar address propio edge s e r i e −−−−− d e l ómdulo e x t e r i o r y ı́ en vo de ó i d e n t i f i c a c i n al ;−−−−−− H a b i l i t a c i o n de i n t e r r u p c i o n e s −−− bsf INTCON, 7 ; h a b i l i t a l a s i n t e r r u p c i o n e s − GIE bsf INTCON, PEIE ; h abil ita interrupcion pe r i f e ri c a bsf INTCON, INTE ; h a b i l i t a l a ó i n t e r r u p c i n de RB0 bsf INTCON, RBIE ; h a b i l i t a l a ó i n t e r r u p c i n de cambio de RB bsf STATUS, RP0 ; i r a l b an co 1 bsf PIE1 , RCIE ; h a b i l i t a i n t e r r u p c i o n de r e c e p c i o n de USART bcf STATUS, RP0 ; i r a l b an co 0 Loop principal btfsc flag rs232 ,0 call Recibir goto Loop principal ; Rx i n t e r r u m p i o ? ; loop forever ;−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ; SUBRUTINAS PARA LA ÓRECEPCIN Y PROCESAMIENTO DEL MENSAJE ;−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ;−−−−−− S u b r u t i n a que r e c i b e Recibir clrf flag rs232 movlw 0 x20 xorwf d ato rs232 , 0 b t f s c STATUS, 2 goto Procesar movlw 0 x45 xorwf d ato rs232 , 0 b t f s c STATUS, 2 goto Desechar movlw 0 x50 xorwf d ato rs232 , 0 b t f s c STATUS, 2 goto Desechar movlw 0 x52 xorwf d ato rs232 , 0 b t f s c STATUS, 2 goto Desechar movlw xorwf btfsc goto movlw xorwf btfsc goto movlw xorwf btfsc 0 x00 contador bytes ,0 STATUS, 2 es direccion 1 0 x01 contador bytes ,0 STATUS, 2 es direccion 2 0 x02 contador bytes ,0 STATUS, 2 el m en saje y gu ar d a s u s p a r t e s en l o s campos correspondientes ; borrar f lag r s232 ; mueve un 2 0 h a W ( f i n de ı́ l n e a ) ; l o compara con e l d a t o r s 2 3 2 ; P r o c e s a r l a trama r e c i b i d a ; mueve un 4 5 h a W ( ”E” ) ; l o compara con e l d a t o r s 2 3 2 ; D e s e c h a r l a ó i n f o r m a c i n que v i e n e é d e s p u s ; mueve un 5 0 h a W ( ”P” ) ; l o compara con e l d a t o r s 2 3 2 ; D e s e c h a r l a ó i n f o r m a c i n que v i e n e é d e s p u s ; mueve un 5 2 h a W ( ”R” ) ; l o compara con e l d a t o r s 2 3 2 ; Desechar l a ó i n f o r m a c i n que v i e n e é d e s p u s ; mueve un 0 h a W ; l o compara con l a variable contador bytes ; mueve un 1 h a W ; l o compara con l a variable contador bytes ; mueve un 2 h a W ; l o compara con l a variable contador bytes 201 ANEXO C. CÓDIGOS FUENTES 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 goto movlw xorwf btfsc goto movlw xorwf btfsc goto movlw xorwf btfsc goto es intento 0 x03 contador bytes ,0 STATUS, 2 es com an d o 0 x04 contador bytes ,0 STATUS, 2 es parametro 1 0 x05 contador bytes ,0 STATUS, 2 es parametro 2 ; mueve un 3 h a W ; l o compara con l a variable contador bytes ; mueve un 4 h a W ; l o compara con l a variable contador bytes ; mueve un 5 h a W ; l o compara con l a variable contador bytes ;−−−−− Guarda e l é s p t i m o b y t e que l l e g a en l a v a r i a b l e p a r i d a d r s 2 3 2 movf dato rs232 ,0 ; mueve d a t o r s 2 3 2 a W movwf p a r i d a d r s 2 3 2 ; mueve W a p a r i d a d r s 2 3 2 ; limpia variable contador bytes clrf contador bytes return ;−−−−− Guarda e l p r i m e r b y t e que es direccion 1 movf dato rs232 ,0 movwf d i r e c c i o n r s 2 3 2 1 incf contador bytes ,1 return llega en l a variable direccion rs2321 ; mueve d a t o r s 2 3 2 a W ; mueve W a d i r e c c i o n r s 2 3 2 1 ; incrementa l a v a r i a b l e c on t ad or b y t e s ;−−−−− Guarda e l segu n d o b y t e que l l e g a en l a v a r i a b l e d i r e c c i o n r s 2 3 2 2 es direccion 2 movf dato rs232 ,0 ; mueve d a t o r s 2 3 2 a W ; mueve W a d i r e c c i o n r s 2 3 2 2 movwf d i r e c c i o n r s 2 3 2 2 ; incrementa l a v a r i a b l e c on t ad or b y t e s incf contador bytes ,1 return ;−−−−− Guarda e l t e r c e r b y t e que es intento movf dato rs232 ,0 movwf i n t e n t o r s 2 3 2 incf contador bytes ,1 return llega ;−−−−− Guarda e l c u a r t o b y t e que es com an d o movf dato rs232 ,0 movwf c o m a n d o r s 2 3 2 incf contador bytes ,1 return llega ;−−−−− Guarda e l q u i n t o b y t e que es parametro 1 movf dato rs232 ,0 movwf p a r a m e t r o r s 2 3 2 1 incf contador bytes ,1 return llega ;−−−−− Guarda e l s e x t o b y t e que es parametro 2 movf dato rs232 ,0 movwf p a r a m e t r o r s 2 3 2 2 incf contador bytes ,1 return en l a variable intento rs232 ; mueve d a t o r s 2 3 2 a W ; mueve W a i n t e n t o ; incrementa l a v a r i a b l e en l a variable contador bytes comando rs232 ; mueve d a t o r s 2 3 2 a W ; mueve W a c o m a n d o r s 2 3 2 ; incrementa l a v a r i a b l e c on t ad or b y t e s en l a variable parametro rs2321 ; mueve d a t o r s 2 3 2 a W ; mueve W a p a r a m e t r o r s 2 3 2 1 ; incrementa l a v a r i a b l e c on t ad or b y t e s llega en l a variable parametro rs2322 ; mueve d a t o r s 2 3 2 a W ; mueve W a p a r a m e t r o r s 2 3 2 2 ; incrementa l a v a r i a b l e c on t ad or b y t e s ;−−−− D esech a l o que s i g u e é d e s p u s de l a s n o t i f i c a c i o n e s Desechar ; Rx i n t e r r u m p i o ? btfsc flag rs232 ,0 goto Recibir desechar goto Desechar ; Esperar para r e c i b i r Recibir desechar clrf flag rs232 movlw 0xA xorwf d ato rs232 , 0 b t f s c STATUS, 2 return goto Desechar ;−−−−− Se f i j a s i e l m en saje Procesar bcf INTCON, PEIE clrf contador bytes movf address dec ,0 xorwf d i r e c c i o n r s 2 3 2 1 , 0 b t f s s STATUS, 2 goto Volver recibir movf address uni ,0 xorwf d i r e c c i o n r s 2 3 2 2 , 0 b t f s s STATUS, 2 goto Volver recibir ; borrar f lag r s232 ; mueve un Ah a W ( f i n de ı́ l n e a ) ; l o compara con e l d a t o r s 2 3 2 e s p a r aé l comparando d i r e c c i o n e s ; deshabilita interrupcion p e ri f e r i c a ; limpia variable contador bytes ; mueve a d d r e s s d e c a W ; l o compara con l a v a r i a b l e d i r e c c i o n r s 2 3 2 1 ; mueve a d d r e s s u n i a W ; l o compara con l a v a r i a b l e direccion rs2322 202 ANEXO C. CÓDIGOS FUENTES 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 ;−−−−− Se f i j a s i e l comando e s c o n o c i d o Bu scar com an d o movlw 0 x51 ; mueve un ; lo x o r w f com an d o r s232 , 0 b t f s c STATUS, 2 goto Verificar paridad movlw 0 x52 ; mueve un x o r w f com an d o r s232 , 0 ; lo b t f s c STATUS, 2 goto Verificar paridad movlw 0 x55 ; mueve un ; lo x o r w f com an d o r s232 , 0 b t f s c STATUS, 2 goto Verificar paridad 5 1 h ( Q) a W compara con l a variable comando rs232 5 2 h ( R) a W compara con l a variable comando rs232 5 5 h ( U) a W compara con l a variable comando rs232 ;−−−−− V e r i f i c a s i e l campo i n t e n t o á e s t d e n t r o de l o s á p a r m e t r o s Desconocido error paridad movlw 0 x32 ; mover un 0 x32 ( 2 ) a W su b wf i n t e n t o r s 2 3 2 , 0 ; restar W a intento rs232 b t f s c STATUS, 1 ; v e r i f i c a r s i el resultado es p os it i v o goto Encender alarma ; limpia variable direccion rs2321 clrf direccion rs2321 clrf direccion rs2322 ; limpia variable direccion rs2322 clrf intento rs232 ; limpia variable intento rs232 ; l i m p i a v a r i a b l e comando rs232 clrf comando rs232 clrf parametro rs2321 ; limpia v a ri a bl e parametro rs2321 ; limpia v a ri a bl e parametro rs2322 clrf parametro rs2322 ; limpia variable paridad rs232 clrf paridad rs232 bsf INTCON, PEIE ; h a b i l i t a ó i n t e r r u p c i n é p e r i f r i c a return ;−−−−− V u el ve a e s t a r a t e n t a a l a Volver recibir clrf direccion rs2321 clrf direccion rs2322 clrf intento rs232 clrf comando rs232 clrf parametro rs2321 clrf parametro rs2322 clrf paridad rs232 bsf INTCON, PEIE return ó r e c e p c i n ; ; ; ; ; ; ; de un nuevo b y t e limpia variable direccion rs2321 limpia variable direccion rs2322 limpia variable intento rs232 l i m p i a v a r i a b l e comando rs232 limpia v a ri a bl e parametro rs2321 limpia v a ri a bl e parametro rs2322 limpia variable paridad rs232 ; h a b i l i t a ó i n t e r r u p c i n é p e r i f r i c a ;−−−−− E n c i e n d e l a al ar m a de ó v i o l a c i n de l a r e g l a de l o s 3 i n t e n t o s ( l e d ) Encender alarma bsf PORTA, 4 ; s e t a r RA4 en e s t a d o a l t o clrf direccion rs2321 ; limpia variable direccion rs2321 ; limpia variable direccion rs2322 clrf direccion rs2322 clrf intento rs232 ; limpia variable intento rs232 clrf comando rs232 ; l i m p i a v a r i a b l e comando rs232 clrf parametro rs2321 ; limpia v a ri a bl e parametro rs2321 clrf parametro rs2322 ; limpia v a ri a bl e parametro rs2322 clrf paridad rs232 ; limpia variable paridad rs232 bsf INTCON, PEIE ; h a b i l i t a ó i n t e r r u p c i n é p e r i f r i c a return ;−−−−− á C l c u l o de p a r i d a d Verificar paridad movf direccion rs2321 ,0 ; mueve d i r e c c i o n r s 2 3 2 1 a W ; c a l c ul a l a paridad entre W y di r e c c i o n r s 2 3 2 2 2 xorwf d i r e c c i o n r s 2 3 2 2 , 0 xorwf i n t e n t o r s 2 3 2 , 0 ; c alc ul a la paridad entre W e int e n to r s 2 3 2 x o r w f com an d o r s232 , 0 ; c a l c u l a l a p ari d ad e n t r e W y comando rs232 ; c a lc ul a la paridad entre W y parametro rs2321 xorwf p arametro rs2321 , 0 xorwf p arametro rs2322 , 0 ; c a lc ul a la paridad entre W y parametro rs2322 movwf p a r i d a d c a l c u l a d a ; gu ar d a l a p a r i d a d c a l c u l a d a en l a v a r i a b l e paridad calculada xorwf p ari d ad rs232 , 0 ; compara p a r i d a d c a l c u l a d a con l a p a r i d a d que ó e n v i el rabbit b t f s c STATUS, 2 goto Decidir respuesta goto Desconocido error paridad ;−−−− D i s t i n g u e e l t i p o de r e s p u e s t a a e n v i a r ú s e g n e l comando que ó a r r i b Decidir respuesta bcf PORTA, 4 ; s e t e a r RA4 en e s t a d o b a j o bsf PORTB, 3 ; s e t e a r RB3 en e s t a d o a l t o movlw 0 x51 ; mueve un 5 1 h ( Q) a W ; l o compara con l a v a r i a b l e c o m a n d o r s 2 3 2 x o r w f com an d o r s232 , 0 b t f s c STATUS, 2 goto Definir accion movlw 0 x52 ; mueve un 5 2 h ( R) a W ; l o compara con l a v a r i a b l e c o m a n d o r s 2 3 2 x o r w f com an d o r s232 , 0 b t f s c STATUS, 2 goto Resetear modulo movlw 0 x55 ; mueve un 5 5 h ( U) a W x o r w f com an d o r s232 , 0 ; l o compara con l a v a r i a b l e c o m a n d o r s 2 3 2 b t f s c STATUS, 2 203 ANEXO C. CÓDIGOS FUENTES 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 goto Enviar presencia ;−−−−− H a b i l i t a l a ó r e c e p c i n Fin decidir respuesta bcf PORTB, 3 clrf direccion rs2321 clrf direccion rs2322 clrf intento rs232 clrf comando rs232 clrf parametro rs2321 clrf parametro rs2322 clrf paridad rs232 bsf INTCON, PEIE return d e l MAX485 y v u e l v e a e s p e r a r un m en saje ; ; ; ; ; ; ; ;−−−−− ı́Enva l a r e s p u e s t a y r e s e t e a Resetear modulo call Enviar respuesta call Reseteo goto Fin decidir respuesta d e l R ab b i t ; s e t e a r RB3 en e s t a d o b a j o limpia variable direccion rs2321 limpia variable direccion rs2322 limpia variable intento rs232 l i m p i a v a r i a b l e comando rs232 limpia v a ri a bl e parametro rs2321 limpia v a ri a bl e parametro rs2322 limpia variable paridad rs232 ; h abil ita interrupcion pe r i f e ri c a e l ómdulo e x t e r i o r ;−−−−− D e f i n e l a ó a c c i n c o r r e p o n d i e n t e y ı́ en va l a r e s p u e s t a Definir accion b t f s c flag RB0 , 0 ; s e ó a c t i v RB0? goto Accion 1 ; s e ó a c t i v RB4? b t f s c en t r ad as R B , 1 goto Accion 2 ; s e ó a c t i v RB5? b t f s c en t r ad as R B , 2 goto Accion 3 b t f s c en t r ad as R B , 3 ; s e ó a c t i v RB6? goto Accion 4 ; s e ó a c t i v RB7? b t f s c en t r ad as R B , 4 goto Accion 5 goto Fin decidir respuesta ;−−−−− S e t e a que l a ó a c c i n a e j e c u t a r p or e l r a b b i t á s e r l a únmero 1 Accion 1 movlw 0 x30 ; mueve un 3 0 h ( 0 ) a W ; mueve W a p a r a m e t r o e n t r a d a movwf p a r a m e t r o e n t r a d a clrf flag RB0 ; l i m p i a b i t de ó a c c i n 1 call Enviar evento goto Fin decidir respuesta ;−−−−− S e t e a que l a ó a c c i n a e j e c u t a r p or e l r a b b i t á s e r l a únmero 2 Accion 2 movlw 0 x31 ; mueve un 3 1 h ( 1 ) a W ; mueve W a p a r a m e t r o e n t r a d a movwf p a r a m e t r o e n t r a d a ; l i m p i a b i t de ó a c c i n 2 bcf en t r ad as R B , 1 call Enviar evento goto Fin decidir respuesta ;−−−−− S e t e a que l a ó a c c i n a e j e c u t a r p or e l r a b b i t á s e r l a únmero 3 Accion 3 movlw 0 x32 ; mueve un 3 2 h ( 2 ) a W movwf p a r a m e t r o e n t r a d a ; mueve W a p a r a m e t r o e n t r a d a bcf en t r ad as R B , 2 ; l i m p i a b i t de ó a c c i n 3 call Enviar evento goto Fin decidir respuesta ;−−−−− S e t e a que l a ó a c c i n a e j e c u t a r p or e l r a b b i t á s e r l a únmero 4 Accion 4 movlw 0 x33 ; mueve un 3 3 h ( 3 ) a W movwf p a r a m e t r o e n t r a d a ; mueve W a p a r a m e t r o e n t r a d a ; l i m p i a b i t de ó a c c i n 4 bcf en t r ad as R B , 3 call Enviar evento goto Fin decidir respuesta ;−−−−− S e t e a que l a ó a c c i n a e j e c u t a r p or e l r a b b i t á s e r l a únmero 5 Accion 5 movlw 0 x34 ; mueve un 3 4 h ( 4 ) a W ; mueve W a p a r a m e t r o e n t r a d a movwf p a r a m e t r o e n t r a d a bcf en t r ad as R B , 4 ; l i m p i a b i t de ó a c c i n 5 call Enviar evento goto Fin decidir respuesta ;−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ; SUBRUTINAS PARA EL ÍENVO DE NOTIFICACIONES ;−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ;−−−−− S u b r u t i n a que e n v i a un b y t e p or l a USART E n vi o movwf TXREG ; c a r a c t e r en W bsf STATUS, RP0 ; i r a l b an co 1 testeo btfss TXSTA,TRMT ; e s p e r a h a s t a c o m p l e t a r Tx , goto testeo bcf STATUS, RP0 ; i r a l b an co 0 return testea (1) 204 ANEXO C. CÓDIGOS FUENTES 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 ;−−−−− S u b r u t i n a que e n v i a l a ó n o t i f i c a c i n de p r e s e n c i a a l R ab b i t Enviar presencia bsf PORTA, 7 ; p o n e r en 1 e l MAX485 p a r a h a b i l i t a r l a ó t r a n s m i s i n ( p i n DE) movlw ’P ’ ; mueve ’P ’ a W call E n vi o ; ı́ en va e l i d e n t i f i c a d o r de p r e s e n c i a movf tipo modulo , 0 ; mueve t i p o m o d u l o a W call E n vi o ; ı́ en va e l t i p o m o d u l o a l r a b b i t ; mueve n u m e r o s e r i e a W movf numero serie ,0 call E n vi o ; ı́ en va e l n u m e r o s e r i e a l r a b b i t movlw 0xA ; mueve e l c a r a c t e r ASCII 1 0 a W call E n vi o ; ı́ en va e l f i n de ı́ l n e a a l r a b b i t bcf PORTA, 7 ; p o n e r en ” 0 ” e l MAX485 p a r a h a b i l i t a r l a ó r e c e p c i n ( p i n DE) bsf INTCON, PEIE ; h a b i l i t a ó i n t e r r u p c i n é p e r i f r i c a goto Fin decidir respuesta ;−−−−− S u b r u t i n a que e n v i a l a ó n o t i f i c a c i n de r e s p u e s t a a l R ab b i t Enviar evento bsf PORTA, 7 ; p o n e r en 1 e l MAX485 p a r a h a b i l i t a r l a ó t r a n s m i s i n ( p i n DE) movlw ’E ’ ; mueve ’E ’ a W call E n vi o ; ı́ en va e l i d e n t i f i c a d o r de r e s p u e s t a ; mueve p a r a m e t r o e n t r a d a a W movf parametro entrada , 0 call E n vi o ; ı́ en va e l á p a r m e t r o e n t r a d a a l r a b b i t movlw ’ J ’ call E n vi o movlw 0xA ; mueve e l c a r a c t e r ASCII 1 0 a W call E n vi o ; ı́ en va e l f i n de ı́ l n e a a l r a b b i t bcf PORTA, 7 ; p o n e r en ” 0 ” e l MAX485 p a r a h a b i l i t a r l a ó r e c e p c i n ( p i n DE) return ;−−−−− S u b r u t i n a que e n v i a Enviar respuesta bsf PORTA, 7 p i n DE) movlw ’R ’ call E n vi o movlw 0xA call E n vi o bcf PORTA, 7 p i n DE) return l a ó n o t i f i c a c i n de r e s p u e s t a al R ab b i t ; p o n e r en 1 e l MAX485 p a r a habilitar l a ó t r a n s m i s i n ( ; mueve ’R ’ a W ; ı́ en va e l i d e n t i f i c a d o r de r e s p u e s t a ; mueve e l c a r a c t e r ASCII 1 0 a W ; ı́ en va e l f i n de ı́ l n e a a l r a b b i t ; p o n e r en ” 0 ” e l MAX485 p a r a h a b i l i t a r l a ó r e c e p c i n ( ;−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ; SUBRUTINAS QUE VERIFICAN EL ADDRESS DEL ÓMDULO ;−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ;−−−−− S u b r u t i n a que v e r i f i c a Verificar address movlw 0 x30 addwf a d d r e s s d e c , 1 addwf a d d r e s s u n i , 1 movf PORTA, 0 andlw 0xF movwf a d d r e s s b t f s c address , 3 goto fijarse resto el ; ; ; ; ; ; seguir verificando addwf a d d r e s s u n i , 1 return ; n u eve movlw 0 x09 goto seguir verificando ; suma 3 0 h a a d d r e s s d e c p a r a t r a n s f o r m a r l o en ASCII suma 3 0 h a a d d r e s s u n i p a r a t r a n s f o r m a r l o en ASCII s e f i j a e s t a d o de PORTA l i m p i a l o que no e s n e c e s a r i o mueve e l e s t a d o de l o s p r i m e r o s 4 p u e r t o s a a d d r e s s b u s c a s i e l a d d r e s s á e s t e n t r e l o s p r i m e r o s 7 únmeros v a l o r de W a l a s unidades e s c r i b e un 9 en W ; suma e l v a l o r de W a l a s unidades e s c r i b e un 8 en W ; l o compara con a d d r e s s ; e s c r i b e un 9 en W ; l o compara con a d d r e s s ; e s c r i b e un 1 0 en W ; l o compara con a d d r e s s ; e s c r i b e un 1 1 en W ; l o compara con a d d r e s s ,0 ,0 unidades e s c r i b e un 8 en W ; suma e l v a l o r de W a l a s ; ,0 ,0 d e l ómdulo e x t e r i o r ; suma e l och o movlw 0 x08 goto seguir verificando fijarse resto movlw 0 x08 xorwf address b t f s c STATUS, 2 goto och o movlw 0 x09 xorwf address b t f s c STATUS, 2 goto n u eve movlw 0x0A xorwf address b t f s c STATUS, 2 call address 10 movlw 0x0B xorwf address address 205 ANEXO C. CÓDIGOS FUENTES 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 b t f s c STATUS, 2 call address 11 movlw 0x0C xorwf address b t f s c STATUS, 2 call address 12 movlw 0x0D xorwf address b t f s c STATUS, 2 call address 13 movlw 0x0E xorwf address b t f s c STATUS, 2 call address 14 movlw 0 x0F xorwf address b t f s c STATUS, 2 call address 15 return e s c r i b e un 1 2 en W ; l o compara con a d d r e s s ; e s c r i b e un 1 3 en W ; l o compara con a d d r e s s ; e s c r i b e un 1 4 en W ; l o compara con a d d r e s s ; e s c r i b e un 1 5 en W ; l o compara con a d d r e s s ,0 ,0 ,0 ;−−−−− S u b r u t i n a que e s c r i b e un 1 0 en únmeros ASCII address 10 ; i n c r e m e n t a en 1 a d d r e s s d e c incf address dec ,1 return ;−−−−− S u b r u t i n a que e s c r i b e un 1 1 en únmeros ASCII address 11 ; i n c r e m e n t a en 1 a d d r e s s d e c incf address dec ,1 ; i n c r e m e n t a en 1 a d d r e s s u n i incf address uni , 1 return ;−−−−− S u b r u t i n a que e s c r i b e un 1 2 en únmeros ASCII address 12 ; i n c r e m e n t a en 1 a d d r e s s d e c incf address dec ,1 movlw 0 x02 ; suma e l v a l o r de W a l a s u n i d a d e s addwf a d d r e s s u n i , 1 return ;−−−−− S u b r u t i n a que e s c r i b e un 1 3 en únmeros ASCII address 13 ; i n c r e m e n t a en 1 a d d r e s s d e c incf address dec ,1 movlw 0 x03 ; suma e l v a l o r de W a l a s u n i d a d e s addwf a d d r e s s u n i , 1 return ;−−−−− S u b r u t i n a que e s c r i b e un 1 4 en únmeros ASCII address 14 ; i n c r e m e n t a en 1 a d d r e s s d e c incf address dec ,1 movlw 0 x04 ; suma e l v a l o r de W a l a s u n i d a d e s addwf a d d r e s s u n i , 1 return ;−−−−− S u b r u t i n a que e s c r i b e un 1 5 en únmeros ASCII address 15 ; i n c r e m e n t a en 1 a d d r e s s d e c incf address dec ,1 movlw 0 x05 addwf a d d r e s s u n i , 1 ; suma e l v a l o r de W a l a s u n i d a d e s return ;−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ; SUBRUTINAS CONCURRENTES CON EL RESETEO DEL ÓMDULO ;−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ;−−−−− S u b r u t i n a que r e s e t a Reseteo bsf PORTA, 6 return e l ómdulo e x t e r i o r ; s e t e a RA6 en ” 1 ” ;−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ; INICIALIZACION DE LA EEPROM ;−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ORG DE END C.5. 1 2 3 4 5 ; ,0 0 x2100 0 x00 , 0 x01 , 0 x02 , 0 x03 ; Fi n d e l programa Código ModOUT.asm ; ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗; ; Ó MDULO EXTERIOR DE SALIDA DIGITALES ; ; −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ; ; ; ; ALAN COHN ( 1 3 7 0 3 3 ) − ROSSANA MORALES ( 6 7 7 5 6 ) ; 206 ANEXO C. CÓDIGOS FUENTES 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 ; UNIVERSIDAD ORT URUGUAY ; ; ÑAO 2 0 0 7 ; ; ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗∗ ∗; list p=16f628A #i n c l u d e <p16F628A . i n c > errorlevel −302 ; ; l i s t d i r e c t i v e to d e f i n e p r oc e ss o r processor s p e c i f i c variable d ef i ni t io n s ; suppress m essage 3 0 2 fr om list file CONFIG CP OFF & DATA CP OFF & LVP OFF & BOREN OFF & MCLRE ON & WDT OFF & PWRTE ON & INTOSC OSC NOCLKOUT ; ∗ ∗ ∗ ∗ ∗ VARIABLE DEFINITIONS EQU 0 x71 w temp EQU 0 x72 status temp contador bytes EQU 0 x21 aux EQU 0 x22 EQU 0 x23 dato rs232 p or l a UART EQU 0 x24 flag rs232 address EQU 0 x25 exteriores EQU 0 x26 address dec EQU 0 x27 address uni address direccion rs2321 EQU 0 x28 llega EQU 0 x29 direccion rs2322 que l l e g a EQU 0x2A intento rs232 comando rs232 EQU 0x2B EQU 0x2C parametro rs2321 llega EQU 0x2D parametro rs2322 llega paridad rs232 EQU 0x2E 0x2F p a r i d a d c a l c u l a d a EQU d e l m en saje EQU 0 x30 contador errores mismo m en saje EQU 0 x31 tipo modulo EQU 0 x32 numero serie ómdulo e x t e r i o r EQU 0 x33 stop salida ; ; ; ; ; v a r i a b l e u sed f o r c o n t e x t s a v i n g v a r i a b l e u sed f o r c o n t e x t s a v i n g v a r i a b l e que c u e n t a l o s b y t e s que s e r e c i b e n v a r i a b l e que gu ar d a e l b y t e IR a t r a s m i t i r v a r i a b l e u sad a p a r a g u a r d a r e l d a t o r s 2 3 2 r e c i b i d o ; ; v a r i a b l e que a v i s a cuando s e p r o d u c e una i n t de Rx v a r i a b l e que gu ar d a l a ó d i r e c c i n de l o s ómdulos ; ; v a r i a b l e que gu ar d a en ASCII l a s v a r i a b l e que gu ar d a en ASCII l a s ; v a r i a b l e que gu ar d a decenas d e l address unidades d e l el p r i m e r b y t e de l a address que ; v a r i a b l e que gu ar d a el segu n d o b y t e de l a ; ; ; v a r i a b l e que gu ar d a v a r i a b l e que gu ar d a v a r i a b l e que gu ar d a la el el e l b y t e de i n t e n t o que l l e g a b y t e d e l comando que l l e g a p r i m e r b y t e d e l áp ar m et r o que address ; v a r i a b l e que gu ar d a el p r i m e r b y t e d e l áp ar m et r o que ; ; v a r i a b l e que gu ar d a v a r i a b l e que gu ar d a el el b y t e de p a r i d a d que l l e g a v a l o r de l a p a r i d a d c a l c u l a d a ; v a r i a b l e que c u e n t a los ; ; v a r i a b l e que gu ar d a v a r i a b l e que gu ar d a e l t i p o d e l ómdulo e x t e r i o r e l únmero de s e r i e p r o p i o d e l ; v a r i a b l e que a v i s a e r r o r e s de p a r i d a d de un s i hay que a p a g a r salidas ; ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗∗ ∗ ∗∗ ∗∗ ∗ ∗∗ ∗ ∗∗ ∗ ∗∗ ∗ ∗∗ ∗ ∗∗ ∗ ∗∗ ∗ ∗∗ ∗∗ ∗ ∗∗ ∗ ∗∗ ∗ ∗∗ ∗ ∗∗ ∗ ∗∗ ∗ ∗∗ ∗∗ ∗ ∗∗ ∗ ∗∗ ∗ ∗∗ ∗ ;−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ; COMIENZO DEL PROGRAMA ;−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ORG goto 0 x000 main ; processor reset ; go t o b e g i n n i n g ORG 0 x004 ; interrupt vector vector o f program location ;−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ; MANEJADOR DE INTERRUPCIONES ;−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ; save o f f c u r r e n t W re g i ste r c o n t e n t s movwf w temp movf STATUS, w ; move s t a t u s r e g i s t e r i n t o W r e g i s t e r movwf s t a t u s t e m p ; s a v e o f f c o n t e n t s o f STATUS r e g i s t e r b t f s c PIR1 , RCIF goto Isr Rx ; RX i n t e r r u m p i o ? Fin isr movf status temp ,w movwf STATUS swap f w temp , f swap f w temp , w retfie ; −−−−− ISR ó r e c e p c i n USART −−−−− Isr Rx bsf flag rs232 ,0 movf RCREG,W ; movwf d a t o r s 2 3 2 goto Fin isr ; ; r e t r i e v e cop y o f STATUS r e g i s t e r r e s t o r e p r e− i s r STATUS r e g i s t e r c o n t e n t s ; r e s t o r e p r e− i s r W r e g i s t e r ; return from i n t e r r u p t contents ; s e t e a e l b i t 0 en 1 l e e l o que l l e g a y l o gu ar d a en W ;−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ; PROGRAMA PRINCIPAL ;−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− main ;−−−−−− I n i c i a l i z a c i o n movlw 0 x21 movwf FSR de v a r i a b l e s −−− ; e s c r i b e 2 1 h en W 207 ANEXO C. CÓDIGOS FUENTES 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 otro clrf INDF incf FSR, 1 movlw 0 x33 x o r w f FSR, 0 memoria b t f s s STATUS, 2 goto otro ;−−−−−− S e t e o s Seteos ; borra l a ó d i r e c c i n de memoria que á e s t en INDF ; e s c r i b e 3 3 h en W ; compara que s e hayan b o r r a d o t o d a s las d i r e c c i o n e s de c o r r e s p o n d i e n t e s −−−−−− ;−−−−−− S e t e o d e l p e r i f e r i c o RS−232 −−−−−− bsf STATUS, RP0 ; i r a l b an co 1 movlw d ’ 25 ’ ; 9 6 0 0 b a u d i o s ( 4 MHz, BRGH=1) movwf SPBRG movlw b ’ 00100100 ’ movwf TXSTA bcf STATUS, RP0 ; i r a l b an co 0 movlw b ’ 10010000 ’ ; SPEN= 1 , CREN=1 movwf RCSTA ; h a b i l i t a e l puerto s e r i e y la recepcion continua movf RCREG,W ; l e e 2 v e c e s e l RCREG p or s i h a b i a b a s u r a movf RCREG,W ;−−−−−− S e t e o s de p u e r t o s de I /O −−−−− movlw 0x2F ; pone un 0 0 1 0 1 1 1 1 en W bsf STATUS, RP0 ; i r a l b an co 1 movwf TRISA ; RA0−RA1−RA2−RA3−RA5 p i n e s de e n t r a d a , RA4−RA6−RA7 p i n e s de salida movlw 0 x02 ; pone un 0 0 0 0 0 0 1 0 en W movwf TRISB ; RB1/Rx p i n de e n t r a d a , RB0−RB2−RB3−RB4−RB5−RB6−RB7 p i n e s de s a l i d a bcf STATUS, RP0 ; i r a l b an co 0 movlw 0 x7 ; ap aga c o m p a r a d o r e s movwf CMCON bcf PORTA, 7 ; p o n e r en ” 0 ” e l MAX485 p a r a h a b i l i t a r l a ó r e c e p c i n ( p i n DE) bcf PORTB, 3 ; s e t e a r RB3 en e s t a d o b a j o ;−−−−− ó D e c l a r a c i n d e l movlw 0 x32 movwf t i p o m o d u l o movlw 0 x43 movwf n u m e r o s e r i e t i p o de ómdulo e x t e r i o r y únmero de ; mueve un 3 2 h ( 2 ) a W ; mueve W a t i p o m o d u l o ; pone un 4 3 h (C) en W ; mueve W a n u m e r o s e r i e ;−−−−− ó V e r i f i c a c i n d e l a d d r e s s R ab b i t call Verificar address propio s e r i e −−−−− d e l ómdulo e x t e r i o r y ı́ en vo de ó i d e n t i f i c a c i n al ;−−−−−− H a b i l i t a c i o n de i n t e r r u p c i o n e s −−− bsf INTCON, 7 ; h a b i l i t a l a s i n t e r r u p c i o n e s − GIE bsf INTCON, PEIE ; h abil ita interrupcion pe r i f e ri c a bsf STATUS, RP0 ; i r a l b an co 1 bsf PIE1 , RCIE ; h a b i l i t a i n t e r r u p c i o n de r e c e p c i o n de USART bcf STATUS, RP0 ; i r a l b an co 0 Loop principal btfsc flag rs232 ,0 call Recibir goto Loop principal ; Rx i n t e r r u m p i o ? ; loop forever ;−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ; SUBRUTINAS PARA LA ÓRECEPCIN Y PROCESAMIENTO DEL MENSAJE ;−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ;−−−−−− S u b r u t i n a que r e c i b e Recibir clrf flag rs232 movlw 0 x20 xorwf d ato rs232 , 0 b t f s c STATUS, 2 goto Procesar movlw 0 x45 xorwf d ato rs232 , 0 b t f s c STATUS, 2 goto Desechar movlw 0 x50 xorwf d ato rs232 , 0 b t f s c STATUS, 2 goto Desechar movlw 0 x52 xorwf d ato rs232 , 0 b t f s c STATUS, 2 goto Desechar movlw 0 x00 xorwf con tad or b ytes , 0 b t f s c STATUS, 2 el m en saje y gu ar d a s u s p a r t e s en l o s campos correspondientes ; borrar f lag r s232 ; mueve un 2 0 h a W ( f i n de ı́ l n e a ) ; l o compara con e l d a t o r s 2 3 2 ; P r o c e s a r l a trama r e c i b i d a ; mueve un 4 5 h a W ( ”E” ) ; l o compara con e l d a t o r s 2 3 2 ; D e s e c h a r l a ó i n f o r m a c i n que v i e n e é d e s p u s ; mueve un 5 0 h a W ( ”P” ) ; l o compara con e l d a t o r s 2 3 2 ; D e s e c h a r l a ó i n f o r m a c i n que v i e n e é d e s p u s ; mueve un 5 2 h a W ( ”R” ) ; l o compara con e l d a t o r s 2 3 2 ; Desechar l a ó i n f o r m a c i n ; mueve un 0 h a W ; l o compara con l a que v i e n e é d e s p u s variable contador bytes 208 ANEXO C. CÓDIGOS FUENTES 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 goto movlw xorwf btfsc goto movlw xorwf btfsc goto movlw xorwf btfsc goto movlw xorwf btfsc goto movlw xorwf btfsc goto es direccion 1 0 x01 contador bytes STATUS, 2 es direccion 2 0 x02 contador bytes STATUS, 2 es intento 0 x03 contador bytes STATUS, 2 es com an d o 0 x04 contador bytes STATUS, 2 es parametro 1 0 x05 contador bytes STATUS, 2 es parametro 2 ,0 ; mueve un 1 h a W ; l o compara con l a variable contador bytes ,0 ; mueve un 2 h a W ; l o compara con l a variable contador bytes ,0 ; mueve un 3 h a W ; l o compara con l a variable contador bytes ,0 ; mueve un 4 h a W ; l o compara con l a variable contador bytes ,0 ; mueve un 5 h a W ; l o compara con l a variable contador bytes ;−−−−− Guarda e l é s p t i m o b y t e que l l e g a en l a v a r i a b l e p a r i d a d r s 2 3 2 movf dato rs232 ,0 ; mueve d a t o r s 2 3 2 a W movwf p a r i d a d r s 2 3 2 ; mueve W a p a r i d a d r s 2 3 2 ; limpia variable contador bytes clrf contador bytes return ;−−−−− Guarda e l p r i m e r b y t e que es direccion 1 movf dato rs232 ,0 movwf d i r e c c i o n r s 2 3 2 1 incf contador bytes ,1 return llega en l a variable direccion rs2321 ; mueve d a t o r s 2 3 2 a W ; mueve W a d i r e c c i o n r s 2 3 2 1 ; incrementa l a v a r i a b l e c on t ad or b y t e s ;−−−−− Guarda e l segu n d o b y t e que l l e g a en l a v a r i a b l e d i r e c c i o n r s 2 3 2 2 es direccion 2 ; mueve d a t o r s 2 3 2 a W movf dato rs232 ,0 ; mueve W a d i r e c c i o n r s 2 3 2 2 movwf d i r e c c i o n r s 2 3 2 2 incf contador bytes ,1 ; incrementa l a v a r i a b l e c on t ad or b y t e s return ;−−−−− Guarda e l t e r c e r b y t e que es intento movf dato rs232 ,0 movwf i n t e n t o r s 2 3 2 incf contador bytes ,1 return llega ;−−−−− Guarda e l c u a r t o b y t e que es com an d o movf dato rs232 ,0 movwf c o m a n d o r s 2 3 2 incf contador bytes ,1 return llega ;−−−−− Guarda e l q u i n t o b y t e que es parametro 1 movf dato rs232 ,0 movwf p a r a m e t r o r s 2 3 2 1 incf contador bytes ,1 return llega ;−−−−− Guarda e l s e x t o b y t e que es parametro 2 movf dato rs232 ,0 movwf p a r a m e t r o r s 2 3 2 2 incf contador bytes ,1 return en l a variable intento rs232 ; mueve d a t o r s 2 3 2 a W ; mueve W a i n t e n t o ; incrementa l a v a r i a b l e en l a variable contador bytes comando rs232 ; mueve d a t o r s 2 3 2 a W ; mueve W a c o m a n d o r s 2 3 2 ; incrementa l a v a r i a b l e c on t ad or b y t e s en l a variable parametro rs2321 ; mueve d a t o r s 2 3 2 a W ; mueve W a p a r a m e t r o r s 2 3 2 1 ; incrementa l a v a r i a b l e c on t ad or b y t e s llega en l a variable parametro rs2322 ; mueve d a t o r s 2 3 2 a W ; mueve W a p a r a m e t r o r s 2 3 2 2 ; incrementa l a v a r i a b l e c on t ad or b y t e s ;−−−− D esech a l o que s i g u e é d e s p u s de l a s n o t i f i c a c i o n e s Desechar btfsc flag rs232 ,0 ; Rx i n t e r r u m p i o ? goto Recibir desechar goto Desechar ; Esperar para r e c i b i r Recibir desechar clrf flag rs232 movlw 0xA xorwf d ato rs232 , 0 b t f s c STATUS, 2 return goto Desechar ;−−−−− Se f i j a s i e l m en saje Procesar bcf INTCON, PEIE clrf contador bytes ; borrar f lag r s232 ; mueve un Ah a W ( f i n de ı́ l n e a ) ; l o compara con e l d a t o r s 2 3 2 e s p a r aé l comparando d i r e c c i o n e s ; ; deshabilita interrupcion p e ri f e r i c a limpia variable contador bytes 209 ANEXO C. CÓDIGOS FUENTES 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 movf xorwf btfss goto movf xorwf btfss goto address dec ,0 direccion rs2321 ,0 STATUS, 2 Volver recibir address uni ,0 direccion rs2322 ,0 STATUS, 2 Volver recibir ; mueve a d d r e s s d e c a W ; l o compara con l a v a r i a b l e direccion rs2321 ; mueve a d d r e s s u n i a W ; l o compara con l a v a r i a b l e direccion rs2322 ;−−−−− Se f i j a s i e l comando e s c o n o c i d o Bu scar com an d o movlw 0 x41 ; mueve un 4 2 h ( A) ; l o compara x o r w f com an d o r s232 , 0 b t f s c STATUS, 2 goto Verificar paridad movlw 0 x52 ; mueve un 5 2 h ( R) x o r w f com an d o r s232 , 0 ; l o compara b t f s c STATUS, 2 goto Verificar paridad movlw 0 x53 ; mueve un 5 3 h ( S ) ; l o compara x o r w f com an d o r s232 , 0 b t f s c STATUS, 2 goto Verificar paridad movlw 0 x55 ; mueve un 5 5 h ( U) x o r w f com an d o r s232 , 0 ; l o compara b t f s c STATUS, 2 goto Verificar paridad a W con l a variable comando rs232 a W con l a variable comando rs232 a W con l a variable comando rs232 a W con l a variable comando rs232 ;−−−−− V e r i f i c a s i e l campo i n t e n t o á e s t d e n t r o de l o s á p a r m e t r o s Desconocido error paridad movlw 0 x32 ; mover un 0 x32 ( 2 ) a W ; restar W a intento rs232 su b wf i n t e n t o r s 2 3 2 , 0 b t f s c STATUS, 1 ; v e r i f i c a r s i el resultado es p os it i v o goto Encender alarma ; limpia variable direccion rs2321 clrf direccion rs2321 ; limpia variable direccion rs2322 clrf direccion rs2322 clrf intento rs232 ; limpia variable intento rs232 ; l i m p i a v a r i a b l e comando rs232 clrf comando rs232 ; limpia v a ri a bl e parametro rs2321 clrf parametro rs2321 clrf parametro rs2322 ; limpia v a ri a bl e parametro rs2322 ; limpia variable paridad rs232 clrf paridad rs232 bsf INTCON, PEIE ; h a b i l i t a ó i n t e r r u p c i n é p e r i f r i c a return ;−−−−− V u el ve a e s t a r a t e n t a a l a Volver recibir clrf direccion rs2321 clrf direccion rs2322 clrf intento rs232 clrf comando rs232 clrf parametro rs2321 clrf parametro rs2322 clrf paridad rs232 bsf INTCON, PEIE return ó r e c e p c i n ; ; ; ; ; ; ; de un nuevo b y t e limpia variable direccion rs2321 limpia variable direccion rs2322 limpia variable intento rs232 l i m p i a v a r i a b l e comando rs232 limpia v a ri a bl e parametro rs2321 limpia v a ri a bl e parametro rs2322 limpia variable paridad rs232 ; h a b i l i t a ó i n t e r r u p c i n é p e r i f r i c a ;−−−−− E n c i e n d e l a al ar m a de ó v i o l a c i n de l a r e g l a de l o s 3 i n t e n t o s ( l e d ) Encender alarma bsf PORTA, 4 ; s e t a r RA4 en e s t a d o a l t o clrf direccion rs2321 ; limpia variable direccion rs2321 ; limpia variable direccion rs2322 clrf direccion rs2322 clrf intento rs232 ; limpia variable intento rs232 clrf comando rs232 ; l i m p i a v a r i a b l e comando rs232 ; limpia v a ri a bl e parametro rs2321 clrf parametro rs2321 clrf parametro rs2322 ; limpia v a ri a bl e parametro rs2322 clrf paridad rs232 ; limpia variable paridad rs232 bsf INTCON, PEIE ; h a b i l i t a ó i n t e r r u p c i n é p e r i f r i c a return ;−−−−− á C l c u l o de p a r i d a d Verificar paridad movf direccion rs2321 ,0 ; mueve d i r e c c i o n r s 2 3 2 1 a W xorwf d i r e c c i o n r s 2 3 2 2 , 0 ; c a l c ul a l a paridad entre W y di r e c c i o n r s 2 3 2 2 2 ; c alc ul a la paridad entre W e int e n to r s 2 3 2 xorwf i n t e n t o r s 2 3 2 , 0 ; c a l c u l a l a p ari d ad e n t r e W y comando rs232 x o r w f com an d o r s232 , 0 xorwf p arametro rs2321 , 0 ; c a lc ul a la paridad entre W y parametro rs2321 xorwf p arametro rs2322 , 0 ; c a lc ul a la paridad entre W y parametro rs2322 ; gu ar d a l a p a r i d a d c a l c u l a d a en l a v a r i a b l e movwf p a r i d a d c a l c u l a d a paridad calculada ; compara p a r i d a d c a l c u l a d a con l a p a r i d a d que ó e n v i xorwf p ari d ad rs232 , 0 el rabbit b t f s c STATUS, 2 goto Decidir respuesta goto Desconocido error paridad ;−−−− D i s t i n g u e e l t i p o de r e s p u e s t a a e n v i a r ú s e g n e l comando que ó a r r i b Decidir respuesta bcf PORTA, 4 ; s e t e a r RA4 en e s t a d o b a j o 210 ANEXO C. CÓDIGOS FUENTES 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 bsf movlw xorwf btfsc goto movlw xorwf btfsc goto movlw xorwf btfsc goto movlw xorwf btfsc goto PORTB, 3 0 x41 com an d o r s232 , 0 STATUS, 2 Activar accion 0 x52 com an d o r s232 , 0 STATUS, 2 Resetear modulo 0 x53 com an d o r s232 , 0 STATUS, 2 Parar accion 0 x55 com an d o r s232 , 0 STATUS, 2 Enviar presencia ;−−−−− H a b i l i t a l a ó r e c e p c i n Fin decidir respuesta bcf PORTB, 3 clrf direccion rs2321 clrf direccion rs2322 clrf intento rs232 clrf comando rs232 clrf parametro rs2321 clrf parametro rs2322 clrf paridad rs232 return ; s e t e a r RB3 en e s t a d o a l t o ; mueve un 4 2 h ( A) a W ; l o compara con l a v a r i a b l e comando rs232 ; mueve un 5 2 h ( R) a W ; l o compara con l a variable comando rs232 ; mueve un 5 3 h ( S ) a W ; l o compara con l a variable comando rs232 ; mueve un 5 5 h ( U) a W ; l o compara con l a variable comando rs232 d e l MAX485 y v u e l v e a e s p e r a r un m en saje ; ; ; ; ; ; ; ;−−−−− ı́Enva l a r e s p u e s t a y r e s e t e a Resetear modulo call Enviar respuesta call Reseteo goto Fin decidir respuesta e l ómdulo e x t e r i o r ;−−−−− S e t e a e l f l a g s t o p s a l i d a Parar accion bsf stop salida ,0 goto Definir accion en ” 1 ” stop salida en ” 0 ” ;−−−−− S e t e a e l f l a g Activar accion clrf stop salida ; ; ;−−−−− E n vi a l a r e s p u e s t a y d e f i n e Definir accion call Enviar respuesta call Ejecutar accion goto Fin decidir respuesta d e l R ab b i t ; s e t e a r RB3 en e s t a d o b a j o limpia variable direccion rs2321 limpia variable direccion rs2322 limpia variable intento rs232 l i m p i a v a r i a b l e comando rs232 limpia v a ri a bl e parametro rs2321 limpia v a ri a bl e parametro rs2322 limpia variable paridad rs232 setea primer limpia variable l a ó a c c i n bit de l a variable stop salida stop salida correspondiente ;−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ; SUBRUTINAS PARA EL ÍENVO DE NOTIFICACIONES ;−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ;−−−−− S u b r u t i n a que e n v i a un b y t e p or l a USART E n vi o movwf TXREG ; c a r a c t e r en W bsf STATUS, RP0 ; i r a l b an co 1 testeo btfss TXSTA,TRMT ; e s p e r a h a s t a c o m p l e t a r Tx , goto testeo bcf STATUS, RP0 ; i r a l b an co 0 return testea (1) ;−−−−− S u b r u t i n a que e n v i a l a ó n o t i f i c a c i n de p r e s e n c i a a l R ab b i t Enviar presencia bsf PORTA, 7 ; p o n e r en 1 e l MAX485 p a r a h a b i l i t a r l a ó t r a n s m i s i n ( p i n DE) movlw ’P ’ ; mueve ’P ’ a W call E n vi o ; ı́ en va e l i d e n t i f i c a d o r de p r e s e n c i a movf tipo modulo , 0 ; mueve t i p o m o d u l o a W call E n vi o ; ı́ en va e l t i p o m o d u l o a l r a b b i t movf numero serie ,0 ; mueve n u m e r o s e r i e a W call E n vi o ; ı́ en va e l n u m e r o s e r i e a l r a b b i t movlw 0xA ; mueve e l c a r a c t e r ASCII 1 0 a W call E n vi o ; ı́ en va e l f i n de ı́ l n e a a l r a b b i t bcf PORTA, 7 ; p o n e r en ” 0 ” e l MAX485 p a r a h a b i l i t a r l a ó r e c e p c i n ( p i n DE) bsf INTCON, PEIE ; h a b i l i t a ó i n t e r r u p c i n é p e r i f r i c a goto Fin decidir respuesta ;−−−−− S u b r u t i n a que e n v i a Enviar respuesta bsf PORTA, 7 p i n DE) movlw ’R ’ call E n vi o l a ó n o t i f i c a c i n de r e s p u e s t a al R ab b i t ; p o n e r en 1 e l MAX485 p a r a ; mueve ’R ’ a W ; ı́ en va e l i d e n t i f i c a d o r habilitar l a ó t r a n s m i s i n ( de r e s p u e s t a 211 ANEXO C. CÓDIGOS FUENTES 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 movlw 0xA call E n vi o bcf PORTA, 7 p i n DE) return ; mueve e l c a r a c t e r ASCII 1 0 a W ; ı́ en va e l f i n de ı́ l n e a a l r a b b i t ; p o n e r en ” 0 ” e l MAX485 p a r a h a b i l i t a r l a ó r e c e p c i n ( ;−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ; SUBRUTINAS QUE VERIFICAN EL ADDRESS DEL ÓMDULO ;−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ;−−−−− S u b r u t i n a que v e r i f i c a Verificar address movlw 0 x30 addwf a d d r e s s d e c , 1 addwf a d d r e s s u n i , 1 movf PORTA, 0 andlw 0xF movwf a d d r e s s b t f s c address , 3 goto fijarse resto el ; ; ; ; ; ; seguir verificando addwf a d d r e s s u n i , 1 return ; n u eve movlw 0 x09 goto seguir verificando ; suma 3 0 h a a d d r e s s d e c p a r a t r a n s f o r m a r l o en ASCII suma 3 0 h a a d d r e s s u n i p a r a t r a n s f o r m a r l o en ASCII s e f i j a e s t a d o de PORTA l i m p i a l o que no e s n e c e s a r i o mueve e l e s t a d o de l o s p r i m e r o s 4 p u e r t o s a a d d r e s s b u s c a s i e l a d d r e s s á e s t e n t r e l o s p r i m e r o s 7 únmeros v a l o r de W a l a s unidades e s c r i b e un 9 en W ; suma e l v a l o r de W a l a s unidades e s c r i b e un 8 en W ; l o compara con a d d r e s s ; e s c r i b e un 9 en W ; l o compara con a d d r e s s ; e s c r i b e un 1 0 en W ; l o compara con a d d r e s s ; e s c r i b e un 1 1 en W ; l o compara con a d d r e s s ; e s c r i b e un 1 2 en W ; l o compara con a d d r e s s ; e s c r i b e un 1 3 en W ; l o compara con a d d r e s s ; e s c r i b e un 1 4 en W ; l o compara con a d d r e s s ; e s c r i b e un 1 5 en W ; l o compara con a d d r e s s ,0 ,0 ,0 ,0 ,0 ,0 unidades e s c r i b e un 8 en W ; suma e l v a l o r de W a l a s ; ,0 ,0 d e l ómdulo e x t e r i o r ; suma e l och o movlw 0 x08 goto seguir verificando fijarse resto movlw 0 x08 xorwf address b t f s c STATUS, 2 goto och o movlw 0 x09 xorwf address b t f s c STATUS, 2 goto n u eve movlw 0x0A xorwf address b t f s c STATUS, 2 call address 10 movlw 0x0B xorwf address b t f s c STATUS, 2 call address 11 movlw 0x0C xorwf address b t f s c STATUS, 2 call address 12 movlw 0x0D xorwf address b t f s c STATUS, 2 call address 13 movlw 0x0E xorwf address b t f s c STATUS, 2 call address 14 movlw 0 x0F xorwf address b t f s c STATUS, 2 call address 15 return address ;−−−−− S u b r u t i n a que e s c r i b e un 1 0 en únmeros ASCII address 10 incf address dec ,1 ; i n c r e m e n t a en 1 a d d r e s s d e c return ;−−−−− S u b r u t i n a que e s c r i b e un 1 1 en únmeros ASCII address 11 ; i n c r e m e n t a en 1 a d d r e s s d e c incf address dec ,1 ; i n c r e m e n t a en 1 a d d r e s s u n i incf address uni , 1 return ;−−−−− S u b r u t i n a que e s c r i b e un 1 2 en únmeros ASCII address 12 ; i n c r e m e n t a en 1 a d d r e s s d e c incf address dec ,1 movlw 0 x02 addwf a d d r e s s u n i , 1 ; suma e l v a l o r de W a l a s u n i d a d e s return ;−−−−− S u b r u t i n a que address 13 e s c r i b e un 1 3 en únmeros ASCII 212 ANEXO C. CÓDIGOS FUENTES 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 incf address dec ,1 movlw 0 x03 addwf a d d r e s s u n i , 1 return ; incrementa ; suma e l en 1 a d d r e s s d e c v a l o r de W a l a s unidades ;−−−−− S u b r u t i n a que e s c r i b e un 1 4 en únmeros ASCII address 14 incf address dec ,1 ; i n c r e m e n t a en 1 a d d r e s s d e c movlw 0 x04 ; suma e l v a l o r de W a l a s u n i d a d e s addwf a d d r e s s u n i , 1 return ;−−−−− S u b r u t i n a que e s c r i b e un 1 5 en únmeros ASCII address 15 ; i n c r e m e n t a en 1 a d d r e s s d e c incf address dec ,1 movlw 0 x05 addwf a d d r e s s u n i , 1 ; suma e l v a l o r de W a l a s u n i d a d e s return ;−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ; SUBRUTINAS CONCURRENTES CON LA ÓACCIN Y RESETEO DEL ÓMDULO ;−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ;−−−−− S u b r u t i n a que r e s e t a Reseteo bsf PORTA, 6 return e l ómdulo e x t e r i o r ; s e t e a RA6 en ” 1 ” ;−−−−− S u b r u t i n a que e j e c u t a l a ó a c c i n d e l ómdulo e x t e r i o r Ejecutar accion movlw 0 x30 ; mueve un 3 0 h ( 0 ) a W xorwf p arametro rs2321 , 0 ; l o compara con l a v a r i a b l e b t f s c STATUS, 2 goto comparar siguiente 0 movlw 0 x31 ; mueve un 3 1 h ( 1 ) a W xorwf p arametro rs2321 , 0 ; l o compara con l a v a r i a b l e b t f s c STATUS, 2 goto comparar siguiente 1 movlw 0 x32 ; mueve un 3 2 h ( 2 ) a W ; l o compara con l a v a r i a b l e xorwf p arametro rs2321 , 0 b t f s c STATUS, 2 goto comparar siguiente 2 ;−−−−− Compara e l segu n d o comparar siguiente 3 movlw 0 x30 xorwf p arametro rs2322 b t f s c STATUS, 2 goto Accion 30 movlw 0 x31 xorwf p arametro rs2322 b t f s c STATUS, 2 goto Accion 31 movlw 0 x32 xorwf p arametro rs2322 b t f s c STATUS, 2 goto Accion 32 b y t e d e l áp ar m et r o s a b i e n d o que e l parametro rs2321 parametro rs2321 parametro rs2321 p r i m e r o f u e un t r e s ,0 ; mueve un 3 0 h ( 0 ) a W ; l o compara con l a variable parametro rs2322 ,0 ; mueve un 3 1 h ( 1 ) a W ; l o compara con l a variable parametro rs2321 ,0 ; mueve un 3 2 h ( 2 ) a W ; l o compara con l a variable parametro rs2321 Terminar ejecutar bsf INTCON, PEIE return ;−−−−− Compara e l segu n d o b y t e comparar siguiente 0 movlw 0 x30 xorwf p arametro rs2322 , 0 b t f s c STATUS, 2 goto Terminar ejecutar movlw 0 x31 xorwf p arametro rs2322 , 0 b t f s c STATUS, 2 goto Accion 1 movlw 0 x32 xorwf p arametro rs2322 , 0 b t f s c STATUS, 2 goto Accion 2 movlw 0 x33 xorwf p arametro rs2322 , 0 b t f s c STATUS, 2 goto Accion 3 movlw 0 x34 xorwf p arametro rs2322 , 0 b t f s c STATUS, 2 goto Accion 4 movlw 0 x35 xorwf p arametro rs2322 , 0 b t f s c STATUS, 2 goto Accion 5 ; h a b i l i t a ó i n t e r r u p c i n é p e r i f r i c a d e l áp ar m et r o s a b i e n d o que e l ; mueve un 3 0 h ( 0 ) a W ; l o compara con l a p r i m e r o f u e un c e r o variable parametro rs2322 ; no e j e c u t a r n i n gu n a ó a c c i n ; mueve un 3 1 h ( 1 ) a W ; l o compara con l a v a r i a b l e parametro rs2321 ; mueve un 3 2 h ( 2 ) a W ; l o compara con l a variable parametro rs2321 ; mueve un 3 3 h ( 3 ) a W ; l o compara con l a variable parametro rs2321 ; mueve un 3 4 h ( 4 ) a W ; l o compara con l a variable parametro rs2321 ; mueve un 3 5 h ( 5 ) a W ; l o compara con l a variable parametro rs2321 213 ANEXO C. CÓDIGOS FUENTES 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 movlw xorwf btfsc goto movlw xorwf btfsc goto movlw xorwf btfsc goto movlw xorwf btfsc goto 0 x36 parametro STATUS, 2 Accion 6 0 x37 parametro STATUS, 2 Accion 7 0 x38 parametro STATUS, 2 Accion 8 0 x39 parametro STATUS, 2 Accion 9 rs2322 ,0 ; mueve un 3 6 h ( 6 ) a W ; l o compara con l a variable parametro rs2321 rs2322 ,0 ; mueve un 3 7 h ( 7 ) a W ; l o compara con l a variable parametro rs2321 rs2322 ,0 ; mueve un 3 8 h ( 8 ) a W ; l o compara con l a variable parametro rs2321 rs2322 ,0 ; mueve un 3 9 h ( 9 ) a W ; l o compara con l a variable parametro rs2321 ;−−−−− Compara e l segu n d o comparar siguiente 1 movlw 0 x30 xorwf p arametro rs2322 b t f s c STATUS, 2 goto Accion 10 movlw 0 x31 xorwf p arametro rs2322 b t f s c STATUS, 2 goto Accion 11 movlw 0 x32 xorwf p arametro rs2322 b t f s c STATUS, 2 goto Accion 12 movlw 0 x33 xorwf p arametro rs2322 b t f s c STATUS, 2 goto Accion 13 movlw 0 x34 xorwf p arametro rs2322 b t f s c STATUS, 2 goto Accion 14 movlw 0 x35 xorwf p arametro rs2322 b t f s c STATUS, 2 goto Accion 15 movlw 0 x36 xorwf p arametro rs2322 b t f s c STATUS, 2 goto Accion 16 movlw 0 x37 xorwf p arametro rs2322 b t f s c STATUS, 2 goto Accion 17 movlw 0 x38 xorwf p arametro rs2322 b t f s c STATUS, 2 goto Accion 18 movlw 0 x39 xorwf p arametro rs2322 b t f s c STATUS, 2 goto Accion 19 ;−−−−− Compara e l segu n d o comparar siguiente 2 movlw 0 x30 xorwf p arametro rs2322 b t f s c STATUS, 2 goto Accion 20 movlw 0 x31 xorwf p arametro rs2322 b t f s c STATUS, 2 goto Accion 21 movlw 0 x32 xorwf p arametro rs2322 b t f s c STATUS, 2 goto Accion 22 movlw 0 x33 xorwf p arametro rs2322 b t f s c STATUS, 2 goto Accion 23 movlw 0 x34 xorwf p arametro rs2322 b t f s c STATUS, 2 goto Accion 24 movlw 0 x35 xorwf p arametro rs2322 b t f s c STATUS, 2 goto Accion 25 movlw 0 x36 xorwf p arametro rs2322 b y t e d e l áp ar m et r o s a b i e n d o que e l p r i m e r o f u e un uno ,0 ; mueve un 3 0 h ( 0 ) a W ; l o compara con l a variable parametro rs2322 ,0 ; mueve un 3 1 h ( 1 ) a W ; l o compara con l a variable parametro rs2321 ,0 ; mueve un 3 2 h ( 2 ) a W ; l o compara con l a variable parametro rs2321 ,0 ; mueve un 3 3 h ( 3 ) a W ; l o compara con l a variable parametro rs2321 ,0 ; mueve un 3 4 h ( 4 ) a W ; l o compara con l a variable parametro rs2321 ,0 ; mueve un 3 5 h ( 5 ) a W ; l o compara con l a variable parametro rs2321 ,0 ; mueve un 3 6 h ( 6 ) a W ; l o compara con l a variable parametro rs2321 ,0 ; mueve un 3 7 h ( 7 ) a W ; l o compara con l a variable parametro rs2321 ,0 ; mueve un 3 8 h ( 8 ) a W ; l o compara con l a variable parametro rs2321 ,0 ; mueve un 3 9 h ( 9 ) a W ; l o compara con l a variable parametro rs2321 b y t e d e l áp ar m et r o s a b i e n d o que e l p r i m e r o f u e un d os ,0 ; mueve un 3 0 h ( 0 ) a W ; l o compara con l a variable parametro rs2322 ,0 ; mueve un 3 1 h ( 1 ) a W ; l o compara con l a variable parametro rs2321 ,0 ; mueve un 3 2 h ( 2 ) a W ; l o compara con l a variable parametro rs2321 ,0 ; mueve un 3 3 h ( 3 ) a W ; l o compara con l a variable parametro rs2321 ,0 ; mueve un 3 4 h ( 4 ) a W ; l o compara con l a variable parametro rs2321 ,0 ; mueve un 3 5 h ( 5 ) a W ; l o compara con l a variable parametro rs2321 ,0 ; mueve un 3 6 h ( 6 ) a W ; l o compara con l a variable parametro rs2321 214 ANEXO C. CÓDIGOS FUENTES 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 btfsc goto movlw xorwf btfsc goto movlw xorwf btfsc goto movlw xorwf btfsc goto STATUS, 2 Accion 26 0 x37 parametro rs2322 ,0 STATUS, 2 Accion 27 0 x38 parametro rs2322 ,0 STATUS, 2 Accion 28 0 x39 parametro rs2322 ,0 STATUS, 2 Accion 29 ; mueve un 3 7 h ( 7 ) a W ; l o compara con l a variable parametro rs2321 ; mueve un 3 8 h ( 8 ) a W ; l o compara con l a variable parametro rs2321 ; mueve un 3 9 h ( 9 ) a W ; l o compara con l a variable parametro rs2321 ;−−−−− E j e c u t a ó a c c i n o n1 ( S a l i d a 1 ) Accion 1 ; f i j a r s e si la variable btfsc stop salida ,0 goto Apagar accion 1 bsf PORTB, 0 ; P r en d e s a l i d a 1 goto Terminar ejecutar Apagar accion 1 bcf PORTB, 0 goto Terminar ejecutar seteada s t o p s a l i d a á e s t seteada s t o p s a l i d a á e s t seteada s t o p s a l i d a á e s t seteada s t o p s a l i d a á e s t seteada ; Apaga s a l i d a 5 ;−−−−− E j e c u t a ó a c c i n o n6 ( S a l i d a s 1 , 2 ) Accion 6 btfsc stop salida ,0 ; f i j a r s e si la variable goto Apagar accion 6 bsf PORTB, 0 ; P r en d e s a l i d a 1 bsf PORTB, 4 ; P r en d e s a l i d a 2 goto Terminar ejecutar Apagar accion 6 bcf PORTB, 0 bcf PORTB, 4 goto Terminar ejecutar s t o p s a l i d a á e s t ; Apaga s a l i d a 4 ;−−−−− E j e c u t a ó a c c i n o n5 ( S a l i d a 5 ) Accion 5 btfsc stop salida ,0 ; f i j a r s e si la variable goto Apagar accion 5 bsf PORTB, 7 ; P r en d e s a l i d a 5 goto Terminar ejecutar Apagar accion 5 bcf PORTB, 7 goto Terminar ejecutar seteada ; Apaga s a l i d a 3 ;−−−−− E j e c u t a ó a c c i n o n4 ( S a l i d a 4 ) Accion 4 btfsc stop salida ,0 ; f i j a r s e si la variable goto Apagar accion 4 bsf PORTB, 6 ; P r en d e s a l i d a 4 goto Terminar ejecutar Apagar accion 4 bcf PORTB, 6 goto Terminar ejecutar s t o p s a l i d a á e s t ; Apaga s a l i d a 2 ;−−−−− E j e c u t a ó a c c i n o n3 ( S a l i d a 3 ) Accion 3 btfsc stop salida ,0 ; f i j a r s e si la variable goto Apagar accion 3 bsf PORTB, 5 ; P r en d e s a l i d a 3 goto Terminar ejecutar Apagar accion 3 bcf PORTB, 5 goto Terminar ejecutar seteada ; Apaga s a l i d a 1 ;−−−−− E j e c u t a ó a c c i n o n2 ( S a l i d a 2 ) Accion 2 ; f i j a r s e si la variable btfsc stop salida ,0 goto Apagar accion 2 bsf PORTB, 4 ; P r en d e s a l i d a 2 goto Terminar ejecutar Apagar accion 2 bcf PORTB, 4 goto Terminar ejecutar s t o p s a l i d a á e s t ; Apaga s a l i d a 1 ; Apaga s a l i d a 2 ;−−−−− E j e c u t a ó a c c i n o n7 ( S a l i d a s 1 , 3 ) Accion 7 btfsc stop salida ,0 ; f i j a r s e si la variable goto Apagar accion 7 bsf PORTB, 0 ; P r en d e s a l i d a 1 215 ANEXO C. CÓDIGOS FUENTES 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 bsf goto PORTB, 5 Terminar ejecutar Apagar accion 7 bcf PORTB, 0 bcf PORTB, 5 goto Terminar ejecutar ; P r en d e s a l i d a 3 ; Apaga s a l i d a 1 ; Apaga s a l i d a 3 ;−−−−− E j e c u t a ó a c c i n o n8 ( S a l i d a s 1 , 4 ) Accion 8 btfsc stop salida ,0 ; f i j a r s e si la variable goto Apagar accion 8 bsf PORTB, 0 ; P r en d e s a l i d a 1 bsf PORTB, 6 ; P r en d e s a l i d a 4 goto Terminar ejecutar Apagar accion 8 bcf PORTB, 0 bcf PORTB, 6 goto Terminar ejecutar seteada s t o p s a l i d a á e s t seteada s t o p s a l i d a á e s t seteada s t o p s a l i d a á e s t seteada ; Apaga s a l i d a 2 ; Apaga s a l i d a 5 ;−−−−− E j e c u t a ó a c c i n o n13 ( S a l i d a s 3 , 4 ) Accion 13 btfsc stop salida ,0 ; f i j a r s e si la variable goto Apagar accion 13 bsf PORTB, 5 ; P r en d e s a l i d a 3 bsf PORTB, 6 ; P r en d e s a l i d a 4 goto Terminar ejecutar Apagar accion 13 bcf PORTB, 5 bcf PORTB, 6 goto Terminar ejecutar s t o p s a l i d a á e s t ; Apaga s a l i d a 2 ; Apaga s a l i d a 4 ;−−−−− E j e c u t a ó a c c i n o n12 ( S a l i d a s 2 , 5 ) Accion 12 btfsc stop salida ,0 ; f i j a r s e si la variable goto Apagar accion 12 bsf PORTB, 4 ; P r en d e s a l i d a 2 bsf PORTB, 7 ; P r en d e s a l i d a 5 goto Terminar ejecutar Apagar accion 12 bcf PORTB, 4 bcf PORTB, 7 goto Terminar ejecutar seteada ; Apaga s a l i d a 2 ; Apaga s a l i d a 3 ;−−−−− E j e c u t a ó a c c i n o n11 ( S a l i d a s 2 , 4 ) Accion 11 btfsc stop salida ,0 ; f i j a r s e si la variable goto Apagar accion 11 bsf PORTB, 4 ; P r en d e s a l i d a 2 bsf PORTB, 6 ; P r en d e s a l i d a 4 goto Terminar ejecutar Apagar accion 11 bcf PORTB, 4 bcf PORTB, 6 goto Terminar ejecutar s t o p s a l i d a á e s t ; Apaga s a l i d a 1 ; Apaga s a l i d a 5 ;−−−−− E j e c u t a ó a c c i n o n10 ( S a l i d a s 2 , 3 ) Accion 10 btfsc stop salida ,0 ; f i j a r s e si la variable goto Apagar accion 10 bsf PORTB, 4 ; P r en d e s a l i d a 2 bsf PORTB, 5 ; P r en d e s a l i d a 3 goto Terminar ejecutar Apagar accion 10 bcf PORTB, 4 bcf PORTB, 5 goto Terminar ejecutar seteada ; Apaga s a l i d a 1 ; Apaga s a l i d a 4 ;−−−−− E j e c u t a ó a c c i n o n9 ( S a l i d a s 1 , 5 ) Accion 9 btfsc stop salida ,0 ; f i j a r s e si la variable goto Apagar accion 9 bsf PORTB, 0 ; P r en d e s a l i d a 1 bsf PORTB, 7 ; P r en d e s a l i d a 5 goto Terminar ejecutar Apagar accion 9 bcf PORTB, 0 bcf PORTB, 7 goto Terminar ejecutar s t o p s a l i d a á e s t ; Apaga s a l i d a 3 ; Apaga s a l i d a 4 ;−−−−− E j e c u t a ó a c c i n o n14 ( S a l i d a s 3 , 5 ) Accion 14 216 ANEXO C. CÓDIGOS FUENTES 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 btfsc goto bsf bsf goto stop salida ,0 Apagar accion 14 PORTB, 5 PORTB, 7 Terminar ejecutar Apagar accion 14 bcf PORTB, 5 bcf PORTB, 7 goto Terminar ejecutar ; fijarse si la variable seteada s t o p s a l i d a á e s t seteada s t o p s a l i d a á e s t seteada s t o p s a l i d a á e s t seteada s t o p s a l i d a á e s t seteada ; Apaga s a l i d a 1 ; Apaga s a l i d a 2 ; Apaga s a l i d a 4 ; Apaga s a l i d a 1 ; Apaga s a l i d a 2 ; Apaga s a l i d a 5 ;−−−−− E j e c u t a ó a c c i n o n19 ( S a l i d a s 1 , 3 , 4 ) Accion 19 btfsc stop salida ,0 ; f i j a r s e si la variable goto Apagar accion 19 bsf PORTB, 0 ; P r en d e s a l i d a 1 bsf PORTB, 5 ; P r en d e s a l i d a 3 bsf PORTB, 6 ; P r en d e s a l i d a 4 goto Terminar ejecutar Apagar accion 19 bcf PORTB, 0 bcf PORTB, 5 bcf PORTB, 6 goto Terminar ejecutar s t o p s a l i d a á e s t ; Apaga s a l i d a 1 ; Apaga s a l i d a 2 ; Apaga s a l i d a 3 ;−−−−− E j e c u t a ó a c c i n o n18 ( S a l i d a s 1 , 2 , 5 ) Accion 18 btfsc stop salida ,0 ; f i j a r s e si la variable goto Apagar accion 18 bsf PORTB, 0 ; P r en d e s a l i d a 1 bsf PORTB, 4 ; P r en d e s a l i d a 2 bsf PORTB, 7 ; P r en d e s a l i d a 5 goto Terminar ejecutar Apagar accion 18 bcf PORTB, 0 bcf PORTB, 4 bcf PORTB, 7 goto Terminar ejecutar seteada ; Apaga s a l i d a 4 ; Apaga s a l i d a 5 ;−−−−− E j e c u t a ó a c c i n o n17 ( S a l i d a s 1 , 2 , 4 ) Accion 17 btfsc stop salida ,0 ; f i j a r s e si la variable goto Apagar accion 17 bsf PORTB, 0 ; P r en d e s a l i d a 1 bsf PORTB, 4 ; P r en d e s a l i d a 2 bsf PORTB, 6 ; P r en d e s a l i d a 4 goto Terminar ejecutar Apagar accion 17 bcf PORTB, 0 bcf PORTB, 4 bcf PORTB, 6 goto Terminar ejecutar s t o p s a l i d a á e s t ; Apaga s a l i d a 3 ; Apaga s a l i d a 5 ;−−−−− E j e c u t a ó a c c i n o n16 ( S a l i d a s 1 , 2 , 3 ) Accion 16 btfsc stop salida ,0 ; f i j a r s e si la variable goto Apagar accion 16 bsf PORTB, 0 ; P r en d e s a l i d a 1 bsf PORTB, 4 ; P r en d e s a l i d a 2 bsf PORTB, 5 ; P r en d e s a l i d a 3 goto Terminar ejecutar Apagar accion 16 bcf PORTB, 0 bcf PORTB, 4 bcf PORTB, 5 goto Terminar ejecutar seteada ; P r en d e s a l i d a 3 ; P r en d e s a l i d a 5 ;−−−−− E j e c u t a ó a c c i n o n15 ( S a l i d a s 4 , 5 ) Accion 15 btfsc stop salida ,0 ; f i j a r s e si la variable goto Apagar accion 15 bsf PORTB, 6 ; P r en d e s a l i d a 4 bsf PORTB, 7 ; P r en d e s a l i d a 5 goto Terminar ejecutar Apagar accion 15 bcf PORTB, 6 bcf PORTB, 7 goto Terminar ejecutar s t o p s a l i d a á e s t ; Apaga s a l i d a 1 ; Apaga s a l i d a 3 ; Apaga s a l i d a 4 ;−−−−− E j e c u t a ó a c c i n o n20 ( S a l i d a s 1 , 3 , 5 ) Accion 20 ; fijarse btfsc stop salida ,0 goto Apagar accion 20 si la variable 217 ANEXO C. CÓDIGOS FUENTES 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 bsf bsf bsf goto PORTB, 0 PORTB, 5 PORTB, 7 Terminar ejecutar Apagar accion 20 bcf PORTB, 0 bcf PORTB, 5 bcf PORTB, 7 goto Terminar ejecutar ; P r en d e s a l i d a 1 ; P r en d e s a l i d a 3 ; P r en d e s a l i d a 5 ; Apaga s a l i d a 1 ; Apaga s a l i d a 3 ; Apaga s a l i d a 5 ;−−−−− E j e c u t a ó a c c i n o n21 ( S a l i d a s 1 , 4 , 5 ) Accion 21 btfsc stop salida ,0 ; f i j a r s e si la variable goto Apagar accion 21 bsf PORTB, 0 ; P r en d e s a l i d a 1 bsf PORTB, 6 ; P r en d e s a l i d a 4 bsf PORTB, 7 ; P r en d e s a l i d a 5 goto Terminar ejecutar Apagar accion 21 bcf PORTB, 0 bcf PORTB, 6 bcf PORTB, 7 goto Terminar ejecutar s t o p s a l i d a á e s t seteada s t o p s a l i d a á e s t seteada s t o p s a l i d a á e s t seteada ; Apaga s a l i d a 2 ; Apaga s a l i d a 4 ; Apaga s a l i d a 5 ;−−−−− E j e c u t a ó a c c i n o n25 ( S a l i d a s 3 , 4 , 5 ) Accion 25 ; f i j a r s e si la variable btfsc stop salida ,0 goto Apagar accion 25 bsf PORTB, 5 ; P r en d e s a l i d a 3 bsf PORTB, 6 ; P r en d e s a l i d a 4 bsf PORTB, 7 ; P r en d e s a l i d a 5 goto Terminar ejecutar Apagar accion 25 bcf PORTB, 5 bcf PORTB, 6 bcf PORTB, 7 goto Terminar ejecutar seteada ; Apaga s a l i d a 2 ; Apaga s a l i d a 3 ; Apaga s a l i d a 5 ;−−−−− E j e c u t a ó a c c i n o n24 ( S a l i d a s 2 , 4 , 5 ) Accion 24 btfsc stop salida ,0 ; f i j a r s e si la variable goto Apagar accion 24 bsf PORTB, 4 ; P r en d e s a l i d a 2 bsf PORTB, 6 ; P r en d e s a l i d a 4 bsf PORTB, 7 ; P r en d e s a l i d a 5 goto Terminar ejecutar Apagar accion 24 bcf PORTB, 4 bcf PORTB, 6 bcf PORTB, 7 goto Terminar ejecutar s t o p s a l i d a á e s t ; Apaga s a l i d a 2 ; Apaga s a l i d a 3 ; Apaga s a l i d a 4 ;−−−−− E j e c u t a ó a c c i n o n23 ( S a l i d a s 2 , 3 , 5 ) Accion 23 btfsc stop salida ,0 ; f i j a r s e si la variable goto Apagar accion 23 bsf PORTB, 4 ; P r en d e s a l i d a 2 bsf PORTB, 5 ; P r en d e s a l i d a 3 bsf PORTB, 7 ; P r en d e s a l i d a 5 goto Terminar ejecutar Apagar accion 23 bcf PORTB, 4 bcf PORTB, 5 bcf PORTB, 7 goto Terminar ejecutar seteada ; Apaga s a l i d a 1 ; Apaga s a l i d a 4 ; Apaga s a l i d a 5 ;−−−−− E j e c u t a ó a c c i n o n22 ( S a l i d a s 2 , 3 , 4 ) Accion 22 ; f i j a r s e si la variable btfsc stop salida ,0 goto Apagar accion 22 bsf PORTB, 4 ; P r en d e s a l i d a 2 bsf PORTB, 5 ; P r en d e s a l i d a 3 bsf PORTB, 6 ; P r en d e s a l i d a 4 goto Terminar ejecutar Apagar accion 22 bcf PORTB, 4 bcf PORTB, 5 bcf PORTB, 6 goto Terminar ejecutar s t o p s a l i d a á e s t ; Apaga s a l i d a 3 ; Apaga s a l i d a 4 ; Apaga s a l i d a 5 ;−−−−− E j e c u t a ó a c c i n o n26 ( S a l i d a s 1 , 2 , 3 , 4 ) Accion 26 218 ANEXO C. CÓDIGOS FUENTES 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 btfsc goto bsf bsf bsf bsf goto stop salida ,0 Apagar accion 26 PORTB, 0 PORTB, 4 PORTB, 5 PORTB, 6 Terminar ejecutar Apagar accion 26 bcf PORTB, 0 bcf PORTB, 4 bcf PORTB, 5 bcf PORTB, 6 goto Terminar ejecutar ; fijarse si ; ; ; ; P r en d e P r en d e P r en d e P r en d e ; ; ; ; Apaga Apaga Apaga Apaga ; ; ; ; Apaga Apaga Apaga Apaga salida salida salida salida ; ; ; ; Apaga Apaga Apaga Apaga ; ; ; ; Apaga Apaga Apaga Apaga ; ; ; ; Apaga Apaga Apaga Apaga seteada s t o p s a l i d a á e s t seteada s t o p s a l i d a á e s t seteada s t o p s a l i d a á e s t seteada 1 2 4 5 variable 1 3 4 5 1 3 4 5 variable salida salida salida salida salida salida salida salida s t o p s a l i d a á e s t 1 2 4 5 salida salida salida salida la seteada 1 2 3 5 salida salida salida salida la s t o p s a l i d a á e s t 1 2 3 5 variable salida salida salida salida ;−−−−− E j e c u t a ó a c c i n o n30 ( S a l i d a s 2 , 3 , 4 , 5 ) Accion 30 btfsc stop salida ,0 ; fijarse si goto Apagar accion 30 bsf PORTB, 4 ; P r en d e bsf PORTB, 5 ; P r en d e bsf PORTB, 6 ; P r en d e bsf PORTB, 7 ; P r en d e goto Terminar ejecutar Apagar accion 30 bcf PORTB, 4 bcf PORTB, 5 bcf PORTB, 6 bcf PORTB, 7 goto Terminar ejecutar la seteada 1 2 3 4 variable salida salida salida salida ;−−−−− E j e c u t a ó a c c i n o n29 ( S a l i d a s 1 , 3 , 4 , 5 ) Accion 29 btfsc stop salida ,0 ; fijarse si goto Apagar accion 29 bsf PORTB, 0 ; P r en d e bsf PORTB, 5 ; P r en d e bsf PORTB, 6 ; P r en d e bsf PORTB, 7 ; P r en d e goto Terminar ejecutar Apagar accion 29 bcf PORTB, 0 bcf PORTB, 5 bcf PORTB, 6 bcf PORTB, 7 goto Terminar ejecutar la s t o p s a l i d a á e s t 1 2 3 4 salida salida salida salida salida salida salida salida ;−−−−− E j e c u t a ó a c c i n o n28 ( S a l i d a s 1 , 2 , 4 , 5 ) Accion 28 ; fijarse si btfsc stop salida ,0 goto Apagar accion 28 bsf PORTB, 0 ; P r en d e bsf PORTB, 4 ; P r en d e bsf PORTB, 6 ; P r en d e bsf PORTB, 7 ; P r en d e goto Terminar ejecutar Apagar accion 28 bcf PORTB, 0 bcf PORTB, 4 bcf PORTB, 6 bcf PORTB, 7 goto Terminar ejecutar variable salida salida salida salida ;−−−−− E j e c u t a ó a c c i n o n27 ( S a l i d a s 1 , 2 , 3 , 5 ) Accion 27 ; fijarse si btfsc stop salida ,0 goto Apagar accion 27 bsf PORTB, 0 ; P r en d e bsf PORTB, 4 ; P r en d e bsf PORTB, 5 ; P r en d e bsf PORTB, 7 ; P r en d e goto Terminar ejecutar Apagar accion 27 bcf PORTB, 0 bcf PORTB, 4 bcf PORTB, 5 bcf PORTB, 7 goto Terminar ejecutar la 2 3 4 5 2 3 4 5 ;−−−−− E j e c u t a ó a c c i n o n31 ( S a l i d a s 1 , 2 , 3 , 4 , 5 ) Accion 31 btfsc stop salida ,0 ; f i j a r s e si la variable goto Apagar accion 31 bsf PORTB, 0 ; P r en d e s a l i d a 1 219 ANEXO C. CÓDIGOS FUENTES 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 bsf bsf bsf bsf goto Apagar accion 31 bcf PORTB, 0 bcf PORTB, 4 bcf PORTB, 5 bcf PORTB, 6 bcf PORTB, 7 goto Terminar ejecutar 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 ; ; ; ; P r en d e P r en d e P r en d e P r en d e ; ; ; ; ; Apaga Apaga Apaga Apaga Apaga salida salida salida salida salida salida salida salida salida 2 3 4 5 1 2 3 4 5 ;−−−−− E j e c u t a ó a c c i n o n32 ( FF) Accion 32 goto Terminar ejecutar ;−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ; INICIALIZACION DE LA EEPROM ;−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ORG DE 0 x2100 0 x00 , 0 x01 , 0 x02 , 0 x03 END C.6. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 PORTB, 4 PORTB, 5 PORTB, 6 PORTB, 7 Terminar ejecutar ; Fi n d e l programa Código IrAiwa.asm ; Filename : o b l i g a t o r i o . asm ∗ ; Date : 18/10/05 ∗ ; F il e Version : 13.0 ∗ ; ∗ ; Author : F e d e r i c o P a i s ( 1 2 7 5 5 6 ) − Alan Cohn ( 1 3 7 0 3 3 ) ∗ ; Company : U n i v e r s i d a d ORT ∗ ; ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗∗ ∗ ∗∗ ∗ ∗∗ ∗ ∗∗ ∗ ∗∗ ∗ ∗∗ ∗ ∗∗ ∗ ∗∗ ∗ ∗∗ ∗ ∗∗ ∗ ∗∗ ∗ ∗∗ ∗ ∗∗ ∗ ∗∗ ∗ ∗∗ ∗ ∗∗ ∗ ∗∗ ∗ ∗∗ list p=16f628A #i n c l u d e <p16F628A . i n c > errorlevel −302 ; ; l i s t d i r e c t i v e to d e f i n e p r oc e ss o r processor s p e c i f i c variable d ef i ni t io n s ; suppress m essage 3 0 2 fr om list file CONFIG CP OFF & DATA CP OFF & LVP OFF & BOREN OFF & MCLRE ON & WDT OFF & PWRTE ON & INTOSC OSC NOCLKOUT ; ∗ ∗ ∗ ∗ ∗ VARIABLE DEFINITIONS w temp EQU 0 x71 ; v a r i a b l e u sed f o r c o n t e x t s a v i n g s t a t u s t e m p EQU 0 x72 ; v a r i a b l e u sed f o r c o n t e x t s a v i n g veces EQU 0 x21 ; v a r i a b l e que c u e n t a i n t e r r u p c i o n e s d e l TMR0 enc1 EQU 0 x22 ; v a r i a b l e que gu ar d a e l p r i m e r b y t e d e l e n c a b e z a d o IR enc2 EQU 0 x23 ; v a r i a b l e que gu ar d a e l segu n d o b y t e d e l e n c a b e z a d o IR enc3 EQU 0 x24 ; v a r i a b l e que gu ar d a e l t e r c e r b y t e d e l e n c a b e z a d o IR num1a EQU 0 x25 ; v a r i a b l e que gu ar d a e l p r i m e r b y t e d e l 1 IR num1b EQU 0 x26 ; v a r i a b l e que gu ar d a e l segu n d o b y t e d e l 1 IR num2a EQU 0 x27 ; v a r i a b l e que gu ar d a e l p r i m e r b y t e d e l 2 IR num2b EQU 0 x28 ; v a r i a b l e que gu ar d a e l segu n d o b y t e d e l 2 IR num3a EQU 0 x29 ; v a r i a b l e que gu ar d a e l p r i m e r b y t e d e l 3 IR num3b EQU 0x2A ; v a r i a b l e que gu ar d a e l segu n d o b y t e d e l 3 IR num4a EQU 0x2B ; v a r i a b l e que gu ar d a e l p r i m e r b y t e d e l 4 IR num4b EQU 0x2C ; v a r i a b l e que gu ar d a e l segu n d o b y t e d e l 4 IR num5a EQU 0x2D ; v a r i a b l e que gu ar d a e l p r i m e r b y t e d e l 5 IR num5b EQU 0x2E ; v a r i a b l e que gu ar d a e l segu n d o b y t e d e l 5 IR num6a EQU 0x2F ; v a r i a b l e que gu ar d a e l p r i m e r b y t e d e l 6 IR num6b EQU 0 x30 ; v a r i a b l e que gu ar d a e l segu n d o b y t e d e l 6 IR num7a EQU 0 x31 ; v a r i a b l e que gu ar d a e l p r i m e r b y t e d e l 7 IR num7b EQU 0 x32 ; v a r i a b l e que gu ar d a e l segu n d o b y t e d e l 7 IR num8a EQU 0 x33 ; v a r i a b l e que gu ar d a e l p r i m e r b y t e d e l 8 IR num8b EQU 0 x34 ; v a r i a b l e que gu ar d a e l segu n d o b y t e d e l 8 IR num9a EQU 0 x35 ; v a r i a b l e que gu ar d a e l p r i m e r b y t e d e l 9 IR num9b EQU 0 x36 ; v a r i a b l e que gu ar d a e l segu n d o b y t e d e l 9 IR num0a EQU 0 x37 ; v a r i a b l e que gu ar d a e l p r i m e r b y t e d e l 0 IR num0b EQU 0 x38 ; v a r i a b l e que gu ar d a e l segu n d o b y t e d e l 0 IR playa EQU 0 x39 ; v a r i a b l e que gu ar d a e l p r i m e r b y t e d e l PLAY IR playb EQU 0x3A ; v a r i a b l e que gu ar d a e l segu n d o b y t e d e l PLAY IR repeata EQU 0x3B ; v a r i a b l e que gu ar d a e l p r i m e r b y t e d e l REPEAT IR repeatb EQU 0x3C ; v a r i a b l e que gu ar d a e l segu n d o b y t e d e l REPEAT IR memorya EQU 0x3D ; v a r i a b l e que gu ar d a e l p r i m e r b y t e d e l MEMORY IR memoryb EQU 0 x3E ; v a r i a b l e que gu ar d a e l segu n d o b y t e d e l MEMORY IR cancela EQU 0 x3F ; v a r i a b l e que gu ar d a e l p r i m e r b y t e d e l CANCEL IR cancelb EQU 0 x40 ; v a r i a b l e que gu ar d a e l segu n d o b y t e d e l CANCEL IR surrounda EQU 0 x41 ; v a r i a b l e que gu ar d a e l p r i m e r b y t e d e l SURROUND IR surroundb EQU 0 x42 ; v a r i a b l e que gu ar d a e l segu n d o b y t e d e l SURROUND IR sbacka EQU 0 x43 ; v a r i a b l e que gu ar d a e l p r i m e r b y t e d e l SKIP BACK IR sb ackb EQU 0 x44 ; v a r i a b l e que gu ar d a e l segu n d o b y t e d e l SKIP BACK IR sforwarda EQU 0 x45 ; v a r i a b l e que gu ar d a e l p r i m e r b y t e d e l SKIP FORWARD IR 220 ANEXO C. CÓDIGOS FUENTES 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 sforwardb EQU stopa EQU stopb EQU contador EQU aux EQU dato EQU flag EQU b u scad o EQU 0 x46 0 x47 0 x48 0 x49 0x4A 0x4B 0x4C 0x4D ; ; ; ; ; v a r i a b l e que gu ar d a e l segu n d o b y t e d e l SKIP FORWARD IR v a r i a b l e que gu ar d a e l p r i m e r b y t e d e l STOP IR v a r i a b l e que gu ar d a e l segu n d o b y t e d e l STOP IR ; v a r i a b l e que c u e n t a l a s v e c e s que s e r o t a un b y t e ; v a r i a b l e que gu ar d a e l b y t e IR a t r a s m i t i r v a r i a b l e u sad a p a r a g u a r d a r e l d a t o r e c i b i d o p or l a UART v a r i a b l e que a v i s a cuando s e p r o d u c e una i n t de Rx ; v a r i a b l e que a v i s a cuando s e t r a n s m i t i o un c o d i g o v a l i d o ; ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗∗ ∗ ∗∗ ∗∗ ∗ ∗∗ ∗ ∗∗ ∗ ∗∗ ∗ ∗∗ ∗ ∗∗ ∗ ∗∗ ∗ ∗∗ ∗∗ ∗ ∗∗ ∗ ∗∗ ∗ ∗∗ ∗ ∗∗ ∗ ∗∗ ∗ ∗∗ ∗∗ ∗ ∗∗ ∗ ∗∗ ∗ ∗∗ ∗ ORG goto 0 x000 main ; processor reset ; go t o b e g i n n i n g ORG 0 x004 ; interrupt vector vector o f program location ;−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ; MANEJADOR DE INTERRUPCIONES ;−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− movwf w temp ; save o f f c u r r e n t W re g i ste r c o n t e n t s movf STATUS, w ; move s t a t u s r e g i s t e r i n t o W r e g i s t e r ; s a v e o f f c o n t e n t s o f STATUS r e g i s t e r movwf s t a t u s t e m p btfsc INTCON, 2 goto isrT0 b t f s c PIR1 , RCIF goto ISR RX ; TMR0 i n t e r r u m p i o ? ; RX i n t e r r u m p i o ? fin isr movf status temp ,w movwf STATUS swap f w temp , f swap f w temp , w retfie ; ; r e t r i e v e cop y o f STATUS r e g i s t e r r e s t o r e p r e− i s r STATUS r e g i s t e r c o n t e n t s ; r e s t o r e p r e− i s r W r e g i s t e r ; return from i n t e r r u p t ; −−−−− ISR t i m e r 0 −−−−−− isrT0 movlw d ’ 205 ’ movwf TMR0 ; bcf INTCON, 2 ; se incf veces , 1 ; goto fin isr contents ; cuenta 50 microseg s e e s c r i b e e l r e g i s t r o TMR0 b o r r a e l TOIF incrementa v a r i a b l e veces ; −−−−− ISR ó r e c e p c i n USART −−−−− ISR RX bsf flag ,0 ; s e t e a e l b i t 0 en 1 movf RCREG,W ; l e e l o que l l e g a y l o gu ar d a en W movwf d a t o goto fin isr ;−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ; PROGRAMA PRINCIPAL ;−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− main ;−−−−−− I n i c i a l i z a c i o n movlw 0 x21 movwf FSR otro clrf INDF incf FSR, 1 movlw 0x4C x o r w f FSR, 0 b t f s s STATUS, 2 goto otro de v a r i a b l e s −−− ; e s c r i b e 2 1 h en W ; borra l a ó d i r e c c i n de memoria que á e s t en INDF ; e s c r i b e 4 Ch en W ; compara que s e hayan b o r r a d o todas las ;−−−−−− L e c t u r a de l a EEPROM y gu ar d ad o en l a RAM−−− movlw 0 x04 ; e s c r i b e un 4 h en W movwf aux movlw 0 x22 ; e s c r i b e un 2 2 h en W movwf FSR otros movf aux , 0 ; mueve e l c o n t e n i d o de aux a W call eeprom rd movwf INDF incf FSR, 1 incf aux , 1 movlw 0 x49 ; comprueba que s e hayan gu ar d ad o t o d o s x o r w f FSR, 0 b t f s s STATUS, 2 goto otros d i r e c c i o n e s de memoria los datos Seteos ;−−−−−− S e t e o d e l modulo PWM−−−− clrf CCP1CON ; s e l i m p i a e l r e g i s t r o CCP1CON bsf STATUS, RP0 ; i r a l b an co 1 movlw d ’ 26 ’ ; s e t e a d e l p e r i o d o d e l PWM a 3 8KHz movwf PR2 ; s e e s c r i b e e l PR2 221 ANEXO C. CÓDIGOS FUENTES 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 bcf bcf movlw movwf movlw movwf TRISB , 3 STATUS, RP0 0xD CCPR1L b ’ 00000100 ’ T2CON ; ; ; ; se ; s e h a c e e l p i n CCP1 de s a l i d a l i m p i a n d o ; i r a l b an co 0 s e t e a d e l c i c l o de t r a b a j o d e l PWM a l 50 % s e e s c r i b e e l CCPR1L s e t e o s d e l TMR2 ON y l a p r e e s c a l a 1 : 1 e s c r i b e e l r e g i s t r o T2CON e l TRISB<3> ;−−−−−− S e t e o d e l TMR0−−−−−−−−−−− clrwdt ; s e l i m p i a e l WDT clrf TMR0 ; s e l i m p i a e l r e g i s t r o TMR0 movlw d ’ 205 ’ ; cuenta 50 microseg movwf TMR0 ; s e e s c r i b e e l r e g i s t r o TMR0 movlw b ’ 00001000 ’ ; s e t e a l a c u e n t a d e l TMR0 bsf STATUS, RP0 ; i r a l b an co 1 ; s e e s c r i b e e l OPTION REG movwf OPTION REG ;−−−−−− S e t e o d e l p e r i f e r i c o RS−232 −−−−−− movlw d ’ 25 ’ ; 9 6 0 0 b a u d i o s ( 4 MHz, BRGH=1) movwf SPBRG movlw b ’ 00100100 ’ movwf TXSTA bcf STATUS, RP0 ; i r a l b an co 0 movlw b ’ 10010000 ’ ; SPEN= 1 , CREN=1 movwf RCSTA ; h a b i l i t a e l puerto s e r i e y la recepcion continua movf RCREG,W ; l e e 2 v e c e s e l RCREG p or s i h a b i a b a s u r a movf RCREG,W ;−−−−−− S e t e o s de p u e r t o s de I /O −−− movlw 0 x20 ; pone un 3 2 en W movwf TRISA ; PORTA p u e r t o de s a l i d a , RA5 e n t r a d a bsf TRISB , 1 ; s e t e a RB1/Rx como p i n de e n t r a d a bcf STATUS, RP0 ; i r a l b an co 0 movlw 0 x7 ; ap aga c o m p a r a d o r e s movwf CMCON ;−−−−−− H a b i l i t a c i o n de i n t e r r u p c i o n e s −−− bsf INTCON, 7 ; h a b i l i t a l a s i n t e r r u p c i o n e s − GIE bsf INTCON, 5 ; h a b i l i t a l a i n t e r r u p c i o n d e l TMR0 bsf INTCON, PEIE ; ha bili ta interrupcion p e ri fe r i c a bsf STATUS, RP0 ; i r a l b an co 1 bsf PIE1 , RCIE ; h a b i l i t a i n t e r r u p c i o n de r e c e p c i o n de USART bcf STATUS, RP0 ; i r a l b an co 0 call envioRS232 start loop principal btfsc flag ,0 call Recibir goto loop principal ; Rx i n t e r r u m p i o ? ; loop forever ;−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ; SUBRUTINAS PARA LA TRASMISION IR ;−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ;−−−−−− S u b r u t i n a que d e c i d e que c o d i g o IR e n v i a r Recibir movlw 0 x30 ; e s c r i b e un 0 en c o d i g o ASCII xorwf d at o , 0 ; l o compara con e l d a t o b t f s c STATUS, 2 call transmito 0 movlw 0 x31 ; e s c r i b e un 1 en c o d i g o ASCII xorwf d at o , 0 ; l o compara con e l d a t o b t f s c STATUS, 2 call transmito 1 movlw 0 x32 ; e s c r i b e un 2 en c o d i g o ASCII xorwf d at o , 0 ; l o compara con e l d a t o b t f s c STATUS, 2 call transmito 2 movlw 0 x33 ; e s c r i b e un 3 en c o d i g o ASCII xorwf d at o , 0 ; l o compara con e l d a t o b t f s c STATUS, 2 call transmito 3 movlw 0 x34 ; e s c r i b e un 4 en c o d i g o ASCII xorwf d at o , 0 ; l o compara con e l d a t o b t f s c STATUS, 2 call transmito 4 movlw 0 x35 ; e s c r i b e un 5 en c o d i g o ASCII xorwf d at o , 0 ; l o compara con e l d a t o b t f s c STATUS, 2 call transmito 5 movlw 0 x36 ; e s c r i b e un 6 en c o d i g o ASCII xorwf d at o , 0 ; l o compara con e l d a t o b t f s c STATUS, 2 call transmito 6 movlw 0 x37 ; e s c r i b e un 7 en c o d i g o ASCII xorwf d at o , 0 ; l o compara con e l d a t o b t f s c STATUS, 2 call transmito 7 en W recibido en W recibido en W recibido en W recibido en W recibido en W recibido en W recibido en W recibido 222 ANEXO C. CÓDIGOS FUENTES 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 movlw 0 x38 ; e s c r i b e un 8 en c o d i g o ASCII en W xorwf d at o , 0 ; l o compara con e l d a t o r e c i b i d o b t f s c STATUS, 2 call transmito 8 movlw 0 x39 ; e s c r i b e un 9 en c o d i g o ASCII en W xorwf d at o , 0 ; l o compara con e l d a t o r e c i b i d o b t f s c STATUS, 2 call transmito 9 movlw 0 x70 ; e s c r i b e una p en c o d i g o ASCII en W xorwf d at o , 0 ; l o compara con e l d a t o r e c i b i d o b t f s c STATUS, 2 call transmito play movlw 0 x50 ; e s c r i b e una P en c o d i g o ASCII en W xorwf d at o , 0 ; l o compara con e l d a t o r e c i b i d o b t f s c STATUS, 2 call transmito play movlw 0 x72 ; e s c r i b e una r en c o d i g o ASCII en W xorwf d at o , 0 ; l o compara con e l d a t o r e c i b i d o b t f s c STATUS, 2 call transmito repeat movlw 0 x52 ; e s c r i b e una R en c o d i g o ASCII en W xorwf d at o , 0 ; l o compara con e l d a t o r e c i b i d o b t f s c STATUS, 2 call transmito repeat movlw 0x6D ; e s c r i b e una m en c o d i g o ASCII en W xorwf d at o , 0 ; l o compara con e l d a t o r e c i b i d o b t f s c STATUS, 2 call t r an sm i t o m em or y movlw 0x4D ; e s c r i b e una M en c o d i g o ASCII en W xorwf d at o , 0 ; l o compara con e l d a t o r e c i b i d o b t f s c STATUS, 2 call t r an sm i t o m em or y movlw 0 x63 ; e s c r i b e una c en c o d i g o ASCII en W xorwf d at o , 0 ; l o compara con e l d a t o r e c i b i d o b t f s c STATUS, 2 call transmito cancel movlw 0 x43 ; e s c r i b e una C en c o d i g o ASCII en W xorwf d at o , 0 ; l o compara con e l d a t o r e c i b i d o b t f s c STATUS, 2 call transmito cancel movlw 0 x64 ; e s c r i b e una d en c o d i g o ASCII en W xorwf d at o , 0 ; l o compara con e l d a t o r e c i b i d o b t f s c STATUS, 2 call transmito surround movlw 0 x44 ; e s c r i b e una D en c o d i g o ASCII en W xorwf d at o , 0 ; l o compara con e l d a t o r e c i b i d o b t f s c STATUS, 2 call transmito surround movlw 0 x62 ; e s c r i b e una b en c o d i g o ASCII en W xorwf d at o , 0 ; l o compara con e l d a t o r e c i b i d o b t f s c STATUS, 2 call transmito back movlw 0 x42 ; e s c r i b e una B en c o d i g o ASCII en W xorwf d at o , 0 ; l o compara con e l d a t o r e c i b i d o b t f s c STATUS, 2 call transmito back movlw 0 x66 ; e s c r i b e una f en c o d i g o ASCII en W xorwf d at o , 0 ; l o compara con e l d a t o r e c i b i d o b t f s c STATUS, 2 call transmito forward movlw 0 x46 ; e s c r i b e una F en c o d i g o ASCII en W xorwf d at o , 0 ; l o compara con e l d a t o r e c i b i d o b t f s c STATUS, 2 call transmito forward movlw 0 x73 ; e s c r i b e una s en c o d i g o ASCII en W xorwf d at o , 0 ; l o compara con e l d a t o r e c i b i d o b t f s c STATUS, 2 call transmito stop movlw 0 x53 ; e s c r i b e una S en c o d i g o ASCII en W xorwf d at o , 0 ; l o compara con e l d a t o r e c i b i d o b t f s c STATUS, 2 call transmito stop movlw 0 x01 ; e s c r i b e un 1 h en W x o r w f b u scad o , 0 ; l o compara con e l f l a g b u scad o b t f s s STATUS, 2 call envioRS232 error clrf b u scad o return ; −−−−− S u b r u t i n a que t r a n s m i t e e l i n i c i o áms e l e n c a b e z a d o −−− transmitir inicial bcf INTCON, PEIE ; deshabilita interrupcion p er i f e r i c a call convertir ini movf en c1 , 0 ; mueve e n c 1 a W movwf aux ; mueve e l c o n t e n i d o de W a aux clrf contador ; se l i m p i a l a v a r i a b l e contador call convertir ir movf en c2 , 0 ; mueve e n c 2 a W 223 ANEXO C. CÓDIGOS FUENTES 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 movwf aux ; mueve e l c o n t e n i d o clrf contador ; se limpia la v ar iab le call convertir ir movf en c3 , 0 ; mueve e n c 3 a W movwf aux ; mueve e l c o n t e n i d o clrf contador ; se limpia la v ar iab le call convertir ir clrf contador call convertir enc fin return de W a aux contador de W a aux contador ; −−−− S u b r u t i n a que t r a n s m i t e e l ó c d i g o de d a t o s c o r r e s p o n d i e n t e transmito 0 call transmitir inicial movf num0a , 0 ; mueve num0a a W movwf aux ; mueve e l c o n t e n i d o de W a aux clrf contador ; se l i m p i a l a v a r i a b l e contador call convertir ir movf num0b , 0 ; mueve num0b a W movwf aux ; mueve e l c o n t e n i d o de W a aux clrf contador ; se l i m p i a l a v a r i a b l e contador call convertir ir call convertir fin call envioRS232 num return al ; −−−− S u b r u t i n a que t r a n s m i t e e l ó c d i g o de d a t o s c o r r e s p o n d i e n t e transmito 1 call transmitir inicial movf num1a , 0 ; mueve num1a a W movwf aux ; mueve e l c o n t e n i d o de W a aux clrf contador ; se l i m p i a l a v a r i a b l e contador call convertir ir movf num1b , 0 ; mueve num1b a W movwf aux ; mueve e l c o n t e n i d o de W a aux clrf contador ; se l i m p i a l a v a r i a b l e contador call convertir ir call convertir fin call envioRS232 num return a l uno ; −−−− S u b r u t i n a que t r a n s m i t e e l ó c d i g o de d a t o s c o r r e s p o n d i e n t e transmito 2 call transmitir inicial movf num2a , 0 ; mueve num2a a W movwf aux ; mueve e l c o n t e n i d o de W a aux clrf contador ; se l i m p i a l a v a r i a b l e contador call convertir ir movf num2b , 0 ; mueve num2b a W movwf aux ; mueve e l c o n t e n i d o de W a aux clrf contador ; se l i m p i a l a v a r i a b l e contador call convertir ir call convertir fin call envioRS232 num return al d os ; −−−− S u b r u t i n a que t r a n s m i t e e l ó c d i g o de d a t o s c o r r e s p o n d i e n t e transmito 3 call transmitir inicial movf num3a , 0 ; mueve num3a a W movwf aux ; mueve e l c o n t e n i d o de W a aux clrf contador ; se l i m p i a l a v a r i a b l e contador call convertir ir movf num3b , 0 ; mueve num3b a W movwf aux ; mueve e l c o n t e n i d o de W a aux clrf contador ; se l i m p i a l a v a r i a b l e contador call convertir ir call convertir fin call envioRS232 num return al tres ; −−−− S u b r u t i n a que t r a n s m i t e e l ó c d i g o de d a t o s c o r r e s p o n d i e n t e transmito 4 call transmitir inicial movf num4a , 0 ; mueve num4a a W movwf aux ; mueve e l c o n t e n i d o de W a aux clrf contador ; se l i m p i a l a v a r i a b l e contador call convertir ir movf num4b , 0 ; mueve num4b a W movwf aux ; mueve e l c o n t e n i d o de W a aux clrf contador ; se l i m p i a l a v a r i a b l e contador call convertir ir call convertir fin call envioRS232 num return al cuatro ; −−−− S u b r u t i n a que t r a n s m i t e transmito 5 al cinco e l ó c d i g o de d a t o s correspondiente cero 224 ANEXO C. CÓDIGOS FUENTES 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 call transmitir inicial movf num5a , 0 ; movwf aux ; clrf contador ; se call convertir ir movf num5b , 0 ; movwf aux ; clrf contador ; se call convertir ir call convertir fin call envioRS232 num return mueve num5a a W mueve e l c o n t e n i d o de W a aux l i m p i a l a v a r i a b l e contador mueve num5b a W mueve e l c o n t e n i d o de W a aux l i m p i a l a v a r i a b l e contador ; −−−− S u b r u t i n a que t r a n s m i t e e l ó c d i g o de d a t o s c o r r e s p o n d i e n t e transmito 6 call transmitir inicial movf num6a , 0 ; mueve num6a a W movwf aux ; mueve e l c o n t e n i d o de W a aux clrf contador ; se l i m p i a l a v a r i a b l e contador call convertir ir movf num6b , 0 ; mueve num6b a W movwf aux ; mueve e l c o n t e n i d o de W a aux clrf contador ; se l i m p i a l a v a r i a b l e contador call convertir ir call convertir fin call envioRS232 num return al seis ; −−−− S u b r u t i n a que t r a n s m i t e e l ó c d i g o de d a t o s c o r r e s p o n d i e n t e transmito 7 call transmitir inicial movf num7a , 0 ; mueve num7a a W movwf aux ; mueve e l c o n t e n i d o de W a aux clrf contador ; se l i m p i a l a v a r i a b l e contador call convertir ir movf num7b , 0 ; mueve num7b a W movwf aux ; mueve e l c o n t e n i d o de W a aux clrf contador ; se l i m p i a l a v a r i a b l e contador call convertir ir call convertir fin call envioRS232 num return al siete ; −−−− S u b r u t i n a que t r a n s m i t e e l ó c d i g o de d a t o s c o r r e s p o n d i e n t e transmito 8 call transmitir inicial movf num8a , 0 ; mueve num8a a W movwf aux ; mueve e l c o n t e n i d o de W a aux clrf contador ; se l i m p i a l a v a r i a b l e contador call convertir ir movf num8b , 0 ; mueve num8b a W movwf aux ; mueve e l c o n t e n i d o de W a aux clrf contador ; se l i m p i a l a v a r i a b l e contador call convertir ir call convertir fin call envioRS232 num return al och o ; −−−− S u b r u t i n a que t r a n s m i t e e l ó c d i g o de d a t o s c o r r e s p o n d i e n t e transmito 9 call transmitir inicial movf num9a , 0 ; mueve num9a a W movwf aux ; mueve e l c o n t e n i d o de W a aux clrf contador ; se l i m p i a l a v a r i a b l e contador call convertir ir movf num9b , 0 ; mueve num9b a W movwf aux ; mueve e l c o n t e n i d o de W a aux clrf contador ; se l i m p i a l a v a r i a b l e contador call convertir ir call convertir fin call envioRS232 num return al n u eve ; −−−− S u b r u t i n a que t r a n s m i t e e l ó c d i g o de d a t o s c o r r e s p o n d i e n t e transmito play call transmitir inicial movf playa , 0 ; mueve p l a y a a W movwf aux ; mueve e l c o n t e n i d o de W a aux clrf contador ; se l i m p i a l a v a r i a b l e contador call convertir ir movf p l ayb , 0 ; mueve p l a y b a W movwf aux ; mueve e l c o n t e n i d o de W a aux clrf contador ; se l i m p i a l a v a r i a b l e contador call convertir ir call convertir fin call envioRS232 play return al play 225 ANEXO C. CÓDIGOS FUENTES 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 ; −−−− S u b r u t i n a que t r a n s m i t e e l ó c d i g o de d a t o s c o r r e s p o n d i e n t e transmito repeat call transmitir inicial movf repeata ,0 ; mueve r e p e a t a a W movwf aux ; mueve e l c o n t e n i d o de W a aux clrf contador ; se l i m p i a l a v a r i a b l e contador call convertir ir movf repeatb , 0 ; mueve r e p e a t b a W movwf aux ; mueve e l c o n t e n i d o de W a aux clrf contador ; se l i m p i a l a v a r i a b l e contador call convertir ir call convertir fin call envioRS232 repeat return al ; −−−− S u b r u t i n a que t r a n s m i t e e l ó c d i g o de d a t o s c o r r e s p o n d i e n t e t r an sm i t o m em or y call transmitir inicial movf memorya , 0 ; mueve memorya a W movwf aux ; mueve e l c o n t e n i d o de W a aux clrf contador ; se l i m p i a l a v a r i a b l e contador call convertir ir movf memoryb , 0 ; mueve memoryb a W movwf aux ; mueve e l c o n t e n i d o de W a aux clrf contador ; se l i m p i a l a v a r i a b l e contador call convertir ir call convertir fin call envioRS232 memory return a l memory ; −−−− S u b r u t i n a que t r a n s m i t e e l ó c d i g o de d a t o s c o r r e s p o n d i e n t e transmito cancel call transmitir inicial movf cancela ,0 ; mueve c a n c e l a a W movwf aux ; mueve e l c o n t e n i d o de W a aux clrf contador ; se l i m p i a l a v a r i a b l e contador call convertir ir movf cancelb ,0 ; mueve c a n c e l b a W movwf aux ; mueve e l c o n t e n i d o de W a aux clrf contador ; se l i m p i a l a v a r i a b l e contador call convertir ir call convertir fin call envioRS232 cancel return al cancel ; −−−− S u b r u t i n a que t r a n s m i t e e l ó c d i g o de d a t o s c o r r e s p o n d i e n t e transmito surround call transmitir inicial movf surrounda , 0 ; mueve s u r r o u n d a a W movwf aux ; mueve e l c o n t e n i d o de W a aux clrf contador ; se l i m p i a l a v a r i a b l e contador call convertir ir movf su r r ou n d b , 0 ; mueve s u r r o u n d b a W movwf aux ; mueve e l c o n t e n i d o de W a aux clrf contador ; se l i m p i a l a v a r i a b l e contador call convertir ir call convertir fin call envioRS232 surround return al surround ; −−−− S u b r u t i n a que t r a n s m i t e e l ó c d i g o de d a t o s c o r r e s p o n d i e n t e transmito back call transmitir inicial movf sb acka , 0 ; mueve s b a c k a a W movwf aux ; mueve e l c o n t e n i d o de W a aux clrf contador ; se l i m p i a l a v a r i a b l e contador call convertir ir movf sb ackb , 0 ; mueve sb ackb a W movwf aux ; mueve e l c o n t e n i d o de W a aux clrf contador ; se l i m p i a l a v a r i a b l e contador call convertir ir call convertir fin call envioRS232 back return al s k i p b ack ; −−−− S u b r u t i n a que t r a n s m i t e e l ó c d i g o de d a t o s c o r r e s p o n d i e n t e transmito forward call transmitir inicial movf sforwarda , 0 ; mueve s f o r w a r d a a W movwf aux ; mueve e l c o n t e n i d o de W a aux clrf contador ; se l i m p i a l a v a r i a b l e contador call convertir ir movf sforwardb , 0 ; mueve s f o r w a r d b a W movwf aux ; mueve e l c o n t e n i d o de W a aux clrf contador ; se l i m p i a l a v a r i a b l e contador call convertir ir call convertir fin call envioRS232 forward al skip repeat forward 226 ANEXO C. CÓDIGOS FUENTES 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 return ; −−−−− S u b r u t i n a que t r a n s m i t e e l ó c d i g o de d a t o s c o r r e s p o n d i e n t e transmito stop call transmitir inicial movf stopa , 0 ; mueve s t o p a a W movwf aux ; mueve e l c o n t e n i d o de W a aux clrf contador ; se l i m p i a l a v a r i a b l e contador call convertir ir movf st op b , 0 ; mueve s t o p b a W movwf aux ; mueve e l c o n t e n i d o de W a aux clrf contador ; se l i m p i a l a v a r i a b l e contador call convertir ir call convertir fin call envioRS232 stop return al stop ;−−−− S u b r u t i n a que p r e n d e l a s a l i d a PWM ú s e g n e l b i t d e l ó c d i g o IR convertir ir clrf veces call pwm on call cuenta 11 call p wm off clrf veces btfsc aux , 7 ; s e f i j a s i e l b i t 7 e s un c e r o call cuenta 11 btfss aux , 7 ; s e f i j a s i e l b i t 7 e s un uno call cuenta 33 rlf aux , 1 ; r o t a a l a i z q u i e r d a l a v a r i a b l e aux incf contador , 1 ; incrementa contador btfsc contador , 3 ; s e f i j a s i c o n t a d o r á e s t en 8 return goto convertir ir ;−−−− S u b r u t i n a que p r e n d e l a convertir ini clrf veces call pwm on call cuenta 180 call p wm off clrf veces call cuenta 90 return ;−−−− S u b r u t i n a que t i r a convertir fin clrf veces call pwm on call cuenta 11 call p wm off clrf veces call cuenta 11 bsf b u scad o , 0 return el s a l i d a PWM p a r a l a s e c u e n c i a de inicio b i t de p ar ad a ; prende f l a g b u scad o ;−−−− S u b r u t i n a que t i r a l o s ú 2 l t i m o s b i t s d e l e n c a b e z a d o convertir enc fin clrf veces call pwm on call cuenta 11 call p wm off clrf veces call cuenta 33 incf contador , 1 ; incrementa contador b t f s c contador , 1 ; s e f i j a s i c o n t a d o r á e s t en 2 return goto convertir enc fin ;−−−−− S u b r u t i n a que pwm on movlw b ’ 00001100 ’ movwf CCP1CON return habilita la ;−−−−− S u b r u t i n a que p wm off movlw b ’ 00000000 ’ movwf CCP1CON return deshabilita s a l i d a CCP1 ; ó s e l e c c i n d e l modo PWM ; s e e s c r i b e e l r e g i s t r o CCP1CON ; ; se se la s a l i d a CCP1 d e s a c t i v a e l modo PWM e s c r i b e e l r e g i s t r o CCP1CON ;−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ; SUBRUTINAS PARA LA TRASMISION RS232 ;−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ;−−−−− S u b r u t i n a que e n v i a envio movwf TXREG bsf STATUS, RP0 al ; p u e r t o RS232 l o que me l l e g o −−− ; ir c a r a c t e r en W a l b an co 1 227 ANEXO C. CÓDIGOS FUENTES 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 testeo btfss TXSTA,TRMT goto testeo bcf STATUS, RP0 return ; ; ir espera h a s t a c o m p l e t a r Tx , ;−−−−− S u b r u t i n a que e n v i a envioRS232 start movlw ’− ’ call envio movlw ’O ’ call envio movlw ’N ’ call envio movlw ’− ’ call envio movlw 0xA call envio movlw 0xD call envio clrf flag return al p u e r t o RS232 un s a l u d o −−−−− ;−−−−− S u b r u t i n a que e n v i a envioRS232 num movlw ’N ’ call envio movlw ’U ’ call envio movlw ’M’ call envio movf d at o , 0 call envio movlw 0xA call envio movlw 0xD call envio clrf dato clrf flag bsf INTCON, PEIE return al p u e r t o RS232 un numero −−−−− ; ;−−−−− S u b r u t i n a p a r a e n v i a r envioRS232 play movlw ’P ’ call envio movlw ’ L ’ call envio movlw ’A ’ call envio movlw ’Y ’ call envio movlw 0xA call envio movlw 0xD call envio clrf dato clrf flag bsf INTCON, PEIE return al ;−−−−− S u b r u t i n a p a r a e n v i a r envioRS232 repeat movlw ’R ’ call envio movlw ’E ’ call envio movlw ’P ’ call envio movlw ’T ’ call envio movlw 0xA call envio movlw 0xD call envio clrf dato clrf flag bsf INTCON, PEIE return al ;−−−−− S u b r u t i n a p a r a e n v i a r envioRS232 memory movlw ’M’ call envio movlw ’E ’ call envio movlw ’M’ call envio al ; ; testea (1) a l b an co 0 habilita interrupcion periferica p u e r t o RS232 p l a y −−−−− habilita interrupcion periferica p u e r t o RS232 r e p e a t −−−−− habilita interrupcion periferica p u e r t o RS232 memory −−−−− 228 ANEXO C. CÓDIGOS FUENTES 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 movlw ’O ’ call envio movlw 0xA call envio movlw 0xD call envio clrf dato clrf flag bsf INTCON, PEIE return ; ;−−−−− S u b r u t i n a p a r a e n v i a r envioRS232 cancel movlw ’C ’ call envio movlw ’N ’ call envio movlw ’C ’ call envio movlw ’ L ’ call envio movlw 0xA call envio movlw 0xD call envio clrf dato clrf flag bsf INTCON, PEIE return al ;−−−−− S u b r u t i n a p a r a e n v i a r envioRS232 surround movlw ’ S ’ call envio movlw ’R ’ call envio movlw ’N ’ call envio movlw ’D ’ call envio movlw 0xA call envio movlw 0xD call envio clrf dato clrf flag bsf INTCON, PEIE return al ;−−−−− S u b r u t i n a p a r a e n v i a r envioRS232 back movlw ’ S ’ call envio movlw ’ S ’ call envio movlw ’B ’ call envio movlw ’K ’ call envio movlw 0xA call envio movlw 0xD call envio clrf dato clrf flag bsf INTCON, PEIE return al ;−−−−− S u b r u t i n a p a r a e n v i a r envioRS232 forward movlw ’ S ’ call envio movlw ’ S ’ call envio movlw ’F ’ call envio movlw ’D ’ call envio movlw 0xA call envio movlw 0xD call envio clrf dato clrf flag bsf INTCON, PEIE return al ;−−−−− S u b r u t i n a al para e n v i a r ; ; ; ; habilita interrupcion periferica p u e r t o RS232 c a n c e l −−−−− habilita interrupcion periferica p u e r t o RS232 s u r r o u n d −−−−− habilita interrupcion periferica p u e r t o RS232 b ack −−−−− habilita interrupcion periferica p u e r t o RS232 f o r w a r d −−−−− habilita interrupcion periferica p u e r t o RS232 s t o p −−−−− 229 ANEXO C. CÓDIGOS FUENTES 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 envioRS232 stop movlw ’ S ’ call envio movlw ’T ’ call envio movlw ’O ’ call envio movlw ’P ’ call envio movlw 0xA call envio movlw 0xD call envio clrf dato clrf flag bsf INTCON, PEIE return ;−−−−− S u b r u t i n a p a r a e n v i a r envioRS232 error bcf INTCON, PEIE movlw ’E ’ call envio movlw ’R ’ call envio movlw ’R ’ call envio movlw ’R ’ call envio movlw 0xA call envio movlw 0xD call envio clrf dato clrf flag bsf INTCON, PEIE return ; al habilita interrupcion periferica p u e r t o RS232 e r r o r −−−−− ; deshabilita ; habilita interrupcion interrupcion periferica periferica ;−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ; SUBRUTINAS QUE INSUMEN TIEMPOS ;−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ;−−−−− S u b r u t i n a que c u e n t a 1 1 i n t e r r u p c i o n e s d e l TMR0( 0 . 5 5 mseg ) cuenta 11 movlw 0xB ; e s c r i b e un 1 1 en W xorwf veces , 0 ; compara v e c e s con 1 1 b t f s c STATUS, 2 return goto cuenta 11 ;−−−−− S u b r u t i n a que c u e n t a 3 3 i n t e r r u p c i o n e s d e l TMR0( 1 . 6 5 mseg ) cuenta 33 movlw 0 x21 ; e s c r i b e un 3 3 en W xorwf veces , 0 ; compara v e c e s con 3 3 b t f s c STATUS, 2 return goto cuenta 33 ;−−−−− S u b r u t i n a que c u e n t a 9 0 i n t e r r u p c i o n e s d e l TMR0( 4 . 5 mseg ) cuenta 90 movlw 0x5A ; e s c r i b e un 9 0 en W xorwf veces , 0 ; compara v e c e s con 9 0 b t f s c STATUS, 2 return goto cuenta 90 ;−−−−− S u b r u t i n a que c u e n t a 1 8 0 i n t e r r u p c i o n e s d e l TMR0( 9 . 0 mseg ) cuenta 180 movlw 0xB4 ; e s c r i b e un 1 8 0 en W xorwf veces , 0 ; compara v e c e s con 1 8 0 b t f s c STATUS, 2 return goto cuenta 180 ;−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ; SUBRUTINAS PARA EL TRABAJO EN LA MEMORIA ;−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ;−−−−− S u b r u t i n a que l e e d a t o s de l a EEPROM eeprom rd bsf STATUS, RP0 ; i r a l b an co 1 movwf EEADR ; s e e s c r i b e e l d a t o en l a bsf EECON1, 0 ; s e pone a 1 e l RD nop movf EEDATA, 0 ; s e e s c r i b e e l d a t o en W bcf STATUS, RP0 ; i r a l b an co 0 return direccion 4h 230 ANEXO C. CÓDIGOS FUENTES 936 937 938 939 940 941 942 943 944 ;−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ; INICIALIZACION DE LA EEPROM ;−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ORG 0 x2100 DE 0 x00 , 0 x01 , 0 x02 , 0 x03 , 0 xF1 , 0 xF8 , 0 x70 , 0 x76 , 0 x89 , 0 xB6 , 0 x49 , 0 x36 , 0 xC9 , 0 xD6 , 0 x29 , 0 x56 , 0 xA9 , 0 x96 DE 0 x69 , 0 x16 , 0 xE9 , 0 xE6 , 0 x19 , 0 x66 , 0 x99 , 0 xA6 , 0 x59 , 0 xDC, 0 x23 , 0 x75 , 0 x8A , 0 xB5 , 0 x4A , 0 x35 , 0 xCA , 0 xF8 DE 0 x07 , 0 x1C , 0 xE3 , 0 x9C , 0 x63 , 0 x5C , 0 xA3 END C.7. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 ; Fi n d e l programa Código ArquitecturaRabbit.c /∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗∗ ∗∗ ∗∗ ∗∗ ∗∗∗ ∗∗ ∗∗ ∗∗ ∗∗∗ ∗∗ ∗∗ ∗∗ ∗∗ ∗∗∗ ∗∗ ∗∗ ∗∗ ∗∗∗ ∗∗ ∗∗ ∗∗ PROCESADOR PARA CONTROL MULTIPROTOCOLAR Alan Cohn ( 1 3 7 0 3 3 ) − Rossan a Morales (67756) ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗∗ ∗∗ ∗∗ ∗∗∗ ∗∗ ∗∗ ∗∗ ∗∗ ∗∗∗ ∗∗ ∗∗ ∗∗ ∗∗∗ ∗∗ ∗∗ ∗∗ ∗∗∗ ∗∗ ∗∗ ∗∗ ∗∗∗/ #c l a s s auto #de fi ne CINBUFSIZE 1 5 #de fi ne COUTBUFSIZE 1 5 #de fi ne TCPCONFIG 1 #de fi ne TCP BUF SIZE 2 0 4 8 #de fi ne HTTP MAXSERVERS 2 #de fi ne MAX TCP SOCKET BUFFERS 2 #de fi ne REDIRECTHOST PRIMARY STATIC IP #de fi ne IDLE TMOUT 3UL// 10UL// #de fi ne MSG TMOUT 3UL// #de fi ne TIEMPO ESPERA 3UL// 10UL #de fi ne REDIRECTTO ” h t t p : / / ” REDIRECTHOST ” / i n d e x . s h t m l ” #memmap xmem #u s e ” d c r t c p . l i b ” #u s e ” h t t p . l i b ” #x i m p o r t #x i m p o r t #x i m p o r t #x i m p o r t #x i m p o r t #x i m p o r t #x i m p o r t ” s a m p l e s / t c p i p / h t t p / p a g e s / em p ezar . s h t m l ” ” s a m p l e s / t c p i p / h t t p / p a g e s / t i t u l o r a b b i t . GIF” ” s a m p l e s / t c p i p / h t t p / p a g e s / l ed on m od . GIF” ” s a m p l e s / t c p i p / h t t p / p a g e s / l e d o f f m o d . GIF” ” s a m p l e s / t c p i p / h t t p / p a g e s / cd . GIF” ” s a m p l e s / t c p i p / h t t p / p a g e s / l am p ar a . GIF” ” s a m p l e s / t c p i p / h t t p / p a g e s / pc . GIF” index html rabbit1 gif ledon gif ledoff gif cd gif lampara gif pc gif SSPEC MIMETABLE START SSPEC MIME FUNC( ” . s h t m l ” , ” t e x t / html ” , s h t m l h a n d l e r ) , SSPEC MIME ( ” . html ” , ” t e x t / html ” ) , SSPEC MIME ( ” . g i f ” , ” i m age / g i f ” ) , SSPEC MIME ( ” . c g i ” , ” ” ) SSPEC MIMETABLE END char l e d 1 [ 1 5 ] ; char l e d 2 [ 1 5 ] ; char l e d 3 [ 1 5 ] ; char char char char char char char char char char char char char char char char id0 [ 1 5 ] ; id1 [ 1 5 ] ; id2 [ 1 5 ] ; id3 [ 1 5 ] ; id4 [ 1 5 ] ; id5 [ 1 5 ] ; id6 [ 1 5 ] ; id7 [ 1 5 ] ; id8 [ 1 5 ] ; id9 [ 1 5 ] ; id10 [ 1 5 ] ; id11 [ 1 5 ] ; id12 [ 1 5 ] ; id13 [ 1 5 ] ; id14 [ 1 5 ] ; id15 [ 1 5 ] ; char char char char char char buftx [ 8 ] ; buftxac [ 8 ] ; buftxent [ 8 ] ; bufrx [ 4 ] ; bufrxent [ 3 ] ; bufrxres [ 2 ] ; 231 ANEXO C. CÓDIGOS FUENTES 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 int ids mod [ 1 6 ] ; int tipo mod [ 1 6 ] ; int nserie mod [ 1 6 ] ; /∗ óFu n cin q u e i n i c i l i z a e l B u f f e r de ó T r a n s m i s i n p a r a con comandos de p r e s e n c i a o e v e n t o s á e s p o r d i c o s ∗/ void I n i c i a l i z a r B u f f e r T r a s m i s i o n ( char j ) { int n ; i f ( j== ’P ’ ) { f o r ( n=0;n <6; n++){ // b u f t x [ d i r 1 b u f t x [ n]= ’ 0 ’ ; } b u f t x [ 3 ] = ’U ’ ; b u f t x [ 7 ] = 0 x20 ; } e l s e i f ( j== ’E ’ ) { f o r ( n=0;n <6; n++){ // b u f t x [ d i r 1 b u f t x e n t [ n]= ’ 0 ’ ; } b u f t x e n t [ 3 ] = ’Q ’ ; b u f t x e n t [ 7 ] = 0 x20 ; } if mensajes // i n i c i a l i z a e l b u f f e r de t r a s m i s i o n p o r p r i m e r a v e z , d i r 2 , i n t e n t o , comado , p a r a m e t r o 1 , p a r a m e t r o 2 , p a r i d a d , LF ] // b u f t x [ ] = { ’ 0 ’ , ’ 0 ’ , ’ 0 ’ , ’ U ’ , ’ 0 ’ , ’ 0 ’ , p , 0 xA} // le pasa e l LF // i n i c i a l i z a e l b u f f e r de t r a s m i s i o n p o r p r i m e r a v e z , d i r 2 , i n t e n t o , comado , p a r a m e t r o 1 , p a r a m e t r o 2 , p a r i d a d , LF ] // b u f t x e n t [ ] = { ’ 0 ’ , ’ 0 ’ , ’ 0 ’ , ’Q ’ , ’ 0 ’ , ’ 0 ’ , p , 0 xA} // le pasa e l LF ( j== ’A ’ ) { f o r ( n=0;n <6; n++){ // i n i c i a l i z a e l b u f f e r de t r a s m i s i o n p o r p r i m e r a v e z // b u f t x [ d i r 1 , d i r 2 , i n t e n t o , comado , p a r a m e t r o 1 , p a r a m e t r o 2 , p a r i d a d , LF ] b u f t x a c [ n]= ’ 0 ’ ; // b u f t x a c [ ] = { ’ 0 ’ , ’ 0 ’ , ’ 0 ’ , ’ A ’ , ’ 0 ’ , ’ 0 ’ , p , 0 xA} } b u f t x a c [ 3 ] = ’A ’ ; b u f t x a c [ 7 ] = 0 x20 ; // l e p a s a e l LF } if ( j== ’ S ’ ) { f o r ( n=0;n <6; n++){ // i n i c i a l i z a e l b u f f e r de t r a s m i s i o n p o r p r i m e r a v e z // b u f t x [ d i r 1 , d i r 2 , i n t e n t o , comado , p a r a m e t r o 1 , p a r a m e t r o 2 , p a r i d a d , LF ] b u f t x a c [ n]= ’ 0 ’ ; // b u f t x a c [ ] = { ’ 0 ’ , ’ 0 ’ , ’ 0 ’ , ’ S ’ , ’ 0 ’ , ’ 0 ’ , p , 0 xA} } buftxac [3]= ’S ’ ; b u f t x a c [ 7 ] = 0 x20 ; // l e p a s a e l LF } i f ( j== ’R ’ ) { f o r ( n=0;n <6; n++){ // i n i c i a l i z a e l b u f f e r de t r a s m i s i o n p o r p r i m e r a v e z // b u f t x [ d i r 1 , d i r 2 , i n t e n t o , comado , p a r a m e t r o 1 , p a r a m e t r o 2 , p a r i d a d , LF ] b u f t x [ n]= ’ 0 ’ ; // b u f t x [ ] = { ’ 0 ’ , ’ 0 ’ , ’ 0 ’ , ’ R ’ , ’ 0 ’ , ’ 0 ’ , p , 0 xA} } b u f t x [ 3 ] = ’R ’ ; b u f t x [ 7 ] = 0 x20 ; // l e p a s a e l LF } } /∗ óFu n cin q u e i n i c i l i z a e l B u f f e r de ó R e c e p c i n p a r a y m e n s a j e s á e s p o r d i c o s ∗/ void I n i c i a l i z a r B u f f e r R e c e p c i o n ( char j ) { int n ; i f ( j== ’P ’ ) { f o r ( n=0;n <4; n++){ // b u f r x [ n]= ’ 0 ’ ; } } i f ( j== ’E ’ ) { f o r ( n=0;n <3; n++){ // b u f r x e n t [ n]= ’ 0 ’ ; } } if } } ( j== ’R ’ ) { f o r ( n=0;n <2; n++){ // b u f r x r e s [ n]= ’ 0 ’ ; } inicializa el buffer de recepcion por primera v e z inicializa el buffer de recepcion por primera v e z inicializa el buffer de recepcion por primera v e z /∗ óFu n cin q u e i n i c i a l i z a l o s s i g u i e n t e s ids mod [ ] , tipo mod [ ] y nserie mod [ ] void I n i c i a l i z a r B u f f e r s ( ) { } int r ; f o r ( r =0; r <16; r++){ // i d s m o d [ r ]=0 x00 ; t i p o m o d [ r ]=0 x00 ; n s e r i e m o d [ r ]=0 x00 ; } presencia inicializa el buffers : ∗/ buffer de recepcion 232 ANEXO C. CÓDIGOS FUENTES 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 /∗ óFu n cin q u e c a l c u l a l a p a r i d a d de l o s campos t r a s m i s i n p a r a b u s c a r ó m d u l o s e x t e r i o r e s ∗/ void C a l c u l a r P a r i d a d B u s c a r ( ) { del buffer de ó /∗ óFu n cin q u e c a l c u l a l a p a r i d a d de l o s campos d e l t r a s m i s i n p a r a a c c i o n e s de ó m d u l o s e x t e r i o r e s ∗/ void C a l c u l a r P a r i d a d A c c i o n ( ) { buffer de ó i n t w, x ; w = buftx [ 0 ] ; x = wˆ= b u f t x [ 1 ] ; x = xˆ= b u f t x [ 2 ] ; x = xˆ= b u f t x [ 3 ] ; x = xˆ= b u f t x [ 4 ] ; x = xˆ= b u f t x [ 5 ] ; p r i n t f ( ” P a r i d a d : % x\n” , x ) ; // p a r a buftx [6]= x ; debug } i n t w, x ; w = buftxac [ 0 ] ; x = wˆ= b u f t x a c [ 1 ] ; x = xˆ= b u f t x a c [ 2 ] ; x = xˆ= b u f t x a c [ 3 ] ; x = xˆ= b u f t x a c [ 4 ] ; x = xˆ= b u f t x a c [ 5 ] ; p r i n t f ( ” P a r i d a d : % x\n” , x ) ; // p a r a buftxac [6 ]= x ; debug } /∗ óFu n cin q u e c a l c u l a l a p a r i d a d de l o s campos d e l b u f f e r de ó t r a s m i s i n p a r a e v e n t o s á e s p o r d i c o s de ó m d u l o s e x t e r i o r e s ∗/ void C a l c u l a r P a r i d a d E n t r a d a ( ) { i n t w, x ; w = buftxent [ 0 ] ; x = wˆ= b u f t x e n t [ 1 ] ; x = xˆ= b u f t x e n t [ 2 ] ; x = xˆ= b u f t x e n t [ 3 ] ; x = xˆ= b u f t x e n t [ 4 ] ; x = xˆ= b u f t x e n t [ 5 ] ; p r i n t f ( ” P a r i d a d : % x\n” , x ) ; // p a r a buftxent [6]= x ; debug } /∗ óFu n cin q u e c a r g a en e l b u f f e r de ó t r a n s m i s i n d e l p u e r t o C l o s 8 b y t e s a t r a s m i t i r p a r a b u s c a r l o s ó m d u l o s ∗/ void T r a s m i t i r b y t e s b u s c a r ( ) { int s , u ; unsigned long v ; u =0; f o r ( s =0; s <8; s++){ http handler () ; v = MS TIMER ; while ( 1 ) { if ( u==0){ serCputc ( buftx [ s ] ) ; p r i n t f ( ”Tx t i e n e %c \n” , b u f t x [ s ] ) ; u =1; } if } } } ( MS TIMER > ( v + TIEMPO ESPERA) ) { p r i n t f ( ” \ r \ n E sp er a t r a n s m i t i r \ r \n” ) ; // p a r a v = MS TIMER ; u =0; break ; debug } /∗ óFu n cin q u e c a r g a en e l b u f f e r de ó t r a n s m i s i n d e l p u e r t o C l o s 8 b y t e s a t r a s m i t i r p a r a l a s a c c i o n e s y l o s ı́ e n v a c a d a 3 5 0 u s e g ∗/ void T r a s m i t i r b y t e s a c c i o n ( ) { int s , u ; unsigned long v ; u =0; f o r ( s =0; s <8; s++){ v = MS TIMER ; 233 ANEXO C. CÓDIGOS FUENTES 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 while ( 1 ) { if ( u==0){ serCputc ( buftxac [ s ] ) ; p r i n t f ( ”Tx t i e n e %c \n” , b u f t x a c [ s ] ) ; u =1; } if } } } ( MS TIMER > ( v + TIEMPO ESPERA) ) { p r i n t f ( ” \ r \ n E sp er a t r a n s m i t i r \ r \n” ) ; // p a r a v = MS TIMER ; u =0; break ; debug } /∗ óFu n cin q u e c a r g a en e l b u f f e r de ó t r a n s m i s i n d e l p u e r t o C l o s 8 b y t e s a t r a s m i t i r p a r a l o s e v e n t o s á e s p o r d i c o s ∗/ void T r a s m i t i r b y t e s e n t r a d a ( ) { int s , u ; unsigned long v ; u =0; f o r ( s =0; s <8; s++){ http handler () ; v = MS TIMER ; while ( 1 ) { if ( u==0){ serCputc ( buftxent [ s ] ) ; p r i n t f ( ”Tx t i e n e %c \n” , b u f t x e n t [ s ] ) ; u =1; } if } } } ( MS TIMER > ( v + TIEMPO ESPERA) ) { p r i n t f ( ” \ r \ n E sp er a t r a n s m i t i r \ r \n” ) ; // p a r a v = MS TIMER ; u =0; break ; debug } /∗ óFu ncin q u e ı́ e n v a a un óm du lo ı́ e s p e c f i c o l a ó a c c i n c o r r e s p o n d i e n t e a r e a l i z a r , e s p e r a n d o s u r e s p u e s t a . Se s i g u e l a r e g l a de l o s 3 i n t e n t o s ∗/ i n t R e a l i z a r a c c i o n ( char l e t r a , char numser , char param1 , char param2 ) { i n t i , j , l , p , q ,m; unsigned long t ; if ( l e t r a== ’A ’ ) I n i c i a l i z a r B u f f e r T r a s m i s i o n ( ’A ’ ) ; else I nic ial iz ar B uf f e r Tr asmisio n ( ’S ’ ) ; m =0; f o r ( i =0; i <16; i ++){ if // a b r e for de ú b s q u e d a i f ( i <10) { b u f t x a c [ 0 ] = 0 x30 ; b u f t x a c [ 1 ] = 0 x30+i ; p r i n t f ( ” E l ID p a r a mandar l a p r i n t f ( ” %x\n” , b u f t x a c [ 1 ] ) ; } else { b u f t x a c [ 0 ] = 0 x31 ; l=i −10; b u f t x a c [ 1 ] = 0 x30+l ; p r i n t f ( ” E l ID p a r a mandar l a p r i n t f ( ” %x\n” , b u f t x a c [ 1 ] ) ; } m =1; } if de únmero serial ( n s e r i e m o d [ i ]==numser ) { accion e s %x” , b u f t x a c [ 0 ] ) ; accion e s %x” , b u f t x a c [ 0 ] ) ; } // cierra for de ú b s q u e d a de únmero serial (m! = 0 ) { 234 ANEXO C. CÓDIGOS FUENTES 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 b u f t x a c [ 4 ] = param1 ; b u f t x a c [ 5 ] = param2 ; I n i c i a l i z a r B u f f e r R e c e p c i o n ( ’R ’ ) ; f o r ( j =0; j <3; j ++){ // a b r e for del Calcular Paridad Accion () ; Bi t W r P or t I ( PBDR, & PBDRShadow , 1 , 2 ) ; // Trasmitir bytes accion () ; Bi t W r P or t I ( PBDR, & PBDRShadow , 0 , 2 ) ; // loop de los 3 intentos s e t e a PB2 p a r a trasmitir s e t e a PB2 p a r a recibir t = MS TIMER ; while ( 1 ) { if ( ( q = s e r C r e a d ( b u f r x r e s , s i z e o f ( b u f r x r e s ) , MSG TMOUT) ) >0) { p r i n t f ( ” B u f f e r ID t i e n e : % c ” , b u f r x r e s [ 0 ] ) ; // p a r a p r i n t f ( ” %c ” , b u f r x r e s [ 1 ] ) ; // p a r a d e b u g t = MS TIMER ; debug } } if else { i f ( MS TIMER > ( t + IDLE TMOUT) ) { p r i n t f ( ”\ r \nTimed ou t ! \ r \n” ) ; // p a r a t = MS TIMER ; break ; } } debug ( b u f r x r e s [0]== ’R ’ ) { j =3; return 1 ; } else { i f ( b u f t x a c [2]==0 x32 ) { return 0 ; } else buftxac [2]++; // i n c r e m e n t a en 1 e l únmero de i n t e n t o s } // c i e r r a e l s e } // c i e r r a f o r d e l l o o p de 3 i n t e n t o s b u f t x a c [ 2 ] = 0 x30 ; // pone en c e r o e l numero de i n t e n t o s } e l s e return 0 ; } /∗ óFu ncin q u e b u s c a ó m d u l o s en e l s i s t e m a , o b t e n i e n d o l a s de p r e s e n c i a . Se s i g u e l a r e g l a de l o s 3 i n t e n t o s ∗/ void B u s c a r M o d u l o s ( ) { notificaciones int a , b , c ; unsigned long d ; I n i c i a l i z a r B u f f e r T r a s m i s i o n ( ’P ’ ) ; I n i c i a l i z a r B u f f e r R e c e p c i o n ( ’P ’ ) ; f o r ( a =0; a <16; a++){ // a b r e for del loop de consulta de 1 6 ID serCrdFlush ( ) ; I n i c i a l i z a r B u f f e r R e c e p c i o n ( ’P ’ ) ; http handler () ; f o r ( c =0; c <3; c++){ // a b r e for del Bi t W r P or t I ( PBDR, & PBDRShadow , 1 , 2 ) ; // Calcular Paridad Buscar () ; loop de los 3 intentos s e t e a PB2 p a r a // p a r a // p a r a debug debug p r i n t f ( ” I n t e n t o numero : % x\n” , b u f t x [ 2 ] ) ; // p a r a debug p r i n t f ( ” Modulo numero : % x” , b u f t x [ 0 ] ) ; p r i n t f ( ” %x\n” , b u f t x [ 1 ] ) ; trasmitir Trasmitir bytes buscar () ; Bi t W r P or t I ( PBDR, & PBDRShadow , 0 , 2 ) ; // /∗ E s p e r a l a l l e g a d a de b y t e s l o s g u a r d a en e l b u f r x ∗/ hasta cumplirse s e t e a PB2 p a r a recibir 1 . 0 4 2 mseg , d = MS TIMER ; while ( 1 ) { if ( ( b = s e r C r e a d ( b u f r x , s i z e o f ( b u f r x ) , MSG TMOUT) ) >0) { p r i n t f ( ” B u f f e r ID t i e n e : % c ” , b u f r x [ 0 ] ) ; // p a r a debug 235 ANEXO C. CÓDIGOS FUENTES 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 p r i n t f ( ” %c ” , b u f r x [ 1 ] ) ; // p a r a d e b u g p r i n t f ( ” %c ” , b u f r x [ 2 ] ) ; // p a r a d e b u g p r i n t f ( ” %x\n” , b u f r x [ 3 ] ) ; // p a r a d e b u g d = MS TIMER ; } } if else { i f ( MS TIMER > ( d + IDLE TMOUT) ) { p r i n t f ( ”\ r \nTimed ou t ! \ r \n” ) ; // p a r a d = MS TIMER ; break ; } } ( b u f r x [0]== ’P ’ ) { // i d s m o d [ a ]=0 x f f ; t i p o m o d [ a ]= b u f r x [ 1 ] ; verifica el debug identificador correspondiente i f ( b u f r x [2]== ’E ’ ) { i d s m o d [ a ]=0 x00 ; t i p o m o d [ a ]=0 x00 ; n s e r i e m o d [ a ]=0 x00 ; } else n s e r i e m o d [ a ]= b u f r x [ 2 ] ; b u f t x [ 2 ] = 0 x30 ; c =3; } // } else { buftx [2]++; i d s m o d [ a ]=0 x00 ; } // i n c r e m e n t a en 1 // cierra // pone en c e r o b u f t x [ 2 ] = 0 x30 ; if // pone en c e r o e l numero de i n t e n t o s s a l e d e l f o r de 3 i n t e n t o s a l a f u e r z a for el del numero de loop e l numero de de 3 intentos intentos intentos ( b u f t x [ 1 ] = = 0 x39 ) { b u f t x [ 1 ] = 0 x30 ; b u ftx [0]++; } else buftx [1]++; c =0; } a =0; // // i n c r e m e n t a en 1 l a d i r e c c i o n d e l m odu lo i n i c i a l i z a l p a r a v o l v e r a l f o r de 3 i n t e n t o s // c i e r r a f o r d e l l o o p de c o n s u l t a de 1 6 ID ( i d s m o d [0]==0 x f f ) s t r c p y ( i d 0 , ” l ed on m od . GIF” ) ; else s t r c p y ( i d 0 , ” l e d o f f m o d . GIF” ) ; if if ( i d s m o d [1]==0 x f f ) s t r c p y ( i d 1 , ” l ed on m od . GIF” ) ; else s t r c p y ( i d 1 , ” l e d o f f m o d . GIF” ) ; ( i d s m o d [2]==0 x f f ) s t r c p y ( i d 2 , ” l ed on m od . GIF” ) ; else s t r c p y ( i d 2 , ” l e d o f f m o d . GIF” ) ; if if ( i d s m o d [3]==0 x f f ) s t r c p y ( i d 3 , ” l ed on m od . GIF” ) ; else s t r c p y ( i d 3 , ” l e d o f f m o d . GIF” ) ; if ( i d s m o d [4]==0 x f f ) s t r c p y ( i d 4 , ” l ed on m od . GIF” ) ; else s t r c p y ( i d 4 , ” l e d o f f m o d . GIF” ) ; ( i d s m o d [5]==0 x f f ) s t r c p y ( i d 5 , ” l ed on m od . GIF” ) ; else s t r c p y ( i d 5 , ” l e d o f f m o d . GIF” ) ; if if else if else if else ( i d s m o d [6]==0 x f f ) s t r c p y ( i d 6 , ” l ed on m od . GIF” ) ; s t r c p y ( i d 6 , ” l e d o f f m o d . GIF” ) ; ( i d s m o d [7]==0 x f f ) s t r c p y ( i d 7 , ” l ed on m od . GIF” ) ; s t r c p y ( i d 7 , ” l e d o f f m o d . GIF” ) ; ( i d s m o d [8]==0 x f f ) s t r c p y ( i d 8 , ” l ed on m od . GIF” ) ; s t r c p y ( i d 8 , ” l e d o f f m o d . GIF” ) ; else ( i d s m o d [9]==0 x f f ) s t r c p y ( i d 9 , ” l ed on m od . GIF” ) ; s t r c p y ( i d 9 , ” l e d o f f m o d . GIF” ) ; if ( i d s m o d [ 10] = = 0 x f f ) if 236 ANEXO C. CÓDIGOS FUENTES 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 else s t r c p y ( i d 1 0 , ” l ed on m od . GIF” ) ; s t r c p y ( i d 1 0 , ” l e d o f f m o d . GIF” ) ; ( i d s m o d [ 11] = = 0 x f f ) s t r c p y ( i d 1 1 , ” l ed on m od . GIF” ) ; else s t r c p y ( i d 1 1 , ” l e d o f f m o d . GIF” ) ; if if ( i d s m o d [ 12] = = 0 x f f ) s t r c p y ( i d 1 2 , ” l ed on m od . GIF” ) ; else s t r c p y ( i d 1 2 , ” l e d o f f m o d . GIF” ) ; if ( i d s m o d [ 13] = = 0 x f f ) s t r c p y ( i d 1 3 , ” l ed on m od . GIF” ) ; else s t r c p y ( i d 1 3 , ” l e d o f f m o d . GIF” ) ; ( i d s m o d [ 14] = = 0 x f f ) s t r c p y ( i d 1 4 , ” l ed on m od . GIF” ) ; else s t r c p y ( i d 1 4 , ” l e d o f f m o d . GIF” ) ; if if ( i d s m o d [ 15] = = 0 x f f ) s t r c p y ( i d 1 5 , ” l ed on m od . GIF” ) ; else s t r c p y ( i d 1 5 , ” l e d o f f m o d . GIF” ) ; } /∗ óFu ncin q u e b u s c a ó m d u l o s de e n t r a d a s d i g i t a l e s en e l s i s t e m a , y c u e s t i o n a s i ha l l e g a d o un e v e n t o á e s p o r d i c o . S i ó s u c e d i manda m e n s a j e s de ó a c c i n c o r r e s p o n d i e n t e s a c a d a óm du lo . Se s i g u e l a r e g l a de l o s 3 i n t e n t o s ∗/ void V e r i f i c a r M o d u l o s E n t r a d a s ( ) { int e , f , g , h , k , b , x , y , z ; unsigned long d ; f o r ( e =0; e <16; e++){ // a b r e for del loop de consulta de 1 6 I D s serCrdFlush ( ) ; I n i c i a l i z a r B u f f e r T r a s m i s i o n ( ’E ’ ) ; I n i c i a l i z a r B u f f e r R e c e p c i o n ( ’P ’ ) ; if ( t i p o m o d [ e ]==0x33 ) { f o r ( g =0; g <3; g++){ // a b r e i f // a b r e f o r d e l ID d e l óm du lo de e n t r a d a s d e l l o o p de l o s 3 i n t e n t o s /∗ D i s t i n g u e e l t i p o de óm du lo y c a r g a en e l v a l o r c o r r e s p o n d i e n t e d e l ID ∗/ el buftx i f ( e <10) { b u f t x e n t [ 1 ] = 0 x30+e ; p r i n t f ( ” E l ID p a r a mandar e l m en saje e s p o r a d i c o p r i n t f ( ” %x\n” , b u f t x e n t [ 1 ] ) ; } else { b u f t x e n t [ 0 ] = 0 x31 ; h=e −10; b u f t x e n t [ 1 ] = 0 x30+h ; p r i n t f ( ” E l ID p a r a mandar e l m en saje e s p o r a d i c o p r i n t f ( ” %x\n” , b u f t x e n t [ 1 ] ) ; } Bi t W r P or t I ( PBDR, &PBDRShadow , 1 , 2 ) ; // PB2 p a r a Calcular Paridad Entrada () ; e s %x” , b u f t x e n t [ 0 ] ) ; e s %x” , b u f t x e n t [ 0 ] ) ; trasmitir Trasmitir bytes entrada () ; p r i n t f ( ” E l ID p a r a mandar e l m en saje e s p o r a d i c o e s %x ” , b u f t x e n t [ 0 ] ) ; Bi t W r P or t I ( PBDR, &PBDRShadow , 0 , 2 ) ; // PB2 p a r a r e c i b i r /∗ E s p e r a l a l l e g a d a de b y t e s h a s t a l o s g u a r d a en e l b u f r x e n t ∗/ cumplirse 1 . 0 4 2 mseg , d = MS TIMER ; while ( 1 ) { if ( ( b = s e r C r e a d ( b u f r x , s i z e o f ( b u f r x ) , MSG TMOUT) ) >0) { p r i n t f ( ” B u f f e r ID t i e n e : p r i n t f ( ” %c ” , b u f r x [ 1 ] ) ; p r i n t f ( ” %c ” , b u f r x [ 2 ] ) ; p r i n t f ( ” %x\n” , b u f r x [ 3 ] ) d = MS TIMER ; % c ” , b u f r x [ 0 ] ) ; // p a r a // p a r a d e b u g // p a r a d e b u g ; // p a r a d e b u g debug } } else { i f ( MS TIMER > ( d + IDLE TMOUT) ) { p r i n t f ( ”\ r \nTimed ou t ! \ r \n” ) ; // p a r a d = MS TIMER ; break ; } } debug 237 ANEXO C. CÓDIGOS FUENTES 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 } } } i f ( b u f r x [0]== ’E ’ ) { Bi t W r P or t I ( PBDR, & PBDRShadow , 1 , 4 ) ; // switch ( b u f r x [ 1 ] ) { c a se ’ 0 ’ : p r i n t f ( ” Se ha d e c i d i d o l a ó a c c i n 1 \ n” ) ; i f ( ( x = R e a l i z a r a c c i o n ( ’A ’ , ’C ’ , ’ 0 ’ , ’ 1 ’ ) ) ==1) s t r c p y ( l e d 3 , ” l ed on m od . GIF” ) ; i f ( ( y = R e a l i z a r a c c i o n ( ’A ’ , ’N ’ , ’ 1 ’ , ’ 8 ’ ) ) ==1) s t r c p y ( l e d 1 , ” l ed on m od . GIF” ) ; i f ( ( z = R e a l i z a r a c c i o n ( ’A ’ , ’B ’ , ’ 2 ’ , ’ 1 ’ ) ) ==1) s t r c p y ( l e d 2 , ” l ed on m od . GIF” ) ; g = 3 ; // s a l e d e l f o r de 3 i n t e n t o s a l a f u e r z a break ; c a se ’ 1 ’ : p r i n t f ( ” Se ha d e c i d i d o l a ó a c c i n 2 \ n” ) ; g = 3 ; // s a l e d e l f o r de 3 i n t e n t o s a l a f u e r z a break ; c a se ’ 2 ’ : p r i n t f ( ” Se ha d e c i d i d o l a ó a c c i n 3 \ n” ) ; g = 3 ; // s a l e d e l f o r de 3 i n t e n t o s a l a f u e r z a break ; c a se ’ 3 ’ : p r i n t f ( ” Se ha d e c i d i d o l a ó a c c i n 4 \ n” ) ; g = 3 ; // s a l e d e l f o r de 3 i n t e n t o s a l a f u e r z a break ; c a se ’ 4 ’ : p r i n t f ( ” Se ha d e c i d i d o l a ó a c c i n 5 \ n” ) ; g = 3 ; // s a l e d e l f o r de 3 i n t e n t o s a l a f u e r z a break ; } } else buftxent [2]++; // i n c r e m e n t a en 1 e l numero de i n t e n t o s } // c i e r r a f o r d e l l o o p de l o s 3 i n t e n t o s g =0; // i n i c i a l i z a l p a r a v o l v e r a l f o r de 3 i n t e n t o s Bi t W r P or t I ( PBDR, & PBDRShadow , 0 , 4 ) ; // // c i e r r a e l i f d e l ID d e l óm du lo de e n t r a d a s // c i e r r a f o r d e l l o o p de c o n s u l t a de 1 6 I D s // R u t i n a s p a r a el trato d e l CGI l e d 1 t o g g l e ( HttpState ∗ s t a t e ) int { if // Para e l ó b o t n AUDIO ( st r c m p ( l e d 1 , ” l e d o f f m o d . GIF” ) ==0){ s t r c p y ( l e d 1 , ” l ed on m od . GIF” ) ; R e a l i z a r a c c i o n ( ’A ’ , ’N ’ , ’ 1 ’ , ’ 8 ’ ) ; } else { s t r c p y ( l e d 1 , ” l e d o f f m o d . GIF” ) ; R e a l i z a r a c c i o n ( ’A ’ , ’N ’ , ’ 1 ’ , ’ 9 ’ ) ; } c g i r e d i r e c t t o ( s t a t e , REDIRECTTO) ; return 0 ; } l e d 2 t o g g l e ( HttpState ∗ s t a t e ) int { if // Para e l ó b o t n m e n s a j e RS232 ( st r c m p ( l e d 2 , ” l e d o f f m o d . GIF” ) ==0){ s t r c p y ( l e d 2 , ” l ed on m od . GIF” ) ; R e a l i z a r a c c i o n ( ’A ’ , ’B ’ , ’ 1 ’ , ’ 1 ’ ) ; } else { s t r c p y ( l e d 2 , ” l e d o f f m o d . GIF” ) ; R e a l i z a r a c c i o n ( ’A ’ , ’B ’ , ’ 2 ’ , ’ 0 ’ ) ; } c g i r e d i r e c t t o ( s t a t e , REDIRECTTO) ; return 0 ; } l e d 3 t o g g l e ( HttpState ∗ s t a t e ) int { if // Para p r e n d e r la lamparita ( st r c m p ( l e d 3 , ” l e d o f f m o d . GIF” ) ==0){ s t r c p y ( l e d 3 , ” l ed on m od . GIF” ) ; R e a l i z a r a c c i o n ( ’A ’ , ’C ’ , ’ 0 ’ , ’ 1 ’ ) ; } else { s t r c p y ( l e d 3 , ” l e d o f f m o d . GIF” ) ; R e a l i z a r a c c i o n ( ’ S ’ , ’C ’ , ’ 0 ’ , ’ 1 ’ ) ; } 238 ANEXO C. CÓDIGOS FUENTES 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 c g i r e d i r e c t t o ( s t a t e , REDIRECTTO) ; return 0 ; } SSPEC RESOURCETABLE START SSPEC RESOURCE XMEMFILE( ” / ” , i n d e x h t m l ) , SSPEC RESOURCE XMEMFILE( ” / i n d e x . s h t m l ” , i n d e x h t m l ) , SSPEC RESOURCE XMEMFILE( ” / t i t u l o r a b b i t . GIF” , r a b b i t 1 g i f ) , SSPEC RESOURCE XMEMFILE( ” / l ed on m od . GIF” , l e d o n g i f ) , SSPEC RESOURCE XMEMFILE( ” / l e d o f f m o d . GIF” , l e d o f f g i f ) , SSPEC RESOURCE XMEMFILE( ” / cd . GIF” , c d g i f ) , SSPEC RESOURCE XMEMFILE( ” / l am p ar a . GIF” , l a m p a r a g i f ) , SSPEC RESOURCE XMEMFILE( ” / pc . GIF” , p c g i f ) , SSPEC RESOURCE ROOTVAR( ” l e d 1 ” , l e d 1 , PTR16 , ” %s ” ) , SSPEC RESOURCE ROOTVAR( ” l e d 2 ” , l e d 2 , PTR16 , ” %s ” ) , SSPEC RESOURCE ROOTVAR( ” l e d 3 ” , l e d 3 , PTR16 , ” %s ” ) , SSPEC RESOURCE FUNCTION ( ” / l e d 1 t o g . c g i ” , l e d 1 t o g g l e ) , SSPEC RESOURCE FUNCTION ( ” / l e d 2 t o g . c g i ” , l e d 2 t o g g l e ) , SSPEC RESOURCE FUNCTION ( ” / l e d 3 t o g . c g i ” , l e d 3 t o g g l e ) , SSPEC RESOURCE ROOTVAR( ” i d 0 ” , i d 0 , PTR16 , ” %s ” ) , SSPEC RESOURCE ROOTVAR( ” i d 1 ” , i d 1 , PTR16 , ” %s ” ) , SSPEC RESOURCE ROOTVAR( ” i d 2 ” , i d 2 , PTR16 , ” %s ” ) , SSPEC RESOURCE ROOTVAR( ” i d 3 ” , i d 3 , PTR16 , ” %s ” ) , SSPEC RESOURCE ROOTVAR( ” i d 4 ” , i d 4 , PTR16 , ” %s ” ) , SSPEC RESOURCE ROOTVAR( ” i d 5 ” , i d 5 , PTR16 , ” %s ” ) , SSPEC RESOURCE ROOTVAR( ” i d 6 ” , i d 6 , PTR16 , ” %s ” ) , SSPEC RESOURCE ROOTVAR( ” i d 7 ” , i d 7 , PTR16 , ” %s ” ) , SSPEC RESOURCE ROOTVAR( ” i d 8 ” , i d 8 , PTR16 , ” %s ” ) , SSPEC RESOURCE ROOTVAR( ” i d 9 ” , i d 9 , PTR16 , ” %s ” ) , SSPEC RESOURCE ROOTVAR( ” i d 1 0 ” , i d 1 0 , PTR16 , ” %s ” ) , SSPEC RESOURCE ROOTVAR( ” i d 1 1 ” , i d 1 1 , PTR16 , ” %s ” ) , SSPEC RESOURCE ROOTVAR( ” i d 1 2 ” , i d 1 2 , PTR16 , ” %s ” ) , SSPEC RESOURCE ROOTVAR( ” i d 1 3 ” , i d 1 3 , PTR16 , ” %s ” ) , SSPEC RESOURCE ROOTVAR( ” i d 1 4 ” , i d 1 4 , PTR16 , ” %s ” ) , SSPEC RESOURCE ROOTVAR( ” i d 1 5 ” , i d 1 5 , PTR16 , ” %s ” ) , SSPEC RESOURCETABLE END /∗ RUTINA PRINCIPAL DEL PROGRAMA ∗/ main ( ) { int user1 ; int u s e r 1 e n a b l e d ; i n t p age1 ; user1 p age1 sspec sspec = s a u t h a d d u s e r ( ” u s u a r i o 1 ” , ” 123456 ” , SERVER HTTP) ; = s s p e c a d d x m e m f i l e ( ” / ” , i n d e x h t m l , SERVER HTTP) ; a d d u s e r ( page1 , u s e r 1 ) ; s e t r e a l m ( page1 , ”Admin” ) ; Inicializar Buffers () ; brdInit () ; Bi t W r P or t I (PEDR, & PEDRShadow , 0 , 5 ) ; ser Cop en ( 9 6 0 0 ) ; s t r c p y ( l e d 1 , ” l e d o f f m o d . GIF” ) ; s t r c p y ( l e d 2 , ” l e d o f f m o d . GIF” ) ; s t r c p y ( l e d 3 , ” l e d o f f m o d . GIF” ) ; s t r c p y ( i d 0 , ” l e d o f f m o d . GIF” ) ; s t r c p y ( i d 1 , ” l e d o f f m o d . GIF” ) ; s t r c p y ( i d 2 , ” l e d o f f m o d . GIF” ) ; s t r c p y ( i d 3 , ” l e d o f f m o d . GIF” ) ; s t r c p y ( i d 4 , ” l e d o f f m o d . GIF” ) ; s t r c p y ( i d 5 , ” l e d o f f m o d . GIF” ) ; s t r c p y ( i d 6 , ” l e d o f f m o d . GIF” ) ; s t r c p y ( i d 7 , ” l e d o f f m o d . GIF” ) ; s t r c p y ( i d 8 , ” l e d o f f m o d . GIF” ) ; s t r c p y ( i d 9 , ” l e d o f f m o d . GIF” ) ; s t r c p y ( i d 1 0 , ” l e d o f f m o d . GIF” ) s t r c p y ( i d 1 1 , ” l e d o f f m o d . GIF” ) s t r c p y ( i d 1 2 , ” l e d o f f m o d . GIF” ) s t r c p y ( i d 1 3 , ” l e d o f f m o d . GIF” ) s t r c p y ( i d 1 4 , ” l e d o f f m o d . GIF” ) s t r c p y ( i d 1 5 , ” l e d o f f m o d . GIF” ) ; ; ; ; ; ; so ck ini t () ; http i ni t () ; t c p r e s e r v e p o r t (80) ; costate { w a i t f o r ( DelayMs ( 1 ) ) ; } // e s p e r a p a r a d a r l e // e x t e r i o r e s q u e s e tiempo a l o s inicialicen modulos Inicializar Buffers () ; 239 ANEXO C. CÓDIGOS FUENTES 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 Bi t W r P or t I ( PBDR, &PBDRShadow , 0 , 4 ) ; while ( 1 ) { http handler () ; } costate { w a i t f o r ( DelaySec ( 3 ) ) ; Buscar Modulos ( ) ; http handler () ; Verificar Modulos Entradas () ; } while ( s e r C w r F r e e ( ) ! = COUTBUFSIZE) ; serCclose () ; } #nodebug C.8. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 Código PaginaWeb.txt <!DOCTYPE HTML PUBLIC ”−//W3C//DTD W3 HTML//EN”> <HTML> <HEAD> <TITLE>P r o y e c t o f i n a l de c a r r e r a </TITLE> </HEAD> <BODY onLoad=window . s e t T i m e o u t ( ” l o c a t i o n . h r e f =’ i n d e x . s h t m l ’ ” , 1 0 0 0 0 )> <h1 s t y l e=” t e x t −a l i g n : c e n t e r ”><img a l t=” t i t u l o r a b b i t ” s r c=” t i t u l o r a b b i t . GIF”></h1> <TABLE ALIGN=CENTER BORDER=” 0 ” CELLSPACING=” 20 ” CELLPADDING=” 1 ”> <TR> <TD ALIGN=CENTER> <img SRC=”<!−−#e c h o v a r=” l e d 1 ”−−>”> </TD> <TD ALIGN=CENTER> <img SRC=”<!−−#e c h o v a r=” l e d 2 ”−−>”> </TD> <TD ALIGN=CENTER> <img SRC=”<!−−#e c h o v a r=” l e d 3 ”−−>”> </TD> </TR> <TR> <TD ALIGN=CENTER> <A HREF=” / l e d 1 t o g . c g i ”> <img SRC=” cd . GIF”> </A> </TD> <TD ALIGN=CENTER> <A HREF=” / l e d 2 t o g . c g i ”> <img SRC=” pc . GIF”> </A> </TD> <TD ALIGN=CENTER> <A HREF=” / l e d 3 t o g . c g i ”> <img SRC=” l am p ar a . GIF”> </A> </TD> </TR> </TABLE> <br> <br> <FIELDSET> <LEGEND ALIGN=CENTER> <B> E st ad o de l o s ómdulos LEGEND> <br> exteriores del s i s t e m a : < /B> </ <TABLE ALIGN=CENTER BORDER=” 7 ” CELLSPACING=” 2 ” CELLPADDING=” 1 ”> <TR> <TD> <img SRC=”<!−−#e c h o v a r=” i d 0 ”−−>”> </TD> <TD> <TD> <TD> <TD> <TD> <img <img <img <img <img SRC=”<!−−#e c h o SRC=”<!−−#e c h o SRC=”<!−−#e c h o SRC=”<!−−#e c h o SRC=”<!−−#e c h o v a r=” i d 1 ”−−>”> v a r=” i d 2 ”−−>”> v a r=” i d 3 ”−−>”> v a r=” i d 4 ”−−>”> v a r=” i d 5 ”−−>”> <TD> <TD> <TD> <TD> <TD> <img <img <img <img <img SRC=”<!−−#e c h o SRC=”<!−−#e c h o SRC=”<!−−#e c h o SRC=”<!−−#e c h o SRC=”<!−−#e c h o v a r=” i d 6 ”−−>”> </TD> v a r=” i d 7 ”−−>”> </TD> v a r=” i d 8 ”−−>”> </TD> v a r=” i d 9 ”−−>”> </TD> v a r=” i d 1 0 ”−−>”> </TD> <TD> <TD> <TD> <TD> <TD> <img <img <img <img <img SRC=”<!−−#e c h o SRC=”<!−−#e c h o SRC=”<!−−#e c h o SRC=”<!−−#e c h o SRC=”<!−−#e c h o v a r=” i d 1 1 ”−−>”> v a r=” i d 1 2 ”−−>”> v a r=” i d 1 3 ”−−>”> v a r=” i d 1 4 ”−−>”> v a r=” i d 1 5 ”−−>”> </TR> <TR> <TD <TD <TD <TD ALIGN=CENTER> ALIGN=CENTER> ALIGN=CENTER> ALIGN=CENTER> ID ID ID ID 0 1 2 3 </TD> </TD> </TD> </TD> </TD> </TD> </TD> </TD> </TD> </TD> </TD> </TD> </TD> </TD> 240 ANEXO C. CÓDIGOS FUENTES 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 <TD <TD <TD <TD <TD ALIGN=CENTER> ALIGN=CENTER> ALIGN=CENTER> ALIGN=CENTER> ALIGN=CENTER> ID ID ID ID ID 4 5 6 7 8 </TD> </TD> </TD> </TD> </TD> <TD <TD <TD <TD <TD ALIGN=CENTER> ALIGN=CENTER> ALIGN=CENTER> ALIGN=CENTER> ALIGN=CENTER> ID ID ID ID ID 9 10 11 12 13 </TD> < /TD> < /TD> < /TD> < /TD> <TD ALIGN=CENTER> ID 14 < /TD> <TD ALIGN=CENTER> ID 15 < /TD> </TR> </TABLE> </FIELDSET> <br> <p><CENTER><B><I><f o n t CENTER></p> </BODY> </HTML> C.9. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 c f a c e=”mono” > Alan Cohn − R ossan a M o r a l e s | 2 0 0 7 < / f o n t ></B></I ></ Código BotonEnviaCaracter.c #c l a s s auto #de fi ne #de fi ne #de fi ne #de fi ne #de fi ne #de fi ne DS1 DS2 S1 S2 ON OFF 6 7 4 7 0 1 #de fi ne CINBUFSIZE #de fi ne COUTBUFSIZE #de fi ne EINBUFSIZE #de fi ne EOUTBUFSIZE 255 255 255 255 nodebug void msDelay ( unsigned i n t d e l a y ) { auto unsigned long d o n e t i m e ; } d o n e t i m e = MS TIMER + d e l a y ; while ( ( long ) ( MS TIMER − d o n e t i m e ) < 0 ) ; i n t pbRdSwitch ( i n t s w s t a t e ) { i f ( s w s t a t e == S1 ) return ( B i t R d P o r t I (PFDR, else return ( B i t R d P o r t I (PBDR, } swstate ) ) ; swstate ) ) ; void pbWrLed( i n t l e d , i n t o n o f f ) { Bi t W r P or t I (PFDR, & PFDRShadow , } main ( ) { auto i n t i , ch ; auto char b u f f e r [ 6 4 ] ; auto i n t sw1 , sw2 , l e d 1 , onoff , led ) ; led2 ; s t a t i c const char s t r i n g 1 [ ] = { ” Lo mando e l s t a t i c const char s t r i n g 2 [ ] = { ” Lo mando e l puerto E al puerto C al p u e r t o C ! ! ! \ n\n\ r ” } ; p u e r t o E ! ! ! \ n\n\ r ” } ; brdInit () ; Bi t W r P or t I (PEDR, & PEDRShadow , 0 , 5 ) ; l e d 1=l e d 2 =1; sw1=sw2 =0; serEopen (19200) ; serEwrFlush ( ) ; serErdFlush () ; 241 ANEXO C. CÓDIGOS FUENTES 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 ser Cop en ( 1 9 2 0 0 ) ; serCwrFlush ( ) ; serCrdFlush ( ) ; memset ( b u f f e r , 0 x00 , sizeof ( buffer ) ) ; p r i n t f ( ” \ n A r r an co e l programa \n\n\n\ r ” ) ; for ( ; ; ) { costate { i f ( pbRdSwitch ( S1 ) ) abort ; w a i t f o r ( DelayMs ( 5 0 ) ) ; i f ( pbRdSwitch ( S1 ) ) { sw1 =! sw1 ; abort ; } } costate { i f ( pbRdSwitch ( S2 ) ) abort ; w a i t f o r ( DelayMs ( 5 0 ) ) ; i f ( pbRdSwitch ( S2 ) ) { sw2 =! sw2 ; abort ; } } costate { i f ( sw1 ) { pbWrLed( DS1 , ON) ; sw1 =! sw1 ; memcpy( b u f f e r , s t r i n g 2 , s t r l e n ( s t r i n g 2 ) ) ; serCputs ( b u f f e r ) ; memset ( b u f f e r , 0 x00 , s i z e o f ( b u f f e r ) ) ; i = 0; while ( ( ch = s e r E g e t c ( ) ) ! = ’ \ r ’ ) { i f ( ch ! = − 1) { b u f f e r [ i ++] = ch ; } } b u f f e r [ i ++] = ch ; buffer [ i ] = ’ \0 ’ ; p r i n t f ( ” %s ” , b u f f e r ) ; memset ( b u f f e r , 0 x00 , pbWrLed( DS1 , OFF) ; } sizeof ( buffer ) ) ; } costate { i f ( sw2 ) { pbWrLed( DS2 , ON) ; sw2 =! sw2 ; memcpy( b u f f e r , s t r i n g 1 , s t r l e n ( s t r i n g 1 ) ) ; serEputs ( b u f f e r ) ; memset ( b u f f e r , 0 x00 , s i z e o f ( b u f f e r ) ) ; } i = 0; while ( ( ch = s e r C g e t c ( ) ) ! = ’ \ r ’ ) { i f ( ch ! = − 1) { b u f f e r [ i ++] = ch ; } b u f f e r [ i ++] = ch ; buffer [ i ] = ’ \0 ’ ; p r i n t f ( ” %s ” , b u f f e r ) ; pbWrLed( DS2 , OFF) ; } 242 ANEXO C. CÓDIGOS FUENTES 147 148 149 } } } C.10. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 Código Autentificacion.c /∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗∗ ∗∗ ∗∗∗ ∗∗ ∗∗ ∗∗ ∗∗ ∗∗ ∗∗ ∗∗ ∗∗∗ ∗∗ ∗∗ ∗∗ ∗∗ ∗∗ ∗∗ ∗∗ ∗∗∗ ∗∗ ∗∗ ∗∗ ∗∗ ∗∗ ∗∗ ∗∗ ∗∗∗ ∗∗ ∗∗ ∗∗ ∗∗Ó AUTENTIFICACIN ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗∗ ∗∗∗ ∗∗ ∗∗ ∗∗ ∗∗ ∗∗ ∗∗ ∗∗ ∗∗∗ ∗∗ ∗∗ ∗∗ ∗∗ ∗∗ ∗∗ ∗∗ ∗∗∗ ∗∗ ∗∗ ∗∗ ∗∗ ∗∗ ∗∗ ∗∗ ∗∗∗ ∗∗ ∗∗ ∗∗ ∗∗ ∗∗∗/ #de fi ne TCPCONFIG 1 // E t h e r n e t h a b i l i t a d o , PPP d e s a b i l i t a d o , // DHCP d e s a b i l i t a d o , Runtime d i s a b l e #de fi ne HTTP MAXBUFFER // ñTamao d e l b u f f e r HTTP ( b y t e s ) p a r a // ó i n f o r m a c i n r e c i b i d a y t r a n s m i t i d a 512 agunatar #de fi ne USE HTTP DIGEST AUTHENTICATION 1 #de fi ne SSPEC USERSPERRESOURCE #de fi ne HTTP NO FLASHSPEC // 3 Desabilitar #memmap xmem #u s e ” d c r t c p . l i b ” // ó U t i l i z a c i n #u s e ” h t t p . l i b ” // ó U t i l i z a c i n /∗ // D e f i n e de de el que e l únmero de usuarios es 3 flashspec l a ı́ l i b r e r a l a ı́ l i b r e r a dcrtcp . l i b http . l i b x i m p o r t e s una ó f u n c i n de Dynamic C q u e toma l a im agen b i n a r i a de un a r c h i v o , l a u b i c a en l a memoria e x t e n d i d a d e l c o n t r o l a d o r y a s o c i a unı́ s m b o l o con l a ó d i r e c c i n ı́ f s i c a de l a im agen en e l c o n t r o l a d o r ∗/ #x i m p o r t ” Documents and S e t t i n g s / R ossan a / D esktop / R ep oP royecto / Rab b i t /PruebasHTTP / p a g e s / s t a t i c . html ” index html #x i m p o r t ” Documents and S e t t i n g s / R ossan a / D esktop / R ep oP royecto / Rab b i t /PruebasHTTP / p a g e s / titulorabbit . gif ” titulorabbit gif /∗ SSPEC MIMETABLE r e t o r n a un m e n s a j e i n d i c a n d o l a r e s p u e s t a a l a s p e t i c i o n e s e n t r a n t e s a l s e r v i d o r HTTP m e d i a n t e l a ó c o m p a r a c i n de l a ó e x t e n s i n de l a ó p e t i c i n e n t r a n t e coné s t a l i s t a y d e v u e l v e e l s e g u n d o campo con e l c o n t e n i d o ∗/ SSPEC MIMETABLE START SSPEC MIME ( ” . html ” , ” t e x t / html ” ) , SSPEC MIME ( ” . g i f ” , ” i m age / g i f ” ) SSPEC MIMETABLE END void main ( void ) { int user1 ; int user2 ; int user3 ; int u s e r 1 e n a b l e d ; int u s e r 2 e n a b l e d ; int u s e r 3 e n a b l e d ; i n t p age1 ; i n t p age2 ; i n t ch ; p r i n t f ( ” P r e s i o n a r ’ 1 ’ , ’ 2 ’ , o ’ 3 ’ p a r a d e s h a b i l i t a r / h a b i l i t a r l o s 3 u s u a r i o s . \ n” ) ; p r i n t f ( ” P r e s i o n a r ’ b ’ , ’ r ’ , o ’ s ’ p a r a s e t e a r l a ó a u t e n t i f i c a c i n como á b s i c a , r e s u m i d a o s i n a u t e n t i f i c a r . \ n\n” ) ; so ck ini t () ; http i ni t () ; // // Inicializar Inicializar e l TCP/ IP s t a c k e l s e r v i d o r web h t t p s e t a u t h e n t i c a t i o n (HTTP DIGEST AUTH) ; p r i n t f ( ” Usando ó a u t e n t i f i c a c i n con resumen \n” ) ; /∗ ó D e f i n i c i n de u s u a r i o s y ñ c o n t r a s e a s ∗/ user1 user2 user3 user1 user2 user3 enabled enabled enabled = sauth = sauth = sauth p age1 sspec sspec sspec sspec = s s p e c a d d x m e m f i l e ( ” / ” , i n d e x h t m l , SERVER HTTP) ; a d d u s e r ( page1 , u s e r 1 ) ; a d d u s e r ( page1 , u s e r 2 ) ; a d d u s e r ( page1 , u s e r 3 ) ; s e t r e a l m ( page1 , ”Admin” ) ; = 1; = 1; = 1; a d d u s e r ( ” u s u a r i o 1 ” , ” 1 ” , SERVER HTTP) ; a d d u s e r ( ” u s u a r i o 2 ” , ” 2 ” , SERVER HTTP) ; a d d u s e r ( ” u s u a r i o 3 ” , ” 3 ” , SERVER HTTP) ; p age2 = s s p e c a d d x m e m f i l e ( ” i n d e x . html ” , i n d e x h t m l , SERVER HTTP) ; s s p e c a d d u s e r ( page2 , u s e r 1 ) ; s s p e c a d d u s e r ( page2 , u s e r 2 ) ; 243 ANEXO C. CÓDIGOS FUENTES 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 s s p e c a d d u s e r ( page2 , u s e r 3 ) ; s s p e c s e t r e a l m ( page2 , ”Admin” ) ; s s p e c a d d x m e m f i l e ( ” r a b b i t 1 . g i f ” , r a b b i t 1 g i f , SERVER HTTP) ; /∗ t c p r e s e r v e p o r t l e e x i g e a l s e r v i d o r i g n o r a r p e t i c i o n e s cu an do no e x i s t e un s o c k e t d i s p o n i b l e en e l p u e r t o c o r r e s p o n d i e n t e ; g u a r d a memoria p e r o p u e d e c a u s a r d e l a y s cu ando s e a c t u a l i z a una á p g i n a . ∗/ t c p r e s e r v e p o r t (80) ; while ( 1 ) { if Fijarse q u e ó b o t n apreta el usuario ( kbhit () ) { ch = g e t c h a r ( ) ; switch ( ch ) { c a se ’ 1 ’ : user1 enabled = ! user1 enabled ; i f ( user1 enabled ) { s s p e c a d d u s e r ( page1 , u s e r 1 ) ; s s p e c a d d u s e r ( page2 , u s e r 1 ) ; p r i n t f ( ” U s u a r i o 1 h a b i l i t a d o \n” ) ; } else { s s p e c r e m o v e u s e r ( page1 , u s e r 1 ) ; s s p e c r e m o v e u s e r ( page2 , u s e r 1 ) ; p r i n t f ( ” U s u a r i o 1 d e s h a b i l i t a d o \n” ) ; } break ; c a se ’ 2 ’ : user2 enabled = ! user2 enabled ; i f ( user2 enabled ) { s s p e c a d d u s e r ( page1 , u s e r 2 ) ; s s p e c a d d u s e r ( page2 , u s e r 2 ) ; p r i n t f ( ” U s u a r i o 2 h a b i l i t a d o \n” ) ; } else { s s p e c r e m o v e u s e r ( page1 , u s e r 2 ) ; s s p e c r e m o v e u s e r ( page2 , u s e r 2 ) ; p r i n t f ( ” U s u a r i o 2 d e s h a b i l i t a d o \n” ) ; } break ; c a se ’ 3 ’ : user3 enabled = ! user3 enabled ; i f ( user3 enabled ) { s s p e c a d d u s e r ( page1 , u s e r 3 ) ; s s p e c a d d u s e r ( page2 , u s e r 3 ) ; p r i n t f ( ” U s u a r i o 3 h a b i l i t a d o \n” ) ; } else { s s p e c r e m o v e u s e r ( page1 , u s e r 3 ) ; s s p e c r e m o v e u s e r ( page2 , u s e r 3 ) ; p r i n t f ( ” U s u a r i o 3 d e s h a b i l i t a d o \n” ) ; } break ; c a se ’ b ’ : h t t p s e t a u t h e n t i c a t i o n (HTTP BASIC AUTH) ; p r i n t f ( ” Usando ó a u t e n t i f i c a c i n á b s i c a \n” ) ; break ; c a se ’ r ’ : h t t p s e t a u t h e n t i c a t i o n (HTTP DIGEST AUTH) ; p r i n t f ( ” Usando ó a u t e n t i f i c a c i n con resumen \n” ) ; break ; } c a se ’ s ’ : h t t p s e t a u t h e n t i c a t i o n (HTTP NO AUTH) ; p r i n t f ( ”No u san d o ó a u t e n t i f i c a c i n \n” ) ; break ; } http handler () ; } // d e b e llamarse el ht tp handler () . } C.11. 1 2 3 4 // Código Leds.c /∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗∗ ∗∗ ∗∗ ∗∗ ∗∗∗ ∗∗ ∗∗ ∗∗ ∗∗∗ ∗∗ ∗∗ ∗∗ ∗∗ ∗∗∗ ∗∗ ∗∗ ∗∗ ∗∗∗ ∗∗ ∗∗ ∗∗ browseled . c ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗∗ ∗∗ ∗∗ ∗∗∗ ∗∗ ∗∗ ∗∗ ∗∗ ∗∗∗ ∗∗ ∗∗ ∗∗ ∗∗∗ ∗∗ ∗∗ ∗∗ ∗∗∗ ∗∗ ∗∗ ∗∗ ∗∗∗/ #c l a s s auto 244 ANEXO C. CÓDIGOS FUENTES 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 #d e f i n e DS1 0 x40 #de fi ne DS2 0 x80 // l e d , // l e d , port F b i t port F b i t 6 bitmask 7 bitmask #de fi ne TCPCONFIG 1 #de fi ne TCP BUF SIZE 2 0 4 8 #de fi ne HTTP MAXSERVERS 2 #de fi ne MAX TCP SOCKET BUFFERS 2 #de fi ne REDIRECTHOST #de fi ne REDIRECTTO #memmap xmem #u s e ” d c r t c p . l i b ” #u s e ” h t t p . l i b ” /∗ ” h t t p : / / ” REDIRECTHOST ” / i n d e x . s h t m l ” // ó U t i l i z a c i n // ó U t i l i z a c i n de de l a ı́ l i b r e r a l a ı́ l i b r e r a dcrtcp . l i b http . li b x i m p o r t e s una ó f u n c i n de Dynamic C q u e toma l a im agen b i n a r i a de un a r c h i v o , l a u b i c a en l a memoria e x t e n d i d a d e l c o n t r o l a d o r y a s o c i a unı́ s m b o l o con l a ó d i r e c c i n ı́ f s i c a de l a im agen en e l c o n t r o l a d o r ∗/ #x i m p o r t ” Documents and browsled . shtml” #x i m p o r t ” Documents and titulorabbit . gif ” #x i m p o r t ” Documents and ledprendido . g i f ” #x i m p o r t ” Documents and ledapagado . g i f ” #x i m p o r t ” Documents and b ot on . g i f ” #x i m p o r t ” Documents and showsrc . shtml” #x i m p o r t ” Documents and /∗ PRIMARY STATIC IP S e t t i n g s / R ossan a / D esktop / R ep oP royecto / Rab b i t /PruebasHTTP / p a g e s / index html S e t t i n g s / R ossan a / D esktop / R ep oP royecto / Rab b i t /PruebasHTTP / p a g e s / titulorabbit gif S e t t i n g s / R ossan a / D esktop / R ep oP royecto / Rab b i t /PruebasHTTP / p a g e s / ledon gif S e t t i n g s / R ossan a / D esktop / R ep oP royecto / Rab b i t /PruebasHTTP / p a g e s / ledoff gif S e t t i n g s / R ossan a / D esktop / R ep oP royecto / Rab b i t /PruebasHTTP / p a g e s / boton gif S e t t i n g s / R ossan a / D esktop / R ep oP royecto / Rab b i t /PruebasHTTP / p a g e s / showsrc shtml S e t t i n g s / R ossan a / D esktop / R ep oP royecto / Rab b i t /PruebasHTTP / L ed s . c ” leds c SSPEC MIMETABLE r e t o r n a un m e n s a j e i n d i c a n d o l a r e s p u e s t a a l a s p e t i c i o n e s e n t r a n t e s a l s e r v i d o r HTTP m e d i a n t e l a ó c o m p a r a c i n de l a ó e x t e n s i n de l a ó p e t i c i n e n t r a n t e coné s t a l i s t a y d e v u e l v e e l s e g u n d o campo con e l c o n t e n i d o ∗/ SSPEC MIMETABLE START SSPEC MIME FUNC( ” . s h t m l ” , ” t e x t / html ” , s h t m l h a n d l e r ) , SSPEC MIME ( ” . html ” , ” t e x t / html ” ) , SSPEC MIME ( ” . g i f ” , ” i m age / g i f ” ) , SSPEC MIME ( ” . c g i ” , ” ” ) SSPEC MIMETABLE END char l e d 1 [ 1 5 ] ; char l e d 2 [ 1 5 ] ; int { l e d 1 t o g g l e ( HttpState ∗ s t a t e ) i f ( st r cm p ( l e d 1 , ” l e d p r e n d i d o . g i f ” ) ==0) s t r c p y ( led1 , ” ledapagado . g i f ” ) ; else s t r c p y ( led1 , ” ledprendido . g i f ” ) ; c g i r e d i r e c t t o ( s t a t e , REDIRECTTO) ; return 0 ; } int { l e d 2 t o g g l e ( HttpState ∗ s t a t e ) i f ( st r cm p ( l e d 2 , ” l e d p r e n d i o d . g i f ” ) ==0) s t r c p y ( led2 , ” ledapagado . g i f ” ) ; else s t r c p y ( led2 , ” ledprendido . g i f ” ) ; c g i r e d i r e c t t o ( s t a t e , REDIRECTTO) ; return 0 ; } SSPEC RESOURCETABLE START SSPEC RESOURCE XMEMFILE( ” / ” , i n d e x h t m l ) , 245 ANEXO C. CÓDIGOS FUENTES 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 SSPEC RESOURCE XMEMFILE( ” / i n d e x . s h t m l ” , i n d e x h t m l ) , SSPEC RESOURCE XMEMFILE( ” / s h o w s r c . s h t m l ” , s h o w s r c s h t m l ) , SSPEC RESOURCE XMEMFILE( ” / t i t u l o r a b b i t . g i f ” , t i t u l o r a b b i t g i f ) , SSPEC RESOURCE XMEMFILE( ” / l e d p r e n d i d o . g i f ” , l e d p r e n d i d o g i f ) , SSPEC RESOURCE XMEMFILE( ” / l e d a p a g a d o . g i f ” , l e d a p a g a d o g i f ) , SSPEC RESOURCE XMEMFILE( ” / b ot on . g i f ” , b o t o n g i f ) , SSPEC RESOURCE XMEMFILE( ” l e d s . c ” , l e d s c ) , SSPEC RESOURCE ROOTVAR( ” l e d 1 ” , l e d 1 , PTR16 , ” %s ” ) , SSPEC RESOURCE ROOTVAR( ” l e d 2 ” , l e d 2 , PTR16 , ” %s ” ) , SSPEC RESOURCE FUNCTION ( ” / l e d 1 t o g . c g i ” , l e d 1 t o g g l e ) , SSPEC RESOURCE FUNCTION ( ” / l e d 2 t o g . c g i ” , l e d 2 t o g g l e ) , SSPEC RESOURCETABLE END void u p d a t e o u t p u t s ( ) { auto i n t v a l u e ; v a l u e=PFDRShadow&0x3F ; de los leds /∗ ó A c t u a l i z a c i n O1 ∗/ i f ( st r cm p ( l e d 2 , ” l e d p r e n d i d o . g i f ” ) ) v a l u e |=DS2 ; WrPortI (PFDR, & PFDRShadow , value ) ; } main ( ) { // i n i c i a l i z a brdInit () ; la placa para este pr ogr am a s t r c p y ( led1 , ” ledprendido . g i f ” ) ; s t r c p y ( led2 , ” ledapagado . g i f ” ) ; so ck ini t () ; http i ni t () ; t c p r e s e r v e p o r t (80) ; while ( 1 ) { update outputs ( ) ; http handler () ; } } #nodebug C.12. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 // e s t a d o /∗ ó A c t u a l i z a c i n O0 ∗/ i f ( st r cm p ( l e d 1 , ” l e d p r e n d i d o . g i f ” ) ) v a l u e |=DS1 ; Código EnviaMail.c /∗ DC9 u p d a t e E s t o e s r e q u e r i d o p o r Dynamic C ó v e r s i n 9 , p a r a u t i l i z a r una IP f i j a en pr ogr am a y l a i n t e r f a z E t h e r n e t p o r d e f e c t o . No e s n e c e s a r i o en DC8 , s e a u t o d e f i n e n en l a s l i b s ∗/ #de fi ne TCPCONFIG 1 #de fi ne USE ETHERNET 1 /∗ Fin DC9 u p d a t e ∗/ #de fi ne #de fi ne #de fi ne #de fi ne #de fi ne FROM TO SUBJECT BODY1 BODY2 ” a c @ n e t g a t e . com . uy ” ” r ossan am @ gm ai l . com” ” R ab b i t e m a i l ” ” A l g u i e n ó p r e s i o n e l ób ot n ” ” \ r \ n S al u d os , RCM3700 . ” #de fi ne SMTP SERVER ” smtp . n e t g a t e . com . uy ” #de fi ne MY IP ADDRESS #de fi ne MY NETMASK ” 192.168.1.102 ” ” 255.255.255.0 ” #de fi ne MY GATEWAY #de fi ne MY NAMESERVER ” 192.168.1.1 ” ” 192.168.1.1 ” #de fi ne SMTP DEBUG #memmap xmem #u s e ” d c r t c p . l i b ” #u s e ” smtp . l i b ” 246 ANEXO C. CÓDIGOS FUENTES 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 main ( ) { int i , mail ; char body [ 2 5 6 ] ; so ck ini t () ; m a i l =0; WrPortI (PBDDR,&PBDDRShadow , 0 x7F ) ; } while ( 1 ) { i f ( ! B i t R d P o r t I (PFDR, 4 ) ) { s p r i n t f ( body , ” %s S1 %s ” ,BODY1,BODY2) ; m a i l =1; } i f ( ! B i t R d P o r t I (PBDR, 7 ) ) { s p r i n t f ( body , ” %s S2 %s ” ,BODY1,BODY2) ; m a i l =1; } i f ( mail ) { p r i n t f ( ” L i s t o a e n v i a r : \ n\ t %s \n” , body ) ; s m t p s e n d m a i l (TO, FROM, SUBJECT , body ) ; p r i n t f ( ” Enviando . . . \ n” ) ; while ( s m t p m a i l t i c k ( )==SMTP PENDING) ; p r i n t f ( ” L i s t o . \ n” ) ; m a i l =0; f o r ( i =0; i < 30000; i ++) ; } } C.13. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 Código AutentiLeds.c #c l a s s auto #de fi ne DS1 0 x40 #de fi ne DS2 0 x80 // l e d , // l e d , port F b i t port F b i t 6 bitmask 7 bitmask /∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗∗ ∗∗∗ ∗∗ ∗∗∗ ∗∗ ∗∗∗ ∗∗ ∗∗∗ ∗∗ ∗∗ ∗ S e c c i o n de ó c o n f i g u r a c i n ∗ ∗ −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ∗ ∗ Todos l o s campos de e s t a s e c c i o n ∗ ∗ d e b e s s e r a l t r a d o s de a c u e r d o ∗ ∗ l a c o n f i g u r a c i o n de l a r e d l o c a l ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗∗ ∗∗∗ ∗∗ ∗∗∗ ∗∗ ∗∗∗ ∗∗∗ ∗∗ ∗∗∗∗/ /∗ ∗ M ir a r LIB \TCPIP\TCP CONFIG . LIB p a r a ∗ de como s e t e r a r l a c o n f i g u r a c i o n . ∗/ #de fi ne TCPCONFIG 1 obtener instruciones #de fi ne TCP BUF SIZE 2 0 4 8 #de fi ne USE HTTP DIGEST AUTHENTICATION 1 #de fi ne SSPEC USERSPERRESOURCE 3 /∗ ∗ Configuracion ∗/ del s e r v i d o r Web /∗ ∗ D e f i n e e l numero de HTTP s e r v e r s y l o s s o c k e t b u f f e r s . ∗ Con t c p r e s e r v e p o r t ( ) , menos l o s s e r v i d o r e s HTTP s e r v e r s ∗/ #de fi ne HTTP MAXSERVERS 2 #de fi ne MAX TCP SOCKET BUFFERS 2 512 #de fi ne HTTP MAXBUFFER que sean necesarios . PRIMARY STATIC IP #de fi ne REDIRECTHOST // # d e f i n e REDIRECTHOST ”my . h o s t . com : 8 0 8 0 ” /∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗∗ ∗∗ ∗∗∗ ∗∗ ∗∗∗ ∗∗ ∗∗∗ ∗∗ ∗∗∗ ∗∗ ∗∗ ∗ Fin de l a s e c c i o n de c o n f i g u r a t i o n ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗∗ ∗∗∗ ∗∗ ∗∗∗ ∗∗ ∗∗∗ ∗∗ ∗∗∗ ∗∗ ∗∗∗/ #de fi ne REDIRECTTO ” h t t p : / / ” REDIRECTHOST ” / i n d e x . s h t m l ” 247 ANEXO C. CÓDIGOS FUENTES 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 #memmap xmem #u s e ” d c r t c p . l i b ” #u s e ” h t t p . l i b ” #x i m p o r t ” Documents and browsled . shtml” #x i m p o r t ” Documents and titulorabbit . gif ” #x i m p o r t ” Documents and ledprendido . g i f ” #x i m p o r t ” Documents and ledapagado . g i f ” #x i m p o r t ” Documents and b ot on . g i f ” #x i m p o r t ” Documents and showsrc . shtml” #x i m p o r t ” Documents and AutentiLeds . c ” #x i m p o r t ” Documents and browsled . shtml” S e t t i n g s / R ossan a / D esktop / R ep oP royecto / Rab b i t /PruebasHTTP / p a g e s / index html S e t t i n g s / R ossan a / D esktop / R ep oP royecto / Rab b i t /PruebasHTTP / p a g e s / titulorabbit gif S e t t i n g s / R ossan a / D esktop / R ep oP royecto / Rab b i t /PruebasHTTP / p a g e s / ledon gif S e t t i n g s / R ossan a / D esktop / R ep oP royecto / Rab b i t /PruebasHTTP / p a g e s / ledoff gif S e t t i n g s / R ossan a / D esktop / R ep oP royecto / Rab b i t /PruebasHTTP / p a g e s / boton gif S e t t i n g s / R ossan a / D esktop / R ep oP royecto / Rab b i t /PruebasHTTP / p a g e s / showsrc shtml S e t t i n g s / R ossan a / D esktop / R ep oP royecto / Rab b i t /PruebasHTTP / autentileds c S e t t i n g s / R ossan a / D esktop / R ep oP royecto / Rab b i t /PruebasHTTP / p a g e s / index1 html SSPEC MIMETABLE START SSPEC MIME FUNC( ” . s h t m l ” , ” t e x t / html ” , s h t m l h a n d l e r ) , SSPEC MIME ( ” . html ” , ” t e x t / html ” ) , SSPEC MIME ( ” . g i f ” , ” i m age / g i f ” ) , SSPEC MIME ( ” . c g i ” , ” ” ) SSPEC MIMETABLE END char l e d 1 [ 1 5 ] ; char l e d 2 [ 1 5 ] ; int { l e d 1 t o g g l e ( HttpState ∗ s t a t e ) i f ( st r cm p ( l e d 1 , ” l e d p r e n d i d o . g i f ” ) ==0) s t r c p y ( led1 , ” ledapagado . g i f ” ) ; else s t r c p y ( led1 , ” ledprendido . g i f ” ) ; c g i r e d i r e c t t o ( s t a t e , REDIRECTTO) ; return 0 ; } int { l e d 2 t o g g l e ( HttpState ∗ s t a t e ) i f ( st r cm p ( l e d 2 , ” l e d p r e n d i d o . g i f ” ) ==0) s t r c p y ( led2 , ” ledapagado . g i f ” ) ; else s t r c p y ( led2 , ” ledprendido . g i f ” ) ; c g i r e d i r e c t t o ( s t a t e , REDIRECTTO) ; return 0 ; } SSPEC RESOURCETABLE START SSPEC RESOURCE XMEMFILE( ” / ” , i n d e x h t m l ) , SSPEC RESOURCE XMEMFILE( ” / i n d e x . s h t m l ” , i n d e x h t m l ) , SSPEC RESOURCE XMEMFILE( ” / s h o w s r c . s h t m l ” , s h o w s r c s h t m l ) , SSPEC RESOURCE XMEMFILE( ” / t i t u l o r a b b i t . g i f ” , t i t u l o r a b b i t g i f ) , SSPEC RESOURCE XMEMFILE( ” / l e d p r e n d i d o . g i f ” , l e d o n g i f ) , SSPEC RESOURCE XMEMFILE( ” / l e d a p a g a d o . g i f ” , l e d o f f g i f ) , SSPEC RESOURCE XMEMFILE( ” / b ot on . g i f ” , b o t o n g i f ) , SSPEC RESOURCE XMEMFILE( ” A u t e n t i l e d s . c ” , A u t e n t i l e d s c ) , SSPEC RESOURCE ROOTVAR( ” l e d 1 ” , l e d 1 , PTR16 , ” %s ” ) , SSPEC RESOURCE ROOTVAR( ” l e d 2 ” , l e d 2 , PTR16 , ” %s ” ) , SSPEC RESOURCE FUNCTION ( ” / l e d 1 t o g . c g i ” , l e d 1 t o g g l e ) , SSPEC RESOURCE FUNCTION ( ” / l e d 2 t o g . c g i ” , l e d 2 t o g g l e ) , SSPEC RESOURCETABLE END void u p d a t e o u t p u t s ( ) { auto i n t v a l u e ; v a l u e=PFDRShadow&0x3F ; /∗ ó A c t u a l i z a c i n O0 ∗/ i f ( st r cm p ( l e d 1 , ” l e d p r e n d i d o . g i f ” ) ) v a l u e |=DS1 ; 248 ANEXO C. CÓDIGOS FUENTES 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 /∗ ó A c t u a l i z a c i n O1 ∗/ i f ( st r cm p ( l e d 2 , ” l e d p r e n d i d o . g i f ” ) ) v a l u e |=DS2 ; WrPortI (PFDR, & PFDRShadow , value ) ; } main ( ) { int user1 ; int user2 ; int user3 ; int u s e r 1 e n a b l e d ; int u s e r 2 e n a b l e d ; int u s e r 3 e n a b l e d ; i n t p age1 ; i n t p age2 ; i n t ch ; p r i n t f ( ” P r e s i o n a r ’ 1 ’ , ’ 2 ’ , o ’ 3 ’ p a r a d e s h a b i l i t a r / h a b i l i t a r l o s 3 u s u a r i o s . \ n” ) ; p r i n t f ( ” P r e s i o n a r ’ b ’ , ’ r ’ , o ’ s ’ p a r a s e t e a r l a ó a u t e n t i f i c a c i n como á b s i c a , r e s u m i d a o s i n a u t e n t i f i c a r . \ n\n” ) ; s t r c p y ( led1 , ” ledon . g i f ” ) ; s t r c p y ( led2 , ” l e d o f f . g i f ” ) ; brdInit () ; so ck ini t () ; http i ni t () ; t c p r e s e r v e p o r t (80) ; h t t p s e t a u t h e n t i c a t i o n (HTTP DIGEST AUTH) ; p r i n t f ( ” Usando ó a u t e n t i f i c a c i n con resumen \n” ) ; /∗ ó D e f i n i c i n user1 enabled user2 enabled user3 enabled user1 = sauth user2 = sauth user3 = sauth de u s u a r i o s y ñ c o n t r a s e a s ∗/ = 1; = 1; = 1; a d d u s e r ( ” u s u a r i o 1 ” , ” 1 ” , SERVER HTTP) ; a d d u s e r ( ” u s u a r i o 2 ” , ” 2 ” , SERVER HTTP) ; a d d u s e r ( ” u s u a r i o 3 ” , ” 3 ” , SERVER HTTP) ; p age1 sspec sspec sspec sspec = s s p e c a d d x m e m f i l e ( ” / ” , i n d e x h t m l , SERVER HTTP) ; a d d u s e r ( page1 , u s e r 1 ) ; a d d u s e r ( page1 , u s e r 2 ) ; a d d u s e r ( page1 , u s e r 3 ) ; s e t r e a l m ( page1 , ”Admin” ) ; p age2 sspec sspec sspec sspec = s s p e c a d d x m e m f i l e ( ” i n d e x . html ” , i n d e x h t m l , SERVER HTTP) ; a d d u s e r ( page2 , u s e r 1 ) ; a d d u s e r ( page2 , u s e r 2 ) ; a d d u s e r ( page2 , u s e r 3 ) ; s e t r e a l m ( page2 , ”Admin” ) ; s s p e c a d d x m e m f i l e ( ” r a b b i t 1 . g i f ” , r a b b i t 1 g i f , SERVER HTTP) ; while ( 1 ) { update outputs () ; http handler () ; } } #nodebug 249 Anexo D Hojas de datos, tablas y licencias D.1. Hojas de datos Aquı́ se publican los links de los componentes nombrados en esta documentación. D.1.1. Microprocesador Rabbit 3000 http://www.rabbitsemiconductor.com/products/rab3000/rab3000.pdf D.1.2. Microprocesador PIC 16F628A http://www.ortodoxism.ro/datasheets/microchip/40044b.pdf D.1.3. MAX232 http://www.ortodoxism.ro/datasheets/texasinstruments/max232.pdf D.1.4. MAX485 http://datasheets.maxim-ic.com/en/ds/MAX1487-MAX491.pdf D.1.5. Compuerta NOR MC14001 http://www.tranzistoare.ro/datasheets/270/397394 DS.pdf D.1.6. Multiplexor 74HC153 http://www.ortodoxism.ro/datasheets/philips/74HC HCT153 CNV 2.pdf 250 ANEXO D. HOJAS DE DATOS, TABLAS Y LICENCIAS D.1.7. Demultiplexor CD4555 http://www.tranzistoare.ro/datasheets/105/109640 DS.pdf D.1.8. Regulador LM7805 http://www.ortodoxism.ro/datasheets/fairchild/LM7805.pdf D.1.9. Transistor BC547 http://www.ortodoxism.ro/datasheets/MicroElectronics/mXuwzwr.pdf D.1.10. Emisor Ir L53SF4BT http://www.tranzistoare.ro/datasheets2/92/92443 1.pdf D.2. Tablas La empresa Philips Semiconductor elaboró una tabla que sirve como aplicación de la codificación infrarroja RC-5. D.2.1. Tabla RC5 http://z0.saladeteletipos.com/twiki/bin/viewfile/ProcesadorMultiprotocolar/ ProtocoloIr?rev=1;filename=Tabla RC5.txt D.3. Licencias Una licencia de software es el permiso brindado por el titular del derecho de autor, en cualquier forma contractual, al usuario de un programa informático, para utilizarlo conforme a condiciones convenidas y de determinada forma. Las herramientas utilizadas en este proyecto utilizan las licencias GNU y BSD. D.3.1. Licencia GNU Fuente: http://www.gnu.org/copyleft/gpl.html Traducción no oficial al español: http://gugs.sindominio.net/ licencias/gples.html D.3.2. Licencia BSD Fuente: http://www.freebsd.org/copyright/freebsd-license.html 251 Anexo E Decodificación infrarroja E.1. Introducción En este anexo se decodifica la trama infrarroja de cada comando del control remoto del radiograbador con cd Aiwa. La trama está formada por los campos: secuencia inicial, encabezado, código de datos y secuencia final. También, se vislumbra la forma de onda para mostrar la modulación por largo de pulso. E.2. Decodificación de los comandos La Tabla E.1 especifica la decodificación de cada comando, separando el encabezado, el código de datos y el bit de stop. 252 ANEXO E. DECODIFICACIÓN INFRARROJA Comando Número 1 Número 2 Número 3 Número 4 Número 5 Número 6 Número 7 Número 8 Número 9 Número 0 Play/Pause Repeat Memory Cancel Surround Skip back Skip Forward Stop Código Ir 11110001111110000111000000 0111011010001001 11110001111110000111000000 1011011001001001 11110001111110000111000000 0011011011001001 11110001111110000111000000 1101011000101001 11110001111110000111000000 0101011010101001 11110001111110000111000000 1001011001101001 11110001111110000111000000 0001011011101001 11110001111110000111000000 1110011000011001 11110001111110000111000000 0110011010011001 11110001111110000111000000 1010011001011001 11110001111110000111000000 1101110000100011 11110001111110000111000000 0111010110001010 11110001111110000111000000 1011010101001010 11110001111110000111000000 0011010111001010 11110001111110000111000000 1111100000000111 11110001111110000111000000 0001110011100011 11110001111110000111000000 1001110001100011 11110001111110000111000000 0101110010100011 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 Tabla E.1: Decodificación comandos IR radiograbador AIWA 253 ANEXO E. DECODIFICACIÓN INFRARROJA E.3. Forma de onda de los comandos Figura E.1: Códigos AIWA 254 ANEXO E. DECODIFICACIÓN INFRARROJA Figura E.2: Códigos AIWA Figura E.3: Códigos AIWA 255