Está en la página 1de 54

Universidad de Buenos Aires

Facultad De Ingenierı́a
5 de julio de 2013

Laboratorio de Microcomputadoras (66.09)

Holter

Registro electrocardigráfico portátil

Autores:
Cuomo, Joaquı́n M.
Riobó, Lucas M.
Sanchez, Eduardo H.

66.09 - Laboratorio de Microcomputadoras Ing. Ratto - Ing. Pucci


Facultad de Ingenierı́a Laboratorio de Microcomputadoras (66.09)

Índice
1. Objetivo 3

2. Marco Teórico 3
2.1. ¿Qué es un monitor Holter? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
2.2. ¿Cómo se realiza el estudio? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
2.3. ¿Cómo se obtienen los resultados? . . . . . . . . . . . . . . . . . . . . . . . . . . 4
2.4. ¿Qué riesgos tiene el estudio? . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
2.5. ¿Qué contraindicaciones hay? . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
2.6. ¿Para qué sirve el estudio? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4

3. Especificaciones del monitor Holter 5

4. Diseño del monitor Holter 6

5. Diseño del Hardware 7


5.1. Procesamiento analógico . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
5.1.1. Electrodos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
5.1.2. Preamplificador . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
5.1.3. Amplificador y filtro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
5.1.4. RL drive . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
5.2. Procesamiento digital . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
5.2.1. CPU . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
5.2.2. Conversor AD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
5.2.3. Display . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
5.2.4. Memoria SD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
5.2.5. Transmisión Serie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
5.2.6. Alimentación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
5.2.7. Interacción con el usuario . . . . . . . . . . . . . . . . . . . . . . . . . . 15

6. Implementación del Hardware 16


6.1. Procesamiento analógico . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
6.2. Procesamiento digital . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
6.2.1. Componentes necesarios . . . . . . . . . . . . . . . . . . . . . . . . . . . 18

7. Diseño del software 19


7.1. Programa principal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
7.2. Interrupciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
7.3. Conversión AD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
7.4. Almacenamiento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
7.5. Interfaz con el usuario . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
7.6. Interfaz gráfica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
7.7. Comunicación serie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
7.8. Procesamiento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24

8. Conclusiones 25
8.1. Problemas encontrados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25

Bibliografı́a 26

2
Facultad de Ingenierı́a Laboratorio de Microcomputadoras (66.09)

27

Anexo 27

A. Fundamentos teóricos del monitor Holter 27


A.1. Electrofisiologı́a cardı́aca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
A.2. Análisis preliminar de registros electrocardiográficos . . . . . . . . . . . . . . . . 29

B. Herramientas utilizadas para el desarrollo del proyecto 32


B.1. Programador . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
B.1.1. Diseño del programador . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
B.1.2. Implementación del programador . . . . . . . . . . . . . . . . . . . . . . 33
B.2. Programa de diseño y simulación: Proteus . . . . . . . . . . . . . . . . . . . . . 34
B.3. Simulación de puertos serie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
B.4. Cable Serie-USB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
B.5. Programa para recibir datos del puerto serie . . . . . . . . . . . . . . . . . . . . 36
B.6. Programa para visualizar los datos de la memoria SD . . . . . . . . . . . . . . . 36
B.7. Programa para visualizar los registros electrocardiográficos del puerto serie . . . 37

C. Código Fuente 38
C.1. MAIN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
C.2. Interrupcion TIMER 0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
C.3. Interrupcion Externa 0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
C.4. Interrupcion Externa 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
C.5. Procesamiento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
C.6. Alamcenamiento SD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
C.7. Display 7 Segmentos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
C.8. Transmición Serie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
C.9. Conversión Analogca Digital . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53

3
Facultad de Ingenierı́a Laboratorio de Microcomputadoras (66.09)

1. Objetivo
Se pretende implementar un monitor Holter que registre la actividad electrocardiográfica y
la guarde en memoria para su posterior evaluación médica.

2. Marco Teórico
2.1. ¿Qué es un monitor Holter?
Prueba diagnóstica que permite el registro de la actividad eléctrica del corazón de forma
continua durante un determinado perı́odo de tiempo preestablecido. El registro se realiza me-
diante el empleo de aparato conocido como holter cardı́aco formado por unos electrodos (que
sensan las señales eléctricas procedentes del corazón) conectados a un grabador en el que quedan
registrados los datos obtenidos para su análisis posterior.

2.2. ¿Cómo se realiza el estudio?


El paciente debe acudir al centro médico u hospital de referencia para la colocación del hol-
ter. Los electrodos se colocan sobre el tórax a la altura del corazón bajo la ropa y se conectan
a un monitor de bajo peso y pequeño tamaño que suele colocarse sobre un cinturón o en el
interior de un bolsillo.

Figura 1: Holter colocado en un paciente

El estudio se realiza de forma ambulatoria, es decir fuera del centro médico u hospital, por
lo que una vez colocado el holter el paciente pude proseguir con su actividad diaria habitual.

4
Facultad de Ingenierı́a Laboratorio de Microcomputadoras (66.09)

Al paciente se le solicitará que anote determinadas circunstancias que a lo largo del dı́a
puedan producir variaciones en el registro eléctrico como las horas en la que toma determina-
dos fármacos, la realización de esfuerzos fı́sicos, la hora en la que inicia el descanso nocturno,
etcétera.

La duración del estudio varı́a en función de las razones por las cuáles se realiza, pero en
general el registro suele realizarse durante 24-48 horas.

2.3. ¿Cómo se obtienen los resultados?


Una vez que se devuelve el grabador al Departamento de Cardiologı́a, se recuperará la
información del monitor y será escaneada por un técnico. Luego un cardiólogo analiza la infor-
mación y se envı́a un informe al médico que le indicó la prueba ó el mismo médico observará los
registros.

2.4. ¿Qué riesgos tiene el estudio?


El estudio no tiene riesgos para el paciente. En pieles sensibles puede aparecer una irritación
transitoria (dermatitis de contacto) en la zona de la piel sobre la que se coloca el electrodo.

2.5. ¿Qué contraindicaciones hay?


No existen contraindicaciones para realizar el estudio.

El paciente debe comunicar a su médico si realiza algún tipo de tratamiento especialmente


si es para el corazón o para el control de la tensión arterial.

El paciente debe evitar el contacto con fuentes de alto voltaje, detectores de metales o
imanes.

2.6. ¿Para qué sirve el estudio?


El estudio holter cardı́aco es una prueba diagnóstica segura y relativamente sencilla amplia-
mente utilizada en el campo de la Cardiologı́a. Permite el estudio de enfermedades del corazón
cuyo origen sean alteraciones del sistema de conducción eléctrico del corazón.

El registro permite detectar alteraciones del ritmo, la frecuencia (número de latidos por
minuto) y detectar zonas del corazón que no reciben impulsos eléctricos o que los reciben de
forma insuficiente o anormal.

El estudio permite por tanto detectar alteraciones como bradicardia (frecuencia cardı́aca
lenta), taquicardia (frecuencia cardı́aca rápida), bloqueos (impulsos eléctricos que no se tras-
miten o se trasmiten de forma alterada), infartos (zonas del corazón que no responden a los
impulsos eléctricos), etcétera.

5
Facultad de Ingenierı́a Laboratorio de Microcomputadoras (66.09)

3. Especificaciones del monitor Holter


Se propone realizar un monitor Holter de las siguientes caracteristicas:

• Utilizar una sola derivación


Debido a la redundancia de hardware necesario para realizar la adquisición de todas las
derivaciones necesarias se decide registrar únicamente la derivación II que presenta infor-
mación suficiente para detectar algunas de las patologı́as más comunes.

• Registrar 24hrs
Se eligió por ser el perı́odo más habitual.

• Frecuencia de muestreo de 256Hz


Siguiendo los estandares se eligió esta frecuencia de muestreo que premite una buena vi-
sualización de los registros y facilita el post-procesamiento.

• Permitir registrar alteraciones externas a la adquisición


En la monitorizacion diaria pueden ocurrir ciertos accidentes que alteren la medición y
que luego sea mal interpretada. Como por ejemplo, tironeo de los cables, esfuerzos fı́si-
cos, contacto con altas tensiones, etc. Por lo tanto es necesario tener un registro de estos
momentos.

• Permitir la visualización de la frecuencia cardı́aca


Para poder corroborrar el correcto funcionamiento del equipo durante el dı́a (por ejemplo,
detectar que se corrió un electrodo) se debe poder visualizar el ritmo cardı́aco.

6
Facultad de Ingenierı́a Laboratorio de Microcomputadoras (66.09)

4. Diseño del monitor Holter

Figura 2: Diagrama en bloques del diseño

