Entrega final

Anuncio
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: yo@miHost.example
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: yo@midominio.com
S: 250 Ok
C: RCPT TO: destinatario@sudominio.com
S: 250 Ok
C: DATA
S: 354 End data with <CR><LF>.<CR><LF>
C: Subject: Campo de asunto
C: From: yo@midominio.com
C: To: destinatario@sudominio.com
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
Descargar