UNIVERSIDAD AUTÓNOMA METROPOLITANA
UNIDAD IZTAPALAPA Ciencias Básicas e Ingeniería
Desarrollo de un metrónomo digital basado en el microcontrolador PIC16F873
Ingeniería Biomédica
Jorge Isaac Córdova Castillo
Asesores:
Oscar Yáñez Suárez Salvador Carrasco Sosa
México, 2003
1
I NTRODUCCIÓN
En la última década el estudio de la variabilidad de la frecuencia cardiaca (VFC) ha despertado un enorme interés tanto fisiológico como clínico, debido a que proporciona tanto un marcador no invasivo de la actividad del sistema nervioso autónomo como un indicador del riesgo de mortalidad en enfermos cardiovasculares.
La arritmia sinusal respiratoria (ASR) es el efecto que ejerce la respiración, a través de mecanismos centrales y periféricos, sobre la frecuencia cardiaca. El fenómeno es dependiente de la frecuencia respiratoria y del estado del sistema nervioso autónomo. la importancia clínica de la ASR radica en que es ampliamente utilizada como un medio de diagnóstico en una gran variedad de enfermedades (sobre todo cardiovasculares) y como condición para la correcta evaluación no invasiva de la sensibilidad de los barorreceptores.
En el laboratorio de Fisiología Humana de la UAM-I se realizan pruebas que involucran la medición de diversos parámetros, generalmente del tipo cardiopulmonar. Una de las pruebas que se realiza, es la que involucra el fenómeno conocido como arritmia respiratoria. Con el fin de resaltar y estandarizar la ASR, la maniobra se lleva a cabo manteniendo la frecuencia respiratoria constante entre 12 a 15 respiraciones por minuto, mediante el sonido marcado por un metrónomo; situación, que junto con la información contradictoria y escasa de su reproducibilidad, nos condujo a proponer un dispositivo novedoso que la mejore mediante un control más preciso del ritmo y amplitud respiratoria.
Se propuso el desarrollo de un metrónomo digital, que ayuda al paciente a sincronizar su respiración a una frecuencia y amplitud requerida, para lo cual se usan dos columnas de 64 y 80 LEDs colocados en forma vertical, en la barra de 64 LEDs se muestra al sujeto el ritmo respiratorio a seguir y la otra barra de 80 LEDs muestra la amplitud de inspiración y espiración por que realiza el sujeto. La idea es que en ambas barras de los LEDs inciden con una secuencia de encendido- apagado, es decir, se inicia el encendido con el primer LED de la parte baja de la barra y luego se van encendiendo uno a uno hasta finalizar con el último LED de la parte alta de la barra, en esta parte de encendido se le pide al sujeto que haga un ciclo inspiratorio, posteriormente se inicia una secuencia de apagado de los LEDs ahora desde la parte alta de la barra hasta la parte baja, en esta parte se le pide al sujeto que inicie el ciclo espiratorio y así se tendría un ciclo respiratorio. Estas columnas de LEDs son controladas con ayuda de dos microcontroladores PIC 16F873 (Microchip).
M ÉTODO
Debido a los requerimientos mencionados anteriormente, el metrónomo digital (figura 1) tiene dos
módulos, uno de ellos genera la frecuencia a seguir (patrón) con una barra de 64 LEDs rojos y el
otro módulo es el de adquisición, que es donde el Neumotacógrafo entrega la señal al
microcontrolador, realizando una conversión analógica-digital para mostrar el ciclo y amplitud
respiratoria que realiza el sujeto con 80 LEDs verdes.
Figura 1. Diagrama a bloques del instrumento desarrollado para el control de la frecuencia respiratoria.
D ESCRIPCIÓN DEL INSTRUMENTO
El sistema mínimo está basado en dos PIC 16F873 los cuales pertenecen a una subfamilia de microcontroladores PIC de gama media, que se identifica por tener memoria de programa de tipo FLASH además poseen un convertidor A/D de 10 bits de resolución y 5 canales de entrada. (Ver Apéndice donde se menciona las características del PIC).
El metrónomo digital genera un tren de impulsos, cuya frecuencia puede ser seleccionada. Este tren de impulsos entra a la barra de LEDs patrón, generando ciclos de encendido-apagado. Para lograr este tren de impulsos se utiliza el Timer del PIC 16F873. Se dispone de un teclado para seleccionar la frecuencia entre las opciones de: 0.025, 0.05, 0.10, 0.15, 0.20, 0.30, 0.40, 0.60, 0.80, 1.0 y 1.2Hz. La frecuencia seleccionada se visualizará en una pantalla de cristal liquido (LCD) (ver diagrama a bloques del instrumento, Figura 1).
De igual manera para la etapa de adquisición, la señal que le entrega el Neumotacógrafo al PIC la convierte a un tren de impulsos que entra a la barra de LEDs de adquisición generándose el proceso de encendido-apagado.
Descripción del sistema mínimo
Como se ha mencionado anteriormente, el sistema mínimo está construido alrededor del microcontrolador PIC 16F873. Se seleccionó este microcontrolador debido a su bajo costo, su convertidor A/D además de su fácil programación.
La herramienta para trabajar con el PIC 16F873 fue el ambiente integrado de desarrollo MPLAB
(IDE), disponible en la dirección de Internet: www.microchip.com, que consiste en un programa
que sirve para ensamblar archivos con la extensión ASM además del kit PICSTART Plus para grabar
al microcontrolador el programa una vez ensamblado y convertido en formato HEX y probar
posteriormente dicho programa utilizando los periféricos de que dispone.
3 El material empleado para la realización del sistema mínimo fue el siguiente:
Semiconductores
U1 – microcontrolador PIC 16F873 (para etapa de generación).
U2 – microcontrolador PIC 16F873 (para etapa de adquisición).
D1-D2 – IN4148, diodos de silicio.
Resistencias
(resistencias fijas a ¼ de Watt, y 5% tolerancia).
R1-R2 – 100 Ω R2-R3 – 10k Ω R3-R5 – 2.2k Ω Capacitores C1-C4 – 15 pF.
Material y partes adicionales S1-S2 – PUSH BUTTON.
XTAL1-XTAL2 – Cristal de cuarzo de 4MHz.
KB – Teclado de 12 teclas de arreglo matricial.
LCD – Pantalla de cristal liquido.
Tablilla perforada.
Conector Hembra para RJ45.
Conector Hembra para RJ11.
Alambre.
PIC de Generación
Se anexa diagrama del sistema mínimo (Figura 3), en donde se observa que no fue necesario
adicionar circuitos externos como memorias, lógicas de control o algún controlador periférico, la
conexión al microcontrolador se realizó de la siguiente manera: se conectó la circuiteria de reloj del
sistema, a las entradas OSC1/CLKIN, OSC2/CLKOUT (patas 9 y 10) además del circuito del reset a
la entrada MCLR#/Vpp/THV (pata 1), en el Puerto B (patas 21 a la 28) se conectó el LCD y
teclado (patas 7-14 del LCD) además del puerto A (patas 3,4 y 6) para las patas RS, R/W y #E del
LCD. El Puerto C es el encargado de realizar la generación de pulso de reloj (pata 18), entrada de
control So (pata 17) y del Clear (pata 16) hacia el arreglo en cascada de los registros de
corrimiento bidireccional 74LS299. La pata 11 del PIC genera un pulso de reset para el
neumotacógrafo a la frecuencia que se selecciona.
Figura 3. Esquema eléctrico de conexión del sistema mínimo basado en el PIC 16F873
para el módulo de generación.
5 PIC de Adquisición
El PIC en el cual realiza la adquisición (Fig. 4) es por medio del canal 2 de entrada (RA0/AN0), la circuiteria de reloj del sistema a las entradas OSC1/CLKIN y OSC2/CLKOUT (patas 9 y 10) además del circuito del reset a la entrada MCLR#/Vpp/THV (pata 1), el Puerto C es donde se genera el pulso de reloj (pata 14), pulso de control So (pata 12) además del Clear (pata 12) hacia el arreglo en cascada de los registros de corrimiento bidireccional 74LS299.
Figura 4. Esquema eléctrico de conexión del sistema mínimo basado en el PIC 16F873 para el módulo de adquisición.
Se tiene un proceso para la amplificación o atenuación de la señal del neumotacógrafo hacia el PIC, la cual sirve para determinar el volumen al cual va a trabajar el sujeto (ver Figura 5). El Integrado empleado es un amplificador operacional el TL084.
Figura 5. Etapa de amplificación/atenuación.
Descripción de las barras de LED’s
Las barras de LED’s están separadas para el módulo de generación y adquisición, basada en 8 y 10 circuitos de corrimiento bidireccional (74LS299) que controlan 64 y 80 LEDs respectivamente.
El 74LS299 es un registro de corrimiento universal bidireccional de 8 bits porque su contenido puede ser desplazado en cualquiera de dos direcciones, dependiendo de una entrada de control.
Las dos direcciones son llamadas “izquierda” (“left”) y “derecha” (“right”), aun cuando el diagrama lógico y el símbolo lógico no necesariamente se dibujen de esa manera, en el 74LS299, izquierda quiere decir “en la dirección de HQH hacia AQA”, mientras que derecha significa “en la dirección de AQA hacia HQH. Su símbolo se ilustra en la figura 6 y tabla su tabla de función en la tabla 1.
Figura 6. Símbolo lógico tradicional para el 74LS299
Entradas Estado Siguiente
Función S1 S0 QA* QB* QC* QD* QE* QF* QG* QH*
Retención 0 0 QA QB QC QD QE QF QG QH
Corrimiento a la derecha 0 1 RIN QA QB QC QD QE QF QG Corrimiento a la izquierda 1 0 QB QC QD QE QF QG QH LIN
Carga 1 1 AQA BQB CQC DQD EQE FQF GQG HQH
Tabla 1. Tabla de función para un registro de corrimiento universal de 8 bits 74LS299
El material empleado para la realización del módulo de la barra fue el siguiente:
Semiconductores U1-U18 – 74LS299.
L1-L72 – LEDs de color rojo opaco.
L73-L124 – LEDs de color verde opaco.
Resistencias
(resistencias fijas a ¼ de Watt, y 5% tolerancia).
R1-R124 – 330 Ω
Material y partes adicionales
Zócalos para Circuitos integrados para wire wrap.
Alambre para wire wrap.
Conector Hembra para RJ45.
Tablilla Perforada.
El diagrama de conexión en cascada para la generación se muestra en la figura 7 y para la
adquisición se muestra en la figura 8.
7
Figura 7. Diagrama de conexión de la barra de LED´s para la módulo de generación.
Figura 8. Diagrama de conexión de la barra de LED´s para el módulo de Adquisición.
9 Desarrollo del programa ensamblador
El desarrollo del software en ensamblador de ambos PIC’s se implemento de la siguiente forma:
Para el PIC generador de frecuencia:
a) Asignación de las 12 teclas de control:
“0 – 9” Representan dígitos.
“*” Representa que se inicie el programa cuando se solicita que confirme la frecuencia.
“#” Representa tecla para iniciar el funcionamiento de la barra de LED’s b) Inicialización de parámetros:
Se habilitan puertos, se limpian registros, se habilita el Display para mensajes y se habilita el teclado.
c) Despliegue de los mensajes:
Los mensajes desplegados son los siguientes:
Primer mensaje que es de bienvenida y se muestra en la pantalla en un intervalo de tiempo establecido.
Mensaje que solicita la frecuencia, este mensaje se muestra hasta que se introducen los dos dígitos para las frecuencias (solo pueden tomar estos valores) las cuales son
*:
02 – 0.025Hz 05 – 0.05Hz 10 – 0.10Hz 15 – 0.15Hz 20 – 0.20Hz 30 – 0.30Hz 40 – 0.40Hz 60 – 0.60Hz 80 – 0.80Hz 11 – 1.00Hz 12 – 1.20Hz
*Si se introduce un valor que no se ha establecido al programa, éste inmediatamente se reinicialaza, mostrando la primer pantalla.
Mensaje que confirma la frecuencia indicada en pantalla. Este mensaje espera a que sea introducidas las teclas “*” para cancelar (reinicialaza) o “#” para empezar a generar.
Último mensaje que se muestra para indicar que se esta generando.
Para poder teclear una nueva frecuencia, es necesario “resetear” el circuito, es decir, oprimir el push button y de esta manera aparecerá la primer pantalla.
El diagrama de flujo de lo mencionado anteriormente es mostrado en la figura 9.
Figura 9. Diagrama de flujo del programa generador de frecuencia.
El programa es el que se muestra en el anexo 1.
11 Registros de trabajo para el PIC de adquisición:
El funcionamiento del conversor A/D requiere la manipulación de cuatro registros:
1. ADRESH: parte alta del resultado de la conversión.
2. ADRESL: parte baja del resultado de la conversión.
3. ADCON0: registro de control 0.
4. ADCON1: registro de control1.
En la pareja de registros ADRESH:ADRESL se deposita el resultado de la conversión, que al estar compuesta por 10 bits, sólo son significativos 10 de los bit de dichas parejas.
El registro ADCON0 controla la operación del Convertidor A/D, mientras que el ADCON1 sirve para configurar las patitas de la Puerta A como las entradas analógicas o E/S digitales.
Los pasos que hay que efectuar para realizar la conversión A/D en el PIC se muestran a continuación:
1. Configurar el módulo C A/D
• Configurar las patitas que actuarán como entradas analógicas, las que trabajan como E/S digitales y las usadas para la tensión de referencia (ADCON1).
• Seleccionar el reloj de la conversión (ADCON0).
• Seleccionar el canal de entrada A/D (ADCON1).
• Activar el módulo A/D (ADCON0).
2. Activar, si se desea la interrupción escribiendo sobre PIE y PIR1
• Borrar el señalador ADIF.
• Poner a 1 el bit ADIE.
• Poner a 1 los bits habilitadores GIE y PEIE.
3. Tiempo de espera para que transcurra el tiempo de adquisición 4. Inicio de la conversión
• Poner a 1 el bit GO/DONE# (ADCON0).
5. Tiempo de espera para completar la conversión A/D que puede detectarse:
a. Por la exploración del bit GO/DONE#, que al completarse la conversión pasa a valer 0.
b. Esperando a que se produzca la interrupción sí se ha programado, al finalizar la conversión.
c. Aunque no se permita interrupción, el señalador ADIF se pondrá a 1 al final la conversión.
6. Leer el resultado en los 10 bits validos de ADRESH:L y borrar el flag ADIF
7. Para una nueva conversión regresar al paso 1 o al 2. EL tiempo de conversión por bit está definido por T
AD. Se exige esperar un mínimo de 2
.T
ADpara reiniciar la nueva conversión.
En la figura 10 se ofrece el diagrama de flujo sobre la operatividad del conversor A/D.
Figura 10. Organigrama de la operación del conversor A/D
El programa es el que se muestra en el anexo 2.
Resultados Obtenidos
El metrónomo digital cumple con los requisitos originalmente planeados, como ayuda para las pruebas cardiopulmunares, ya que en los pacientes pueden seguir con mucha facilidad el estimulo visual de la barra de adquisición comparada a la barra patrón, obteniéndose así un control más adecuado de la frecuencia y amplitud respiratoria.
La manera de comprobar de que la frecuencia que genera el PIC es la que realmente se desea fue
por medio del osciloscopio, donde se verificaba el tren de impulsos.
13 BIBLIOGRAFÍA.
1. Task Force of the European Society of Cardiology and the North American Society of Pacing and the Electrophysiology. “Heart rate Variability”:
standards of measurement, physiological interpretation, and clinical use”.
Circulation 1996; 93: 1043-1065.
2. Malik M. “Heart rate variability”. Curr opinion cardiol 1998; 13: 36-44 Saul JP, Cohen RJ. “Respiratory sinus arrhythmia”.
In: Levy MN, Schwarttz PJ, Editores, Vagal Control of the Heart: Experimental Basis and Clinical Implications, Futura Publishing Co. (EU), 1994: 511-535.
3. Microcontroladores PIC
Diseño práctico de aplicaciones José Ma. Angulo Usategui Ignacio Angulo Martínez Ed. Mc Graw Hill
4. Microcontroladores PIC
Diseño práctico de aplicaciones Segunda parte: PIC 16F87x José Ma. Angulo Usategui Susana Romero Yesa Ignacio Angulo Martínez Ed. Mc Graw Hill
5.- Diseño Digital Principios y Prácticas John F. Wakerly Ed. Prentice Hall
6.- http://www.microchip.com
7.- http://www.arrakis.es/~msyseng
Apéndice
M ICROCONTROLADOR PIC 16F873
Recursos Fundamentales
• Procesador de arquitectura RISC avanzada
• Juego de 35 instrucciones con 14 bits de longitud. Todas ellas se ejecutan en un ciclo de instrucción, menos la de salto que tarda dos.
• Frecuencia de 20 MHz.
• 4 K palabras de 14 bits para la memoria de código, tipo FLASH.
• 192 bytes de Memoria de Datos RAM.
• 128 bytes de memoria de datos EEPROM.
• 13 fuentes de interrupción internas y externas.
• 3 Puertos de entrada salida A, B, C.
• Pila con 8 niveles.
• Módulos de direccionamiento directo, indirecto y relativo.
• Perro guardián (WDT).
• Código de protección programable.
• Modo SLEEP de bajo consumo.
• Programación serie en circuito con dos patitas
• Voltaje de alimentación comprendido entre 2 y 5.5 V.
• Bajo consumo (menos de 2mA a 5 V y 5 MHz).
Dispositivos periféricos
• Timer0: temporizador-contador de 8 bits con predivisor de 8 bits.
• Timer1: temporizador-contador de 16 bits con predivisor.
• Timer2: temporizador-contador de 8 bits con predivisor y postdivisor.
• Dos módulos de Captura-Comparación-PWM.
• Conversor A/D de 10 bits.
• Puerto serie síncrono (SSP) con SPI e I2C.
• USART.
Diagrama de conexión
En la figura 2 se muestra en diagrama de distribución y asignación de las 28 patitas de los encapsulados PDIP (doble hilera de patitas de plástico) .
Figura 2. Diagrama de asignación y conexión de la patitas del PIC 16F873.
Apéndice
2 La asignación de funciones para las diferentes patitas es la siguiente:
Patitas de propósito general
• OSC1/CLKIN (9): entrada del cristal de cuarzo o del oscilador externo
• OSC2/CLKOUT (10): salida del cristal de cuarzo. En modo RC la patita OSC2 saca la cuarta parte de la frecuencia que se introduce por OSC1, que determina el ciclo de instrucción.
• VSS(8-19): conexión a Tierra.
• VDD(20): entrada de la alimentación positiva.
• MCLR#/VPP/THV(1): entrada de RESET o entrada del voltaje de programación o voltaje alto en el modo test.
Puerta A
• RA0/AN0 (2): puede actuar como línea digital de E/S o como entrada analógica al conversor AD (canal 0).
• RA1/AN1(3): igual que la RA0/AN0.
• RA2/AN2/VREF-(4): puede ser línea digital de E/S, entrada analógica o entrada del voltaje negativo de referencia.
• RA3/AN3/VREF+(5): línea digital de E/S, entrada analógica o entrada del voltaje de referencia positivo.
• RA4/T0CK1(6): línea digital de E/S o entrada del reloj del Timer0. salida con colector abierto.
• RA5/SS#/AN4(7): línea digital de E/S, entrada analógica o selección como esclavo de la puerta serie sincronía.
Puerta B
• RB0/INT (21): línea digital de E/S o entrada de petición de interrupción externa.
• RB1 (22): línea de E/S digital.
• RB2 (23): línea de E/S digital.
• RB3/PGM (24): línea digital de E/S o entrada de voltaje bajo para programación.
• RB4 (25): línea de E/S digital.
• RB5 (26): línea digital de E/S.
• RB6/PGC (27): línea digital de E/S. En la programación serie recibe las señales de reloj.
• RB7/PGD (28): línea digital de E/S. En la programación serie actúa como entrada de datos.
Puerta C
• RC0/T1OSO/T1CKI (11): línea digital de E/S o salida del oscilador del Timer1 o como entrada de reloj del Timer1.
• RC1/T1OSI/CCP2 (12): línea digital de E/S o entrada al oscilador del Timer1 p entrada al módulo de captura2/salida Comparación2/salida de PWM2.
• RC2/CCP1 (13): E/S digital. También puede actuar como entrada Captura1/Salida Comparación1/salida de PWM1.
• RC3/SCK/SCL (14): E/S digital o entrada de reloj serie sincronizada/salida de los módulos SPI e I2C.
• RC4/SDI/SDA (15): E/S digital o entrada de datos en modo SPI o I/O datos en modo I2C.
• RC5/SDO (16): E/S digital o salida de datos en modo SPI
• RC6/TX/CK (17): E/S digital o patita del transmisor del USART asíncrono o como reloj del síncrono.
• RC7/RX/DT (18): E/S digital o receptor del USART asíncrono o como datos en el síncrono.
Apéndice
El convertidor A/D
Los microcontroladores PIC 16F873 poseen un convertidor A/D de 10 bits de resolución y 5 canales de entrada. La resolución que tiene cada bit procedente de la conversión tiene un valor que es función de la tensión de referencia Vref, de acuerdo a la fórmula siguiente:
Resolución = (Vref
+- Vref
-)/1.024 = Vref/1.024
A través del canal de entrada seleccionado, se aplica la señal analógica a un condensador de
captura y mantenimiento (sample and hold) y luego se introduce al conversor, el cual proporciona
un resultado digital de 10 bits de longitud usando la técnica de “aproximaciones sucesivas”.
Archivo: principal.asm
1
2
;************* P R O G R A M A P R I N C I P A L ************
3 4
5
;***************************************************************
6
List P=16F873
7
RADIX HEX
8
;***************************************************************
9
Include "P16F873.inc"
10
__Config _CP_OFF & _DEBUG_OFF & _WRT_ENABLE_OFF & _CPD_OFF & _LVP_OFF & _BODEN_OFF &
_PWRTE_ON & _WDT_OFF & _XT_OSC
11
;***************************************************************
12 13
14
TMR0_OPT EQU 0x01 ; TIMER0 en banco 0 y OPTION en banco 1
15STATUS EQU 0x03
16
17
cblock 0x30
18
TEMP_1
19
DELAY_1
20
DELAY_2
21
DELAY_3
22
LCD_VAR
23
KEY_VAR
24
CONTA ; Variables del contador
25
CONTA2
26
CONTA3
27
CONTA4
28
TECLA1
29
TECLA2
30
TECLA_1
31
TECLA_2
32
TECLA_3
33
TECLA_4
34
TECLA_5
35
TECLA_6
36
TECMP
37
K
38
RET
39
RET_1
40
RET_2
41
K_1
42
K_2
43
TECLAS
44
temp_1
45
temp_2
46
RESUL
47
OFFSET
48
TEMPO1
49
REG05
50
REG10
51
REG15
52
REG20
53
REG30
54
REG40
55
REG60
56
REG70
57
REG80
58
REG02
59
REG01
60
REG12
61
REG00
62
RETA
63
RETA_1
64
65
endc
66
67
;POSICIONAMIENTO DE LA RUTINA DE INICIO
6869
Página: 1
Archivo: principal.asm
70
ORG 0 ; El programa comienza en la direcci¢n 0 y
71goto INICIO ; salta a la direcci¢n 5 para sobrepasar el
72ORG 5 ; vector de interrupci¢n
73
74
;RUTINA HEX_ASCII: Rutina que pasa el valor HEXADECIMAL que contiene
75;W a valor ASCII, para ser mostrado por el LCD
76
77
HEX_ASCII addwf PCL,1
78
retlw '0'
79
retlw '1'
80
retlw '2'
81
retlw '3'
82
retlw '4'
83
retlw '5'
84
retlw '6'
85
retlw '7'
86
retlw '8'
87
retlw '9'
88
retlw '*'
89
retlw '#'
90 91
92
tabla movwf PCL ;Desplazamiento sobre la tabla
93Mens_GEND equ $
94
retlw ' '
95
retlw ' '
96
retlw 'G'
97
retlw 'E'
98
retlw 'N'
99
retlw 'E'
100
retlw 'R'
101
retlw 'A'
102
retlw 'D'
103
retlw 'O'
104
retlw 'R'
105
retlw ' '
106
retlw 'D'
107
retlw 'E'
108
retlw 0x00
109
110
Mens_FRE equ $
111
retlw 'F'
112
retlw 'R'
113
retlw 'E'
114
retlw 'C'
115
retlw 'U'
116
retlw 'E'
117
retlw 'N'
118
retlw 'C'
119
retlw 'I'
120
retlw 'A'
121
retlw 0x00
122
123
Mens_DES equ $
124
retlw 'D'
125
retlw 'E'
126
retlw 'S'
127
retlw 'E'
128
retlw 'A'
129
retlw 'D'
130
retlw 'A'
131
retlw '?'
132
retlw 0x00
133 134
135
FREC02 equ $
136
retlw 'F'
137
retlw ' '
138
retlw '='
139
retlw ' '
Archivo: principal.asm
140
retlw '0'
141
retlw '.'
142
retlw '0'
143
retlw '2'
144
retlw '5'
145
retlw 'H'
146
retlw 'z'
147
retlw 0x00
148
149
FREC05 equ $
150
retlw 'F'
151
retlw ' '
152
retlw '='
153
retlw ' '
154
retlw '0'
155
retlw '.'
156
retlw '0'
157
retlw '5'
158
retlw 'H'
159
retlw 'z'
160
retlw 0x00
161
162
FREC10 equ $
163
retlw 'F'
164
retlw ' '
165
retlw '='
166
retlw ' '
167
retlw '0'
168
retlw '.'
169
retlw '1'
170
retlw '0'
171
retlw 'H'
172
retlw 'z'
173
retlw 0x00
174
175
FREC15 equ $
176
retlw 'F'
177
retlw ' '
178
retlw '='
179
retlw ' '
180
retlw '0'
181
retlw '.'
182
retlw '1'
183
retlw '5'
184
retlw 'H'
185
retlw 'z'
186
retlw 0x00
187
188
FREC20 equ $
189
retlw 'F'
190
retlw ' '
191
retlw '='
192
retlw ' '
193
retlw '0'
194
retlw '.'
195
retlw '2'
196
retlw '0'
197
retlw 'H'
198
retlw 'z'
199
retlw 0x00
200
201
FREC30 equ $
202
retlw 'F'
203
retlw ' '
204
retlw '='
205
retlw ' '
206
retlw '0'
207
retlw '.'
208
retlw '3'
209
retlw '0'
Página: 3
Archivo: principal.asm
210
retlw 'H'
211
retlw 'z'
212
retlw 0x00
213
214
FREC40 equ $
215
retlw 'F'
216
retlw ' '
217
retlw '='
218
retlw ' '
219
retlw '0'
220
retlw '.'
221
retlw '4'
222
retlw '0'
223
retlw 'H'
224
retlw 'z'
225
retlw 0x00
226 227
228
FREC60 equ $
229
retlw 'F'
230
retlw ' '
231
retlw '='
232
retlw ' '
233
retlw '0'
234
retlw '.'
235
retlw '6'
236
retlw '0'
237
retlw 'H'
238
retlw 'z'
239
retlw 0x00
240 241
242
FREC80 equ $
243
retlw 'F'
244
retlw ' '
245
retlw '='
246
retlw ' '
247
retlw '0'
248
retlw '.'
249
retlw '8'
250
retlw '0'
251
retlw 'H'
252
retlw 'z'
253
retlw 0x00
254 255
256
FREC01 equ $
257
retlw 'F'
258
retlw ' '
259
retlw '='
260
retlw ' '
261
retlw '1'
262
retlw '.'
263
retlw '0'
264
retlw '0'
265
retlw 'H'
266
retlw 'z'
267
retlw 0x00
268 269 270
271
FREC12 equ $
272
retlw 'F'
273
retlw ' '
274
retlw '='
275
retlw ' '
276
retlw '1'
277
retlw '.'
278
retlw '2'
279
retlw '0'
Archivo: principal.asm
280
retlw 'H'
281
retlw 'z'
282
retlw 0x00
283
284
EVALUO equ $
285
retlw 'N'
286
retlw 'O'
287
retlw '('
288
retlw '*'
289
retlw ')'
290
retlw ' '
291
retlw ' '
292
retlw 'S'
293
retlw 'I'
294
retlw '('
295
retlw '#'
296
retlw ')'
297
retlw 0x00
298 299
300
GENEN equ $
301
retlw 'G'
302
retlw 'E'
303
retlw 'N'
304
retlw 'E'
305
retlw 'R'
306
retlw 'A'
307
retlw 'N'
308
retlw 'D'
309
retlw 'O'
310
retlw 0x00
311
312
; PROGRAMA PRINCIPAL
313314
INCLUDE "TECLADO.ASM"
315
INCLUDE "LCD873.ASM"
316
INCLUDE "GENERADOR.ASM"
317
318
INICIO call UP_LCD
319
bsf STATUS,5 ; Selecci¢n del banco 1
320
movlw 0x07
321
movwf ADCON1
322
clrf PORTA ; Puerta A como salida
323
movlw b'10000111'
324
movwf OPTION_REG
325
movlw 0x00
326
movwf PORTC ; La Puerta C salida
327
bcf STATUS,RP0
328
bsf PORTC,0 ; pulso de RESET
329
call LCD_INI
330
call DISPLAY_ON_CUR_OFF
331
movlw 0x03
332
movwf K
333
movlw 0x02
334
movwf K_1
335
movwf K_2
336
movlw d'150' ; Reatrdo en Y
337
movwf RET
338
movwf RET_1
339
movlw 0x05
340
movwf RET_2
341
movlw 0x00 ; ************
342
movwf REG00 ; ************
343
movlw 0x02
344
movwf REG02 ; ********************
345
movlw 0x0B ; Bloque donde
346
movwf REG01 ;
347
movlw 0x0C ;
348
movwf REG12 ; se dan valores
349
movlw 0x05 ;
Página: 5
Archivo: principal.asm
350
movwf REG05 ;
351
movlw 0x0A ;
352
movwf REG10 ; para compararlos
353
movlw 0x0F ;
354
movwf REG15 ;
355
movlw 0x14 ;
356
movwf REG20 ; al valor
357
movlw 0x1E ;
358
movwf REG30 ;
359
movlw 0x28 ;
360
movwf REG40 ; que se
361
movlw 0x3C ;
362
movwf REG60 ;
363
movlw 0x70 ;
364
movwf REG70 ; teclea
365
movlw 0x50 ;
366
movwf REG80 ; *********************
367
call ENTRADA
368
call SOLICITA
369
call COM_MUESTRA
370
goto INICIO
371
372
; Rutina de mensaje de Bienvenida
373374
ENTRADA call UP_LCD ; Reconfigura LCD
375
call BORRA_Y_HOME ; Actualiza
376
movlw Mens_GEND ; Offset del mensaje
377call Mensaje ; Visualiza "generador de"
378
movlw 0xC3
379
call LCD_REG ; Ajusta posición del mensaje
380movlw Mens_FRE ; Offset del mensaje
381
call Mensaje ; Visualiza "frecuencia"
382
call RETARDO1
383
return
384
385
; Esta rutina saca al LCD el mensaje cuyo inicio est indicado en
386; el acumulador
387
388
Mensaje movwf temp_1 ; Salva posición de la tabla
389Mensaje_1 movf temp_1,W ; Recupera posición de la tabla
390call tabla ; Busca caracter de salida
391movwf temp_2 ; Guarda el caracter
392
movf temp_2,F
393
btfss STATUS,Z ; Mira si es el ultimo
394
goto No_es_ultimo
395
return
396
No_es_ultimo call LCD_DATO ; Visualiza en el LCD
397
incf temp_1,F ; Siguiente caracter
398
goto Mensaje_1 ; Repite con siguiente caracter
399400
; Rutina donde muestra el mensaje solicitando la frecuencia deseada
401; ademas de visualizar los digitos introducidos
402
403
SOLICITA movlw 0x02
404
movwf K
405
movwf K_1
406
call UP_LCD ; Reconfigura LCD
407
call BORRA_Y_HOME ; Actualiza
408
movlw Mens_FRE ; Offset del mensaje
409call Mensaje ; Visualiza "FRECUENCIA "
410
movlw 0xC0
411
call LCD_REG ; Ajusta posici¢n del mensaje
412movlw Mens_DES ; Offset del mensaje
413
call Mensaje ; Visualiza "DESEADA?"
414
call NO_HAY1
415
movf TECLA,W
416
movwf TECLA1
417
movwf TECLA_5
418
call RETARDO
419
call RETARDO
Archivo: principal.asm
420
return
421
422
NO_HAY1 call KEY_SCAN ; Se hace un chequeo del teclado
423
movlw 0x80
424
subwf TECLA,W ; Sobre TECLA quedar la tecla pulsada o 0x80
425
btfsc STATUS,Z
426
goto NO_HAY1 ; No se ha pulsado ninguna tecla
427
call KEY_OFF ; S¡ se ha pulsado. Se espera a que se suelte
428call KEY_HEX ; Se pasa a valor hexadecimal
429
movwf TECLA
430
call HEX_ASCII ; Se pasa el valor hexadecimal a c¢digo ASCII
431
movwf TECLA1 ; w -> TECLA1
432
movlw 0xCD ; CD -> w
433
decfsz K,1
434
movlw 0XCC
435
call LCD_REG ; Reposiciona cursor del LCD
436
incfsz K,1
437
movf TECLA1,W
438
call LCD_DATO
439
movf TECLA,W
440
decfsz K,1
441
movwf TECLA_3
442
incfsz K,1
443
decfsz K,1
444
goto NO_HAY1
445
call SUMA
446
movwf TECLA ; Se guarda temporalmente en TECLA
447
decfsz K_1,1
448
nop
449
movlw 0x02
450
movwf K
451
return
452
453
SUMA movwf TECLA_1
454
movlw 0x09
455
movwf TECLA_2
456
movf TECLA_3,W
457
call SUMA_1
458
addwf TECLA_1,W
459
return
460
SUMA_1 addwf TECLA_3,W
461
decfsz TECLA_2,1
462
goto SUMA_1
463
return
464
465
NO_HAY call KEY_SCAN ; Se hace un chequeo del teclado
466
movlw 0x80
467
subwf TECLA,W ; Sobre TECLA quedar la tecla pulsada o 0x80
468
btfsc STATUS,Z
469
goto NO_HAY ; No se ha pulsado ninguna tecla
470
call KEY_OFF ; Sí se ha pulsado. Se espera a que se suelte
471
movlw d'25'
472
movwf TEMP_1
473
call DELAY10 ; Se crea una temporización de 25 ms
474call KEY_HEX ; Se pasa a valor hexadecimal
475
movwf TECLAS
476
return
477
478
RETARDO decfsz RET
479
goto RETARDO
480
decfsz RET_1
481
goto RETARDO
482
movlw d'150'
483
movwf RET
484
movwf RET_1
485
return
486
487
; Rutina que muestra el desplegado de la frecuencia,
488; indicando si es la correcta para continuar o cancelar la
489; ejecucion y comenzar de nuevo
Página: 7
Archivo: principal.asm
490
491
COM_MUESTRA call UP_LCD ; Reconfigura LCD
492
call BORRA_Y_HOME ; Actualiza
493
movf REG05,0 ; Comparacion de igualdad
494
xorwf TECLA1,0
495
btfsc STATUS,2
496
call FRECUENCIA05
497
movf REG02,0 ; Comparacion de igualdad
498
xorwf TECLA1,0
499
btfsc STATUS,2
500
call FRECUENCIA02
501
movf REG01,0 ; Comparacion de igualdad
502
xorwf TECLA1,0
503
btfsc STATUS,2
504
call FRECUENCIA01
505
movf REG12,0 ; Comparacion de igualdad
506
xorwf TECLA1,0
507
btfsc STATUS,2
508
call FRECUENCIA12
509
movf REG10,0 ; Comparacion de igualdad
510
xorwf TECLA_5,0
511
btfsc STATUS,2
512
call FRECUENCIA10
513
movf REG15,0 ; Comparacion de igualdad
514
xorwf TECLA1,0
515
btfsc STATUS,2
516
call FRECUENCIA15
517
movf REG20,0 ; Comparacion de igualdad
518
xorwf TECLA1,0
519
btfsc STATUS,2
520
call FRECUENCIA20
521
movf REG30,0 ; Comparacion de igualdad
522
xorwf TECLA1,0
523
btfsc STATUS,2
524
call FRECUENCIA30
525
movf REG40,0 ; Comparacion de igualdad
526
xorwf TECLA1,0
527
btfsc STATUS,2
528
call FRECUENCIA40
529
movf REG60,0 ; Comparacion de igualdad
530
xorwf TECLA1,0
531
btfsc STATUS,2
532
call FRECUENCIA60
533
movf REG80,0 ; Comparacion de igualdad
534
xorwf TECLA1,0
535
btfsc STATUS,2
536
call FRECUENCIA80
537
movf REG00,0 ; Comparacion de igualdad
538
xorwf TECLA1,0
539
btfsc STATUS,2
540
call CHIRPS
541
return
542 543
544
RETARDO1 decfsz RET
545
goto RETARDO1
546
decfsz RET_1
547
goto RETARDO1
548
decfsz RET_2
549
goto RETARDO1
550
movlw 0xFF
551
movwf RET
552
movwf RET_1
553
movlw 0x05
554
movwf RET_2
555
return
556
557
;RUTINA DE DELAY DE 10 MS: Esta rutina utiliza el TMR0.
558
;Es una temporizaci¢n de 10 ms que se repite tantas veces
559;como indique la variable TEMPO1
Archivo: principal.asm
560 561
562
DELAY10 bcf INTCON,2 ; Borra flag del TMR0
563
movlw 0xD8
564
movwf TMR0 ; Carga el TMR0 con valor 39
565
DELAY10_1 btfss INTCON,2 ; Espera rebosamiento del TMR0
566
goto DELAY10_1
567
decfsz TEMP_1,F
568
goto DELAY10
569
return
570
571
;RUTINA DE DELAY DE 1 SEGUNDO: Se basa en la rutina de 10ms, repiti‚ndola 100 veces
572573
DELAY1S movlw 0x64
574
movwf TEMP_1
575
call DELAY10
576
return
577
578
;RUTINA KEY_OFF: Esta rutina espera que la tecla reci‚n pulsada sea soltada.
579
;Debe usarse justo despu‚s de llamar a la rutina KEY_SCAN
580581
582
KEY_OFF movf TECLA,W
583
movwf TEMP_1 ; Guarda temporalmente la tecla
584KEY_OFF_NO call KEY_SCAN ; Mira si se ha soltado
585
movlw 0x80
586
subwf TECLA,W
587
btfss STATUS,Z
588
goto KEY_OFF_NO ; Bucle mientras no se suelte
589
movf TEMP_1,W ; Ya se ha soltado
590
movwf TECLA ; Se repone la tecla
591
return
592
593
;RUTINA DE DELAY VARIABLE: Esta rutina realiza una temporizaci¢n que
594;depende del valor del acumulador en el momento en que se le llama
595596
DELAY_V movwf DELAY_1
597
clrf DELAY_3
598
clrf DELAY_2
599
DELAY_LOOP decfsz DELAY_3,F
600
goto DELAY_LOOP
601
decfsz DELAY_2,F
602
goto DELAY_LOOP
603
decfsz DELAY_1,F
604
goto DELAY_LOOP
605
return
606
607
; Rutina que muestra en pantalla la frecuencia
608609
CHEQUEO call Mensaje
610
movlw 0xC2
611
call LCD_REG ; Reposiciona cursor del LCD
612
movlw EVALUO
613
call Mensaje ; Visualiza"NO.(*), SI(#)"
614
return
615
616
CONFIRMA call NO_HAY
617
movlw 0x0A
618
subwf TECLAS,W
619
btfsc STATUS,Z
620
call INICIO ; Se vuelve a empezar
621
movlw 0x0B
622
subwf TECLAS,W
623
btfsc STATUS,Z
624
return
625
call UP_LCD ; Reconfigura LCD
626
call BORRA_Y_HOME ; Actualiza
627
goto INICIO
628
629
; Rutinas donde se muestra en pantalla el valor de la frecuencia a generar
Página: 9
Archivo: principal.asm
630
; ademas de la condicion de "si" o "no" para proceder o cancelar
631632
FRECUENCIA02 call UP_LCD ; Reconfigura LCD
633
call BORRA_Y_HOME ; Actualiza
634
movlw 0x82
635
call LCD_REG ; Ajusta posición del mensaje
636movlw FREC02 ;Offset del mensaje
637
call CHEQUEO
638
call CONFIRMA
639
call IGUAL02
640
641
FRECUENCIA05 call muestra
642
movlw FREC05 ;Offset del mensaje
643
call CHEQUEO
644
call CONFIRMA
645
call IGUAL05
646
647
FRECUENCIA10 call muestra
648
movlw FREC10 ;Offset del mensaje
649
call CHEQUEO
650
call CONFIRMA
651
call IGUAL10
652
653
FRECUENCIA15 call muestra
654
movlw FREC15 ;Offset del mensaje
655
call CHEQUEO
656
call CONFIRMA
657
call IGUAL15
658
659
FRECUENCIA20 call muestra
660
movlw FREC20 ;Offset del mensaje
661
call CHEQUEO
662
call CONFIRMA
663
call IGUAL20
664
665
FRECUENCIA30 call muestra
666
movlw FREC30 ;Offset del mensaje
667
call CHEQUEO
668
call CONFIRMA
669
call IGUAL30
670
671
FRECUENCIA40 call muestra
672
movlw FREC40 ;Offset del mensaje
673
call CHEQUEO
674
call CONFIRMA
675
call IGUAL40
676
677
FRECUENCIA60 call muestra
678
movlw FREC60 ;Offset del mensaje
679
call CHEQUEO
680
call CONFIRMA
681
call IGUAL60
682
683
FRECUENCIA80 call muestra
684
movlw FREC80 ;Offset del mensaje
685
call CHEQUEO
686
call CONFIRMA
687
call IGUAL80
688
689
FRECUENCIA01 call muestra
690
movlw FREC01 ;Offset del mensaje
691
call CHEQUEO
692
call CONFIRMA
693
call IGUAL01
694
695
FRECUENCIA12 call muestra
696
movlw FREC12 ;Offset del mensaje
697
call CHEQUEO
698
call CONFIRMA
699
call IGUAL12
Archivo: principal.asm
700
701
CHIRPS call muestra
702
movlw GENEN ;Offset del mensaje
703
call CHEQUEO
704
call CONFIRMA
705
call IGCHIRP
706
707
END
Página: 11
Archivo: generador.asm
1
; generador.asm
2
; Carpeta donde estan las rutinas que son llamadas al intruducir la frecuencia
3; deseada
4 5
6
; Rutina que se ejecuta al ser igual la frecuenca a F = 0.025 Hz
78
IGUAL02 call MEN_INICIO
9
call muestra
10
movlw FREC02 ; Offset del mensaje
11
call GENERANDO
12
13
parpa02 bcf PORTC,5 ; Dashabilita el Clear
14
bsf PORTC,7 ; Enciende el led RB7 = 1
15
bsf PORTC,0 ; En estado alto el Reset
16
call retardo02 ; Llamada a subrutina de RETARDO
17
bcf PORTC,7 ; Apaga el led, RB7 = 0
18
call retardo02
19
decf CONTA2,0
20
movwf CONTA2
21
btfss STATUS,2 ; Checa cuantas veces se hecho el ciclo-64
22
goto parpa02
23
call seg202
24
retardo02 movlw d'76' ; 95 -> W
25movwf CONTA
26
bucle02 call explora02
27
clrf TMR0_OPT ; TMR0 = 0 y empieza su incremento
28decf CONTA,0 ; CONTA - 1 -> W
29
movwf CONTA ; Se actualiza FZ
30
btfss STATUS,2 ; ¨FZ = 1?
31
goto bucle02 ; Otra vez al bucle de exploraci¢n
32return ; Se ha explorado 76 veces
3334
explora02 btfss TMR0_OPT,4 ; TMR0<4> = 1?
35
goto explora02 ; No ha llegado TMR0 a 16d
36
return ; Ha llegado TMR0 al
37
; valor 16d y retorna
38
; al programa principal
39
seg202 movlw d'64'
40
movwf CONTA2
41
bcf PORTC,6 ; Pone el bit 6 del puerto c a 0
42
decf CONTA3,0 ; CONTA - 1 -> W
43movwf CONTA3 ; Se actualiza FZ
44
btfss STATUS,2
45
goto parpa02
46
call seg302
47
48
seg302 movlw d'2'
49
movwf CONTA3
50
bsf PORTC,6 ; Pone el bit 6 del puerto c a 1
51
decf CONTA4,0
52
movwf CONTA4
53
btfss STATUS,2 ; Cuenta las veces que cambia S0
54
goto parpa02
55
call seg402
56
57
seg402 movlw d'1' ; Boloque que checa el contador para
58
movwf CONTA4 ; realizar el pulso
59
bcf PORTC,0 ; de reset al neumotacografo
60
call PULSO ; cada ciclo respiratorio
61
goto parpa02 ; dejando apagado el PORC-0
62
63
; ******************************************************************************
64
; TERMINA BLOQUE DE F = 0.025 Hz
65
; ******************************************************************************
66 67
68
; Rutina que se ejecuta al ser igual la frecuenca a F = 0.05 Hz
6970
IGUAL05 call MEN_INICIO
Archivo: generador.asm
71
call muestra
72
movlw FREC05 ; Offset del mensaje
73
call GENERANDO
74 75
76
parpa05 bcf PORTC,5
77
bsf PORTC,7 ; Enciende el led RB7 = 1
78
bsf PORTC,0
79
call retardo05 ; Llamada a subrutina de RETARDO
80
bcf PORTC,7 ; Apaga el led, RB7 = 0
81
call retardo05
82
decf CONTA2,0
83
movwf CONTA2
84
btfss STATUS,2
85
goto parpa05
86
call seg205
87
88
retardo05 movlw d'38' ; 38 -> W
89movwf CONTA
90
bucle05 call explora05
91
clrf TMR0_OPT ; TMR0 = 0 y empieza su incremento
92decf CONTA,0 ; CONTA - 1 -> W
93
movwf CONTA ; Se actualiza FZ
94
btfss STATUS,2 ; ¨FZ = 1?
95
goto bucle05 ; Otra vez al bucle de exploraci¢n
96return ; Se ha explorado 38 veces
9798
explora05 btfss TMR0_OPT,4 ; TMR0<4> = 1?
99
goto explora05 ; No ha llegado TMR0 a 16d
100
return ; Ha llegado TMR0 al
101
; valor 16d y retorna
102
; al programa principal
103
seg205 movlw d'64'
104
movwf CONTA2
105
bcf PORTC,6
106
decf CONTA3,0 ; CONTA - 1 -> W
107movwf CONTA3 ; Se actualiza FZ
108
btfss STATUS,2
109
goto parpa05
110
call seg305
111
112
seg305 movlw d'2'
113
movwf CONTA3
114
bsf PORTC,6
115
decf CONTA4,0
116
movwf CONTA4
117
btfss STATUS,2
118
goto parpa05
119
call seg405
120
121
seg405 movlw d'1'
122
movwf CONTA4
123
bcf PORTC,0
124
call PULSO
125
goto parpa05
126
127
; ******************************************************************************
128
; TERMINA BLOQUE DE F = 0.05 Hz
129
; ******************************************************************************
130 131 132
133
; Rutina que se ejecuta al ser igual la frecuenca a F = 0.10 Hz
134135
136
IGUAL10 call MEN_INICIO
137
call muestra
138
movlw FREC10 ; Offset del mensaje
139
call GENERANDO
140
Página: 2
Archivo: generador.asm
141
parpa10 bcf PORTC,5
142
bsf PORTC,0
143
bsf PORTC,7 ; Enciende el led RB7 = 1
144
call retardo10 ; Llamada a subrutina de RETARDO
145
bcf PORTC,7 ; Apaga el led, RB7 = 0
146
call retardo10
147
decf CONTA2,0
148
movwf CONTA2
149
btfss STATUS,2
150
goto parpa10
151
call seg210
152
153
retardo10 movlw d'19' ; 19 -> W
154movwf CONTA
155
bucle10 call explora10
156
clrf TMR0_OPT ; TMR0 = 0 y empieza su incremento
157decf CONTA,0 ; CONTA - 1 -> W
158
movwf CONTA ; Se actualiza FZ
159
btfss STATUS,2 ; ¨FZ = 1?
160
goto bucle10 ; Otra vez al bucle de exploraci¢n
161return ; Se ha explorado 19 veces
162163
164
explora10 btfss TMR0_OPT,4 ; TMR0<4> = 1?
165
goto explora10 ; No ha llegado TMR0 a 4d
166
return ; Ha llegado TMR0 al
167
; valor 4d y retorna
168
; al programa principal
169
seg210 movlw d'64'
170
movwf CONTA2
171
bcf PORTC,6
172
decf CONTA3,0 ; CONTA - 1 -> W
173movwf CONTA3 ; Se actualiza FZ
174
btfss STATUS,2
175
goto parpa10
176
call seg310
177
178
seg310 movlw d'2'
179
movwf CONTA3
180
bsf PORTC,6
181
decf CONTA4,0
182
movwf CONTA4
183
btfss STATUS,2
184
goto parpa10
185
call seg410
186
187
seg410 movlw d'1'
188
movwf CONTA4
189
bcf PORTC,0
190
call PULSO
191
goto parpa10
192
193
; ******************************************************************************
194
; TERMINA BLOQUE DE F = 0.10 Hz
195
; ******************************************************************************
196 197
198
; Rutina que se ejecuta al ser igual la frecuenca a F = 0.15 Hz
199200
IGUAL15 call MEN_INICIO
201
call muestra
202
movlw FREC15 ; Offset del mensaje
203
call GENERANDO
204
205
parpa15 bcf PORTC,5
206
bsf PORTC,0
207
bsf PORTC,7 ; Enciende el led RB7 = 1
208
call retardo15 ; Llamada a subrutina de RETARDO
209
bcf PORTC,7 ; Apaga el led, RB7 = 0
210
call retardo15
Archivo: generador.asm
211
decf CONTA2,0
212
movwf CONTA2
213
btfss STATUS,2
214
goto parpa15
215
call seg215
216
217
retardo15 movlw d'51' ; 25 -> W 25 ANTES
218movwf CONTA
219
bucle15 call explora15
220
clrf TMR0_OPT ; TMR0 = 0 y empieza su incremento
221decf CONTA,0 ; CONTA - 1 -> W
222
movwf CONTA ; Se actualiza FZ
223
btfss STATUS,2 ; ¨FZ = 1?
224
goto bucle15 ; Otra vez al bucle de exploraci¢n
225
return ; Se ha explorado 122 veces
226 227
228
explora15 btfss TMR0_OPT,2 ; TMR0<4> = 1?
229
goto explora15 ; No ha llegado TMR0 a 4d
230
return ; Ha llegado TMR0 al
231
; valor 4d y retorna
232
; al programa principal
233
seg215 movlw d'64'
234
movwf CONTA2
235
bcf PORTC,6
236
decf CONTA3,0 ; CONTA - 1 -> W
237movwf CONTA3 ; Se actualiza FZ
238
btfss STATUS,2
239
goto parpa15
240
call seg315
241
242
seg315 movlw d'2'
243
movwf CONTA3
244
bsf PORTC,6
245
decf CONTA4,0
246
movwf CONTA4
247
btfss STATUS,2
248
goto parpa15
249
call seg415
250
251
seg415 movlw d'1'
252
movwf CONTA4
253
bcf PORTC,0
254
call PULSO
255
goto parpa15
256 257
258
; ******************************************************************************
259
; TERMINA BLOQUE DE F = 0.15 Hz
260
; ******************************************************************************
261 262
263
; Rutina que se ejecuta al ser igual la frecuenca a F = 0.20 Hz
264265
266
IGUAL20 call MEN_INICIO
267
call muestra
268
movlw FREC20 ; Offset del mensaje 2
269
call GENERANDO
270
271
parpa20 bcf PORTC,5
272
bsf PORTC,0
273
bsf PORTC,7 ; Enciende el led RB7 = 1
274
call retardo20 ; Llamada a subrutina de RETARDO
275
bcf PORTC,7 ; Apaga el led, RB7 = 0
276
call retardo20
277
decf CONTA2,0
278
movwf CONTA2
279
btfss STATUS,2
280
goto parpa20
Página: 4
Archivo: generador.asm
281
call seg220
282
283
retardo20 movlw d'38' ; 38 -> W
284movwf CONTA
285
bucle20 call explora20
286
clrf TMR0_OPT ; TMR0 = 0 y empieza su incremento
287decf CONTA,0 ; CONTA - 1 -> W
288
movwf CONTA ; Se actualiza FZ
289
btfss STATUS,2 ; ¨FZ = 1?
290
goto bucle20 ; Otra vez al bucle de exploraci¢n
291return ; Se ha explorado 38 veces
292293
294
explora20 btfss TMR0_OPT,2 ; TMR0<4> = 1?
295
goto explora20 ; No ha llegado TMR0 a 4d
296
return ; Ha llegado TMR0 al
297
; valor 4d y retorna
298
; al programa principal
299
seg220 movlw d'64'
300
movwf CONTA2
301
bcf PORTC,6
302
decf CONTA3,0 ; CONTA - 1 -> W
303movwf CONTA3 ; Se actualiza FZ
304
btfss STATUS,2
305
goto parpa20
306
call seg320
307
308
seg320 movlw d'2'
309
movwf CONTA3
310
bsf PORTC,6
311
decf CONTA4,0
312
movwf CONTA4
313
btfss STATUS,2
314
goto parpa20
315
call seg420
316
317
seg420 movlw d'1'
318
movwf CONTA4
319
bcf PORTC,0
320
call PULSO
321
goto parpa20
322 323
324
; ******************************************************************************
325
; TERMINA BLOQUE DE F = 0.20 Hz
326
; ******************************************************************************
327 328 329
330
; Rutina que se ejecuta al ser igual la frecuenca a F = 0.30
331332
IGUAL30 call MEN_INICIO
333
call muestra
334
movlw FREC30 ; Offset del mensaje
335
call GENERANDO
336
337
parpa30 bcf PORTC,5
338
bsf PORTC,0
339
bsf PORTC,7 ; Enciende el led RB7 = 1
340
call retardo30 ; Llamada a subrutina de RETARDO
341
bcf PORTC,7 ; Apaga el led, RB7 = 0
342
call retardo30
343
decf CONTA2,0
344
movwf CONTA2
345
btfss STATUS,2
346
goto parpa30
347
call seg230
348
349
retardo30 movlw d'12' ; 12 -> W
350movwf CONTA
Archivo: generador.asm
351
bucle30 call explora30
352
clrf TMR0_OPT ; TMR0 = 0 y empieza su incremento
353decf CONTA,0 ; CONTA - 1 -> W
354
movwf CONTA ; Se actualiza FZ
355
btfss STATUS,2 ; ¨FZ = 1?
356
goto bucle30 ; Otra vez al bucle de exploraci¢n
357return ; Se ha explorado 12 veces
358359
360
explora30 btfss TMR0_OPT,3 ; TMR0<4> = 1?
361
goto explora30 ; No ha llegado TMR0 a 8d
362
return ; Ha llegado TMR0 al
363
; valor 8d y retorna
364
; al programa principal
365
seg230 movlw d'64'
366
movwf CONTA2
367
bcf PORTC,6
368
decf CONTA3,0 ; CONTA - 1 -> W
369movwf CONTA3 ; Se actualiza FZ
370
btfss STATUS,2
371
goto parpa30
372
call seg330
373
374
seg330 movlw d'2'
375
movwf CONTA3
376
bsf PORTC,6
377
decf CONTA4,0
378
movwf CONTA4
379
btfss STATUS,2
380
goto parpa30
381
call seg430
382
383
seg430 movlw d'1'
384
movwf CONTA4
385
bcf PORTC,0
386
call PULSO
387
goto parpa30
388
389
; ******************************************************************************
390
; TERMINA BLOQUE DE F = 0.30 Hz
391
; ******************************************************************************
392 393 394
395
; Rutina que se ejecuta al ser igual la frecuenca a F = 0.4 Hz
396397
IGUAL40 call MEN_INICIO
398
call muestra
399
movlw FREC40 ; Offset del mensaje 2
400
call GENERANDO
401
402
parpa40 bcf PORTC,5
403
bsf PORTC,0
404
bsf PORTC,7 ; Enciende el led RB7 = 1
405
call retardo40 ; Llamada a subrutina de RETARDO
406
bcf PORTC,7 ; Apaga el led, RB7 = 0
407
call retardo40
408
decf CONTA2,0
409
movwf CONTA2
410
btfss STATUS,2
411
goto parpa40
412
call seg240
413
414
retardo40 movlw d'37' ; 37 -> W
415movwf CONTA
416
bucle40 call explora40
417
clrf TMR0_OPT ; TMR0 = 0 y empieza su incremento
418decf CONTA,0 ; CONTA - 1 -> W
419
movwf CONTA ; Se actualiza FZ
420
btfss STATUS,2 ; ¨FZ = 1?
Página: 6
Archivo: generador.asm
421
goto bucle40 ; Otra vez al bucle de exploraci¢n
422return ; Se ha explorado 122 veces
423424
425
explora40 btfss TMR0_OPT,1 ; TMR0<4> = 1?
426
goto explora40 ; No ha llegado TMR0 a 2d
427
return ; Ha llegado TMR0 al
428
; valor 2d y retorna
429
; al programa principal
430
seg240 movlw d'64'
431
movwf CONTA2
432
bcf PORTC,6
433
decf CONTA3,0 ; CONTA - 1 -> W
434movwf CONTA3 ; Se actualiza FZ
435
btfss STATUS,2
436
goto parpa40
437
call seg340
438
439
seg340 movlw d'2'
440
movwf CONTA3
441
bsf PORTC,6
442
decf CONTA4,0
443
movwf CONTA4
444
btfss STATUS,2
445
goto parpa40
446
call seg440
447
448
seg440 movlw d'1'
449
movwf CONTA4
450
bcf PORTC,0
451
call PULSO
452
goto parpa40
453
454
; ******************************************************************************
455
; TERMINA BLOQUE DE F = 0.40 Hz
456
; ******************************************************************************
457 458
459
; Rutina que se ejecuta al ser igual la frecuenca a F = 0.60 Hz
460461
IGUAL60 call MEN_INICIO
462
call muestra
463
movlw FREC60 ; Offset del mensaje 2
464
call GENERANDO
465 466
467
parpa60 bcf PORTC,5
468
bsf PORTC,0
469
bsf PORTC,7 ; Enciende el led RB7 = 1
470
call retardo60 ; Llamada a subrutina de RETARDO
471
bcf PORTC,7 ; Apaga el led, RB7 = 0
472
call retardo60
473
decf CONTA2,0
474
movwf CONTA2
475
btfss STATUS,2
476
goto parpa60
477
call seg260
478
479
retardo60 movlw d'25' ; 24 -> W
480movwf CONTA
481
bucle60 call explora60
482
clrf TMR0_OPT ; TMR0 = 0 y empieza su incremento
483decf CONTA,0 ; CONTA - 1 -> W
484
movwf CONTA ; Se actualiza FZ
485
btfss STATUS,2 ; ¨FZ = 1?
486
goto bucle60 ; Otra vez al bucle de exploraci¢n
487return ; Se ha explorado 122 veces
488489
490
explora60 btfss TMR0_OPT,1 ; TMR0<1> = 1?
Archivo: generador.asm
491
goto explora60 ; No ha llegado TMR0 a 2d
492
return ; Ha llegado TMR0 al
493
; valor 2d y retorna
494
; al programa principal
495
seg260 movlw d'64'
496
movwf CONTA2
497
bcf PORTC,6
498
decf CONTA3,0 ; CONTA - 1 -> W
499movwf CONTA3 ; Se actualiza FZ
500
btfss STATUS,2
501
goto parpa60
502
call seg360
503
504
seg360 movlw d'2'
505
movwf CONTA3
506
bsf PORTC,6
507
decf CONTA4,0
508
movwf CONTA4
509
btfss STATUS,2
510
goto parpa60
511
call seg460
512
513
seg460 movlw d'1'
514
movwf CONTA4
515
bcf PORTC,0
516
call PULSO
517
goto parpa60
518
519
; ******************************************************************************
520
; TERMINA BLOQUE DE F = 0.60 Hz
521
; ******************************************************************************
522 523 524
525
; Rutina que se ejecuta al ser igual la frecuenca a F = 0.80 Hz
526527
IGUAL80 call MEN_INICIO
528
call muestra
529
movlw FREC80 ; Offset del mensaje
530
call GENERANDO
531
532
parpa80 bcf PORTC,5
533
bsf PORTC,0
534
bsf PORTC,7 ; Enciende el led RB7 = 1
535
call retardo80 ; Llamada a subrutina de RETARDO
536
bcf PORTC,7 ; Apaga el led, RB7 = 0
537
call retardo80
538
decf CONTA2,0
539
movwf CONTA2
540
btfss STATUS,2
541
goto parpa80
542
call seg280
543
544
retardo80 movlw d'38' ; 36 -> W
545movwf CONTA
546
bucle80 call explora80
547
clrf TMR0_OPT ; TMR0 = 0 y empieza su incremento
548decf CONTA,0 ; CONTA - 1 -> W
549
movwf CONTA ; Se actualiza FZ
550
btfss STATUS,2 ; ¨FZ = 1?
551
goto bucle80 ; Otra vez al bucle de exploraci¢n
552return ; Se ha explorado 36 veces
553554
555
explora80 btfss TMR0_OPT,0 ; TMR0<4> = 1?
556
goto explora80 ; No ha llegado TMR0 a 1d
557
return ; Ha llegado TMR0 al
558
; valor 1d y retorna
559
; al programa principal
560