Mediante dos electrodos se capta la señal eléctrica producida por el corazón y se amplifica,
esta señal es realimentada al sujeto para aumentar el rechazo a modo común y es procesada
para poder ser convertida digitalmente y ser almacenada. La comunicación con la computadora
permite que los registros sean analizados por un médico para realizar el diagnostico.

Figura 3: Diagrama de flujo del diseño

Una vez iniciado el ECG se registra durante 24hrs y se especifican los avisos dados por el
paciente cuando hubo algún tipo de perturbación (hizo un esfuerzo, se movieron los electrodos,
etc.).

7
Facultad de Ingenierı́a Laboratorio de Microcomputadoras (66.09)

5. Diseño del Hardware


Para poder subdividir y simplicar el proyecto se lo divide en dos partes principales: una de
procesamiento analogico en la que se adquiere la señal y se la amplifica; y otro de procesamiento
digital, en la que se la procesa y almacena.

Figura 4: Diagrama ilustrativo

5.1. Procesamiento analógico

Figura 5: Diagrama en bloques del electrocardiografo

8
Facultad de Ingenierı́a Laboratorio de Microcomputadoras (66.09)

Figura 6: Esquematico del electrocardiografo

9
Facultad de Ingenierı́a Laboratorio de Microcomputadoras (66.09)

5.1.1. Electrodos
Son cables mallados en los cuales en una extremidad se encuentra un contacto con una cha-
pa semiconductora adherida por presión y en el otro extremo un conector RCA para conectar
a la placa.

5.1.2. Preamplificador
Uno de los lineamientos que se siguieron fue realizar una implementación de bajo costo, por
lo tanto en vez de utilizar amplificadores de instrumentación comerciales se lo implementó dis-
cretamente.

5.1.3. Amplificador y filtro


Otra consideración que se tuvo en cuenta fue realizar la etapa de ganancia incluida en los
filtros anti-aliasing (los cuales se utilizaron 2 Butterworth Sallen-Key para no tener ripple en
la banda de ganancia y menor banda de transición). No se tuvo en cuenta los ajustes de offset
en el amplificador de instrumentación debido al filtro pasa altos, y en la etapa de ganancia
tampoco debido a que el módulo adquisidor convierte tensiones entre 0v y 5v.

Figura 7: Respuesta en frecuencia del filtro analógico

El filtro se comporta como una pasabanda y tiene dos funcionalidades: quitar el ruido tanto
de bajas frecuencias (ruido muscular) como de altas frecuencias (ruido de linea y otros) y
también sirve de filtro anti-aliasing evitando solapamientos de los espectro imagen al momento
de muestrear la señal.

5.1.4. RL drive
El amplificador que realimenta a la pierna derecha resta la señal de modo común que entra
por los electrodos de las muñecas (el promedio de ambas).

10
Facultad de Ingenierı́a Laboratorio de Microcomputadoras (66.09)

5.2. Procesamiento digital


5.2.1. CPU

Figura 8: Esquematico del microprocesador AT89S8253

El microprocesador (AT89S8253) controla la lógica digital luego de la adquisición de la


señal. Para ello se le agregan las siguientes interfaces:

• ADC: para la conversión de la señal analógica a digital.

• ADAPTADOR DE TENSIÓN: para la transmición serie.

• SD: para el almacenamieto de las señales registradas.

• DISPLAYs: para mostrar la frecuencia cardiaca.

• BOTONES: para permitir la interacción del operario.

• LEDs: para indicar estados.

11
Facultad de Ingenierı́a Laboratorio de Microcomputadoras (66.09)

5.2.2. Conversor AD

Figura 9: Esquemático del conversor analogico-digital ADC0804

El conversor AD es el encargado de convertir la señal analógica en una discreta que forman


el dato que representa el valor de la señal en el instante del muestreo. Se utilizó el ADC0804 el
cual opera con la técnica de aproximaciones sucesivas para devolver un dato de 8 bits.

Sus principales ventajes son:

• Tiempo de muestreo de hasta 100µs.

• Compatibilidad con microcontroladores.

• Clock interno.

• Soporta tensiones de hasta 5v.

La frecuencia de muestreo la controla el microcontrolador con los pines de CS y WR. Se


decició hacer la conversión controlada y no en modo free-running 1 debido a que la aplicación
requiere un conocimiento exacto de la frecuencia de muestreo.

El ADC tiene la opción de utilizar un clock interno el cual se configura con un RC de la


siguiente manera:
1
Modo free-running:la conversión se realiza continuamente ni bien el ADC termina de realizar la conversion
previa. Se configura conectando WR con INTR y CS con RD.

12
Facultad de Ingenierı́a Laboratorio de Microcomputadoras (66.09)

Figura 10: Formula para calcular la frecuencia del clock interno del ADC. VT es la tensión
threshold del pin CLKIN.

Con la resistencia de 10kΩ y el capacitor de 150pF se consigue una frecuencia de clock de


640kHz que es el valor tipico que especifica la hoja de datos del fabricante.

5.2.3. Display

Figura 11: Esquemático de los display de 7 segmentos catodo común

Se utilizarón 3 display de 7 segmentos para poder visualizar la frecuencia cardiaca cuando


el usuario lo requiera. Para limitar la corriente se utilizaron resistencias (R1-R8) y para poder
conmutar que display enceder se utilizaron transistores bipolares NPN (BC337) para poder
brindar la corriente necesaria.

13
Facultad de Ingenierı́a Laboratorio de Microcomputadoras (66.09)

5.2.4. Memoria SD

Figura 12: Esquemático de la memoria SD y del buffer 74LS5245

Se utilizó una memoria SD (Secure Digital) para almacenar el registro de 24 horas debido
a que se requieren (muestreando a 256 Hz):

Fmuestreo ∗ 24horas ∗ 60minutos ∗ 60segundos · bytes = 21,1M bytes


Además, esta tecnologı́a permite una interfaz SPI (Serial Peripheral Interface) que utiliza
solamente 4 conexiones con el microprocesador.

• MOSI-¿DI, por donde el microcontrolador envı́a a la memoria los comandos, datos y


direcciones.
• MISO¡-DO, por donde la memoria devuelve la respuesta a los comandos y los datos que
almacena.
• SCK-¿CLK, es la señal que permite sincronizar MOSI y MISO.
• CS-¿CS, es la señal de habilitación del dispositivo.

Figura 13: Daigrama de la memoria SD con el microcontrolador

14
Facultad de Ingenierı́a Laboratorio de Microcomputadoras (66.09)

El integrado 74LS245 es un buffer bidireccional que permite conectar dos componentes de


diferentes tecnológicas. En este caso la memoria SD trabaja con tensiones de 3.3v mientras que
el microcontrolador con tensiones de 5v. Fue necesario alimentarlo con 4.7v para mantenerlo
dentro de las tensiones de trabajo, por lo que se utilizó un diodo con 0.7v de forward bias.

5.2.5. Transmisión Serie

Figura 14: Esquemático de la interfaz serie con el MAX232

Para la transmisión serie se utilizó el MAX232 que convierte las tensiones que útiliza el
puerto serie para hacerlas compatibles con la tecnologı́a del microcontrolador.

5.2.6. Alimentación

Figura 15: Esquemático de la alimentación

La tensión de alimentación consiste en dos baterı́as de 9V (+9v y -9V) de las cuales se


alimenta la circuiteria digital a través de reguladores. Para la alimentación general se utilizó el
LM7805 que entrega 5v. Para lo memoria SD y el 74Ls245 se utilizó el LM7808 que entrega
3.3v,

15
Facultad de Ingenierı́a Laboratorio de Microcomputadoras (66.09)

5.2.7. Interacción con el usuario

Figura 16: Esquemático de los LEDs y pulsadores

Para indicaciones de control se utilizó un LED verde.

Para indicaciones de ritmo cardı́aco se utilizó un LED rojo.

Para habilitar los displays se utilizó un pulsador.

Para indicaciones de alteraciones externas se utilizó un pulsador.

16
Facultad de Ingenierı́a Laboratorio de Microcomputadoras (66.09)

6. Implementación del Hardware


6.1. Procesamiento analógico

Figura 17: PCB del procesamiento analógico

Figura 18: Fotografı́a de la placa del procesamiento analógico

17
Facultad de Ingenierı́a Laboratorio de Microcomputadoras (66.09)

6.2. Procesamiento digital

Figura 19: PCB del procesamiento digital

Figura 20: Vista 3D del PCB del procesamiento digital

18
Facultad de Ingenierı́a Laboratorio de Microcomputadoras (66.09)

6.2.1. Componentes necesarios

Figura 21: Listado de componentes de la placa digital

19
Facultad de Ingenierı́a Laboratorio de Microcomputadoras (66.09)

7. Diseño del software


7.1. Programa principal

Figura 22: Diagrama de flujo del programa principal

