			LIST       p=16f73
            list       c=132
indf                       EQU     H'0000'
tmr0                         EQU     H'0001'
pcl                         EQU     H'0002'
status                       EQU     H'0003'
fsr                          EQU     H'0004'
porta                        EQU     H'0005'
portb                        EQU     H'0006'
portc                        EQU     H'0007'
pclath                       EQU     H'000A'
intcon                       EQU     H'000B'
pir1                       EQU     H'000C'
pir2                         EQU     H'000D'
tmr1l                        EQU     H'000E'
tmr1h                        EQU     H'000F'
t1con                      EQU     H'0010'
tmr2                        EQU     H'0011'
t2con                        EQU     H'0012'
ssbuf                       EQU     H'0013'
sspcon                       EQU     H'0014'
ccpr1l                       EQU     H'0015'
ccpr1h                       EQU     H'0016'
ccp1con                      EQU     H'0017'
rcsta                       EQU     H'0018'
txreg                        EQU     H'0019'
TXREG                        EQU     H'0019'
rcreg                        EQU     H'001A'
ccpr2l                       EQU     H'001B'
ccpr2h                       EQU     H'001C'
ccp2con                      EQU     H'001D'
adres                      EQU     H'001E'
adcon0                       EQU     H'001F'

opcion                   EQU     H'0081'
trisa                       EQU     H'0085'
trisb                        EQU     H'0086'
trisc                        EQU     H'0087'
pie1                        EQU     H'008C'
pie2                         EQU     H'008D'
pcon                         EQU     H'008E'
pr2                         EQU     H'0092'
sspadd                       EQU     H'0093'
sspstat                      EQU     H'0094'
txsta                      EQU     H'0098'
spbrg                        EQU     H'0099'
adcon1                       EQU     H'009F'

pmdata                       EQU     H'010C'
pmadr                       EQU     H'010D'
pmdath                       EQU     H'010E'
pmadrh                       EQU     H'010F'

pmcon1                       EQU     H'018C'
			
opcion      equ     0x81
step        equ     0x20
phrase      equ     0x21
play        equ     0x22
stop        equ     0x23
continue    equ     0x24
timing      equ     0x25
led			equ		0x27
suma		equ     0x28
estado      equ     0x29
PDel0		equ		0x30
PDel1		equ		0x31
PDel2		equ		0x32
sensing		equ		0x33
	org     0
	goto    empieza
    org     4
	call	interrup
	goto	DEMORA
	org		6
;-------------------------------comienzo del programa, carga los valores en los registros----------------------------
;-------------------------------------------------------------------------------------------------------------------
empieza 	bcf		status, 5	;pagina 0
			clrf	portb
			movlw	b'11111110'
			movwf	sensing
			movlw	b'11111000' ;cargo a w
			movwf	timing  	;y w a timing
			movlw	b'11111100'
			movwf	stop
			movlw	b'11111011'
			movwf	continue
			movlw	b'00000111'	;de der. a izq. timer1 activado, tipo de reloj externo, reloj externo no sincronizado 
			movwf	t1con		;oscilador desactivado y prescale a uno
;--------------------------configuracion de los puertos I/O-------------------------------------------------------
;-----------------------------------------------------------------------------------------------------------------
			bsf     status, 5	;pagina 1
			movlw	b'00010110' ;carga a w
			movwf	trisa		;copia w en trisa
			movlw	b'11100001'
			movf	trisb
			movlw	b'11100111'	
			movwf	opcion		;activacion de las cargas pull up de la PB y flanco ascendente para pb0 y tocki	oscilador para tmr0 y dividido 1:256			
;-------------------------configuracion de la usart---------------------------------------------------------------
;-----------------------------------------------------------------------------------------------------------------
			movlw	b'11000000'
			movwf   trisc       ;configuro los puertos de c como pone en el datasheet 11000000
    		movlw	b'10110100' ;Se elige el modo asincrono (SYNC=1),dato de 8 bits
    		movwf   txsta       ;y alta velocidad (BRGH=1)
    		movlw   .26         ;Se carga 26 en el registro SPBRG
    		movwf   spbrg   	;con lo cual se trabaja a 31250baudios con 20 mgh de f.osc
			bcf		pie1, 6
			bcf     status, 5	;pagina 0
			bsf		rcsta, 7	;habilito rc6/out y rc7/in
