;POR BRUNO FASCENDINI --- bipus24hs@hotmail.com
;FUNCIONA BIEN
;configurado para FOSC = 20MHZ! CUIDADO CON ESTO! ACOMODAR LOS TIEMPOS SINO
LIST P=PIC16F877A
#include <P16F877A.INC>
__CONFIG _CP_OFF & _CPD_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _LVP_OFF & _HS_OSC
ERRORLEVEL -302
;DEFINICION DE PINES DEL PROTOCOLO DE LA PSX
#DEFINE JDATA 0 ;(MARRON)(BROWN)
#DEFINE COMMAND 1 ;(NARANJA)(ORANGE)
#DEFINE ATTENTION 2 ;(AZUL)(BLUE)
#DEFINE CLOCK 3 ;(BLANCO)(WHITE)
;- (ROJO)(RED)
;+ (AMARILLO)(YELLOW)
;PORTB Y PORTC DEBEN IR TODOS CON LEDS EN MODO FUENTE(muestra las teclas presionadas)
FLAGS EQU 0x20
DATAPSX EQU 0X21
CONT1 EQU 0X22
PSX5A EQU 0X23
PDel0 EQU 0X24
PDel1 EQU 0X25
PDel2 EQU 0X26
SAT1STDATA EQU 0X27
SAT2NDDATA EQU 0X28
PSXID EQU 0X29
;////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
;Memoria EEPROM
;////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
;////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
;VECTOR RESET
;////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
ORG 0X0000
GOTO INICIO
;////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
;VECTOR INTERRUPCION
;////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
ORG 0X0004
GOTO INICIO
;////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
;VECTOR INICIO PROGRAMA
;////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
ORG 0X05
;////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
;CONFIG PUERTOS
;////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
INICIO BCF STATUS,RP0
BCF STATUS,RP1
BSF STATUS,RP0
MOVLW 0x06 ;PINS DEL PUERTO A Y PUERTO E TODOS DIGITALES.
MOVWF ADCON1
MOVLW B'00010001'
MOVWF TRISA ;PUERTO A RA0 = DATA(I) RA1= COMMAND(O) RA2= ATTENTION(O) RA3= CLOCK(O) RA4 = ACKNOWLEDGE(I) RA5= LED(O)
BCF STATUS,RP0
MOVLW 0XFF ;TODOS LOS PINES DE SALIDA EN ALTO( PARA QUE EL JOYSTICK NO RECIBA COMANDOS POR AHORA)
MOVWF PORTA
BSF STATUS,RP0
CLRF TRISB ;LEDS PARA VER PRIMER BYTE DE DATOS
BCF STATUS,RP0
CLRF PORTB
BSF STATUS,RP0
CLRF TRISC ;LEDS PARA VER SEGUNDO BYTE DE DATOS
BCF STATUS,RP0
CLRF PORTC
BSF STATUS,RP0
MOVLW 0X00
MOVWF TRISD
BCF STATUS,RP0
CLRF PORTD
BSF STATUS,RP0
MOVLW 0X00
MOVWF TRISE
BCF STATUS,RP0
BCF STATUS,RP1
MOVLW 0X5A
MOVWF PSX5A
MOVLW 0X42
MOVWF PSXID
CALL BUSCATIPOPERIF
WAITPERCOMP BSF PORTA,ATTENTION
CALL DEMORA8MS
MOVLW 0x01
CALL SENDPSX
MOVLW 0x42
CALL SENDPSX
MOVWF PSXID
MOVLW 0x00
CALL SENDPSX
MOVWF PSX5A
CALL BUSCATIPOPERIF
MOVLW 0x00
CALL SENDPSX
MOVWF SAT1STDATA
MOVLW 0x00
CALL SENDPSX
MOVWF SAT2NDDATA
MOVF SAT1STDATA,W
MOVWF PORTB
MOVF SAT2NDDATA,W
MOVWF PORTC
GOTO WAITPERCOMP
;///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
;FUNCIONES:
;///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
SENDPSX BCF PORTA,ATTENTION ;EXIGIR ATENCION DEL PAD
MOVWF DATAPSX
CALL DEMORA20US ;PAUSA ENTRE COMANDOS(NECESARIA)
MOVLW 0X08
MOVWF CONT1
NEXT01 BSF PORTA,COMMAND
BTFSS DATAPSX,0
BCF PORTA,COMMAND
BCF PORTA,CLOCK ;ENVIAR 0X01
CALL DEMORA1US
CALL DEMORA1US
BSF PORTA,CLOCK ;CLOCK alto
RRF DATAPSX,F ;ROTAR data a enviar
CALL DEMORA1US
BSF DATAPSX,7
BTFSS PORTA,JDATA
BCF DATAPSX,7
DECFSZ CONT1,F ;decrementar contador
GOTO NEXT01
MOVF DATAPSX,W
RETURN
;///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
BUSCATIPOPERIF MOVF PSX5A,W
XORLW 0X5A
BTFSS STATUS,Z
GOTO NOCOMPAT ;ENVIAR QUE EL PERIFERICO NO ENVIO 0X5A. NO RECONOCIDO
MOVF PSXID,W
XORLW 0X73 ;ID= 0X73?
BTFSC STATUS,Z
GOTO ANALOGREDCONECTED
MOVF PSXID,W
XORLW 0X53 ;ID= 0X53?
BTFSC STATUS,Z
GOTO ANALOGGREENCONECTED
MOVF PSXID,W
XORLW 0X41 ;ID= 0X41?
BTFSC STATUS,Z
GOTO DIGPADCONECTED
NOCOMPAT MOVLW 0X00
MOVWF PSXID
RETURN
DIGPADCONECTED MOVLW 0X01
MOVWF PSXID
RETURN
ANALOGREDCONECTED
MOVLW 0X02
MOVWF PSXID
RETURN
ANALOGGREENCONECTED
MOVLW 0X03
MOVWF PSXID
RETURN
;///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
DEMORA20US MOVLW .39
MOVWF PDel0
DECFSZ PDel0,F
GOTO $-1
NOP
NOP
RETURN
;///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
DEMORA1US NOP
RETURN
;///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
DEMORA8MS MOVLW .20 ; 1 set numero de repeticion (C)
MOVWF PDel0 ; 1 |
PLoop20 MOVLW .2 ; 1 set numero de repeticion (B)
MOVWF PDel1 ; 1 |
PLoop21 MOVLW .205 ; 1 set numero de repeticion (A)
MOVWF PDel2 ; 1 |
PLoop22 CLRWDT ; 1 clear watchdog
CLRWDT ; 1 ciclo delay
DECFSZ PDel2, 1 ; 1 + (1) es el tiempo 0 ? (A)
GOTO PLoop22 ; 2 no, loop
DECFSZ PDel1, 1 ; 1 + (1) es el tiempo 0 ? (B)
GOTO PLoop21 ; 2 no, loop
DECFSZ PDel0, 1 ; 1 + (1) es el tiempo 0 ? (C)
GOTO PLoop20 ; 2 no, loop
RETURN
;///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
END