Capítulo VIII: PROGRAMACIÓN DEL PIC...

36
ESCUELA SUPERIOR DE INGENIEROS Diseño de un Ecualizador digital de 3 bandas Proyecto Fin de Carrera 95 Antonio Andújar Caballero Capítulo VIII: PROGRAMACIÓN DEL PIC 16F876A

Transcript of Capítulo VIII: PROGRAMACIÓN DEL PIC...

Page 1: Capítulo VIII: PROGRAMACIÓN DEL PIC 16F876Abibing.us.es/proyectos/abreproy/4206/fichero/Volumen%2FCapitulo+8... · realizado en lenguaje C, pero el hecho de conocer mejor el ASM,

ESCUELA SUPERIOR DE INGENIEROS

Diseño de un Ecualizador digital de 3 bandas

Proyecto Fin de Carrera 95 Antonio Andújar Caballero

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

Page 2: Capítulo VIII: PROGRAMACIÓN DEL PIC 16F876Abibing.us.es/proyectos/abreproy/4206/fichero/Volumen%2FCapitulo+8... · realizado en lenguaje C, pero el hecho de conocer mejor el ASM,

ESCUELA SUPERIOR DE INGENIEROS

Diseño de un Ecualizador digital de 3 bandas

Proyecto Fin de Carrera 96 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_OFF&_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

Page 3: Capítulo VIII: PROGRAMACIÓN DEL PIC 16F876Abibing.us.es/proyectos/abreproy/4206/fichero/Volumen%2FCapitulo+8... · realizado en lenguaje C, pero el hecho de conocer mejor el ASM,

ESCUELA SUPERIOR DE INGENIEROS

Diseño de un Ecualizador digital de 3 bandas

Proyecto Fin de Carrera 97 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

Page 4: Capítulo VIII: PROGRAMACIÓN DEL PIC 16F876Abibing.us.es/proyectos/abreproy/4206/fichero/Volumen%2FCapitulo+8... · realizado en lenguaje C, pero el hecho de conocer mejor el ASM,

ESCUELA SUPERIOR DE INGENIEROS

Diseño de un Ecualizador digital de 3 bandas

Proyecto Fin de Carrera 98 Antonio Andújar Caballero

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

Page 5: Capítulo VIII: PROGRAMACIÓN DEL PIC 16F876Abibing.us.es/proyectos/abreproy/4206/fichero/Volumen%2FCapitulo+8... · realizado en lenguaje C, pero el hecho de conocer mejor el ASM,

ESCUELA SUPERIOR DE INGENIEROS

Diseño de un Ecualizador digital de 3 bandas

Proyecto Fin de Carrera 99 Antonio Andújar Caballero

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

Page 6: Capítulo VIII: PROGRAMACIÓN DEL PIC 16F876Abibing.us.es/proyectos/abreproy/4206/fichero/Volumen%2FCapitulo+8... · realizado en lenguaje C, pero el hecho de conocer mejor el ASM,

ESCUELA SUPERIOR DE INGENIEROS

Diseño de un Ecualizador digital de 3 bandas

Proyecto Fin de Carrera 100 Antonio Andújar Caballero

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

Page 7: Capítulo VIII: PROGRAMACIÓN DEL PIC 16F876Abibing.us.es/proyectos/abreproy/4206/fichero/Volumen%2FCapitulo+8... · realizado en lenguaje C, pero el hecho de conocer mejor el ASM,

ESCUELA SUPERIOR DE INGENIEROS

Diseño de un Ecualizador digital de 3 bandas

Proyecto Fin de Carrera 101 Antonio Andújar Caballero

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

Page 8: Capítulo VIII: PROGRAMACIÓN DEL PIC 16F876Abibing.us.es/proyectos/abreproy/4206/fichero/Volumen%2FCapitulo+8... · realizado en lenguaje C, pero el hecho de conocer mejor el ASM,

ESCUELA SUPERIOR DE INGENIEROS

Diseño de un Ecualizador digital de 3 bandas

Proyecto Fin de Carrera 102 Antonio Andújar Caballero

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