;-------------------------------activacion de las interrupciones ------------------------------------------------
;----------------------------------------------------------------------------------------------------------------
			movlw	b'10111000'	;activacion de las interrupciones
			movwf	intcon		;act. interrupcion del timer 0
								;act. interrupcion del pb0
								;act. interrupcion del cambio de estado de la pb4-pb7    	
;----------------------------------envia la señal active sensing---------------------------------------------
;------------------------------------------------------------------------------------------------------------
start		bcf		status, 5	;pagina 0
bcf		portb,3			
bsf		portb,3
			
			clrf	tmr0
			movf	timing,w 		;señal de timming clock
			movwf	TXREG		; Movemos lo que queremos transmitir de w a TXREG
			goto	FIN			;mueve a FIN

FIN			bsf		status, 5	;pagina 1
			btfss	txsta, 1	; Compruebo si el bit TMRT del registro esta
                        		; a '1' o a '0'.
			goto	FIN			; Si esta a '0' es que esta lleno TMRT y no
								; ha terminado de transmitir,
								; para ello TRMT tiene que estar a 1, hasta
								; entonces esperamos.
			goto	DEMORA
;---------------------------------------rutina de retardo de un tercio de segundo 333us aprox la he sacado---- 
;---------------------------------------del programita tan guai picdel-----------------------------------------
DEMORA  bcf		status,5
		movlw     .3        ; 1 set numero de repeticion  (C)
        movwf     PDel0     ; 1 |
PLoop0  movlw     .215      ; 1 set numero de repeticion  (B)
        movwf     PDel1     ; 1 |
PLoop1  movlw     .241      ; 1 set numero de repeticion  (A)
        movwf     PDel2     ; 1 |
PLoop2  clrwdt              ; 1 clear watchdog
        decfsz    PDel2, 1  ; 1 + (1) es el tiempo 0  ? (A)
        goto      PLoop2    ; 2 no, loop
        decfsz    PDel1,  1 ; 1 + (1) es el tiempo 0  ? (B)
        goto      PLoop1    ; 2 no, loop
        decfsz    PDel0,  1 ; 1 + (1) es el tiempo 0  ? (C)
        goto      PLoop0    ; 2 no, loop
PDelL1  goto 		PDelL2         ; 2 ciclos delay
PDelL2  clrwdt              ; 1 ciclo delay

        goto		start              ; 2+2 Fin.
;--------------------------------------interrpcion, exploracion para saber la causa de la interrupcion---------------
;--------------------------------------------------------------------------------------------------------------------
interrup	bcf		status, 5
			btfss	intcon, 1 	;explora el bit toif (activacion del timer0)
			goto	int_pb0		;si fue 0 va a int_pb0
			goto	timer		;si fue 1 el timer0 reboso y activa la interrupcion  
int_pb0     btfss	intcon, 2	;explora el bit intf (activacion del pin pb0, se borra por soft.)
			goto	int_567		;si fue 0 va a int_567
			goto 	pb0			;si fue cero salta a pb0
int_567 	btfss	intcon, 0	;explora el bit rbif (campio de estado en los bits pb5-pb6-pb7)
			goto	salida		;si fue 0 va a salida
			goto	pb567		;si fue 1 salta a pb_567
;--------------------------------------salida de las interrupciones y su activacion----------------------------------
;----------------------------------------------------------------------------------------------------------------------
salida		movlw	b'10111000'	;activacion de las interrupciones
			movwf	intcon		;act. interrupcion del timer 0
								;act. interrupcion del pb0
								;act. interrupcion del cambio de estado de la pb4-pb7   	
			retfie		
;-----------------------interrupcion de pb0----------------------------------------------------------------------------
;----------------------------------------------------------------------------------------------------------------------
		;aqui se conoce en que direccion esta girando el encoder incremental---------------------------------------
		;----------------------------------------------------------------------------------------------------------
pb0			bcf		status,5
			clrf	tmr0
			bcf		intcon,1	;borra por soft. la activacion de pb0
			btfss	porta, 1	;explora el pba2 de porta y si esta 1 salta	
			goto	menos		;si fue 0 va a menos	_XX__XX__
			goto	mas			;si fue 1 salta a mas   __XX__XX_
	;si gira el encoder adelante envia la sñal de timing clock---------------------------------------------------
	;----------------------------------------------------------------------------------------------------------
mas 		bcf		status, 5	;pagina 0
			btfss	portb,2		;si pb2 esta a 1 hay salto 
			goto 	mas2		;si esta a 0 va a mas2
