ingeniería biomédica jorge isaac córdova castillo asesores:...

52
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

Upload: vuongtu

Post on 14-Dec-2018

227 views

Category:

Documents


0 download

TRANSCRIPT

UNIVERSIDAD AUTÓNOMA METROPOLITANA

UNIDAD IZTAPALAPA

Ciencias Básicas e Ingeniería

Desarrollo de un metrónomo digital basadoen el microcontrolador PIC16F873

Ingeniería Biomédica

Jorge Isaac Córdova Castillo

Asesores:

Oscar Yáñez SuárezSalvador Carrasco Sosa

México, 2003

1

INTRODUCCIÓN

En la última década el estudio de la variabilidad de la frecuencia cardiaca (VFC) ha despertado unenorme interés tanto fisiológico como clínico, debido a que proporciona tanto un marcador noinvasivo de la actividad del sistema nervioso autónomo como un indicador del riesgo de mortalidaden enfermos cardiovasculares.

La arritmia sinusal respiratoria (ASR) es el efecto que ejerce la respiración, a través de mecanismoscentrales y periféricos, sobre la frecuencia cardiaca. El fenómeno es dependiente de la frecuenciarespiratoria y del estado del sistema nervioso autónomo. la importancia clínica de la ASR radica enque es ampliamente utilizada como un medio de diagnóstico en una gran variedad deenfermedades (sobre todo cardiovasculares) y como condición para la correcta evaluación noinvasiva de la sensibilidad de los barorreceptores.

En el laboratorio de Fisiología Humana de la UAM-I se realizan pruebas que involucran la mediciónde 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 yestandarizar la ASR, la maniobra se lleva a cabo manteniendo la frecuencia respiratoria constanteentre 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 proponerun dispositivo novedoso que la mejore mediante un control más preciso del ritmo y amplitudrespiratoria.

Se propuso el desarrollo de un metrónomo digital, que ayuda al paciente a sincronizar surespiración a una frecuencia y amplitud requerida, para lo cual se usan dos columnas de 64 y 80LEDs colocados en forma vertical, en la barra de 64 LEDs se muestra al sujeto el ritmo respiratorioa seguir y la otra barra de 80 LEDs muestra la amplitud de inspiración y espiración por que realizael 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 sevan encendiendo uno a uno hasta finalizar con el último LED de la parte alta de la barra, en estaparte de encendido se le pide al sujeto que haga un ciclo inspiratorio, posteriormente se inicia unasecuencia de apagado de los LEDs ahora desde la parte alta de la barra hasta la parte baja, en estaparte se le pide al sujeto que inicie el ciclo espiratorio y así se tendría un ciclo respiratorio. Estascolumnas 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 dosmódulos, uno de ellos genera la frecuencia a seguir (patrón) con una barra de 64 LEDs rojos y elotro módulo es el de adquisición, que es donde el Neumotacógrafo entrega la señal almicrocontrolador, realizando una conversión analógica-digital para mostrar el ciclo y amplitudrespiratoria que realiza el sujeto con 80 LEDs verdes.

2

Figura 1. Diagrama a bloques del instrumento desarrollado para el control de la frecuencia respiratoria.

DESCRIPCIÓN DEL INSTRUMENTO

El sistema mínimo está basado en dos PIC 16F873 los cuales pertenecen a una subfamilia demicrocontroladores PIC de gama media, que se identifica por tener memoria de programa de tipoFLASH además poseen un convertidor A/D de 10 bits de resolución y 5 canales de entrada. (VerApéndice donde se menciona las características del PIC).

El metrónomo digital genera un tren de impulsos, cuya frecuencia puede ser seleccionada. Estetren de impulsos entra a la barra de LEDs patrón, generando ciclos de encendido-apagado. Paralograr este tren de impulsos se utiliza el Timer del PIC 16F873. Se dispone de un teclado paraseleccionar 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 laconvierte a un tren de impulsos que entra a la barra de LEDs de adquisición generándose elproceso de encendido-apagado.

Descripción del sistema mínimo

Como se ha mencionado anteriormente, el sistema mínimo está construido alrededor delmicrocontrolador PIC 16F873. Se seleccionó este microcontrolador debido a su bajo costo, suconvertidor 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 programaque sirve para ensamblar archivos con la extensión ASM además del kit PICSTART Plus para grabaral microcontrolador el programa una vez ensamblado y convertido en formato HEX y probarposteriormente dicho programa utilizando los periféricos de que dispone.

3

El material empleado para la realización del sistema mínimo fue el siguiente:

SemiconductoresU1 – 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 Ω

CapacitoresC1-C4 – 15 pF.

Material y partes adicionalesS1-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 necesarioadicionar circuitos externos como memorias, lógicas de control o algún controlador periférico, laconexión al microcontrolador se realizó de la siguiente manera: se conectó la circuiteria de reloj delsistema, a las entradas OSC1/CLKIN, OSC2/CLKOUT (patas 9 y 10) además del circuito del reset ala entrada MCLR#/Vpp/THV (pata 1), en el Puerto B (patas 21 a la 28) se conectó el LCD yteclado (patas 7-14 del LCD) además del puerto A (patas 3,4 y 6) para las patas RS, R/W y #E delLCD. El Puerto C es el encargado de realizar la generación de pulso de reloj (pata 18), entrada decontrol So (pata 17) y del Clear (pata 16) hacia el arreglo en cascada de los registros decorrimiento bidireccional 74LS299. La pata 11 del PIC genera un pulso de reset para elneumotacógrafo a la frecuencia que se selecciona.

4

Figura 3. Esquema eléctrico de conexión del sistema mínimo basado en el PIC 16F873para 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), lacircuiteria de reloj del sistema a las entradas OSC1/CLKIN y OSC2/CLKOUT (patas 9 y 10) ademásdel circuito del reset a la entrada MCLR#/Vpp/THV (pata 1), el Puerto C es donde se genera elpulso de reloj (pata 14), pulso de control So (pata 12) además del Clear (pata 12) hacia el arregloen cascada de los registros de corrimiento bidireccional 74LS299.

Figura 4. Esquema eléctrico de conexión del sistema mínimo basado en el PIC 16F873para 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 Integradoempleado es un amplificador operacional el TL084.

Figura 5. Etapa de amplificación/atenuación.

6

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 10circuitos 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 contenidopuede 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 diagramalógico y el símbolo lógico no necesariamente se dibujen de esa manera, en el 74LS299, izquierdaquiere decir “en la dirección de HQH hacia AQA”, mientras que derecha significa “en la dirección deAQA 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:

SemiconductoresU1-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 adicionalesZó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 laadquisició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.

8

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 habilitael 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 tiempoestablecido.

Mensaje que solicita la frecuencia, este mensaje se muestra hasta que se introducen losdos dígitos para las frecuencias (solo pueden tomar estos valores) las cuales son*:

02 – 0.025Hz05 – 0.05Hz10 – 0.10Hz15 – 0.15Hz20 – 0.20Hz30 – 0.30Hz40 – 0.40Hz60 – 0.60Hz80 – 0.80Hz11 – 1.00Hz12 – 1.20Hz

*Si se introduce un valor que no se ha establecido al programa, éste inmediatamente se reinicialaza, mostrando la primerpantalla.

10

Mensaje que confirma la frecuencia indicada en pantalla. Este mensaje espera a que seaintroducidas 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 elpush 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 estarcompuesta 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 paraconfigurar 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 acontinuació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 TAD. Se exige esperar un mínimo de 2.TAD para reiniciar la nueva conversión.

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

12

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 laspruebas cardiopulmunares, ya que en los pacientes pueden seguir con mucha facilidad el estimulovisual de la barra de adquisición comparada a la barra patrón, obteniéndose así un control másadecuado de la frecuencia y amplitud respiratoria.

La manera de comprobar de que la frecuencia que genera el PIC es la que realmente se desea fuepor medio del osciloscopio, donde se verificaba el tren de impulsos.

13

BIBLIOGRAFÍA.

1. Task Force of the European Society ofCardiology and the North AmericanSociety of Pacing and theElectrophysiology. “Heart rate Variability”:standards of measurement, physiologicalinterpretation, and clinical use”.Circulation 1996; 93: 1043-1065.

2. Malik M. “Heart rate variability”. Curropinion cardiol 1998; 13: 36-44 Saul JP,Cohen RJ. “Respiratory sinus arrhythmia”.In: Levy MN, Schwarttz PJ, Editores,Vagal Control of the Heart: ExperimentalBasis and Clinical Implications, FuturaPublishing Co. (EU), 1994: 511-535.

3. Microcontroladores PICDiseño práctico de aplicacionesJosé Ma. Angulo UsateguiIgnacio Angulo MartínezEd. Mc Graw Hill

4. Microcontroladores PICDiseño práctico de aplicacionesSegunda parte: PIC 16F87xJosé Ma. Angulo UsateguiSusana Romero YesaIgnacio Angulo MartínezEd. Mc Graw Hill

5.- Diseño Digital Principios y Prácticas John F. Wakerly Ed. Prentice Hall

6.- http://www.microchip.com7.- http://www.arrakis.es/~msyseng

Apéndice

1

MICROCONTROLADOR 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 losencapsulados 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

3

El convertidor A/D

Los microcontroladores PIC 16F873 poseen un convertidor A/D de 10 bits de resolución y 5 canalesde entrada. La resolución que tiene cada bit procedente de la conversión tiene un valor que esfunció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 decaptura y mantenimiento (sample and hold) y luego se introduce al conversor, el cual proporcionaun resultado digital de 10 bits de longitud usando la técnica de “aproximaciones sucesivas”.

Archivo: principal.asm