Page 9: Capítulo VIII: PROGRAMACIÓN DEL PIC 16F876Abibing.us.es/proyectos/abreproy/4206/fichero/Volumen%2FCapitulo+8... · realizado en lenguaje C, pero el hecho de conocer mejor el ASM,

ESCUELA SUPERIOR DE INGENIEROS

Diseño de un Ecualizador digital de 3 bandas

Proyecto Fin de Carrera 103 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 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

Page 10: Capítulo VIII: PROGRAMACIÓN DEL PIC 16F876Abibing.us.es/proyectos/abreproy/4206/fichero/Volumen%2FCapitulo+8... · realizado en lenguaje C, pero el hecho de conocer mejor el ASM,

ESCUELA SUPERIOR DE INGENIEROS

Diseño de un Ecualizador digital de 3 bandas

Proyecto Fin de Carrera 104 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 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

Page 11: Capítulo VIII: PROGRAMACIÓN DEL PIC 16F876Abibing.us.es/proyectos/abreproy/4206/fichero/Volumen%2FCapitulo+8... · realizado en lenguaje C, pero el hecho de conocer mejor el ASM,

ESCUELA SUPERIOR DE INGENIEROS

Diseño de un Ecualizador digital de 3 bandas

Proyecto Fin de Carrera 105 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 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

Page 12: Capítulo VIII: PROGRAMACIÓN DEL PIC 16F876Abibing.us.es/proyectos/abreproy/4206/fichero/Volumen%2FCapitulo+8... · realizado en lenguaje C, pero el hecho de conocer mejor el ASM,

ESCUELA SUPERIOR DE INGENIEROS

Diseño de un Ecualizador digital de 3 bandas

Proyecto Fin de Carrera 106 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 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

Page 13: Capítulo VIII: PROGRAMACIÓN DEL PIC 16F876Abibing.us.es/proyectos/abreproy/4206/fichero/Volumen%2FCapitulo+8... · realizado en lenguaje C, pero el hecho de conocer mejor el ASM,

ESCUELA SUPERIOR DE INGENIEROS

Diseño de un Ecualizador digital de 3 bandas

Proyecto Fin de Carrera 107 Antonio Andújar Caballero

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

Page 14: Capítulo VIII: PROGRAMACIÓN DEL PIC 16F876Abibing.us.es/proyectos/abreproy/4206/fichero/Volumen%2FCapitulo+8... · realizado en lenguaje C, pero el hecho de conocer mejor el ASM,

ESCUELA SUPERIOR DE INGENIEROS

Diseño de un Ecualizador digital de 3 bandas

Proyecto Fin de Carrera 108 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 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

Page 15: Capítulo VIII: PROGRAMACIÓN DEL PIC 16F876Abibing.us.es/proyectos/abreproy/4206/fichero/Volumen%2FCapitulo+8... · realizado en lenguaje C, pero el hecho de conocer mejor el ASM,

ESCUELA SUPERIOR DE INGENIEROS

Diseño de un Ecualizador digital de 3 bandas

Proyecto Fin de Carrera 109 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 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 ;------------------------------------------------------------------------------------------------------------------------------

Page 16: Capítulo VIII: PROGRAMACIÓN DEL PIC 16F876Abibing.us.es/proyectos/abreproy/4206/fichero/Volumen%2FCapitulo+8... · realizado en lenguaje C, pero el hecho de conocer mejor el ASM,

ESCUELA SUPERIOR DE INGENIEROS

Diseño de un Ecualizador digital de 3 bandas

Proyecto Fin de Carrera 110 Antonio Andújar Caballero

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

Page 17: Capítulo VIII: PROGRAMACIÓN DEL PIC 16F876Abibing.us.es/proyectos/abreproy/4206/fichero/Volumen%2FCapitulo+8... · realizado en lenguaje C, pero el hecho de conocer mejor el ASM,

ESCUELA SUPERIOR DE INGENIEROS

Diseño de un Ecualizador digital de 3 bandas

Proyecto Fin de Carrera 111 Antonio Andújar Caballero

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

Page 18: Capítulo VIII: PROGRAMACIÓN DEL PIC 16F876Abibing.us.es/proyectos/abreproy/4206/fichero/Volumen%2FCapitulo+8... · realizado en lenguaje C, pero el hecho de conocer mejor el ASM,