La mayor cantidad de operaciones y las mas importantes se realizan por medio de las inte-
rrupciones. En el programa principal únicamente se hacen comparaciones y cuando se detecta
un cambio que ocurrió durante una interrupción ejecutan la función adecuada. Podrı́a estar
dentro de las interrupciones mismas pero consume mas tiempo del que se dispone entre mues-
tras.

7.2. Interrupciones

Figura 23: Diagrama de flujo de las interrupciones

20
Facultad de Ingenierı́a Laboratorio de Microcomputadoras (66.09)

La interupción del timer 0 se encarga de realizar las muestras con el conversor AD a 256Hz,
guarda el dato en el buffer de procesamiento y en el de almacenamiento, a la vez que setea un
flag si uno de los buffer se llena para que en el programa principal se prosece o almacena, según
corresponda.

La interrupción externa 0 simplemente convierte el dato que contiene la cantidad de latidos


por minuto (obtenido en el procesamiento) y habilita el flag para que los displays sean encen-
didos en el programa principal.

La interrupción externa 1 advierte al médico de que hubo un error en la adquisición (el


aviso lo da el usuario) mostrando un pulso entero en 0v.

7.3. Conversión AD
Para realizar la conversión AD y la lectura es necesario seguir la siguiente secuencia de
pulsos:

Figura 24: Diagrama de tiempos para la conversión analógica-digital

21
Facultad de Ingenierı́a Laboratorio de Microcomputadoras (66.09)

7.4. Almacenamiento
Cada comando que envı́a el microcontrolador consta de 6 bytes:

• 1 que representa la acción que se desea realizar,


• 4 que corresponden al argumento de dicha acción y
• 1 último byte de verificación.

Cuando el programa principal comienza, entre sus primeras tareas debe estar inicializar la
memoria para que esté lista para recibir los datos del muestreo. Para ello el microcontrolador
debe enviarle a la tarjeta SD el CMD0: 0x40 0x00 0x00 0x00 0x00 0x95, el cual inicia en modo
SPI. Cada vez que se envı́a un comando la memoria da una respuesta la cual debe validarse,
en este caso la respuesta en caso de setearse correctamente a CMD0 es 0x01.

Luego se sigue con el envı́o de los comandos CMD1: 0x41 0x00 0x00 0x00 0x00 0xFF y
CMD16: 0x50 0x00 0x00 0x02 0x00 0xFF, los cuales inician y configuran el tamaño de página
a utilizar en las memorias SD y MMC, en caso de hacerlo correctamente la memoria debe
responder con 0x00 en ambos casos.

Figura 25: Diagrama de flujo para la incicialización SD

Dado que en el caso de la memoria SD, el tamaño de página es de 512 Bytes y la memoria
RAM del microcontrolador disponible a utilizar como buffer es menor, la forma de almacenar
datos es la siguiente:

1. se envı́a el comando correspondiente, CMD24: 0x58 0x00 0x00 0x00 0x00 0xFF,
2. se valida la respuesta de la memoria (como antes, si todo es correcto devuelve 0x00),
3. cuando el buffer de datos está lleno se procede a vaciarlo enviando sus bytes a la memoria.

22
Facultad de Ingenierı́a Laboratorio de Microcomputadoras (66.09)

4. Esta última operación se repite tantas veces como sea hasta alcanzar los 512 bytes,
5. momento en el cual el microcontrolador envı́a 2 bytes para comunicar la finalización de
envı́o de datos.
6. Por último se queda esperando la respuesta de la memoria acerca de si fueron correcta-
mente recibidos los datos.

Figura 26: Diagrama de flujo para la escritura en memoria SD

7.5. Interfaz con el usuario


El LED rojo titila al compas del ritmo cardı́aco.

Figura 27: Diagrama de flujos del LED que indica el ritmo cardı́aco

23
Facultad de Ingenierı́a Laboratorio de Microcomputadoras (66.09)

7.6. Interfaz gráfica


Cuando el usuario presiona el pulsador de interrupción externa 1 se encienden los displays
mostrando el ritmo cardiaco durante unos instantes. Para ello una vez activados los displays se
cuenta cierto tiempo durante el cual se van conmutando los displays a una velocidad que no es
perceptible para el ojo humano.

Figura 28: Diagrama de flujos de los display de 7 segmentos

7.7. Comunicación serie


Debido a que el microcontrolador implementa por hardware una UART la transmición serie
es sencilla y consta de cargar el dato a transmitir en el buffer de la UART y esperar a que sea
enviado.

Figura 29: Diagrama de flujos de la transmición serie

24
Facultad de Ingenierı́a Laboratorio de Microcomputadoras (66.09)

7.8. Procesamiento
Para el procesamiento se trato de mantener tecnicas dentro de los estandares, pero debido
a que la capacidad de procesamiento del microcontrolador es reducida fue necesario simplificar
algunos pasos.

Figura 30: Diagrama de flujos del procesamiento realizado

25
Facultad de Ingenierı́a Laboratorio de Microcomputadoras (66.09)

8. Conclusiones
Como conclusión general del trabajo práctico se puede decir que con las herramientas apren-
didas en el curso se pueden desarrollar muchı́simas aplicaciones, especialmente de automatiza-
ción a un bajo costo.

Se ha descubierto un gran potencial en el manejo de los microcontroladores hasta hace poco


desconocido, que abre la puerta a un mundo digital con gran cantidad de ventajas.

El proyecto en si mostró las complicaciones de un trabajo que involucra el control de dis-


tintos dispositivos, y la diversificación de métodos que existen para el control de los mismos,
como también para resolver diferentes problemas.

El trabajo en lenguaje Assembler resultó interesante e instructivo para conocer a bajo nivel
como funcionan las cosas y cual es la lógica correcta que hay que utilizar, también útil para
programación en alto nivel.

8.1. Problemas encontrados


Durante la programación de la memoria SD nos encontramos con varias dificultades.

• La interfaz entre el microprocesador y la memoria incialmente se hico con divisores resis-


tivos pero no funciono porque deformaban la forma de onda de los pulsos de reloj y no
sincronizaba. Para solucionarlo se utilizo un buffer con adaptacdor de tensión.
• La simulación de la memoria SD se realizó con un modelo de memoria MMc y esto
ocasionó dificultades al mmomento de llevarlo a la realidad. El principal problema fue en
la paginación de la memoria, que en simuación permitı́a grabar de a 1 byte mientras que
en la SD es obligatorio utilizar paginas de 512bytes.
• El complicado manejo de comando SPI de longitud 6 bytes complicó la validación del
estado de la memoria. Para solucionarlo se tuvo que hacer un extenso debugging con la
memoria real.

Las complicaciones de conversor AD fueron:

• Inicialmente se muestreaba en modo free-running, lo cual no era admisible para la pre-


cision del proyecto. Para solucionarlo hubo que utilizar interrupciones para muestrear a
la frecuencia deseada, y la velocidad de muestreo estuvo condicionada por la cantidad
de procesamiento que se hacia. Para solucionarlo se aumento la frecuencia de trabajo del
ADC y el baudrate de la transmicion serie.
• Otro inconveniente fue en que demoramos en hacerlo funcionar porque no conseguiamos
respetar el diagrama de tiempos, hasta que se nos ocurrio utiliza rla instruccion ’nop’
para garantizar los tiempos detallados en la hoja de datos.
• Un detalle que tuvimos que tener en cuenta fue como aprovechar la maxima resolución
del ADC, para ello utilizamos los pines de v positivo y v negativo de forma de aplicar la
señal en modo diferencial y aprovechar todo el rango dinamico de entrada.

Esas fueron las complicaciones mayores respecto al diseño del proyecto. Ademas, hubo otras
dificultades con respecto al hardware que fueron solucionadas con paciencia.

26
Facultad de Ingenierı́a Laboratorio de Microcomputadoras (66.09)

