24
Técnicas para el control digital de un amplificador analógico de audio. Ignacio Moreno Flores. 58 6. CONTROL DEL DS1802 A TRAVÉS DE PIC 6.1. Microcontrolador PIC 16F819. Los microcontroladores PIC de Microchip forman una familia extensísima de circuitos controladores de propósito general, teniendo en común su enorme simplicidad a la hora de programarlos, sus relativamente altas prestaciones y su reducido precio. Es por ello que se hacen perfectos para su uso en aplicaciones como la que nos ocupa, o sea, relativamente sencillas de control y procesamiento de datos. De entre todos los integrados que forman la familia, nos quedamos con el PIC 16F819, por las siguiente razones: - Microcontrolador altamente sencillo y pequeño, disponible en DIP de 18 pines. - A la vez, suficiente capacidad de procesado de información, incluyendo: o 2 puertos de 8 pines de entrada/salida de propósito general. o 1 puerto serie formado por 3 pines: salida de datos, entrada de datos y reloj para la sincronización de la comunicación. o 2 timer programables. o Posibilidad de diversos tipos de interrupciones, tanto externas como internas. - Alta velocidad de procesado, teniendo un reloj interno programable desde los 31’25 KHz hasta un máximo de 4 MHz. - Memoria Flash de programa de 2K, con palabras de 14 bits, así como 256 bytes de RAM para registros internos, entre los que se encuentra: o Registros internos del propio microcontrolador. o Registros para el control de los periféricos. o Un buen número de registros de propósito general a disposición del programador. - Bajo consumo de potencia, incluyendo opción de la instrucción sleep para poner el PIC en modo “standby”. - Suministro gratuito, por parte del fabricante, del paquete de herramientas de simulación y depuración para PIC “MPLAB IDE”. Debido a la complicación que supone la programación de un microcontrolador (incluso en el caso de éste que es bastante sencillo), no se incluye una explicación exhaustiva del funcionamiento del mismo, salvo en

6. CONTROL DEL DS1802 A TRAVÉS DE PIC

  • Upload
    others

  • View
    1

  • Download
    0

Embed Size (px)

Citation preview

Técnicas para el control digital de un amplificador analógico de audio. Ignacio Moreno Flores.

58

6. CONTROL DEL DS1802 A TRAVÉS DE PIC

6.1. Microcontrolador PIC 16F819.

Los microcontroladores PIC de Microchip forman una familia extensísima de circuitos controladores de

propósito general, teniendo en común su enorme simplicidad a la hora de programarlos, sus relativamente

altas prestaciones y su reducido precio. Es por ello que se hacen perfectos para su uso en aplicaciones

como la que nos ocupa, o sea, relativamente sencillas de control y procesamiento de datos.

De entre todos los integrados que forman la familia, nos quedamos con el PIC 16F819, por las siguiente

razones:

- Microcontrolador altamente sencillo y pequeño, disponible en DIP de 18 pines.

- A la vez, suficiente capacidad de procesado de información, incluyendo:

o 2 puertos de 8 pines de entrada/salida de propósito general.

o 1 puerto serie formado por 3 pines: salida de datos, entrada de datos y reloj para la

sincronización de la comunicación.

o 2 timer programables.

o Posibilidad de diversos tipos de interrupciones, tanto externas como internas.

- Alta velocidad de procesado, teniendo un reloj interno programable desde los 31’25 KHz hasta un

máximo de 4 MHz.

- Memoria Flash de programa de 2K, con palabras de 14 bits, así como 256 bytes de RAM para

registros internos, entre los que se encuentra:

o Registros internos del propio microcontrolador.

o Registros para el control de los periféricos.

o Un buen número de registros de propósito general a disposición del programador.

- Bajo consumo de potencia, incluyendo opción de la instrucción sleep para poner el PIC en modo

“standby”.

- Suministro gratuito, por parte del fabricante, del paquete de herramientas de simulación y

depuración para PIC “MPLAB IDE”.

Debido a la complicación que supone la programación de un microcontrolador (incluso en el caso de éste

que es bastante sencillo), no se incluye una explicación exhaustiva del funcionamiento del mismo, salvo en

Técnicas para el control digital de un amplificador analógico de audio. Ignacio Moreno Flores.

59