12 ;************* P R O G R A M A P R I N C I P A L ************345 ;***************************************************************6 List P=16F8737 RADIX HEX8 ;***************************************************************9 Include "P16F873.inc"10 __Config _CP_OFF & _DEBUG_OFF & _WRT_ENABLE_OFF & _CPD_OFF & _LVP_OFF & _BODEN_OFF &

_PWRTE_ON & _WDT_OFF & _XT_OSC11 ;***************************************************************121314 TMR0_OPT EQU 0x01 ; TIMER0 en banco 0 y OPTION en banco 115 STATUS EQU 0x031617 cblock 0x3018 TEMP_119 DELAY_120 DELAY_221 DELAY_322 LCD_VAR23 KEY_VAR24 CONTA ; Variables del contador25 CONTA226 CONTA327 CONTA428 TECLA129 TECLA230 TECLA_131 TECLA_232 TECLA_333 TECLA_434 TECLA_535 TECLA_636 TECMP37 K38 RET39 RET_140 RET_241 K_142 K_243 TECLAS44 temp_145 temp_246 RESUL47 OFFSET48 TEMPO149 REG0550 REG1051 REG1552 REG2053 REG3054 REG4055 REG6056 REG7057 REG8058 REG0259 REG0160 REG1261 REG0062 RETA63 RETA_16465 endc6667 ;POSICIONAMIENTO DE LA RUTINA DE INICIO6869

Página: 1

Archivo: principal.asm

70 ORG 0 ; El programa comienza en la direcci¢n 0 y71 goto INICIO ; salta a la direcci¢n 5 para sobrepasar el72 ORG 5 ; vector de interrupci¢n7374 ;RUTINA HEX_ASCII: Rutina que pasa el valor HEXADECIMAL que contiene75 ;W a valor ASCII, para ser mostrado por el LCD7677 HEX_ASCII addwf PCL,178 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 '#'909192 tabla movwf PCL ;Desplazamiento sobre la tabla93 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 0x00109110 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 0x00122123 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 0x00133134135 FREC02 equ $136 retlw 'F'137 retlw ' '138 retlw '='139 retlw ' '

Página: 2

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 0x00148149 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 0x00161162 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 0x00174175 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 0x00187188 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 0x00200201 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 0x00213214 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 0x00226227228 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 0x00240241242 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 0x00254255256 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 0x00268269270271 FREC12 equ $272 retlw 'F'273 retlw ' '274 retlw '='275 retlw ' '276 retlw '1'277 retlw '.'278 retlw '2'279 retlw '0'

Página: 4

Archivo: principal.asm

280 retlw 'H'281 retlw 'z'282 retlw 0x00283284 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 0x00298299300 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 0x00311312 ; PROGRAMA PRINCIPAL313314 INCLUDE "TECLADO.ASM"315 INCLUDE "LCD873.ASM"316 INCLUDE "GENERADOR.ASM"317318 INICIO call UP_LCD319 bsf STATUS,5 ; Selecci¢n del banco 1320 movlw 0x07321 movwf ADCON1322 clrf PORTA ; Puerta A como salida323 movlw b'10000111'324 movwf OPTION_REG325 movlw 0x00326 movwf PORTC ; La Puerta C salida327 bcf STATUS,RP0328 bsf PORTC,0 ; pulso de RESET329 call LCD_INI330 call DISPLAY_ON_CUR_OFF331 movlw 0x03332 movwf K333 movlw 0x02334 movwf K_1335 movwf K_2336 movlw d'150' ; Reatrdo en Y337 movwf RET338 movwf RET_1339 movlw 0x05340 movwf RET_2341 movlw 0x00 ; ************342 movwf REG00 ; ************343 movlw 0x02344 movwf REG02 ; ********************345 movlw 0x0B ; Bloque donde346 movwf REG01 ;347 movlw 0x0C ;348 movwf REG12 ; se dan valores349 movlw 0x05 ;

Página: 5

Archivo: principal.asm

350 movwf REG05 ;351 movlw 0x0A ;352 movwf REG10 ; para compararlos353 movlw 0x0F ;354 movwf REG15 ;355 movlw 0x14 ;356 movwf REG20 ; al valor357 movlw 0x1E ;358 movwf REG30 ;359 movlw 0x28 ;360 movwf REG40 ; que se361 movlw 0x3C ;362 movwf REG60 ;363 movlw 0x70 ;364 movwf REG70 ; teclea365 movlw 0x50 ;366 movwf REG80 ; *********************367 call ENTRADA368 call SOLICITA369 call COM_MUESTRA370 goto INICIO371372 ; Rutina de mensaje de Bienvenida373374 ENTRADA call UP_LCD ; Reconfigura LCD375 call BORRA_Y_HOME ; Actualiza376 movlw Mens_GEND ; Offset del mensaje377 call Mensaje ; Visualiza "generador de"378 movlw 0xC3379 call LCD_REG ; Ajusta posición del mensaje380 movlw Mens_FRE ; Offset del mensaje381 call Mensaje ; Visualiza "frecuencia"382 call RETARDO1383 return384385 ; Esta rutina saca al LCD el mensaje cuyo inicio est indicado en386 ; el acumulador387388 Mensaje movwf temp_1 ; Salva posición de la tabla389 Mensaje_1 movf temp_1,W ; Recupera posición de la tabla390 call tabla ; Busca caracter de salida391 movwf temp_2 ; Guarda el caracter392 movf temp_2,F393 btfss STATUS,Z ; Mira si es el ultimo394 goto No_es_ultimo395 return396 No_es_ultimo call LCD_DATO ; Visualiza en el LCD397 incf temp_1,F ; Siguiente caracter398 goto Mensaje_1 ; Repite con siguiente caracter399400 ; Rutina donde muestra el mensaje solicitando la frecuencia deseada401 ; ademas de visualizar los digitos introducidos402403 SOLICITA movlw 0x02404 movwf K405 movwf K_1406 call UP_LCD ; Reconfigura LCD407 call BORRA_Y_HOME ; Actualiza408 movlw Mens_FRE ; Offset del mensaje409 call Mensaje ; Visualiza "FRECUENCIA "410 movlw 0xC0411 call LCD_REG ; Ajusta posici¢n del mensaje412 movlw Mens_DES ; Offset del mensaje413 call Mensaje ; Visualiza "DESEADA?"414 call NO_HAY1415 movf TECLA,W416 movwf TECLA1417 movwf TECLA_5418 call RETARDO419 call RETARDO

Página: 6

Archivo: principal.asm

420 return421422 NO_HAY1 call KEY_SCAN ; Se hace un chequeo del teclado423 movlw 0x80424 subwf TECLA,W ; Sobre TECLA quedar la tecla pulsada o 0x80425 btfsc STATUS,Z426 goto NO_HAY1 ; No se ha pulsado ninguna tecla427 call KEY_OFF ; S¡ se ha pulsado. Se espera a que se suelte428 call KEY_HEX ; Se pasa a valor hexadecimal429 movwf TECLA430 call HEX_ASCII ; Se pasa el valor hexadecimal a c¢digo ASCII431 movwf TECLA1 ; w -> TECLA1432 movlw 0xCD ; CD -> w433 decfsz K,1434 movlw 0XCC435 call LCD_REG ; Reposiciona cursor del LCD436 incfsz K,1437 movf TECLA1,W438 call LCD_DATO439 movf TECLA,W440 decfsz K,1441 movwf TECLA_3442 incfsz K,1443 decfsz K,1444 goto NO_HAY1445 call SUMA446 movwf TECLA ; Se guarda temporalmente en TECLA447 decfsz K_1,1448 nop449 movlw 0x02450 movwf K451 return452453 SUMA movwf TECLA_1454 movlw 0x09455 movwf TECLA_2456 movf TECLA_3,W457 call SUMA_1458 addwf TECLA_1,W459 return460 SUMA_1 addwf TECLA_3,W461 decfsz TECLA_2,1462 goto SUMA_1463 return464465 NO_HAY call KEY_SCAN ; Se hace un chequeo del teclado466 movlw 0x80467 subwf TECLA,W ; Sobre TECLA quedar la tecla pulsada o 0x80468 btfsc STATUS,Z469 goto NO_HAY ; No se ha pulsado ninguna tecla470 call KEY_OFF ; Sí se ha pulsado. Se espera a que se suelte471 movlw d'25'472 movwf TEMP_1473 call DELAY10 ; Se crea una temporización de 25 ms474 call KEY_HEX ; Se pasa a valor hexadecimal475 movwf TECLAS476 return477478 RETARDO decfsz RET479 goto RETARDO480 decfsz RET_1481 goto RETARDO482 movlw d'150'483 movwf RET484 movwf RET_1485 return486487 ; Rutina que muestra el desplegado de la frecuencia,488 ; indicando si es la correcta para continuar o cancelar la489 ; ejecucion y comenzar de nuevo

Página: 7

Archivo: principal.asm

