Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Facultad De Ingenierı́a
5 de julio de 2013
Holter
Autores:
Cuomo, Joaquı́n M.
Riobó, Lucas M.
Sanchez, Eduardo H.
Í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
8. Conclusiones 25
8.1. Problemas encontrados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
Bibliografı́a 26
2
Facultad de Ingenierı́a Laboratorio de Microcomputadoras (66.09)
27
Anexo 27
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.
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.
El paciente debe evitar el contacto con fuentes de alto voltaje, detectores de metales o
imanes.
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)
• Registrar 24hrs
Se eligió por ser el perı́odo más habitual.
6
Facultad de Ingenierı́a Laboratorio de Microcomputadoras (66.09)
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.
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)
8
Facultad de Ingenierı́a Laboratorio de Microcomputadoras (66.09)
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.
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)
11
Facultad de Ingenierı́a Laboratorio de Microcomputadoras (66.09)
5.2.2. Conversor AD
• Clock interno.
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.
5.2.3. Display
13
Facultad de Ingenierı́a Laboratorio de Microcomputadoras (66.09)
5.2.4. Memoria SD
Se utilizó una memoria SD (Secure Digital) para almacenar el registro de 24 horas debido
a que se requieren (muestreando a 256 Hz):
14
Facultad de Ingenierı́a Laboratorio de Microcomputadoras (66.09)
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
15
Facultad de Ingenierı́a Laboratorio de Microcomputadoras (66.09)
16
Facultad de Ingenierı́a Laboratorio de Microcomputadoras (66.09)
17
Facultad de Ingenierı́a Laboratorio de Microcomputadoras (66.09)
18
Facultad de Ingenierı́a Laboratorio de Microcomputadoras (66.09)
19
Facultad de Ingenierı́a Laboratorio de Microcomputadoras (66.09)
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
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.
7.3. Conversión AD
Para realizar la conversión AD y la lectura es necesario seguir la siguiente secuencia de
pulsos:
21
Facultad de Ingenierı́a Laboratorio de Microcomputadoras (66.09)
7.4. Almacenamiento
Cada comando que envı́a el microcontrolador consta de 6 bytes:
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.
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 27: Diagrama de flujos del LED que indica el ritmo cardı́aco
23
Facultad de Ingenierı́a Laboratorio de Microcomputadoras (66.09)
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.
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.
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.
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)
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
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
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.
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).
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)
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.
33
Facultad de Ingenierı́a Laboratorio de Microcomputadoras (66.09)
34
Facultad de Ingenierı́a Laboratorio de Microcomputadoras (66.09)
35
Facultad de Ingenierı́a Laboratorio de Microcomputadoras (66.09)
36
Facultad de Ingenierı́a Laboratorio de Microcomputadoras (66.09)
37
Facultad de Ingenierı́a Laboratorio de Microcomputadoras (66.09)
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
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
; ;; ;; ;; ;; ;; ;; ;; ;; ;; 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)
42
Facultad de Ingenierı́a Laboratorio de Microcomputadoras (66.09)
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)
45
Facultad de Ingenierı́a Laboratorio de Microcomputadoras (66.09)
46
Facultad de Ingenierı́a Laboratorio de Microcomputadoras (66.09)
C.6. Alamcenamiento SD
; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; RUTINAS PRINCIPALES ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;
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
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
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_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
; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ENVIO DE COMANDOS ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;
; 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
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
; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; 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
50
Facultad de Ingenierı́a Laboratorio de Microcomputadoras (66.09)
FIN_VALIDAR_CMD0 :
ret
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
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)
52
Facultad de Ingenierı́a Laboratorio de Microcomputadoras (66.09)
53
Facultad de Ingenierı́a Laboratorio de Microcomputadoras (66.09)
54