• No se han encontrado resultados

UNIVERSIDAD AUTÓNOMA METROPOLITANA UNIDAD IZTAPALAPA. Ciencias Básicas e Ingeniería

N/A
N/A
Protected

Academic year: 2021

Share "UNIVERSIDAD AUTÓNOMA METROPOLITANA UNIDAD IZTAPALAPA. Ciencias Básicas e Ingeniería"

Copied!
52
0
0

Texto completo

(1)

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

(2)

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.

(3)

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.

(4)

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.

(5)

Figura 3. Esquema eléctrico de conexión del sistema mínimo basado en el PIC 16F873

para el módulo de generación.

(6)

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.

(7)

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.

(8)

7

Figura 7. Diagrama de conexión de la barra de LED´s para la módulo de generación.

(9)

Figura 8. Diagrama de conexión de la barra de LED´s para el módulo de Adquisición.

(10)

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.

(11)

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.

(12)

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

AD

para reiniciar la nueva conversión.

En la figura 10 se ofrece el diagrama de flujo sobre la operatividad del conversor A/D.

(13)

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.

(14)

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

(15)

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.

(16)

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.

(17)

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”.

(18)

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

15

STATUS 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

68

69

Página: 1

(19)

Archivo: principal.asm

70

ORG 0 ; El programa comienza en la direcci¢n 0 y

71

goto INICIO ; salta a la direcci¢n 5 para sobrepasar el

72

ORG 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

93

Mens_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 ' '

(20)

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

(21)

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'

(22)

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

313

314

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

(23)

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

373

374

ENTRADA call UP_LCD ; Reconfigura LCD

375

call BORRA_Y_HOME ; Actualiza

376

movlw Mens_GEND ; Offset del mensaje

377

call Mensaje ; Visualiza "generador de"

378

movlw 0xC3

379

call LCD_REG ; Ajusta posición del mensaje

380

movlw 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

389

Mensaje_1 movf temp_1,W ; Recupera posición de la tabla

390

call tabla ; Busca caracter de salida

391

movwf 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

399

400

; 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

409

call Mensaje ; Visualiza "FRECUENCIA "

410

movlw 0xC0

411

call LCD_REG ; Ajusta posici¢n del mensaje

412

movlw 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

(24)

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

428

call 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

474

call 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

(25)

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

(26)

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

572

573

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

580

581

582

KEY_OFF movf TECLA,W

583

movwf TEMP_1 ; Guarda temporalmente la tecla

584

KEY_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

595

596

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

608

609

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

(27)

Archivo: principal.asm

630

; ademas de la condicion de "si" o "no" para proceder o cancelar

631

632

FRECUENCIA02 call UP_LCD ; Reconfigura LCD

633

call BORRA_Y_HOME ; Actualiza

634

movlw 0x82

635

call LCD_REG ; Ajusta posición del mensaje

636

movlw 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

(28)

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

(29)

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

7

8

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

25

movwf CONTA

26

bucle02 call explora02

27

clrf TMR0_OPT ; TMR0 = 0 y empieza su incremento

28

decf 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

32

return ; Se ha explorado 76 veces

33

34

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

43

movwf 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

69

70

IGUAL05 call MEN_INICIO

(30)

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

89

movwf CONTA

90

bucle05 call explora05

91

clrf TMR0_OPT ; TMR0 = 0 y empieza su incremento

92

decf 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

96

return ; Se ha explorado 38 veces

97

98

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

107

movwf 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

134

135

136

IGUAL10 call MEN_INICIO

137

call muestra

138

movlw FREC10 ; Offset del mensaje

139

call GENERANDO

140

Página: 2

(31)

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

154

movwf CONTA

155

bucle10 call explora10

156

clrf TMR0_OPT ; TMR0 = 0 y empieza su incremento

157

decf 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

161

return ; Se ha explorado 19 veces

162

163

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

173

movwf 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

199

200

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

(32)

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

218

movwf CONTA

219

bucle15 call explora15

220

clrf TMR0_OPT ; TMR0 = 0 y empieza su incremento

221

decf 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

237

movwf 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

264

265

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

(33)

Archivo: generador.asm

281

call seg220

282

283

retardo20 movlw d'38' ; 38 -> W

284

movwf CONTA

285

bucle20 call explora20

286

clrf TMR0_OPT ; TMR0 = 0 y empieza su incremento

287

decf 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

291

return ; Se ha explorado 38 veces

292

293

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

303

movwf 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

331

332

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

350

movwf CONTA

(34)

Archivo: generador.asm

351

bucle30 call explora30

352

clrf TMR0_OPT ; TMR0 = 0 y empieza su incremento

353

decf 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

357

return ; Se ha explorado 12 veces

358

359

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

369

movwf 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

396

397

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

415

movwf CONTA

416

bucle40 call explora40

417

clrf TMR0_OPT ; TMR0 = 0 y empieza su incremento

418

decf CONTA,0 ; CONTA - 1 -> W

419

movwf CONTA ; Se actualiza FZ

420

btfss STATUS,2 ; ¨FZ = 1?

Página: 6

(35)

Archivo: generador.asm

421

goto bucle40 ; Otra vez al bucle de exploraci¢n

422

return ; Se ha explorado 122 veces

423

424

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

434

movwf 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

460

461

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

480

movwf CONTA

481

bucle60 call explora60

482

clrf TMR0_OPT ; TMR0 = 0 y empieza su incremento

483

decf 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

487

return ; Se ha explorado 122 veces

488

489

490

explora60 btfss TMR0_OPT,1 ; TMR0<1> = 1?

(36)

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

499

movwf 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

526

527

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

545

movwf CONTA

546

bucle80 call explora80

547

clrf TMR0_OPT ; TMR0 = 0 y empieza su incremento

548

decf 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

552

return ; Se ha explorado 36 veces

553

554

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

seg280 movlw d'64'

Página: 8

Referencias

Documento similar

Resolución do 16 de outubro de 2017, conxunta da Consellería de Educación e Ordenación Universitaria e da Consellería de Economía, Emprego e Industria, pola que

Período de realización (indicar meses ou períodos posibles de realización e xornada laboral: tempo completo ou parcial).. Do 01 de abril ao 30 de setembro en horario de

Así, lo que hago es aprovechar este lienzo en blanco para construir mi propio recuerdo, además uso el fondo blanco para hablar de la luz como lo que es un instante

En particular, la historiografía sobre el petróleo de los años de la Revolución ha privilegiado la problemática laboral y la suscitada entre las empresas

En conclusión, desde la perspectiva de la TMD son las transferencias de plusvalor entre los capitales totales nacionales las que producen el desarrollo

4.- Másteres del ámbito de la Biología Molecular y Biotecnología (9% de los títulos. Destaca el de Biotecnología Molecular de la UB con un 4% y se incluyen otros

12 El análisis del mercado de futuros del wti muestra que las varianzas condicionales del modelo de Engle son más volátiles y persis- tentes, aunque la covarianzas

Este artículo se deriva de la evaluación del Modelo Educativo de la Universidad Autónoma Metropolitana Unidad Cuajimalpa (UAMC), proceso que se llevó a cabo