490491 COM_MUESTRA call UP_LCD ; Reconfigura LCD492 call BORRA_Y_HOME ; Actualiza493 movf REG05,0 ; Comparacion de igualdad494 xorwf TECLA1,0495 btfsc STATUS,2496 call FRECUENCIA05497 movf REG02,0 ; Comparacion de igualdad498 xorwf TECLA1,0499 btfsc STATUS,2500 call FRECUENCIA02501 movf REG01,0 ; Comparacion de igualdad502 xorwf TECLA1,0503 btfsc STATUS,2504 call FRECUENCIA01505 movf REG12,0 ; Comparacion de igualdad506 xorwf TECLA1,0507 btfsc STATUS,2508 call FRECUENCIA12509 movf REG10,0 ; Comparacion de igualdad510 xorwf TECLA_5,0511 btfsc STATUS,2512 call FRECUENCIA10513 movf REG15,0 ; Comparacion de igualdad514 xorwf TECLA1,0515 btfsc STATUS,2516 call FRECUENCIA15517 movf REG20,0 ; Comparacion de igualdad518 xorwf TECLA1,0519 btfsc STATUS,2520 call FRECUENCIA20521 movf REG30,0 ; Comparacion de igualdad522 xorwf TECLA1,0523 btfsc STATUS,2524 call FRECUENCIA30525 movf REG40,0 ; Comparacion de igualdad526 xorwf TECLA1,0527 btfsc STATUS,2528 call FRECUENCIA40529 movf REG60,0 ; Comparacion de igualdad530 xorwf TECLA1,0531 btfsc STATUS,2532 call FRECUENCIA60533 movf REG80,0 ; Comparacion de igualdad534 xorwf TECLA1,0535 btfsc STATUS,2536 call FRECUENCIA80537 movf REG00,0 ; Comparacion de igualdad538 xorwf TECLA1,0539 btfsc STATUS,2540 call CHIRPS541 return542543544 RETARDO1 decfsz RET545 goto RETARDO1546 decfsz RET_1547 goto RETARDO1548 decfsz RET_2549 goto RETARDO1550 movlw 0xFF551 movwf RET552 movwf RET_1553 movlw 0x05554 movwf RET_2555 return556557 ;RUTINA DE DELAY DE 10 MS: Esta rutina utiliza el TMR0.558 ;Es una temporizaci¢n de 10 ms que se repite tantas veces559 ;como indique la variable TEMPO1

Página: 8

Archivo: principal.asm

560561562 DELAY10 bcf INTCON,2 ; Borra flag del TMR0563 movlw 0xD8564 movwf TMR0 ; Carga el TMR0 con valor 39565 DELAY10_1 btfss INTCON,2 ; Espera rebosamiento del TMR0566 goto DELAY10_1567 decfsz TEMP_1,F568 goto DELAY10569 return570571 ;RUTINA DE DELAY DE 1 SEGUNDO: Se basa en la rutina de 10ms, repiti‚ndola 100 veces572573 DELAY1S movlw 0x64574 movwf TEMP_1575 call DELAY10576 return577578 ;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_SCAN580581582 KEY_OFF movf TECLA,W583 movwf TEMP_1 ; Guarda temporalmente la tecla584 KEY_OFF_NO call KEY_SCAN ; Mira si se ha soltado585 movlw 0x80586 subwf TECLA,W587 btfss STATUS,Z588 goto KEY_OFF_NO ; Bucle mientras no se suelte589 movf TEMP_1,W ; Ya se ha soltado590 movwf TECLA ; Se repone la tecla591 return592593 ;RUTINA DE DELAY VARIABLE: Esta rutina realiza una temporizaci¢n que594 ;depende del valor del acumulador en el momento en que se le llama595596 DELAY_V movwf DELAY_1597 clrf DELAY_3598 clrf DELAY_2599 DELAY_LOOP decfsz DELAY_3,F600 goto DELAY_LOOP601 decfsz DELAY_2,F602 goto DELAY_LOOP603 decfsz DELAY_1,F604 goto DELAY_LOOP605 return606607 ; Rutina que muestra en pantalla la frecuencia608609 CHEQUEO call Mensaje610 movlw 0xC2611 call LCD_REG ; Reposiciona cursor del LCD612 movlw EVALUO613 call Mensaje ; Visualiza"NO.(*), SI(#)"614 return615616 CONFIRMA call NO_HAY617 movlw 0x0A618 subwf TECLAS,W619 btfsc STATUS,Z620 call INICIO ; Se vuelve a empezar621 movlw 0x0B622 subwf TECLAS,W623 btfsc STATUS,Z624 return625 call UP_LCD ; Reconfigura LCD626 call BORRA_Y_HOME ; Actualiza627 goto INICIO628629 ; 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 cancelar631632 FRECUENCIA02 call UP_LCD ; Reconfigura LCD633 call BORRA_Y_HOME ; Actualiza634 movlw 0x82635 call LCD_REG ; Ajusta posición del mensaje636 movlw FREC02 ;Offset del mensaje637 call CHEQUEO638 call CONFIRMA639 call IGUAL02640641 FRECUENCIA05 call muestra642 movlw FREC05 ;Offset del mensaje643 call CHEQUEO644 call CONFIRMA645 call IGUAL05646647 FRECUENCIA10 call muestra648 movlw FREC10 ;Offset del mensaje649 call CHEQUEO650 call CONFIRMA651 call IGUAL10652653 FRECUENCIA15 call muestra654 movlw FREC15 ;Offset del mensaje655 call CHEQUEO656 call CONFIRMA657 call IGUAL15658659 FRECUENCIA20 call muestra660 movlw FREC20 ;Offset del mensaje661 call CHEQUEO662 call CONFIRMA663 call IGUAL20664665 FRECUENCIA30 call muestra666 movlw FREC30 ;Offset del mensaje667 call CHEQUEO668 call CONFIRMA669 call IGUAL30670671 FRECUENCIA40 call muestra672 movlw FREC40 ;Offset del mensaje673 call CHEQUEO674 call CONFIRMA675 call IGUAL40676677 FRECUENCIA60 call muestra678 movlw FREC60 ;Offset del mensaje679 call CHEQUEO680 call CONFIRMA681 call IGUAL60682683 FRECUENCIA80 call muestra684 movlw FREC80 ;Offset del mensaje685 call CHEQUEO686 call CONFIRMA687 call IGUAL80688689 FRECUENCIA01 call muestra690 movlw FREC01 ;Offset del mensaje691 call CHEQUEO692 call CONFIRMA693 call IGUAL01694695 FRECUENCIA12 call muestra696 movlw FREC12 ;Offset del mensaje697 call CHEQUEO698 call CONFIRMA699 call IGUAL12

Página: 10

Archivo: principal.asm

700701 CHIRPS call muestra702 movlw GENEN ;Offset del mensaje703 call CHEQUEO704 call CONFIRMA705 call IGCHIRP706707 END

Página: 11

Archivo: generador.asm

1 ; generador.asm2 ; Carpeta donde estan las rutinas que son llamadas al intruducir la frecuencia3 ; deseada456 ; Rutina que se ejecuta al ser igual la frecuenca a F = 0.025 Hz78 IGUAL02 call MEN_INICIO9 call muestra10 movlw FREC02 ; Offset del mensaje11 call GENERANDO1213 parpa02 bcf PORTC,5 ; Dashabilita el Clear14 bsf PORTC,7 ; Enciende el led RB7 = 115 bsf PORTC,0 ; En estado alto el Reset16 call retardo02 ; Llamada a subrutina de RETARDO17 bcf PORTC,7 ; Apaga el led, RB7 = 018 call retardo0219 decf CONTA2,020 movwf CONTA221 btfss STATUS,2 ; Checa cuantas veces se hecho el ciclo-6422 goto parpa0223 call seg20224 retardo02 movlw d'76' ; 95 -> W25 movwf CONTA26 bucle02 call explora0227 clrf TMR0_OPT ; TMR0 = 0 y empieza su incremento28 decf CONTA,0 ; CONTA - 1 -> W29 movwf CONTA ; Se actualiza FZ30 btfss STATUS,2 ; ¨FZ = 1?31 goto bucle02 ; Otra vez al bucle de exploraci¢n32 return ; Se ha explorado 76 veces3334 explora02 btfss TMR0_OPT,4 ; TMR0<4> = 1?35 goto explora02 ; No ha llegado TMR0 a 16d36 return ; Ha llegado TMR0 al37 ; valor 16d y retorna38 ; al programa principal39 seg202 movlw d'64'40 movwf CONTA241 bcf PORTC,6 ; Pone el bit 6 del puerto c a 042 decf CONTA3,0 ; CONTA - 1 -> W43 movwf CONTA3 ; Se actualiza FZ44 btfss STATUS,245 goto parpa0246 call seg3024748 seg302 movlw d'2'49 movwf CONTA350 bsf PORTC,6 ; Pone el bit 6 del puerto c a 151 decf CONTA4,052 movwf CONTA453 btfss STATUS,2 ; Cuenta las veces que cambia S054 goto parpa0255 call seg4025657 seg402 movlw d'1' ; Boloque que checa el contador para58 movwf CONTA4 ; realizar el pulso59 bcf PORTC,0 ; de reset al neumotacografo60 call PULSO ; cada ciclo respiratorio61 goto parpa02 ; dejando apagado el PORC-06263 ; ******************************************************************************64 ; TERMINA BLOQUE DE F = 0.025 Hz65 ; ******************************************************************************666768 ; Rutina que se ejecuta al ser igual la frecuenca a F = 0.05 Hz6970 IGUAL05 call MEN_INICIO

Página: 1

Archivo: generador.asm