timming		bcf		status, 5	;pagina 0
			movfw	timing 		;mueve el registro timming a w
			movwf	TXREG		; Movemos lo que queremos transmitir de w a TXREG
mas1		bsf		status, 5	;pagina 1 
			btfss	txsta, 1	; Compruebo si el bit TMRT del registro esta
                        		; a '1' o a '0'.
			goto	mas1			; Si esta a '0' es que esta lleno TMRT y no
								; ha terminado de transmitir,
								; para ello TRMT tiene que estar a 1, hasta
								; entonces esperamos.
			bcf		status,2
			incf	suma		;incrementa suma	
			movlw	.24			;mueve 24 a w
			subwf	suma		;resta 24 con el registro suma
			btfss	status, 2	;si el resultado de la operacion es 0 el bit Z de status estara a 1
			goto	salida		;si no a la salida
			bcf		status,2
			clrf	suma		;si hubo salto, limpia suma
			incf	step		;e incrementa step
			movlw	.128		;mueve 128 a w
			subwf	step		;resta 128 con step
			btfss	status, 2	;si fue 0 la operacion ,salta
			goto	salida		;si no va a la salida
			bcf		status,2		;
			clrf	step		;si dio 0 limpia step
			incf	phrase		;e incrementa frase
			goto    salida		;y va a la salida hasta que no sale de la salida no se activan las interrupciones por hard en intcon
		;--------------------envia la orden status de SSP------------------------------------------------------------------------
mas2		bcf		status, 5	;pagina 0
			bsf		portb,2		;pone a uno pb2
			movfw	estado 
			movwf	TXREG		; Movemos lo que queremos transmitir de w a TXREG
			goto	mas??		;mueve a la subrutina FIN

mas??		bsf		status, 5	;pagina 1
			btfss	txsta, 1	; Compruebo si el bit TMRT del registro esta
                        		; a '1' o a '0'.
			goto	mas??			; Si esta a '0' es que esta lleno TMRT y no
								; ha terminado de transmitir,
								; para ello TRMT tiene que estar a 1, hasta
								; entonces esperamos.
		;----------------envia byte msb de posicion del secuenciador-----------------------------------------------------------------------------
			bcf		status, 5	;pagina 0
			movfw	phrase
			movwf	TXREG		; Movemos lo que queremos transmitir de w a TXREG
			goto	mas???			;mueve a la subrutina FIN

mas???		bsf		status, 5	;pagina 1
			btfss	txsta, 1	; Compruebo si el bit TMRT del registro esta
                        		; a '1' o a '0'.
			goto	mas???			; Si esta a '0' es que esta lleno TMRT y no
								; ha terminado de transmitir,
								; para ello TRMT tiene que estar a 1, hasta
								; entonces esperamos.
		;--------------------envia la byte lsb de la posicion del secuenciador-------------------------------------------------------------------------
			bcf		status, 5	;pagina 0
			movfw	step
			movwf	TXREG		; Movemos lo que queremos transmitir de w a TXREG
			goto	mas????			;mueve a la subrutina FIN

mas????		bsf		status, 5	;pagina 1
			btfss	txsta, 1	; Compruebo si el bit TMRT del registro esta
                        		; a '1' o a '0'.
			goto	mas????			; Si esta a '0' es que esta lleno TMRT y no
								; ha terminado de transmitir,
								; para ello TRMT tiene que estar a 1, hasta
								; entonces esperamos.
		;---------------------envia la señal continue para seguir adelante------------------------------------------------------------------------------
			bcf		status, 5	;pagina 0	
			movfw	continue 
			movwf	TXREG		; Movemos lo que queremos transmitir de w a TXREG
			goto	mas?????	;mueve a la subrutina FIN

mas?????	bsf		status, 5	;pagina 1
			
			btfss	txsta, 1	; Compruebo si el bit TMRT del registro esta
                        		; a '1' o a '0'.
			goto	mas?????	; Si esta a '0' es que esta lleno TMRT y no
								; ha terminado de transmitir,
								; para ello TRMT tiene que estar a 1, hasta
								; entonces esperamos.
			goto	timming		; va a timing para enviar la señal active sensing y calcular la posicion SSP del secuenciador
	;y si marcha hacia detras el encoder el programa hará--------------------------------------------------------------
	;----------------------------------------------------------------------------------------------------
