.
Quisiera hacer un pequeño aporte: mostrar cómo se puede usar una de esas palanquitas que tienen los gamepads de PlayStation (para los no-enterados: no son más que dos potenciómetros que varían según uno mueva la palanca) con un 16F628A (
)
sin ADC.
La idea: aprovechar los 2 comparadores analógicos integrados en el Pic (¿quién diría que algún día servirían de algo?). Aunque este diseño sufre una grave desventaja en algunas implementaciones, y es que no se pueden tener direfentes valores según el recorrido de los potenciómetros, sino sólo saber en qué dirección apunta el mando.
Sin más, el programa:
LIST P=16F628A, R=HEX, W=-302
#INCLUDE P16F628A.INC
__CONFIG _BODEN_ON & _CP_OFF & _DATA_CP_OFF & _PWRTE_ON & _WDT_OFF & _LVP_OFF & _MCLRE_ON & _INTOSC_OSC_NOCLKOUT
#DEFINE vref_bajo B'11000000' ; 1.25v - RA2 VREF OUTPUT
#DEFINE vref_alto B'11001111' ; 3.6v - RA2 VREF OUTPUT
#DEFINE ARRIBA 1
#DEFINE ABAJO 5
#DEFINE IZQ 3
#DEFINE DER 7
#DEFINE UPL 2
#DEFINE UPR 0
#DEFINE DOWNL 4
#DEFINE DOWNR 6
CBLOCK 20
SALIDA
ENDC
;========================================================================
ORG 0
GOTO inicio
ORG 5
inicio
MOVLW B'00000111'
MOVWF CMCON ; COMP OFF
CLRF PORTB
BSF STATUS,RP0
MOVLW 0xFF
MOVWF TRISA ; PORTA SOLO ENTRADAS
CLRF TRISB ; PORTB SOLO SALIDAS
MOVLW vref_alto
MOVWF VRCON ; VREF ENABLE - ALTO
BCF STATUS,RP0
CALL ret_vref
MOVLW B'00110011' ; 2 COMPARADORES CON REFERENCIA COMUN RA2->(+)
MOVWF CMCON ; Y SALIDAS INVERTIDAS
CLRF SALIDA
;========================================================================
main
; ENCIENDE/APAGA LOS BITS CORRESPONDIENTES DE ARRIBA Y DERECHA:
BTFSC CMCON,C1OUT
BSF SALIDA,ARRIBA
BTFSC CMCON,C2OUT
BSF SALIDA,DER
BSF STATUS,RP0
MOVLW vref_bajo
MOVWF VRCON ; VREF BAJO
BCF STATUS,RP0
CALL ret_vref
; ENCIENDE/APAGA LOS BITS CORRESPONDIENTES DE ABAJO E IZQUIERDA:
BTFSS CMCON,C1OUT
BSF SALIDA,ABAJO
BTFSS CMCON,C2OUT
BSF SALIDA,IZQ
BSF STATUS,RP0
MOVLW vref_alto
MOVWF VRCON ; VREF ALTO
BCF STATUS,RP0
;========================================================================
; IDENTIFICA DIAGONALES:
MOVLW B'10000010' ; ARRIBA-DERECHA
XORWF SALIDA,W
BTFSS STATUS,Z
GOTO $+4
CLRF SALIDA
BSF SALIDA,UPR
GOTO salir
MOVLW B'00001010' ; ARRIBA-IZQUIERDA
XORWF SALIDA,W
BTFSS STATUS,Z
GOTO $+4
CLRF SALIDA
BSF SALIDA,UPL
GOTO salir
MOVLW B'10100000' ; ABAJO-DERECHA
XORWF SALIDA,W
BTFSS STATUS,Z
GOTO $+4
CLRF SALIDA
BSF SALIDA,DOWNR
GOTO salir
MOVLW B'00101000' ; ABAJO-IZQUIERDA
XORWF SALIDA,W
BTFSS STATUS,Z
GOTO $+4
CLRF SALIDA
BSF SALIDA,DOWNL
GOTO salir
;========================================================================
salir
; PASA LOS DATOS AL PUERTO B:
MOVF SALIDA,W
CLRF PORTB
MOVWF PORTB
CLRF SALIDA
GOTO main
;========================================================================
ret_vref
FILL (GOTO $+1), 5 ; RETARDO 14us
RETURN
END
Un diagramita:
El funcionamiento:
El uC ejecuta un lazo repetitivo de
- Seleccionar voltaje de referencia 3,6V (salida por RA2)
- Ver el estado de los bits C1OUT y C2OUT (indican arriba y derecha, respectivamante)
- Seleccionar voltaje de referencia 1,25V
- Ver el estado de los bits C1OUT y C2OUT (indican abajo e izquierda, respectivamante)
Si encuentra el respectivo bit (arriba, abajo, derecha y/o izquierda) en alto, pone en 1 el respectivo bit del registro SALIDA. Luego inspecciona este registro para saber si la dirección de la palanquita es una diagonal, hace las modificaciones necesarias y manda el registro SALIDA por el PORTB (así se enciende un juego de leds). Y vuelta al inicio...
Alguna fotos: (créanme que sí funciona
)
Saludos y espero que les sea útil.