Você está na página 1de 36

ESCUELA

SUPERIOR DE Diseño de un Ecualizador digital de 3 bandas


INGENIEROS

Capítulo VIII: PROGRAMACIÓN DEL


PIC 16F876A

Proyecto Fin de Carrera 95 Antonio Andújar Caballero


ESCUELA
SUPERIOR DE Diseño de un Ecualizador digital de 3 bandas
INGENIEROS

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


ESCUELA
SUPERIOR DE Diseño de un Ecualizador digital de 3 bandas
INGENIEROS

;--------------------------------------------------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


ESCUELA
SUPERIOR DE Diseño de un Ecualizador digital de 3 bandas
INGENIEROS

;---------------------------------------------------------MACROS---------------------------------------------------------

GR_GA macro ; Activa el potenciómetro de Ganancia-Graves


bsf CS1
bcf CS2
endm

ME_AG macro ; Activa el potenciómetro de Medios- Agudos


bcf CS1
bsf CS2
endm

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


ESCUELA
SUPERIOR DE Diseño de un Ecualizador digital de 3 bandas
INGENIEROS

BAJ
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
movlw A' ' ; Espacio
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

MED
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
movlw A' ' ; Espacio
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 ; Guardamos datos DP en temporales DX
movf DP10,W
movwf DX2
movf DP11,W

Proyecto Fin de Carrera 99 Antonio Andújar Caballero


ESCUELA
SUPERIOR DE Diseño de un Ecualizador digital de 3 bandas
INGENIEROS

movwf DX3
movf DP12,W
movwf DX4
movlw A' ' ; Espacio
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
movf DP13,W
movwf DX1 ; Guardamos datos DP en temporales DX
movf DP14,W
movwf DX2
movf DP15,W
movwf DX3
movlw A' ' ; Espacio
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

SAL1
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


ESCUELA
SUPERIOR DE Diseño de un Ecualizador digital de 3 bandas
INGENIEROS

;---------------------------------------------------------RETARDOS-----------------------------------------------------

DEMORA ; Rutina de retardo


movlw .10
movwf CONTA_1

QWE0
nop
decfsz CONTA_1,F
goto QWE0
return

;------------------------------------------------------------------------------------------------------------------------------

DEMORA_150US ; Rutina de retardo de 150 microsegundos


movlw .36
movwf CONTA_1

QWE1
nop
decfsz CONTA_1,F
goto QWE1
return

;------------------------------------------------------------------------------------------------------------------------------

DEMORA_1MS ; Rutina de retardo de 1 milisegundo


movlw .248
movwf CONTA_1

QWE2
nop
decfsz CONTA_1,F
goto QWE2
return

;------------------------------------------------------------------------------------------------------------------------------

DEMORA_20MS ; Rutina de retardo de 20 milisegundos


movlw .21
movwf CONTA_1

QWE3
movlw .237
movwf CONTA_2

QWE4
nop
decfsz CONTA_2,F
goto QWE4
decfsz CONTA_1,F
goto QWE3
return

;------------------------------------------------------------------------------------------------------------------------------

Proyecto Fin de Carrera 101 Antonio Andújar Caballero


ESCUELA
SUPERIOR DE Diseño de un Ecualizador digital de 3 bandas
INGENIEROS

;------------------------------------------------------------------------------------------------------------------------------

DEMORA_100MS ; Rutina de retardo de 100 milisegundos


movlw .110
movwf CONTA_3

QWE5
movlw .181
movwf CONTA_4

QWE6
nop
nop
decfsz CONTA_4,F
goto QWE6
decfsz CONTA_3,F
goto QWE5
return

;------------------------------------------------------------------------------------------------------------------------------

DEMORA_1S5 ; Rutina de retardo de 1 segundo y medio


movlw .125
movwf CONTA_3

QWE7
movlw .41
movwf CONTA_4

QWE8
movlw .73
movwf CONTA_5