71 call muestra72 movlw FREC05 ; Offset del mensaje73 call GENERANDO747576 parpa05 bcf PORTC,577 bsf PORTC,7 ; Enciende el led RB7 = 178 bsf PORTC,079 call retardo05 ; Llamada a subrutina de RETARDO80 bcf PORTC,7 ; Apaga el led, RB7 = 081 call retardo0582 decf CONTA2,083 movwf CONTA284 btfss STATUS,285 goto parpa0586 call seg2058788 retardo05 movlw d'38' ; 38 -> W89 movwf CONTA90 bucle05 call explora0591 clrf TMR0_OPT ; TMR0 = 0 y empieza su incremento92 decf CONTA,0 ; CONTA - 1 -> W93 movwf CONTA ; Se actualiza FZ94 btfss STATUS,2 ; ¨FZ = 1?95 goto bucle05 ; Otra vez al bucle de exploraci¢n96 return ; Se ha explorado 38 veces9798 explora05 btfss TMR0_OPT,4 ; TMR0<4> = 1?99 goto explora05 ; No ha llegado TMR0 a 16d100 return ; Ha llegado TMR0 al101 ; valor 16d y retorna102 ; al programa principal103 seg205 movlw d'64'104 movwf CONTA2105 bcf PORTC,6106 decf CONTA3,0 ; CONTA - 1 -> W107 movwf CONTA3 ; Se actualiza FZ108 btfss STATUS,2109 goto parpa05110 call seg305111112 seg305 movlw d'2'113 movwf CONTA3114 bsf PORTC,6115 decf CONTA4,0116 movwf CONTA4117 btfss STATUS,2118 goto parpa05119 call seg405120121 seg405 movlw d'1'122 movwf CONTA4123 bcf PORTC,0124 call PULSO125 goto parpa05126127 ; ******************************************************************************128 ; TERMINA BLOQUE DE F = 0.05 Hz129 ; ******************************************************************************130131132133 ; Rutina que se ejecuta al ser igual la frecuenca a F = 0.10 Hz134135136 IGUAL10 call MEN_INICIO137 call muestra138 movlw FREC10 ; Offset del mensaje139 call GENERANDO140

Página: 2

Archivo: generador.asm

141 parpa10 bcf PORTC,5142 bsf PORTC,0143 bsf PORTC,7 ; Enciende el led RB7 = 1144 call retardo10 ; Llamada a subrutina de RETARDO145 bcf PORTC,7 ; Apaga el led, RB7 = 0146 call retardo10147 decf CONTA2,0148 movwf CONTA2149 btfss STATUS,2150 goto parpa10151 call seg210152153 retardo10 movlw d'19' ; 19 -> W154 movwf CONTA155 bucle10 call explora10156 clrf TMR0_OPT ; TMR0 = 0 y empieza su incremento157 decf CONTA,0 ; CONTA - 1 -> W158 movwf CONTA ; Se actualiza FZ159 btfss STATUS,2 ; ¨FZ = 1?160 goto bucle10 ; Otra vez al bucle de exploraci¢n161 return ; Se ha explorado 19 veces162163164 explora10 btfss TMR0_OPT,4 ; TMR0<4> = 1?165 goto explora10 ; No ha llegado TMR0 a 4d166 return ; Ha llegado TMR0 al167 ; valor 4d y retorna168 ; al programa principal169 seg210 movlw d'64'170 movwf CONTA2171 bcf PORTC,6172 decf CONTA3,0 ; CONTA - 1 -> W173 movwf CONTA3 ; Se actualiza FZ174 btfss STATUS,2175 goto parpa10176 call seg310177178 seg310 movlw d'2'179 movwf CONTA3180 bsf PORTC,6181 decf CONTA4,0182 movwf CONTA4183 btfss STATUS,2184 goto parpa10185 call seg410186187 seg410 movlw d'1'188 movwf CONTA4189 bcf PORTC,0190 call PULSO191 goto parpa10192193 ; ******************************************************************************194 ; TERMINA BLOQUE DE F = 0.10 Hz195 ; ******************************************************************************196197198 ; Rutina que se ejecuta al ser igual la frecuenca a F = 0.15 Hz199200 IGUAL15 call MEN_INICIO201 call muestra202 movlw FREC15 ; Offset del mensaje203 call GENERANDO204205 parpa15 bcf PORTC,5206 bsf PORTC,0207 bsf PORTC,7 ; Enciende el led RB7 = 1208 call retardo15 ; Llamada a subrutina de RETARDO209 bcf PORTC,7 ; Apaga el led, RB7 = 0210 call retardo15

Página: 3

Archivo: generador.asm

211 decf CONTA2,0212 movwf CONTA2213 btfss STATUS,2214 goto parpa15215 call seg215216217 retardo15 movlw d'51' ; 25 -> W 25 ANTES218 movwf CONTA219 bucle15 call explora15220 clrf TMR0_OPT ; TMR0 = 0 y empieza su incremento221 decf CONTA,0 ; CONTA - 1 -> W222 movwf CONTA ; Se actualiza FZ223 btfss STATUS,2 ; ¨FZ = 1?224 goto bucle15 ; Otra vez al bucle de exploraci¢n225 return ; Se ha explorado 122 veces226227228 explora15 btfss TMR0_OPT,2 ; TMR0<4> = 1?229 goto explora15 ; No ha llegado TMR0 a 4d230 return ; Ha llegado TMR0 al231 ; valor 4d y retorna232 ; al programa principal233 seg215 movlw d'64'234 movwf CONTA2235 bcf PORTC,6236 decf CONTA3,0 ; CONTA - 1 -> W237 movwf CONTA3 ; Se actualiza FZ238 btfss STATUS,2239 goto parpa15240 call seg315241242 seg315 movlw d'2'243 movwf CONTA3244 bsf PORTC,6245 decf CONTA4,0246 movwf CONTA4247 btfss STATUS,2248 goto parpa15249 call seg415250251 seg415 movlw d'1'252 movwf CONTA4253 bcf PORTC,0254 call PULSO255 goto parpa15256257258 ; ******************************************************************************259 ; TERMINA BLOQUE DE F = 0.15 Hz260 ; ******************************************************************************261262263 ; Rutina que se ejecuta al ser igual la frecuenca a F = 0.20 Hz264265266 IGUAL20 call MEN_INICIO267 call muestra268 movlw FREC20 ; Offset del mensaje 2269 call GENERANDO270271 parpa20 bcf PORTC,5272 bsf PORTC,0273 bsf PORTC,7 ; Enciende el led RB7 = 1274 call retardo20 ; Llamada a subrutina de RETARDO275 bcf PORTC,7 ; Apaga el led, RB7 = 0276 call retardo20277 decf CONTA2,0278 movwf CONTA2279 btfss STATUS,2280 goto parpa20

Página: 4

Archivo: generador.asm

281 call seg220282283 retardo20 movlw d'38' ; 38 -> W284 movwf CONTA285 bucle20 call explora20286 clrf TMR0_OPT ; TMR0 = 0 y empieza su incremento287 decf CONTA,0 ; CONTA - 1 -> W288 movwf CONTA ; Se actualiza FZ289 btfss STATUS,2 ; ¨FZ = 1?290 goto bucle20 ; Otra vez al bucle de exploraci¢n291 return ; Se ha explorado 38 veces292293294 explora20 btfss TMR0_OPT,2 ; TMR0<4> = 1?295 goto explora20 ; No ha llegado TMR0 a 4d296 return ; Ha llegado TMR0 al297 ; valor 4d y retorna298 ; al programa principal299 seg220 movlw d'64'300 movwf CONTA2301 bcf PORTC,6302 decf CONTA3,0 ; CONTA - 1 -> W303 movwf CONTA3 ; Se actualiza FZ304 btfss STATUS,2305 goto parpa20306 call seg320307308 seg320 movlw d'2'309 movwf CONTA3310 bsf PORTC,6311 decf CONTA4,0312 movwf CONTA4313 btfss STATUS,2314 goto parpa20315 call seg420316317 seg420 movlw d'1'318 movwf CONTA4319 bcf PORTC,0320 call PULSO321 goto parpa20322323324 ; ******************************************************************************325 ; TERMINA BLOQUE DE F = 0.20 Hz326 ; ******************************************************************************327328329330 ; Rutina que se ejecuta al ser igual la frecuenca a F = 0.30331332 IGUAL30 call MEN_INICIO333 call muestra334 movlw FREC30 ; Offset del mensaje335 call GENERANDO336337 parpa30 bcf PORTC,5338 bsf PORTC,0339 bsf PORTC,7 ; Enciende el led RB7 = 1340 call retardo30 ; Llamada a subrutina de RETARDO341 bcf PORTC,7 ; Apaga el led, RB7 = 0342 call retardo30343 decf CONTA2,0344 movwf CONTA2345 btfss STATUS,2346 goto parpa30347 call seg230348349 retardo30 movlw d'12' ; 12 -> W350 movwf CONTA

Página: 5

Archivo: generador.asm

351 bucle30 call explora30352 clrf TMR0_OPT ; TMR0 = 0 y empieza su incremento353 decf CONTA,0 ; CONTA - 1 -> W354 movwf CONTA ; Se actualiza FZ355 btfss STATUS,2 ; ¨FZ = 1?356 goto bucle30 ; Otra vez al bucle de exploraci¢n357 return ; Se ha explorado 12 veces358359360 explora30 btfss TMR0_OPT,3 ; TMR0<4> = 1?361 goto explora30 ; No ha llegado TMR0 a 8d362 return ; Ha llegado TMR0 al363 ; valor 8d y retorna364 ; al programa principal365 seg230 movlw d'64'366 movwf CONTA2367 bcf PORTC,6368 decf CONTA3,0 ; CONTA - 1 -> W369 movwf CONTA3 ; Se actualiza FZ370 btfss STATUS,2371 goto parpa30372 call seg330373374 seg330 movlw d'2'375 movwf CONTA3376 bsf PORTC,6377 decf CONTA4,0378 movwf CONTA4379 btfss STATUS,2380 goto parpa30381 call seg430382383 seg430 movlw d'1'384 movwf CONTA4385 bcf PORTC,0386 call PULSO387 goto parpa30388389 ; ******************************************************************************390 ; TERMINA BLOQUE DE F = 0.30 Hz391 ; ******************************************************************************392393394395 ; Rutina que se ejecuta al ser igual la frecuenca a F = 0.4 Hz396397 IGUAL40 call MEN_INICIO398 call muestra399 movlw FREC40 ; Offset del mensaje 2400 call GENERANDO401402 parpa40 bcf PORTC,5403 bsf PORTC,0404 bsf PORTC,7 ; Enciende el led RB7 = 1405 call retardo40 ; Llamada a subrutina de RETARDO406 bcf PORTC,7 ; Apaga el led, RB7 = 0407 call retardo40408 decf CONTA2,0409 movwf CONTA2410 btfss STATUS,2411 goto parpa40412 call seg240413414 retardo40 movlw d'37' ; 37 -> W415 movwf CONTA416 bucle40 call explora40417 clrf TMR0_OPT ; TMR0 = 0 y empieza su incremento418 decf CONTA,0 ; CONTA - 1 -> W419 movwf CONTA ; Se actualiza FZ420 btfss STATUS,2 ; ¨FZ = 1?