Bibliografı́a
[1] The 8051 Microcontroller. Scott Mackenzie; 3a edición, 1995 Prentice Hall.
[2] 8-bit Microcontroller with 12K Bytes Flash. AT89S8253; Atmel.
[3] 32-bit Math Routines for the 8051. Rick Shuk; Intel, 1992.
[4] SPI Pogram Examples. 8051 Microcontrollers, Application Note; Atmel,2004.
[5] SandDisk Secure Digital Card. Product Manual; SandDisk Corporation,2003.
[6] Manejo de una memoria SD/MMC con un PIC16F87s. Scientia et Technica Año
XVI, No 44, Abril de 2010.
[7] Octal Bus Transceiver. SN54/74LS245; Motorola.
[8] 8-Bit µP Compatible A/D Converters. ADC0804; Texas Instruments, 2009.
[9] 1.5A Low Dropout Positive Fixed 3.3v Regulator.IRU1015-33; International Rec-
tifier.
[10] Dual EIA-232 Drivers/Receivers. MAX232; Texas Instruments.
[11] 14mm Single Digit Numeric Display. SC56-11DBH; Kingbright.
[12] Programador AVR USB.
[13] Analog-to-Digital Conversion Techniques Using Zilog Z8 MCUs. Application
Note.
[14] Analog-to-Digital Conversion
[15] Analog Devices. Chapter 6: Analog Converters
[16] USART and Asynchronous Communication. Oregon State University.
[17] Serial Comunications. Silicon Labs.
[18] Devices and Comunication buses for devices networks. Raj Kamal; McGraw
Hill, 2008.
[19] Homemade Electrocardiograph
[20] Electrocardiograph: Precordial Leads Explained
[21] Fundamentals of Electrocardiography Interpretation. Daniel Becker; Anesth
Prog, 2006.
[22] Electrocardiograph, ECG. World Health Organization.
[23] Simulación del algoritmo Pan-Tompkins para la detección de intervalos
qrs en tiempo rea. Edwin Andrés Quintero Salazar y Juan David Valencia Parra.
[24] Módulo de Procesamiento de Señales Electrocardiográficas para un Sis-
tema de Tele-monitoreo Vı́a Internet . Jacobo Schneider, Maryana Escalante, Mary
Dı́az.
[25] Electrocardiograma. Departamentos de ciencias fisiologicas; Guias de Laboratorio.

27
Facultad de Ingenierı́a Laboratorio de Microcomputadoras (66.09)

A. Fundamentos teóricos del monitor Holter

A.1. Electrofisiologı́a cardı́aca

El corazón es un órgano muscular que tiene autonomı́a de funcionamiento, formado por dos
bombas que trabajan en paralelo para hacer circular la sangre por el cuerpo. Esta formado por
3 capas musculares: endocardio (incluye las fibras musculares de Purkinje), el miocardio (es la
masa muscular contráctil) y el pericardio (recubre al corazón).

Un potencial de acción es una onda que viaja a lo largo de la membrana celular modificando
la polaridad del interior de la célula respecto al exterior. Esta despolarizacóon y repolarización
(luego de pasar la onda) se produce por la apertura de los canales voltaje dependientes de
sodio al haberse alcanzado un potencial umbral por algún estı́mulo externo. Normalmente la
repolarización se produce en un lapso similar a la despolarización (por ejemplo en las células
neuronales), pero en las células cardı́acas ocurre en un tiempo mayor, permitiendo al corazón
bombear correctamente. Este tiempo adicional ocurre por la apertura de los canales de voltaje
de calcio (ingresa) a la par que los de potasio (sale) manteniendo casi constante la diferencia
de potencial entre el interior y exterior de la célula.

Figura 31: A la izquierda un potencial de acción tı́pico en la mayorı́a de las células con los
diferentes periodos. A la derecha el de una célula del miocardio con los iones responsables del
potencial y su morfologı́a

En electrofisiologı́a se mide el potencial de acción que se transmite en el corazón. Particu-


larmente en este órgano hay células especializadas que generan potenciales de acción automáti-
camente (en el nodo sinusal, denominado ’marcapasos’, y en caso de necesidad en el nodo
atrio-ventricular) debido a que no alcanzan un potencial de reposo, sino que siempre varı́a el
potencial y periódicamente supera el umbral. Igualmente, no son estos los potenciales que se
miden (en un ECG de superficie) sino el promedio de la transmisión de este potencial durante
la diastole y sistole.

28
Facultad de Ingenierı́a Laboratorio de Microcomputadoras (66.09)

Figura 32: Transmisión del impulso eléctrico en las diferentes partes del corazón y como con-
forman en promedio el electrocardiograma

El electrocardiograma es el registro de esta onda eléctrica, y puede ser registrada de diferen-


tes maneras (cada una corresponde a una derivación) diferenciándose en dos tipos: unipolares
(potencial respecto al nodo de Wilson que promedia otros potenciales) y bipolares (potencial
entre dos puntos). Dependiendo que derivación se utilice se obtendrá una proyección diferente
del vector de polarización del corazón.

Figura 33: Eje eléctrico del corazón descompuesto en la onda T y QRS (en celeste) y las diferen-
tes derivaciones unipolares (marrón) y bipolares (rojo). Cada derivación registra la proyección
del eje eléctrico en la dirección en la que se esquematiza.

29
Facultad de Ingenierı́a Laboratorio de Microcomputadoras (66.09)

El estudio de la actividad eléctrica del corazón toma importancia al ser un método económico
y eficaz para realizar diagnósticos del tipo cardı́aco y también neurológico. El analaisis del
registro electrocardiografico se puede dividir en dos grandes campos, en el campo del tiempo y
de la frecuencia.

A.2. Análisis preliminar de registros electrocardiográficos


Unas de las primeras mediciones que se puede hacer es reconstruir en eje eléctrico del corazón
mediante el registro de 3 derivaciones bipolares (DI, DII, DIII).

Figura 34: Eje electrico calculado en base a mediciones

Previo a realizar análisis más complejos con la ayuda de software se hizo un estudio com-
parativo entre registros tomados durante diferentes situaciones, como por ejemplo en reposo y
en ejercicio.

Figura 35: Durante la actividad fı́sica el cuerpo requiere un mayor consumo de oxı́geno, por lo
tanto el flujo de sangre debe ser mayor, produciendo un aumento de la frecuencia cardı́aca y
en la presión sanguı́nea (presión arterial)

30
Facultad de Ingenierı́a Laboratorio de Microcomputadoras (66.09)

Le frecuencia cardı́aca se encuentra modulada por diferentes sistemas, como por ejemplo el
nervioso y el respiratorio. En el caso del ejercicio hay un cambio en el balance entre el tono
simpático y parasimpático, lo mismo ocurre durante las dos fases de la respiración, aparte de
una modulación mecánica.

Una arritmia es una alteración del ritmo sinusal normal siendo uno de los casos cuando
el ritmo cardı́aco no es regular. Esto ocurre en la respiración produciendo la arritmia sino
respiratoria (durante la inspiración se acelera y en la espiración disminuye). El SNA (sistema
nervioso autónomo) es el responsable de estos cambios estimulando el nervio vago, el cual
mediante la liberación ó no de acetilcolina activa el parasimpático ó no, manteniendo el cuerpo
en situaciones normales ó acelerando el ritmo cardı́aco. Para comprobar esto se realizó un
registro durante un respiración profunda.

Figura 36: A la izquierda se muestra la PSD de un registro durante respiración profunda donde
se ve que toda la potencia esta concentrada en las bajas frecuencias y corresponde con la FR.
A la derecha esta el tacograma en donde se puede apreciar como esta modulado por la FR.

Como se mencionó el nervio vago influye en el SNA, y es uno de los principales responsables
en la regulación del sistema parasimpático debido a que inerva gran cantidad de órganos y partes
(como el corazón, la faringe, el estomago, páncreas, entre otros). Tiene aferencias parasimpáticas
en el corazón, en los bronquios y vı́sceras abdominales (también tiene aferencias sensitivas y
del núcleo ambiguo).

Figura 37: Inervaciones del sistema nervioso en el corazón.

31
Facultad de Ingenierı́a Laboratorio de Microcomputadoras (66.09)

Para ver los efectos del sistema parasimpático se procedió a realizar un experimento en
donde se estimule en nervio vago, una de las formas de conseguirlo es mediante la aplicación
de presión sobre el ojo.

Figura 38: Los sistemas simpáticos y parasimpáticos influyen a través de los plexos cardı́acos
en la base del corazón, divididos en dos: una superficial (ventral) y otra profunda (dorsal). Y
entra ambas hay ramas comunicantes

32
Facultad de Ingenierı́a Laboratorio de Microcomputadoras (66.09)

B. Herramientas utilizadas para el desarrollo del pro-


yecto
B.1. Programador
Para poder realizar la programación mediante el puerto USB se decidió armar un propio
programador[12] con un PIC que realizara la interfaz USB.

B.1.1. Diseño del programador

Figura 39: Esquematico del programador USB

El dip switch permite alimentar la placa con la tensión del puerto USB, disminuir la velo-
cidad de grabación y para hacer un upgrade del firmware del PIC.

El driver de la placa es: usbasp-windriver.2009-02-28.zip


La IDE para programar es: progisp168

33
Facultad de Ingenierı́a Laboratorio de Microcomputadoras (66.09)

B.1.2. Implementación del programador

Figura 40: PCB del programador USB

Figura 41: Foto de la placa del programador USB

34
Facultad de Ingenierı́a Laboratorio de Microcomputadoras (66.09)

B.2. Programa de diseño y simulación: Proteus


