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