Página: 6

Archivo: generador.asm

421 goto bucle40 ; Otra vez al bucle de exploraci¢n422 return ; Se ha explorado 122 veces423424425 explora40 btfss TMR0_OPT,1 ; TMR0<4> = 1?426 goto explora40 ; No ha llegado TMR0 a 2d427 return ; Ha llegado TMR0 al428 ; valor 2d y retorna429 ; al programa principal430 seg240 movlw d'64'431 movwf CONTA2432 bcf PORTC,6433 decf CONTA3,0 ; CONTA - 1 -> W434 movwf CONTA3 ; Se actualiza FZ435 btfss STATUS,2436 goto parpa40437 call seg340438439 seg340 movlw d'2'440 movwf CONTA3441 bsf PORTC,6442 decf CONTA4,0443 movwf CONTA4444 btfss STATUS,2445 goto parpa40446 call seg440447448 seg440 movlw d'1'449 movwf CONTA4450 bcf PORTC,0451 call PULSO452 goto parpa40453454 ; ******************************************************************************455 ; TERMINA BLOQUE DE F = 0.40 Hz456 ; ******************************************************************************457458459 ; Rutina que se ejecuta al ser igual la frecuenca a F = 0.60 Hz460461 IGUAL60 call MEN_INICIO462 call muestra463 movlw FREC60 ; Offset del mensaje 2464 call GENERANDO465466467 parpa60 bcf PORTC,5468 bsf PORTC,0469 bsf PORTC,7 ; Enciende el led RB7 = 1470 call retardo60 ; Llamada a subrutina de RETARDO471 bcf PORTC,7 ; Apaga el led, RB7 = 0472 call retardo60473 decf CONTA2,0474 movwf CONTA2475 btfss STATUS,2476 goto parpa60477 call seg260478479 retardo60 movlw d'25' ; 24 -> W480 movwf CONTA481 bucle60 call explora60482 clrf TMR0_OPT ; TMR0 = 0 y empieza su incremento483 decf CONTA,0 ; CONTA - 1 -> W484 movwf CONTA ; Se actualiza FZ485 btfss STATUS,2 ; ¨FZ = 1?486 goto bucle60 ; Otra vez al bucle de exploraci¢n487 return ; Se ha explorado 122 veces488489490 explora60 btfss TMR0_OPT,1 ; TMR0<1> = 1?

Página: 7

Archivo: generador.asm

491 goto explora60 ; No ha llegado TMR0 a 2d492 return ; Ha llegado TMR0 al493 ; valor 2d y retorna494 ; al programa principal495 seg260 movlw d'64'496 movwf CONTA2497 bcf PORTC,6498 decf CONTA3,0 ; CONTA - 1 -> W499 movwf CONTA3 ; Se actualiza FZ500 btfss STATUS,2501 goto parpa60502 call seg360503504 seg360 movlw d'2'505 movwf CONTA3506 bsf PORTC,6507 decf CONTA4,0508 movwf CONTA4509 btfss STATUS,2510 goto parpa60511 call seg460512513 seg460 movlw d'1'514 movwf CONTA4515 bcf PORTC,0516 call PULSO517 goto parpa60518519 ; ******************************************************************************520 ; TERMINA BLOQUE DE F = 0.60 Hz521 ; ******************************************************************************522523524525 ; Rutina que se ejecuta al ser igual la frecuenca a F = 0.80 Hz526527 IGUAL80 call MEN_INICIO528 call muestra529 movlw FREC80 ; Offset del mensaje530 call GENERANDO531532 parpa80 bcf PORTC,5533 bsf PORTC,0534 bsf PORTC,7 ; Enciende el led RB7 = 1535 call retardo80 ; Llamada a subrutina de RETARDO536 bcf PORTC,7 ; Apaga el led, RB7 = 0537 call retardo80538 decf CONTA2,0539 movwf CONTA2540 btfss STATUS,2541 goto parpa80542 call seg280543544 retardo80 movlw d'38' ; 36 -> W545 movwf CONTA546 bucle80 call explora80547 clrf TMR0_OPT ; TMR0 = 0 y empieza su incremento548 decf CONTA,0 ; CONTA - 1 -> W549 movwf CONTA ; Se actualiza FZ550 btfss STATUS,2 ; ¨FZ = 1?551 goto bucle80 ; Otra vez al bucle de exploraci¢n552 return ; Se ha explorado 36 veces553554555 explora80 btfss TMR0_OPT,0 ; TMR0<4> = 1?556 goto explora80 ; No ha llegado TMR0 a 1d557 return ; Ha llegado TMR0 al558 ; valor 1d y retorna559 ; al programa principal560 seg280 movlw d'64'

Página: 8

Archivo: generador.asm

561 movwf CONTA2562 bcf PORTC,6563 decf CONTA3,0 ; CONTA - 1 -> W564 movwf CONTA3 ; Se actualiza FZ565 btfss STATUS,2566 goto parpa80567 call seg380568569 seg380 movlw d'2'570 movwf CONTA3571 bsf PORTC,6572 decf CONTA4,0573 movwf CONTA4574 btfss STATUS,2575 goto parpa80576 call seg480577578 seg480 movlw d'1'579 movwf CONTA4580 bcf PORTC,0581 call PULSO582 goto parpa80583584 ; ******************************************************************************585 ; TERMINA BLOQUE DE F = 0.80 Hz586 ; ******************************************************************************587588589590 ; Rutina que se ejecuta al ser igual la frecuenca a F = 1.2 Hz591592 IGUAL12 call MEN_INICIO593 call muestra594 movlw FREC12 ; Offset del mensaje595 call GENERANDO596597 parpa12 bcf PORTC,5598 bsf PORTC,7 ; Enciende el led RB7 = 1599 bsf PORTC,0600 call retardo12 ; Llamada a subrutina de RETARDO601 bcf PORTC,7 ; Apaga el led, RB7 = 0602 call retardo12603 decf CONTA2,0604 movwf CONTA2605 btfss STATUS,2606 goto parpa12607 call seg212608609 retardo12 movlw d'24' ; 24 -> W610 movwf CONTA611 bucle12 call explora12612 clrf TMR0_OPT ; TMR0 = 0 y empieza su incremento613 decf CONTA,0 ; CONTA - 1 -> W614 movwf CONTA ; Se actualiza FZ615 btfss STATUS,2 ; ¨FZ = 1?616 goto bucle12 ; Otra vez al bucle de exploraci¢n617 return ; Se ha explorado 24 veces618619 explora12 btfss TMR0_OPT,0 ; TMR0<4> = 1?620 goto explora12 ; No ha llegado TMR0 a 1d621 return ; Ha llegado TMR0 al622 ; valor 1d y retorna623 ; al programa principal624 seg212 movlw d'64'625 movwf CONTA2626 bcf PORTC,6627 decf CONTA3,0 ; CONTA - 1 -> W628 movwf CONTA3 ; Se actualiza FZ629 btfss STATUS,2630 goto parpa12

Página: 9

Archivo: generador.asm

631 call seg312632633 seg312 movlw d'2'634 movwf CONTA3635 bsf PORTC,6636 decf CONTA4,0637 movwf CONTA4638 btfss STATUS,2639 goto parpa12640 call seg412641642 seg412 movlw d'1'643 movwf CONTA4644 bcf PORTC,0645 call PULSO646 goto parpa12647648 ; ******************************************************************************649 ; TERMINA BLOQUE DE F = 1.2 Hz650 ; ******************************************************************************651652653654 ; Rutina que se ejecuta al ser igual la frecuenca a F = 1.0 Hz655656 IGUAL01 call MEN_INICIO657 call muestra658 movlw FREC01 ; Offset del mensaje659 call GENERANDO660661 parpa01 bsf PORTC,7 ; Enciende el led RB7 = 1662 bsf PORTC,0663 bcf PORTC,5664 call retardo01 ; Llamada a subrutina de RETARDO665 bcf PORTC,7 ; Apaga el led, RB7 = 0666 call retardo01667 decf CONTA2,0668 movwf CONTA2669 btfss STATUS,2670 goto parpa01671 call seg201672673 retardo01 movlw d'28' ; 28 -> W674 movwf CONTA675 bucle01 call explora01676 clrf TMR0_OPT ; TMR0 = 0 y empieza su incremento677 decf CONTA,0 ; CONTA - 1 -> W678 movwf CONTA ; Se actualiza FZ679 btfss STATUS,2 ; ¨FZ = 1?680 goto bucle01 ; Otra vez al bucle de exploraci¢n681 return ; Se ha explorado 28 veces682683684 explora01 btfss TMR0_OPT,0 ; TMR0<0> = 1?685 goto explora01 ; No ha llegado TMR0 a 1d686 return ; Ha llegado TMR0 al687 ; valor 1d y retorna688 ; al programa principal689 seg201 movlw d'64'690 movwf CONTA2691 bcf PORTC,6692 decf CONTA3,0 ; CONTA - 1 -> W693 movwf CONTA3 ; Se actualiza FZ694 btfss STATUS,2695 goto parpa01696 call seg301697698 seg301 movlw d'2'699 movwf CONTA3700 bsf PORTC,6