ESCUELA SUPERIOR DE INGENIEROS

Diseño de un Ecualizador digital de 3 bandas

Proyecto Fin de Carrera 112 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 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

Page 19: Capítulo VIII: PROGRAMACIÓN DEL PIC 16F876Abibing.us.es/proyectos/abreproy/4206/fichero/Volumen%2FCapitulo+8... · realizado en lenguaje C, pero el hecho de conocer mejor el ASM,

ESCUELA SUPERIOR DE INGENIEROS

Diseño de un Ecualizador digital de 3 bandas

Proyecto Fin de Carrera 113 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

Page 20: Capítulo VIII: PROGRAMACIÓN DEL PIC 16F876Abibing.us.es/proyectos/abreproy/4206/fichero/Volumen%2FCapitulo+8... · realizado en lenguaje C, pero el hecho de conocer mejor el ASM,

ESCUELA SUPERIOR DE INGENIEROS

Diseño de un Ecualizador digital de 3 bandas

Proyecto Fin de Carrera 114 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

Page 21: Capítulo VIII: PROGRAMACIÓN DEL PIC 16F876Abibing.us.es/proyectos/abreproy/4206/fichero/Volumen%2FCapitulo+8... · realizado en lenguaje C, pero el hecho de conocer mejor el ASM,

ESCUELA SUPERIOR DE INGENIEROS

Diseño de un Ecualizador digital de 3 bandas

Proyecto Fin de Carrera 115 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

Page 22: Capítulo VIII: PROGRAMACIÓN DEL PIC 16F876Abibing.us.es/proyectos/abreproy/4206/fichero/Volumen%2FCapitulo+8... · realizado en lenguaje C, pero el hecho de conocer mejor el ASM,

ESCUELA SUPERIOR DE INGENIEROS

Diseño de un Ecualizador digital de 3 bandas

Proyecto Fin de Carrera 116 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

Page 23: Capítulo VIII: PROGRAMACIÓN DEL PIC 16F876Abibing.us.es/proyectos/abreproy/4206/fichero/Volumen%2FCapitulo+8... · realizado en lenguaje C, pero el hecho de conocer mejor el ASM,

ESCUELA SUPERIOR DE INGENIEROS

Diseño de un Ecualizador digital de 3 bandas

Proyecto Fin de Carrera 117 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

Page 24: Capítulo VIII: PROGRAMACIÓN DEL PIC 16F876Abibing.us.es/proyectos/abreproy/4206/fichero/Volumen%2FCapitulo+8... · realizado en lenguaje C, pero el hecho de conocer mejor el ASM,

ESCUELA SUPERIOR DE INGENIEROS

Diseño de un Ecualizador digital de 3 bandas

Proyecto Fin de Carrera 118 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 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

Page 25: Capítulo VIII: PROGRAMACIÓN DEL PIC 16F876Abibing.us.es/proyectos/abreproy/4206/fichero/Volumen%2FCapitulo+8... · realizado en lenguaje C, pero el hecho de conocer mejor el ASM,

ESCUELA SUPERIOR DE INGENIEROS

Diseño de un Ecualizador digital de 3 bandas

Proyecto Fin de Carrera 119 Antonio Andújar Caballero

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

Page 26: Capítulo VIII: PROGRAMACIÓN DEL PIC 16F876Abibing.us.es/proyectos/abreproy/4206/fichero/Volumen%2FCapitulo+8... · realizado en lenguaje C, pero el hecho de conocer mejor el ASM,

ESCUELA SUPERIOR DE INGENIEROS

Diseño de un Ecualizador digital de 3 bandas

Proyecto Fin de Carrera 120 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 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

Page 27: Capítulo VIII: PROGRAMACIÓN DEL PIC 16F876Abibing.us.es/proyectos/abreproy/4206/fichero/Volumen%2FCapitulo+8... · realizado en lenguaje C, pero el hecho de conocer mejor el ASM,

ESCUELA SUPERIOR DE INGENIEROS

Diseño de un Ecualizador digital de 3 bandas

