Capítulo VIII: PROGRAMACIÓN DEL PIC 16F876A



Documentos relacionados
Instrucciones para programar el PIC16F877

Las Instrucciones. A continuación vamos a presentar el conjunto de instrucciones básico de los Microcontroladores Picmicro.

D:\ACCESO\ACCESO.ASM. list p=16f877 include "p16f877.inc" ROTA equ 0x20 TEMP equ 0x21 TECLA equ 0x22 DIGITOS equ 0x23 DIR equ 0x24

1. ÍNDICE. Índice de contenido 2. INTRODUCCIÓN 3. CONTENIDO 1. OBJETIVOS DEL PROYECTO

CODIGO EN ASSEMBLER TRANSMISOR. list p=16f876 ;selecion de pic

Programación en PIC Los primeros pasos

Carrera: Técnico Superior en Técnicas Digitales. Alumnos: Emiliano Teseo y José Luis Fernández

Jesús Alberto Díaz Carmona Ingeniería en Informática. Curso 2005/06. Diseño de Sistemas Basados en Microprocesador

INFORMÁTICA INDUSTRIAL. 3º INGENIERÍA TÉCNICA INDUSTRIAL. ESPECIALIDAD ELECTRÓNICA BOLETÍN 1. CURSO 2003/04

Programa del PIC 16F877A

Apéndice B Programa para calcular inclinación con PIC 16F877A

CODIGO EN ASSEMBLER ;************************************************************************

Microcontrolador PIC 16F84

El único lenguaje que entienden los microcontroladores es el código máquina formado por ceros y unos del sistema binario.

Practica de PIC 16F84

P R Á C T I C A 7 SENSADO DE TEMPERATURA CON INTERFAZ PIC - PC O B J E T I V O I N T R O D U C C I O N

Termostato electrónico con PIC y LCD

;*****************************************PROGRAMA*******************************************

APÉNDICE B APÉNDICE B. PROGRAMA DEL PIC16F874 EN LENGUAJE ENSAMBLADOR

DESCRIPCIÓN DE LAS INSTRUCCIONES

;<<<<<< VECTOR DE INTERRUPCION >>>>>>>

Temporizadores y contadores en tiempo real: El módulo Timer0 del PIC.

Pines de entrada/salida (I/O) de propósito general. Mediante ellos, el micro PIC puede monitorizar y controlar otros dispositivos.

UNIVERSIDAD DON BOSCO FACULTAD DE ESTUDIOS TECNOLÓGICOS COORDINACIÓN DE ELECTRÓNICA GUÍA DE LABORATORIO Nº 02

Microprocesadores I - Unidad 5 Hoja 1 de 11. Año Javier Rambaldo Profesor de la cátedra de Microprocesadores I

Proyecto de Microprocesadores I del CENT57 AFINADOR DIGITAL MICROPROCESADO Alumnos: Damian O. Macarrein Gastón M. Murphy Año 2002

Alarma con Interfaz DTMF de Línea Telefónica basado en PIC16F84

UNIVERSIDAD DON BOSCO

PRÁCTICA 2: Programas básicos. Tipos de direccionamiento.

DALCAME

MICROCONTROLADORES (III)

ORGANIZACIÓN INTERNA + INTRODUCCIÓN AL ENSAMBLADOR

MICROCONTROLADOR PIC DE MICROCHIP

;*****************************************************************************************

- FUNDAMENTOS TEÓRICOS - EJEMPLOS DE APLICACIÓN. 09/01/2009 Ing. José A. Picón - - (0416)

Apéndice A. Programas y Diagramas de Bloques para los Microprocesadores

2.1. Código ASM de Programación para el PIC

Indice. Escrito por Administrator Martes, 02 de Septiembre de :45 - Actualizado Domingo, 20 de Septiembre de :45 1 / 15

LCD. Las pantallas de cristal líquido o módulos LCD, como. Módulo. con interface serial

Transmisión de datos por Radio Frecuencia

LOS PIC16F88X: EEPROM de Usuario

Energía fotovoltaica y su aplicación rural

Temporizadores y contadores en tiempo real: El módulo Timer0 y el prescaler del PIC

btfss PIR1,TMR2IF ; Checa si TMR2 interrumpio goto SAL_ISR ; No, sale de la ISR bcf PIR1,TMR2IF ; Si, borra bandera de interrupcion

INSTRUCCIONES DE ENSAMBLADOR

Tema 6: Microcontroladores

Sistema de seguridad con emisión de mensaje SMS

Microcontrolador PIC 16F84

Tema. Módulo Captura Comparación Modulación n de Achura de Pulsos. C. F. G.S. D.P.E. Módulo de Proyectos 1

Programación y Aplicaciones de los Microcontroladores PIC16FXXX (Nivel Básico) ING. EULER DEZA FIGUEROA

Tema: Utilización del módulo ADC en los microcontroladores PIC.

Programación y diseño de dispositivos mediante microcontroladores PIC

Bucles: o Bucles infinitos o Bucles finitos o Bucles anidados Medir tiempos con MPLAB Ejemplos y ejercicios

CALCULADORA DE FUNCIONES BÁSICAS Oscar Gregorio Pérez Macías

;******************************************************************************* *******************

TIMER0 (T0) TMR0 (01h,101h)

Proyectos con el PIC16F84

SISTEMA MÍNIMO BASADO EN EL PIC16F84

SISTEMAS ELECTRÓNICOS AVANZADOS. ING. TÉC. INDUSTRIAL ELECTRÓNICO

Rutinas de programación

CONCEPTOS BÁSICOS. + Intensidad

Tema 14. Interrupciones. Las. C. F. G.S. D.P.E. Módulo de Proyectos 1

MICROCONTROLADORES PIC

SALTOS EN FUNCIONDE UN BIT Aquéllas que pueden producir el salto en función del estado de un bit. Son btfsc y

Assembler para PICs. Permite la utilización de etiquetas, tanto para apuntar a direcciones como para definir valores constantes.

TEMA 5 LA MEMORIA DE DATOS MEMORIA RAM D.P.E. DESARROLLO DE PROYECTOS 1

TEMA 6 MICROCONTROLADORES. PIC 16F Introducción Referencia histórica.

[CURSO BÁSICO DE PIC TABLAS]

Práctica 1. Introducción al laboratorio y al ensamblador del PIC. 1. Objetivos. 2. Introducción. 2.1 Ensamblar y simular

PROCESADORES I Guia TP7 Introducción al Assembler del PIC

MANEJO DE DISPLAY LCD (Versión 1.1)

Módulos CCP. Registro de captura Registro de comparación Registro de ciclo de servicio PWM

1. Proponer un circuito que tenga el puerto b como salida conectando 8 leds, realizando un programa que me encienda los bits 0, 1, 3, 5, 7.

Usando los Codificadores Cuadráticos

MICROPROCESADORES 2003/2004 DADO ELECTRÓNICO. Jaime Pérez Crespo Rubén Seijas Valverde

TUTORIAL PRIMERA PARTE: GENERACIÓN DE UN RETARDO CON TIMER.

RECURSOS FUNDAMENTALES

Tema: Comunicación serie entre PIC y PC.

Ensamblador. Interrupciones. Dentro de una computadora existen dos clases de interrupciones:

podemos enfocar al funcionamiento del robot, es decir la parte de electrónica. Para que el

GAMA BAJA (PIC16C5X) ARQUITECTURA BÁSICA

Interrupciones Fuentes de Interrupciones para el PIC16F1787

PIC MICRO ESTUDIO Reloj en tiempo real RTCU2 Clave: 719

BUS I2C: IMPLEMENTACIÓN PRÁCTICA CON MICROCONTROLADORES PIC MEMORIAS EEPROM SERIE

TALLER DE CONSTRUCCION DE UN MICROBOT RASTREADOR PROGRAMACION TALLER DE CONSTRUCCIÓN DE UN MICROBOT RASTREADOR

MICROCONTROLADORES PIC EEPROM. Memoria de programa Características

Escuela Politécnica Superior de Elche. EXAMEN DE SISTEMAS ELECTRÓNICOS Y AUTOMÁTICOS 2º Parte: Microcontroladores + Instrumentación Nombre:

Introducción a la programación en Lenguaje Assembler.

O B J E T I V O I N T R O D U C C I O N M A R C O T E O R I C O

CCP. comparación para la captura y reset del TMR1. Pueden usarse CCPx en modo captura y CCPy en modo

PROFESOR: Práctica 10. Manejo de Tabla de datos con Microcontrolador PIC

El módulo LCD Ejemplos de funcionamiento