QWE9
clrwdt
decfsz CONTA_5,F
goto QWE9
decfsz CONTA_4,F
goto QWE8
decfsz CONTA_3,F
goto QWE7
return

;--------------------------------------------------------------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


ESCUELA
SUPERIOR DE Diseño de un Ecualizador digital de 3 bandas
INGENIEROS

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
return

;------------------------------------------------------------------------------------------------------------------------------

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


ESCUELA
SUPERIOR DE Diseño de un Ecualizador digital de 3 bandas
INGENIEROS

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
return

;------------------------------------------------------------------------------------------------------------------------------

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


ESCUELA
SUPERIOR DE Diseño de un Ecualizador digital de 3 bandas
INGENIEROS
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
return

;------------------------------------------------------------------------------------------------------------------------------

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
call INSTRUCCION_D
movlw B'00001000' ; LCD Off
call INSTRUCCION_D
movlw B'00000001' ; Limpiamos el LCD
call INSTRUCCION_D
call DEMORA_1MS
movlw B'00000110' ; Activa el LCD, desactiva el cursor y desactiva parpadeo
call INSTRUCCION_D
movlw B'00001100' ; Limpiamos el LCD
call INSTRUCCION_D
return

;-----------------------------------------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
movlw A' ' ; 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
return

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


ESCUELA
SUPERIOR DE Diseño de un Ecualizador digital de 3 bandas
INGENIEROS
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
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

TRE2
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
return

;------------------------------------------------------------------------------------------------------------------------------

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
movlw A' '
movwf DP5
movlw A'0'
movwf DP6

Proyecto Fin de Carrera 106 Antonio Andújar Caballero


ESCUELA
SUPERIOR DE Diseño de un Ecualizador digital de 3 bandas
INGENIEROS

movwf DP7
movwf DP8
return

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

TRE4
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
return

;------------------------------------------------------------------------------------------------------------------------------

Proyecto Fin de Carrera 107 Antonio Andújar Caballero


ESCUELA
SUPERIOR DE Diseño de un Ecualizador digital de 3 bandas
INGENIEROS
;------------------------------------------------------------------------------------------------------------------------------

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
movlw A' '
movwf DP9
movlw A'0'
movwf DP10
movwf DP11
movwf DP12
return

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

TRE6
incf DP11,F
movlw .10
subwf TEMP1,F
btfsc STATUS,C
goto TRE6

Proyecto Fin de Carrera 108 Antonio Andújar Caballero


ESCUELA
SUPERIOR DE Diseño de un Ecualizador digital de 3 bandas
INGENIEROS

movlw .10
addwf TEMP1,F
decf DP11,F
movlw .48
addwf DP11,F
movf TEMP1,W
movwf DP12
movlw .48
addwf DP12,F
return

;------------------------------------------------------------------------------------------------------------------------------

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

TRE8
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
return

;------------------------------------------------------------------------------------------------------------------------------

Proyecto Fin de Carrera 109 Antonio Andújar Caballero


ESCUELA
SUPERIOR DE Diseño de un Ecualizador digital de 3 bandas
INGENIEROS
;---------------------------------------------PRESENTACIÓN DE DATOS-------------------------------------------

PRESENTAR ; Presentación de datos en el LCD


