POR FIN!! Carlos, al fin he conseguido que el potenciometro se mueva...pero es algo raro...te explico lo que he hecho.
He desarrollado un codigo en el que al accionar un pulsador, manda la secuencia de 16 bits en la que (supuestamente) debe colocar el pote 2 en una determinada posicion.
Sin embargo, al pulsar, se actua sobre el pote 1, y no lo coloca en una posicion, sino que al ir pulsandolo varias veces, va aumentando la resistencia del mismo hasta llegar a los 50K...
Te adjunto el codigo por si ves que es lo que esta pasando.
Un saludo.
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ó
;------------------------------------------