Página: 10

Archivo: generador.asm

701 decf CONTA4,0702 movwf CONTA4703 btfss STATUS,2704 goto parpa01705 call seg401706707 seg401 movlw d'1'708 movwf CONTA4709 bcf PORTC,0710 call PULSO711 goto parpa01712713714 ; ******************************************************************************715 ; TERMINA BLOQUE DE F = 1.0 Hz716 ; ******************************************************************************717718719720 PULSO decfsz RETA721 goto PULSO722 decfsz RETA_1723 goto PULSO724 movlw d'20'725 movwf RETA726 movwf RETA_1727 return728729730 MEN_INICIO bsf STATUS,5 ; Banco 1731 movlw b'11010110' ; Valor a cargar en OPTION732 movwf TMR0_OPT733 movlw 0x00734 movwf PORTC ; La Puerta C salida735 bcf STATUS,5 ; Banco 0736 clrf PORTC737 bcf PORTC,7 ; Bit del reloj738 bsf PORTC,6 ; S0 se pone a 1739 bsf PORTC,0 ; Pulso de RESET740 bsf PORTC,5 ; Bit de Clear741 movlw d'20' ; Reatrdo del pulso742 movwf RETA743 movwf RETA_1744 movlw d'64' ; Numero de bits de la barra a contar745 movwf CONTA2746 movlw d'2' ; Ciclos para el registro de direccion del 299747 movwf CONTA3748 movlw d'1'749 movwf CONTA4 ; Ciclos que espera para el pulso de reset750 return751752 muestra call UP_LCD ; Reconfigura LCD753 call BORRA_Y_HOME ; Actualiza754 movlw 0x83755 call LCD_REG ; Ajusta posición del mensaje756 return757758 GENERANDO call Mensaje759 movlw 0xC3760 call LCD_REG ; Reposiciona cursor del LCD761 movlw GENEN762 call Mensaje763 return764765766 IGCHIRP call MEN_INICIO767 call muestra768 movlw GENEN ; Offset del mensaje769 call GENERANDO770

Página: 11

Archivo: generador.asm

771 igparpa05 bcf PORTC,5772 bsf PORTC,7 ; Enciende el led RB7 = 1773 bsf PORTC,0774 call igretardo05 ; Llamada a subrutina de RETARDO775 bcf PORTC,7 ; Apaga el led, RB7 = 0776 call igretardo05777 decf CONTA2,0778 movwf CONTA2779 btfss STATUS,2780 goto igparpa05781 call igseg205782783 igretardo05 movlw d'38' ; 38 -> W784 movwf CONTA785 igbucle05 call igexplora05786 clrf TMR0_OPT ; TMR0 = 0 y empieza su incremento787 decf CONTA,0 ; CONTA - 1 -> W788 movwf CONTA ; Se actualiza FZ789 btfss STATUS,2 ; ¨FZ = 1?790 goto igbucle05 ; Otra vez al bucle de exploraci¢n791 return ; Se ha explorado 38 veces792793 igexplora05 btfss TMR0_OPT,4 ; TMR0<4> = 1?794 goto explora05 ; No ha llegado TMR0 a 64d795 return ; Ha llegado TMR0 al796 ; valor 64d y retorna797 ; al programa principal798 igseg205 movlw d'64'799 movwf CONTA2800 bcf PORTC,6801 call igparpa10802803804 igparpa10 bcf PORTC,5805 bsf PORTC,0806 bsf PORTC,7 ; Enciende el led RB7 = 1807 call igretardo10 ; Llamada a subrutina de RETARDO808 bcf PORTC,7 ; Apaga el led, RB7 = 0809 call igretardo10810 decf CONTA2,0811 movwf CONTA2812 btfss STATUS,2813 goto igparpa10814 call igseg210815816 igretardo10 movlw d'19' ; 19 -> W817 movwf CONTA818 igbucle10 call igexplora10819 clrf TMR0_OPT ; TMR0 = 0 y empieza su incremento820 decf CONTA,0 ; CONTA - 1 -> W821 movwf CONTA ; Se actualiza FZ822 btfss STATUS,2 ; ¨FZ = 1?823 goto igbucle10 ; Otra vez al bucle de exploraci¢n824 return ; Se ha explorado 19 veces825826827 igexplora10 btfss TMR0_OPT,4 ; TMR0<4> = 1?828 goto igexplora10 ; No ha llegado TMR0 a 64d829 return ; Ha llegado TMR0 al830 ; valor 64d y retorna831 ; al programa principal832 igseg210 movlw d'64'833 movwf CONTA2834 bsf PORTC,6835 bcf PORTC,0836 call PULSO837 call igparpa15838839840 igparpa15 bcf PORTC,5

Página: 12

Archivo: generador.asm

841 bsf PORTC,0842 bsf PORTC,7 ; Enciende el led RB7 = 1843 call igretardo15 ; Llamada a subrutina de RETARDO844 bcf PORTC,7 ; Apaga el led, RB7 = 0845 call igretardo15846 decf CONTA2,0847 movwf CONTA2848 btfss STATUS,2849 goto igparpa15850 call igseg215851852 igretardo15 movlw d'25' ; 25 -> W853 movwf CONTA854 igbucle15 call igexplora15855 clrf TMR0_OPT ; TMR0 = 0 y empieza su incremento856 decf CONTA,0 ; CONTA - 1 -> W857 movwf CONTA ; Se actualiza FZ858 btfss STATUS,2 ; ¨FZ = 1?859 goto igbucle15 ; Otra vez al bucle de exploraci¢n860 return ; Se ha explorado 122 veces861862863 igexplora15 btfss TMR0_OPT,3 ; TMR0<4> = 1?864 goto igexplora15 ; No ha llegado TMR0 a 64d865 return ; Ha llegado TMR0 al866 ; valor 64d y retorna867 ; al programa principal868 igseg215 movlw d'64'869 movwf CONTA2870 bcf PORTC,6871 call igparpa20872873 igparpa20 bcf PORTC,5874 bsf PORTC,0875 bsf PORTC,7 ; Enciende el led RB7 = 1876 call igretardo20 ; Llamada a subrutina de RETARDO877 bcf PORTC,7 ; Apaga el led, RB7 = 0878 call igretardo20879 decf CONTA2,0880 movwf CONTA2881 btfss STATUS,2882 goto igparpa20883 call igseg220884885 igretardo20 movlw d'38' ; 38 -> W886 movwf CONTA887 igbucle20 call igexplora20888 clrf TMR0_OPT ; TMR0 = 0 y empieza su incremento889 decf CONTA,0 ; CONTA - 1 -> W890 movwf CONTA ; Se actualiza FZ891 btfss STATUS,2 ; ¨FZ = 1?892 goto igbucle20 ; Otra vez al bucle de exploraci¢n893 return ; Se ha explorado 38 veces894895896 igexplora20 btfss TMR0_OPT,2 ; TMR0<4> = 1?897 goto igexplora20 ; No ha llegado TMR0 a 64d898 return ; Ha llegado TMR0 al899 ; valor 64d y retorna900 ; al programa principal901 igseg220 movlw d'64'902 movwf CONTA2903 bsf PORTC,6904 bcf PORTC,0905 call PULSO906 call igparpa30907908909 igparpa30 bcf PORTC,5910 bsf PORTC,0

Página: 13

Archivo: generador.asm

911 bsf PORTC,7 ; Enciende el led RB7 = 1912 call igretardo30 ; Llamada a subrutina de RETARDO913 bcf PORTC,7 ; Apaga el led, RB7 = 0914 call igretardo30915 decf CONTA2,0916 movwf CONTA2917 btfss STATUS,2918 goto igparpa30919 call igseg230920921 igretardo30 movlw d'12' ; 12 -> W922 movwf CONTA923 igbucle30 call igexplora30924 clrf TMR0_OPT ; TMR0 = 0 y empieza su incremento925 decf CONTA,0 ; CONTA - 1 -> W926 movwf CONTA ; Se actualiza FZ927 btfss STATUS,2 ; ¨FZ = 1?928 goto igbucle30 ; Otra vez al bucle de exploraci¢n929 return ; Se ha explorado 12 veces930931932 igexplora30 btfss TMR0_OPT,3 ; TMR0<4> = 1?933 goto igexplora30 ; No ha llegado TMR0 a 64d934 return ; Ha llegado TMR0 al935 ; valor 64d y retorna936 ; al programa principal937 igseg230 movlw d'64'938 movwf CONTA2939 bcf PORTC,6940 call igparpa40941942943 igparpa40 bcf PORTC,5944 bsf PORTC,0945 bsf PORTC,7 ; Enciende el led RB7 = 1946 call igretardo40 ; Llamada a subrutina de RETARDO947 bcf PORTC,7 ; Apaga el led, RB7 = 0948 call igretardo40949 decf CONTA2,0950 movwf CONTA2951 btfss STATUS,2952 goto igparpa40953 call igseg240954955 igretardo40 movlw d'37' ; 37 -> W956 movwf CONTA957 igbucle40 call igexplora40958 clrf TMR0_OPT ; TMR0 = 0 y empieza su incremento959 decf CONTA,0 ; CONTA - 1 -> W960 movwf CONTA ; Se actualiza FZ961 btfss STATUS,2 ; ¨FZ = 1?962 goto igbucle40 ; Otra vez al bucle de exploraci¢n963 return ; Se ha explorado 122 veces964965966 igexplora40 btfss TMR0_OPT,1 ; TMR0<4> = 1?967 goto igexplora40 ; No ha llegado TMR0 a 64d968 return ; Ha llegado TMR0 al969 ; valor 64d y retorna970 ; al programa principal971 igseg240 movlw d'64'972 movwf CONTA2973 bsf PORTC,6974 bcf PORTC,0975 call PULSO976 call igparpa60977978 igparpa60 bcf PORTC,5979 bsf PORTC,0980 bsf PORTC,7 ; Enciende el led RB7 = 1