Tanto para la simulación de circuitos como para el diseño de los PCB se utilizó el progra-
ma Proteus (ARES e ISIS) debido a que en un mismo entorno permite simular componentes
analogicos como digitales, incluyendo codigo de microcontroladores.

Figura 42: Programa de simulación

35
Facultad de Ingenierı́a Laboratorio de Microcomputadoras (66.09)

B.3. Simulación de puertos serie


Para poder realizar simulaciones con el puerto serie fue necesario simular dos puertos co-
nectados, para ello se utilizo el Virtual Serial Port Driver.

Figura 43: Programa de simulación

B.4. Cable Serie-USB


Para poder trabajar comodamente con el puerto serie del Holter se utilizó el adaptador de
Noganet Serie-USB.

Figura 44: Adaptador Serie-USB

36
Facultad de Ingenierı́a Laboratorio de Microcomputadoras (66.09)

B.5. Programa para recibir datos del puerto serie


Para poder recibir los datos enviados por el puerto serie y hacer el debbuging pertinente se
utilizó la hyperteminal.

Figura 45: Hyperterminal

B.6. Programa para visualizar los datos de la memoria SD


Como la memoria SD se grabo en ’raw format’, es decir sin un sistema de archivos, no es
posible visualizar los datos con solo conectar la memoria a la computadora. Se requiere de un
software que lea a bajo nivel, y para ello se utilizó el WinHex.

Figura 46: WinHex para ver datos de la SD

37
Facultad de Ingenierı́a Laboratorio de Microcomputadoras (66.09)

B.7. Programa para visualizar los registros electrocardiográficos del


puerto serie
Para poder visualizar los datos enviados por el puerto serie desde el Holter y hacer el estudio
médico se utilizó Matlab.

Figura 47: Matlab

38
Facultad de Ingenierı́a Laboratorio de Microcomputadoras (66.09)

C. Código Fuente
C.1. MAIN

; Utilizacion de registros

; BANCO 0
; R0 : control de displays
; R1 : puntero al buffer SD
; R3 : contador de la posicion del buffer SD
; R6 , R7 : memoria SD

; Labels
LED1 equ P2.0
LED2 equ P1.3
; ADC
; Flags
rdi equ P3.4 ; Se~n al Read P1.0
wri equ P3.5 ; Se~n al Write P1.1
cs equ P3.6 ; Chip Select P1.2
intr equ P3.7 ; Se~n al INTR P1.3
adc_port equ P0 ; Pines de datos ADC P0
; DSP
; Constants
CERO_REF equ 255/5*2 ; si 5 v son 255 muestras...2v son 102
BUFF ER_DSP _LENG TH equ 5
PORCENTAJE_THRS equ 80
HR equ LED1
; 7 SEG
; Labels
seg7_en0 EQU P1.2
seg7_en1 EQU P1.1
seg7_en2 EQU P1.0
seg7_port EQU P2
; Constants
TIEMPO_DISPLAY EQU 5
; SD
; defino los 6 bytes del comando 0
cmd0_byte6 EQU 40 H
cmd0_byte5 EQU 00 H
cmd0_byte4 EQU 00 H
cmd0_byte3 EQU 00 H
cmd0_byte2 EQU 00 H
cmd0_byte1 EQU 95 H

cmd1_byte6 EQU 41 H ; defino los 6 bytes del comando 1


cmd1_byte5 EQU 00 H
cmd1_byte4 EQU 00 H
cmd1_byte3 EQU 00 H
cmd1_byte2 EQU 00 H
cmd1_byte1 EQU 0 FFH

cmd16_byte6 EQU 50 H ; defino los 6 bytes del comando 16


cmd16_byte5 EQU 00 H ; los bytes 5 , 4 , 3 y 2 se utilizan para defnir el tama~
n o de
cmd16_byte4 EQU 00 H ; que puede ser de 1 a 512 bytes.
cmd16_byte3 EQU 02 H ; En este caso esta configurado para paginas de 512 bytes =
cmd16_byte2 EQU 00 H ;
cmd16_byte1 EQU 0 FFH

39
Facultad de Ingenierı́a Laboratorio de Microcomputadoras (66.09)

cmd17_byte6 EQU 51 H ; defino los bytes que son fijos del comando 17 , para los otr
cmd17_byte1 EQU 0 FFH

cmd24_byte6 EQU 58 H ; defino los bytes que son fijos del comando 24 , para los otr
cmd24_byte1 EQU 0 FFH

ss EQU P1.4 ; Defino los terminales del protocolo spi


mosi EQU P1.5
miso EQU P1.6
sck EQU P1.7

error_sd EQU 0 FFH ; Defino variables de error / ok


ok_sd EQU 00 H

; ;; ;; ;; ;; ;; ;; ;; ;; ;; DATA STORAGE ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;
BSEG at 20 h
; INT1
ERRO R_ADQU SICIO N1 : DBIT 1
ERRO R_ADQU SICIO N2 : DBIT 1
; SD
PAGI NA_ENV IADA_ SD : DBIT 1 ; Flag de finalizado el envio de una pagina
HA BI LI TA R_ EN VI O_ SD : DBIT 1
; 7 SEG
ON_7SEG : DBIT 1
; DSP
BUFFER_DSP_LLENO : DBIT 1
; ***************************************************;
DSEG at 0030 h ; bytes 20 h -30 h reservados para flags
; ADC
DATO : DS 1
; DSP
BUFFER_DSP : DS BUFF ER_DSP _LENGT H
MAXIMO_DSP : DS 1
UMBRAL : DS 1
DIVIDENDO : ds 2
DIVISOR : ds 1
COCIENTE : ds 2
RESTO : ds 1
LATIDOS : ds 1
LATIDOS_prev : ds 1
aux1_division : ds 1
aux2_division : ds 1
aux_ proces amien to : ds 1
; 7 SEG
SEG7_0 : DS 1
SEG7_1 : DS 1
SEG7_2 : DS 1
; SD
cmd24_byte5 : ds 1 ; los bytes 5 , 4 , 3 y 2 se utilizan para definir la direccio
cmd24_byte4 : ds 1 ; donde se escribe. Estas variables deben ser escritas previ
cmd24_byte3 : ds 1 ; llamar a CMD_24.
cmd24_byte2 : ds 1
; SP
STACK : ds 1
; ***************************************************;

40
Facultad de Ingenierı́a Laboratorio de Microcomputadoras (66.09)

CSEG AT 0000 h
jmp INIT
; ;; ;; ;; ;; ;; ;; ;; ;; ;; INTERRUPCIONES ; ;;; ;; ;; ;; ;; ;; ;; ;;
CSEG AT 003 h
call E XT E R NA L _ IN T E RR UP T0
reti
CSEG AT 00 Bh ; interrupcion del timer 0: generador de frecuencia de sampleo
call TIMER0_INTERRUPT ; hago el sampleo
reti
CSEG AT 013 h ; interrupcion externa 1
call E XT E R NA L _ IN T E RR U P T1
reti
; ; ; ; ;; ; ; ;; ; ; ;; ; ; ;; ; ; CONSTANTES ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;
CSEG at 0030 H
INIT :
; ** ** ** ** ** ** ** ** ** INICIALIZACION * * * * * * * * * * * * * * * * * * * ;
mov SP ,# STACK -1
call SET_DSP
call SET_UART
call SET_ADC
call SET_MEMORIA
call SET_TIMER0_Fs
call SET_7SEG
call SET_INT0
call SET_INT1
mov IP ,#07 h ; seteo prioridades a las interrupciones que uso
; ***************************************************;
MAIN :
jnb PAGINA_ENVIADA_SD , NEXT1
call INICIAR_ENVIO_SD
clr PAGI NA_ENV IADA_S D
NEXT1 :
setb HA BI LI TA R_ EN VI O_ SD
jmp MAIN
; ***************************************************;
$include ( SEG7.inc )
$include ( DSP.inc )
$include ( UART.inc )
$include ( ADC.inc )
$include ( TIMER0.inc )
$include ( SD.inc )
$include ( INT0.inc )
$include ( INT1.inc )
END

41
Facultad de Ingenierı́a Laboratorio de Microcomputadoras (66.09)

C.2. Interrupcion TIMER 0