menos		bcf		status, 5	;pagina 0
			bcf		portb, 2	;apaga el led para que si vuelve hacia delante el micro mande las señales SSP y no salte directamente a enviar el timing
			movfw	stop 		;señal de estop
			movwf	TXREG		; Movemos lo que queremos transmitir de w a TXREG
			goto	menos1			;mueve a  menos

menos1		bsf		status, 5
			btfss	txsta, 1	; Compruebo si el bit TMRT del registro esta
                        		; a '1' o a '0'.
			goto	menos1			; Si esta a '0' es que esta lleno TMRT y no
								; ha terminado de transmitir,
								; para ello TRMT tiene que estar a 1, hasta
								; entonces esperamos.
			decfsz	suma    	;decrementa suma si es igual a cero hay salto 
			goto	salida		; si no fue 0  va a salida
			decf	step		; si fue 0 hubo salto y decrementa 1 a step 
			decfsz	phrase		;explora el bit z de intcon si el resultao de la resta fue 0 estara a uno
			goto    salida		;si fue diferente de 0 va a la salida
			decfsz	phrase		;si fue 0 salto y decrementa phrase
			goto 	salida		;si defsz fue diferente de 0 va a salida
			movlw	.128		;si fue 0 pone 128		
			movwf	step		;el registro step
			goto    salida		;va a la salida
;---------------------------------------------------interrupcion por desbordamiento de timer 0-----------------------------------------
;---------------------------------------------------------------------------------------------------------------------------
timer 		bcf		intcon, 2
			goto	pb61		;va a la salida jejejeje ti voy a fusilah ,jejejejeje
;---------------------------------------------------exploracion por cambio de estado en la puerta b------------------------
;--------------------------------------------------------------------------------------------------------------------------
pb567 		bcf		status,5	;pagina 0
			bcf		intcon,0
			btfsc	portb,5		;comprueba estado de rb5
			goto	pb_6		;si esta a nivel alto va a pb_6
			goto	pb5			;si esta a nivel bajo va a pb5
pb_6		btfsc	portb,6		;comprueba estado en rb6
			goto	pb_7		;si esta a nivel alto va a pb_7
			goto	pb6			;si es a nivel bajo va a pb6
pb_7		btfsc	portb,7		;comprueba el nivel de rb7
			goto 	salida		;si es alto va a la salida , si sucede esto le has pulsado muy rápido al botón
			goto	pb7			;si es a nivel bajo va a pb7
;--------------------------------------------------interrupciones de la puerta b 5,6,7--------------------------------------
;---------------------------------------------------------------------------------------------------------------------------
		;----------continue-------------------------------------------------------------------------------------------------
pb5			bsf		status, 5	;pagina 0
			bsf		portb,1	;enciende el led que hace girar el motor con un circuito externo de pwm con monoestables
			bsf		portb,2
			goto    mas2		;salta a mas dos de esta forma siempre empieza donde se quedo 
		;----------stop-----------------------------------------------------------------------------------------------------
pb6			bcf		status, 5	;pagina 0
			bcf		portb, 1	;apaga led rb1 y asi el motor se detiene
pb61		bcf		portb, 2	;apaga led rb2 y asi si se adelanta o atrasa con la mano el encoder, el micro sabe que se habia detenido
			movfw	stop 		;envia stop, detiene la secuenciación 
			movwf	TXREG		; Movemos lo que queremos transmitir de w a TXREG
menos2		bsf		status, 5	;pagina 1
			btfss	txsta, 1	; Compruebo si el bit TMRT del registro esta
                        		; a '1' o a '0'.
			goto	menos2			; Si esta a '0' es que esta lleno TMRT y no
								; ha terminado de transmitir,
								; para ello TRMT tiene que estar a 1, hasta
								; entonces esperamos.
			goto	salida		;va a la salida 
 		;----------reset------------------------------------------------------------------------------------------
pb7			bcf		status, 5
			bsf		portb,1
			bsf		portb,2
			clrf	phrase		;pone a cero el registro phrase
			clrf	step		;pone a cero el registro step
			goto	mas2		;va a mas2, así comienza desde el principio de la cancion
			end					;nunca llegara ¡¡¡

;pulsos que entran por pb0      _XXX_XXX_XXX_     con este pulso determinamos con el flanco ascendente la interrupcion de pb0 
; pulsos que entran por pa1     __XX__XX__XX_	  y con estos dos en una direccion 10
; pulsos que entran por pa2		_XX__XX__XX__	  o en la otra direccion 01
								
			