
Codigo:
((50000 / 255) * N° de pasos) + 1500
------------------------------------ = GANANCIA
1500
Escrito originalmente por fito20
Lo que me comentas no esta mal, pero no es lo que yo pensaba. Yo no pensaba utilizar pulsadores sino potenciometros normales (de eje) como los de las mesas de mezcla.
El AD5232 se comunica via serie (interfaz SPI), por lo que se comunicaria con el micro para que este ultimo le configurase un valor de R o para leer el estado actual, por lo que no haria falta pulsador ninguno.
Mi idea de conexion era esta:
Input (Micro/Guit) -> Previo -> EQ -> Mezclador -> Etapa de salida
El mezclador y la etapa de salida son comunes a todas las entradas de la mesa de mezclas.
Todos los potenciometros "fisicos" son, por ejemplo, de eje y de 10K. Se conectan los extremos del pot a +5V y tierra, y del terminal variable obtenemos una tension entre 0 y 5V. Esta tensión se convierte a digital en el micro y el valor digital se programa via SPI en el AD5232 correspondiente.
Como hay muchos mas potenciometros que entradas AD en el micro debes utilizar multiplexores analógicos controlados digitalmente por el micro.
Para seleccionar los diferentes AD5232 debes utilizar sus entradas "chip select" (CS) y decodificadores. Lo mismo que se hace en las placas microprocesadoras con la memoria o perifericos externos, como es el caso.
Escrito originalmente por fito20
1) Que valor llevan C3 C4 y C5?
2) Esta bien cargado el 0 en el contador?
3) No me he atrevido a meterle mano a la seleccion del POTE graves porque no se todavia como seleccionar entre uno y otro...decodificador?
4) Tambien me he saltado la lectura de la posicion del POTE Grave porque necesito que me deis breves apuntes sobre SPI.
5) De donde puedo sacar las entradas que hay que darles al LCD para mostrar las letras que quiera?
Un saludo! Fito.
Codigo:
;---------------Encabezado--------------------------------------------------------------------------
LIST P = 16F876
INCLUDE <P16F876.INC>
;------------Configuración de bits------------------------------------------------------------------
__CONFIG _CP_OFF&_DEBUG_OFF&_WRT_ENABLE_ON&_CPD_OFF&_LVP_OFF&_BODEN_ON&_PWRTE_ON&_WDT_OFF&_XT_OSC
;------------Configuración de pines-----------------------------------------------------------------
#DEFINE CAMBIO PORTB,0 ; direccion del pulsador CAMBIO
#DEFINE UP PORTB,1 ; direccion del pulsador UP
#DEFINE DOWN PORTB,2 ; direccion del pulsador DOWN
#DEFINE MEM1 PORTB,3 ; direccion del pulsador MEM1
#DEFINE MEM2 PORTB,4 ; direccion del pulsador MEM2
#DEFINE MEM3 PORTB,5 ; direccion del pulsador MEM3
#DEFINE MEM4 PORTB,6 ; direccion del pulsador MEM4
#DEFINE MEM5 PORTB,7 ; direccion del pulsador MEM5
#DEFINE CS1 PORTC,0 ; direccion del pin de seleccion del CHIP 1
#DEFINE CS2 PORTC,1 ; direccion del pin de seleccion del CHIP 2
#DEFINE SCK PORTC,3 ; pin del CLOCK para la comunicacion SPI
#DEFINE SDI PORTC,4 ; pin de entrada de datos para la comunicacion SPI
#DEFINE SDO PORTC,5 ; pin de salida de datos para la comunicacion SPI
;------------Definicion de memoria RAM--------------------------------------------------------------
POT_GANANCIA EQU .32
POT_GRAVES EQU .33
;------------Definicion de macros-------------------------------------------------------------------
GR_GA macro
bcf PORTC,0 ; pone un 0 para activar pot graves-ganancia
bsf PORTC,1 ; pone un 1 para desactivar pot medios-altos
endm
ME_AL macro
bsf PORTC,0 ; pone un 1 para desactivar pot graves-ganancia
bcf PORTC,1 ; pone un 0 para activar pot medios-altos
endm
NO_CHIP macro
bsf PORTC,0 ; pone un 1 para desactivar pot graves-ganancia
bsf PORTC,1 ; pone un 1 para desactivar pot medios-altos
endm
;---------------------------------------------------------------------------------------------------
ORG .0 ; vector de RESET
goto INICIO ;
ORG .4 ; vector de INTERRUPCION
goto INICIO ;
;---------------------------------------------------------------------------------------------------
OUTPUT movwf SSPBUF ; Coloca el dato de W en wl bufer
RET bsf STATUS,RP0 ; selecciona el banco 1
btfss SSPSTAT,BF ; verifica si la recepcion termino
goto RET ; si no a terminado regresa a RET
bcf STATUS,RP0 ; selecciona el banco 0
movf SSPBUF,W ; coloca el dato recibido en W
return ; retorna de la sub-rutina
;---------------------------------------------------------------------------------------------------
;SENSADO DE PULSADORES
TEST btfsc CAMBIO ; Si alguien presiona interruptor 1 CAMBIO
call SUB_CAMBIO ; voy a etiqueta cambio
btfsc UP ; si alguien presiona interruptor 2 UP
call SUB_UP ; voy a etiqueta up
btfsc DOWN ; si alguien presiona interruptor 3 DOWN
call SUB_DOWN ; voy a etiqueta down
btfsc MEM1 ; si alguien presiona interruptor 4 MEM1
call SUB_MEM1 ; voy a etiqueta mem1
btfsc MEM2 ; si alguien presiona interruptor 5 MEM2
call SUB_MEM2 ; voy a etiqueta mem2
btfsc MEM3 ; si alguien presiona interruptor 6 MEM3
call SUB_MEM3 ; voy a estiqueta mem3
btfsc MEM4 ; si alguien presiona interruptor 7 MEM4
call SUB_MEM4 ; voy a estiqueta mem4
btfsc MEM5 ; si alguien presiona interruptor 8 MEM5
call SUB_MEM5 ; voy a estiqueta mem5
return
;---------------------------------------------------------------------------------------------------
INICIO clrf PORTB ; limpio el puerto B
bsf STATUS,RP0 ; pongo rp0 a 1 y paso al banco1
bcf STATUS,RP1
movlw b"11100000" ; cargo W con 00000 salidas
movwf TRISA ; y paso el valor a trisa puerto A display
movlw b"11111111" ; cargo W con 11111111 entradas
movwf TRISB ; y paso el valor a trisb puerto B interruptores
movlw b"00010000" ; cargo W con 00010000
movwf TRISC ; y paso el valor a trisc puerto C solo entrada SPI data in
movlw B"10000000" ;
movwf SSPSTAT ; cargo el reguistro SSPSTAT con el valor anterior
bcf STATUS,RP0 ; pongo rp0 a 0 y regreso al banco0
NO_CHIP ; llama a la macro de deshabilitar los 4 potes.
movlw b"00110010" ; no collision, no overflow, habilito el puerto SPI, clock inactivo en nivel alto, FOSC/64
movwf SSPCON ; pasamos estos valores a control SPI
; LEER POSICION POT GANANCIA
GR_GA ; llama a la macro de habilitar el pote. de graves-ganancia
movlw B"10010000" ; coloca el byte para leer memoria EEMEM RDAC1 graves
call OUTPUT ; transmite el byte anterior
movlw B"00000000" ; coloca 8 bits 0 para generar el clock
call OUTPUT ; transmite el byte anterior
movwf POT_GANANCIA ; el dato de W lo pasa a la memoria POT_GANANCIA
; LEER POSICION POT GRAVES
movlw B"10010001" ; coloca el byte para leer memoria EEMEM RDAC2 graves
call OUTPUT ; transmite el byte anterior
movlw B"00000000" ; coloca 8 bits 0 para generar el clock
call OUTPUT ; transmite el byte anterior
movwf POT_GRAVES ; el dato de W lo pasa a la memoria POT_GRAVES
NO_CHIP ; llama a la macro de deshabilitar los 4 potes.
goto $
;---------------------------------------------------------------------------------------------------
END
Codigo:
;---------------Encabezado-------------
LIST P = 16F876
INCLUDE <P16F876.INC>
;------------Configuración de bits------------------------------------------------------------------
__CONFIG _CP_OFF&_DEBUG_OFF&_WRT_ENABLE_ON&_CPD_OFF&_LVP_OFF&_BODEN_ON&_PWRTE_ON&_WDT_OFF&_XT_OSC
;------------mapa de memoria---------
status equ 0x03 ; Aquí le asignamos nombres a los
trisa equ 0x05 ; registros indicando
porta equ 0x05
trisb equ 0x06 ; la posición
portb equ 0x06
trisc equ 0x07
portc equ 0x07 ; en la que se encuentran
temp1 equ 0x20 ; temporal 1
temp2 equ 0x21 ; temporal 2
gananc equ 0x22 ; posicion GAIN
graves equ 0x23 ; posicion GRAVES
medios equ 0x24 ; posicion MEDIOS
altos equ 0x25 ; posicion ALTOS
mem1gr equ 0x28 ; Preset mem1 graves
mem1me equ 0x29 ; Preset mem1 medios
mem1al equ 0x30 ; Preset mem1 altos
mem2gr equ 0x31 ; Preset mem2 graves
mem2me equ 0x32 ; Preset mem2 medios
mem2al equ 0x33 ; Preset mem2 altos
mem3gr equ 0x34 ; Preset mem3 graves
mem3me equ 0x35 ; Preset mem3 medios
mem3al equ 0x36 ; Preset mem3 altos
mem4gr equ 0x37 ; Preset mem4 graves
mem4me equ 0x38 ; Preset mem4 medios
mem4al equ 0x39 ; Preset mem4 altos
mem5gr equ 0x40 ; Preset mem5 graves
mem5me equ 0x41 ; Preset mem5 medios
mem5al equ 0x42 ; Preset mem5 altos
cont equ 0x20 ; defino contador
sspcon equ 0x14 ; control SPI
sspstat equ 0x94 ; estado SPI
sspbuf equ 0x13 ; buffer SPI
;------------Configuración de pines-----------------------------------------------------------------
#DEFINE CAMBIO PORTB,0 ; direccion del pulsador CAMBIO
#DEFINE UP PORTB,1 ; direccion del pulsador UP
#DEFINE DOWN PORTB,2 ; direccion del pulsador DOWN
#DEFINE MEM1 PORTB,3 ; direccion del pulsador MEM1
#DEFINE MEM2 PORTB,4 ; direccion del pulsador MEM2
#DEFINE MEM3 PORTB,5 ; direccion del pulsador MEM3
#DEFINE MEM4 PORTB,6 ; direccion del pulsador MEM4
#DEFINE MEM5 PORTB,7 ; direccion del pulsador MEM5
#DEFINE CS1 PORTC,0 ; direccion del pin de seleccion del CHIP 1
#DEFINE CS2 PORTC,1 ; direccion del pin de seleccion del CHIP 2
#DEFINE SCK PORTC,3 ; pin del CLOCK para la comunicacion SPI
#DEFINE SDI PORTC,4 ; pin de entrada de datos para la comunicacion SPI
#DEFINE SDO PORTC,5 ; pin de salida de datos para la comunicacion SPI
;------------Definicion de memoria RAM--------------------------------------------------------------
POT_GANANCIA EQU .32
POT_GRAVES EQU .33
POT_MEDIOS EQU .34
POT_ALTOS EQU .35
;------------Definicion de macros-------------------------------------------------------------------
GR_GA macro
bcf PORTC,0 ; pone un 0 para activar pot graves-ganancia
bsf PORTC,1 ; pone un 1 para desactivar pot medios-altos
endm
ME_AL macro
bsf PORTC,0 ; pone un 1 para desactivar pot graves-ganancia
bcf PORTC,1 ; pone un 0 para activar pot medios-altos
endm
NO_CHIP macro
bsf PORTC,0 ; pone un 1 para desactivar pot graves-ganancia
bsf PORTC,1 ; pone un 1 para desactivar pot medios-altos
endm
;---------------------------------------------------------------------------------------------------
ORG .0 ; vector de RESET
goto INICIO ;
ORG .4 ; vector de INTERRUPCION
goto INICIO ;
;---------------------------------------------------------------------------------------------------
OUTPUT movwf SSPBUF ; Coloca el dato de W en wl bufer
RET bsf STATUS,RP0 ; selecciona el banco 1
btfss SSPSTAT,BF ; verifica si la recepcion termino
goto RET ; si no a terminado regresa a RET
bcf STATUS,RP0 ; selecciona el banco 0
movf SSPBUF,W ; coloca el dato recibido en W
return ; retorna de la sub-rutina
;---------------------------------------------------------------------------------------------------
;SENSADO DE PULSADORES
TEST btfsc CAMBIO ; Si alguien presiona interruptor 1 CAMBIO
call SUB_CAMBIO ; voy a etiqueta cambio
btfsc UP ; si alguien presiona interruptor 2 UP
call SUB_UP ; voy a etiqueta up
btfsc DOWN ; si alguien presiona interruptor 3 DOWN
call SUB_DOWN ; voy a etiqueta down
btfsc MEM1 ; si alguien presiona interruptor 4 MEM1
call SUB_MEM1 ; voy a etiqueta mem1
btfsc MEM2 ; si alguien presiona interruptor 5 MEM2
call SUB_MEM2 ; voy a etiqueta mem2
btfsc MEM3 ; si alguien presiona interruptor 6 MEM3
call SUB_MEM3 ; voy a estiqueta mem3
btfsc MEM4 ; si alguien presiona interruptor 7 MEM4
call SUB_MEM4 ; voy a estiqueta mem4
btfsc MEM5 ; si alguien presiona interruptor 8 MEM5
call SUB_MEM5 ; voy a estiqueta mem5
return
;---------------------------------------------------------------------------------------------------
;CAMBIO DE POTENCIOMETROS
SUB_CAMBIO btfsc cont,1 ; comprobamos el 2ºbit del contador, si es 0 salta 1 instruccion
goto MEDALT
btfsc cont,0 ; comprobamos el 1º bit del contador, si es 0 salta 1 instruccion
goto GRAVES
goto GAIN ; el valor del contador es 0, GAIN.
GRAVES GR_GA
movlw B"10010001" ; coloca el byte para leer memoria EEMEM RDAC2 graves
call OUTPUT ; transmite el byte anterior
movlw B"00000000" ; coloca 8 bits 0 para generar el clock
call OUTPUT ; transmite el byte anterior
movwf POT_GRAVES ; el dato de W lo pasa a la memoria POT_GRAVES
NO_CHIP
MOSTRAR POSICION POT GRAVES EN LCD
movlw B"00000010" ; ponemos un 1 en el contador
movwf cont
goto TEST
MEDALT btfsc cont,0 ; comprobamos el 1º bit del contador, si es 0 salta 1 instruccion
goto ALTOS
goto MEDIOS
MEDIOS ME_AL
movlw B"10010000" ; coloca el byte para leer memoria EEMEM RDAC1 medios
call OUTPUT ; transmite el byte anterior
movlw B"00000000" ; coloca 8 bits 0 para generar el clock
call OUTPUT ; transmite el byte anterior
movwf POT_MEDIOS ; el dato de W lo pasa a la memoria POT_MEDIOS
NO_CHIP
MOSTRAR POSICION POT MEDIOS EN LCD
movlw B"00000011" ; ponemos un 1 en el contador
movwf cont
goto TEST
ALTOS ME_AL
movlw B"10010001" ; coloca el byte para leer memoria EEMEM RDAC2 altos
call OUTPUT ; transmite el byte anterior
movlw B"00000000" ; coloca 8 bits 0 para generar el clock
call OUTPUT ; transmite el byte anterior
movwf POT_ALTOS ; el dato de W lo pasa a la memoria POT_ALTOS
NO_CHIP
MOSTRAR POSICION POT ALTOS EN LCD
movlw B"00000000" ; ponemos un 1 en el contador
movwf cont
goto TEST
;---------------------------------------------------------------------------------------------------
;SUBIR UNA POSICION EN EL POTENCIOMETRO
SUB_UP btfsc cont,1 ; comprobamos el 2ºbit del contador, si es 0 salta 1 instruccion
goto MEDALTUP
btfsc cont,0 ; comprobamos el 1º bit del contador, si es 0 salta 1 instruccion
goto GRAVESUP
goto GAINUP ; el valor del contador es 0, GAIN.
GAINUP GR_GA
movlw B"11100000" ; coloca el byte para subir en una posicion el valor de RDAC1
call OUTPUT ; transmite el byte anterior
movlw B"00000000" ; coloca 8 bits 0 para generar el clock
call OUTPUT ; transmite el byte anterior
movwf POT_GANANCIA ; el dato de W lo pasa a la memoria POT_GANANCIA
NO_CHIP
MOSTRAR POSICION POT GANANCIA EN LCD
goto TEST
GRAVESUP GR_GA
movlw B"11100001" ; coloca el byte para subir en una posicion el valor de RDAC2
call OUTPUT ; transmite el byte anterior
movlw B"00000000" ; coloca 8 bits 0 para generar el clock
call OUTPUT ; transmite el byte anterior
movwf POT_GRAVES ; el dato de W lo pasa a la memoria POT_GRAVES
NO_CHIP
MOSTRAR POSICION POT GRAVES EN LCD
goto TEST
MEDALTUP btfsc cont,0 ; comprobamos el 1º bit del contador, si es 0 salta 1 instruccion
goto ALTOSUP
goto MEDIOSUP
MEDIOSUP ME_AL
movlw B"11100000" ; coloca el byte para subir en una posicion el valor de RDAC1
call OUTPUT ; transmite el byte anterior
movlw B"00000000" ; coloca 8 bits 0 para generar el clock
call OUTPUT ; transmite el byte anterior
movwf POT_MEDIOS ; el dato de W lo pasa a la memoria POT_MEDIOS
NO_CHIP
MOSTRAR POSICION POT MEDIOS EN LCD
goto TEST
ALTOSUP ME_AL
movlw B"11100001" ; coloca el byte para subir en una posicion el valor de RDAC2
call OUTPUT ; transmite el byte anterior
movlw B"00000000" ; coloca 8 bits 0 para generar el clock
call OUTPUT ; transmite el byte anterior
movwf POT_ALTOS ; el dato de W lo pasa a la memoria POT_ALTOS
NO_CHIP
MOSTRAR POSICION POT ALTOS EN LCD
goto TEST
;---------------------------------------------------------------------------------------------------
;BAJAR UNA POSICION EN EL POTENCIOMETRO
SUB_DOWN btfsc cont,1 ; comprobamos el 2ºbit del contador, si es 0 salta 1 instruccion
goto MEDALTDW
btfsc cont,0 ; comprobamos el 1º bit del contador, si es 0 salta 1 instruccion
goto GRAVESDW
goto GAINDW ; el valor del contador es 0, GAIN.
GAINDW GR_GA
movlw B"01100000" ; coloca el byte para bajar en una posicion el valor de RDAC1
call OUTPUT ; transmite el byte anterior
movlw B"00000000" ; coloca 8 bits 0 para generar el clock
call OUTPUT ; transmite el byte anterior
movwf POT_GANANCIA ; el dato de W lo pasa a la memoria POT_GANANCIA
NO_CHIP
MOSTRAR POSICION POT GANANCIA EN LCD
goto TEST
GRAVESDW GR_GA
movlw B"01100001" ; coloca el byte para bajar en una posicion el valor de RDAC2
call OUTPUT ; transmite el byte anterior
movlw B"00000000" ; coloca 8 bits 0 para generar el clock
call OUTPUT ; transmite el byte anterior
movwf POT_GRAVES ; el dato de W lo pasa a la memoria POT_GRAVES
NO_CHIP
MOSTRAR POSICION POT GRAVES EN LCD
goto TEST
MEDALTDW btfsc cont,0 ; comprobamos el 1º bit del contador, si es 0 salta 1 instruccion
goto ALTOSDW
goto MEDIOSDW
MEDIOSDW ME_AL
movlw B"01100000" ; coloca el byte para bajar en una posicion el valor de RDAC1
call OUTPUT ; transmite el byte anterior
movlw B"00000000" ; coloca 8 bits 0 para generar el clock
call OUTPUT ; transmite el byte anterior
movwf POT_MEDIOS ; el dato de W lo pasa a la memoria POT_MEDIOS
NO_CHIP
MOSTRAR POSICION POT MEDIOS EN LCD
goto TEST
ALTOSDW ME_AL
movlw B"01100001" ; coloca el byte para bajar en una posicion el valor de RDAC2
call OUTPUT ; transmite el byte anterior
movlw B"00000000" ; coloca 8 bits 0 para generar el clock
call OUTPUT ; transmite el byte anterior
movwf POT_ALTOS ; el dato de W lo pasa a la memoria POT_ALTOS
NO_CHIP
MOSTRAR POSICION POT ALTOS EN LCD
goto TEST
;---------------------------------------------------------------------------------------------------
;ALMACENAR O CARGAR PRESET EN MEM1
SUB_MEM1 call retardo2s ; esperamos 2 segundos y volvemos a comprobar
btfsc port,3 ; vuelve a comprobar el Interruptor de mem1
goto almprst ; el boton ha estado presionado durante 2 segundos y se almacena el preset
; en caso que se suelte, se carga el preset anteriormente guardado
GR_GA
movlw B"10110000" ; cargar lo que envio por serie a RDAC1
call OUTPUT ; transmite el byte anterior
movlw POT_GAEEPROM ; coloca el valor del GAIN almacenado
call OUTPUT ; transmite el byte anterior
movlw B"10110001" ; cargar lo que envio por serie a RDAC2
call OUTPUT ; transmite el byte anterior
movlw POT_GREEPROM ; coloca el valor del GRAVES almacenado
call OUTPUT ; transmite el byte anterior
ME_AL
movlw B"10110000" ; cargar lo que envio por serie a RDAC1
call OUTPUT ; transmite el byte anterior
movlw POT_MEEEPROM ; coloca el valor del MEDIOS almacenado
call OUTPUT
movlw B"10110001" ; cargar lo que envio por serie a RDAC2
call OUTPUT ; transmite el byte anterior
movlw POT_ALEEPROM ; coloca el valor del ALTOS almacenado
call OUTPUT
goto GAIN
;---------------------------------------------------------------------------------------------------
INICIO clrf PORTB ; limpio el puerto B
bsf STATUS,RP0 ; pongo rp0 a 1 y paso al banco1
bcf STATUS,RP1
movlw B"11100000" ; cargo W con 00000 salidas
movwf TRISA ; y paso el valor a trisa puerto A display
movlw B"11111111" ; cargo W con 11111111 entradas
movwf TRISB ; y paso el valor a trisb puerto B interruptores
movlw B"00010000" ; cargo W con 00010000
movwf TRISC ; y paso el valor a trisc puerto C solo entrada SPI data in
movlw B"10000000" ;
movwf SSPSTAT ; cargo el reguistro SSPSTAT con el valor anterior
bcf STATUS,RP0 ; pongo rp0 a 0 y regreso al banco0
NO_CHIP ; llama a la macro de deshabilitar los 4 potes.
movlw B"00110010" ; no collision, no overflow, habilito el puerto SPI, clock inactivo en nivel alto, FOSC/64
movwf SSPCON ; pasamos estos valores a control SPI
; LEER POSICION POT GANANCIA
GAIN GR_GA ; llama a la macro de habilitar el pote. de graves-ganancia
movlw B"10010000" ; coloca el byte para leer memoria EEMEM RDAC1 gain
call OUTPUT ; transmite el byte anterior
movlw B"00000000" ; coloca 8 bits 0 para generar el clock
call OUTPUT ; transmite el byte anterior
movwf POT_GANANCIA ; el dato de W lo pasa a la memoria POT_GANANCIA
NO_CHIP
MOSTRAR POSICION POT GANANCIA EN LCD
movlw B"00000001" ; ponemos un 1 en el contador
movwf cont
goto TEST
goto $
;---------------------------------------------------------------------------------------------------
END
Escrito originalmente por fito20Codigo:
status equ 0x03 ; Aquí le asignamos nombres a los
trisa equ 0x05 ; registros indicando
porta equ 0x05
trisb equ 0x06 ; la posición
portb equ 0x06
trisc equ 0x07
portc equ 0x07 ; en la que se encuentran


