;************************************************************************
;                                                                     	*  
;                        DMX512 3 vías   						 	*
;                                                                     	*
;************************************************************************
;    version 1.0                                      	*
;                                                                     	*
;                                                                     	*
;
;                                                                     	*
;    micro: P16F628.inc                                             	*
;                                                                     	*
;************************************************************************
;																		*
;			Quartz = 20 Mhz												*
;      																	*
;************************************************************************


	LIST      p=16F628           ;definicion de procesos
	#include <p16F628.inc>        ; definicion de variables
    ERRORLEVEL      -302, -307 ;(NO FIGURAN LOS ERRORES DE CAMBIO DE PAGINA)
    

       

;*********************************************************************
;                                 MACROS                             *
;*********************************************************************

Compar_Off macro
	movlw	7
	movwf	CMCON
	endm
;*********************************************************************
;                              ASIGNAcIONES                          *
;*********************************************************************

Canaux		equ	1
Baud_Constant	equ	4
Registre	equ	0x020	; zona de debut de variables
Finreg		equ	0x060
Option_Val	equ	b'10001111'
Ok_Trame	equ	0
Ok_Odebut	equ	1
Ok_Data		equ	2
fondo_Ok	equ 4
Octet_Debut_Val	equ	0

;*********************************************************************
;                             DEFINE                                 *
;*********************************************************************

#DEFINE Led1	PORTB,0
#DEFINE Led2	PORTB,3
#DEFINE Led3	PORTB,7
__CONFIG   _CP_OFF & _WDT_OFF & _PWRTE_ON & _HS_OSC & _LVP_OFF & _MCLRE_OFF & _BODEN_ON


;*********************************************************************
;                   DECLARACIONES DE VARIABLES                        *
;*********************************************************************

	CBLOCK Registre		;  zona variables
	
	Temp_L : 1
	Temp_H : 1

	C_Temp_L : 1
	C_Temp_H : 1

	compt : 1

	Rx_Data : 1
	Flag : 1
	Dmx_trama_L : 1
	Dmx_trama_H : 1

	trama_L : 1
	trama_H : 1	
	Data_trama : 1
	Num_trama : 1
	Flagg : 1
	Data_trama1 : 1
	contador : 1
	contadorb : 1
	Data_trama1b : 1
	flagled1 : 1
	flagled2 : 1
	flagled3 : 1


        ENDC			; Fin de la zona                        

;**********************************************************************
;                      COMIENZO SOBRE RESET                           *
;**********************************************************************

	org 0x000 		; Dirección de salida después de reset
  	goto    Init		; Envía 0: inicializar

;**********************************************************************
;                        INTERUPTIONS                                 *
;**********************************************************************

	org 0x004
	btfsc	PIR1,RCIF	; test si interrupcion USARD RX
	call 	Usard
	btfsc	PIR1,TMR1IF
	call	Int_Timer1
	retfie

;----------------------------


Usard
	clrwdt
	bcf	PIR1,RCIF	; reset bit interrupcion USARD	
	movf	RCREG,W
	movwf	Rx_Data
	btfsc	RCSTA,OERR
	goto	Over_Rx
	btfss	RCSTA,FERR
	goto	No_error_Break
	bcf	RCSTA,CREN
	bsf	RCSTA,CREN
	clrf	Flag
	clrf	Flagg
	bsf	Flag,Ok_Trame
	clrf	Dmx_trama_L
	clrf	Dmx_trama_H
	return
Over_Rx
	bcf	RCSTA,CREN
	bsf	RCSTA,CREN
	clrf	Flag
	clrf	Flagg
	clrf	Num_trama
	return
No_error_Break
	btfss	Flag,Ok_Trame
	return
	movf	Dmx_trama_L,F
	btfss	STATUS,Z
	goto	error_Odebut
	movf	Dmx_trama_H,F
	btfss	STATUS,Z
	goto	error_Odebut
	bcf	Flag,Ok_Odebut
	movf	Rx_Data,W
	xorlw	Octet_Debut_Val
	btfsc	STATUS,Z
	bsf	Flag,Ok_Odebut
	goto	Inc_Dmx_trama
error_Odebut
	btfss	Flag,Ok_Odebut
	return
	clrwdt
	movf	Dmx_trama_L,W
	xorwf	trama_L,W
	btfss	STATUS,Z
	goto	Inc_Dmx_trama
	movf	Dmx_trama_H,W
	xorwf	trama_H,W
	btfss	STATUS,Z
	goto	Inc_Dmx_trama
	movf 	Rx_Data,W
	movwf	Data_trama1
Inc_Dmx_trama
	incf	Dmx_trama_L,F
	btfsc	STATUS,Z
	incf	Dmx_trama_H,F
	return

;----------------------------

Int_Timer1
	bcf	PIR1,TMR1IF
	Call	InitTimer1
	return


;*********************************************************************
;                   Zona de CÉNTIMOS PROGRAMADOS                        *
;*********************************************************************


InitTimer1
	movlw	0xfa
	movwf	TMR1H
	movlw	0x00
	movwf	TMR1L
	movf 	contador,w
	andlw	0x3f
	xorlw	0x00
	btfss	STATUS,Z
	goto	pasabanda
	movlw	0x3f
	movwf	contador
	bcf		Led1
	bcf		Led2
	bcf		Led3