SET_TIMER0_Fs :
setb ET0 ; habilito interrupcion timer 0
setb EA ; habilito interrupciones
clr TR0 ; paro el timer
clr TF0 ; paro la interrupcion
anl TMOD ,#0 F0h ; borro solo lo del timer 0
orl TMOD ,#01 h ; timer 0 en 16 - bit
call RESET_T0 ; seteo delay y empiezo el timer 0
ret
; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
TIMER0_INTERRUPT :
call RESET_T0 ; seteo delay y empiezo el timer 0
call PRENDER_DISPLAY
jnb ERROR_ADQUSICION1 , NEXT_ERR_ADQ
mov DATO ,#0 FFh
clr ERR OR_ADQ USICIO N1
jmp A_GUARDAR
NEXT_ERR_ADQ :
jnb ERROR_ADQUSICION2 , USAR_ADC
mov DATO ,#000 h
clr ERR OR_ADQ USICIO N2
jmp A_GUARDAR
USAR_ADC :
call AD_CONV ; Convertı́ el dato de analogico a digital.
call AD_READ ; Leo el dato
A_GUARDAR :
jnb HABILITAR_ENVIO_SD , NEXT_TIMER0
clr H ABI LI TA R_ EN VI O_ SD
mov A , DATO ; Muevo el dato al AC
call ENVIAR_DATO_SD ; envio el byte a la SD
mov A , DATO ; Muevo el dato al ACC
call PROCESAR ; guarda en el buffer de procesamientomov
NEXT_TIMER0 :
ret
; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
RESET_T0 :
mov TH0 ,#0 F7h
mov TL0 ,#090 h ; seteo un delay de 1 ms
setb TR0 ; comienzo el timer0
ret

42
Facultad de Ingenierı́a Laboratorio de Microcomputadoras (66.09)

C.3. Interrupcion Externa 0


SET_INT0 :
setb EX0 ; habilito interrupcion externa 0
setb EA ; habilito interrupciones
setb IT0
ret
; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
E XT E R NA L _ IN T E RR U P T 0 :
push ACC
push B
mov C , P3.2
JNC miRET4
mov C , P3.2
JNC miRET4
jnb ON_7SEG , CONVERTIR_7SEG
call CLEAN_7SEG
miRET4 :
pop B
pop ACC
ret
CONVERTIR_7SEG :
call BIN_7SEG
setb ON_7SEG
call PRENDER_7SEG_0
pop B
pop ACC
ret
; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

C.4. Interrupcion Externa 1


SET_INT1 :
setb EX1 ; habilito interrupcion externa 1
setb EA ; habilito interrupciones
setb IT1
clr ERR OR_ADQ USICIO N1
clr ERR OR_ADQ USICIO N2
ret
; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
E XT E R NA L _ IN T E RR U P T 1 :
mov C , P3.3
JNC miRET5
mov C , P3.3
JNC miRET5
setb ERRO R_ADQU SICION1
setb ERRO R_ADQU SICION2
miRET5 :
ret

43
Facultad de Ingenierı́a Laboratorio de Microcomputadoras (66.09)

C.5. Procesamiento
; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
SET_DSP :
mov MAXIMO_DSP ,#0 ; Inicializo el maximo de deteccion de latidos
mov UMBRAL ,#0 ; Inicializo el umbral de deteccion de latidos
mov LATIDOS ,#0
mov DPTR ,#0
clr HR
ret
; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
PROCESAR :
call CALCULAR_UMBRAL
call C OM P A RA R _ CO N _ UM BR AL
call CONTADOR_LATIDOS
ret
; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
CALCULAR_UMBRAL :
cjne A , MAXIMO_DSP , BUSCAR_MAXIMO ; compara el valor actual con el PicoDetecta
jmp miRET ; si es igual termina
BUSCAR_MAXIMO :
jc miRET ; si es menor termina
mov MAXIMO_DSP , A ; si es mayor lo reemplaza por el nuevo
call A P LI C A R_ 8 7 po r c ie n t o ; si hay nuevo max , actualizo el umbral
mov UMBRAL , A
ret
; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
C OM P A RA R _ CO N _ UM B R A L :
cjne A , UMBRAL , COMP1 ; comparo la se~ n al con el umbral
jmp miRET ; si son iguales no hago nada
COMP1 :
jnc ES_NUEVO_LATIDO ; si la se~n al es mayor la dejo pasar
clr HR
ret
ES_NUEVO_LATIDO :
jb HR , miRET ; si HR ya esta en uno termino
setb HR ; sino lo pongo en 1
inc LATIDOS ; sumo 1 latido
jmp miRET
; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
CONTADOR_LATIDOS :
; cuenta 15 segundos y multiplica x 4
inc DPTR
mov A , DPH
cjne A ,#01 Dh , miRET ; 15 seg x 250 Hz x 2 = 1 D4Ch
mov A , DPL
cjne A ,#04 Ch , miRET ; 15 seg x 250 Hz x 2 = 1 D4Ch
mov A , LATIDOS
clr C
rlc A
clr C
rlc A
mov LATIDOS_prev , A
mov LATIDOS ,#0
mov DPTR ,#0
ret
; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
A PL I C AR _ 8 7p o r ci e n t o :
mov B ,#7 ; 7/8=87 .5 %
mul AB ; High = B

44
Facultad de Ingenierı́a Laboratorio de Microcomputadoras (66.09)

call DIV_x2 ; divide A /2/2/2= A /8


call DIV_x2
call DIV_x2
ret
; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
DIV_x2 :
clr C
xch A , B ; High = A
; jz A C C _ C E R O _ 3 d i v i s i o n e s
rrc A ; High = A
xch A , B ; High = B
rrc A ; High = B
ret
; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
BUFF_DSP :
jb BUFFER_DSP_LLENO , miRET
call CONTADOR_LATIDOS
mov @R0 , DATO ; Guardo el dato en un buffer de BUFFER_LENGHT
inc R0 ; Aumento una posicion en el BUFFER
djnz R2 , miRET ; Si el BUFFER no esta lleno sigo
setb BUFFER_DSP_LLENO
call procesar
clr BUFFER_DSP_LLENO
R ES E T EA T _ BU F F ER _ D S P :
mov R0 ,# BUFFER_DSP
mov R2 ,# BUFFE R_DSP_ LENGTH
miRET : ret
; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
DERIVAR :
mov R0 ,# BUFFER_DSP
mov R2 ,# BUFFER_DSP_LENGTH -1
NEXT_DERIVAR :
mov B , @R0
inc R0
mov A , @R0
call DERIVADA
dec R0
mov @R0 , A
inc R0
djnz R2 , NEXT_DERIVAR
ret
; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
RECT_MEDIA_ONDA :
CJNE A ,# CERO_REF , MAYORoMENOR ; compara si la tension es positiva o neativ
jmp miRET ; si es igual termina
MAYORoMENOR :
JNC miRET ; si es positiva termina
mov A ,# CERO_REF ; si es negativa lo reemplaza por 0
ret
; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
DERIVADA :
subb A , B ; hace la diferencia entre X ( n ) - x (n -1)
jnc miRET
mov A ,#0
jnb OV , miRET
mov A ,#0 ; si hubo overflow pone un 0 .
ret
; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
DIV_16_8 :
clr A ; Borra el Carry

45
Facultad de Ingenierı́a Laboratorio de Microcomputadoras (66.09)

cjne A , DIVISOR , OK_16_8


DIVxCERO :
setb OV
ret
OK_16_8 :
mov COCIENTE , A
mov R4 ,#8
mov R5 , DIVIDENDO
mov aux1_division , DIVIDENDO +1
mov aux2_division , A
mov A , aux1_division
mov B , DIVISOR
div AB
mov COCIENTE +1 , A
mov aux1_division , B
X2_16_8 :
mov A , R5 ; Mueve el LowB del divisor
rlc A ; Shift el LowB a la izq y pone el carry
mov R5 , A ; Updatea el LowB del divisor
mov A , aux1_division ; repite con el HighB
rlc A
mov aux1_division , A
mov A , aux2_division
rlc A
mov aux2_division , A
COMPARAR_16_8 :
cjne A ,#0 , LISTO_16_8
mov A , aux1_division
cjne A , DIVISOR , LISTO_16_8
cjne R5 ,#0 , LISTO_16_8
LISTO_16_8 :
CPL C ; Invierte ek C asi puede ser copiado directamente en el res
SET_COCIENTE :
mov A , COCIENTE
rlc A ; Shift C flag en el resultado temporal
mov COCIENTE , A
jnb ACC.0 , loop_16_8
RESTAR_16_8 :
mov A , aux1_division
subb A , DIVISOR
mov aux1_division , A
mov A , aux2_division
subb A ,#0
mov aux2_division , A
loop_16_8 :
djnz R4 , X2_16_8 ; Cuenta para atras y repite
mov A , DIVISOR
mov B , COCIENTE
mul AB
mov B,A
mov A , DIVIDENDO
subb A , B
mov RESTO , A
clr OV
ret

46
Facultad de Ingenierı́a Laboratorio de Microcomputadoras (66.09)

C.6. Alamcenamiento SD
; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; RUTINAS PRINCIPALES ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;

; Seteo la memoria , esto incluye reiniciar la memoria , iniciarla en SPI y configurar


; Usa los registros R6 y R7 y por supuesto el acumulador A