Codigo:
reset org 0x00 ; origen del programa, aquí comenzará siempre que ocurra un reset
goto inicio ; salta a "inicio"
inicio bcf STATUS,5
bcf STATUS,6
clrf POT_GANANCIA
clrf PORTA
clrf PORTB
clrf PORTC
bsf STATUS,5 ; banco1
movlw 0x06
movwf ADCON1
movlw 0XCF
movwf TRISA
movlw b"11111111" ;
movwf TRISB ; y pasa el valor a trisb
movlw b"00001000"
movwf TRISC
bcf STATUS,5 ; banco 0
bsf PORTC,1
bsf PORTC,6
call Retardo_100ms
bcf PORTC,2
call Retardo_100ms
bsf PORTC,2
Retardo_100ms movlw d"100" ; Aporta 1 ciclo máquina. Este es el valor de "M".
goto Retardos_ms ; Aporta 2 ciclos máquina.
Retardos_ms movwf R_ContB ; Aporta 1 ciclo máquina.
R1ms_BucleExterno movlw d"249" ; Aporta Mx1 ciclos máquina. Este es el valor de "K".
movwf R_ContA ; Aporta Mx1 ciclos máquina.
R1ms_BucleInterno nop ; Aporta KxMx1 ciclos máquina.
decfsz R_ContA ; (K-1)xMx1 cm (cuando no salta) + Mx2 cm (al saltar).
goto R1ms_BucleInterno ; Aporta (K-1)xMx2 ciclos máquina.
decfsz R_ContB ; (M-1)x1 cm (cuando no salta) + 2 cm (al saltar).
goto R1ms_BucleExterno ; Aporta (M-1)x2 ciclos máquina.
return ; El salto del retorno aporta 2 ciclos máquina
;------------------------------------------
end ; se acabó
;------------------------------------------
Codigo:
;---------------Encabezado-------------
LIST p=16f876
radix hex
INCLUDE <P16F876.INC>
;------------mapa de memoria---------
reg1 equ 0x20 ; Estos 3 registros los utilizaré
reg2 equ 0x21 ; para hacer el retardo
reg3 equ 0x22
R_ContB equ 0x23
R_ContA equ 0x24
R_ContC equ 0x25
R_ContE equ 0x28
R_ContD equ 0x29
temp1 equ 0x26
temp2 equ 0x27
#DEFINE UP PORTB,1 ; direccion del pulsador UP
#DEFINE DOWN PORTB,2 ; direccion del pulsador DOWN
#DEFINE MIDS PORTB,3
#DEFINE CS1 PORTC,0 ; direccion del pin de seleccion del CHIP 1
#DEFINE PR PORTC,2 ; pin del PRESET para poner los potes a midscale
#DEFINE SHDN PORTC,6
POT_GANANCIA EQU .32
GR_GA macro
bcf PORTC,0 ; pone un 0 para activar pot graves-ganancia
endm
NO_CHIP macro
bsf PORTC,0 ; pone un 1 para desactivar pot graves-ganancia
endm
;-------Configuración de puertos-------
reset org 0x00 ; origen del programa, aquí comenzará siempre que ocurra un reset
goto inicio ; salta a "inicio"
inicio bcf STATUS,RP0
bcf STATUS,RP1
clrf POT_GANANCIA
clrf PORTA
clrf PORTB
clrf PORTC
bsf STATUS,RP0 ; banco1
movlw 0x06
movwf ADCON1
movlw 0XCF
movwf TRISA
movlw b"11111111"
movwf TRISB ; y pasa el valor a trisb
movlw b"00010000"
movwf TRISC
movlw B"10000000"
movwf SSPSTAT ; cargo el reguistro SSPSTAT con el valor anterior
bcf STATUS,RP0 ; banco 0
movlw B"00110010" ; no collision, no overflow, habilito el puerto SPI, clock inactivo en nivel alto, FOSC/64
movwf SSPCON ; pasamos estos valores a control SPI
call Retardo_1s
NO_CHIP ; llama a la macro de deshabilitar los 4 potes.
call Retardo_1s
bsf PORTC,1 ; ponemos un 1 en LED para encenderlo y ver que funciona el circuito
; bsf PORTC,6 ; ponemos un 1 en SHUTDOWN
; bsf PORTC,2 ; ponemos un 1 en PRESET
call Retardo_1s
test btfsc PORTB,2
call subdown
goto test
subdown GR_GA
bsf PORTC,6
bsf PORTC,2
call Retardo_1s
bsf PORTC,7
bcf STATUS,RP1
bcf STATUS,RP0 ; banco 0
movlw B"00000001" ; apunta a la direccion RDAC2
call spien
movlw B"0001111" ; coloca el pote en la posicion 3
call spien
NO_CHIP
call Retardo_1s
bcf PORTC,7
return
output movwf SSPBUF
bsf STATUS,RP0 ; banco 1
ret btfss SSPSTAT,BF
goto ret
bcf STATUS,RP0 ; banco 0
movf SSPBUF,W
return
;Envia el byte que viene en el registro "w" mediaante el protocolo spi.
spien call Retardo_100ms
movwf temp1 ;Salva el byte a transmitir en el registro temporal "temp1"
movlw 0x08
movwf temp2 ;Inicializa el contador
bck bsf PORTC,5 ;Sube data
btfss temp1,7 ;Comprueba el bit y lo baja si es cero
bcf PORTC,5
nop ;Envia el bit
bsf PORTC,3
nop ;Da un pulso de reloj
bcf PORTC,3
nop
rlf temp1,f ;Rotamos a la izquierda "temp1"
decfsz temp2,f ;Comprobamos el contador, para ver si hemos enviado los 8 bits
goto bck ;Si no, repetimos el bucle
bcf PORTC,5
return ;Fin
Retardo_1s ; La llamada "call" aporta 2 ciclos máquina.
movlw d"10" ; Aporta 1 ciclo máquina. Este es el valor de "N".
goto Retardo_1Decima ; Aporta 2 ciclos máquina.
Retardo_1Decima
movwf R_ContC ; Aporta 1 ciclo máquina.
R1Decima_BucleExterno2
movlw d"100" ; Aporta Nx1 ciclos máquina. Este es el valor de "M".
movwf R_ContB ; Aporta Nx1 ciclos máquina.
R1Decima_BucleExterno
movlw d"249" ; Aporta MxNx1 ciclos máquina. Este es el valor de "K".
movwf R_ContA ; Aporta MxNx1 ciclos máquina.
R1Decima_BucleInterno
nop ; Aporta KxMxNx1 ciclos máquina.
decfsz R_ContA,F ; (K-1)xMxNx1 cm (si no salta) + MxNx2 cm (al saltar).
goto R1Decima_BucleInterno ; Aporta (K-1)xMxNx2 ciclos máquina.
decfsz R_ContB,F ; (M-1)xNx1 cm (cuando no salta) + Nx2 cm (al saltar).
goto R1Decima_BucleExterno ; Aporta (M-1)xNx2 ciclos máquina.
decfsz R_ContC,F ; (N-1)x1 cm (cuando no salta) + 2 cm (al saltar).
goto R1Decima_BucleExterno2 ; Aporta (N-1)x2 ciclos máquina.
return ; El salto del retorno aporta 2 ciclos máquina.
Retardo_100ms ; La llamada "call" aporta 2 ciclos máquina.
movlw d"100" ; Aporta 1 ciclo máquina. Este es el valor de "M".
goto Retardos_ms ; Aporta 2 ciclos máquina.
Retardos_ms
movwf R_ContD ; Aporta 1 ciclo máquina.
R1ms_BucleExterno
movlw d"249" ; Aporta Mx1 ciclos máquina. Este es el valor de "K".
movwf R_ContE ; Aporta Mx1 ciclos máquina.
R1ms_BucleInterno
nop ; Aporta KxMx1 ciclos máquina.
decfsz R_ContE ; (K-1)xMx1 cm (cuando no salta) + Mx2 cm (al saltar).
goto R1ms_BucleInterno ; Aporta (K-1)xMx2 ciclos máquina.
decfsz R_ContD ; (M-1)x1 cm (cuando no salta) + 2 cm (al saltar).
goto R1ms_BucleExterno ; Aporta (M-1)x2 ciclos máquina.
return ; El salto del retorno aporta 2 ciclos máquina
;------------------------------------------
end ; se acabó
;------------------------------------------