aquellos bloques que se han utilizado (ver 6.5.). Para más información sobre PIC, consultar con la página

del fabricante, www.microchip.com.

6.2. Programador para el PIC.

Para poder introducir programas en el PIC necesitábamos un programador. Después de probar sin éxito

algunos que están en el departamento de tecnología electrónica (ninguno logró programarlo), decidimos

que la única posibilidad era fabricar uno por nuestra cuenta. De esta forma, encontramos un diseño en

internet realizado por José Manuel García (se nombra aquí a su autor como referencia y como

reconocimiento a su propio trabajo) que realiza la programación a través de su conexión al PC a través del

puerto serie. En teoría el diseño sirve para múltiples microcontroladores de la familia PIC, entre los que no

estaba el nuestro. Sin embargo, al ser una posibilidad rápida y barata, decidimos probarlo (según

aseguraba su autor, el PIC estaba probado para los PIC 16F627, 16F628,

16C84,16F83,16F84,16F873,16F874,16F876,16F877,18F242, 18F252, 18F258, 18F442, 18F452, 18F458).

El esquemático se muestra a continuación:

Técnicas para el control digital de un amplificador analógico de audio. Ignacio Moreno Flores.

60

Sin llegar a explicar el funcionamiento del programador (no está explicado en la página y pensábamos que

no era necesario (es una parte necesaria para realizar el proyecto pero no es propiamente un objetivo del

mismo), comentar que a la izquierda se encuentra el jack para conectar el circuito al puerto serie, y a la

derecha el grupo de zócalos en los que se conectan los PIC, siembre de esta forma:

El programa recomendado por su autor para la programación es el ICPROG 1.05A (que se puede bajar de

su página web) introduciendo un archivo hexadecimal (.hex) como los que crea la herramienta de diseño

para PIC, con la configuración:

Técnicas para el control digital de un amplificador analógico de audio. Ignacio Moreno Flores.

61

Aunque la que nosotros utilizamos fue a través de windows API y con el indicador del retardo totalmente a

la izquierda.

Con todo esto, el fotolito realizado para la placa programadora es:

La foto del programador:

Técnicas para el control digital de un amplificador analógico de audio. Ignacio Moreno Flores.

62

6.3. Placa de pruebas para el PIC.

Para poder probar el PIC, sus características y cualquier programa que necesitáramos, decidimos crear una

pequeñísima placa que constara únicamente de la alimentación, el propio PIC y pines para conectar

cualquier entrada genérica a los puertos A y B:

Todos los condensadores representan los huecos donde introducir los pines de conexión externa al PIC,

salvo el que tiene la forma más alargada, que es el condensador de desacoplo de la alimentación.

Técnicas para el control digital de un amplificador analógico de audio. Ignacio Moreno Flores.

63

6.4. Programa para el PIC de control del DS1802.

El programa en PIC para controlar el DS1802 consta de varios módulos que se llaman a partir del

programa principal. El programa principal es un bucle de espera activa que lee continuamente las señales

entrantes en los pines PB6 y PB7. A continuación, al producirse un nivel alto en uno de los dos, inicia un

contador que espera un tiempo de unos 125 ms para comprobar que no se trata de un ruido, tras lo cual

se pasa a sumar o restar uno al registro número 20 (utilizado para guardar el volumen) y por último a

comunicarlo al potenciómetro. Con esto, el esquema que debe seguir el programa es el siguiente:

Técnicas para el control digital de un amplificador analógico de audio. Ignacio Moreno Flores.

64

Lectura PB6 y PB7

Espera activa

Temporizador

Comunicación con

DS1802

Cálculo del volumen próximo

6.5. Programas iniciales y pruebas.

Antes de pasar a realizar el programa principal, realicé varios programas muy simples para probar que el

funcionamiento del PIC era el correcto, así como para probar cada una de las partes en que se compone el

programa principal por separado. Por tanto, hice un programa por cada uno de los bloques y los fui

depurando hasta llegar a un funcionamiento satisfactorio.

6.5.1. Programación del timer0.

El siguiente programa se corresponde con la prueba realizada para observar el correcto funcionamiento

del temporizador. Consta simplemente de un bucle de espera que, una vez configurado el timer, espera a

que finalice el mismo. Al no tener el programa ninguna entrada ni salida, sólo se puede comprobar su

funcionamiento a través de una simulación. Lo que aparece a continuación es el código ya depurado, tal y

como se utilizó para el programa final.

Lo primero que realiza el programa es la configuración del timer0 para que utilice el reloj interno, y

colocando el preescalador en 1:4. Posteriormente, para que cuente los 125 ms dichos antes, introducimos

el valor hexadecimal 0C, de forma que la cuenta finalice tras 244 ciclos del timer. Así aseguramos el

tiempo, dando como resultado que se producirá una cuenta cada 1/8 segundos (es decir, al introducir este

timer en el programa principal (ver 6.6.) asegura, por un lado, filtrar cualquier ruido o anomalía a la

Técnicas para el control digital de un amplificador analógico de audio. Ignacio Moreno Flores.

65

entrada de los pulsadores, y, por otro, que la velocidad de subida o bajada del nivel del volumen sea de

alrededor de 8 cambios por segundos (en realidad es un poco menos de 8 cambios debido a que, tras el

timer, se debe proceder al procesado del volumen y a su comunicación al potenciómetro).

Además, se deshabilitan las interrupciones, con objeto de simplificar todo el programa.

list p=16f819

include "p16f819.inc"

inicio equ 0x05

org 0x00

goto inicio

org 0x05

banksel OPTION_REG

movlw b'11000001'

movwf OPTION_REG ; configura el timer0

banksel INTCON

bcf INTCON,5 ;deshabilita interrupción producida por el timer

banksel TMR0

movlw 0x0C

movwf TMR0

bucle btfss INTCON,TMR0IF

goto bucle

end

6.5.2. Programación del puerto serie.

El siguiente programa muestra la programación realizada para la comunicación a través del puerto serie.

Al principio, tras la configuración, se introduce un dato en el registro 22 del PIC (en el caso mostrado se

introduce el 32, o sea, justo la mitad del volumen) para pasar posteriormente a comunicarlo con a través

del puerto. Como se ve, se pone primero a uno el pin PB0, que hace las veces de reset a nivel bajo del

potenciómetro digital. Lo siguiente consiste en pasar el dato al registro de salida del puerto, con un

pequeño bucle de espera que deja terminar la comunicación sin problemas. El dato es introducido dos

Técnicas para el control digital de un amplificador analógico de audio. Ignacio Moreno Flores.

66

veces, lo cual hace que se le pase al DS1802 dos veces, o sea, uno por cada canal, tal y como es

necesario según el datasheet.

Como se puede ver, en todos los programas que los necesitan se dejan los pines del puerto B RB7 y RB6

para los pulsadores, el pin RB0 para el reset y los pines RB1, 2 y 4 corresponden al puerto serie

implementado en el propio PIC.

La configuración del puerto serie incluye la elección de realizar la comunicación en flancos de subida del

reloj, y la actuación del PIC como maestro de la comunicación en todo momento.

org 0x00

goto inicio

org 0x05

movlw b'11101010';config PORTB: RB7,6=pulsadores

movwf TRISB ;RB0=reset. 1,2,4=puertoserie

banksel SSPSTAT

bsf SSPSTAT,6 ;la comunicacion se realiza en flanco de subida

banksel 22

movlw 0xaa ;20hex = 32decimal

movwf 22 ;llevamos al reg 22 el volumen inicial

banksel PORTB ;comunicacion por el puerto serie

bsf PORTB,0 ;reset=1

banksel SSPCON

clrf SSPCON

banksel SSPCON ;primer byte

bsf SSPCON,5

movf 21,0

movwf SSPBUF ;lleva contenido de reg20 a buffer de puerto serie

banksel 22

movlw 8

movwf 22

bucle1 decfsz 22,1

goto bucle1

Técnicas para el control digital de un amplificador analógico de audio. Ignacio Moreno Flores.

67

banksel SSPCON ;segundo byte

clrf SSPCON

banksel SSPCON

bsf SSPCON,5

movf 21,0

movwf SSPBUF ;lleva contenido de reg20 a buffer de puerto serie

banksel 22

movlw 8

movwf 22

bucle2 decfsz 22,1

goto bucle2

banksel PORTB

bcf PORTB,0 ;reset=0

goto ppal

end

He de comentar que el mayor problema con el que me encontré fue que el puerto serie no está

implementado en el simulador, con lo que no se puede simular. Por lo tanto, para cada programa que

realizaba tenía que probarlo directamente sobre la placa de pruebas del PIC, lo que supone conocer

únicamente el resultado externo del programa y no su desarrollo, haciendo muy difícil su puesta en

marcha y depuración. A su vez, una vez conectados ambos sistemas (el PIC con el potenciómetro)

parecían no comunicarse adecuadamente. En efecto, al pulsar un botón de subida o bajada se

comprobaba que no sólo no subía o bajaba el volumen correctamente, sino que lo que ocurría ocurría de

forma totalmente aleatoria, al menos en apariencia. La depuración de este fallo me llevó prácticamente un

mes de trabajo, habiendo realizado las siguientes comprobaciones:

- Por un lado, comprobé que existe un efecto extraño en el PIC. Al realizar un reset completo del

sistema (incluso en la simulación) todos los registros se ponen a su estado inicial. Sin embargo, al

hacer uso en el programa de ciertos registros, entre los que se incluye el registro 20 (utilizado para

guardar el volumen actual y calcular el volumen siguiente) se ponen de pronto al valor que tenían

con anterioridad. Es decir, que no se resetean realmente, sino que memorizan lo que había antes.

Técnicas para el control digital de un amplificador analógico de audio. Ignacio Moreno Flores.

68

Esto produce que el valor que se calcula como volumen siguiente no sea el correcto. Es por ello

que todos los registros se deben borrar antes de ser utilizados por primera vez en los programas.

- Una vez depurado esto, comprobé capturando las señales correspondientes con el osciloscopio,

que el PIC funcionaba correctamente, al menos en lo referente a las señales que debe sacar y a los

tiempos que vienen descritos en el datasheet del PIC. Efectivamente, todos los tiempos y

frecuencias son correctos.

- Por lo tanto, el problema debía estar, o bien en el potenciómetro, o en la conexión entre ambos: es

decir, que no “hablan el mismo idioma”. Finalmente se comprobó que el fallo estaba en el orden de

envío de los bits: el PIC los envía en el orden inverso en que los espera el potenciómetro. Esto fue

solucionado como se ve en el punto 6.5.4. Este fallo, que puede ser evidente, se nos pasó por alto

ya que pensábamos que la comunicación a través de una cosa tan usada como un puerto serie

debía seguir un esquema estándar.

6.5.3. Comunicación con el potenciómetro sin uso del puerto serie.

Al ser el puerto serie el bloque que no se podía simular, una de las cosas que pensamos que sería

conveniente realizar fue otro programa que ejecutara el mismo protocolo de comunicación pero “a mano”,

es decir, realizando el reloj y toda la comunicación vía software, sin que el microcontrolador tuviera la

necesidad de “saber” que está realizando una comunicación. El programa lo que hace es, básicamente,

implementar un reloj compuesto por ciclos a nivel alto seguidos de ciclos a nivel bajo. Antes de producir

un flanco de subida, el programa compara el bit correspondiente del registro 20 con “1” y con “0”,

sacando por el pin correspondiente del puerto B del PIC un nivel alto o bajo, respectivamente. El programa

no fue utilizado finalmente, pero se deja como ejemplo por si se necesita utilizar el puerto serie del PIC

para otra función (por ejemplo, para comunicarse con el PC) en el siguiente proyecto.

list p=16f819

include "p16f819.inc"

inicio equ 0x05

org 0x00

goto inicio

Técnicas para el control digital de un amplificador analógico de audio. Ignacio Moreno Flores.

69

org 0x05

banksel PORTB

movlw 0x00

movwf PORTB

; config del supuesto "puerto serie"

banksel TRISB

movlw b'11101010';config PORTB: RB7=up; RB6=down

movwf TRISB ;RB0=reset. 1,2,4=puertoserie

; PORTB4=clk PORTB2=data out

; volumen inicial

banksel 20

movlw 0xaa ;20hex = 32decimal

movwf 20 ;llevamos al reg 20 el volumen inicial

goto com

com

banksel PORTB ;comunicacion x puerto serie

bsf PORTB,0 ;reset=1

; simulo el reloj

bcf PORTB,4 ;en teoria, PORTB y 20 estan en = banco de mem

btfsc 20,7

goto s71 ; si bit7 de reg20=1...

goto s70 ; si bit7 de reg20=0...

s71

bsf PORTB,2

goto envio7 ;...envio un 1

s70

bcf PORTB,2

goto envio7 ;...envio un 0

envio7

bsf PORTB,4

nop

nop

Técnicas para el control digital de un amplificador analógico de audio. Ignacio Moreno Flores.

70

bcf PORTB,4

btfsc 20,6

goto s61 ; si bit6 de reg20=1...

goto s60 ; si bit6 de reg20=0...

s61

bsf PORTB,2

goto envio6 ;...envio un 1

s60

bcf PORTB,2

;...envio un 0

envio6

bsf PORTB,4

nop

nop

bcf PORTB,4

btfsc 20,5

goto s51

goto s50

s51

bsf PORTB,2

goto envio5

s50

bcf PORTB,2

envio5

bsf PORTB,4

nop

nop

bcf PORTB,4

Técnicas para el control digital de un amplificador analógico de audio. Ignacio Moreno Flores.

71

btfsc 20,4

goto s41

goto s40

s41

bsf PORTB,2

goto envio4

s40

bcf PORTB,2

envio4

bsf PORTB,4

nop

nop

bcf PORTB,4

btfsc 20,4

goto s31

goto s30

s31

bsf PORTB,2

goto envio3

s30

bcf PORTB,2

envio3

bsf PORTB,4

nop

nop

bcf PORTB,4

btfsc 20,4

goto s21

goto s20

Técnicas para el control digital de un amplificador analógico de audio. Ignacio Moreno Flores.

72

s21

bsf PORTB,2

goto envio2

s20

bcf PORTB,2

envio2

bsf PORTB,4

nop

nop

bcf PORTB,4

btfsc 20,4

goto s11

goto s10

s11

bsf PORTB,2

goto envio1

s10

bcf PORTB,2

envio1

bsf PORTB,4

nop

nop

bcf PORTB,4

btfsc 20,4

goto s01

goto s00

s01

bsf PORTB,2

Técnicas para el control digital de un amplificador analógico de audio. Ignacio Moreno Flores.

73

goto envio0

s00

bcf PORTB,2

envio0

bsf PORTB,4

nop

nop

end

6.5.4. Programa de “cambio” del dato de salida.

Finalmente se vio que el último problema por el que no conseguíamos hacer funcionar todo el proyecto

fue que el puerto serie del PIC comunica un dato comenzando por el bit más significativo, mientras que el

potenciómetro espera la llegada del volumen precisamente de la forma contraria, esto es, comenzando por

el menos significativo. Por ello, tuve que hacer otro programa que cambia de orden el número

correspondiente al volumen a enviar. El programa, por un método similar al anterior, va comparando cada

bit del registro 20 del PIC con “1” y con “0” y va introduciendo cada bit en el orden inverso en el registro

22.

list p=16f819

include "p16f819.inc"

inicio equ 0x05

org 0x00

goto inicio

org 0x05

banksel 20

movlw b'00001111'

movwf 20

Técnicas para el control digital de un amplificador analógico de audio. Ignacio Moreno Flores.

74

movlw 0x00

movwf 21

cambio

btfsc 20,7

goto s7 ; si bit7 de reg20=1...

bcf 21,0 ; si bit7 de reg20=0 => reg21(0)=0

goto bit6

s7

bsf 21,0 ;...reg21(0)=1

goto bit6

bit6

btfsc 20,6

goto s6 ; si bit6 de reg20=1...

bcf 21,1 ; si bit6 de reg20=0 => reg21(1)=0

goto bit5

s6

bsf 21,1 ;...reg21(1)=1

goto bit5

bit5

btfsc 20,5

goto s5 ; si bit5 de reg20=1...

bcf 21,2 ; si bit5 de reg20=0 => reg21(2)=0

goto bit4

s5

bsf 21,2 ;...reg21(2)=1

goto bit4

bit4

btfsc 20,4

goto s4 ; si bit4 de reg20=1...

bcf 21,3 ; si bit4 de reg20=0 => reg21(3)=0

goto bit3

Técnicas para el control digital de un amplificador analógico de audio. Ignacio Moreno Flores.

75

s4

bsf 21,3 ;...reg21(3)=1

goto bit3

bit3

btfsc 20,3

goto s3 ; si bit3 de reg20=1...

bcf 21,4 ; si bit3 de reg20=0 => reg21(4)=0

goto bit2

s3

bsf 21,4 ;...reg21(4)=1

goto bit2

bit2

btfsc 20,2

goto s2 ; si bit2 de reg20=1...

bcf 21,5 ; si bit2 de reg20=0 => reg21(5)=0

goto bit1

s2

bsf 21,5 ;...reg21(5)=1

goto bit1

bit1

btfsc 20,1

goto s1 ; si bit1 de reg20=1...

bcf 21,6 ; si bit1 de reg20=0 => reg21(6)=0

goto bit0

s1

bsf 21,6 ;...reg21(6)=1

goto bit0

bit0

btfsc 20,0

goto s0 ; si bit0 de reg20=1...

Técnicas para el control digital de un amplificador analógico de audio. Ignacio Moreno Flores.

76

bcf 21,7 ; si bit0 de reg20=0 => reg21(7)=0

goto finish

s0

bsf 21,7 ;...reg21(7)=1

finish

end

6.5.5. Programa de prueba de los pulsadores.

A continuación debía probar que se podían utilizar los pulsadores para introducir las señales pertinenetes

en el PIC. Para ello diseñé un pequeño programa que, al hacer uso de un botón, generara un cambio en

dentro del PIC. Dicho programa es el siguiente:

list p=16f819 include "p16f819.inc" ini equ 0x05 ppal equ 0x10 subir equ 0x20 bajar equ 0x25 org 0x00 goto ini org 0x05 banksel TRISB movlw b'11000010';config PORTB: RB6=pulsador movwf TRISB ;RB0=reset. 1,2,4=puertoserie org 0x10 banksel PORTB bcf PORTB,5 btfsc PORTB,6 ;si pulsamos down => saltamos bsf PORTB,5 goto ppal end

Una vez simulado el programa, pasé a colocar el programa de comunicación con el puerto serie justo

detrás de la comprobación de la pulsación, de forma que pudiera observar con el osciloscopio si se

producían cambios eléctricos al pulsar. La observación que obtuve fue que, a diferencia de lo que ocurre

Técnicas para el control digital de un amplificador analógico de audio. Ignacio Moreno Flores.

77

con el DS1802, no se pueden poner pulsadores conectados directamente al PIC, ya que parece ser

tremendamente sensible al ruido. Efectivamente, sin ni siquiera pulsar aparecen los efectos que aparecen

pulsando. Con el osciloscopio vimos que el ruido introducido por el pulsador actuando como antena es

mínimo, pero al parecer suficiente como para excitar al PIC. Por ello, se decidió conectar todos los

pulsadores en serie con una resistencia de 10 K a tierra. De esta forma el funcionamiento es perfecto.

6.6. Programa principal.

Por ultimo, el programa principal que incluye todo lo anterior es:

list p=16f819 include "p16f819.inc" inicio equ 0x05 org 0x00 goto inicio org 0x05 ; config puerto serie banksel PORTB movlw 0x00 movwf PORTB banksel TRISB movlw b'11101010';config PORTB: RB7=up; RB6=down movwf TRISB ;RB0=reset. 1,2,4=puertoserie banksel SSPSTAT bsf SSPSTAT,6 ;la com se realiza en flanco de subida ; el timer banksel OPTION_REG movlw b'11000001' movwf OPTION_REG ;config timer0 banksel INTCON bcf INTCON,5 ;deshabilita interrup x timer ; volumen inicial banksel 20 movlw 0x20 ;20hex = 32decimal movwf 20 ;llevamos al reg 20 el volumen inicial goto com ppal ;primero pone a 0 el bit del timer (lo resetea) banksel INTCON bcf INTCON,TMR0IF banksel PORTB btfsc PORTB,6 ;si pulsamos down => saltamos goto bajar

Técnicas para el control digital de un amplificador analógico de audio. Ignacio Moreno Flores.

78

btfsc PORTB,7 ;si pulsamos up => saltamos goto subir goto ppal subir ;comprobamos que efectivamente estamos pulsando "up" banksel TMR0 movlw 0x0C movwf TMR0 bucles banksel PORTB btfss PORTB,7 goto ppal btfss INTCON,TMR0IF goto bucles movlw 0x00 ;para poner el volumen a 0 si mute=1 antes de sumar 1 banksel 20 btfsc 20,6 ;si el bit de mute=1 movwf 20 ;pongo volumen=0 ; incrementamos registro de volumen movlw 0x01 addwf 20,1 btfss 20,6 ;si mute=0 despues de la suma ;iniciar comunicacion goto com ;si mute=1 => estamos al maximo del volumen decf 20,1 ;pongo de nuevo volumen=65 goto ppal bajar ;comprobamos que efectivamente estamos pulsando "down" banksel TMR0 movlw 0x0C movwf TMR0 bucleb banksel PORTB btfss PORTB,6 goto ppal btfss INTCON,TMR0IF goto bucleb btfsc 20,6 ;si mute=1 goto ppal ;no baja + el volumen ;si mute=0 => decrementamos registro 20 banksel 20 decfsz 20,1 ;si volumen-1!=0 ;iniciar comunicacion goto com ;si volumen-1=0 => poner mute movlw 0x40 ;mute=40hex movwf 20

Técnicas para el control digital de un amplificador analógico de audio. Ignacio Moreno Flores.

79

goto com com cambio btfsc 20,7 goto s7 ; si bit7 de reg20=1... bcf 21,0 ; si bit7 de reg20=0 => reg21(0)=0 goto bit6 s7 bsf 21,0 ;...reg21(0)=1 goto bit6 bit6 btfsc 20,6 goto s6 ; si bit6 de reg20=1... bcf 21,1 ; si bit6 de reg20=0 => reg21(1)=0 goto bit5 s6 bsf 21,1 ;...reg21(1)=1 goto bit5 bit5 btfsc 20,5 goto s5 ; si bit5 de reg20=1... bcf 21,2 ; si bit5 de reg20=0 => reg21(2)=0 goto bit4 s5 bsf 21,2 ;...reg21(2)=1 goto bit4 bit4 btfsc 20,4 goto s4 ; si bit4 de reg20=1... bcf 21,3 ; si bit4 de reg20=0 => reg21(3)=0 goto bit3 s4 bsf 21,3 ;...reg21(3)=1 goto bit3 bit3 btfsc 20,3 goto s3 ; si bit3 de reg20=1... bcf 21,4 ; si bit3 de reg20=0 => reg21(4)=0 goto bit2 s3 bsf 21,4 ;...reg21(4)=1 goto bit2 bit2

Técnicas para el control digital de un amplificador analógico de audio. Ignacio Moreno Flores.

80

btfsc 20,2 goto s2 ; si bit2 de reg20=1... bcf 21,5 ; si bit2 de reg20=0 => reg21(5)=0 goto bit1 s2 bsf 21,5 ;...reg21(5)=1 goto bit1 bit1 btfsc 20,1 goto s1 ; si bit1 de reg20=1... bcf 21,6 ; si bit1 de reg20=0 => reg21(6)=0 goto bit0 s1 bsf 21,6 ;...reg21(6)=1 goto bit0 bit0 btfsc 20,0 goto s0 ; si bit0 de reg20=1... bcf 21,7 ; si bit0 de reg20=0 => reg21(7)=0 goto comunica s0 bsf 21,7 ;...reg21(7)=1 comunica banksel PORTB ;comunicacion x puerto serie bsf PORTB,0 ;reset=1 banksel SSPCON clrf SSPCON banksel SSPCON ;primer byte bsf SSPCON,5 movf 21,0 movwf SSPBUF ;lleva contenido de reg20 a buffer de puerto serie banksel 22 movlw 8 movwf 22 bucle1 decfsz 22,1 goto bucle1 banksel SSPCON ;segundo byte clrf SSPCON banksel SSPCON bsf SSPCON,5 movf 21,0 movwf SSPBUF ;lleva contenido de reg20 a buffer de puerto serie banksel 22

Técnicas para el control digital de un amplificador analógico de audio. Ignacio Moreno Flores.

81

movlw 8 movwf 22 bucle2 decfsz 22,1 goto bucle2 banksel PORTB bcf PORTB,0 ;reset=0 goto ppal end Tras varias depuraciones y pruebas se comprobó funcionar perfectamente.