62/8&,21(6$/(;$0(1'( /$%25$725,2'((6758&785$6'(/26&20387$'25(6 &8562)(%5(52

PRÁCTICA 6: Gobierno del display 7 segmentos

Proyecto Final Robot. Docentes: Collovati Susana Lasarte Matias Correa Diego Integrante: Jesús Olguera

[CURSO BÁSICO DE PIC RETARDOS POR SOFTWARE]

Microcontroladores PIC

Maqueta: Osciloscopio y generador

PRACTICA 4. REALIZAR ENCENDIDO-APAGADO DE DIODOS LED

Registros SFR vistos hasta ahora: Microcontroladores PIC

Transcripción:

Capítulo VIII: PROGRAMACIÓN DEL PIC 16F876A Proyecto Fin de Carrera 95 Antonio Andújar Caballero

8. PROGRAMACIÓN DEL PIC 16F876A. A la hora de realizar el programa de control para nuestro ecualizador, elegimos el lenguaje ensamblador (ASM). Igualmente se podría haber realizado en lenguaje C, pero el hecho de conocer mejor el ASM, implicaba un menor tiempo en el desarrollo del código. A continuación se presenta el programa contenido en el PIC, con los comentarios correspondientes a cada una de las partes en que se divide el mismo. ;--------------------------------------------------------ENCABEZADO-------------------------------------------------- LIST P = 16F876A ; Defino al compilador que microcontrolador usaré INCLUDE <P16F876A.INC> ; Incluyo las directivas para ese microcontrolador ERRORLEVEL -302 ; Al compilar no notifica los posibles errores de paginación ;------------------------------------------------CONFIGURACIÓN DE BITS----------------------------------------- CONFIG _CP_ALL&_DEBUG_OFF&_WRT_ENABLE_OFF&_CPD_ON&_LVP_OFF&_BODEN_OF F&_PWRTE_ON&_WDT_OFF&_XT_OSC ; protección de datos, debug desactivado, no verificar tensión PIC, protección de la EEPROM activada ; programación con bajo voltaje desactivada, boden desactivado, reset por conexión a alimentación activo ; watchdog desactivado y usamos cristal. ;------------------------------------------------CONFIGURACIÓN DE PINES---------------------------------------- #DEFINE CS1 PORTA,0 ; Chipselect 1 Potenciómetro Ganancia-Graves #DEFINE CS2 PORTA,1 ; Chipselect 2 Potenciómetro Medios-Agudos #DEFINE DAT PORTA,2 ; Línea de datos del PIC hacia los potenciómetros #DEFINE CLK PORTA,3 ; Clock para sincronizar el PIC con los potes #DEFINE SUBE PORTB,0 ; Pulsador para subir posición #DEFINE BAJA PORTB,1 ; Pulsador para bajar posición #DEFINE CAMBIO PORTB,2 ; Pulsador para cambiar entre potes #DEFINE MEMORIA PORTB,3 ; Pulsador para cargar/almacenar memoria #DEFINE PRESET_1 PORTB,4 ; Pulsador para cargar Preset 1 #DEFINE PRESET_2 PORTB,5 ; Pulsador para cargar Preset 2 #DEFINE PRESET_3 PORTB,6 ; Pulsador para cargar Preset 3 #DEFINE PRESET_4 PORTB,7 ; Pulsador para cargar Preset 4 #DEFINE OUT_RS PORTC,0 ; Pin RS del LCD #DEFINE OUT_E PORTC,1 ; Pin Enable del LCD #DEFINE DB4 PORTC,2 ; Bus de datos del LCD #DEFINE DB5 PORTC,3 ; Bus de datos del LCD #DEFINE DB6 PORTC,4 ; Bus de datos del LCD #DEFINE DB7 PORTC,5 ; Bus de datos del LCD Proyecto Fin de Carrera 96 Antonio Andújar Caballero

;--------------------------------------------------DEFINICIÓN DE FLAG---------------------------------------------- #DEFINE FLASH_E FLAG,0 ; La usamos para el parpadeo del LCD ;-------------------------------------------CONFIGURACIÓN DE MEMORIA-------------------------------------- WWW EQU.32 ; Sirve para guardar W cuando entramos en una interrupción ESTADO EQU.33 ; Sirve para guardar STATUS cuando entramos en interrp. TEMP1 EQU.34 ; Almacenar variables temporales TEMP2 EQU.35 TEMP3 EQU.36 TEMP4 EQU.37 CONTA_1 EQU.38 ; Contadores CONTA_2 EQU.39 CONTA_3 EQU.40 CONTA_4 EQU.41 CONTA_5 EQU.42 DP1 EQU.43 ; Datos a representar en el LCD, números DP2 EQU.44 DP3 EQU.45 DP4 EQU.46 DP5 EQU.47 DP6 EQU.48 DP7 EQU.49 DP8 EQU.50 DP9 EQU.51 DP10 EQU.52 DP11 EQU.53 DP12 EQU.54 DP13 EQU.55 DP14 EQU.56 DP15 EQU.57 POTE_G EQU.58 ; Valor potenciómetro de Graves POTE_M EQU.59 ; Valor potenciómetro de Medios POTE_A EQU.60 ; Valor potenciómetro de Agudos POTE_GA EQU.61 ; Valor potenciómetro de Ganancia FLASH_N EQU.62 ; Registro para saber en que potenciómetro nos encontramos FLAG EQU.63 ; Registro para la representación del LCD DX1 EQU.64 ; Registros temporales para el LCD DX2 EQU.65 DX3 EQU.66 DX4 EQU.67 RETARDO1 EQU.68 ; Retardo (parpadeo) DIR1 EQU.69 ; Registros temporales para la lect y escrit de la EEPROM DIR2 EQU.70 DIR3 EQU.71 DIR4 EQU.72 Proyecto Fin de Carrera 97 Antonio Andújar Caballero

;---------------------------------------------------------MACROS--------------------------------------------------------- GR_GA macro bsf bcf endm CS1 CS2 ; Activa el potenciómetro de Ganancia-Graves ME_AG macro bcf bsf endm CS1 CS2 ; Activa el potenciómetro de Medios- Agudos NO_CHIP macro ; Desactiva ambos potenciómetros bcf CS1 bcf CS2 endm ;-------------------------------------------------VECTORES DE RESET----------------------------------------------- ORG 0x00 ; Origen del programa siempre que ocurra un reset goto INICIO ; Salta a "inicio" ORG 0x04 ; Comienza hache cuando ocurra una interrupción goto FLASH ; Salta a flash ;---------------------------------------------------INTERRUPCIONES-------------------------------------------------- FLASH ; Rutina cuando se produce una interrupción por TMR1 movwf WWW ; Guarda en WWW lo que tenemos en W swapf STATUS,W movwf ESTADO ; Guarda en ESTADO lo que contiene status bcf PIR1,TMR1IF ; Borramos el flag que produce la interrupción movf RETARDO1,F btfss STATUS,Z ; Si el retardo (parpadeo) es 0 salta una instrucción decf RETARDO1,F ; Decremento retardo (parpadeo) si no es 0 btfss FLASH_E ; Comprueba parpadeo, si es 1 salta una instrucción goto SAL2 ; Si es 0 vamos a SAL2 movlw.1 subwf FLASH_N,W ; Restamos 1 al valor de FLASH_N para saber pote estamos btfsc STATUS,Z ; Si la operación no es 0 salta una instrucción goto BAJ ; La operación es 0, vamos a BAJ movlw.2 subwf FLASH_N,W ; Restamos 2 al valor de FLASH_N btfsc STATUS,Z ; Si la operación no es 0 salta una instrucción goto MED ; La operación es 0, vamos a MED movlw.3 subwf FLASH_N,W ; Restamos 3 al valor de FLASH_N btfsc STATUS,Z ; Si la operación no es 0 salta una instrucción goto AGU ; La operación es 0, vamos a AGU movlw.4 subwf FLASH_N,W ; Restamos 4 al valor de FLASH_N btfsc STATUS,Z ; Si la operación no es 0 salta una instrucción goto GAN ; La operación es 0, vamos a GAN goto SAL1 ; Si no es ninguno de los potes, vamos a SAL1 Proyecto Fin de Carrera 98 Antonio Andújar Caballero

BAJ MED movf DP1,W movwf DX1 ; Guardamos datos DP1 en temporales DX1 movf DP2,W movwf DX2 movf DP3,W movwf DX3 movf DP4,W movwf DX4 movwf DP1 ; Guardamos lo que tenemos en W en DP movwf DP2 movwf DP3 movwf DP4 call PRESENTAR ; Presentamos los valores en el LCD movf DX1,W movwf DP1 ; Guardamos en DP lo que tenemos en temporales DX movf DX2,W movwf DP2 movf DX3,W movwf DP3 movf DX4,W movwf DP4 goto SAL1 ; Vamos a SAL1 movf DP5,W movwf DX1 ; Guardamos datos DP en temporales DX movf DP6,W movwf DX2 movf DP7,W movwf DX3 movf DP8,W movwf DX4 movwf DP5 ; Guardamos lo que tenemos en W en DP movwf DP6 movwf DP7 movwf DP8 call PRESENTAR ; Presentamos los valores en el LCD movf DX1,W movwf DP5 ; Guardamos en DP lo que tenemos en temporales DX movf DX2,W movwf DP6 movf DX3,W movwf DP7 movf DX4,W movwf DP8 goto SAL1 ; Vamos a SAL1 AGU movf DP9,W movwf DX1 movf DP10,W movwf DX2 movf DP11,W ; Guardamos datos DP en temporales DX Proyecto Fin de Carrera 99 Antonio Andújar Caballero

movwf DX3 movf DP12,W movwf DX4 movwf DP9 ; Guardamos lo que tenemos en W en DP movwf DP10 movwf DP11 movwf DP12 call PRESENTAR ; Presentamos los valores en el LCD movf DX1,W movwf DP9 ; Guardamos en DP lo que tenemos en temporales DX movf DX2,W movwf DP10 movf DX3,W movwf DP11 movf DX4,W movwf DP12 goto SAL1 ; Vamos a SAL1 GAN SAL1 movf DP13,W movwf DX1 ; Guardamos datos DP en temporales DX movf DP14,W movwf DX2 movf DP15,W movwf DX3 movwf DP13 ; Guardamos lo que tenemos en W en DP movwf DP14 movwf DP15 call PRESENTAR ; Presentamos los valores en el LCD movf DX1,W movwf DP13 ; Guardamos en DP lo que tenemos en temporales DX movf DX2,W movwf DP14 movf DX3,W movwf DP15 bcf FLASH_E ; Ponemos a 0 el flag del parpadeo swapf ESTADO,W movwf STATUS ; Guardamos en STATUS lo que tenemos en ESTADO swapf WWW,F swapf WWW,W ; Guardamos en W lo que tenemos en WWW retfie SAL2 call PRESENTAR ; Presentamos en el LCD bsf FLASH_E ; Ponemos a 1 el flag del parpadeo swapf ESTADO,W movwf STATUS ; Guardamos en STATUS lo que tenemos en ESTADO swapf WWW,F swapf WWW,W ; Guardamos en W lo que tenemos en WWW retfie Proyecto Fin de Carrera 100 Antonio Andújar Caballero

;---------------------------------------------------------RETARDOS----------------------------------------------------- DEMORA movlw.10 movwf CONTA_1 ; Rutina de retardo QWE0 decfsz CONTA_1,F goto QWE0 DEMORA_150US movlw.36 movwf CONTA_1 ; Rutina de retardo de 150 microsegundos QWE1 decfsz CONTA_1,F goto QWE1 DEMORA_1MS movlw.248 movwf CONTA_1 ; Rutina de retardo de 1 milisegundo QWE2 decfsz CONTA_1,F goto QWE2 DEMORA_20MS movlw.21 movwf CONTA_1 ; Rutina de retardo de 20 milisegundos QWE3 QWE4 movlw.237 movwf CONTA_2 decfsz CONTA_2,F goto QWE4 decfsz CONTA_1,F goto QWE3 Proyecto Fin de Carrera 101 Antonio Andújar Caballero

DEMORA_100MS movlw.110 movwf CONTA_3 ; Rutina de retardo de 100 milisegundos QWE5 QWE6 movlw.181 movwf CONTA_4 decfsz CONTA_4,F goto QWE6 decfsz CONTA_3,F goto QWE5 DEMORA_1S5 movlw.125 movwf CONTA_3 ; Rutina de retardo de 1 segundo y medio QWE7 QWE8 QWE9 movlw.41 movwf CONTA_4 movlw.73 movwf CONTA_5 clrwdt decfsz CONTA_5,F goto QWE9 decfsz CONTA_4,F goto QWE8 decfsz CONTA_3,F goto QWE7 ;--------------------------------------------------------------LCD---------------------------------------------------------- INI_D ; Rutina para comandos de inicialización del LCD movwf TEMP2 ; Guardamos en TEMP2 lo que tenemos en W bcf DB4 ; Ponemos a 0 los pines de datos del LCD bcf DB5 bcf DB6 bcf DB7 btfsc TEMP2,4 ; Comprueba el bit 4 de TEMP2. Si es 0 salta una instrucción. bsf DB4 ; Si es 1 coloca un 1 en DB4 btfsc TEMP2,5 ; Comprueba el bit 5 de TEMP2. Si es 0 salta una instrucción. bsf DB5 ; Si es 1 coloca un 1 en DB5 Proyecto Fin de Carrera 102 Antonio Andújar Caballero

btfsc TEMP2,6 ; Comprueba el bit 6 de TEMP2. Si es 0 salta una instrucción. bsf DB6 ; Si es 1 coloca un 1 en DB6 btfsc TEMP2,7 ; Comprueba el bit 7 de TEMP2. Si es 0 salta una instrucción. bsf DB7 ; Si es 1 coloca un 1 en DB7 bcf OUT_RS ; Colocamos un 0 RS bsf OUT_E ; Colocamos un 1 en E para transmitir datos call DEMORA_1MS call DEMORA_1MS call DEMORA_1MS call DEMORA_1MS call DEMORA_1MS ; Retardo de 5ms bcf OUT_E ; Colocamos un 0 en E para dejar de transmitir bcf DB4 ; Ponemos a 0 los pines de datos del LCD bcf DB5 bcf DB6 bcf DB7 btfsc TEMP2,0 ; Comprueba el bit 0 de TEMP2. Si es 0 salta una instrucción. bsf DB4 ; Si es 1 coloca un 1 en DB4 btfsc TEMP2,1 ; Comprueba el bit 1 de TEMP2. Si es 0 salta una instrucción. bsf DB5 ; Si es 1 coloca un 1 en DB5 btfsc TEMP2,2 ; Comprueba el bit 2 de TEMP2. Si es 0 salta una instrucción. bsf DB6 ; Si es 1 coloca un 1 en DB6 btfsc TEMP2,3 ; Comprueba el bit 3 de TEMP2. Si es 0 salta una instrucción. bsf DB7 ; Si es 1 coloca un 1 en DB7 bcf OUT_RS ; Colocamos un 0 en RS bsf OUT_E ; Colocamos un 1 en E para transmitir datos call DEMORA_1MS call DEMORA_1MS call DEMORA_1MS call DEMORA_1MS call DEMORA_1MS ; Retardo de 5ms bcf OUT_E ; Colocamos un 0 en E para dejar de transmitir INSTRUCCION_D ; Rutina transmitir instrucción al LCD movwf TEMP2 ; Guardamos en TEMP2 lo que tenemos en W bcf DB4 ; Ponemos a 0 los pines de datos del LCD bcf DB5 bcf DB6 bcf DB7 btfsc TEMP2,4 ; Comprueba el bit 4 de TEMP2. Si es 0 salta una instrucción. bsf DB4 ; Si es 1 coloca un 1 en DB4 btfsc TEMP2,5 ; Comprueba el bit 5 de TEMP2. Si es 0 salta una instrucción. bsf DB5 ; Si es 1 coloca un 1 en DB5 btfsc TEMP2,6 ; Comprueba el bit 6 de TEMP2. Si es 0 salta una instrucción. bsf DB6 ; Si es 1 coloca un 1 en DB6 btfsc TEMP2,7 ; Comprueba el bit 7 de TEMP2. Si es 0 salta una instrucción. bsf DB7 ; Si es 1 coloca un 1 en DB7 bcf OUT_RS ; Colocamos un 0 RS bsf OUT_E ; Colocamos un 1 en E para transmitir datos call DEMORA_1MS call DEMORA_1MS ; Retardo de 2ms bcf OUT_E ; Colocamos un 0 en E para dejar de transmitir Proyecto Fin de Carrera 103 Antonio Andújar Caballero

bcf DB4 ; Ponemos a 0 los pines de datos del LCD bcf DB5 bcf DB6 bcf DB7 btfsc TEMP2,0 ; Comprueba el bit 0 de TEMP2. Si es 0 salta una instrucción. bsf DB4 ; Si es 1 coloca un 1 en DB4 btfsc TEMP2,1 ; Comprueba el bit 1 de TEMP2. Si es 0 salta una instrucción. bsf DB5 ; Si es 1 coloca un 1 en DB5 btfsc TEMP2,2 ; Comprueba el bit 2 de TEMP2. Si es 0 salta una instrucción. bsf DB6 ; Si es 1 coloca un 1 en DB6 btfsc TEMP2,3 ; Comprueba el bit 3 de TEMP2. Si es 0 salta una instrucción. bsf DB7 ; Si es 1 coloca un 1 en DB7 bcf OUT_RS ; Colocamos un 0 RS bsf OUT_E ; Colocamos un 1 en E para transmitir datos call DEMORA_1MS call DEMORA_1MS ; Retardo de 2ms bcf OUT_E ; Colocamos un 0 en E para dejar de transmitir call DEMORA_150US ; Retardo de 150us DATO_D ; Rutina de envío de datos al LCD movwf TEMP2 ; Guardamos en TEMP2 lo que tenemos en W bcf DB4 ; Ponemos a 0 los pines de datos del LCD bcf DB5 bcf DB6 bcf DB7 btfsc TEMP2,4 ; Comprueba el bit 4 de TEMP2. Si es 0 salta una instrucción. bsf DB4 ; Si es 1 coloca un 1 en DB4 btfsc TEMP2,5 ; Comprueba el bit 5 de TEMP2. Si es 0 salta una instrucción. bsf DB5 ; Si es 1 coloca un 1 en DB5 btfsc TEMP2,6 ; Comprueba el bit 6 de TEMP2. Si es 0 salta una instrucción. bsf DB6 ; Si es 1 coloca un 1 en DB6 btfsc TEMP2,7 ; Comprueba el bit 7 de TEMP2. Si es 0 salta una instrucción. bsf DB7 ; Si es 1 coloca un 1 en DB7 bsf OUT_RS ; Colocamos un 0 RS bsf OUT_E ; Colocamos un 1 en E para transmitir datos call DEMORA ; Rutina de retardo bcf OUT_E ; Colocamos un 0 en E para dejar de transmitir call DEMORA ; Rutina de retardo bcf OUT_RS ; Colocamos un 0 en RS bcf OUT_E ; Colocamos un 0 en E para dejar de transmitir bcf DB4 ; Ponemos a 0 los pines de datos del LCD bcf DB5 bcf DB6 bcf DB7 btfsc TEMP2,0 ; Comprueba el bit 0 de TEMP2. Si es 0 salta una instrucción. bsf DB4 ; Si es 1 coloca un 1 en DB4 btfsc TEMP2,1 ; Comprueba el bit 1 de TEMP2. Si es 0 salta una instrucción. bsf DB5 ; Si es 1 coloca un 1 en DB5 btfsc TEMP2,2 ; Comprueba el bit 2 de TEMP2. Si es 0 salta una instrucción. bsf DB6 ; Si es 1 coloca un 1 en DB6 btfsc TEMP2,3 ; Comprueba el bit 3 de TEMP2. Si es 0 salta una instrucción. bsf DB7 ; Si es 1 coloca un 1 en DB7 bsf OUT_RS ; Colocamos un 1 en RS Proyecto Fin de Carrera 104 Antonio Andújar Caballero

bsf OUT_E ; Colocamos un 1 en E call DEMORA ; Retardo bcf OUT_E ; Colocamos un 0 en E para dejar de transmitir call DEMORA ; Retardo bcf OUT_RS ; Colocamos un 0 en RS bcf OUT_E ; Colocamos un 0 en E INICIALIZAR_LCD ; Rutina para inicializar el LCD call DEMORA_20MS ; Retardo 20ms movlw B'00110011' call INI_D movlw B'00110010' ; Setea 4 bits call INI_D movlw B'00101000' ; Setea 2 líneas, matriz de 5x7 movlw B'00001000' ; LCD Off movlw B'00000001' ; Limpiamos el LCD call DEMORA_1MS movlw B'00000110' ; Activa el LCD, desactiva el cursor y desactiva parpadeo movlw B'00001100' ; Limpiamos el LCD ;-----------------------------------------REPRESENTACIÓN A ESCALA-------------------------------------------- CONVERTIR_G ; Rutina para convertir a escala el pote de graves movwf TEMP1 ; Guardamos en TEMP1 lo que tenemos en W clrf DP1 ; Limpiamos variables donde guardaremos los datos al LCD clrf DP2 clrf DP3 clrf DP4 movlw.128 subwf TEMP1,W ; A TEMP1 le restamos 128 y guardamos en TEMP1 btfss STATUS,Z ; Si la operación es 0 saltamos una instrucción goto NO_CERO_G ; Si no es 0 vamos a NO_CERO_G ; Pasa un espacio a DP1 (no signo) movwf DP1 movlw A'0' ; Pasa tres 0 al resto de datos movwf DP2 movwf DP3 movwf DP4 NO_CERO_G ; Si al restar TEMP1 menos 128 no es cero btfss STATUS,C ; Si el acarreo es 1 salta instrucción (positivo) goto ARR_G ; Si el acarreo no es 1 vamos a ARR_G (negativo) movlw.128 subwf TEMP1,F ; Restamos a TEMP1 los 128 y guardamos en TEMP1 movlw A'+' movwf DP1 ; Cargamos en DP1 el signo positivo Proyecto Fin de Carrera 105 Antonio Andújar Caballero

goto TRE1 ; Vamos a TRE1 ARR_G ; Si es negativo movlw.128 movwf TEMP2 movf TEMP1,W subwf TEMP2,W ; Hacemos 128 menos TEMP2 y guardamos en TEMP2 movwf TEMP1 ; Lo guardamos en TEMP1 movlw A'-' movwf DP1 ; Cargamos en DP1 el signo negativo TRE1 TRE2 incf DP2,F ; Incrementa en 1 el valor de DP2 movlw.100 subwf TEMP1,F ; Hace TEMP1 menos 100 y guardamos en TEMP1 btfsc STATUS,C ; Si el acarreo es 0 saltamos una instrucción (negativo) goto TRE1 ; Si el acarreo es 1 volvemos a TRE1 (positivo) movlw.100 addwf TEMP1,F ; Sumamos 100 a TEMP1 decf DP2,F ; Decremento en uno el valor de DP2 movlw.48 addwf DP2,F ; Sumamos 48 a DP2 incf DP3,F ; Incremento en 1 el valor de DP3 movlw.10 subwf TEMP1,F ; Restamos 10 a TEMP1 y guardamos en TEMP1 btfsc STATUS,C ; Si el acarreo es 0 saltamos una instrucción (negativo) goto TRE2 ; Si el acarreo es 1 volvemos a TRE2 (positivo) movlw.10 addwf TEMP1,F ; Sumamos 10 a TEMP1 decf DP3,F ; Restamos 1 a DP3 movlw.48 addwf DP3,F ; Sumamos 48 a DP3 movf TEMP1,W movwf DP4 ; Guardamos en DP4 el valor de TEMP1 movlw.48 addwf DP4,F ; Sumamos 48 a DP4 CONVERTIR_M ; Rutina para convertir a escala el pote de medios movwf TEMP1 clrf DP5 clrf DP6 clrf DP7 clrf DP8 movlw.128 subwf TEMP1,W btfss STATUS,Z goto NO_CERO_M ; Mismos comentarios que la rutina CONVERTIR_G movwf DP5 movlw A'0' movwf DP6 Proyecto Fin de Carrera 106 Antonio Andújar Caballero

movwf DP7 movwf DP8 NO_CERO_M btfss STATUS,C goto ARR_M movlw.128 subwf TEMP1,F movlw A'+' movwf DP5 goto TRE3 ARR_M movlw.128 movwf TEMP2 movf TEMP1,W subwf TEMP2,W movwf TEMP1 movlw A'-' movwf DP5 TRE3 TRE4 incf DP6,F movlw.100 subwf TEMP1,F btfsc STATUS,C goto TRE3 movlw.100 addwf TEMP1,F decf DP6,F movlw.48 addwf DP6,F incf DP7,F movlw.10 subwf TEMP1,F btfsc STATUS,C goto TRE4 movlw.10 addwf TEMP1,F decf DP7,F movlw.48 addwf DP7,F movf TEMP1,W movwf DP8 movlw.48 addwf DP8,F Proyecto Fin de Carrera 107 Antonio Andújar Caballero

CONVERTIR_A ; Rutina para convertir a escala el pote de agudos movwf TEMP1 clrf DP9 clrf DP10 clrf DP11 clrf DP12 movlw.128 subwf TEMP1,W btfss STATUS,Z goto NO_CERO_A ; Mismos comentarios que la rutina CONVERTIR_G movwf DP9 movlw A'0' movwf DP10 movwf DP11 movwf DP12 NO_CERO_A btfss STATUS,C goto ARR_A movlw.128 subwf TEMP1,F movlw A'+' movwf DP9 goto TRE5 ARR_A movlw.128 movwf TEMP2 movf TEMP1,W subwf TEMP2,W movwf TEMP1 movlw A'-' movwf DP9 TRE5 TRE6 incf DP10,F movlw.100 subwf TEMP1,F btfsc STATUS,C goto TRE5 movlw.100 addwf TEMP1,F decf DP10,F movlw.48 addwf DP10,F incf DP11,F movlw.10 subwf TEMP1,F btfsc STATUS,C goto TRE6 Proyecto Fin de Carrera 108 Antonio Andújar Caballero

movlw.10 addwf TEMP1,F decf DP11,F movlw.48 addwf DP11,F movf TEMP1,W movwf DP12 movlw.48 addwf DP12,F CONVERTIR_GA ; Rutina para convertir a escala el pote de ganancia movwf TEMP1 ; Guardamos W en TEMP1 clrf DP13 ; Limpiamos las variables DP13, DP14 y DP15 clrf DP14 clrf DP15 TRE7 TRE8 incf DP13,F ; Aumentamos en 1 el valor de DP13 y guardamos en DP13 movlw.100 subwf TEMP1,F ; Restamos 100 a TEMP1 btfsc STATUS,C ; Si es 0 el acarreo saltamos una instrucción (negativo) goto TRE7 ; Si no es 0 el acarreo volvemos a TRE7 (positivo) movlw.100 addwf TEMP1,F ; Sumamos 100 a TEMP1 y guardamos en TEMP1 decf DP13,F ; Restamos 1 a DP13 y guardamos en DP13 movlw.48 addwf DP13,F ; Sumamos 48 a DP13 y guardamos en DP13 incf DP14,F ; Sumamos 1 a DP14 y guardamos en DP14 movlw.10 subwf TEMP1,F ; Restamos 10 a TEMP1 btfsc STATUS,C ; Si el acarreo es 0 saltamos una instrucción goto TRE8 ; Si el acarreo es 1 volvemos a TRE8 movlw.10 addwf TEMP1,F ; Sumamos 10 a TEMP1 y guardamos en TEMP1 decf DP14,F ; Restamos 1 a DP14 y guardamos en DP14 movlw.48 addwf DP14,F ; Sumamos 48 a DP14 y guardamos en DP14 movf TEMP1,W movwf DP15 ; Guardamos en DP15 el valor de TEMP1 movlw.48 addwf DP15,F ; Sumamos 48 a DP15 y guardamos en DP15 Proyecto Fin de Carrera 109 Antonio Andújar Caballero

;---------------------------------------------PRESENTACIÓN DE DATOS------------------------------------------- PRESENTAR ; Presentación de datos en el LCD movlw H'80' ; Línea superior movlw A'G' ; G movlw A'r' ; r movlw A'a' ; a movf DP1,W ; Signo del potenciómetro de graves movf DP2,W ; Centenas del potenciómetro de graves movf DP3,W ; Decenas del potenciómetro de graves movf DP4,W ; Unidades del potenciómetro de graves movlw A'M' ; M movlw A'e' ; e movlw A'd' ; d movf DP5,W ; Signo del potenciómetro de medios movf DP6,W ; Centenas del potenciómetro de medios movf DP7,W ; Decenas del potenciómetro de medios movf DP8,W ; Unidades del potenciómetro de medios movlw H'C0' ; Linea inferior movlw A'A' ; A movlw A'g' ; g movlw A'u' ; u movf DP9,W ; Signo del potenciómetro de agudos movf DP10,W ; Centenas del potenciómetro de agudos movf DP11,W ; Decenas del potenciómetro de agudos movf DP12,W ; Unidades del potenciómetro de agudos movlw A'G' ; G movlw A'a' ; a Proyecto Fin de Carrera 110 Antonio Andújar Caballero

movlw A'n' ; n movf DP13,W ; Centenas del potenciómetro de ganancia movf DP14,W ; Decenas del potenciómetro de ganancia movf DP15,W ; Unidades del potenciómetro de ganancia ;--------------------------------------------LECTURA DE LA EEPROM---------------------------------------------- LEER_EEPROM ; Rutina para cargar los potenciómetros movf DIR1,W ; Carga del potenciómetro de GRAVES bsf STATUS,RP1 ; Seleccionamos banco 2 movwf EEADR ; Pasamos el valor de dirección DIR1 a EEADR bsf STATUS,RP0 ; Seleccionamos banco 3 bcf EECON1,EEPGD ; Accedemos a memoria de datos bsf EECON1,RD ; Iniciamos lectura de la EEPROM bcf STATUS,RP0 ; Seleccionamos banco 2 movf EEDATA,W bcf STATUS,RP1 ; Seleccionamos banco 0 movwf POTE_G ; Pasamos el valor almacenado a POTE_G call CONVERTIR_G ; Convertimos el valor a escala movf DIR2,W ; Carga del potenciómetro de MEDIOS bsf STATUS,RP1 ; Seleccionamos banco 2 movwf EEADR ; Pasamos el valor de dirección DIR2 a EEADR bsf STATUS,RP0 ; Seleccionamos banco 3 bcf EECON1,EEPGD ; Accedemos a memoria de datos bsf EECON1,RD ; Iniciamos la lectura de la EEPROM bcf STATUS,RP0 ; Seleccionamos banco 2 movf EEDATA,W bcf STATUS,RP1 ; Seleccionamos banco 0 movwf POTE_M ; Pasamos el valor almacenado a POTE_M call CONVERTIR_M ; Convertimos el valor a escala movf DIR3,W ; Carga del potenciómetro de AGUDOS bsf STATUS,RP1 ; Seleccionamos banco 2 movwf EEADR ; Pasamos el valor de dirección DIR3 a EEADR bsf STATUS,RP0 ; Seleccionamos banco 3 bcf EECON1,EEPGD ; Accedemos a memoria de datos bsf EECON1,RD ; Iniciamos la lectura de la EEPROM bcf STATUS,RP0 ; Seleccionamos banco 2 movf EEDATA,W bcf STATUS,RP1 ; Seleccionamos banco 0 movwf POTE_A ; Pasamos el valor almacenado a POTE_A call CONVERTIR_A ; Convertimos el valor a escala Proyecto Fin de Carrera 111 Antonio Andújar Caballero

movf DIR4,W ; Carga del potenciómetro de GANANCIA bsf STATUS,RP1 ; Seleccionamos banco 2 movwf EEADR ; Pasamos el valor de dirección DIR4 a EEADR bsf STATUS,RP0 ; Seleccionamos banco 3 bcf EECON1,EEPGD ; Accedemos a memoria de datos bsf EECON1,RD ; Iniciamos la lectura de la EEPROM bcf STATUS,RP0 ; Seleccionamos banco 2 movf EEDATA,W bcf STATUS,RP1 ; Seleccionamos banco 0 movwf POTE_GA ; Pasamos el valor almacenado a POTE_GA call CONVERTIR_GA ; Convertimos el valor a escala ;--------------------------------------------------------PROGRAMA----------------------------------------------------- INICIO ; Comienzo del programa bcf STATUS,RP0 bcf STATUS,RP1 ; Seleccionamos el banco 0 clrf PORTA ; Limpiamos el Puerto A clrf PORTB ; Limpiamos el Puerto B clrf PORTC ; Limpiamos el Puerto C clrf WWW ; Limpiamos las variables que usaremos en el programa clrf ESTADO clrf TEMP1 clrf TEMP2 clrf TEMP3 clrf TEMP4 clrf CONTA_1 clrf CONTA_2 clrf CONTA_3 clrf CONTA_4 clrf CONTA_5 clrf DP1 clrf DP2 clrf DP3 clrf DP4 clrf DP5 clrf DP6 clrf DP7 clrf DP8 clrf DP9 clrf DP10 clrf DP11 clrf DP12 clrf DP13 clrf DP14 clrf DP15 clrf POTE_G clrf POTE_M clrf POTE_A clrf POTE_GA clrf FLASH_N clrf FLAG clrf DX1 clrf DX2 Proyecto Fin de Carrera 112 Antonio Andújar Caballero

clrf DX3 clrf DX4 clrf RETARDO1 clrf DIR1 clrf DIR2 clrf DIR3 clrf DIR4 bsf STATUS,RP0 ; Seleccionamos el banco1 movlw B'00000110' movwf ADCON1 ; Todos los pines como digitales movlw B'00000000' movwf TRISA ; Configuramos todos los pines del puerto A como salidas movlw B'11111111' movwf TRISB ; Configuramos todos los pines del puerto B como entradas movlw B'00000000' movwf TRISC ; Configuramos todos los pines del puerto C como salidas movlw B'00000001' movwf PIE1 ; Activamos la interrupción por desbordamiento TMR1 bcf STATUS,RP0 ; Pasamos al banco 0 NO_CHIP ; Deshabilitamos ambos potenciómetros call INICIALIZAR_LCD ; Inicializa el LCD movlw.0 movwf DIR1 ; Dirección 1 apunta a 0 movlw.1 movwf DIR2 ; Dirección 2 apunta a 1 movlw.2 movwf DIR3 ; Dirección 3 apunta a 2 movlw.3 movwf DIR4 ; Dirección 4 apunta a 3 call LEER_EEPROM ; Leemos la EEPROM movlw B'00000000' movwf PIR1 ; Configuro las interrupciones por TMR1 movlw B'11000000' movwf INTCON ; Activa unmasked interrupciones movlw B'00110001' movwf T1CON ; 1:8 prescale value, enable timer1 call PRESENTAR ; Presentación de los datos en el LCD call ENVIAR_GR_GA ; Transmite al pote de Ganancia-Graves la posición call ENVIAR_ME_AG ; Transmite al pote de Medios-Agudos la posición NO_FLASH movlw.0 movwf FLASH_N ; Damos valor 0 a FLASH_N (ningún pote) btfss MEMORIA ; Si no se ha pulsado MEMO salta una instrucción call GUARDA_MEMORIA ; Si se ha pulsado llama a GUARDA_MEMORIA btfss PRESET_1 ; Si no se ha pulsado PRESET1 salta una instrucción call PONE_PRESET_1 ; Si se ha pulsado llama a PONE_PRESET_1 btfss PRESET_2 ; Si no se ha pulsado PRESET2 salta una instrucción call PONE_PRESET_2 ; Si se ha pulsado llama a PONE_PRESET_2 btfss PRESET_3 ; Si no se ha pulsado PRESET3 salta una instrucción call PONE_PRESET_3 ; Si se ha pulsado llama a PONE_PRESET_3 btfss PRESET_4 ; Si no se ha pulsado PRESET4 salta una instrucción Proyecto Fin de Carrera 113 Antonio Andújar Caballero

call PONE_PRESET_4 ; Si se ha pulsado llama a PONE_PRESET_4 btfsc CAMBIO ; Si se ha pulsado CAMBIO salta una instrucción goto NO_FLASH ; Si no se ha pulsado vuelve a comprobar pulsadores movlw.30 movwf RETARDO1 ; Retardo (parpadeo) movlw.1 movwf FLASH_N ; Colocamos un 1 en FLASH_N (Potenciómetro de Graves) btfss CAMBIO ; Volvemos a comprobar CAMBIO. Si esta pulsado salta a POTE_GRAVES goto $-1 goto POTE_GRAVES ;------------------------------------REGULACIÓN DE LOS POTENCIÓMETROS-------------------------------- POTE_GRAVES ; Regula el potenciómetro de Graves movlw.1 movwf FLASH_N ; Colocamos un 1 en FLASH_N (Potenciómetro de Graves) call DEMORA_100MS ; Retraso de 100ms btfsc SUBE ; Si se pulsa SUBE saltamos una instrucción goto SALTA1 ; Si no pulsamos SUBE vamos a SALTA1 movlw.255 subwf POTE_G,W ; Restamos 255 al valor de POTE_G btfsc STATUS,Z ; Si la operación no es 0 saltamos una instrucción goto SALTA3 ; Si la operación es 0 vamos a SALTA3 incf POTE_G,F ; Sumamos una posición a POTE_G y guardamos movf POTE_G,W ; Pasamos POTE_G a W call CONVERTIR_G ; Convertimos a escala movlw.30 movwf RETARDO1 ; Retardo (parpadeo) bcf INTCON,GIE ; Desactivamos interrupciones call PRESENTAR ; Presentamos en el LCD los datos actuales call ENVIAR_GR_GA ; Transmite al pote de Ganancia-Graves los datos goto SALTA3 ; Vamos a SALTA3 SALTA1 btfsc BAJA ; Si se pulsa BAJA salta una instrucción goto SALTA2 ; Si no se pulsa BAJA vamos a SALTA2 movlw.1 subwf POTE_G,W ; Restamos 1 al valor de POTE_G btfsc STATUS,Z ; Si la operación no es 0 saltamos una instrucción goto SALTA3 ; Si la operación es 0 vamos a SALTA3 decf POTE_G,F ; Restamos una posición a POTE_G y guardamos movf POTE_G,W ; Pasamos POTE_G a W call CONVERTIR_G ; Convertimos a escala movlw.30 movwf RETARDO1 ; Retardo (parpadeo) bcf INTCON,GIE ; Desactivamos las interrupciones call PRESENTAR ; Presentamos en el LCD los datos actuales call ENVIAR_GR_GA ; Transmite al pote de Ganancia-Graves los datos goto SALTA3 ; Vamos a SALTA3 SALTA2 bsf INTCON,GIE ; Activamos las interrupciones Proyecto Fin de Carrera 114 Antonio Andújar Caballero

SALTA3 movf RETARDO1,F btfsc STATUS,Z ; Si el retardo (parpadeo) no es 0 saltamos una instrucción goto NO_FLASH ; Si el retardo (parpadeo) es 0 vamos a NO_FLASH (inicio) btfsc CAMBIO ; Si se pulsa CAMBIO salta una instrucción goto POTE_GRAVES ; Si no se pulsa CAMBIO volvemos a POTE_GRAVES movlw.30 movwf RETARDO1 ; Vuelve a cargar retardo (parpadeo) movlw.2 movwf FLASH_N ; Colocamos un 2 en FLASH_N (Potenciómetro de Medios) btfss CAMBIO ; Si no se pulsa CAMBIO vamos a POTE_MEDIOS goto $-1 goto POTE_MEDIOS POTE_MEDIOS ; Regula el potenciómetro de Medios movlw.2 movwf FLASH_N call DEMORA_100MS btfsc SUBE goto SALTA4 movlw.255 subwf POTE_M,W btfsc STATUS,Z goto SALTA6 incf POTE_M,F ; Mismos comentarios para la regulación de Graves movf POTE_M,W call CONVERTIR_M movlw.30 movwf RETARDO1 bcf INTCON,GIE call PRESENTAR call ENVIAR_ME_AG goto SALTA6 SALTA4 btfsc BAJA goto SALTA5 movlw.1 subwf POTE_M,W btfsc STATUS,Z goto SALTA6 decf POTE_M,F movf POTE_M,W call CONVERTIR_M movlw.30 movwf RETARDO1 bcf INTCON,GIE call PRESENTAR call ENVIAR_ME_AG goto SALTA6 Proyecto Fin de Carrera 115 Antonio Andújar Caballero

SALTA5 bsf INTCON,GIE SALTA6 movf RETARDO1,F btfsc STATUS,Z goto NO_FLASH btfsc CAMBIO goto POTE_MEDIOS movlw.30 movwf RETARDO1 movlw.3 movwf FLASH_N btfss CAMBIO goto $-1 goto POTE_AGUDOS POTE_AGUDOS ; Regula el potenciómetro de Agudos movlw.3 movwf FLASH_N call DEMORA_100MS btfsc SUBE goto SALTA7 movlw.255 subwf POTE_A,W btfsc STATUS,Z goto SALTA9 incf POTE_A,F ; Mismos comentarios para la regulación de Graves movf POTE_A,W call CONVERTIR_A movlw.30 movwf RETARDO1 bcf INTCON,GIE call PRESENTAR call ENVIAR_ME_AG goto SALTA9 SALTA7 btfsc BAJA goto SALTA8 movlw.1 subwf POTE_A,W btfsc STATUS,Z goto SALTA9 decf POTE_A,F movf POTE_A,W call CONVERTIR_A movlw.30 movwf RETARDO1 bcf INTCON,GIE call PRESENTAR call ENVIAR_ME_AG goto SALTA9 Proyecto Fin de Carrera 116 Antonio Andújar Caballero

SALTA8 bsf INTCON,GIE SALTA9 movf RETARDO1,F btfsc STATUS,Z goto NO_FLASH btfsc CAMBIO goto POTE_AGUDOS movlw.30 movwf RETARDO1 movlw.4 movwf FLASH_N btfss CAMBIO goto $-1 goto POTE_GANANCIA POTE_GANANCIA ; Regula el potenciómetro de Ganancia movlw.4 movwf FLASH_N call DEMORA_100MS btfsc SUBE goto SALTA10 movlw.255 subwf POTE_GA,W btfsc STATUS,Z goto SALTA12 incf POTE_GA,F ; Mismos comentarios para la regulación de Graves movf POTE_GA,W call CONVERTIR_GA movlw.30 movwf RETARDO1 bcf INTCON,GIE call PRESENTAR call ENVIAR_GR_GA goto SALTA12 SALTA10 btfsc BAJA goto SALTA11 movlw.0 subwf POTE_GA,W btfsc STATUS,Z goto SALTA11 decf POTE_GA,F movf POTE_GA,W call CONVERTIR_GA movlw.30 movwf RETARDO1 bcf INTCON,GIE call PRESENTAR call ENVIAR_GR_GA goto SALTA12 Proyecto Fin de Carrera 117 Antonio Andújar Caballero

SALTA11 bsf INTCON,GIE SALTA12 movf RETARDO1,F btfsc STATUS,Z goto NO_FLASH btfsc CAMBIO goto POTE_GANANCIA movlw.0 movwf FLASH_N btfss CAMBIO goto $-1 goto NO_FLASH GUARDA_MEMORIA ; Carga o graba la memoria (MEMO) bcf INTCON,GIE ; Desactivamos interrupciones call DEMORA_100MS ; Retraso de 100ms btfsc MEMORIA ; Si sigue pulsado MEMO salta una instrucción ; Si no sigue pulsado MEMO volvemos al programa movlw.132 movwf CONTA_3 ; Inicia contador de 2 segundos QWE10 QWE11 QWE12 movlw.40 movwf CONTA_4 movlw.72 movwf CONTA_5 btfsc MEMORIA ; Si se pulsa MEMO más de 2 segundos salta una instrucción goto LEER ; En caso de pulsar por menos de 2 segundos vamos a LEER decfsz CONTA_5,F goto QWE12 decfsz CONTA_4,F goto QWE11 decfsz CONTA_3,F goto QWE10 goto GUARDAR ; Después de esperar 2 segundos vamos a GUARDAR LEER ; Leemos la Memoria movlw.0 movwf DIR1 ; La dirección 1 apunta a 0 movlw.1 movwf DIR2 ; La dirección 2 apunta a 1 movlw.2 movwf DIR3 ; La dirección 3 apunta a 2 movlw.3 movwf DIR4 ; La dirección 4 apunta a 3 call LEER_EEPROM ; Leemos la EEPROM movlw B'00000001' ; Limpiamos el LCD Proyecto Fin de Carrera 118 Antonio Andújar Caballero

movlw H'80' ; Línea superior movlw A'M' ; M movlw A'e' ; e movlw A'm' ; m movlw A'o' ; o movlw A'r' ; r movlw A'i' ; i movlw A'a' ; a movlw H'C0' ; Línea inferior movlw A'L' ; L movlw A'e' ; e movlw A'i' ; i movlw A'd' ; d movlw A'a' ; a call DEMORA_1S5 ; Retardo de 1,5 segundos call PRESENTAR ; Presentamos los datos en el LCD bsf INTCON,GIE ; Activamos las interrupciones ; Volvemos al programa Proyecto Fin de Carrera 119 Antonio Andújar Caballero

GUARDAR ; Guardamos la memoria bcf INTCON,GIE ; Desactiva las interrupciones ; Guardamos la posición 00 de la EEPROM movf POTE_G,W ; Pasamos el valor de POTE_G a W bsf STATUS,RP1 bcf STATUS,RP0 ; Seleccionamos el banco 2 movwf EEDATA ; Pasamos W a EEDATA movlw.0 movwf EEADR ; Lo guardamos en la dirección 0 (Graves) bsf STATUS,RP0 ; Seleccionamos el banco 3 bcf EECON1,WRERR ; Colocamos un 0 en el flag de error de escritura bcf EECON1,WR ; Desactivamos la escritura de la EEPROM bcf EECON1,EEPGD ; Accedemos a memoria de datos bsf EECON1,WREN ; Permitimos el ciclo de escritura movlw 0X55 movwf EECON2 movlw 0XAA movwf EECON2 bsf EECON1,WR ; Iniciamos el ciclo de escritura bcf EECON1,WREN ; Desactivamos la escritura de la EEPROM DAS1 DAS2 btfsc EECON1,WR ; Si el ciclo de escritura terminó, saltamos una instrucción goto DAS1 ; Si no ha terminado el ciclo de escritura volvemos a DAS1 btfsc EECON1,WRERR ; Si no hay error de escritura, saltamos una instrucción goto GUARDAR ; Si hay error de escritura volvemos a GUARDAR bcf STATUS,RP0 bcf STATUS,RP1 ; Seleccionamos el banco 0 movf POTE_M,W ; Guardamos la posición 01 de la EEPROM bsf STATUS,RP1 bcf STATUS,RP0 movwf EEDATA movlw.1 movwf EEADR ; Guardamos el valor POTE_M en la dirección 1 (Medios) bsf STATUS,RP0 bcf EECON1,WRERR bcf EECON1,WR bcf EECON1,EEPGD bsf EECON1,WREN movlw 0X55 movwf EECON2 movlw 0XAA movwf EECON2 bsf EECON1,WR bcf EECON1,WREN DAS3 btfsc goto btfsc goto EECON1,WR DAS3 EECON1,WRERR DAS2 Proyecto Fin de Carrera 120 Antonio Andújar Caballero

bcf bcf STATUS,RP0 STATUS,RP1 DAS4 movf POTE_A,W ; Guardamos la posición 02 de la EEPROM bsf STATUS,RP1 bcf STATUS,RP0 movwf EEDATA movlw.2 movwf EEADR ; Guardamos el valor POTE_A en la dirección 2 (Agudos) bsf STATUS,RP0 bcf EECON1,WRERR bcf EECON1,WR bcf EECON1,EEPGD bsf EECON1,WREN movlw 0X55 movwf EECON2 movlw 0XAA movwf EECON2 bsf EECON1,WR bcf EECON1,WREN DAS5 btfsc goto btfsc goto bcf bcf EECON1,WR DAS5 EECON1,WRERR DAS4 STATUS,RP0 STATUS,RP1 DAS6 movf POTE_GA,W ; Guardamos la posición 03 de la EEPROM bsf STATUS,RP1 bcf STATUS,RP0 movwf EEDATA movlw.3 movwf EEADR ; Guardamos el valor POTE_GA en la dirección 3 (Ganancia) bsf STATUS,RP0 bcf EECON1,WRERR bcf EECON1,WR bcf EECON1,EEPGD bsf EECON1,WREN movlw 0X55 movwf EECON2 movlw 0XAA movwf EECON2 bsf EECON1,WR bcf EECON1,WREN DAS7 btfsc goto btfsc goto EECON1,WR DAS7 EECON1,WRERR DAS6 Proyecto Fin de Carrera 121 Antonio Andújar Caballero

bcf STATUS,RP0 bcf STATUS,RP1 movlw B'00000001' ; Limpiamos el LCD movlw H'80' ; Línea superior movlw A'M' ; M movlw A'e' ; e movlw A'm' ; m movlw A'o' ; o movlw A'r' ; r movlw A'i' ; i movlw A'a' ; a movlw H'C0' ; Línea inferior movlw A'G' ; G movlw A'r' ; r movlw A'a' ; a movlw A'b' ; b movlw A'a' ; a movlw A'd' ; d movlw A'a' ; a call DEMORA_1S5 ; Retardo de 1,5 segundos call PRESENTAR ; Presentamos datos en el LCD bsf INTCON,GIE ; Activamos las interrupciones ; Volvemos al programa Proyecto Fin de Carrera 122 Antonio Andújar Caballero

PONE_PRESET_1 ; Carga el Preset 1 bcf INTCON,GIE ; Desactiva las interrupciones call DEMORA_100MS ; Retardo de 100ms btfsc PRESET_1 ; Si sigue pulsado PRESET1 saltamos una instrucción ; Si no sigue pulsado volvemos al programa movlw.4 movwf DIR1 ; La dirección 1 apunta a 4 movlw.5 movwf DIR2 ; La dirección 2 apunta a 5 movlw.6 movwf DIR3 ; La dirección 3 apunta a 6 movlw.7 movwf DIR4 ; La dirección 4 apunta a 7 call LEER_EEPROM ; Leemos la EEPROM movlw B'00000001' ; Limpiamos el LCD movlw H'80' ; Línea superior movlw A'P' ; P movlw A'r' ; r movlw A'e' ; e movlw A's' ; s movlw A'e' ; e movlw A't' ; t movlw A'1' ; 1 movlw H'C0' ; Línea inferior movlw A'C' ; C Proyecto Fin de Carrera 123 Antonio Andújar Caballero

movlw A'a' ; a movlw A'r' ; r movlw A'g' ; g movlw A'a' ; a movlw A'd' ; d movlw A'o' ; o call DEMORA_1S5 ; Retardo de 1,5 segundos call PRESENTAR ; Presentamos los datos en el LCD bsf INTCON,GIE ; Activamos las interrupciones ; Volvemos al programa PONE_PRESET_2 ; Carga el Preset 2 bcf INTCON,GIE ; Desactivamos las interrupciones call DEMORA_100MS ; Retardo de 100ms btfsc PRESET_2 ; Si sigue pulsado PRESET2 saltamos una instrucción ; Si no sigue pulsado volvemos al programa movlw.8 movwf DIR1 ; La dirección 1 apunta a 8 movlw.9 movwf DIR2 ; La dirección 2 apunta a 9 movlw.10 movwf DIR3 ; La dirección 3 apunta a 10 movlw.11 movwf DIR4 ; La dirección 4 apunta a 11 call LEER_EEPROM ; Leemos la EEPROM movlw B'00000001' ; Limpiamos el LCD movlw H'80' ; Línea superior movlw A'P' ; P movlw A'r' ; r movlw A'e' ; e movlw A's' ; s movlw A'e' ; e Proyecto Fin de Carrera 124 Antonio Andújar Caballero

movlw A't' ; t movlw A'2' ; 2 movlw H'C0' ; Línea inferior movlw A'C' ; C movlw A'a' ; a movlw A'r' ; r movlw A'g' ; g movlw A'a' ; a movlw A'd' ; d movlw A'o' ; o call DEMORA_1S5 ; Retardo de 1,5 segundos call PRESENTAR ; Presentamos los datos en el LCD bsf INTCON,GIE ; Activamos las interrupciones ; Volvemos al programa PONE_PRESET_3 ; Carga el Preset 3 bcf INTCON,GIE ; Desactivamos las interrupciones call DEMORA_100MS ; Retardo de 100ms btfsc PRESET_3 ; Si sigue pulsado PRESET3 saltamos una instrucción ; Si no sigue pulsado volvemos al programa movlw.12 movwf DIR1 ; La dirección 1 apunta a 12 movlw.13 movwf DIR2 ; La dirección 2 apunta a 13 movlw.14 movwf DIR3 ; La dirección 3 apunta a 14 movlw.15 movwf DIR4 ; La dirección 4 apunta a 15 call LEER_EEPROM ; Leemos la EEPROM movlw B'00000001' ; Limpiamos el LCD movlw H'80' ; Línea Superior Proyecto Fin de Carrera 125 Antonio Andújar Caballero

movlw A'P' ; P movlw A'r' ; r movlw A'e' ; e movlw A's' ; s movlw A'e' ; e movlw A't' ; t movlw A'3' ; 3 movlw H'C0' ; Línea inferior movlw A'C' ; C movlw A'a' ; a movlw A'r' ; r movlw A'g' ; g movlw A'a' ; a movlw A'd' ; d movlw A'o' ; o call DEMORA_1S5 ; Retardo de 1,5 segundos call PRESENTAR ; Presentamos los datos en el LCD bsf INTCON,GIE ; Activamos las interrupciones ; Volvemos al programa Proyecto Fin de Carrera 126 Antonio Andújar Caballero

PONE_PRESET_4 ; Carga el Preset 4 bcf INTCON,GIE ; Desactivamos las interrupciones call DEMORA_100MS ; Retardo de 100ms btfsc PRESET_4 ; Si sigue pulsado PRESET4 saltamos una instrucción ; Si no sigue pulsado volvemos a programa movlw.16 movwf DIR1 ; La dirección 1 apunta a 16 movlw.17 movwf DIR2 ; La dirección 2 apunta a 17 movlw.18 movwf DIR3 ; La dirección 3 apunta a 18 movlw.19 movwf DIR4 ; La dirección 4 apunta a 19 call LEER_EEPROM movlw B'00000001' ; Limpiamos el LCD movlw H'80' ; Línea superior movlw A'P' ; P movlw A'r' ; r movlw A'e' ; e movlw A's' ; s movlw A'e' ; e movlw A't' ; t movlw A'4' ; 4 movlw H'C0' ; Línea inferior movlw A'C' ; C movlw A'a' ; a Proyecto Fin de Carrera 127 Antonio Andújar Caballero

movlw A'r' ; r movlw A'g' ; g movlw A'a' ; a movlw A'd' ; d movlw A'o' ; o call DEMORA_1S5 ; Retardo de 1,5 segundos call PRESENTAR ; Presentamos los datos en el LCD bsf INTCON,GIE ; Activamos las interrupciones ; Volvemos al programa ;----------------------------------------------RUTINAS DE TRANSMISIÓN----------------------------------------- ENVIAR_GR_GA ; Rutina para enviar datos al pote de Ganancia-Graves GR_GA ; Activa el potenciómetro de Ganancia-Graves bsf DAT ; Configuramos los potes como separados bsf CLK ; Sube la línea de Clock bcf CLK ; Baja la línea de Clock bcf DAT ; Baja la línea de Datos movf POTE_G,W ; Pasamos a W el valor de POTE_G call OUTPUT ; Enviamos el byte de Graves al potenciómetro bcf CLK ; Baja la línea de Clock bcf DAT ; Baja la línea de Datos movf POTE_GA,W ; Pasamos a W el valor de POTE_GA call OUTPUT ; Enviamos el byte de Ganancia al potenciómetro NO_CHIP ; Desactiva todos los potenciómetros bcf DAT ; Baja la línea de Datos bcf CLK ; Baja la línea de Clock ; Volvemos al programa ENVIAR_ME_AG ; Rutina para enviar datos al pote de Medios-Agudos ME_AG ; Activa el potenciómetro de Medios-Agudos bsf DAT ; Configura los potes como separados Proyecto Fin de Carrera 128 Antonio Andújar Caballero

bsf CLK ; Sube la línea de Clock bcf CLK ; Baja la línea de Clock bcf DAT ; Baja la línea de Datos movf POTE_A,W ; Pasamos a W el valor de POTE_A call OUTPUT ; Enviamos el byte de Agudos al potenciómetro bcf CLK ; Baja la línea de Clock bcf DAT ; Baja la línea de Datos movf POTE_M,W ; Pasamos a W el valor de POTE_M call OUTPUT ; Enviamos el byte de Medios al potenciómetro NO_CHIP bcf DAT ; Baja la línea de Datos ; Desactiva todos los potenciómetros bcf CLK ; Baja la línea de Clock ; Volvemos al programa OUTPUT movwf TEMP3 'TEMP3' movlw.8 movwf TEMP4 ; Rutina de envío de un byte ; Salva el byte a transmitir en el registro temporal TEMP3 ; Inicializa el contador GFD bcf CLK ; Baja la línea de Clock bcf DAT ; Baja la línea de Datos btfsc TEMP3,7 ; Comprueba el bit, si es 0 lo deja igual bsf DAT ; Y lo sube si es uno bsf CLK ; Da un pulso de reloj rlf TEMP3,F ; Rotamos a la izquierda 'TEMP3' decfsz TEMP4,F ; Decrementamos. Comprobamos q hemos enviado los 8 bits goto GFD ; Si no, repetimos el bucle ; Volvemos al programa ;------------------------------------------------DATOS DE LA EEPROM---------------------------------------------- ; Las primeras 4 posiciones son las usadas por la memoria ; Las restantes (en grupos de 4) son las posiciones de los presets ; Sus valores no podrán ser cambiados una vez que grabemos el PIC ORG H'2100' ; Preset MEMO. Inicial todo en posición media. data.128 ; Dato menor 1, cero 128, dato mayor 255 data.128 ; Dato menor 1, cero 128, dato mayor 255 data.128 ; Dato menor 1, cero 128, dato mayor 255 data.128 ; Dato menor 0, dato mayor 255 Proyecto Fin de Carrera 129 Antonio Andújar Caballero

; Preset 1 (Todo graves) data.255 ; Dato menor 1, cero 128, dato mayor 255 data.128 ; Dato menor 1, cero 128, dato mayor 255 data.60 ; Dato menor 1, cero 128, dato mayor 255 data.128 ; Dato menor 0, dato mayor 255 ; Preset 2 (Todo medios) data.128 ; Dato menor 1, cero 128, dato mayor 255 data.255 ; Dato menor 1, cero 128, dato mayor 255 data.128 ; Dato menor 1, cero 128, dato mayor 255 data.128 ; Dato menor 0, dato mayor 255 ; Preset 3 (Todo agudos) data.60 ; Dato menor 1, cero 128, dato mayor 255 data.128 ; Dato menor 1, cero 128, dato mayor 255 data.255 ; Dato menor 1, cero 128, dato mayor 255 data.128 ; Dato menor 0, dato mayor 255 ; Preset 4 (Normal) data.170 ; Dato menor 1, cero 128, dato mayor 255 data.140 ; Dato menor 1, cero 128, dato mayor 255 data.100 ; Dato menor 1, cero 128, dato mayor 255 data.128 ; Dato menor 0, dato mayor 255 ;--------------------------------------------------------------------------------------------------- end ; Fin del programa Proyecto Fin de Carrera 130 Antonio Andújar Caballero