movlw H'80' ; Línea superior
call INSTRUCCION_D
movlw A'G' ;G
call DATO_D
movlw A'r' ;r
call DATO_D
movlw A'a' ;a
call DATO_D
movf DP1,W ; Signo del potenciómetro de graves
call DATO_D
movf DP2,W ; Centenas del potenciómetro de graves
call DATO_D
movf DP3,W ; Decenas del potenciómetro de graves
call DATO_D
movf DP4,W ; Unidades del potenciómetro de graves
call DATO_D
movlw A' ' ; Espacio
call DATO_D
movlw A'M' ;M
call DATO_D
movlw A'e' ;e
call DATO_D
movlw A'd' ;d
call DATO_D
movf DP5,W ; Signo del potenciómetro de medios
call DATO_D
movf DP6,W ; Centenas del potenciómetro de medios
call DATO_D
movf DP7,W ; Decenas del potenciómetro de medios
call DATO_D
movf DP8,W ; Unidades del potenciómetro de medios
call DATO_D
movlw H'C0' ; Linea inferior
call INSTRUCCION_D
movlw A'A' ;A
call DATO_D
movlw A'g' ;g
call DATO_D
movlw A'u' ;u
call DATO_D
movf DP9,W ; Signo del potenciómetro de agudos
call DATO_D
movf DP10,W ; Centenas del potenciómetro de agudos
call DATO_D
movf DP11,W ; Decenas del potenciómetro de agudos
call DATO_D
movf DP12,W ; Unidades del potenciómetro de agudos
call DATO_D
movlw A' ' ; Espacio
call DATO_D
movlw A'G' ;G
call DATO_D
movlw A'a' ;a

Proyecto Fin de Carrera 110 Antonio Andújar Caballero


ESCUELA
SUPERIOR DE Diseño de un Ecualizador digital de 3 bandas
INGENIEROS

call DATO_D
movlw A'n' ;n
call DATO_D
movlw A' ' ; Espacio
call DATO_D
movf DP13,W ; Centenas del potenciómetro de ganancia
call DATO_D
movf DP14,W ; Decenas del potenciómetro de ganancia
call DATO_D
movf DP15,W ; Unidades del potenciómetro de ganancia
call DATO_D
return

;--------------------------------------------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
nop
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
nop
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
nop
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


ESCUELA
SUPERIOR DE Diseño de un Ecualizador digital de 3 bandas
INGENIEROS
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
nop
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
return

;--------------------------------------------------------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


ESCUELA
SUPERIOR DE Diseño de un Ecualizador digital de 3 bandas
INGENIEROS
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


ESCUELA
SUPERIOR DE Diseño de un Ecualizador digital de 3 bandas
INGENIEROS

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


ESCUELA
SUPERIOR DE Diseño de un Ecualizador digital de 3 bandas
INGENIEROS

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


ESCUELA
SUPERIOR DE Diseño de un Ecualizador digital de 3 bandas
INGENIEROS

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


ESCUELA
SUPERIOR DE Diseño de un Ecualizador digital de 3 bandas
INGENIEROS

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


ESCUELA
SUPERIOR DE Diseño de un Ecualizador digital de 3 bandas
INGENIEROS
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
return ; Si no sigue pulsado MEMO volvemos al programa
movlw .132
movwf CONTA_3 ; Inicia contador de 2 segundos

QWE10
movlw .40
movwf CONTA_4

QWE11
movlw .72
movwf CONTA_5

QWE12
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
call INSTRUCCION_D

Proyecto Fin de Carrera 118 Antonio Andújar Caballero


ESCUELA
SUPERIOR DE Diseño de un Ecualizador digital de 3 bandas
INGENIEROS

movlw H'80' ; Línea superior


call INSTRUCCION_D
movlw A' ' ; Espacio
call DATO_D
movlw A' ' ; Espacio
call DATO_D
movlw A' ' ; Espacio
call DATO_D
movlw A' ' ; Espacio
call DATO_D
movlw A'M' ;M
call DATO_D
movlw A'e' ;e
call DATO_D
movlw A'm' ;m
call DATO_D
movlw A'o' ;o
call DATO_D
movlw A'r' ;r
call DATO_D
movlw A'i' ;i
call DATO_D
movlw A'a' ;a
call DATO_D
movlw H'C0' ; Línea inferior
call INSTRUCCION_D
movlw A' ' ; Espacio
call DATO_D
movlw A' ' ; Espacio
call DATO_D
movlw A' ' ; Espacio
call DATO_D
movlw A' ' ; Espacio
call DATO_D
movlw A' ' ; Espacio
call DATO_D
movlw A'L' ;L
call DATO_D
movlw A'e' ;e
call DATO_D
movlw A'i' ;i
call DATO_D
movlw A'd' ;d
call DATO_D
movlw A'a' ;a
call DATO_D
call DEMORA_1S5 ; Retardo de 1,5 segundos
call PRESENTAR ; Presentamos los datos en el LCD
bsf INTCON,GIE ; Activamos las interrupciones
return ; Volvemos al programa

