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:
.
.
.
.
bsf PORTC,2
bucle goto bucle

Codigo:
...
test btfsc PORTB,2
call subir
goto test
subir GR_GA ; activa el chipselect del pote
bcf STATUS,6
bcf STATUS,5 ; banco 0
movlw B"00000000" ; apunto a RDAC1, el primero de los 4 potes que tiene el integrado
call output ; paso el registro al pote por SPI
movlw B"00000011" ; elijo la posicion 3 para el pote
call output ; paso el registro al pote por SPI
NO_CHIP ; quito el chip select
return
output movwf SSPBUF
ret bsf STATUS,5 ; banco 1
btfss SSPSTAT,BF
goto ret
bcf STATUS,5 ; banco 0
movf SSPBUF,W
return
...
Escrito originalmente por Modulay
Tal y como lo has implementado,el micro termina el programa cuando se encuentra con "end".
Lo normal es que nunca se llegue a un "fin de ejecución",sino que el micro esté metido en un bucle conitnuo de forma indefinida para que no llegue a pararse por completo.
Puedes probar a dejar al micro metido en un pequeño bucle tras la ultima instrucción de tu programa principal "bsf PORTC,2" haciendo por ejemplo algo asi:Codigo:
.
.
.
.
bsf PORTC,2
bucle goto bucle
Escrito originalmente por fito20
Se me olvidaba comentar que el potenciometro digital tiene un registro de 11 bits, yo le mando 16 bits, de los cuales los 5 primeros le pongo 0, aunque da igual si fueran 1...
Escrito originalmente por fito20
Hola maunix, la verdad es que nunca he utilizado la comunicacion SPI y es algo nuevo para mi.
Lo que hago es testear el pin 2 del puerto B, y cuando es pulsado, comienza la rutina de envio de datos hacia el pote. He colocado un led para ver que hasta ese punto funciona, pero midiendo con el polimetro, en el pin SDI no se observa transferencia de datos.
Por si me puedes echar una mano con este tema, te pongo la direccion del datasheet:
http://www.analog.com/UploadedFiles/Data_Sheets/140808745AD5204_6_0.pdf
Os agradeceria cualquier comentario porque estoy un poco perdido en el tema. Muchas gracias de nuevo.
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
#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 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
#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,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
NO_CHIP
bsf PORTC,1
bsf PORTC,6
bsf PORTC,2
test btfsc PORTB,2
call subdown
goto test
subdown GR_GA
bsf PORTC,7
bcf STATUS,6
bcf STATUS,5
movlw B"00000000" ; apunta a la direccion RDAC1
call output
movlw B"00000011" ; coloca el pote en la posicion 3
call output
NO_CHIP
return
output movwf SSPBUF
ret bsf STATUS,5 ; banco 1
btfss SSPSTAT,BF
goto ret
bcf STATUS,5 ; banco 0
movf SSPBUF,W
return
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:
bsf STATUS,RP0
movlw b"01000000" ;CKE=1
movwf SSPSTAT
bcf STATUS,RP0
movlw b"00100010"
movwf SSPCON
Escrito originalmente por fito20
1) Si usas el include para el 16F876 para que defines los pines SCK y restantes? Eso solo lo debieras hacer si hicieras el SPI por software
Pero segun tengo planteado el codigo, la comunicacion SPI la estoy haciendo via software no?
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
#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,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"00010000"
movwf TRISC
movlw B"10000000" ;
movwf SSPSTAT ; cargo el reguistro SSPSTAT con el valor anterior
bcf STATUS,RP0 ; banco 0
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
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 para midscale
test btfsc PORTB,2
call subdown
goto test
subdown GR_GA
bsf PORTC,7
bcf STATUS,6
bcf STATUS,5 ; banco 0
movlw B"00000000" ; apunta a la direccion RDAC1
call output
movlw B"00000011" ; coloca el pote en la posicion 3
call output
NO_CHIP
return
output movwf SSPBUF
ret bsf STATUS,5 ; banco 1
btfss SSPSTAT,BF
goto ret
bcf STATUS,5 ; banco 0
movf SSPBUF,W
return
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:
output: movwf SSPBUF
bsf STATUS,RB0 ; banco 1
ret: btfss SSPSTAT,BF
goto ret
bcf STATUS,RB0 ; banco 0
movf SSPBUF,W
return
Codigo:
bsf STATUS,RP0
movlw B"10000000"
movwf SSPSTAT
bcf STATUS,RP0
movlw B"00110010"
movwf SSPCON
Codigo:
bsf STATUS,RP0
movlw B"11000000"
movwf SSPSTAT
bcf STATUS,RP0
movlw B"00110010"
movwf SSPCON
Codigo:
bsf STATUS,RP0
movlw B"10000000"
movwf SSPSTAT
bcf STATUS,RP0
movlw B"00100010"
movwf SSPCON
Codigo:
bsf STATUS,RP0
movlw B"11000000"
movwf SSPSTAT
bcf STATUS,RP0
movlw B"00100010"
movwf SSPCON
Escrito originalmente por fito20
Muchas gracias Mauricio por la paciencia que estas teniendo conmigo. Mañana mismo lo pruebo todo y te comento. Un abrazo.
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
#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
call retardo
NO_CHIP ; llama a la macro de deshabilitar los 4 potes.
call retardo
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
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 para midscale
call retardo
test btfsc PORTB,2
call subdown
goto test
subdown GR_GA
call retardo
bsf PORTC,7
bcf STATUS,RP1
bcf STATUS,RP0 ; banco 0
movlw B"00000000" ; apunta a la direccion RDAC1
call output
movlw B"00000011" ; coloca el pote en la posicion 3
call output
call retardo
NO_CHIP
call retardo
return
output movwf SSPBUF
bsf STATUS,RP0 ; banco 1
ret btfss SSPSTAT,BF
goto ret
bcf STATUS,RP0 ; banco 0
movf SSPBUF,W
return
retardo movlw 20 ; Aquí se cargan los registros
movwf reg1 ; reg1, reg2 y reg3
; con los valores 10, 20 y 30
tres movlw 30 ; respectivamente
movwf reg2
dos movlw 40
movwf reg3
uno decfsz reg3,1 ; Aquí se comienza a decrementar
goto uno ; Cuando reg3 llegue a 0
decfsz reg2,1 ; le quitare 1 a reg2
goto dos ; cuando reg2 llegue a 0
decfsz reg1,1 ; le quitare 1 a reg1
goto tres ; cuando reg1 llegue a 0
retlw 00 ; regresare al lugar
; de donde se hizo la llamada
;------------------------------------------
end ; se acabó
;------------------------------------------
Escrito originalmente por fito20
Mauricio, para programar el PIC uso el ICProg, y por defecto activa el watchdog... porque la casilla de la derecha WDT aparece marcada. La deshabilito al programar el PIC?
Escrito originalmente por fito20
Pienso que el problema podria estar relacionado con el envio de bits, el potenciometro acepta 11 bits, y yo le estoy mandando 16 bits desde el PIC. Habria alguna manera para enviar tan solo 11 bits desde el PIC?
Espero tu respuesta. En todo caso, mañana ire a la facultad y testeare el circuito con un osciloscopio para ver exactamente que es lo que esta fallando.
Un saludo.
Escrito originalmente por fito20
Ok Mauricio, ire posteando lo que consiga y las dudas que me vayan surgiendo. Cuando vuelvas echale un ojo al hilo, por favor.
Un saludo.
No te dejaré tirado si esa es tu preocupación 
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ó
;------------------------------------------
;---------------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
GR_GA
call Retardo_1s
bcf STATUS,RP1
bcf STATUS,RP0 ; banco 0
bit1 bsf PORTC,5 ;Sube data
call Retardo_100ms ;Envia el bit
bsf PORTC,7
call Retardo_100ms ;Da un pulso de reloj
bcf PORTC,7
call Retardo_100ms
bit2 bcf PORTC,5 ;Sube data
call Retardo_100ms ;Envia el bit
bsf PORTC,7
call Retardo_100ms ;Da un pulso de reloj
bcf PORTC,7
call Retardo_100ms
bit3 bcf PORTC,5 ;Sube data
call Retardo_100ms ;Envia el bit
bsf PORTC,7
call Retardo_100ms ;Da un pulso de reloj
bcf PORTC,7
call Retardo_100ms
bit4 bcf PORTC,5 ;Sube data
call Retardo_100ms ;Envia el bit
bsf PORTC,7
call Retardo_100ms ;Da un pulso de reloj
bcf PORTC,7
call Retardo_100ms
bit5 bcf PORTC,5 ;Sube data
call Retardo_100ms ;Envia el bit
bsf PORTC,7
call Retardo_100ms ;Da un pulso de reloj
bcf PORTC,7
call Retardo_100ms
bit6 bcf PORTC,5 ;Sube data
call Retardo_100ms ;Envia el bit
bsf PORTC,7
call Retardo_100ms ;Da un pulso de reloj
bcf PORTC,7
call Retardo_100ms
bit7 bcf PORTC,5 ;Sube data
call Retardo_100ms ;Envia el bit
bsf PORTC,7
call Retardo_100ms ;Da un pulso de reloj
bcf PORTC,7
call Retardo_100ms
bit8 bcf PORTC,5 ;Sube data
call Retardo_100ms ;Envia el bit
bsf PORTC,7
call Retardo_100ms ;Da un pulso de reloj
bcf PORTC,7
call Retardo_100ms
bit9 bcf PORTC,5 ;Sube data
call Retardo_100ms ;Envia el bit
bsf PORTC,7
call Retardo_100ms ;Da un pulso de reloj
bcf PORTC,7
call Retardo_100ms
bit10 bcf PORTC,5 ;Sube data
call Retardo_100ms ;Envia el bit
bsf PORTC,7
call Retardo_100ms ;Da un pulso de reloj
bcf PORTC,7
call Retardo_100ms
bit11 bcf PORTC,5 ;Sube data
call Retardo_100ms ;Envia el bit
bsf PORTC,7
call Retardo_100ms ;Da un pulso de reloj
bcf PORTC,7
call Retardo_100ms
NO_CHIP
call Retardo_1s
test goto test
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ó
;------------------------------------------
Hola, voy mirando el codigo, y te voy poniendo los errores que encuentro. ya pa empezar aca tenes uno grave:
reg1 equ 0x20
POT_GANANCIA EQU .32
Estas utilizando la misma posicion GPR para ambas variables, eso trae problemas si no era tu intencion...
Sigamos viendo...
;---------------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
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'11111111'
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
GR_GA
call Retardo_1s
bit1 bcf PORTC,2 ;Sube data
call Retardo_100ms ;Envia el bit
bsf PORTC,7
call Retardo_100ms ;Da un pulso de reloj
bcf PORTC,7
call Retardo_100ms
bit2 bsf PORTC,2 ;Sube data
call Retardo_100ms ;Envia el bit
bsf PORTC,7
call Retardo_100ms ;Da un pulso de reloj
bcf PORTC,7
call Retardo_100ms
bit3 bsf PORTC,2 ;Sube data
call Retardo_100ms ;Envia el bit
bsf PORTC,7
call Retardo_100ms ;Da un pulso de reloj
bcf PORTC,7
call Retardo_100ms
bit4 bsf PORTC,2 ;Sube data
call Retardo_100ms ;Envia el bit
bsf PORTC,7
call Retardo_100ms ;Da un pulso de reloj
bcf PORTC,7
call Retardo_100ms
bit5 bsf PORTC,2 ;Sube data
call Retardo_100ms ;Envia el bit
bsf PORTC,7
call Retardo_100ms ;Da un pulso de reloj
bcf PORTC,7
call Retardo_100ms
bit6 bsf PORTC,2 ;Sube data
call Retardo_100ms ;Envia el bit
bsf PORTC,7
call Retardo_100ms ;Da un pulso de reloj
bcf PORTC,7
call Retardo_100ms
bit7 bsf PORTC,2 ;Sube data
call Retardo_100ms ;Envia el bit
bsf PORTC,7
call Retardo_100ms ;Da un pulso de reloj
bcf PORTC,7
call Retardo_100ms
bit8 bsf PORTC,2 ;Sube data
call Retardo_100ms ;Envia el bit
bsf PORTC,7
call Retardo_100ms ;Da un pulso de reloj
bcf PORTC,7
call Retardo_100ms
bit9 bsf PORTC,2 ;Sube data
call Retardo_100ms ;Envia el bit
bsf PORTC,7
call Retardo_100ms ;Da un pulso de reloj
bcf PORTC,7
call Retardo_100ms
bit10 bsf PORTC,2 ;Sube data
call Retardo_100ms ;Envia el bit
bsf PORTC,7
call Retardo_100ms ;Da un pulso de reloj
bcf PORTC,7
call Retardo_100ms
bit11 bcf PORTC,2 ;Sube data
call Retardo_100ms ;Envia el bit
bsf PORTC,7
call Retardo_100ms ;Da un pulso de reloj
bcf PORTC,7
call Retardo_100ms
bit12 bcf PORTC,2 ;Sube data
call Retardo_100ms ;Envia el bit
bsf PORTC,7
call Retardo_100ms ;Da un pulso de reloj
bcf PORTC,7
call Retardo_100ms
bit13 bcf PORTC,2 ;Sube data
call Retardo_100ms ;Envia el bit
bsf PORTC,7
call Retardo_100ms ;Da un pulso de reloj
bcf PORTC,7
call Retardo_100ms
bit14 bcf PORTC,2 ;Sube data
call Retardo_100ms ;Envia el bit
bsf PORTC,7
call Retardo_100ms ;Da un pulso de reloj
bcf PORTC,7
call Retardo_100ms
bit15 bcf PORTC,2 ;Sube data
call Retardo_100ms ;Envia el bit
bsf PORTC,7
call Retardo_100ms ;Da un pulso de reloj
bcf PORTC,7
call Retardo_100ms
bit16 bcf PORTC,2 ;Sube data
call Retardo_100ms ;Envia el bit
bsf PORTC,7
call Retardo_100ms ;Da un pulso de reloj
bcf PORTC,7
call Retardo_100ms
bit17 bcf PORTC,2 ;Sube data
call Retardo_100ms ;Envia el bit
bsf PORTC,7
call Retardo_100ms ;Da un pulso de reloj
bcf PORTC,7
call Retardo_100ms
NO_CHIP
call Retardo_1s
test goto test
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ó
;------------------------------------------
Notad que ahora son 17bits los que hay que enviar porque este pote trabaja asi. Son 8bits del 1º pote, 8bits del 2º pote y 1 bit de seleccion.
Lo que no alcanzo a entender es como hacer para tan solo cambiar la posicion de un pote...enviando 9 bits?
Y la segunda duda es si el pin Cout hace las funciones de SDO para leer la posicion del pote desde el PIC, para almacenar su posicion en el mismo.
Un saludo.
Hola Maunix.
He estado mirando el datasheet y en el pin Cout indica: cascade serial port output.
Pero despues aparece en el modo cascada para conectar en serie varios potenciometros.
Me gustaria que me aclarases si dicha salida de datos me sirve para leer la posicion del pote a traves de una entrada del PIC.
Otra cosa que he ensayado es que cambia el valor de ambos potes independientemente del valor del bit 0 que es el que en teoria deberia seleccionar entre los dos potes...algo muy extraño.
Si tienes un poco de tiempo, te rogaria que me lo aclarases porque ya veo la luz cerca. Un abrazo.
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'00000100'
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'10000000'
movwf temp3
test btfsc PORTB,2
call subdown
goto test
subdown GR_GA
call Retardo_1s
bcf STATUS,RP1
bcf STATUS,RP0 ; banco 0
movlw B'00000000'
call spien
movlw B'10000000'
call spien
movlw temp3
addlw 0x01
movwf temp3
movlw temp3
call spien
NO_CHIP
return
spien 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
subdown GR_GA
call Retardo_1s
bcf STATUS,RP1
bcf STATUS,RP0 ; banco 0
movlw B'00000000' ;cargar W=0 (es lo mismo que hacer "clrw")
call spien
movlw B'10000000' ;cargar W=.128
call spien
movlw temp3 ;aca viene la cosa...alli estas cargando W con la posicion de memoria que le asignaste a temp3!!!! lo que tenes que hacer es, en todo caso...movf temp3,w
;supongamos que asignaste temp3 equ 0x23 ok?
;alli estas cargando a W con 0x23...erroneo para lo que queres hacer.
addlw 0x01 ;incrementa el contenido de W en 1.(entonces aca W=0x24)
movwf temp3 ;temp3=0x24
movlw temp3 ;W=0x23
call spien ;haciendo como lo hiciste, Siempre se va a enviar el valor 0x23 al potenciometro
NO_CHIP
return
subdown GR_GA
call Retardo_1s
bcf STATUS,RP1 ;no me parecen necesarias estas dos lineas(las bcf, pero dejalas x las dudas)
bcf STATUS,RP0 ; banco 0
clrw
call spien
movlw B'10000000' ;cargar W=.128 Supongo que quisiste aca que el pote valga .128....
call spien
incf temp3,F
movf temp3,W
call spien
NO_CHIP
return
haciendo eso, enviarias 3 bytes por loop, el primero seria 0x00, el segundo 0x80, y el tercero, arrancaria(si temp3 estaba inicializada a cero) con el valor 1, y en cada pasada esta valor se iria incrementando en 1.
Cuando temp3 valga 255, y se le sume 1 mas, se va a producir un overflow, volviendo a valer 0 temp3.
Al resto del codigo no lo mire. Por ahi si no pones retardos, puede que no llegues a apreciar con instrumentos de medicion comunes si el pote esta cambiando...En ese caso puede que necesites alentar un poco el proceso(poner retardos)
subup GR_GA
call Retardo_1s
bcf STATUS,RP1 ;no me parecen necesarias estas dos lineas(las bcf, pero dejalas x las dudas)
bcf STATUS,RP0 ; banco 0
clrw
call spien
movlw B'10000000' ;cargar W=.128 Supongo que quisiste aca que el pote valga .128....
call spien
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 spien
NO_CHIP
retlw .1 ;todo bien, retornar con W=1(verdadero)
Para bajar la posicion en lugar de subirla, la rutina sera practicamente igual...cual es la funcion equivalente a addlw pero que resta? declw?
subdown GR_GA
call Retardo_1s
bcf STATUS,RP1 ;no me parecen necesarias estas dos lineas(las bcf, pero dejalas x las dudas)
bcf STATUS,RP0 ; banco 0
clrw
call spien
movlw B'10000000' ;cargar W=.128 Supongo que quisiste aca que el pote valga .128....
call spien
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 spien
NO_CHIP
retlw .1 ;volver con W=1(verdadero) todo OK!
;---------------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ó
;------------------------------------------
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.