Proyecto Fin de Carrera 121 Antonio Andújar Caballero

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

Page 28: Capítulo VIII: PROGRAMACIÓN DEL PIC 16F876Abibing.us.es/proyectos/abreproy/4206/fichero/Volumen%2FCapitulo+8... · realizado en lenguaje C, pero el hecho de conocer mejor el ASM,

ESCUELA SUPERIOR DE INGENIEROS

Diseño de un Ecualizador digital de 3 bandas

Proyecto Fin de Carrera 122 Antonio Andújar Caballero

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

Page 29: Capítulo VIII: PROGRAMACIÓN DEL PIC 16F876Abibing.us.es/proyectos/abreproy/4206/fichero/Volumen%2FCapitulo+8... · realizado en lenguaje C, pero el hecho de conocer mejor el ASM,

ESCUELA SUPERIOR DE INGENIEROS

Diseño de un Ecualizador digital de 3 bandas

Proyecto Fin de Carrera 123 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 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

Page 30: Capítulo VIII: PROGRAMACIÓN DEL PIC 16F876Abibing.us.es/proyectos/abreproy/4206/fichero/Volumen%2FCapitulo+8... · realizado en lenguaje C, pero el hecho de conocer mejor el ASM,

ESCUELA SUPERIOR DE INGENIEROS

Diseño de un Ecualizador digital de 3 bandas

Proyecto Fin de Carrera 124 Antonio Andújar Caballero

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

Page 31: Capítulo VIII: PROGRAMACIÓN DEL PIC 16F876Abibing.us.es/proyectos/abreproy/4206/fichero/Volumen%2FCapitulo+8... · realizado en lenguaje C, pero el hecho de conocer mejor el ASM,

ESCUELA SUPERIOR DE INGENIEROS

Diseño de un Ecualizador digital de 3 bandas

Proyecto Fin de Carrera 125 Antonio Andújar Caballero

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

Page 32: Capítulo VIII: PROGRAMACIÓN DEL PIC 16F876Abibing.us.es/proyectos/abreproy/4206/fichero/Volumen%2FCapitulo+8... · realizado en lenguaje C, pero el hecho de conocer mejor el ASM,

ESCUELA SUPERIOR DE INGENIEROS

Diseño de un Ecualizador digital de 3 bandas

Proyecto Fin de Carrera 126 Antonio Andújar Caballero

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

Page 33: Capítulo VIII: PROGRAMACIÓN DEL PIC 16F876Abibing.us.es/proyectos/abreproy/4206/fichero/Volumen%2FCapitulo+8... · realizado en lenguaje C, pero el hecho de conocer mejor el ASM,

ESCUELA SUPERIOR DE INGENIEROS

Diseño de un Ecualizador digital de 3 bandas

Proyecto Fin de Carrera 127 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 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

Page 34: Capítulo VIII: PROGRAMACIÓN DEL PIC 16F876Abibing.us.es/proyectos/abreproy/4206/fichero/Volumen%2FCapitulo+8... · realizado en lenguaje C, pero el hecho de conocer mejor el ASM,

ESCUELA SUPERIOR DE INGENIEROS

Diseño de un Ecualizador digital de 3 bandas

Proyecto Fin de Carrera 128 Antonio Andújar Caballero

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

Page 35: Capítulo VIII: PROGRAMACIÓN DEL PIC 16F876Abibing.us.es/proyectos/abreproy/4206/fichero/Volumen%2FCapitulo+8... · realizado en lenguaje C, pero el hecho de conocer mejor el ASM,

ESCUELA SUPERIOR DE INGENIEROS

Diseño de un Ecualizador digital de 3 bandas

Proyecto Fin de Carrera 129 Antonio Andújar Caballero

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

Page 36: Capítulo VIII: PROGRAMACIÓN DEL PIC 16F876Abibing.us.es/proyectos/abreproy/4206/fichero/Volumen%2FCapitulo+8... · realizado en lenguaje C, pero el hecho de conocer mejor el ASM,

ESCUELA SUPERIOR DE INGENIEROS

Diseño de un Ecualizador digital de 3 bandas

Proyecto Fin de Carrera 130 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