Proyecto Fin de Carrera 119 Antonio Andújar Caballero


ESCUELA
SUPERIOR DE Diseño de un Ecualizador digital de 3 bandas
INGENIEROS

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
nop
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

DAS2
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
nop
btfsc EECON1,WR
goto DAS3
btfsc EECON1,WRERR
goto DAS2

Proyecto Fin de Carrera 120 Antonio Andújar Caballero


ESCUELA
SUPERIOR DE Diseño de un Ecualizador digital de 3 bandas
INGENIEROS
bcf STATUS,RP0
bcf 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
nop
btfsc EECON1,WR
goto DAS5
btfsc EECON1,WRERR
goto DAS4
bcf STATUS,RP0
bcf 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
nop
btfsc EECON1,WR
goto DAS7
btfsc EECON1,WRERR
goto DAS6

Proyecto Fin de Carrera 121 Antonio Andújar Caballero


ESCUELA
SUPERIOR DE Diseño de un Ecualizador digital de 3 bandas
INGENIEROS
bcf STATUS,RP0
bcf STATUS,RP1
movlw B'00000001' ; Limpiamos el LCD
call INSTRUCCION_D
movlw H'80' ; Línea superior
call INSTRUCCION_D
movlw A' ' ; Espacio
call DATO_D
movlw A' ' ; Espacio
call DATO_D
movlw A' ' ; Espacio
call DATO_D
movlw A' ' ; Espacio
call DATO_D
movlw A'M' ;M
call DATO_D
movlw A'e' ;e
call DATO_D
movlw A'm' ;m
call DATO_D
movlw A'o' ;o
call DATO_D
movlw A'r' ;r
call DATO_D
movlw A'i' ;i
call DATO_D
movlw A'a' ;a
call DATO_D
movlw H'C0' ; Línea inferior
call INSTRUCCION_D
movlw A' ' ; Espacio
call DATO_D
movlw A' ' ; Espacio
call DATO_D
movlw A' ' ; Espacio
call DATO_D
movlw A' ' ; Espacio
call DATO_D
movlw A'G' ;G
call DATO_D
movlw A'r' ;r
call DATO_D
movlw A'a' ;a
call DATO_D
movlw A'b' ;b
call DATO_D
movlw A'a' ;a
call DATO_D
movlw A'd' ;d
call DATO_D
movlw A'a' ;a
call DATO_D
call DEMORA_1S5 ; Retardo de 1,5 segundos
call PRESENTAR ; Presentamos datos en el LCD
bsf INTCON,GIE ; Activamos las interrupciones
return ; Volvemos al programa

Proyecto Fin de Carrera 122 Antonio Andújar Caballero


ESCUELA
SUPERIOR DE Diseño de un Ecualizador digital de 3 bandas
INGENIEROS
;------------------------------------------------------------------------------------------------------------------------------

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
return ; 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
call INSTRUCCION_D
movlw H'80' ; Línea superior
call INSTRUCCION_D
movlw A' ' ; Espacio
call DATO_D
movlw A' ' ; Espacio
call DATO_D
movlw A' ' ; Espacio
call DATO_D
movlw A' ' ; Espacio
call DATO_D
movlw A'P' ;P
call DATO_D
movlw A'r' ;r
call DATO_D
movlw A'e' ;e
call DATO_D
movlw A's' ;s
call DATO_D
movlw A'e' ;e
call DATO_D
movlw A't' ;t
call DATO_D
movlw A' ' ; Espacio
call DATO_D
movlw A'1' ;1
call DATO_D
movlw H'C0' ; Línea inferior
call INSTRUCCION_D
movlw A' ' ; Espacio
call DATO_D
movlw A' ' ; Espacio
call DATO_D
movlw A' ' ; Espacio
call DATO_D
movlw A' ' ; Espacio
call DATO_D
movlw A'C' ;C