Página: 14

Archivo: generador.asm

981 call igretardo60 ; Llamada a subrutina de RETARDO982 bcf PORTC,7 ; Apaga el led, RB7 = 0983 call igretardo60984 decf CONTA2,0985 movwf CONTA2986 btfss STATUS,2987 goto igparpa60988 call igseg260989990 igretardo60 movlw d'24' ; 24 -> W991 movwf CONTA992 igbucle60 call igexplora60993 clrf TMR0_OPT ; TMR0 = 0 y empieza su incremento994 decf CONTA,0 ; CONTA - 1 -> W995 movwf CONTA ; Se actualiza FZ996 btfss STATUS,2 ; ¨FZ = 1?997 goto igbucle60 ; Otra vez al bucle de exploraci¢n998 return ; Se ha explorado 122 veces99910001001 igexplora60 btfss TMR0_OPT,1 ; TMR0<1> = 1?1002 goto igexplora60 ; No ha llegado TMR0 a 64d1003 return ; Ha llegado TMR0 al1004 ; valor 64d y retorna1005 ; al programa principal1006 igseg260 movlw d'64'1007 movwf CONTA21008 bcf PORTC,61009 decf CONTA3,0 ; CONTA - 1 -> W1010 movwf CONTA3 ; Se actualiza FZ1011 btfss STATUS,21012 goto igparpa601013 call igseg36010141015 igseg360 movlw d'2'1016 movwf CONTA31017 bsf PORTC,6 ; para que ascienda el pulso *****1018 bcf PORTC,01019 call PULSO1020 call igparpa60102110221023 igparpa80 bcf PORTC,51024 bsf PORTC,01025 bsf PORTC,7 ; Enciende el led RB7 = 11026 call igretardo80 ; Llamada a subrutina de RETARDO1027 bcf PORTC,7 ; Apaga el led, RB7 = 01028 call igretardo801029 decf CONTA2,01030 movwf CONTA21031 btfss STATUS,21032 goto igparpa801033 call igseg28010341035 igretardo80 movlw d'36' ; 36 -> W1036 movwf CONTA1037 igbucle80 call igexplora801038 clrf TMR0_OPT ; TMR0 = 0 y empieza su incremento1039 decf CONTA,0 ; CONTA - 1 -> W1040 movwf CONTA ; Se actualiza FZ1041 btfss STATUS,2 ; ¨FZ = 1?1042 goto igbucle80 ; Otra vez al bucle de exploraci¢n1043 return ; Se ha explorado 36 veces104410451046 igexplora80 btfss TMR0_OPT,0 ; TMR0<4> = 1?1047 goto igexplora80 ; No ha llegado TMR0 a 64d1048 return ; Ha llegado TMR0 al1049 ; valor 64d y retorna1050 ; al programa principal

Página: 15

Archivo: generador.asm

1051 igseg280 movlw d'64'1052 movwf CONTA21053 bsf PORTC,6 ; para que baje el pulso*******1054 decf CONTA3,0 ; CONTA - 1 -> W1055 movwf CONTA3 ; Se actualiza FZ1056 btfss STATUS,21057 goto igparpa801058 call igseg38010591060 igseg380 movlw d'2'1061 movwf CONTA31062 bcf PORTC,6 ; para que ascienda el pulso *****1063 bcf PORTC,01064 call PULSO1065 call igparpa80106610671068

Página: 16

Archivo: teclado.asm

1 TECLADO.ASM234 ;Conjunto de rutinas para el manejo del teclado.5 ;No es un programa en s¡ mismo. Para utilizarlo hay que6 ;colocar en el programa principal:7 ;KEY_VAR EQU dir_inicio_del_bloque89 ;BLOQUE DE ETIQUETAS101112 CBLOCK KEY_VAR ;Inicio de las variables13 TECLA ;Retorno del c¢digo de tecla14 KEY_1 ;N§ de filas a explorar15 KEY_2 ;Temporal de c¢digo16 KEY_DELAY_1 ;Variable de temporizaci¢n17 KEY_DELAY_2 ;Variable de temporizaci¢n18 ENDC192021 ;RUTINA KEY_SCAN: Rutina de exploraci¢n del teclado. La variable22 ;"Tecla" retorna con el c¢digo de la tecla pulsada o el c¢digo 0x8023 ;si no se pulsa ninguna.242526 KEY_SCAN bsf STATUS,RP0 ;Selecciona p gina 127 bcf STATUS,RP128 movlw b'00001111'29 movwf PORTB ;RB7-RB4 salidas, RB3-RB0 entradas30 bsf OPTION_REG,NOT_RBPU ;Activa cargas pull-up31 bcf STATUS,RP0 ;Selecciona p gina 032 movlw 433 movwf KEY_1 ;N§ de columnas a explorar34 movlw b'01111111'35 movwf TECLA ;Columna a activar36 KEY_SCAN_1 movf TECLA,W37 movwf PORTB ;Activa fila38 nop39 movf PORTB,W40 movwf KEY_241 subwf TECLA,W ;Lee las columnas42 btfss STATUS,Z ;Hay alguna pulsada ?43 goto KEY_SCAN_2 ;Si hay alguna pulsada44 bsf STATUS,C ;No hay ninguna en esa fila45 rrf TECLA,F ;Selecciona siguiente fila46 decfsz KEY_1,F ;Salta si se han terminado las filas47 goto KEY_SCAN_148 movlw 0x8049 goto VOLVER ;Retorna c¢digo 0x80 (no hay pulsaci¢n)5051 KEY_SCAN_2 movlw .100 ;Bucle de temporizaci¢n de unos 20 ms52 movwf KEY_DELAY_1 ;para evitar el rebote de los pulsadores53 KEY_SCAN_3 clrf KEY_DELAY_254 clrwdt55 KEY_SCAN_4 decfsz KEY_DELAY_2,F56 goto KEY_SCAN_457 decfsz KEY_DELAY_1,F58 goto KEY_SCAN_359 movf TECLA,W ;Tras la temporizaci¢n se lee nuevamente60 movwf PORTB ;si la tecla es la misma. As¡ se61 nop ;evitan los rebotes.62 movf PORTB,W63 subwf KEY_2,W64 btfss STATUS,Z ;Es la misma ??65 goto KEY_SCAN_1 ;No, seguir con la exploraci¢n66 movf KEY_2,W ;S¡, guardar en variable de salida TECLA

el valor67 ; recogido68 VOLVER movwf TECLA69 return ;Fin de exploraci¢n

Página: 1

Archivo: teclado.asm

7071 ;RUTINA KEY_HEX: Convierte el c¢digo de tecla que haya en la variable72 ;"Tecla" a Hex. (0-F). El resultado se devuelve en la variable "Tecla".73 ;Usa como rutina auxiliar Key_tabla7475 KEY_TABLA movf KEY_1,W76 addwf PCL,F ;Calcula desplazamiento77 retlw 0x7D ;078 retlw 0xEE ;179 retlw 0xED ;280 retlw 0xEB ;381 retlw 0xDE ;482 retlw 0xDD ;583 retlw 0xDB ;684 retlw 0xBE ;785 retlw 0xBD ;886 retlw 0xBB ;987 retlw 0x7E ;A88 retlw 0x7B ;B89 retlw 0x77 ;C90 retlw 0xB7 ;D91 retlw 0xD7 ;E92 retlw 0xE7 ;F9394 KEY_HEX movf TECLA,W95 movwf KEY_2 ;Almacena el c¢digo temporalmente96 clrf KEY_1 ;Contador HEX a 097 KEY_HEX_2 call KEY_TABLA ;Busca c¢digo en la tabla98 subwf KEY_2,W ;Compara con el de la tecla99 btfsc STATUS,Z ;Coincide ?100 goto KEY_HEX_1 ;S¡101 incf KEY_1,F ;No, incrementa contador HEX102 goto KEY_HEX_2103 KEY_HEX_1 movf KEY_1,W104 movwf TECLA ;Carga contador HEX en la variable de salida105 return106107 ;RUTINA HEX_7SEG: Rutina de conversi¢n de HEX (0-F) a 7 segmentos.108 ;El acumulador W contiene, durante la llamada, el c¢digo HEX y, al retornar,109 ;el correspondiente a 7 segmentos110111112 HEX_7SEG andlw b'00001111'113 addwf PCL,F ;Desplazamiento sobre la tabla114 retlw b'00111111' ;0115 retlw b'00000110' ;1116 retlw b'01011011' ;2117 retlw b'01001111' ;3118 retlw b'01100110' ;4119 retlw b'01101101' ;5120 retlw b'01111101' ;6121 retlw b'00000111' ;7122 retlw b'01111111' ;8123 retlw b'01100111' ;9124 retlw b'01110111' ;A125 retlw b'01111100' ;B126 retlw b'00111001' ;C127 retlw b'01011110' ;D128 retlw b'01111001' ;E129 retlw b'01110001' ;F

Página: 2

Archivo: lcd873.asm

