Escolar Documentos
Profissional Documentos
Cultura Documentos
PROYECTO FINAL
TELEMETRA ECG
Profesor:
Ing. Carlos Puccini
Autores:
Martn Roberti
Vctor Arvalo
OBJETIVO
Disear un equipo capaz de adquirir un bio-potencial (ECG), procesarlo y acondicionarlo analgicamente,
digitalizarlo y transmitirlo inalmbricamente a travs de la red de telefona celular por GPRS hacia un
servidor en Internet. De este modo, personal de enfermera, sin necesidad de poseer conocimientos
tcnicos e informticos, pueda transmitir un estudio de ECG al centro de salud para ser analizado por el
mdico cardilogo y dar un diagnstico al instante.
Posibles aplicaciones de un equipo con estas caractersticas:
1.
2.
3.
4.
2 - 151
CONTENIDO
Pgina
OBJETIVO
1 - BASES DE ELECTROCARDIOGRAFIA
1.1 - Introduccin
10
10
12
12
14
15
15
16
17
17
2 ELECTRNICA ANALGICA
18
2.1 - Introduccin
19
19
19
22
26
3 - 151
30
2.2.5 - Filtrado
31
31
32
33
34
36
36
2.3.2 - Optoacopladores
38
40
41
3 TRANSMISIN INALMBRICA
42
3.1 - Introduccin
43
43
44
45
46
46
48
49
49
50
51
52
52
4 DISPLAY LCD
54
4.1 - Introduccin
55
55
4 - 151
56
57
58
59
4.7 - Funcionamiento
59
4.8 - Escalado
61
4.9 - Interpolacin
63
5 - MICROCONTROLADOR
64
5.1 - Introduccin
65
65
65
65
67
5.4 El programa
68
68
69
69
70
5.8.1 - DISPLAY
70
5.8.2 - CONVERT
70
5.8.3 - SENDCHAR
70
5.8.4 - SENDSTR
70
5.8.5 - SENDDATA
70
5.8.6 - RXCHARS_G20
71
5.8.7 - STRCMP
71
6 GUA DE USO
72
7 - CONCLUSIONES
74
5 - 151
8 - BIBLIOGRAFA
76
ANEXOS
78
79
80
81
86
Anexo V Programa PC
89
97
149
150
6 - 151
I
Bases de electrocardiografa
7 - 151
1 BASES DE ELECTROCARDIOGRAFA
1.1 INTRODUCCIN
La seal que vamos a procesar corresponde a la seal electrocardiogrfica llamada tambin ECG, sta es
producto de la actividad electroqumica del corazn, para medirla se pueden utilizar varios mtodos, a
grandes rasgos stos pueden clasificarse en mtodos invasivos y no invasivos.
El mtodo no invasivo comnmente ms usado es el electrocardiograma, en el cual se basa nuestra tesis de
grado, para medir la seal electrocardiogrfica se colocan electrodos en puntos especficos sobre la piel del
paciente. El funcionamiento del corazn obedece a complejos procesos electroqumicos, se producen as
cargas y descargas elctricas
(despolarizaciones y repolarizaciones) que dan origen a la actividad
muscular del corazn.
Esta actividad elctrica se traslada hasta la piel de la persona debido a que todo el tejido humano que rodea
al corazn se comporta esencialmente como un conductor, ver figura 1.1, por lo tanto el objetivo del
electrocardiograma es caracterizar el funcionamiento del corazn midiendo los potenciales elctricos
presentes en la piel del cuerpo humano.
La piel del cuerpo humano es entonces la superficie de un conductor, es decir podemos pensar que entre el
corazn y la piel existen resistencias elctricas que hacen de conductores, de esta manera colocando
electrodos adheridos a la piel podemos medir la diferencia de potencial que existe entre ellos, en la figura
1.1 se observan 2 electrodos P1 y P2 y el modelo circuital equivalente.
8 - 151
electrodos y a las pinzas y se procede a la medicin. Este proceso lleva unos pocos minutos, en la mayora
de los equipos el registro queda asentado sobre papel impreso trmicamente, actualmente existen equipos
con posibilidad de almacenamiento en medios digitales.
Observacin Clnica : este tipo de observacin se da cuando el paciente est en internacin,
terapia intensiva o en quirfano, en este caso se colocan los electrodos sobre el trax del paciente. El fin de
este estudio es el monitoreo del paciente por lo cual se requieren menos conexiones, tpicamente con una o
dos derivaciones alcanza.
plano frontal : determina las derivaciones I, II y III y las derivaciones ampliadas aVR, aVL y aVF.
plano transversal : determina las derivaciones precordiales V1, V2, V3, V4, V5 y V6.
La figura 1.2 muestra el plano frontal (color rojo) y el plano transversal (color azul), no se muestra el plano
longitudinal ya que como hemos dicho no es un plano muy usado en electrocardiografa convencional.
El plano frontal secciona la figura humana paralelo a la columna vertebral y paralelo al trax, pasando por el
centro del tronco o corazn, el plano transversal secciona la figura humana perpendicular al trax y
perpendicular a la columna vertebral pasando por el centro del corazn.
Por lo tanto, los planos de medicin frontal y transversal determinan 12 derivaciones estndar que han sido
sistematizadas y universalmente aceptadas. Seguido explicamos cuales son estas derivaciones segn el
plano de medicin.
9 - 151
10 - 151
Einthoven consideraba estas tres derivaciones bipolares como un circuito cerrado, en el que segn la ley de
Kirchhoff se cumple II = I + III. Esta relacin se conoce como ley de Einthoven. Dicha ley, que debe cumplirse
siempre en electrocardiografa, permite asegurar que el electrocardiograma est correctamente registrado
(cables bien colocados) y rotulado. Einthoven, basndose en esa ley, describi su tringulo y partiendo del
principio de que era igual colocar los electrodos en las partes distales de los brazos o de las piernas que en
las races de los miembros (hombro derecho, hombro izquierdo y pubis), traslad dicho tringulo al torso
del cuerpo humano, ver figura 1.4.
En el comienzo de la electrocardiografa fueron estas las primeras derivaciones usadas. Einthoven fue un
fisilogo holands nacido en la Isla de Java en el siglo XIX y premio Nobel.
El nivel de voltaje de las derivaciones I, II y III es intermedio dentro del grupo de seales de ECG.
11 - 151
Los resistores y el punto medio son formados internamente por el equipo adquisidor (electrocardigrafo),
este punto medio es conectado automticamente al terminal negativo (terminal inversor) del amplificador
de entrada.
El nivel de tensin obtenido es el ms chico dentro de las seales de ECG.
12 - 151
punto central llamado terminal central de Wilson, este terminal es formado automticamente en el interior
del electrocardigrafo uniendo los terminales I, II y III del plano frontal a travs de 3 resistencias formando
un centro de estrella que es conectado al terminal negativo del amplificador.
Se las llama V1, V2, V3, V4, V5 y V6 , en ocasiones segn la norma tambin se las designa derivaciones C1 a
C6 o menos frecuente T1 a T6.
Las figuras 1.6 y 1.7 muestran la disposicin de los electrodos activos y la formacin del terminal central de
Wilson, el potencial elctrico del terminal central de Wilson es bastante estable, geomtricamente
corresponde al centro del tringulo de Einthoven, fisiolgicamente hablando es el potencial elctrico
presente en el centro del trax inmediatamente detrs del corazn.
13 - 151
Plano
Electrodos activos
por derivacin
Polaridad
DI,DII y DIII
Frontal
Bipolar
Intermedio
Frontal
Monopolar
Bajo
Transversal
Monopolar
Alto
14 - 151
Por lo tanto, para disear, primero debemos conocer de antemano la seal sobre la que vamos a trabajar, y
cules son sus caractersticas principales, tanto en magnitud como en tiempo. En el siguiente tem (1.4.2),
presentaremos el contenido espectral de la seal ECG.
En la figura 1.9 se observa una espiga pronunciada, con gran amplitud y pendiente a ambos lados, y de
corta duracin, esta espiga corresponde al complejo QRS, formado precisamente por la composicin de las
ondas Q, onda R y onda S. La amplitud de este complejo es la ms significativa en la seal ECG, con valores
de potencial elctrico en piel que pueden llegar hasta 5 mili-voltios, tpicamente 2 mV, obviamente esto
depende de la derivacin que tomemos, tema que ya hemos tratado en los prrafos anteriores.
Tambin observamos que la onda P es la de menor magnitud, por lo tanto el amplificador debe ser capaz de
15 - 151
En la figura 1.10 podemos apreciar que el mayor contenido frecuencial del ECG clsico se encuentra en el
rango de unos pocos mHz a los 20 Hz aproximadamente. Esta figura es til para comprender las frecuencias
de corte de los filtros pasa altos y pasa bajos. Una aclaracin importante es que esta curva espectral
corresponde al de un ECG limpio, es decir ideal. En la prctica, como ya hemos dicho existen importantes
fuentes de interferencia, la ms importante corresponde al zumbido de 50 Hz por acoplamiento con las
redes elctricas de alimentacin, con lo cual el diagrama espectral de la figura 1.10 cambia levemente.
16 - 151
17 - 151
II
Electrnica Analgica
18 - 151
2 ELECTRNICA ANALGICA
2.1 INTRODUCCIN
En base a las nociones adquiridas en el captulo anterior, abordamos en este captulo el diseo de la
electrnica analgica, la cual es responsable de acondicionar la seal electrocardiogrfica que luego ser
procesada en la etapa digital.
Presentamos el anlisis y diseo de la etapa analgica por separado considerando la subdivisin de la
misma en subetapas, cada una de stas responsables de una funcin en particular.
La primera de estas subetapas es la de proteccin, su funcin es proteger al amplificador de niveles de
tensin que superan un determinado valor, luego veremos en detalle a qu se deben estos niveles. Luego
tenemos la etapa de amplificador de instrumentacin (AI), seguido de la etapa de filtrado pasa altos y pasa
bajos, luego se adaptan niveles y se asla mediante un amplificador de aislacin del tipo comercial, por
ltimo, ya en la etapa no aislada tenemos un filtro del tipo muesca, conocido tambin como filtro notch.
Otra de las subetapas es la de calibracin, que permite calibrar la ganancia en base a una tensin de
referencia y a un selector de ganancia. Otra, es la de realimentacin del modo comn a la pierna derecha
del paciente conocida como circuito DRL (right-leg driving), por ltimo un circuito elemental que sirve para
cambiar la constante de tiempo en el filtro pasa altos, conocido en algunos equipos como circuito INSTO.
En este captulo, sern abordadas en detalle cada una de estas subetapas.
19 - 151
Existen varios tipos de limitadores de voltajes, tal como se observa en la figura 2.2.
La figura 2.2 (a) muestra la caracterstica de transferencia de estos dispositivos, se observa que para un
umbral de voltaje determinado la corriente se dispara limitando as el voltaje presente.
La figura 2.2 (b) muestra un acoplamiento de diodos usado para limitacin de voltaje del orden de los
milivoltios, 2.2 (c) representa un acoplamiento de diodos Zener utilizado para limitar voltajes de hasta 20
voltios. Por ltimo la figura 2.2 (d) muestra un limitador de voltaje del tipo gaseoso, utilizado para voltajes
elevados, este dispositivo electrnico est formado por 2 electrodos revestidos en plata en una atmsfera
de gas de nen a baja presin.
En nuestro diseo, utilizamos 2 tipos de limitadores de voltaje, el acoplamiento de diodos y el descargador
gaseoso.
20 - 151
El uso de cardio-desfibriladores es responsable de los altos voltajes que puedan ingresar al bio-amplificador,
para evitar su efecto perjudicial en el resto del equipo se utilizan descargadores gaseosos de nen,
(posiciones E2, H2 y F2 del esquemtico general).
En la figura 2.3, vemos una seccin del plano general (correspondiente a la derivacin 1) en la que est
presente la proteccin de alta tensin a travs de la lmpara de nen de acuerdo con la figura 2.2(d), por
otro lado aseguramos una proteccin de baja tensin que enclava la seal de entrada dentro del intervalo
dado por [(V-)-V;(V+)+V] determinada por los diodos D2 y D1 respectivamente, D4 y D3 cumplen esta
misma funcin para la derivacin 2. Vale aclarar que la disposicin de diodos no es idntica a la
configuracin mostrada en la figura 2.2(b) pero el principio de funcionamiento es el mismo.
La descarga elctrica de un cardio-desfibrilador produce tensiones elevadas sobre la piel del paciente que
21 - 151
pueden llegar a ser del orden de algunos centenares de voltios, stas son capturadas por los electrodos de
piel ingresando al bio-amplificador, cuando se supera la tensin de umbral del descargador (en nuestro caso
usamos descargadores de nen de 110 voltios ) se produce un arco disruptivo a masa debido a la ionizacin
del gas de nen a baja presin, la cada de tensin sobre el descargador gaseoso es prcticamente cero,
cayendo toda la tensin sobre la resistencia R1 para la derivacin 1 y sobre R3 para la derivacin 2.
Adems de las tensiones elevadas producto del uso de cardiodesfibriladores, otras tensiones de menor
magnitud pueden presentarse en el circuito de entrada, stas son producto muchas veces de ruidos o
debido a la polarizacin de los electrodos de piel, es por tanto necesario limitarlas ya que pueden llegar a
saturar la siguiente etapa, que es el amplificador de instrumentacin. La funcin de limitacin de bajas
tensiones es llevada a cabo por los diodos D1 y D2 (derivacin 1), ver figura 2.3, y por los diodos D3 y D4
(derivacin 2), ver plano esquemtico general, posiciones E2 y F2.
Volviendo a nuestro IC2 (CD4053), el cual vemos en la figura 2.4, cuando la seal CAL o ECG AISLADA
aplicada a los pines 10 y 11 est en alto, el canal X (pin 14) conmuta al canal X1 (pin 13) y tambin el canal Y
(pin 15) conmuta al canal Y1 (pin 1), como los canales X e Y estn conectados al AMPLIFICADOR DE
22 - 151
INSTRUMENTACIN, ste ltimo entonces est amplificando la seal VCAL1 y VCAL2 presente en los canales
X1 e Y1 respectivamente, es decir, estamos amplificando la seal de calibracin.
Cuando la seal CAL o ECG AISLADA est a un nivel bajo de tensin, el canal X (pin 14) conmuta al canal
X0 (pin 12) y el canal Y (pin 15) conmuta al canal Y0 (pin 2), siendo ahora las seales ECG1 y ECG2 las
aplicadas al AMPLIFICADOR DE INSTRUMENTACIN, es decir, estamos observando la seal
electrocardiogrfica que nos llega del paciente.
En el diseo de bio-amplificadores, es importante que ste cumpla con los siguientes puntos:
Nos detenemos aqu para hacer unos breves comentarios sobre cada uno de los anteriores parmetros.
Como vemos en la figura 2.5 la resistencia interna de paciente junto con la impedancia de entrada del
amplificador de instrumentacin (AI) forman un divisor de voltaje, donde la Vin es la tensin observada por
el AI. Las reglas de circuitos nos dicen que si queremos que la magnitud de la seal Vpaciente sea
prcticamente la observada por el AI, se debe cumplir que Zin sea mucho mayor que Rpaciente.
(EC 2.1)
23 - 151
24 - 151
potenciales de off-set del orden de 200mV debido a su naturaleza qumica, este potencial aparece en serie
con el bio-potencial de inters, es decir aparece como potencial en modo diferencial y por ende ser
amplificado. Dado que su magnitud es considerable, se corre el riego de llevar a saturacin la salida del
amplificador de instrumentacin, as, en el diseo de bio-amplificadores, la primer etapa por lo general se
ajusta con ganancias reducidas del orden de 20 a 50 V/V.
La figura 2.6 muestra la relacin entre el rechazo en modo comn en funcin de la frecuencia para distintas
ganancias.
En nuestro caso vamos a trabajar con una ganancia de 50 V/V, suponiendo como mximo una tensin de
off-set de 200 mV sobre los electrodos esto puede provocar un off-set en la salida del AI del orden de 10
Voltios.
Observando la figura 2.6, para una ganancia de 50 V/V, curva ubicada entre las curvas de ganancia 10 y 100
dB respectivamente, y considerando un ancho de banda de inters de 100 Hz, tpico para los estudios de
ECG, la RRMC se ubica en aproximadamente 115 dB.
La ecuacin 2.2, establece el valor de Rg para ajustar la ganancia del AI.
(EC 2.2)
Despejando, para G=50, Rg adopta un valor de 1020 , es ideal para realizar este ajuste un trimpot del tipo
multivueltas de 2K, observando detenidamente el plano general (coordenadas H3), vemos que en paralelo
al trimpot aparecen 2 resistencias en serie de 10K, es decir el trimpot est en paralelo con 1 resistencia
equivalente de 20 K, por lo tato el ajuste real del trimpot se obtiene despejando Rtrimpot de la ec 2.3:
25 - 151
(EC. 2.3)
Obtenindose:
R trimpot = 1.07481 K 1075
26 - 151
canal Z conmuta al canal Z0, o lo que es lo mismo el pin 4 queda unido internamente al pin 5, es decir la
seal VCAL adopta un potencial nulo ya que Z0 est a MASA. Cuando la seal de control
SEAL_CAL_AISLADA est a un uno lgico, el canal Z conmuta al canal Z1, o lo que es lo mismo el pin 4
queda unido internamente al pin 3, es decir la seal VCAL es igual a REF afectada por el divisor de tensin
formado por R40 y R41.
El divisor de tensin es ajustado para obtener un valor de pico en el tren de pulsos de 50 mV. El clculo de
R40 y R41 se obtiene como sigue, suponiendo un valor central en el trimpot R41 de 500 lo cual implica
usar un trimpot de 1K, el valor de R40 es calculado segn la expresin 2.4.
(EC. 2.4)
de donde se obtiene R40 = 49500 = 49.5 K, adoptamos un valor comercial de 47 K del tipo metal film
al 1%, asegurndonos con este tipo de resistencia un bajo ruido trmico. Es claro que habr que reajustar
R41 para obtener los 50 mV deseados sin desviarnos demasiado del punto central.
Resumiendo, la seal VCAL es un tren de pulsos con mnimo valor igual a cero (MASA) y con mximo valor
igual a 50 mV.
REF en la expresin 2.4 es un voltaje provisto por una referencia de tensin, en nuestro caso usamos el
circuito integrado MAX6350 de la firma MAXIM (antiguamente Dallas Semiconductors). Esta referencia de
tensin es sumamente precisa, posee una deriva trmica de tan solo 1 ppm (partes por milln) por cada
grado Celsius de variacin de temperatura, es decir 1ppm/C.
En la figura 2.8 mostramos parte del esquemtico de este circuito integrado utilizado como referencia
(ubicado en la posicin H5 del esquemtico general).
27 - 151
El trimpot R39 permite hacer un ajuste fino de la tensin de referencia sin afectar la estabilidad trmica del
sistema, el capacitor C6 ayuda a reducir los ruidos, por lo general un valor til para este fin es 1 uF, valores
ms grandes no provocan notables mejoras. El capacitor C7 ayuda a mejorar la inmunidad al ruido cuando la
fuente de alimentacin que alimenta el dispositivo es algo ruidosa. El capacitor C8 puede ayudar tambin
en la reduccin del ruido y en la compensacin de transientes causadas por variaciones de carga.
Es importante en este punto remarcar que los equipos comerciales utilizan distintas configuraciones para
inyectar la seal de calibracin, bsicamente existen 2 variantes para llevar a cabo el proceso de calibracin.
28 - 151
Variante 1: Inyectar la seal de calibracin a la salida del amplificador de instrumentacin con una
amplitud igual a la ganancia de esa primer etapa, es equivalente a inyectar una seal de amplitud 1
mV a la entrada del AI. La desventaja de este esquema es que solamente se est probando las
etapas subsiguientes al amplificador de instrumentacin menos justamente el AI, por lo tanto si el
AI estuviera averiado no se estara comprobando su funcionamiento. La figura 2.9 muestra el plano
de un equipo comercial en donde la seal de calibracin es inyectada en el terminal no inversor del
amplificador operacional U12B. El amplificador de instrumentacin est formado por los
amplificadores operacionales U11A y U11B (los cuales constituyen un amplificador de entrada
diferencial y salida diferencial cuya ganancia est dada por la ecuacin 2.5) y por el operacional
U12B configurado como un amplificador de entrada diferencial y salida unipolar de ganancia
unitaria.
donde a es la relacin entre la resistencia central R45 y la de realimentacin R46, ver figura 2.9.
Haciendo los clculos:
As, es fcil ver por qu una tensin de 10 mV es inyectada posterior a la etapa de entrada.
Variante 2: La otra variante es inyectar la seal de calibracin a la entrada del AI con una amplitud
de 1 mV. Este esquema tiene como ventaja que se prueba toda la cadena analgica. La desventaja
es que no es fcil formar una seal cuadrada de 1 mV libre de ruido.
En nuestro proyecto utilizamos una tercer variante que consiste en inyectar en la entrada del AI una seal
de amplitud numricamente igual a la ganancia del AI cuando este trabaja en modo ECG, pero forzando la
ganancia del AI a valor unitario cuando hacemos la calibracin.
Es decir, inyectar 1 mV a ganancia 50 es equivalente a inyectar 50 mV a ganancia 1.
De esta forma solucionamos la desventaja de la primera variante la cual no comprobaba completamente la
cadena analgica ya que dejaba afuera al AI. Por otro lado como la seal de entrada es de una amplitud
considerable, en este caso 50 mV, es mucho ms fcil obtenerla.
29 - 151
Como vemos, la variante usada en nuestro proyecto es una combinacin de las variantes 1 y 2. Para poder
implementarla, es necesario cambiar la ganancia del AI a un valor unitario cuando se est haciendo
calibracin, esta funcin la realiza el circuito integrado IC2 CD4053, ver figura 2.4, conmutando al canal Z a
Z1, de esta manera el potencimetro R37 ajusta la ganancia del AI a un valor unitario.
30 - 151
El terminal no inversor de IC4A, constituye el punto suma, como en el terminal G1 tenemos el modo comn
mas una fraccin del modo diferencial y en el terminal G2 tenemos el modo comn mas la misma fraccin
del modo diferencial invertido en signo, en el punto suma se anula el modo diferencial y solo nos queda el
modo comn.
2.2.5 FILTRADO
La etapa de filtrado en el ECG principalmente est compuesta por un filtro pasa altos, un filtro pasa bajos y
un filtro NOTCH o tambin llamado tipo muesca. Veamos en detalle cada uno de ellos.
31 - 151
(EC. 2.6)
La bibliografa sobre el tema recomienda una frecuencia de corte de 0,5Hz, el valor obtenido es ms que
satisfactorio.
Una aclaracin importante es que existen momentos en los cuales R13 es puenteada a masa por la llave
analgica X del circuito integrado IC3. Veremos el porqu de esto en el punto 2.2.6 cuyo ttulo es circuito
INSTO.
32 - 151
(E.C. 2.7)
Vemos una pequea diferencia respecto a la frecuencia deseada de 50 Hz, haciendo uso del trimpot R35
podemos corregir el desplazamiento.
33 - 151
34 - 151
(EC. 2.8)
Para evitar este inconveniente, se dise el circuito INSTO, figura 2.15, bsicamente el mismo est en torno
al circuito integrado IC3, una llave analgica del tipo 4053 ubicado en la posicin C4 del plano esquemtico
general.
35 - 151
Asla masas
El primer punto se exige para la seguridad elctrica del paciente, de esta manera toda la bioinstrumentacin necesaria conectada al paciente queda aislada elctricamente del resto del equipo
minimizando los riesgos de choque elctrico.
El segundo punto aumenta la inmunidad al ruido debido a la separacin de masas, ya que el bioamplificador tiene como referencia una masa flotante y el resto del equipo tiene como masa la tierra
convencional (Tercera lnea del toma de alimentacin, cable verde y amarillo). Por otro lado el paciente est
ms fuertemente acoplado a tierra que a masa flotante.
Son tres los dispositivos de aislacin que usamos en nuestro proyecto para obtener un bio-amplificador
correctamente aislado, ellos son:
Amplificador de Aislacin
Optoacopladores
36 - 151
37 - 151
Como ya comentamos, el amplificador de entrada est configurado como no inversor cuya ganancia es
ajustada por medio del trimpot R44, cabe aclarar que se puede obtener una ganancia mxima de 100 V/V.
Los terminales 29 y 30 estn conectados a una bornera para conexin externa de la fuente de alimentacin
que en nuestro caso es independiente de la usada para alimentar a la etapa no aislada, es decir con
transformador, rectificador y filtro propio.
Como datos importantes, el AD210 nos brinda una tensin de aislamiento de 2500 voltios RMS aplicados
continuamente y picos de 3500 voltios DC, una RRMC de 120 dB a Gv = 100V/V, una impedancia de
entrada en modo diferencial de 1 T y una impedancia de entrada de modo comn de 5 G.
2.3.2 OPTOACOPLADORES
Adems de la seal de ECG, es necesario aislar galvnicamente algunas seales digitales que son usadas
como seales de control. Las seales de control de nuestro diseo son:
1. CAL_o_ECG
2. SEAL_CALIBRACION
3. SEAL_INSTO
CAL_o_ECG es una seal que nos permite conmutar a la entrada del amplificador entre la seal de ECG y la
seal de calibracin.
SEAL_CALIBRACION es justamente un tren de pulsos generado desde el PIC y luego optoacoplado que es
usado para comandar un switch analgico para formar un tren de pulsos de valor pico 50 mV y valle igual a
masa aislada, es decir 0 Voltios. Este tema ya fue desarrollado en el punto 2.2.3.
SEAL_INSTO es una seal de control que permite cambiar la constante de tiempo del filtro pasa altos, ya
hemos explicado en el punto 2.2.6 la necesidad de esta implementacin.
El optoacoplador usado para aislar estas 3 seales de control fue el CNY17-2, configurado como muestra la
figura 2.16 correspondiente al esquema de la seal de control CAL_o_ECG, por otro lado los 3
optoacopladores se encuentran ubicados en las posiciones D7, E7 y G7 del plano esquemtico general.
38 - 151
El optoacoplador CNY17-2 es del tipo diodo emisor de luz infrarroja del tipo arseniuro de galio y
fototransistor NPN como receptor. La tensin de aislamiento es del orden de los 5300 voltios y la resistencia
de aislacin del orden de los 100 G.
La figura 2.17 muestra el esquema interno de este dispositivo.
39 - 151
Salida regulada
La figura 2.18 muestra el conexionado del conversor DC-DC en nuestro proyecto, 2 LED hacen de indicador
de tensin disponible en la etapa aislada. El conversor DC-DC se encuentra en la posicin H7 del plano
esquemtico general.
40 - 151
Cada vez que se pasa de ECG a CALIBRACN o viceversa, es necesario que acte la seal INSTO para cargar o
descargar rpidamente el capacitor C4 por diferencia en los niveles de tensin de las lneas base.
Por otro lado, la seal que forma los pulsos de calibracin siempre se est generando, aunque sta solo es
ingresada al amplificador de instrumentacin cuando la seal CAL_o_ECG est en alto.
La figura 2.19, visualiza lo comentado recientemente.
41 - 151
III
Transmisin Inalmbrica
42 - 151
3 TRANSMISIN INALMBRICA
3.1 INTRODUCCIN
La etapa digital consiste bsicamente en la digitalizacin de la seal cardaca, visualizacin en un display
grfico y transmisin inalmbrica por Internet a travs de la red de telefona celular.
Los componentes fundamentales en este desarrollo son:
Dada la gran cobertura de telefona celular y su creciente mejora en la transmisin de datos resulta evidente
la ventaja en el uso de esta tecnologa para fines mdicos.
La tecnologa GPRS (General Packet Radio System), o generacin 2.5, representa un paso ms hacia los
sistemas inalmbricos de Tercera Generacin.
A pesar de la evolucin de los dispositivos mviles hacia 3G, la forma de comandarlos se mantiene
conceptualmente igual, es decir, por medio de comandos AT.
Inicialmente los comandos AT fueron desarrollados para la comunicacin con los mdems, pero la telefona
mvil tambin ha adoptado ese estndar para comunicarse con los terminales.
Por este motivo, el presente desarrollo se puede adaptar fcilmente a otro terminal de generacin ms
avanzada o de diferente fabricante.
43 - 151
El PIC ejecuta los comandos necesarios para establecer un enlace por sockets entre el modulo GPRS y el
servidor. Una vez establecido el enlace, se puede comenzar la transmisin de la seal que ser graficada en
tiempo real en el servidor.
Cuando haya finalizado la transmisin, la seal se guardar en formato de archivo de texto, lo que implica
que puede ser leda directamente por cualquier otro software.
44 - 151
INTERFAZ SERIE:
Conector: RJ45 8/8
Niveles: RS232 @10V
Velocidad mxima: 115.200 b/s
ANTENA:
Conector: SMA hembra.
Impedancia: 50 ohm
Frecuencia: 850 1900 MHz 900 1800 MHz.
SIM:
Con bandeja de sujecin interna.
GPRS:
Terminal Clase B (voz y datos simultneos)
Multi Slot Clase 8 (1 slot uplink, 4 slots downlink)
Stack PPP interno (protocolos TCP y UDP)
Como tiene solamente 1 timeslot para subida de datos la mxima velocidad terica es de 20 kilobits por
segundo.
45 - 151
+CGREG: 001
El Gateway de telefona celular o APN (Access Point Name) le alquila un IP dinmico al g20 previo inicio de
sesin con usuario y contrasea definidos por la prestadora.
A continuacin se muestran los comandos para iniciar sesin en cada APN, donde aparece el usuario y
contrasea de cada uno.
AT+MIPCALL=1, "gprs.personal.com","gprs","gprs"
AT+MIPCALL=1, "internet.gprs.unifon.com.ar","wap","wap"
AT+MIPCALL=1, "internet.ctimovil.com.ar","ctigprs","ctigprs999A"
+MIPCALL: 170.210.54.1
En este momento podemos intentar establecer el enlace por sockets con los siguientes parmetros: puerto
local=6002, ip remoto=170.210.44.8, puerto remoto=5000
46 - 151
La eleccin de puertos es arbitraria, pero se recomienda no utilizar los puertos conocidos que pueden ser
usados por otro software.
+MIPOPEN: 1,1
AT+MIPSETS= 1, 343
AT+MIPSEND= 1, "47414449427414"
47 - 151
AT+COPS?
48 - 151
REGISTRADO
Indica que est registrado en la red GPRS, si no est registrado, hay que esperar.
COPS
Luego de registrarse consulta con que EMPRESA est registrado.
Este flag indica que ya se dispone de esa informacin.
IPASIGNADO
Para alquilar un IP debe estar previamente REGISTRADO y con la EMPRESA identificada.
En caso de no estar IPASIGNADO se enviar el comando MIPCALL para alquilar IP.
PUERTOABIERTO
Para abrir el puerto debe estar previamente REGISTRADO y con IPASIGNADO.
En caso de no estar PUERTOABIERTO se enviar el comando MIPOPEN para abrir el puerto.
Luego de abrir el puerto hay que configurar la cantidad de datos por paquete.
49 - 151
WATERMARK
Este flag indica que ya se configur la cantidad de datos por paquete.
Los datos que se envan con MIPSEND quedan almacenados en un buffer de entrada del mdulo. Cuando la
cantidad de datos llega al valor determinado por el comando MIPSETS, son movidos al buffer del stack TCP
para ser transmitidos.
El valor de WATERMARK es lo que determina el tamao del segmento de datos. Ver seccin 3.9 Seleccin
del MSS
HABILITARTX
Cuando estn dadas todas las condiciones para transmitir y se pulsa el botn de transmisin, este flag se
pone en TRUE. Entonces cada vez que hay una conversin se enva el dato al buffer con MIPSEND se envan
80 caracteres ( 160 en formato codificado, esto es un requisito del comando. Ver 5.8.2 CONVERT). Un
CONTADOR determina cuando enviar la cabecera y la cola. Ver seccin 5.8 Subrutinas principales.
Si se pone a FALSE debe esperar a que CONTADOR llegue a cero para que enve la cola y luego parar la
Transmisin.
50 - 151
51 - 151
Pausa
Congela la imagen graficada en el display.
Velocidad
Dos velocidades de graficacin, 64 o 128 pixels por segundo.
Por costumbre y tambin por ser valores aproximados se indica como 25mm/s o 50 mm/s Ver seccin 4.8
Escalado.
Envo de seales
Al presionar este botn estando el puerto abierto se comienza a transmitir la seal.
Al comenzar la transmisin, se enva primero un tren de pulsos como prueba de calibracin.
Calibracin
Alterna entre seal de calibracin o ECG
52 - 151
Velocidad
Se indica en el display la velocidad seleccionada
Red
Se indica en el display con un smbolo similar a una antena cuando el mdulo est registrado en la red
GPRS.
Enlace
Se indica en el display con este smbolo cuando el puerto est abierto.
Transmisin
Se indica en el display con este smbolo que se est realizando una transmisin.
53 - 151
IV
DISPLAY LCD
54 - 151
4 DISPLAY LCD
4.1 INTRODUCCIN
Para la seleccin del display nos basamos en la premisa de que sea un display grfico estndar, tambin
tuvimos en cuenta la cantidad de columnas y filas, que se pueda manejar por lneas de datos y de control, el
tiempo del ciclo de escritura, que tenga backlight, una hoja de datos clara y completa.
Al momento de comprarlo no lo pudimos conseguir en Argentina por falta de stock debido a la crisis,
entonces nos vimos obligados a encargrselo al fabricante en Estados Unidos con un costo de envo 4 veces
superior al valor del producto. Hoy en da se consiguen en nuestro pas modelos equivalentes a un precio
similar.
La interfase de control consiste en 8 lneas de datos, una lnea de seleccin de datos/instruccin, una lnea
de seleccin de escritura/lectura, una seal de Enable y dos de Chip Select para direccionar cada mitad del
display.
Controlador: KS0108B
Alimentacin: 5V
Precio: u$d 25
55 - 151
56 - 151
57 - 151
58 - 151
4.7 FUNCIONAMIENTO
El display est dividido verticalmente en 8 pginas que agrupan 8 pixels cada una. Ver figura 4.3
Arquitectura del Display.
Para graficar un pxel hay que direccionar una columna, una pgina y enviar al bus de datos un valor binario
de 8 bits cuyos unos activarn los pixels correspondientes.
La pgina va a ser determinada por el cociente de la divisin de la muestra con 32 (256/8) y el pxel dentro
de la pgina se calcular en funcin del resto de esa divisin.
Por una propiedad de los nmeros binarios, al cociente se obtiene directamente de los 3 bits ms
significativos de la muestra y al resto de los 5 menos significativos.
Luego tenemos q dividir por 4 (32/8) al resto para hacerle corresponder uno de los 8 pixels de la pgina. A
esto lo logramos desplazando 2 lugares a la derecha, descartando los 2 bits menos significativos.
59 - 151
Ahora tenemos que activar un solo pxel del display, no podemos enviar al bus directamente el nmero
binario resultante. Se debe hacer una transformacin.
PIXEL
BINARIO AL BUS
DECIMAL
00000001
00000010
00000100
00001000
00010000
16
00100000
32
01000000
64
10000000
128
Ejemplo:
Muestra: 77
77 / 32
01001101 (77)
Cociente: 010 (2)
Resto: 01101 (13)
Pgina: 2
Desplazando el resto a la derecha 2 lugares:
Pxel: 011 (3)
Y segn la ley de transformacin 2^(3-1) hay que enviar un 4 (00000100) a la tercer pgina.
60 - 151
4.8 ESCALADO
Para poder mostrar un rango de valores de 0 a 255 en un display de 64 de alto hay que bajar la resolucin
256/64=4 veces para hacer corresponder una muestra a un pxel dentro de una pgina.
DEC BIN
PIX
Pag1
4
xxxxx100
00000001
xxxx1000
00000010
12
xxxx1100
00000100
16
xxx10000
00001000
20
xxx10100
00010000
24
28
32
xx100000
10000000
x1000000
10000000
Pag 8
64
Si se muestrea a 256Hz, al reducir la amplitud en 4 veces, para mantener la forma de la onda, se necesita
reducir la escala temporal en la misma proporcin. Esto se puede hacer graficando cada 4 muestras, lo que
implica mostrar 256/4=64 muestras por seg. Como el display es de 128, se tiene un barrido de 2 segundos.
Como generalmente hay entre 1 y 2 pulsacin por segundo, estaramos graficando de 2 a 4 pulsaciones por
barrido.
Como el Dot Pitch es de 0.52mm y cada muestra corresponde a un pxel, 64 muestras por segundo equivale
a 64x0.52= 33.28mm/seg.
En la velocidad alta, donde se grafican 128 muestras por segundo tenemos 66.56mm/seg.
En el display indicamos como 25mm/s y 50mm/s porque son las velocidades estndar a la hora de imprimir
en papel y la gente est acostumbrada a esos valores, pero esto es solo a modo indicativo de velocidad baja
y alta.
61 - 151
Las seales transmitidas podrn ser impresas a la velocidad deseada haciendo el siguiente escalado:
Temporal:
256 muestras equivalen a 1 segundo.
Para imprimir a 25mm/s hay que ubicar 256 muestras en 25mm
Para imprimir a 50mm/s hay que ubicar 256 muestras en 50mm
Amplitud:
64 muestras equivalen a 10mm.
Ver seccin 5.5 Generador de seal de calibracin
62 - 151
4.9 INTERPOLACIN
La interpolacin es necesaria para la reconstruccin de la seal a partir de sus muestras.
La interpolacin que nosotros planteamos consiste en rellenar los pixels verticalmente desde la muestra
actual hasta la anterior.
En este ejemplo se ven las muestras en negro y los pixels rellenados en rojo Ver figura 4.5 Interpolacin.
Entonces al avanzar a una nueva columna, se pasa por todas las pginas, si una pgina contiene la muestra
actual o la anterior o si se encuentra entre la muestra actual y la anterior se rellenan sus pixels de tal forma
que parezcan unidas las dos muestras. Las dems pginas se borran.
Por ejemplo, si tenemos la muestra actual PIXEL_1 mayor que la anterior PIXEL_0 en la misma pgina.
Pretendo graficar una lnea entre los dos pixels, pero sin el pxel a la altura del anterior para que parezca
ms suave. Esto se logra mediante estas operaciones:
63 - 151
V
MICROCONTROLADOR
64 - 151
5 MICROCONTROLADOR
5.1 INTRODUCCIN
El microcontrolador utilizado, PIC16F877A de Microchip, es un dispositivo muy usado, de bajo costo que
dispone principalmente de un conversor A/D; una interfaz RS232 para comandar el modulo g20; la cantidad
de puertos necesarios para controlar el display; la memoria y velocidad de procesamiento necesarias para
esta aplicacin.
USART ( Utilizamos el modo asncrono con un baudrate de 19200 baudios, 8 bits de datos, sin
paridad)
Precio: U$S 18
65 - 151
TACQ
TC
TACQ
Nota
1: La tensin de referencia (VREF) no tiene efecto en la ecuacin porque se cancela en ambos miembros.
2: El capacitor de muestreo y retencin (CHOLD) no se descarga luego de cada conversin.
3: La mxima impedancia recomendada de la fuente de alimentacin, Rs, es de 2.5Kohm.
Esto es necesario para cumplir con la especificacin de corriente de fuga del pin (ILEAKAGE 500nA) segn el
modelo de entrada analgica.
66 - 151
El tiempo de conversin por bit se define como TAD y se requieren 12TAD por cada muestra.
Para un correcto funcionamiento el TAD se debe seleccionar de forma tal que sea como mnimo 1.6us.
Por lo que seleccionamos el clock del conversor como 64TOSC (ADCS2:ADCS1:ADCS0 110), segn la tabla
11-1 del manual del PIC. Entonces 1TAD=3.2us, por lo tanto 12TAD= 38.4us es lo que tarda el conversor en
lograr cada muestra.
Finalmente sumndole el tiempo de adquisicin 19.72us queda 58.12us, aproximadamente 60us como
lmite mnimo de tiempo necesario entre muestra y muestra.
Nosotros trabajamos con una tasa de muestreo de 256Hz es decir 3.9ms entre muestras.
Vemos que el tiempo entre muestras es muy superior al tiempo que se necesita para convertir cada
muestra.
Entonces podemos decir que trabajamos en la conversin con un error de cuantificacin menor a * LSB =
* (1.25V/256) = 2.5mV.
67 - 151
5.4 EL PROGRAMA
El programa est escrito en Assembler, desarrollado con MPLAB IDE V8.30
Tiene creado un vector de interrupciones para recibir los datos del puerto serie y procesarlos, para procesar
el resultado del conversor A/D, para determinar la tasa de muestreo en funcin del temporizador TIMER0,
para generar la seal de calibracin con TIMER1 y para mostrar los datos en el display.
Luego tiene un bucle principal donde se ejecutan lgicas con distinta periodicidad.
68 - 151
69 - 151
5.8.1 DISPLAY
Esta subrutina es la encargada de controlar el display y ejecutar todas las acciones explicadas en la seccin
4.7 Funcionamiento.
5.8.2 CONVERT
Cuando se obtiene una conversin, el dato no se puede enviar en forma directa al modem, en cambio, se
debe codificar. Es decir, digamos que se obtiene 6F (recordemos que el mximo que usamos es FF),
entonces se deben enviar al modem los ASCIIs 6 y F. Para eso se usa el cdigo que se encuentra en esta
subrutina.
5.8.3 SENDCHAR
Almacena un carcter en el buffer de salida, pero la transmisin se realiza con SENDDATA en el bucle
principal.
SENDCHAR recibe el dato en 0x45 y lo almacena a partir de 0x46 segn el puntero STOREINDEX.
5.8.4 SENDSTR
Los comandos AT estn hardcodeados en la memoria de programa en determinadas posiciones definidas en
un archivo header de modo que para enviar un comando se cargan los registros de direccin con las
directivas DEFINES correspondientes y se llama a esta subrutina que escribe en el buffer de salida.
5.8.5 SENDDATA
Es la rutina encargada de tomar los datos del buffer y enviarlos.
SENDDIF es la diferencia entre el puntero de almacenamiento de nuevos datos STOREINDEX y el de ltimo
dato enviado SENDINDEX.
Se encuentra en el bucle principal para que pueda ser interrumpida en caso de recepcin de datos.
Ejemplo de envo de datos con el comando MIPSEND:
at+mipsend=1,"806C7073708A727060AA6EA2AA6D70707C766080A5A270A8747A7A7B8B7170867CAC6084
AB6E80A2AAAA8088708B8372707D7EAB8D6F608F7D8F857760AA848170AA8E7870A270A68
70 - 151
Cabecera:
at+mipsend=1,"
Cuerpo:
Muestras codificadas
Cola:
"
5.8.6 RXCHARS_G20
Recibe los datos del puerto serie, los almacena en el buffer de entrada, detecta si lleg un string completo,
compara con la lista de respuestas y actualiza los flags de estados Ver seccin 3.8 Flags de Estados.
5.8.7 STRCMP
Esta funcin compara los datos recibidos con las posibles respuestas del mdem.
71 - 151
VI
GUA DE USO
72 - 151
6 GUIA DE USO
Al encender el equipo, comienza a graficar al mismo tiempo que intenta registrarse en la red de telefona
celular y establecer el enlace con el servidor de Internet.
El usuario puede visualizar el estado del equipo en el display.
Tambin puede visualizar una seal de calibracin para tener como referencia.
Puede cambiar la VELOCIDAD (25 o 50mm/seg) o pulsar el botn de PAUSA para tener una mejor
visualizacin de la seal de ECG.
Cuando est todo en orden el usuario puede verificar que los smbolos de registro y enlace estn activos
para comenzar la transmisin pulsando el botn correspondiente.
En ese momento comienza a transmitirse los datos al servidor y se indica con un smbolo, pero antes de
enviar las seales ECG se enva automticamente un tren de pulsos de calibracin para usar como patrn en
la seal recibida.
El envo de datos se detiene pulsando nuevamente el botn de TRANSMISIN.
En cualquier momento del lado del servidor se pueden guardar las seales en un archivo cuyo nombre
describir el estudio realizado.
En caso de trabajar en forma desatendida, las seales se guardan en forma automtica con fecha y hora un
minuto despus de haber finalizado la transmisin o a los 5 minutos de transmisin continua.
En todo caso la persona que est realizando el estudio debe tomar nota de la fecha y hora de cada estudio
para contrastar con los archivos generados.
Si el equipo no indica enlace con el servidor lo primero que hay que revisar es que la lnea disponga de
crdito.
73 - 151
VII
CONCLUSIONES
74 - 151
7 CONCLUSIONES
La etapa de proteccin del bioamplificador cumple con los requisitos actuales de proteccin del equipo.
El amplificador de instrumentacin mostr un ptimo comportamiento, ajustando la etapa con una baja
ganancia se obtuvo igualmente un alto RRMC
La referencia de tensin utilizada para la calibracin mostr una alta estabilidad de 1ppm/C tal como lo
asegura la hoja de datos.
El comportamiento de los filtros pasa alto y pasa bajos fue ms que satisfactorio no siendo necesario
incrementar el orden de los mismos ms all de un primer orden. El filtro muesca (Notch) mostr un ptimo
comportamiento sin utilizar un orden mayor a 2 ni componentes costosos.
La etapa de realimentacin de modo comn es imprescindible en este tipo de bioamplificadores,
observndose un alto desempeo con una ganancia alrededor de -40 V/V.
El amplificador de aislacin mostr un desempeo muy satisfactorio en lo que se refiere a linealidad y
distorsin adems de proporcionar un RRMC elevado en la ganancia de trabajo. Sin embargo, la fuente de
alimentacin flotante no alcanz para alimentar el bioamplificador aislado de tierra, por lo tanto, fue
necesario utilizar un conversor DC-DC aislado de 2W.
Con el display no se apunta a visualizar seales con mucha precisin, en cambio, sirve para tener una buena
idea del estado de la seal antes de comenzar la transmisin. Otra ventaja del uso del display es la
posibilidad de mostrar indicaciones amigables, prescindiendo del uso de LEDs y teniendo mayor cantidad de
pines disponibles en el microcontrolador.
El PIC16F877A fue suficiente para este desarrollo, pero hay que aclarar que hubo que optimizar la
programacin en relacin a la velocidad de procesamiento para lograr resultados exitosos.
Realizamos pruebas de transmisin desde el laboratorio del GADIB (Grupo de Anlisis e Investigaciones
Biomdicas) donde la seal de celular es dbil o eventualmente nula dependiendo de la empresa. En estas
condiciones, gracias a la retransmisin de paquetes del stack TCP/IP, pudimos transmitir correctamente las
seales, salvo en los peores casos donde se indic falta de cobertura. Los mejores resultados los obtuvimos
con Movistar, seguido por Personal.
75 - 151
VIII
BIBLIOGRAFA
76 - 151
8 BIBLIOGRAFA
GSM, GPRS and EDGE Performance. Evolution Towards 3G/UMTS. Timo Halonen, Javier Romero and
Juan Melero; John Wiley & Sons.
Internetworking with TCP-IP,Vol-I Principles, Protocols and Architecture 4Ed, Douglas E. Comer;
Prentice Hall.
RFC 3481 - TCP over Second (2.5G) and Third (3G) Generation Wireless Networks.
http://www.rfc-archive.org/getrfc.php?rfc=3481
Optimizing the End-to-End Performance of Reliable Flows over Wireless Links. Reiner Ludwig,
Ericsson Research. Almudena Konrad, Anthony D. Joseph, Computer Science Division, University of
California at Berkeley
Optimal Frame Payload Size for Mobile Communications over Wireless Links of Cellular Networks.
GOO-YEON LEE, CHOONG-KYO JEONG, HWA-JONG KIM AND YONG LEE.
http://onlinelibrary.wiley.com/doi/10.1002/wcm.563/abstract
77 - 151
ANEXOS
78 - 151
ANEXO I
DESCRIPCIN DE PINES DEL PIC
79 - 151
ANEXO II
DESCRIPCIN DE PINES DEL DISPLAY
80 - 151
ANEXO III
DIAGRAMAS DE FLUJO
BUCLE PRINCIPAL
RECEPCION
TRANSMISION
81 - 151
BUCLE PRINCIPAL
82 - 151
83 - 151
RECEPCION
84 - 151
TRANSMISION
85 - 151
ANEXO IV
CABLE DE INTERCONEXIN DEL MODEM
El cable est preparado para poder conectar el MODEM a una PC o a la interfase serie del PIC que utiliza
solamente las seales Tx y Rx en una configuracin sin control de flujo.
PIN 1:
DSR
(OUT)
PIN 2:
DCD
(OUT)
PIN 3:
DTR
(IN)
PIN 4:
GND
PIN 5:
RXD
(OUT)
PIN 6:
TXD
(IN)
PIN 7:
CTS
(OUT)
PIN 8:
RTS
(IN)
86 - 151
PIN 1:
DCD
(IN)
PIN 2:
RXD
(IN)
PIN 3:
TXD
(OUT)
PIN 4:
DTR
(OUT)
PIN 5:
GND
PIN 6:
DSR
(IN)
PIN 7:
RTS
(OUT)
PIN 8:
CTS
(IN)
SEAL
RJ45 MODEM
DB9 HEMBRA PC
DSR
DCD
DTR
GND
RXD
TXD
CTS
RTS
OBSERVACIONES
87 - 151
SEAL
RJ45 MODEM
DSR
DCD
DTR
GND
RXD
TXD
CTS
RTS
DB9 HEMBRA PC
OBSERVACIONES
UNIR CON DTR
88 - 151
ANEXO V
PROGRAMA PC
El programa est escrito en Visual Basic 6.0
Para la comunicacin por sockets utiliza el control Winsock.
El puerto local es configurable.
Al detectar que est desconectado pasa automticamente a modo Listening.
Se muestra la informacin en los TextBox de IP local junto con el IP y puerto remoto al establecerse el
vnculo.
Los datos que llegan se grafican en un PictureBox.
Con el botn Borrar se limpia la pantalla y se vaca el vector de datos recibidos.
Con el botn Guardar aparece el popup de Windows (control CommonDialog) para almacenar los datos
que llegaron hasta el momento en un archivo.
Un Timer actualiza el estado del socket cada 1 seg y el watchdog para guardar las seales al no llegar datos
por ms de 1 minuto.
Otro Timer toma los datos recibidos, los grafica y si se tiene una cantidad de muestras equivalentes a 5
minutos las guarda en un archivo evitando as el desbordamiento del vector de datos.
89 - 151
Sub UpdateState()
90 - 151
End Sub
91 - 151
Filenum = FreeFile
For i = 0 To n - 1
Write #Filenum, muestras(i)
Next i
Close #Filenum
txtin.Text = ""
Picture1.Cls
n = 0
Exit Sub
ErrHandler:
MsgBox "Error: no se pudo guardar el archivo de datos del paciente" & vbCrLf &
Err.Description
End Sub
92 - 151
Sck.Close
UpdateState
End Sub
txtin.Text = ""
Picture1.Cls
n = 0
End Sub
Picture1.ScaleWidth = 1372
Picture1.ScaleHeight = 256
txtLocalIP = Sck.LocalIP
End Sub
Sck.Close
If Not IsNumeric(txtLocalPort.Text) Then txtLocalPort.Text = 5000
End Sub
93 - 151
End Sub
Static x As Integer
Dim vec As Variant
total = BytesTotal
Sck.GetData vec, vbArray + vbByte
datos = vec
x = x + 1
txtin.Text = txtin.Text & "." & BytesTotal
hay = True
watchdog = 0
End Sub
If hay Then
hay = False
94 - 151
'5 min
If n >= 76800 Then Call guardar
End If
End Sub
UpdateState
End Sub
95 - 151
s1 = Date
For i = 1 To Len(s1)
If Mid(s1, i, 1) = "/" Then
Mid(s1, i, 1) = "_"
End If
Next i
s2 = Time
For i = 1 To Len(s2)
If Mid(s2, i, 1) = ":" Or Mid(s2, i, 1) = "." Then
Mid(s2, i, 1) = "-"
End If
Next i
For i = 0 To n - 1
Write #Filenum, muestras(i)
Next i
Close #1
ErrHandler:
txtin.Text = ""
n = 0
End Sub
96 - 151
ANEXO VI
Programa Microcontrolador PIC
97 - 151
;
;
#include <p16F877A.inc>
#include <gprs.inc>
LIST p=16F877
errorlevel -302
;Registers
__CONFIG _CP_OFF & _WDT_OFF & _HS_OSC & _PWRTE_ON & _LVP_OFF
;DECLARACION DE VARIABLES
;************************
BUFFSIZE
EQU
0x20
CBLOCK
BUFFSIZE + 1
VD1
VD2
VD3
RCREG_COPIA
BARRIDO
CONTADOR
AUXCOD
INDEX
AUX
YADDRESS
PAGINA
PIXEL
PAGINA_ANTERIOR
PIXEL_ANTERIOR
PAGINA_ACTUAL
PIXEL_ACTUAL
PAGINA_0
PIXEL_0
PAGINA_1
PIXEL_1
STRLEN
MIPCALL_EMPRESA_H
MIPCALL_EMPRESA_L
98 - 151
EQU
1
0
1
3
4
99 - 151
;DISPLAY PORTS
;***************************
DISPLAY_CTRL
EQU
DISPLAY_DATA
EQU
;************X**************
PORTB
PORTD
0
1
EQU 2
EQU 4
PAGE
da
da
ORG 0x1800
"AT"
db 0x06, 0x80
db 0x00, 0x00
ORG 0x1810
"OK"
db 0x06, 0x8A
db 0x00, 0x00
;CR + LF
ORG 0x1820
da "+MIPCALL: 0"
db 0x06, 0x8A
db 0x00, 0x00
ORG 0x1830
da "+MIPRTCP:"
db 0x00, 0x00
ORG 0x1840
da " AT+MIPCALL?"
db 0x06, 0x80
db 0x00, 0x00
ORG 0x1850
da "+MIPCALL: 1"
100 - 151
da
da
da
da
da
da
da
da
da
da
ORG 0x1860
" AT+MIPOPEN?"
db 0x06, 0x80
db 0x00, 0x00
ORG 0x1900
"AT+CGREG=1"
db 0x06, 0x80
db 0x00, 0x00
ORG 0x1920
" AT+CGREG?"
db 0x06, 0x80
db 0x00, 0x00
ORG 0x1930
"+CGREG: 001,002"
db 0x06, 0x8A
db 0x00, 0x00
ORG 0x1950
"+CGREG: 001,001"
db 0x06, 0x8A
db 0x00, 0x00
ORG 0x1970
"NO CARRIER"
db 0x06, 0x8A
db 0x00, 0x00
ORG 0x1980
"ATE0"
db 0x06, 0x80
db 0x00, 0x00
ORG 0x1988
"ATE?"
db 0x06, 0x80
db 0x00, 0x00
ORG 0x1990
"E:1"
db 0x06, 0x8A
db 0x00, 0x00
ORG 0x1A00
"ERROR"
db 0x06, 0x8A
db 0x00, 0x00
ORG 0x1A10
da " victorarevalo@hotmail.com"
db 0x06, 0x80
db 0x00, 0x00
;Me conecto al puerto 5000 del server
ORG 0x1A5A
da " at+mipopen=1,6002,\"170.210.44.8\",5000,0"
db 0x06, 0x80
db 0x00, 0x00
ORG 0x01B00
da " at+mipsend=1,\"4741444942\""
db 0x06, 0x80
db 0x00, 0x00
ORG 0x1B20
da "AT+MIPPUSH=1"
db 0x06, 0x80
db 0x00, 0x00
101 - 151
ORG 0x1B30
da " at+mipclose=1"
db 0x06, 0x80
db 0x00, 0x00
ORG 0x1B42
da "at+mipcall=0"
db 0x06, 0x80
db 0x00, 0x00
ORG 0x1B52
da " at+mipsend=1,\""
db 0x06, 0x80
db 0x00, 0x00
ORG 0x1B70
da "\""
db 0x06, 0x80
db 0x00, 0x00
ORG 0x1B76
;da "
AT+MIPSEND=1,\"FF814449424741444942474144494247414449424741444942474144494247414449424741444942474144494247414449424741444942474144494247
41444942474144494247414449424741444942\""
db 0x06, 0x80
db 0x00, 0x00
ORG 0x1C26
da " at+CMEE=1"
db 0x06, 0x80
db 0x00, 0x00
ORG 0x1C30
da " at+CEER=0"
db 0x06, 0x80
db 0x00, 0x00
ORG 0x1C3A
da "at+MIPSETS=1,343"
db 0x06, 0x80
db 0x00, 0x00
ORG 0x1C48
da " at+MIPFLUSH=1"
db 0x06, 0x80
db 0x00, 0x00
ORG 0x1C5C
da "+CGREG: 001"
db 0x06, 0x8A
db 0x00, 0x00
ORG 0x1C6C
da "+CGREG: 002"
db 0x06, 0x8A
db 0x00, 0x00
ORG 0x1C7C
da "at+mipcall=1,\"gprs.personal.com\",\"gprs\",\"gprs\""
db 0x06, 0x80
db 0x00, 0x00
ORG 0x1CB0
da "at+mipcall=1,\"internet.gprs.unifon.com.ar\",\"wap\",\"wap\""
db 0x06, 0x80
db 0x00, 0x00
ORG 0x1CF0
da " at+mipcall=1,\"internet.ctimovil.com.ar\",\"ctigprs\",\"ctigprs999A\""
db 0x06, 0x80
db 0x00, 0x00
102 - 151
ORG
GOTO
0
MAIN
ORG
GOTO
4
INTERRUPT
PUSH
MOVWF
SWAPF
CLRF
MOVWF
MOVF
MOVWF
Temp_W
;Copy W to TEMP register
STATUS, W ;Swap status to be saved into W
STATUS
;bank 0, regardless of current bank, Clears IRP,RP1,RP0
Temp_Stat ;Save status to bank zero STATUS_TEMP register
PCLATH, W ;Only required if using pages 1, 2 and/or 3
PCLATH_TEMP
;Save PCLATH into W
103 - 151
PCLATH
FSR, W
Temp_FSR
INDF, W
STATUS, Z
INDF, W
BTFSC
GOTO
BTFSC
GOTO
BTFSC
GOTO
INTCON, TMR0IF
TIMER
BTFSC
GOTO
PIR1, TMR1IF
TIMER1
MOVF
BTFSC
MOVF
INDF, W
STATUS, Z
INDF, W
GOTO
POP
TIMER
BCF
BSF
CALL
GOTO
INTCON, TMR0IF
ADCON0, 2 ; GO/!DONE
TIMERSUB
POP
BCF
CALL
GOTO
PIR1, RCIF
RXCHARS_G20
POP
RECEPCION
; // Clear flag
CONVERCION
CALL
BCF
CALL
INCF
GOTO
CONVERT
BCF
CALL
GOTO
PIR1, TMR1IF
TIMER1_SUB
POP
MOVF
MOVWF
MOVF
MOVWF
SWAPF
MOVWF
SWAPF
SWAPF
Temp_FSR, W
FSR
PCLATH_TEMP, W
;Restore PCLATH
PCLATH
;Move W into PCLATH
Temp_Stat, W
;Swap STATUS_TEMP register into W
STATUS
;Move W into STATUS register
Temp_W, F ;Swap W_TEMP
Temp_W, W ;Swap W_TEMP into W
PIR1, ADIF
DISPLAY
BARRIDO, F
POP
TIMER1
POP
RETFIE
104 - 151
;************X***************************
;****************************************
;* setup PIC options, ports, interrupts *
;****************************************
SETUP
CLRF
INTCON
BSF
INTCON, PEIE
BSF
STATUS, RP0
CLRF
BSF
PIE1
MOVLW
MOVWF
0x86
OPTION_REG
PIE1, TMR1IE
BSF
MOVLW
MOVWF
OPTION_REG, INTEDG
0x3F
TRISA
;Salidas
MOVLW
0x00
MOVWF
TRISD
;************
MOVLW
MOVWF
0x80
TRISC
MOVLW
MOVWF
0x07
TRISE
BCF
CLRF
;Salidas
;RC7=INPUT (Rx)
STATUS, RP0
PIR1
;This register contains the individual flag bits for the peripheral interrupts
0x80
ADCON0
BSF
ADCON0, ADON
; Enciendo el conversor
105 - 151
RETURN
;**************************************
;*******************************************************/
;* Configure USART for communications
*/
;*******************************************************/
CONFIGURECOMMS
BCF
BCF
STATUS, RP0
STATUS, RP1
BSF
BCF
RCSTA, SPEN
RCSTA, RX9
BCF
PIR1, RCIF
BSF
STATUS, RP0
BCF
TXSTA, TX9
MOVLW
MOVWF
D'64'
SPBRG
BSF
TXSTA, BRGH
BCF
TXSTA, SYNC
;Asyncronous mode
BSF
TXSTA, TXEN
;Enable transmitter
BSF
PIE1, RCIE
BCF
STATUS, RP0
BSF
RCSTA, CREN
106 - 151
PIR1, TXIF
PIE1, TXIE
RETURN
;***********************************************************
;*****************************************************/
;*
Almacena el dato en el buffer de salida */
;*
*/
;*****************************************************/
SENDCHAR ;void( BUFFERINDEX)
BCF
BCF
STATUS, RP0
STATUS, RP1
STOREDATA
;Almaceno el dato en la cola de salida
MOVLW
0X45
MOVWF
FSR
MOVF
MOVWF
INDF, W
BUFFDATA
MOVLW
SUBWF
BTFSC
CLRF
0x24
STOREINDEX, W
STATUS, C
STOREINDEX
INCF
STOREINDEX, F
MOVLW
ADDWF
MOVWF
0X45
STOREINDEX, W
FSR
MOVF
MOVWF
BUFFDATA, W
INDF
INCF
SENDDIF, F
MOVLW
SUBWF
BTFSC
CLRF
0X24
SENDDIF, W
STATUS, C
SENDDIF
RETURN
;******************************************************
;*****************************************************/
;*
Envia los datos del buffer de salida
*/
;*
*/
;*****************************************************/
SENDDATA
BCF
STATUS, RP0
CLRF
SENDSTR_CONT
MOVLW
SUBWF
BTFSC
NOP
0X24
SENDDIF, W
STATUS, C
107 - 151
0X1E
SENDDIF, W
STATUS, C
GENAUX, HOLDTX
GENAUX, HOLDTX
FIN_SENDDATA
MOVF
BTFSC
GOTO
SENDDIF, W
STATUS, Z
FIN_SENDDATA
MOVLW
SUBWF
BTFSC
CLRF
0X24
SENDINDEX, W
STATUS, C
SENDINDEX
BSF
BTFSS
GOTO
BCF
STATUS, RP0
TXSTA, TRMT
$-1
STATUS, RP0
INCF
SENDINDEX, F
MOVLW
ADDWF
MOVWF
0X45
SENDINDEX, W
FSR
MOVF
BTFSC
MOVLW
MOVWF
INDF, W
STATUS, Z
0X30
TXREG
DECF
SENDDIF, F
GOTO
FIN_SENDDATA
BCF
SENDDATA
STATUS, RP0
RETURN
;******************************************************
;*****************************************************/
;*
Recepcin de datos
;*****************************************************/
*/
RXCHARS_G20
MOVLW
ANDWF
BTFSS
GOTO
0x06
; if ( ( RCSTA & 6 ) == 0 ) { Then if no errors,
RCSTA, W ; Process received character
STATUS, Z
ELSE1_G20
;si hubo un error GOTO ELSE1
MOVF
MOVWF
MOVF
BTFSC
GOTO
MOVLW
SUBWF
BTFSS
GOTO
BUFFERINDEX, W
STATUS, Z
NO_GUARDAR
0x01
BUFFERINDEX, W
STATUS, Z
NO_GUARDAR_FIN
108 - 151
0x0D
RCREG_COPIA, W
STATUS, Z
ENDELSE1_G20
0x0A
RCREG_COPIA, W
STATUS, Z
ENDELSE1_G20
RCREG_COPIA, W
INDF
INCF
BUFFERINDEX, F
; BufferIndex++
MOVF
BUFFERINDEX, W
SUBWF
BUFFSIZE, W
BTFSS
STATUS, Z
GOTO
ENDELSE1_G20
;SI SE LLENO EL BUFFER, CONTINUO
;-----------------------------------------------------------------;-----------------------------------------------------------------; En caso de buffer lleno
BSF
GENAUX, BUFFERREADY ; /* Set a flag to indicate line received */
CLRF
BUFFERINDEX
GOTO
ENDELSE1_G20
;-----------------------------------------------------------------ELSE1_G20 ; else {
BTFSS
GOTO
MOVF
en caso de error
RCSTA, FERR
OERRLABEL_G20
RCREG, W ;Leo el dato para refrescar FERR
OERRLABEL_G20
BTFSC
RCSTA, OERR
BCF
BSF
RCSTA, CREN
RCSTA, CREN
;Si hay algn error, reinicializo los flags identificatorios de respuestas g20
CLRF
BUFFERINDEX
BCF
REPLY_G20, STR_READY
BCF
REPLY_G20, STR_COMMING
BCF
REPLY_G20, CR
;}
;Esta rutina me dice si la cadena esta llegando
;o esta lista a travs de los flags de REPLY_G20,
;STR_COMING y STR_READY
ENDELSE1_G20
BTFSS
REPLY_G20, CR
GOTO
VER_SI_ES_CR
;LF (Line Feed)
MOVLW
0x0A
SUBWF
RCREG_COPIA, W
BTFSS
STATUS, Z
GOTO
VER_SI_ES_CR
BTFSS
REPLY_G20, STR_COMMING
GOTO
$+4
;set STR_COMING =1
BCF
REPLY_G20, STR_COMMING
BSF
REPLY_G20, STR_READY
GOTO
VER_SI_ES_CR
109 - 151
REPLY_G20, STR_READY
ENDRXCHARS_G20
BCF
BCF
G20STATUS, OKEY
G20STATUS, ERRO
;OK
MOVLW
MOVWF
MOVLW
MOVWF
RSP_OK_H
ADDRH
RSP_OK_L
ADDRL
CALL
STRCMP
SUBLW
BTFSC
GOTO
BSF
BCF
BCF
GOTO
0x01
STATUS, Z
$+5
G20STATUS, OKEY
REPLY_G20, STR_READY
GENAUX, HOLDTX
ENDRXCHARS_G20
;IP ASIGNADO
MOVLW
RSP_MIPCALL0_H
MOVWF
ADDRH
MOVLW
RSP_MIPCALL0_L
MOVWF
ADDRL
CALL
STRCMP
SUBLW
BTFSC
GOTO
BCF
BCF
BSF
GOTO
0x01
STATUS, Z
$+5
REPLY_G20, STR_READY
G20STATUS, IPASIGNADO
G20STATUS, ERRO
ENDRXCHARS_G20
;IP ASIGNADO
MOVLW
RSP_MIPCALL_H
MOVWF
ADDRH
MOVLW
RSP_MIPCALL_L
MOVWF
ADDRL
CALL
STRCMP
SUBLW
BTFSC
GOTO
BCF
BSF
BCF
GOTO
0x01
STATUS, Z
$+5
;ERROR
MOVLW
MOVWF
REPLY_G20, STR_READY
G20STATUS, IPASIGNADO
G20STATUS, ERRO
ENDRXCHARS_G20
RSP_ERROR_H
ADDRH
110 - 151
RSP_ERROR_L
ADDRL
CALL
STRCMP
SUBLW
BTFSC
GOTO
BSF
BCF
GOTO
0x01
STATUS, Z
$+4
G20STATUS, ERRO
REPLY_G20, STR_READY
ENDRXCHARS_G20
;ERROR
MOVLW
MOVWF
MOVLW
MOVWF
RSP_E1_H
ADDRH
RSP_E1_L
ADDRL
CALL
STRCMP
SUBLW
BTFSC
GOTO
BCF
BCF
GOTO
0x01
STATUS, Z
$+4
G20STATUS, ECHOOFF
REPLY_G20, STR_READY
ENDRXCHARS_G20
;ESTA REGISTRADO
MOVLW
RSP_CGREG1_H
MOVWF
ADDRH
MOVLW
RSP_CGREG1_L
MOVWF
ADDRL
CALL
STRCMP
SUBLW
BTFSC
GOTO
BSF
BCF
GOTO
0x01
STATUS, Z
$+4
G20STATUS, REGISTRADO
REPLY_G20, STR_READY
ENDRXCHARS_G20
STRCMP
SUBLW
BTFSC
GOTO
BCF
BCF
GOTO
NOP
0x01
STATUS, Z
$+4
REPLY_G20, STR_READY
G20STATUS, REGISTRADO
ENDRXCHARS_G20
;ESTA REGISTRADO
MOVLW
RSP_REGISTRADO_H
MOVWF
ADDRH
MOVLW
RSP_REGISTRADO_L
MOVWF
ADDRL
CALL
STRCMP
SUBLW
BTFSC
GOTO
0x01
STATUS, Z
$+4
111 - 151
G20STATUS, REGISTRADO
REPLY_G20, STR_READY
ENDRXCHARS_G20
;SIN REGISTRAR
MOVLW
RSP_SIN_REGISTRAR_H
MOVWF
ADDRH
MOVLW
RSP_SIN_REGISTRAR_L
MOVWF
ADDRL
CALL
STRCMP
SUBLW
BTFSC
GOTO
BCF
BCF
GOTO
0x01
STATUS, Z
$+4
G20STATUS, REGISTRADO
REPLY_G20, STR_READY
ENDRXCHARS_G20
STRCMP
SUBLW
BTFSC
GOTO
BCF
BSF
MOVLW
MOVWF
MOVLW
MOVWF
BSF
GOTO
NOP
0x01
STATUS, Z
$+9
REPLY_G20, STR_READY
G20STATUS2, CTI
CMD_MIPCALL_CLARO_H
MIPCALL_EMPRESA_H
CMD_MIPCALL_CLARO_L
MIPCALL_EMPRESA_L
G20STATUS, COPS
ENDRXCHARS_G20
STRCMP
SUBLW
BTFSC
GOTO
BCF
BSF
MOVLW
MOVWF
MOVLW
MOVWF
BSF
GOTO
NOP
0x01
STATUS, Z
$+9
REPLY_G20, STR_READY
G20STATUS2, PERSONAL
CMD_MIPCALL_PERSO_H
MIPCALL_EMPRESA_H
CMD_MIPCALL_PERSO_L
MIPCALL_EMPRESA_L
G20STATUS, COPS
ENDRXCHARS_G20
STRCMP
112 - 151
0x01
STATUS, Z
$+9
REPLY_G20, STR_READY
G20STATUS2, MOVISTAR
CMD_MIPCALL_MOVIS_H
MIPCALL_EMPRESA_H
CMD_MIPCALL_MOVIS_L
MIPCALL_EMPRESA_L
G20STATUS, COPS
ENDRXCHARS_G20
;PUERTO ABIERTO
MOVLW
RSP_MIPOPEN_H
MOVWF
ADDRH
MOVLW
RSP_MIPOPEN_L
MOVWF
ADDRL
CALL
STRCMP
SUBLW
BTFSC
GOTO
BCF
BSF
GOTO
0x01
STATUS, Z
$+4
REPLY_G20, STR_READY
G20STATUS, PUERTOABIERTO
ENDRXCHARS_G20
;PUERTO CERRADO
MOVLW
RSP_MIPCLOSE0_H
MOVWF
ADDRH
MOVLW
RSP_MIPCLOSE0_L
MOVWF
ADDRL
CALL
STRCMP
SUBLW
BTFSC
GOTO
BCF
BCF
BCF
GOTO
0x01
STATUS, Z
$+5
REPLY_G20, STR_READY
G20STATUS, PUERTOABIERTO
G20STATUS2, CLOSEPORT
ENDRXCHARS_G20
;FALLO EN EL PUERTO
MOVLW
RSP_MIPSTAT_H
MOVWF
ADDRH
MOVLW
RSP_MIPSTAT_L
MOVWF
ADDRL
CALL
STRCMP
SUBLW
BTFSC
GOTO
BCF
BCF
BCF
BCF
GOTO
0x01
STATUS, Z
$+6
REPLY_G20, STR_READY
G20STATUS, PUERTOABIERTO
G20STATUS, WATERMARK
G20STATUS2, CLOSEPORT
ENDRXCHARS_G20
ENDRXCHARS_G20
RETURN
;}
;---------------------------------------------------------------------
113 - 151
0x67
TMR0
RETURN
;---------------------------------------------------------------------
;--------------------------------------------------------------------TIMER1_SUB
;Con esto consigo un tren de pulsos de perodo 120ms y ciclo activo 40ms
BCF
STATUS, RP0
BTFSC
PORTC, CALIBPULSOS
GOTO
$+7
BSF
PORTC, CALIBPULSOS
MOVLW
0x9E
MOVWF
TMR1H
MOVLW
0x58
MOVWF
TMR1L
GOTO
$+6
BCF
PORTC, CALIBPULSOS
MOVLW
0x3C
MOVWF
TMR1H
MOVLW
0xB0
MOVWF
TMR1L
NOP
;Si no lo vuelvo a configurar al prescaler aca, no anda !!!
;The prescaler counter is cleared on writes to the
;TMR1H or TMR1L registers. DS39582B-page 60
;Cambie el prescaler a 1:8 para 20Mhz
BSF
T1CON, T1CKPS0
BSF
T1CON, T1CKPS1
RETURN
;---------------------------------------------------------------------
;--------------------------------------------------------------------CONVERT
; Leo el resultado de la conversin y lo pongo en el puerto de datos.
; Direcciono el registro de datos y escribo el valor.
; Decremento el contador y si es 0 deshabilito el TIMER
BCF
STATUS, RP0
MOVLW
MOVF
0xFF
ADRESH, F
BTFSC
GOTO
MOVLW
MOVWF
0xFF
MUESTRA
GOTO
END255
BSF
MOVF
BCF
STATUS, RP0
ADRESL, W
STATUS, RP0
MOVWF
MUESTRA
MOVF
MOVWF
MUESTRA, W
MUESTRATX
MENOR255
END255
114 - 151
CONTADOR, F
STATUS, Z
ENVIA_CABECERA_MIPSEND
MOVLW
MOVWF
0X45
FSR
MOVLW
ANDWF
SWAPF
0xF0
MUESTRA, F
MUESTRA,F
MOVLW
SUBWF
0x09
MUESTRA,W
BTFSC
GOTO
GOTO
STATUS,C
MAYOR9a
MENOR9a
MOVLW
GOTO
0x30
DESPUES9a
MOVWF
MUESTRA
BTFSC
INCF
STATUS, Z
MUESTRA, F
MOVLW
0x40
ADDWF
MUESTRA, W
BTFSC
MOVLW
STATUS, Z
0X23
MOVWF
INDF
CALL
SENDCHAR
BSF
MOVF
BCF
STATUS, RP0
ADRESL, W
STATUS, RP0
MOVWF
MUESTRA
MOVLW
MOVWF
0X45
FSR
MOVLW
ANDWF
0x0F
MUESTRA, F
MOVLW
SUBWF
0x09
MUESTRA,W
BTFSC
GOTO
GOTO
STATUS,C
MAYOR9
MENOR9
MOVLW
GOTO
0x30
DESPUES9
MENOR9a
MAYOR9a
DESPUES9a
MENOR9
MAYOR9
115 - 151
MUESTRA
BTFSC
INCF
STATUS, Z
MUESTRA, F
MOVLW
0x40
ADDWF
MUESTRA, W
BTFSC
MOVLW
STATUS, Z
0X23
MOVWF
INDF
CALL
SENDCHAR
DECF
CONTADOR, F
BCF
MOVF
BTFSC
CALL
STATUS, RP0
CONTADOR, F
STATUS, Z
ENVIA_COLA_MIPSEND
DESPUES9
FIN_CONVERT
RETURN
;---------------------------------------------------------------------
SETUP
CALL
CONFIGURECOMMS
BCF
PIR1, ADIF
BSF
BCF
BCF
BCF
STATUS, RP0
PIE1, TMR1IE
PIE1, ADIE
STATUS, RP0
BCF
T1CON, TMR1ON
MOVLW
MOVWF
D'80'
BUFFSIZE
CALL
DISPLAY_INI
MAIN_MAIN
BUCLE
BCF
BCF
STATUS, RP0
STATUS, RP1
116 - 151
;Temporizador Botones
INCFSZ
CRONO1, F
GOTO
$+2
INCF
CRONO2, F
NOP
;Temporizador para estados g20
INCFSZ
CRONO3, F
GOTO
$+2
INCFSZ
CRONO33, F
GOTO
$+2
INCF
CRONO4, F
NOP
CALL
SENDDATA
BTFSS
GOTO
BTFSS
GOTO
CRONO2, 7
FIN_BOTONES
CRONO2, 4
FIN_BOTONES
CLRF
CRONO2
G20STATUS, HABILITARTX
CALIBRATE, HABILITARTX_TON
G20STATUS, HABILITARTX
CALIBRATE, HABILITARTX_TON
;Con esto logro que resetear GENAUX, CALIB solo con una transicion a cero de CALIB_TIME
;que previamente fue iniicalizado a un valor cuando comenz la trasnmision
MOVF
CALIB_TIME, F
BTFSC
STATUS, Z
GOTO
$+4
DECFSZ
CALIB_TIME, F
GOTO
$+2
BCF
GENAUX, CALIB
117 - 151
$+3
FIN_CALIB
$+2
PORTC, CALIBINH
PORTC, CALIBINH
PORTC, INSTO
BCF
;Hasta aca 1uS
PORTC, INSTO
FIN_CALIB
; --------------------------------------------
118 - 151
FIN_BOTONES
G20STATUS, PUERTOABIERTO
$+6
G20STATUS, REGISTRADO
$+4
CONTADOR, F
STATUS, Z
G20STATUS2, CLOSEPORT
BTFSC
GOTO
BCF
BCF
BCF
G20STATUS, REGISTRADO
$+6
G20STATUS, COPS
G20STATUS2, CTI
G20STATUS2, PERSONAL
119 - 151
G20STATUS2, MOVISTAR
G20STATUS, IPASIGNADO
;---------------> CRONO4
BTFSS
CRONO4, 2
GOTO
FIN_ESTADOS_RED
BTFSS
CRONO4, 1
GOTO
FIN_ESTADOS_RED
CLRF
CRONO4
SENDDATA
CLRF
DELAY_PUSH
DECFSZ
GOTO
DELAY_PUSH
$-1
MOVLW
MOVWF
0xFF
DELAY_PUSH
DECFSZ
GOTO
DELAY_PUSH
$-1
CALL
SENDDATA
DECFSZ
GOTO
DELAY_PUSH
$-1
BTFSS
GOTO
G20STATUS2, MIPPUSH
FIN_MIPPUSH
DECFSZ
GOTO
DELAY_PUSH
$-1
MOVLW
MOVWF
MOVLW
MOVWF
CMD_MIPFLUSH_H
ADDRH
CMD_MIPFLUSH_L
ADDRL
CALL
CALL
SENDSTR
SENDDATA
BCF
G20STATUS2, MIPPUSH
MOVLW
MOVWF
0xFF
DELAY_PUSH
DECFSZ
GOTO
DELAY_PUSH
$-1
DECFSZ
GOTO
DELAY_PUSH
$-1
CALL
SENDDATA
DECFSZ
GOTO
DELAY_PUSH
$-1
CALL
SENDDATA
DECFSZ
GOTO
DELAY_PUSH
$-1
120 - 151
DELAY_PUSH
$-1
FIN_MIPPUSH
BTFSS
GOTO
BTFSS
GOTO
G20STATUS2, CLOSEPORT
FIN_CLOSEPORT
G20STATUS, IPASIGNADO
FIN_CLOSEPORT
MOVLW
MOVWF
MOVLW
MOVWF
CMD_MIPCLOSE_H
ADDRH
CMD_MIPCLOSE_L
ADDRL
CALL
CALL
SENDSTR
SENDDATA
FIN_CLOSEPORT
BSF
G20STATUS2, ECHOOFF
MOVLW
MOVWF
MOVLW
MOVWF
CMD_SIN_ECO_H
ADDRH
CMD_SIN_ECO_L
ADDRL
CALL
CALL
SENDSTR
SENDDATA
MOVLW
MOVWF
MOVLW
MOVWF
CMD_REGISTRO_H
ADDRH
CMD_REGISTRO_L
ADDRL
CALL
CALL
SENDSTR
SENDDATA
MOVLW
MOVWF
MOVLW
MOVWF
CMD_REGISTRADO?_H
ADDRH
CMD_REGISTRADO?_L
ADDRL
CALL
CALL
SENDSTR
SENDDATA
BTFSC
GOTO
BTFSS
GOTO
G20STATUS, COPS
FIN_CMD_COPS
G20STATUS, REGISTRADO
FIN_CMD_COPS
MOVLW
MOVWF
MOVLW
MOVWF
CMD_COPS?_H
ADDRH
CMD_COPS?_L
ADDRL
CALL
CALL
SENDSTR
SENDDATA
FIN_CMD_COPS
BTFSS
GOTO
G20STATUS, REGISTRADO
FIN_MIPCALL?
MOVLW
MOVWF
MOVLW
MOVWF
CMD_MIPCALL?_H
ADDRH
CMD_MIPCALL?_L
ADDRL
121 - 151
CALL
CALL
SENDSTR
SENDDATA
FIN_MIPCALL?
BTFSS
GOTO
BTFSC
GOTO
BTFSS
GOTO
G20STATUS, REGISTRADO
FIN_CMD_MIPCALL
G20STATUS, IPASIGNADO
FIN_CMD_MIPCALL
G20STATUS, COPS
FIN_CMD_MIPCALL
MOVF
MOVWF
MOVF
MOVWF
MIPCALL_EMPRESA_H, W
ADDRH
MIPCALL_EMPRESA_L, W
ADDRL
CALL
CALL
SENDSTR
SENDDATA
FIN_CMD_MIPCALL
BTFSS
GOTO
G20STATUS, IPASIGNADO
FIN_CMD_MIPCLOSE
MOVLW
MOVWF
MOVLW
MOVWF
CMD_MIPCLOSE?_H
ADDRH
CMD_MIPCLOSE?_L
ADDRL
CALL
CALL
SENDSTR
SENDDATA
FIN_CMD_MIPCLOSE
BTFSS
GOTO
BTFSS
GOTO
BTFSC
GOTO
G20STATUS, REGISTRADO
FIN_CMD_MIPOPEN
G20STATUS, IPASIGNADO
FIN_CMD_MIPOPEN
G20STATUS, PUERTOABIERTO
FIN_CMD_MIPOPEN
MOVLW
MOVWF
MOVLW
MOVWF
CMD_MIPOPEN_H
ADDRH
CMD_MIPOPEN_L
ADDRL
CALL
CALL
SENDSTR
SENDDATA
FIN_CMD_MIPOPEN
BTFSS
BCF
G20STATUS, PUERTOABIERTO
G20STATUS, WATERMARK
BTFSC
GOTO
BTFSS
GOTO
G20STATUS, WATERMARK
FIN_CMD_MIPSETS
G20STATUS, PUERTOABIERTO
FIN_CMD_MIPSETS
MOVLW
MOVWF
MOVLW
MOVWF
CMD_MIPSETS_H
ADDRH
CMD_MIPSETS_L
ADDRL
CALL
CALL
SENDSTR
SENDDATA
BSF
G20STATUS, WATERMARK
122 - 151
FIN_CMD_MIPSETS
FIN_ESTADOS_RED
;---------------> CRONO4 END
GOTO
BUCLE
ENVIA_CABECERA_MIPSEND
MOVLW
MOVWF
0x50
CONTADOR
MOVF
CONTADOR, F
MOVLW
MOVWF
MOVLW
MOVWF
CMD_MIPSEND_HEAD_H
ADDRH
CMD_MIPSEND_HEAD_L
ADDRL
CALL
SENDSTR
RETURN
ENVIA_COLA_MIPSEND
MOVLW
MOVWF
0X45
FSR
MOVLW
MOVWF
0x22
INDF
CALL
SENDCHAR
MOVLW
MOVWF
0X45
FSR
MOVLW
MOVWF
0x0D
INDF
CALL
CALL
SENDCHAR
SENDDATA
BSF
GENAUX, HOLDTX
RETURN
<-------
123 - 151
0x00
DATAL, F
BTFSC STATUS, C
INCF DATAH, F
RRF
DATAL, F
EEDATH,W
0x17
BTFSC
GOTO
STATUS, Z
$+9
MOVLW
MOVWF
0X01
PCL
MOVF
SUBLW
EEDATA,W
0x8C
BTFSC
GOTO
STATUS, Z
$+3
MOVLW
MOVWF
0X02
PCL
MOVLW
0x7F
ANDWF
DATAL, F
INCF
ADDRL, F
124 - 151
;Bank 0
RETURN
SENDSTR
;/*****
;( direccion, cantidad )
SendStr()
*******/
BCF
BCF
STATUS, RP0
STATUS, RP1
HOY_1
;Devuelve en W el nuevo valor de STRLEN
;y en DATAH y DATAL los caracteres
CALL
LEER_PROG_MEM
0X45
FSR
MOVLW
SUBWF
BTFSC
NOP
0X24
SENDDIF, W
STATUS, C
INDF, W
STATUS, Z
INDF, W
MOVLW
SUBWF
BTFSC
CALL
0X1E
SENDDIF, W
STATUS, C
SENDDATA
MOVF
BTFSC
MOVF
INDF, W
STATUS, Z
INDF, W
MOVLW
SUBWF
BTFSC
NOP
0X24
SENDDIF, W
STATUS, C
125 - 151
FSR
INDF, W
STATUS, Z
INDF, W
MOVLW
SUBWF
BTFSC
NOP
0X24
SENDDIF, W
STATUS, C
MOVLW
SUBWF
BTFSC
CALL
0X1E
SENDDIF, W
STATUS, C
SENDDATA
MOVF
BTFSC
MOVF
INDF, W
STATUS, Z
INDF, W
MOVLW
SUBWF
BTFSC
NOP
0X24
SENDDIF, W
STATUS, C
GOTO
HOY_1
;---------------------------------
STRCMP
;Debo pasarle la direccion de Program Memory
;donde esta el string que tengo q comparar
;con los datos que llegaron
CLRF
INDEX
DECF
INDEX, F
CONTINUAR
INCF
INDEX, F
MOVLW 0xA0
ADDWF INDEX, W
MOVWF FSR
CALL
LEER_PROG_MEM
DATAL, W
STATUS, Z
CONTINUAR
INCF
INDEX, F
MOVLW 0xA0
ADDWF INDEX, W
MOVWF FSR
126 - 151
DATAL, W
INDF, W
STATUS, Z
DISTINTOS
GOTO
CONTINUAR
RETLW
0x00
RETLW
0x01
IGUALES
DISTINTOS
MAIN_MAIN
ATCMD
;------ Envio "AT" ------;Cargo la direccion donde comienzan los datos guardados
;en la memoria de programa
MOVLW
MOVWF
MOVLW
MOVWF
CMD_AT_H
ADDRH
CMD_AT_L
ADDRL
CLRF
CLRF
BUFFERINDEX
REPLY_G20
CALL
CALL
SENDSTR
SENDDATA
MOVLW
MOVWF
MOVLW
MOVWF
0x1A
ADDRH
0x10
ADDRL
CLRF
CLRF
BUFFERINDEX
REPLY_G20
CALL
CALL
SENDSTR
SENDDATA
MOVLW
MOVWF
MOVLW
MOVWF
CMD_AT_H
ADDRH
CMD_AT_L
ADDRL
CLRF
CLRF
BUFFERINDEX
REPLY_G20
CALL
CALL
SENDSTR
SENDDATA
MOVLW
MOVWF
MOVLW
MOVWF
CMD_CMEE_H
ADDRH
CMD_CMEE_L
ADDRL
CALL
CALL
SENDSTR
SENDDATA
MOVLW
MOVWF
MOVLW
MOVWF
CMD_MIPCLOSE_H
ADDRH
CMD_MIPCLOSE_L
ADDRL
CALL
CALL
SENDSTR
SENDDATA
127 - 151
EEDATH,W
0x3F
BTFSC
GOTO
STATUS, Z
$+9
MOVLW
MOVWF
0X01
PCL
MOVF
SUBLW
EEDATA,W
0xFF
BTFSC
GOTO
STATUS, Z
$+3
MOVLW
MOVWF
0X02
PCL
MOVLW
0x7F
BSF
BSF
BSF
BCF
BSF
STATUS, RP0
PIE1, TMR1IE
PIE1, ADIE
STATUS, RP0
T1CON, TMR1ON
BSF
BSF
INTCON, TMR0IE
INTCON, GIE
RETURN
;RUTINA DE RETARDO
;**********************
WAIT_DISPLAY
MOVLW
0x01
MOVWF
VD1
SIGA1111 MOVLW
0x01
MOVWF
VD2
SIGA2222 MOVLW
0x01
MOVWF
VD3
SIGA3333 DECFSZ
VD3, F
GOTO
SIGA3333
DECFSZ
VD2, F
GOTO
SIGA2222
DECFSZ
VD1, F
128 - 151
DISPLAY_CTRL, RST
WAIT_DISPLAY
WAIT_DISPLAY
WAIT_DISPLAY
DISPLAY_CTRL, RST
WAIT_DISPLAY
WAIT_DISPLAY
WAIT_DISPLAY
DISPLAY_CTRL, RST
WAIT_DISPLAY
WAIT_DISPLAY
BCF
BCF
DISPLAY_CTRL, DATA_NEGINSTR
DISPLAY_CTRL, READ_NEGWRITE
BCF
BSF
DISPLAY_CTRL, CS1
DISPLAY_CTRL, CS2
MOVLW
MOVWF
0x3F
DISPLAY_DATA
BSF
CALL
BCF
CALL
DISPLAY_CTRL, ENABLE
WAIT_DISPLAY
DISPLAY_CTRL, ENABLE
WAIT_DISPLAY
BCF
BSF
DISPLAY_CTRL, CS2
DISPLAY_CTRL, CS1
MOVLW
MOVWF
0x3F
DISPLAY_DATA
BSF
CALL
BCF
CALL
DISPLAY_CTRL, ENABLE
WAIT_DISPLAY
DISPLAY_CTRL, ENABLE
WAIT_DISPLAY
DISPLAY_CTRL, DATA_NEGINSTR
DISPLAY_CTRL, READ_NEGWRITE
DISPLAY_CTRL, ENABLE
WAIT_DISPLAY
DISPLAY_CTRL, ENABLE
WAIT_DISPLAY
BSF
BCF
DISPLAY_CTRL, DATA_NEGINSTR
DISPLAY_CTRL, READ_NEGWRITE
CLRF
YADDRESS
CALL
CLEAR
129 - 151
CLRF
YADDRESS
RETURN
;------------------------------------ DISPLAY_INI DISPLAY_INI DISPLAY_INI ---------------------------------
GENAUX, PAUSA
FIN_TRANSFORMACION_DISPLAY
BTFSS
GOTO
BTFSS
RETURN
BTFSS
RETURN
GENAUX, VELOCIDAD
$+3
BARRIDO, 1
MOVF
SUBLW
MOVWF
MUESTRATX, W
0XFF
MUESTRATX
MOVF
MOVWF
MUESTRATX, W
PAGINA_ACTUAL
BARRIDO, 0
RRF
RRF
RRF
RRF
RRF
MOVLW
ANDWF
PAGINA_ACTUAL, F
PAGINA_ACTUAL, F
PAGINA_ACTUAL, F
PAGINA_ACTUAL, F
PAGINA_ACTUAL, F
0X07
PAGINA_ACTUAL, F
0x04
MUESTRATX, F
;Divido por 4 para ajustarme al rango 32 / 8 pixels = 4, recordar q 32 viene de 256 / 8 paginas
RRF
MUESTRATX, F
RRF
MUESTRATX, F
MOVLW
0x0F
;00001111 por si hay acarreo
ANDWF
MUESTRATX, F
;Comienzo transformacion
MOVLW
MOVWF
MOVLW
ADDWF
0x01
PIXEL_ACTUAL
0xFF
PIXEL_ACTUAL, F
TRANSFORMACION_DISPLAY
MOVF
MUESTRATX, F
BTFSC
STATUS, Z
GOTO
FIN_TRANSFORMACION_DISPLAY
DECF
RLF
GOTO
MUESTRATX, F
PIXEL_ACTUAL, F
TRANSFORMACION_DISPLAY
FIN_TRANSFORMACION_DISPLAY
;Para graficar 2 segndos por pantalla a 256 MUESTRATXs por seg, como tengo 128 pixels horizontales, tengo
;q enviar una MUESTRATX cada 4
130 - 151
;--->
CALL
;--->
CLEAR_COL
MOVF
MOVWF
PAGINA_ACTUAL, W
PAGINA_ANTERIOR
MOVF
MOVWF
PIXEL_ACTUAL, W
PIXEL_ANTERIOR
INCF
YADDRESS, F
MOVLW
SUBWF
BTFSC
CALL
0x40
;64
YADDRESS, W
STATUS, Z
CAMBIAR_PAGINA
MOVF
MOVWF
YADDRESS, W
DISPLAY_DATA
BCF
BCF
DISPLAY_CTRL, DATA_NEGINSTR
DISPLAY_CTRL, READ_NEGWRITE
BCF
BSF
DISPLAY_DATA, 7
DISPLAY_DATA, 6
CALL
BSF
CALL
BCF
WAIT_DISPLAY
DISPLAY_CTRL, ENABLE
WAIT_DISPLAY
DISPLAY_CTRL, ENABLE
RETURN
;------------------------------------------------------
CLEAR
MOVLW
MOVWF
0X08
PAGINA
CLRF
YADDRESS
BCF
BSF
DISPLAY_CTRL, CS2
DISPLAY_CTRL, CS1
CLEAR_BUCLE
MOVF
MOVWF
YADDRESS, W
DISPLAY_DATA
BCF
BCF
DISPLAY_CTRL, DATA_NEGINSTR
DISPLAY_CTRL, READ_NEGWRITE
BCF
BSF
DISPLAY_DATA, 7
DISPLAY_DATA, 6
CALL
BSF
CALL
BCF
WAIT_DISPLAY
DISPLAY_CTRL, ENABLE
WAIT_DISPLAY
DISPLAY_CTRL, ENABLE
DECF
PAGINA, F
MOVF
MOVWF
PAGINA, W
DISPLAY_DATA
131 - 151
DISPLAY_DATA, 7
DISPLAY_DATA, 6
DISPLAY_DATA, 5
DISPLAY_DATA, 4
DISPLAY_DATA, 3
BCF
BCF
DISPLAY_CTRL, DATA_NEGINSTR
DISPLAY_CTRL, READ_NEGWRITE
CALL
BSF
CALL
BCF
WAIT_DISPLAY
DISPLAY_CTRL, ENABLE
WAIT_DISPLAY
DISPLAY_CTRL, ENABLE
MOVLW
MOVWF
0X00
PIXEL
MOVF
MOVWF
PIXEL, W
DISPLAY_DATA
BSF
BCF
DISPLAY_CTRL, DATA_NEGINSTR
DISPLAY_CTRL, READ_NEGWRITE
CALL
BSF
CALL
BCF
WAIT_DISPLAY
DISPLAY_CTRL, ENABLE
WAIT_DISPLAY
DISPLAY_CTRL, ENABLE
MOVF
BTFSS
GOTO
INCF
MOVLW
MOVWF
PAGINA, W
STATUS, Z
CLEAR_BUCLE
YADDRESS, F
0X08
PAGINA
CALL
WAIT_DISPLAY
MOVLW
SUBWF
BTFSS
GOTO
CLRF
CALL
BTFSS
GOTO
0x40
;64
YADDRESS, W
STATUS, Z
CLEAR_BUCLE
YADDRESS
CAMBIAR_PAGINA
DISPLAY_CTRL, CS1
CLEAR_BUCLE
RETURN
CLEAR_COL
MOVLW
MOVWF
0X08
PAGINA
CLEAR_COL_BUCLE
;Cargo las variables
MOVF
PAGINA_ANTERIOR, W
MOVWF
PAGINA_0
MOVF
MOVWF
PAGINA_ACTUAL, W
PAGINA_1
MOVF
MOVWF
PIXEL_ANTERIOR, W
PIXEL_0
MOVF
MOVWF
PIXEL_ACTUAL, W
PIXEL_1
MOVF
MOVWF
YADDRESS, W
DISPLAY_DATA
132 - 151
BCF
BCF
DISPLAY_CTRL, DATA_NEGINSTR
DISPLAY_CTRL, READ_NEGWRITE
BCF
BSF
DISPLAY_DATA, 7
DISPLAY_DATA, 6
CALL
BSF
CALL
BCF
WAIT_DISPLAY
DISPLAY_CTRL, ENABLE
WAIT_DISPLAY
DISPLAY_CTRL, ENABLE
DECF
PAGINA, F
MOVF
PAGINA, W
MOVWF
DISPLAY_DATA
BSF
BCF
BSF
BSF
BSF
DISPLAY_DATA, 7
DISPLAY_DATA, 6
DISPLAY_DATA, 5
DISPLAY_DATA, 4
DISPLAY_DATA, 3
BCF
BCF
DISPLAY_CTRL, DATA_NEGINSTR
DISPLAY_CTRL, READ_NEGWRITE
CALL
BSF
CALL
BCF
NOP
WAIT_DISPLAY
DISPLAY_CTRL, ENABLE
WAIT_DISPLAY
DISPLAY_CTRL, ENABLE
PAGINA_1, W
PAGINA, W
STATUS, C
INTERPOL_PAG_2_END
MOVLW
MOVWF
0xFF
PIXEL_1
GOTO
INTERPOL_PAG_1_END
PAGINA_ES_MENOR_QUE_PAGINA_0
;Veo si esta pagina q estoy procesando es menor a la de la MUESTRATX anterior
;y mayor a la actual
MOVF
PAGINA, W
SUBWF
PAGINA_1, W
133 - 151
STATUS, C
INTERPOL_PAG_2_END
MOVLW
MOVWF
0xFF
PIXEL_1
GOTO
INTERPOL_PAG_1_END
W
0x00
PIXEL_1, F
0X01
PIXEL_1, F
INTERPOL_PAG_1_END
PAG_1_MENOR_PAG_0
MOVLW
SUBWF
COMF
GOTO
0X01
PIXEL_1, F
PIXEL_1, F
INTERPOL_PAG_1_END
PAG_1_IGUAL_PAG_0
MOVF
SUBWF
BTFSC
GOTO
BTFSS
GOTO
GOTO
PIXEL_0, W
PIXEL_1, W
STATUS, Z
PIX_1_IGUAL_PIX_0
STATUS, C
PIX_1_MENOR_PIX_0
PIX_1_MAYOR_PIX_0
PIX_1_MAYOR_PIX_0
;Pretendo graficar una lnea entre los dos pixels, pero
;sin el pxel a la altura del anterior para que parezca ms suave
;Esto se logra reemplazando los ceros por unos en los 2 pixels y restando entre si
;PIXEL_1 = 10000 -> rotando izquierda y restando 1 -> 11111
;PIXEL_0 = 00010 -> rotando izquierda y restando 1 -> 00011
;Restando queda 11100
CLRF
W
ADDLW
0x00
RLF
PIXEL_1, F
MOVLW
0X01
SUBWF
PIXEL_1, F
CLRF
ADDLW
RLF
MOVLW
SUBWF
W
0x00
MOVF
SUBWF
GOTO
PIXEL_0, W
PIXEL_1, F
INTERPOL_PAG_1_END
PIXEL_0, F
0X01
PIXEL_0, F
PIX_1_MENOR_PIX_0
;Pretendo graficar una lnea entre los dos pixels, pero
;sin el pxel a la altura del anterior para que parezca ms suave
;Esto se logra restando los 2 valores
;es decir, PIXEL_0 - PIXEL_1 = Valor_A_Graficar
;si PIXEL_0 = 1000 y PIXEL_1 = 0010 quiero graficar 0110
134 - 151
INTERPOL_PAG_0
NOP
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
MOVF
PAGINA_0, W
SUBWF
PAGINA_1, W
BTFSS
STATUS, C
GOTO
B_PAG_1_MENOR_PAG_0
GOTO
B_PAG_1_MAYOR_PAG_0
B_PAG_1_MAYOR_PAG_0
CLRF
W
ADDLW
0x00
RLF
PIXEL_0, F
MOVLW
0X01
SUBWF
PIXEL_0, F
COMF
PIXEL_0, F
GOTO
INTERPOL_PAG_0_END
B_PAG_1_MENOR_PAG_0
;CLRF
W
;ADDLW
0x00
;RLF
PIXEL_0, F
MOVLW
0X01
SUBWF
PIXEL_0, F
GOTO
INTERPOL_PAG_0_END
INTERPOL_PAG_0_END
MOVF
PIXEL_0, W
MOVWF
PIXEL_1
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
PIX_1_IGUAL_PIX_0
NOP
INTERPOL_PAG_1_END
goto
$+3
INTERPOL_PAG_2_END
CLRF
PIXEL_1
NOP
NOP
;******** INTERPOL END *********
0X03
PAGINA, W
STATUS, Z
SIG_GRILLA
0X07
ANDWF
BTFSC
GOTO
MOVLW
GOTO
BSF
YADDRESS, W
STATUS, Z
$+3
0X00
$+2
PIXEL_1, 7
GOTO
FIN_GRILLA
SIG_GRILLA
135 - 151
0X01
PAGINA, W
STATUS, Z
FIN_GRILLA
MOVLW
ANDWF
BTFSC
GOTO
MOVLW
GOTO
BSF
0X07
YADDRESS, W
STATUS, Z
$+3
0X00
$+2
PIXEL_1, 7
FIN_GRILLA
GENAUX, DISPMSG
BTFSS
GOTO
DISPLAY_CTRL, CS1
FIN_MENSAJES
BTFSC
CLRF
GENAUX, PAUSA
PIXEL_1
MOVLW
SUBWF
BTFSS
GOTO
0X07
PAGINA, W
STATUS, Z
FIN_MENSAJES
MOVLW
MOVWF
0x00
PIXEL_1
BTFSS
GOTO
GENAUX, VELOCIDAD
VELOCIDAD_50
;2
;MOVLW
MOVF
BTFSS
GOTO
BSF
MOVLW
MOVWF
0X00
YADDRESS, W
STATUS, Z
$+4
GENAUX, DISPMSG
0xE8
PIXEL_1
;2
MOVLW
SUBWF
BTFSS
GOTO
BSF
MOVLW
MOVWF
0X01
YADDRESS, W
STATUS, Z
$+4
GENAUX, DISPMSG
0xA8
PIXEL_1
;2
MOVLW
SUBWF
BTFSS
GOTO
BSF
MOVLW
MOVWF
0X02
YADDRESS, W
STATUS, Z
$+4
GENAUX, DISPMSG
0xB8
PIXEL_1
; ESPACIO
MOVLW
SUBWF
BTFSS
GOTO
0X03
YADDRESS, W
STATUS, Z
$+4
;-------
136 - 151
0x00
PIXEL_1
GENAUX, DISPMSG
;5
MOVLW
SUBWF
BTFSS
GOTO
BSF
MOVLW
MOVWF
0X04
YADDRESS, W
STATUS, Z
$+4
GENAUX, DISPMSG
0xB8
PIXEL_1
;5
MOVLW
SUBWF
BTFSS
GOTO
BSF
MOVLW
MOVWF
0X05
YADDRESS, W
STATUS, Z
$+4
GENAUX, DISPMSG
0xA8
PIXEL_1
;5
MOVLW
SUBWF
BTFSS
GOTO
BSF
MOVLW
MOVWF
0X06
YADDRESS, W
STATUS, Z
$+4
GENAUX, DISPMSG
0xE8
PIXEL_1
GOTO
FIN_VELOCIDAD_50
VELOCIDAD_50
;5
;MOVLW
MOVF
BTFSS
GOTO
BSF
MOVLW
MOVWF
0X00
YADDRESS, W
STATUS, Z
$+4
GENAUX, DISPMSG
0xB8
PIXEL_1
;5
MOVLW
SUBWF
BTFSS
GOTO
BSF
MOVLW
MOVWF
0X01
YADDRESS, W
STATUS, Z
$+4
GENAUX, DISPMSG
0xA8
PIXEL_1
;5
MOVLW
SUBWF
BTFSS
GOTO
BSF
MOVLW
MOVWF
0X02
YADDRESS, W
STATUS, Z
$+4
GENAUX, DISPMSG
0xE8
PIXEL_1
; ESPACIO
MOVLW
SUBWF
BTFSS
GOTO
BSF
MOVLW
MOVWF
0X03
YADDRESS, W
STATUS, Z
$+4
GENAUX, DISPMSG
0x00
PIXEL_1
;0
MOVLW
0X04
137 - 151
YADDRESS, W
STATUS, Z
$+4
GENAUX, DISPMSG
0xF8
PIXEL_1
;0
MOVLW
SUBWF
BTFSS
GOTO
BSF
MOVLW
MOVWF
0X05
YADDRESS, W
STATUS, Z
$+4
GENAUX, DISPMSG
0x88
PIXEL_1
;0
MOVLW
SUBWF
BTFSS
GOTO
BSF
MOVLW
MOVWF
0X06
YADDRESS, W
STATUS, Z
$+4
GENAUX, DISPMSG
0xF8
PIXEL_1
FIN_VELOCIDAD_50
; ESPACIO
MOVLW
SUBWF
BTFSS
GOTO
BSF
MOVLW
MOVWF
0X07
YADDRESS, W
STATUS, Z
$+4
GENAUX, DISPMSG
0x00
PIXEL_1
;M
MOVLW
SUBWF
BTFSS
GOTO
BSF
MOVLW
MOVWF
0X08
YADDRESS, W
STATUS, Z
$+4
GENAUX, DISPMSG
0xF0
PIXEL_1
;M
MOVLW
SUBWF
BTFSS
GOTO
BSF
MOVLW
MOVWF
0X09
YADDRESS, W
STATUS, Z
$+4
GENAUX, DISPMSG
0x20
PIXEL_1
;M
MOVLW
SUBWF
BTFSS
GOTO
BSF
MOVLW
MOVWF
0X0A
YADDRESS, W
STATUS, Z
$+4
GENAUX, DISPMSG
0xF0
PIXEL_1
; ESPACIO
MOVLW
SUBWF
BTFSS
GOTO
BSF
MOVLW
MOVWF
0X0B
YADDRESS, W
STATUS, Z
$+4
GENAUX, DISPMSG
0x00
PIXEL_1
138 - 151
;M
MOVLW
SUBWF
BTFSS
GOTO
BSF
MOVLW
MOVWF
0X0C
YADDRESS, W
STATUS, Z
$+4
GENAUX, DISPMSG
0xF0
PIXEL_1
;M
MOVLW
SUBWF
BTFSS
GOTO
BSF
MOVLW
MOVWF
0X0D
YADDRESS, W
STATUS, Z
$+4
GENAUX, DISPMSG
0x20
PIXEL_1
;M
MOVLW
SUBWF
BTFSS
GOTO
BSF
MOVLW
MOVWF
0X0E
YADDRESS, W
STATUS, Z
$+4
GENAUX, DISPMSG
0xF0
PIXEL_1
; ESPACIO
MOVLW
SUBWF
BTFSS
GOTO
BSF
MOVLW
MOVWF
0X0F
YADDRESS, W
STATUS, Z
$+4
GENAUX, DISPMSG
0x00
PIXEL_1
;-------
GENAUX, PAUSA
FIN_PAUSA
; ESPACIO
MOVLW
SUBWF
BTFSS
GOTO
BSF
MOVLW
MOVWF
0X10
YADDRESS, W
STATUS, Z
$+4
GENAUX, DISPMSG
0x00
PIXEL_1
; ESPACIO
MOVLW
SUBWF
BTFSS
GOTO
BSF
MOVLW
MOVWF
0X11
YADDRESS, W
STATUS, Z
$+4
GENAUX, DISPMSG
0x00
PIXEL_1
; ESPACIO
MOVLW
SUBWF
BTFSS
GOTO
BSF
MOVLW
MOVWF
0X12
YADDRESS, W
STATUS, Z
$+4
GENAUX, DISPMSG
0x00
PIXEL_1
139 - 151
;PAUSA
MOVLW
SUBWF
BTFSS
GOTO
BSF
MOVLW
MOVWF
0X13
YADDRESS, W
STATUS, Z
$+4
GENAUX, DISPMSG
0xFC
PIXEL_1
;PAUSA
MOVLW
SUBWF
BTFSS
GOTO
BSF
MOVLW
MOVWF
0X14
YADDRESS, W
STATUS, Z
$+4
GENAUX, DISPMSG
0xFC
PIXEL_1
; ESPACIO
MOVLW
SUBWF
BTFSS
GOTO
BSF
MOVLW
MOVWF
0X15
YADDRESS, W
STATUS, Z
$+4
GENAUX, DISPMSG
0x00
PIXEL_1
;PAUSA
MOVLW
SUBWF
BTFSS
GOTO
BSF
MOVLW
MOVWF
0X16
YADDRESS, W
STATUS, Z
$+4
GENAUX, DISPMSG
0xFC
PIXEL_1
;PAUSA
MOVLW
SUBWF
BTFSS
GOTO
BSF
MOVLW
MOVWF
0X17
YADDRESS, W
STATUS, Z
$+4
GENAUX, DISPMSG
0xFC
PIXEL_1
; ESPACIO
MOVLW
SUBWF
BTFSS
GOTO
BSF
MOVLW
MOVWF
0X18
YADDRESS, W
STATUS, Z
$+4
GENAUX, DISPMSG
0x00
PIXEL_1
; ESPACIO
MOVLW
SUBWF
BTFSS
GOTO
BSF
MOVLW
MOVWF
0X19
YADDRESS, W
STATUS, Z
$+4
GENAUX, DISPMSG
0x00
PIXEL_1
BTFSS
GOTO
G20STATUS, REGISTRADO
FIN_REGISTRADO
FIN_PAUSA
;-------
140 - 151
; ESPACIO
MOVLW
SUBWF
BTFSS
GOTO
BSF
MOVLW
MOVWF
0X1A
YADDRESS, W
STATUS, Z
$+4
GENAUX, DISPMSG
0x00
PIXEL_1
;
MOVLW
SUBWF
BTFSS
GOTO
BSF
MOVLW
MOVWF
0X1B
YADDRESS, W
STATUS, Z
$+4
GENAUX, DISPMSG
0x08
PIXEL_1
;
MOVLW
SUBWF
BTFSS
GOTO
BSF
MOVLW
MOVWF
0X1C
YADDRESS, W
STATUS, Z
$+4
GENAUX, DISPMSG
0x18
PIXEL_1
;
MOVLW
SUBWF
BTFSS
GOTO
BSF
MOVLW
MOVWF
0X1D
YADDRESS, W
STATUS, Z
$+4
GENAUX, DISPMSG
0xF8
PIXEL_1
;
MOVLW
SUBWF
BTFSS
GOTO
BSF
MOVLW
MOVWF
0X1E
YADDRESS, W
STATUS, Z
$+4
GENAUX, DISPMSG
0x18
PIXEL_1
;
MOVLW
SUBWF
BTFSS
GOTO
BSF
MOVLW
MOVWF
0X1F
YADDRESS, W
STATUS, Z
$+4
GENAUX, DISPMSG
0x08
PIXEL_1
; ESPACIO
MOVLW
SUBWF
BTFSS
GOTO
BSF
MOVLW
MOVWF
0X20
YADDRESS, W
STATUS, Z
$+4
GENAUX, DISPMSG
0x00
PIXEL_1
FIN_REGISTRADO
BTFSS
GOTO
G20STATUS, PUERTOABIERTO
FIN_PUERTOABIERTO
; ESPACIO
MOVLW
SUBWF
0X21
YADDRESS, W
141 - 151
STATUS, Z
$+4
GENAUX, DISPMSG
0x00
PIXEL_1
; ESPACIO
MOVLW
SUBWF
BTFSS
GOTO
BSF
MOVLW
MOVWF
0X22
YADDRESS, W
STATUS, Z
$+4
GENAUX, DISPMSG
0x00
PIXEL_1
; ESPACIO
MOVLW
SUBWF
BTFSS
GOTO
BSF
MOVLW
MOVWF
0X23
YADDRESS, W
STATUS, Z
$+4
GENAUX, DISPMSG
0xA8
PIXEL_1
; IP
MOVLW
SUBWF
BTFSS
GOTO
BSF
MOVLW
MOVWF
0X24
YADDRESS, W
STATUS, Z
$+4
GENAUX, DISPMSG
0x70
PIXEL_1
; IP
MOVLW
SUBWF
BTFSS
GOTO
BSF
MOVLW
MOVWF
0X25
YADDRESS, W
STATUS, Z
$+4
GENAUX, DISPMSG
0xD8
PIXEL_1
; IP
MOVLW
SUBWF
BTFSS
GOTO
BSF
MOVLW
MOVWF
0X26
YADDRESS, W
STATUS, Z
$+4
GENAUX, DISPMSG
0x70
PIXEL_1
; IP
MOVLW
SUBWF
BTFSS
GOTO
BSF
MOVLW
MOVWF
0X27
YADDRESS, W
STATUS, Z
$+4
GENAUX, DISPMSG
0xA8
PIXEL_1
; ESPACIO
MOVLW
SUBWF
BTFSS
GOTO
BSF
MOVLW
MOVWF
0X28
YADDRESS, W
STATUS, Z
$+4
GENAUX, DISPMSG
0x00
PIXEL_1
FIN_PUERTOABIERTO
BTFSS
G20STATUS, HABILITARTX
142 - 151
FIN_TRANSMITIENDO
; ESPACIO
MOVLW
SUBWF
BTFSS
GOTO
BSF
MOVLW
MOVWF
0X29
YADDRESS, W
STATUS, Z
$+4
GENAUX, DISPMSG
0x00
PIXEL_1
; ESPACIO
MOVLW
SUBWF
BTFSS
GOTO
BSF
MOVLW
MOVWF
0X2A
YADDRESS, W
STATUS, Z
$+4
GENAUX, DISPMSG
0x00
PIXEL_1
; Transmitiendo
MOVLW
0X2B
SUBWF
YADDRESS, W
BTFSS
STATUS, Z
GOTO
$+4
BSF
GENAUX, DISPMSG
MOVLW
0xA0
MOVWF
PIXEL_1
; Transmitiendo
MOVLW
0X2C
SUBWF
YADDRESS, W
BTFSS
STATUS, Z
GOTO
$+4
BSF
GENAUX, DISPMSG
MOVLW
0xD0
MOVWF
PIXEL_1
; Transmitiendo
MOVLW
0X2D
SUBWF
YADDRESS, W
BTFSS
STATUS, Z
GOTO
$+4
BSF
GENAUX, DISPMSG
MOVLW
0xE0
MOVWF
PIXEL_1
; Transmitiendo
MOVLW
0X2E
SUBWF
YADDRESS, W
BTFSS
STATUS, Z
GOTO
$+4
BSF
GENAUX, DISPMSG
MOVLW
0xD0
MOVWF
PIXEL_1
; Transmitiendo
MOVLW
0X2F
SUBWF
YADDRESS, W
BTFSS
STATUS, Z
GOTO
$+4
BSF
GENAUX, DISPMSG
MOVLW
0xA0
MOVWF
PIXEL_1
FIN_TRANSMITIENDO
; ESPACIO
MOVLW
SUBWF
BTFSS
0X30
YADDRESS, W
STATUS, Z
143 - 151
$+4
GENAUX, DISPMSG
0x00
PIXEL_1
; ESPACIO
MOVLW
SUBWF
BTFSS
GOTO
BSF
MOVLW
MOVWF
0X31
YADDRESS, W
STATUS, Z
$+4
GENAUX, DISPMSG
0x00
PIXEL_1
; ESPACIO
MOVLW
SUBWF
BTFSS
GOTO
BSF
MOVLW
MOVWF
0X32
YADDRESS, W
STATUS, Z
$+4
GENAUX, DISPMSG
0x00
PIXEL_1
; ESPACIO
MOVLW
SUBWF
BTFSS
GOTO
BSF
MOVLW
MOVWF
0X33
YADDRESS, W
STATUS, Z
$+4
GENAUX, DISPMSG
0x00
PIXEL_1
; ESPACIO
MOVLW
SUBWF
BTFSS
GOTO
BSF
MOVLW
MOVWF
0X34
YADDRESS, W
STATUS, Z
$+4
GENAUX, DISPMSG
0x00
PIXEL_1
;x
MOVLW
SUBWF
BTFSS
GOTO
BSF
MOVLW
MOVWF
0X35
YADDRESS, W
STATUS, Z
$+4
GENAUX, DISPMSG
0xA0
PIXEL_1
;x
MOVLW
SUBWF
BTFSS
GOTO
BSF
MOVLW
MOVWF
0X36
YADDRESS, W
STATUS, Z
$+4
GENAUX, DISPMSG
0x40
PIXEL_1
;x
MOVLW
SUBWF
BTFSS
GOTO
BSF
MOVLW
MOVWF
0X37
YADDRESS, W
STATUS, Z
$+4
GENAUX, DISPMSG
0xA0
PIXEL_1
; ESPACIO
MOVLW
SUBWF
BTFSS
GOTO
0X38
YADDRESS, W
STATUS, Z
$+4
144 - 151
GENAUX, DISPMSG
0x00
PIXEL_1
;X0.5
;-------------------------------BTFSC
CONTGAIN, 0
GOTO
FIN_X0.5
BTFSC
CONTGAIN, 1
GOTO
FIN_X0.5
;0
MOVLW
SUBWF
BTFSS
GOTO
BSF
MOVLW
MOVWF
0X39
YADDRESS, W
STATUS, Z
$+4
GENAUX, DISPMSG
0xF8
PIXEL_1
;0
MOVLW
SUBWF
BTFSS
GOTO
BSF
MOVLW
MOVWF
0X3A
YADDRESS, W
STATUS, Z
$+4
GENAUX, DISPMSG
0x88
PIXEL_1
;0
MOVLW
SUBWF
BTFSS
GOTO
BSF
MOVLW
MOVWF
0X3B
YADDRESS, W
STATUS, Z
$+4
GENAUX, DISPMSG
0xF8
PIXEL_1
; PUNTO
MOVLW
SUBWF
BTFSS
GOTO
BSF
MOVLW
MOVWF
0X3C
YADDRESS, W
STATUS, Z
$+4
GENAUX, DISPMSG
0x80
PIXEL_1
;5
MOVLW
SUBWF
BTFSS
GOTO
BSF
MOVLW
MOVWF
0X3D
YADDRESS, W
STATUS, Z
$+4
GENAUX, DISPMSG
0xB8
PIXEL_1
;5
MOVLW
SUBWF
BTFSS
GOTO
BSF
MOVLW
MOVWF
0X3E
YADDRESS, W
STATUS, Z
$+4
GENAUX, DISPMSG
0xA8
PIXEL_1
;5
MOVLW
SUBWF
BTFSS
GOTO
BSF
0X3F
YADDRESS, W
STATUS, Z
$+4
GENAUX, DISPMSG
145 - 151
0xE8
PIXEL_1
GOTO
FIN_X2
FIN_X0.5
;X1
;-------------------------------BTFSS
CONTGAIN, 0
GOTO
FIN_X1
BTFSC
CONTGAIN, 1
GOTO
FIN_X1
;1
MOVLW
SUBWF
BTFSS
GOTO
BSF
MOVLW
MOVWF
0X39
YADDRESS, W
STATUS, Z
$+4
GENAUX, DISPMSG
0x88
PIXEL_1
;1
MOVLW
SUBWF
BTFSS
GOTO
BSF
MOVLW
MOVWF
0X3A
YADDRESS, W
STATUS, Z
$+4
GENAUX, DISPMSG
0xF8
PIXEL_1
;1
MOVLW
SUBWF
BTFSS
GOTO
BSF
MOVLW
MOVWF
0X3B
YADDRESS, W
STATUS, Z
$+4
GENAUX, DISPMSG
0x80
PIXEL_1
GOTO
FIN_X2
FIN_X1
;X1.5
;-------------------------------BTFSC
CONTGAIN, 0
GOTO
FIN_X1.5
BTFSS
CONTGAIN, 1
GOTO
FIN_X1.5
;1
MOVLW
SUBWF
BTFSS
GOTO
BSF
MOVLW
MOVWF
0X39
YADDRESS, W
STATUS, Z
$+4
GENAUX, DISPMSG
0x88
PIXEL_1
;1
MOVLW
SUBWF
BTFSS
GOTO
BSF
MOVLW
0X3A
YADDRESS, W
STATUS, Z
$+4
GENAUX, DISPMSG
0xF8
146 - 151
PIXEL_1
;1
MOVLW
SUBWF
BTFSS
GOTO
BSF
MOVLW
MOVWF
0X3B
YADDRESS, W
STATUS, Z
$+4
GENAUX, DISPMSG
0x80
PIXEL_1
; PUNTO
MOVLW
SUBWF
BTFSS
GOTO
BSF
MOVLW
MOVWF
0X3C
YADDRESS, W
STATUS, Z
$+4
GENAUX, DISPMSG
0x80
PIXEL_1
;5
MOVLW
SUBWF
BTFSS
GOTO
BSF
MOVLW
MOVWF
0X3D
YADDRESS, W
STATUS, Z
$+4
GENAUX, DISPMSG
0xB8
PIXEL_1
;5
MOVLW
SUBWF
BTFSS
GOTO
BSF
MOVLW
MOVWF
0X3E
YADDRESS, W
STATUS, Z
$+4
GENAUX, DISPMSG
0xA8
PIXEL_1
;5
MOVLW
SUBWF
BTFSS
GOTO
BSF
MOVLW
MOVWF
0X3F
YADDRESS, W
STATUS, Z
$+4
GENAUX, DISPMSG
0xE8
PIXEL_1
GOTO
FIN_X2
FIN_X1.5
;X2
;-------------------------------BTFSS
CONTGAIN, 0
GOTO
FIN_X2
BTFSS
CONTGAIN, 1
GOTO
FIN_X2
;2
MOVLW
SUBWF
BTFSS
GOTO
BSF
MOVLW
MOVWF
0X39
YADDRESS, W
STATUS, Z
$+4
GENAUX, DISPMSG
0xE8
PIXEL_1
;2
MOVLW
SUBWF
BTFSS
GOTO
0X3A
YADDRESS, W
STATUS, Z
$+4
147 - 151
0xA8
PIXEL_1
GENAUX, DISPMSG
;2
MOVLW
SUBWF
BTFSS
GOTO
BSF
MOVLW
MOVWF
0X3B
YADDRESS, W
STATUS, Z
$+4
GENAUX, DISPMSG
0xB8
PIXEL_1
FIN_X2
FIN_MENSAJES
;-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
GENAUX, DISPMSG
BTFSS
GOTO
BTFSS
GOTO
;--------
GENAUX, PAUSA
$+3
GENAUX, DISPMSG
SALTO_PAUSA
MOVF
MOVWF
PIXEL_1, W
DISPLAY_DATA
BSF
BCF
CALL
BSF
CALL
BCF
NOP
DISPLAY_CTRL, DATA_NEGINSTR
DISPLAY_CTRL, READ_NEGWRITE
WAIT_DISPLAY
DISPLAY_CTRL, ENABLE
WAIT_DISPLAY
DISPLAY_CTRL, ENABLE
SALTO_PAUSA
MOVF
BTFSS
GOTO
PAGINA, W
STATUS, Z
CLEAR_COL_BUCLE
RETURN
CAMBIAR_PAGINA
;Esto Intercambia los bits CS1 con CS2
BTFSS
DISPLAY_CTRL, CS1
BSF
DISPLAY_CTRL, CS1
BTFSS
DISPLAY_CTRL, CS2
BCF
DISPLAY_CTRL, CS1
BCF
BTFSS
BSF
DISPLAY_CTRL, CS2
DISPLAY_CTRL, CS1
DISPLAY_CTRL, CS2
CLRF
RETURN
YADDRESS
148 - 151
Anexo VII
Recursos
149 - 151
Anexo VIII
Esquema electrnico completo
150 - 151