Proyecto Fin de Carrera 123 Antonio Andújar Caballero


ESCUELA
SUPERIOR DE Diseño de un Ecualizador digital de 3 bandas
INGENIEROS
call DATO_D
movlw A'a' ;a
call DATO_D
movlw A'r' ;r
call DATO_D
movlw A'g' ;g
call DATO_D
movlw A'a' ;a
call DATO_D
movlw A'd' ;d
call DATO_D
movlw A'o' ;o
call DATO_D
call DEMORA_1S5 ; Retardo de 1,5 segundos
call PRESENTAR ; Presentamos los datos en el LCD
bsf INTCON,GIE ; Activamos las interrupciones
return ; 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
return ; 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
call INSTRUCCION_D
movlw H'80' ; Línea superior
call INSTRUCCION_D
movlw A' ' ; Espacio
call DATO_D
movlw A' ' ; Espacio
call DATO_D
movlw A' ' ; Espacio
call DATO_D
movlw A' ' ; Espacio
call DATO_D
movlw A'P' ;P
call DATO_D
movlw A'r' ;r
call DATO_D
movlw A'e' ;e
call DATO_D
movlw A's' ;s
call DATO_D
movlw A'e' ;e

Proyecto Fin de Carrera 124 Antonio Andújar Caballero


ESCUELA
SUPERIOR DE Diseño de un Ecualizador digital de 3 bandas
INGENIEROS

call DATO_D
movlw A't' ;t
call DATO_D
movlw A' ' ; Espacio
call DATO_D
movlw A'2' ;2
call DATO_D
movlw H'C0' ; Línea inferior
call INSTRUCCION_D
movlw A' ' ; Espacio
call DATO_D
movlw A' ' ; Espacio
call DATO_D
movlw A' ' ; Espacio
call DATO_D
movlw A' ' ; Espacio
call DATO_D
movlw A'C' ;C
call DATO_D
movlw A'a' ;a
call DATO_D
movlw A'r' ;r
call DATO_D
movlw A'g' ;g
call DATO_D
movlw A'a' ;a
call DATO_D
movlw A'd' ;d
call DATO_D
movlw A'o' ;o
call DATO_D
call DEMORA_1S5 ; Retardo de 1,5 segundos
call PRESENTAR ; Presentamos los datos en el LCD
bsf INTCON,GIE ; Activamos las interrupciones
return ; 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
return ; 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
call INSTRUCCION_D
movlw H'80' ; Línea Superior

Proyecto Fin de Carrera 125 Antonio Andújar Caballero


ESCUELA
SUPERIOR DE Diseño de un Ecualizador digital de 3 bandas
INGENIEROS

call INSTRUCCION_D
movlw A' ' ; Espacio
call DATO_D
movlw A' ' ; Espacio
call DATO_D
movlw A' ' ; Espacio
call DATO_D
movlw A' ' ; Espacio
call DATO_D
movlw A'P' ;P
call DATO_D
movlw A'r' ;r
call DATO_D
movlw A'e' ;e
call DATO_D
movlw A's' ;s
call DATO_D
movlw A'e' ;e
call DATO_D
movlw A't' ;t
call DATO_D
movlw A' ' ; Espacio
call DATO_D
movlw A'3' ;3
call DATO_D
movlw H'C0' ; Línea inferior
call INSTRUCCION_D
movlw A' ' ; Espacio
call DATO_D
movlw A' ' ; Espacio
call DATO_D
movlw A' ' ; Espacio
call DATO_D
movlw A' ' ; Espacio
call DATO_D
movlw A'C' ;C
call DATO_D
movlw A'a' ;a
call DATO_D
movlw A'r' ;r
call DATO_D
movlw A'g' ;g
call DATO_D
movlw A'a' ;a
call DATO_D
movlw A'd' ;d
call DATO_D
movlw A'o' ;o
call DATO_D
call DEMORA_1S5 ; Retardo de 1,5 segundos
call PRESENTAR ; Presentamos los datos en el LCD
bsf INTCON,GIE ; Activamos las interrupciones
return ; Volvemos al programa