SET_MEMORIA :
clr H ABI LI TA R_ EN VI O_ SD
setb PAGI NA_ENV IADA_ SD ; para que comience con el envio del comando de escri
mov R1 , #00 H ; registros que se usan como contadores de los datos enviados
mov R3 , #00 H

mov cmd24_byte5 , #00 H ; inicializo los bytes del cmd24 ( escritura )


mov cmd24_byte4 , #00 H ; para que empiezen a escribir en la posicion 00 00 00
mov cmd24_byte3 , #00 H ; de la memoria
mov cmd24_byte2 , #00 H

; mov cmd17_byte5 , #00 H ; inicializo los bytes del cmd17 ( lectura )


; mov cmd17_byte4 , #00 H ; para que empiezen a leer en la posicion 00 00 00 00
; mov cmd17_byte3 , #00 H ; de la memoria
; mov cmd17_byte2 , #00 H

; rutina para prender la meoria


setb ss ; apago la memoria
mov R6 , #40 H ; cargo al registro con 40 pulsos
call ENVIAR_PULSOS_SD
clr ss ; prendo la memoria
mov R6 , #40 H
call ENVIAR_PULSOS_SD
; fin de la rutina para activar la memoria

ENVIAR_CMD0_DE_NUEVO :
call ENVIAR_CMD0
call VALIDAR_CMD0
cjne A , # ok_sd , E N V I A R _ C M D 0 _ D E _ N U E V O ; si hubo error se envia de nuevo

ENVIAR_CMD1_DE_NUEVO :
call ENVIAR_CMD1
call VALIDAR_CMDS
cjne A , # ok_sd , E N V I A R _ C M D 1 _ D E _ N U E V O ; si hubo error se envia de nuevo

ENVIAR_CMD16_DE_NUEVO :
call ENVIAR_CMD16
call VALIDAR_CMDS
cjne A , # ok_sd , E N V I A R _ C M D 1 6 _ D E _ N U E V O ; si hubo error se envia de nuevo
ret

INICIAR_ENVIO_SD :
clr HA BI LI TA R_ EN VI O_ SD
call SD_RECIBIR_BYTE
call SD_RECIBIR_BYTE

call ENVIAR_CMD24 ; envio el comando para escribir


call VALIDAR_CMDS ; valido la respuesta de la SD

cjne A , #00 H , INICIAR_ENVIO_SD ; si hubo un error que vuelva a intentar a en

mov A , #0 FEH ; si no hubo error ( A =#00 H ) envio un token (# FEH ) a la memoria


call SD_ENVIAR_BYTE

47
Facultad de Ingenierı́a Laboratorio de Microcomputadoras (66.09)

setb HA BI LI TA R_ EN VI O_ SD
ret

ENVIAR_DATO_SD :
clr H ABI LI TA R_ EN VI O_ SD
call SD_ENVIAR_BYTE ; envio el dato del adc guardado en el acumulador
inc R3
cjne R3 , #00 H , SD_CONTINUAR
inc R1
cjne R1 , #02 H , SD_CONTINUAR
call FI NA LI ZA R_ EN VI O_SD

SD_CONTINUAR :
ret

FI NA LI ZA R_ EN VI O_ SD :
mov A ,#0 FFH ; al finalizar el envio del byte
call SD_ENVIAR_BYTE ; debo enviar #0 FFH 2 veces
mov A ,#0 FFH
call SD_ENVIAR_BYTE

SD_ESCRITURA_OK : ; espero hasta que los datos


call SD_RECIBIR_BYTE
cjne A , #0 FFH , S D _ P A G I N A _ S I G U I E N T E _ E S C R I B I R ; SD_ESCRITURA_05
sjmp SD_ESCRITURA_OK ; Si A =# FFH que vuelva a leer hasta encontrar la respu

SD_ESCRITURA_05 :
cjne A , #05 H , FIN_ESCRITURA_SD
; Si A =#05 H cambio a la pagina siguiente

SD_PAGINA_SIGUIENTE_ESCRIBIR :
mov A , cmd24_byte3
inc A
inc A
mov cmd24_byte3 , A
mov A , cmd24_byte3
cjne A , #00 H , FIN_ESCRITURA_SD
inc cmd24_byte4
mov A , cmd24_byte4
cjne A , #00 H , FIN_ESCRITURA_SD
inc cmd24_byte5

FIN_ESCRITURA_SD :
cpl P2.7
mov R1 , #00 H ; registros que se usan como contadores de los datos enviados
mov R3 , #00 H
setb PAGI NA_ENV IADA_S D ; para que comience con el envio del comando de escri
ret

; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; SUBRUTINAS BASICAS ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;
; SD_ENVIAR_BYTE envia un byte almacenado en el acumulador por el mosi.
; Adicionalmente guarda en el acumulador lo recibido por el miso que en general no e
; Pero facilita la implementacion posterior de SD_RECIBIR_BYTE.
; Nota importante : utiliza el REGISTRO 7 , asi que si al invocar la funcion este se m

SD_ENVIAR_BYTE :
setb miso ; pongo en nivel alto para que funcione como puerto de entradas
clr sck ; pongo el clock a nivel bajo ya que las lecturas se hacen con el fl
mov R7 ,#08 H ; cantidad de bits que transmito / recibo
SD_ENVIAR_CICLO :

48
Facultad de Ingenierı́a Laboratorio de Microcomputadoras (66.09)

mov C , ACC.7
mov mosi , C ; transmito el bit 7 del acumulador al mosi
setb sck ; seteo el clock para generar el flanco ascencente
mov C , miso ; guardo el bit que recibo por el miso al bit de carry
clr sck
mov ACC.7 , C ; finalmente lo guardo en el acumulador
rl A ; desplazo a la izquierda el acumulador
djnz R7 , SD_ENVIAR_CICLO ; repito lo anterior para los 8 bits
ret

; SD_RECIBIR_BYTE recibe un byte de la memoria SD. Esta debe permanecer siempre acti
; cual siempre debe enviarse # offh

SD_RECIBIR_BYTE :
mov A , #0 FFH
call SD_ENVIAR_BYTE
ret

; ENVIAR_PULSOS_SD envia la cantidad de pulsos que se defina en el registro 6


ENVIAR_PULSOS_SD :
call SD_RECIBIR_BYTE
djnz R6 , ENVIAR_PULSOS_SD
ret

; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ENVIO DE COMANDOS ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;

; reseteo la memoria para que trabaje con el protocolo spi


ENVIAR_CMD0 :
mov A , # cmd0_byte6
call SD_ENVIAR_BYTE
mov A , # cmd0_byte5
call SD_ENVIAR_BYTE
mov A , # cmd0_byte4
call SD_ENVIAR_BYTE
mov A , # cmd0_byte3
call SD_ENVIAR_BYTE
mov A , # cmd0_byte2
call SD_ENVIAR_BYTE
mov A , # cmd0_byte1
call SD_ENVIAR_BYTE
ret

; inicializo la memoria
ENVIAR_CMD1 :
mov A , # cmd1_byte6
call SD_ENVIAR_BYTE
mov A , # cmd1_byte5
call SD_ENVIAR_BYTE
mov A , # cmd1_byte4
call SD_ENVIAR_BYTE
mov A , # cmd1_byte3
call SD_ENVIAR_BYTE
mov A , # cmd1_byte2
call SD_ENVIAR_BYTE
mov A , # cmd1_byte1
call SD_ENVIAR_BYTE
ret

; configuro la paginacion de la memoria


ENVIAR_CMD16 :

49
Facultad de Ingenierı́a Laboratorio de Microcomputadoras (66.09)

mov A , # cmd16_byte6
call SD_ENVIAR_BYTE
mov A , # cmd16_byte5
call SD_ENVIAR_BYTE
mov A , # cmd16_byte4
call SD_ENVIAR_BYTE
mov A , # cmd16_byte3
call SD_ENVIAR_BYTE
mov A , # cmd16_byte2
call SD_ENVIAR_BYTE
mov A , # cmd16_byte1
call SD_ENVIAR_BYTE
ret

; envio el comando para escribir en la memoria en determinada dirección


ENVIAR_CMD17 :
mov A , # cmd17_byte6
call SD_ENVIAR_BYTE
mov A , cmd17_byte5
call SD_ENVIAR_BYTE
mov A , cmd17_byte4
call SD_ENVIAR_BYTE
mov A , cmd17_byte3
call SD_ENVIAR_BYTE
mov A , cmd17_byte2
call SD_ENVIAR_BYTE
mov A , # cmd17_byte1
call SD_ENVIAR_BYTE
ret

; envio el comando para escribir en la memoria en determinada dirección


