Pues esto va sobre ruedas. He montado la placa de pruebas con dos pulsadores, uno para subir y otro para bajar y funciona perfectamente.
He disminuido los retardos porque 1 segundo era demasiado. Ahora estan a 100ms.
La unica pega es que no se queda quieta la medida de la impedancia en el polimetro al medir, sobre todo cuando se superan los 25K...no se a que se debe.
El proximo paso sera colocar un nuevo pulsador para elegir entre los 4 potes. Mañana me pondre a ello.
Dejo el codigo de lo que llevo hecho para quien le pueda servir en un futuro.
Os sigo informando. Un saludo y mil gracias.
;---------------Encabezado-------------
LIST p=16f876
radix hex
INCLUDE <P16F876.INC>
;------------mapa de memoria---------
R_ContB equ 0x23
R_ContA equ 0x24
R_ContC equ 0x25
R_ContE equ 0x26
R_ContD equ 0x27
temp1 equ 0x28
temp2 equ 0x29
temp3 equ 0x30
GR_GA macro
bsf PORTC,0 ; pone un 0 para activar pot graves-ganancia
endm
NO_CHIP macro
bcf 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 PORTA
clrf PORTB
clrf PORTC
bsf STATUS,RP0 ; banco1
movlw 0x06
movwf ADCON1
movlw 0XCF
movwf TRISA
movlw b'00010100'
movwf TRISB ; y pasa el valor a trisb
movlw b'00010000'
movwf TRISC
bcf STATUS,RP0 ; banco 0
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
call Retardo_1s
movlw B'11000000'
movwf temp3
test btfsc PORTB,2
call subup
btfsc PORTB,4
call subdown
goto test
subup GR_GA
call Retardo_100ms
bcf STATUS,RP1 ;no me parecen necesarias estas dos lineas(las bcf, pero dejalas x las dudas)
bcf STATUS,RP0 ; banco 0
clrw
call output
movlw B'10000000' ;cargar W=.128 Supongo que quisiste aca que el pote valga .128....
call output
incf temp3,W ;incrementar en 1 temp3, guardar resultado en W
btfsc STATUS,Z ;la utima operacion dio cero?(overflow en este caso?)
retlw .0 ;SI! retornar con W= 0 (falso)entonces luego cuando sale de la subrutina pudes interceptar esto
;puede ser tambien GOTO ERROR o hacia donde quieras desviar en caso que ya este al maximo el pote
movwf temp3 ;NO! entonces copiar W(que contenia el resultado) en temp3
call output
NO_CHIP
retlw .1 ;todo bien, retornar con W=1(verdadero)
subdown GR_GA
call Retardo_100ms
bcf STATUS,RP1 ;no me parecen necesarias estas dos lineas(las bcf, pero dejalas x las dudas)
bcf STATUS,RP0 ; banco 0
clrw
call output
movlw B'10000000' ;cargar W=.128 Supongo que quisiste aca que el pote valga .128....
call output
movf temp3,F ;mover el contenido de temp3 en si mismo(¿redundante? NO! esto setea el flag Z si el contenido de temp3 es = 0)
btfsc STATUS,Z ;temp3 = 0?
retlw .0 ;SI!.volver con W=0 (falso)
decf temp3,F ;NO!.decrementar en 1 unidad temp3
movf temp3,w ;copiar el contenido de temp3 en W
call output
NO_CHIP
retlw .1 ;todo bien, retornar con W=1(verdadero)
output movwf temp1 ;Salva el byte a transmitir en el registro temporal 'temp1'
movlw 0x08
movwf temp2 ;Inicializa el contador
call Retardo_100ms
bck bsf PORTC,2 ;Sube data
btfss temp1,7 ;Comprueba el bit y lo baja si es cero
bcf PORTC,2
nop ;Envia el bit
bsf PORTC,7
nop ;Da un pulso de reloj
bcf PORTC,7
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
return
fallo clrw
call output
movlw B'10000000' ;cargar W=.128 Supongo que quisiste aca que el pote valga .128....
call output
movf temp3,W
call output
NO_CHIP
return
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ó
;------------------------------------------