;------------------------------------------------------------------------------------------------------------------------------

Proyecto Fin de Carrera 126 Antonio Andújar Caballero


ESCUELA
SUPERIOR DE Diseño de un Ecualizador digital de 3 bandas
INGENIEROS
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
return ; 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
call INSTRUCCION_D
movlw H'80' ; Línea superior
call INSTRUCCION_D
movlw A' ' ; Espacio
call DATO_D
movlw A' ' ; Espacio
call DATO_D
movlw A' ' ; Espacio
call DATO_D
movlw A' ' ; Espacio
call DATO_D
movlw A'P' ;P
call DATO_D
movlw A'r' ;r
call DATO_D
movlw A'e' ;e
call DATO_D
movlw A's' ;s
call DATO_D
movlw A'e' ;e
call DATO_D
movlw A't' ;t
call DATO_D
movlw A' ' ; Espacio
call DATO_D
movlw A'4' ;4
call DATO_D
movlw H'C0' ; Línea inferior
call INSTRUCCION_D
movlw A' ' ; Espacio
call DATO_D
movlw A' ' ; Espacio
call DATO_D
movlw A' ' ; Espacio
call DATO_D
movlw A' ' ; Espacio
call DATO_D
movlw A'C' ;C
call DATO_D
movlw A'a' ;a

Proyecto Fin de Carrera 127 Antonio Andújar Caballero


ESCUELA
SUPERIOR DE Diseño de un Ecualizador digital de 3 bandas
INGENIEROS
call DATO_D
movlw A'r' ;r
call DATO_D
movlw A'g' ;g
call DATO_D
movlw A'a' ;a
call DATO_D
movlw A'd' ;d
call DATO_D
movlw A'o' ;o
call DATO_D
call DEMORA_1S5 ; Retardo de 1,5 segundos
call PRESENTAR ; Presentamos los datos en el LCD
bsf INTCON,GIE ; Activamos las interrupciones
return ; 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
nop
nop
nop
bsf DAT ; Configuramos los potes como separados
nop
nop
bsf CLK ; Sube la línea de Clock
nop
nop
nop
nop
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
nop
nop
bcf DAT ; Baja la línea de Datos
bcf CLK ; Baja la línea de Clock
return ; Volvemos al programa

;------------------------------------------------------------------------------------------------------------------------------

ENVIAR_ME_AG ; Rutina para enviar datos al pote de Medios-Agudos


ME_AG ; Activa el potenciómetro de Medios-Agudos
nop
nop
nop
bsf DAT ; Configura los potes como separados
nop
nop

Proyecto Fin de Carrera 128 Antonio Andújar Caballero


ESCUELA
SUPERIOR DE Diseño de un Ecualizador digital de 3 bandas
INGENIEROS

bsf CLK ; Sube la línea de Clock


nop
nop
nop
nop
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 ; Desactiva todos los potenciómetros
nop
nop
bcf DAT ; Baja la línea de Datos
bcf CLK ; Baja la línea de Clock
return ; Volvemos al programa

;------------------------------------------------------------------------------------------------------------------------------

OUTPUT ; Rutina de envío de un byte


movwf TEMP3 ; Salva el byte a transmitir en el registro temporal TEMP3

'TEMP3'
movlw .8
movwf TEMP4 ; 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
nop
nop
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
return ; 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


ESCUELA
SUPERIOR DE Diseño de un Ecualizador digital de 3 bandas
INGENIEROS

; 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

Você também pode gostar