ENVIAR_CMD24 :
mov A , # cmd24_byte6
call SD_ENVIAR_BYTE
mov A , cmd24_byte5
call SD_ENVIAR_BYTE
mov A , cmd24_byte4
call SD_ENVIAR_BYTE
mov A , cmd24_byte3
call SD_ENVIAR_BYTE
mov A , cmd24_byte2
call SD_ENVIAR_BYTE
mov A , # cmd24_byte1
call SD_ENVIAR_BYTE
ret

; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; VALIDACIONES ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;
; Valida la respuesta de la memoria al enviar CMD0
VALIDAR_CMD0 :
call SD_RECIBIR_BYTE ; despues de enviar CMD0 , leo que me devuelve la SD
cjne A , #0 FFH , VALIDAR_CMD0_01
sjmp VALIDAR_CMD0 ; A =# FFH. La memoria siempre responde # FFH mientras lo ha
; leyendo hasta obtener la respuesta

VALIDAR_CMD0_01 : cjne A , #01 H , VAL ID AR _C MD 0_ ER RO R


mov A , # ok_sd ; A =#01 H , significa que no hubo errores , la se~
n al de que no
sjmp FIN_VALIDAR_CMD0 ; es dejar el acumulador con #00 H

VA LI DA R_ CM D0 _E RR OR : mov A , # error_sd ; Hubo algun error. La se~


n al de que hubo error
; es dejar el acumulador con # FFH

50
Facultad de Ingenierı́a Laboratorio de Microcomputadoras (66.09)

FIN_VALIDAR_CMD0 :
ret

; esta rutina permite validar la respuesta a cualquier comando enviado


; ( excepto el CMD0 que tiene su propia validación )

VALIDAR_CMDS :
call SD_RECIBIR_BYTE ; despues de enviar un CMD , leo que me devuelve la SD
cjne A , #0 FFH , VALIDAR_CMDS_00
sjmp VALIDAR_CMDS ; A =# FFH. La memoria siempre responde # FFH mientras lo ha
; leyendo hasta obtener la respuesta

VALIDAR_CMDS_00 :
cjne A , #00 H , VAL ID AR_C MD S_ ER RO R
mov A , # ok_sd ; A =#00 H , significa que no hubo errores , la se~
n al de que no h
sjmp FIN_VALIDAR_CMDS ; es dejar el acumulador con #00 H

VA LI DA R_ CM DS _E RR OR : mov A , # error_sd ; Hubo algun error. La se~


n al de que hubo error
; es dejar el acumulador con # FFH

FIN_VALIDAR_CMDS :
ret

; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; FUNCION EXTRA ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;
; funcion para leer una posicion de memoria un unico dato
SD_LEER :
acall ENVIAR_CMD17 ; envio el comando para leer
acall VALIDAR_CMDS ; valido la respuesta de la SD
cjne A , #00 H , SD_LEER ; si hubo un error que vuelva a intentar a enviar el c

R EC I B IR _ D AT O S _C M D 17 :
acall SD_RECIBIR_BYTE
cjne A , #0 FFH , R E C I B IR _ D A T O S _ C M D 1 7 _ F E ; si es distinto me fijo si es el tok
sjmp R E CI B I R_ D A TO S _ CM D 1 7 ; mientras reciba # FFH vue

RECIBIR_DATOS_CMD17_FE :
cjne A , #0 FEH , R E C I B I R _ D A T O S _ C M D 1 7 _ E R R O R
acall SD_RECIBIR_BYTE ; si es el token lo que sigue es el dato que busco
mov buffer_lectura , A
sjmp S D _ P A G I N A _ S I G U I E N T E _ L E E R

RECIBIR_DATOS_CMD17_ERROR :
sjmp SD_LEER

SD_PAGINA_SIGUIENTE_LEER :
inc cmd17_byte2
mov A , cmd17_byte2
cjne A , #00 H , FIN_LECTURA_SD
inc cmd17_byte3
mov A , cmd17_byte3
cjne A , #00 H , FIN_LECTURA_SD
inc cmd17_byte4
mov A , cmd17_byte4
cjne A , #00 H , FIN_LECTURA_SD
inc cmd17_byte5

FIN_LECTURA_SD :
ret
; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

51
Facultad de Ingenierı́a Laboratorio de Microcomputadoras (66.09)

C.7. Display 7 Segmentos


; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
SET_7SEG :
mov SEG7_0 ,#0
mov SEG7_1 ,#0
mov SEG7_2 ,#0
mov R0 ,# TIEMPO_DISPLAY
call CLEAN_7SEG
ret
; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
BIN_7SEG :
mov A , LATIDOS_prev
mov B ,#100
div AB
call BCD_7SEG
mov SEG7_2 , A ; centenas
mov A , B
mov B ,#10
div AB
call BCD_7SEG
mov SEG7_1 , A ; decenas
mov A , B
call BCD_7SEG
mov SEG7_0 , A ; decimal
ret
; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
CLEAN_7SEG :
clr ON_7SEG
setb seg7_en0
setb seg7_en1
setb seg7_en2
ret
; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
PRENDER_7SEG_0 :
mov seg7_port , SEG7_0
setb seg7_en1
setb seg7_en2
nop ; por precaucion
clr seg7_en0
ret
; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
PRENDER_7SEG_1 :
mov seg7_port , SEG7_1
setb seg7_en0
setb seg7_en2
nop ; por precaucion
clr seg7_en1
ret
; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
PRENDER_7SEG_2 :
mov seg7_port , SEG7_2
setb seg7_en0
setb seg7_en1
nop ; por precaucion
clr seg7_en2
ret
; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
PRENDER_DISPLAY :
jnb ON_7SEG , miRET3

52
Facultad de Ingenierı́a Laboratorio de Microcomputadoras (66.09)

jnb seg7_en0 , DISPLAY0


jnb seg7_en1 , DISPLAY1
jnb seg7_en2 , DISPLAY2
miRET3 :
ret
DISPLAY0 :
djnz R0 , miRET3
mov R0 ,# TIEMPO_DISPLAY
jmp PRENDER_7SEG_1
DISPLAY1 :
djnz R0 , miRET3
mov R0 ,# TIEMPO_DISPLAY
jmp PRENDER_7SEG_2
DISPLAY2 :
djnz R0 , miRET3
mov R0 ,# TIEMPO_DISPLAY
jmp PRENDER_7SEG_0
; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
BCD_7SEG :
inc A
movc A , @A + PC
ret
DB 10000001 b ; 0 en 7 segmentos anodo comun
DB 11101101 b ; 1 en 7 segmentos anodo comun
DB 01000011 b ; 2 en 7 segmentos anodo comun
DB 01001001 b ; 3 en 7 segmentos anodo comun
DB 00101101 b ; 4 en 7 segmentos anodo comun
DB 00011001 b ; 5 en 7 segmentos anodo comun
DB 00010001 b ; 6 en 7 segmentos anodo comun
DB 11001101 b ; 7 en 7 segmentos anodo comun
DB 00000001 b ; 8 en 7 segmentos anodo comun
DB 00001101 b ; 9 en 7 segmentos anodo comun

53
Facultad de Ingenierı́a Laboratorio de Microcomputadoras (66.09)

C.8. Transmición Serie


SET_UART :
setb P3.0 ; RX Serial Port
setb P3.1 ; TX Serial Port
mov SCON ,#050 h ; 8 bit , permite recepcion
orl PCON ,#80 h ; double BaudRate
anl TMOD ,#00 Fh ; borro solo timer 1
orl TMOD ,#20 h ; contador autorecargable 8 bit
mov TH1 ,#249 ; 9600 Bd : con PCON.7 =1
setb TR1 ; comienza el timer1
; orl IE ,#090 h ; habilito interrupcion serial port
setb ES ; habilito interrupcion puerto serie
setb EA ; habilito interrupciones
ret
TX : ; Transmicion serie de lo que hay en el ACC
mov SBUF , A ; Paso al Serial Buffer lo que hay en el ACC
jnb TI , $ ; Espero a que la transmicion se complete
clr TI ; reseteo
ret

C.9. Conversión Analogca Digital


SET_ADC :
mov P0 ,#0 FFh ; seteo P0 como entrada
ret
AD_CONV : ; Conversion
clr cs ; Chip Select del ADC bajo
clr wri ; Pata Wr del ADC en nivel bajo
nop ; Espero un poquito
setb wri ; Pata wr del ADC en nivel alto
setb cs ; Chip Select del ADC Alto
jb intr , $ ; Esperemos a que el INTR se active ( INTR nos dice si el dat
ret
; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
AD_READ : ; Leemos el valor convertido.
clr cs ; Chip select bajo
clr rdi ; RD bajo
mov DATO , adc_port ; Los valores ahora estan en adc_port , que los m
setb rdi ; Make RD alto
setb cs ; Make CS alto
ret

54

También podría gustarte