pasabanda
	movf	Data_trama1,w
	movwf	Data_trama1b
	rrf		Data_trama1b,f
	rrf		Data_trama1b,f
	movlw	0x03
	andwf	Data_trama1b,w
	movwf	flagled1
	rrf		Data_trama1b,f
	rrf		Data_trama1b,f
	movlw	0x03
	andwf	Data_trama1b,w
	movwf	flagled2
	rrf		Data_trama1b,f
	rrf		Data_trama1b,f
	movlw	0x03
	andwf	Data_trama1b,w
	movwf	flagled3
LED1
	movf	flagled1,w
	btfsc	STATUS,Z
	goto	LED2		; Led semiencendido
	movf	flagled1,w
	xorlw	0x03
	btfss	STATUS,Z	; Led1 encendido
	goto	led1plus
	bsf		Led1
	goto	LED2
led1plus
	movf	flagled1,w
	xorlw	0x02
	btfss	STATUS,Z	; Led1 encendido 2
	goto	led1menos
	bcf		Led1
	movf	contador,w
	andlw	0x0f
	btfsc	STATUS,Z
	bsf		Led1
	goto	LED2
led1menos	
	bcf		Led1
	movf	contador,w
	xorlw	0x07
	btfsc	STATUS,Z
	bsf		Led1
	goto	LED2
LED2
	movf	flagled2,w
	btfsc	STATUS,Z
	goto	LED3		; Led2 semiencendido
	movf	flagled2,w
	xorlw	0x03
	btfss	STATUS,Z	; Led2 encendido
	goto	led2plus
	bsf		Led2
	goto	LED3
led2plus
	movf	flagled2,w
	xorlw	0x02
	btfss	STATUS,Z	; Led2 encendido 2
	goto	led2menos
	bcf		Led2
	movf	contador,w
	andlw	0x0f
	btfsc	STATUS,Z
	bsf		Led2
	goto	LED3
led2menos	
	bcf		Led2
	movf	contador,w
	xorlw	0x07
	btfsc	STATUS,Z
	bsf		Led2
	goto	LED3
LED3
	movf	flagled3,w
	btfsc	STATUS,Z
	goto	FINLED		; Led3 semiencendido
	movf	flagled3,w
	xorlw	0x03
	btfss	STATUS,Z	; Led3 encendido
	goto	led3plus
	bsf		Led3
	goto	FINLED
led3plus
	movf	flagled3,w
	xorlw	0x02
	btfss	STATUS,Z	; Led3 encendido 2
	goto	led3menos
	bcf		Led3
	movf	contador,w
	andlw	0x0f
	btfsc	STATUS,Z
	bsf		Led3
	goto	FINLED
led3menos	
	bcf		Led3
	movf	contador,w
	xorlw	0x07
	btfsc	STATUS,Z
	bsf		Led3
FINLED	
	decf	contador,f
	return



;*********************************************************************
;                       INICIALIZACION                              *
;*********************************************************************
Init
	Compar_Off		;  compara
	clrf	PORTA		;salidas portA à 0
	clrf	PORTB		; salidas portB à 0
    bcf STATUS,RP1    
	bsf	STATUS,RP0
;	clrf	EEADR		; permite disminuir el consumo

			; initialization de los puertos paralelos
			; -----------------------------------

	movlw	b'00011111'	; port A
	movwf	TRISA
    BSF		STATUS,RP0	;BANCO 1
	movlw	b'01110110'	; port b
	movwf	TRISB
	bcf	    STATUS,RP0

			; inicializacion port serie
			; -------------------------

	bsf	STATUS,RP0
	movlw	Baud_Constant
	movwf	SPBRG
	bsf	TXSTA,BRGH
	bcf	TXSTA,SYNC
	bsf	PIE1,RCIE
	bcf	STATUS,RP0
	bcf	RCSTA,RX9
	bsf	RCSTA,CREN
	bsf	RCSTA,SPEN


			;  RAM
			; ------------

	movlw	Registre	; inicializacion pointer
	movwf	FSR		; pointer d'adress indirec
init1
	clrf	INDF		; borra ram
	incf	FSR,f		; pointer siguiente
	movf	FSR,w
	xorlw	Finreg
	btfss	STATUS,Z
	goto	init1		; 


			; inicializacion especificas
			; --------------------------
	clrf	trama_H
	btfsc	PORTA,5
	bsf	trama_H,0
	movf	PORTB,W
	movwf	compt
	rlf	 compt,F
	movlw	0x0E0
	andwf	compt,F
	movf	PORTA,W
	movwf	Flag
	movlw	0x01F
	andwf	Flag,W
	addwf	compt,W
	movwf	trama_L
	incf	trama_L,F
	btfsc	STATUS,C
	incf	trama_H,F
	clrf	compt
	clrf	contador
	clrf	Flag
	clrf	Flagg	
	bcf	Led1
	bcf Led2
	bcf Led3


			; Inicializacion de interrupcion
			; --------------------------------

	clrf	INTCON
	clrf	T1CON
	bsf	INTCON,PEIE
	bsf	INTCON,GIE
	bcf	INTCON,INTE	; autoriza int 
	bsf	T1CON,TMR1ON	; valida timer1
	bsf	STATUS,RP0
	movlw	Option_Val
	movwf	OPTION_REG
	clrf	PIE1
	bsf	PIE1,RCIE
	bsf	PIE1,TMR1IE	; autoriza int TMR1
	bcf	STATUS,RP0
	goto	start			; salta al programa principal

;*********************************************************************
;                      PROGRAMA PRINCIPAL                           *
;*********************************************************************

start
	goto 	start		; bucle

	END 			; directiva fin de programa