1 LCD873.ASM234 ;El conjunto de rutinas que se presentan a continuaci¢n permiten realizar5 ;las tareas básicas de control del módulo de visualizaci¢n LCD. Se emplean6 ;con los PIC 17F873. En el programa principal se deber reservar memoria7 ;para el bloque de variables que utiliza el LCD del modo:8 ;LCD_VAR EQU dir_inicio_del_bloque910 ;BLOQUE DE ETIQUETAS111213 #define ENABLE bsf PORTA,2 ;Activa E14 #define DISABLE bcf PORTA,2 ;Desactiva15 #define LEER bsf PORTA,1 ;Pone LCD en Modo RD16 #define ESCRIBIR bcf PORTA,1 ;Pone LCD en Modo WR17 #define OFF_COMANDO bcf PORTA,4 ;Desactiva RS (modo comando)18 #define ON_COMANDO bsf PORTA,4 ;Activa RS (modo datos)1920 CBLOCK LCD_VAR21 ;LCD_TEMP_2 ;Inicio de las variables. Ser la primera direcci¢n libre22 ; disponible23 ;LCD_TEMP_124 ENDC252627 ;RUTINA UP_LCD: Con esta rutina se configura el PIC para que trabaje con el LCD.282930 UP_LCD bsf STATUS,RP0 ;Banco 131 clrf PORTB ;RB <0-7> salidas digitales32 clrf PORTA ;RA <0-4> salidas digitales33 bcf STATUS,RP0 ;Banco 034 OFF_COMANDO ;RS=035 DISABLE ;E=036 return373839 ;RUTINA LCD_BUSY: Con esta rutina se chequea el estado del40 ;flag BUSY del m¢dulo LCD, que indica, cuando est activado, que el41 ;m¢dulo a£n no ha terminado el comando anterior. La rutina espera a42 ;que se complete cualquier comando anterior antes de retornar al43 ;programa principal, para poder enviar un nuevo comando.444546 LCD_BUSY LEER ;Pone el LCD en Modo RD47 bsf STATUS,RP048 movlw 0xFF49 movwf PORTB ;Puerta B como entrada50 bcf STATUS,RP0 ;Selecciona el banco 051 ENABLE ;Activa el LCD52 nop5354 L_BUSY btfsc PORTB,7 ;Chequea bit de Busy55 goto L_BUSY56 DISABLE ;Desactiva LCD57 bsf STATUS,RP058 clrf PORTB ;Puerta B salida59 bcf STATUS,RP060 ESCRIBIR ;Pone LCD en modo WR61 return626364 ;RUTINA LCD_E: Se trata de una peque¤a rutina que se encarga de generar65 ;un impulso de 1æ s (para una frecuencia de funcionamiento de 4 Mhz)66 ;por la patita de salida de la Puerta A RA2, que se halla conectada67 ;a la se¤al E (Enable) del m¢dulo LCD. Con esta rutina se pretende activar68 ;al m¢dulo LCD.6970

Página: 1

Archivo: lcd873.asm

71 LCD_E ENABLE ;Activa E72 nop73 DISABLE ;Desactiva E74 return757677 ;RUTINA LCD_DATO: Es una rutina que pasa el contenido cargado en el78 ;registro W, el cual contiene un car cter ASCII, a la PUERTA B, para79 ;visualizarlo por el LCD o escribirlo en la CGRAM.808182 LCD_DATO OFF_COMANDO ;Desactiva RS (modo comando)83 movwf PORTB ;Valor ASCII a sacar por PORTB84 call LCD_BUSY ;Espera a que se libere el LCD85 ON_COMANDO ;Activa RS (modo dato)86 call LCD_E ;Genera pulso de E87 return888990 ;RUTINA LCD_REG: Rutina parecida a la anterior, pero el contenido de W91 ;ahora es el c¢digo de un comando para el LCD, que es necesario pasar92 ;tambi‚n a la PUERTA B para su ejecuci¢n.939495 LCD_REG OFF_COMANDO ;Desactiva RS (modo comando)96 movwf PORTB ;C¢digo de comando97 call LCD_BUSY ;LCD libre?.98 call LCD_E ;S¡. Genera pulso de E.99 return100101 ;RUTINA LCD_INI: Esta rutina se encarga de realizar la secuencia de102 ;inicializaci¢n del m¢dulo LCD de acuerdo con los tiempos dados por103 ;el fabricante (15 ms). Se especifican los valores de DL, N y F,104 ;as¡ como la configuraci¢n de un interfaz de 8 l¡neas con el bus105 ;de datos del PIC, y 2 l¡neas de 16 caracteres de 5 x 7 pixels.106107108 LCD_INI movlw 0x38109 call LCD_REG ;C¢digo de instrucci¢n110 call LCD_DELAY ;Temporiza111 return112113114 ;RUTINA BORRA_Y_HOME: Borra el display y retorna el cursor a la posici¢n 0.115116117 BORRA_Y_HOME movlw 0x01 ;Borra LCD y Home.118 call LCD_REG119 return120121122 ;RUTINA DISPLAY_ON_CUR_OFF: Control del display y cursor.123 ;Activa el display y desactiva es cursor124125 DISPLAY_ON_CUR_OFF movlw 0x0C ;LCD on, cursor off.126 call LCD_REG127 return128129 ;RUTINA LCD_DELAY: Se trata de un rutina que implementa un retardo130 ;o temporizaci¢n de 5 ms. Utiliza dos variables llamadas LCD_TEMP_1131 ;y LCD_TEMP_2, que se van decrementando hasta alcanzar dicho tiempo.132133134 LCD_DELAY clrwdt135 movlw 0xF0136 movwf TMR0137138139 LCD_DELAY_1 bcf INTCON, T0IF140 nop

Página: 2

Archivo: lcd873.asm

141 btfss INTCON,T0IF142 goto LCD_DELAY_1143 nop144 bcf INTCON,T0IF145 return146

Página: 3

Archivo: adquisicion.asm

12 ;pin 11 & 32 = 5VDC3 ;pin 12 & 31 = 0VDC4 ;pin 1 = 5VDC5 ;pin 2 = 0 - 5 VDC entrada analogica resistencia de 20K6 ;pin 13 & 14 = 4MHz crystal7 ;pin 15,16,17,18,23,24,25,26 salidas del PORTC89 ;***************************************************************10 List P=16F87311 RADIX HEX12 ;***************************************************************13 Include "P16F873.inc"14 __Config _CP_OFF & _DEBUG_OFF & _WRT_ENABLE_OFF & _CPD_OFF & _LVP_OFF & _BODEN_OFF &

_PWRTE_ON & _WDT_OFF & _XT_OSC15 ;***************************************************************161718 ADQ EQU 0x3119 COMP EQU 0x3220 ESTADO EQU 0x0321 STATUS0 EQU 0x10322 TMR0_OPT EQU 0x101 ; TIMER0 en banco 0 y OPTION en banco 123 CONTA EQU 0x3524 RETAR EQU 0x36252627 org 0x00028 goto Start29 org 0x005303132 INCLUDE "7PULSOS.ASM"3334 Interrupt35 retfie36 Start37 bsf STATUS,RP0 ;banco 138 bcf STATUS,RP139 movlw H'00'40 movwf TRISC ;todo el portc [7-0] como salida41 movlw b'00000000' ;canales de entrada del C A/D PCFG3-PCFG042 movwf ADCON1 ; [RA5 RA3 RA2 RA1 RA1] a a a a A43 bcf STATUS,RP0 ;banco 044 movlw B'00000001' ;Fosc/2 [7-6], A/D ch1 [5-3], a/d ON [0]45 movwf ADCON046 bsf PORTC,247 movf COMP,048 movlw d'250' ;Reatrdo del pulso49 movwf RETAR50 movlw d'0'51 movwf ADQ ;variable del CLR del 29952 call INICIO5354 Main55 call ad_portc56 bcf PORTC,157 bcf PORTC,258 goto Main596061 ad_portc62 ;tiempo de espera de la adquisicion (20uS)63 bsf ADCON0,GO ;comienzo de la conversion A/D64 Wait65 btfsc ADCON0,GO ;espera para completar la conversion66 goto Wait67 movf ADRESH,0 ;comparacion de igualdad68 xorwf COMP,069 btfsc ESTADO,2

Página: 1

Archivo: adquisicion.asm

70 call IGUAL71 movf ADRESH,0 ;comparacion de mayor la ADRESH con COMP72 subwf COMP,073 btfss ESTADO,074 call MAYOR75 movf COMP,0 ;comparacion de menor la ADRESH con COMP76 subwf ADRESH,077 btfss ESTADO,078 call MENOR79 movf ADRESH,W80 movwf COMP ;almacenamineto de ADRESH en COMP81 return8283 MAYOR bsf PORTC,384 call MAYOR185 return8687 MENOR bcf PORTC,388 call MAYOR189 return9091 IGUAL movf ADRESH,0 ;comparacion de igauldad a 0 para mandar92 xorwf ADQ,0 ;un CLR al 29993 btfsc ESTADO,294 call IGUAL195 return9697 MAYOR1 bsf PORTC,198 ;call RETCORRI99 return100101 IGUAL1 bsf PORTC,2102 movlw d'0'103 movwf ADQ104 return105106 end

Página: 2

Archivo: 7PULSOS.asm

12 PULSO EQU 0x213 RET EQU 0x22 ; Variable contado4 RET_1 EQU 0x235 CONTA7 EQU 0x246789 INICIO bsf STATUS,RP010 clrf PORTC11 clrf TRISC12 bcf STATUS,RP013 bsf PORTC,214 movlw d'5'15 movwf RET16 movwf RET_1171819 parpa bcf PORTC,220 bsf PORTC,321 bsf PORTC,1 ; Enciende el led RB7 = 122 call RETARDO ; Llamada a subrutina de RETARDO23 bcf PORTC,1 ; Apaga el led, RB7 = 024 call RETARDO ; ******* 1 ********25 decf CONTA7,026 movwf CONTA727 btfss STATUS,2; Checa cuantas veces se hecho el ciclo-728 goto parpa29 return30313233 RETARDO decfsz RET34 goto RETARDO35 decfsz RET_136 goto RETARDO37 movlw d'5'38 movwf RET39 movwf RET_140 return4142 ;prub goto prub4344

Página: 1