;*****************************************************************************************
;Titulo       : receptor DMX 512
;Archivo	   :  dmx3_1.asm	
;Versión    : 
;Revision   : 14/12/2013
;Desarrollo: Carlos W3 Sistemas Winter 
;Metodo    : RT
;*****************************************************************************************
;Notas      :	carlos la unica modificacion que tenes que hacer es cortar el camino que une
;		el pin del dipsw3 con el pin17 del micro y unir el pin dipsw3 al pin14 del micro que
;		se encuentra libre, el software ya esta listo para trabajar de esta forma.
;*****************************************************************************************
	list P=16f883,r=hex  
	include"p_16f883.inc"
	include"picmacro16.h"
	errorlevel -302
;======================================	
;Fusibles de configuracion

	__config	_CONFIG1,_DEBUG_OFF&_LVP_OFF&_FCMEN_OFF&_IESO_OFF&_BOR_OFF&_CPD_OFF&_MCLRE_ON&_PWRTE_ON&_WDT_OFF&_HS_OSC  
	__config	_CONFIG2,_WRT_OFF&_BOR21V
;======================================  
;Definiciones de la RAM
	cblock	0x20

WBack,STATUSBack,FSRBack,PCLATHBack,FlagTarea
EstadoA,TempA,Tic5ms,Tiempo5ms
;--------------------------------------
FlagLed,cntRojo,TempRojo,cntVerde,TempVerde,cntAzul,TempAzul
TempDmxRojo,TempDmxVerde,TempDmxAzul,TempDmxStrobo
TempStrobo,cntStrobo,cntStroboMitad,FlagStrobo
DimRojo,DimVerde,DimAzul
DmxRojo,DmxVerde,DmxAzul
Cociente,Dividendo_H,Auxiliar,Result_H
;--------------------------------------
cntPwmRojo,cntPwmVerde,cntPwmAzul
;--------------------------------------
DatoRx,DipH,DipL,cntByteH,cntByteL,NumCh
;--------------------------------------
PtrBuffer :,DmxDimRojo,DmxDimVerde,DmxDimAzul,DmxStrobo,DmxDim
	endc
;======================
;Definiciones del PORTA

#define	DIRA	b'00000000'	;Configuracion entrada salida PORTA
;======================
;Definiciones del PORTB
#define	pIDipSw10	PORTB,7
#define	pIDipSw9	PORTB,6
#define	pOAzul		PORTB,5	;salida pwm rojo	
#define	pIDipSw8	PORTB,4
#define	pIDipSw7	PORTB,3
#define	pIDipSw6	PORTB,2
#define	pIDipSw5	PORTB,1
#define	pIDipSw4	PORTB,0

;	 1        2	     3       4       5        6       7       8        9      10       DIPSW		
; 	rc4 - rc5 - rc6 - rb0 - rb1 - rb2 - rb3 - rb4 - rb6 - rb7     PUERTOS

#define	DIRB		b'11011111'	;Configuracion entrada salida PORTB
;======================
;Definiciones del PORTC
;#define	pOLedSA	PORTC,0	;led indicador stand alone (autonomo)	

#define	pIRxDmx	       PORTC,7	;entrada de datos DMX
#define	pIDipSw2	       PORTC,5
#define	pIDipSw1     	PORTC,4
#define	pIDipSw3	       PORTC,3	;pin14 del micro esta es la modificacion que se hizo
#define	pORojo	        	PORTC,2
#define	pOVerde		PORTC,1

#define	DIRC		b'10111000'	              ;Configuracion entrada salida PORTC,(RC7/RX in) 
				                                        	;el bit 7 es la entrada de DMX
;======================
;Otros Registros
;................................................
;configuracion AD
;Fosc/32=2us, chanel0
;justificado a la derecha, Vref=Vdd
#define	DIRADCON0	b'00000000' 	;ADCS1-ADCS0-CHS3-CHS2-CHS1-CHS0-GO-ADON
#define	DIRADCON1	b'00000000'	       ;ADFM-NC-VCFG1-VCFG0-NC-NC-NC-NC
#define	DIRANSEL  	b'00000000'	       ;aca todos digitales, para analog colocar 1 al bit correspondiente 
#define	DIRANSELH	b'00000000'
;................................................
#define	DIROPT	b'10001100'	;Configuracion  OPTION
;======================
;Definicion de Tiempos                         
;................................................
;======================
;Definición de Flags
;................................................
#define	fPeriodoRojo	       FlagLed,0
#define	fPeriodoVerde	       FlagLed,1
#define	fPeriodoAzul	       FlagLed,2
#define	fPeriodoRGB   	       FlagLed,3
;................................................
#define	fStrobo		FlagStrobo,0
;................................................
#define	fTareaA	FlagTarea,0	;habilita la tarea A	
;======================
;Definición de Literales
;................................................
#define	BASE5MS	d'193'	;para 26Us		
;#define	BASE1MS	d'16'	
;#define	BASE10MS	d'10'	
;#define	BASE100MS	d'10'	
;#define	BASE1SEG	d'10'	
;#define	BASE1MIN	d'60'
;................................................
#define FRECSTROBO	d'5'	;si aumeto el literal aumento frec del strobo desde el principio del remo
;................................................
#define	NUMCH		d'5'	;numero de canales del dispositivo
;======================
;Literales posicion de memoria EE
;======================
;Literales maquina de estados
	cblock	0x00
EA0,EA1,EA2,EA3,EA4,EA5,EA6,EA7,EA8,EA9,EA10,EA11,EA12,EA13,EA14,EA15,EA16,EA17,EA18
EA19,EA20,EA21,EA22,EA23,EA24
	endc
;======================
;Definición Macros lectura escritura EE 

movleel	macro	literal,eedir	;mueve literal a EEPROM (literal)
	movlw	literal         	;carga un literal en una direccion 
	bank2                   	;de memoria EE apuntada por literal
	movwf	EEDATA          
	bank0                   	
	movlw	eedir           
	call 	Wree		
	endm	
;................................................
movleef	macro	literal,eedir   	;mueve literal a EEPROM (file)
	movlw	literal         	;carga un literal en la direccion
	bank2                  	 	;de memoria EE apuntada por file
	movwf	EEDATA          	
        	bank0                   	
	movf	eedir,w         
	call	Wree		
	endm
;................................................
movfeel	macro	file,eedir		;mueve file a EEPROM (literal)
	movf 	file,W          	;carga el contenido de file a la
	bank2                   	;direccion apuntada por literal
	movwf	EEDATA          	
	bank0                   
	movlw	eedir     
	call 	Wree     
	endm                    
;................................................
movfeef	macro	file,eedir		;mueve file a EEPROM (file)
	movf	file,w   		;carga el contenido del registro
	bank2			;en una direccion EE apuntada por file
	movwf	EEDATA		
	bank0         		
	movf	eedir,w		
	call	Wree		
	endm
;................................................
moveeff	macro	eedir,file		;mueve EEPROM (file) a file
	movf	eedir,w         	;lee la direccion que contiene el registro eedir
	call	Rdeew  		;y lo descarga en file
	movwf	file		
	endm    		
;................................................
moveelf	macro	eedir,file	;mueve EEPROM (literal) a file
	movlw	eedir		;lee la direccion apuntada por un literal
	call	Rdeew		;y la descarga en file
	movwf	file            
       	endm 		
;****************************
;	R E S E T
;****************************
Riset	org	0x00
	nop
	goto	Begin

	org	0x04
	mIntProlog
	bcf	T0IF	
	goto	ServInt
;======================================
;Inicializacion RAM con direccionamiento indirecto mediante el IRP
;======================================           
	org	0x10	
Begin                 
	clrf	STATUS		;Bank0
	movlw	0x20		;1er direc en bank0 0x20-0x7f
	movwf	FSR			
Bank0_Lp
	clrf	INDF
	incf	FSR,f
	btfss	FSR,7
	goto	Bank0_Lp	 
;................................................		
	movlw	0xA0		;Comienzo de borrado del bank1 0xa0-0xff
	movwf	FSR
Bank1_Lp
	clrf	INDF
	incf	FSR,f
	movf	FSR,f
	btfss	_Z
	goto	Bank1_Lp
;................................................
	bsf	IRP		;selecciono bank2 y bank3 0x120-0x17f
	movlw	0x20
	movwf	FSR
Bank2_Lp
	clrf	INDF
	incf	FSR,f
	btfss	FSR,7
	goto	Bank2_Lp
;................................................
	movlw	0xF0		;de 0x1f0-0x1ff
	movwf	FSR
Bank3_Lp
	clrf	INDF
	incf	FSR,f
	movf	FSR,f
	btfss	_Z
	goto	Bank3_Lp
;................................................
	bcf	IRP
;======================
;I N I C I A L I Z A   R E G I S T R O S
;======================
	bank0	
;--------------------------------------
;inicializacion PORTA y configuracion I/O 		
	clrf	PORTA
	bank1
	movlw	DIRA
	movwf	TRISA
;--------------------------------------
;inicializacion PORTB y configuracion I/O 
	bank0
	clrf	PORTB
	bank1
	movlw	DIRB
	movwf	TRISB
;--------------------------------------
;inicializacion PORTC y configuracion I/O 
	bank0
	clrf	PORTC
	bank1
	movlw	DIRC
	movwf	TRISC
;--------------------------------------
;Configuracion OPTION_REG
	movlw	DIROPT
	movwf	OPTION_REG
;--------------------------------------
;Configuracion AD
	movlw	DIRADCON1	;ADFM-ADCS2-NC-NC-PCFG3-PCFG2-PCFG1-PCFG0
	movwf	ADCON1	
	bank0
	movlw	DIRADCON0	;ADCS1-ADCS0-CHS2-CHS1-CHS0-GO-NC-ADON
	movwf	ADCON0	
	bank3
	movlw	DIRANSEL
	movwf	ANSEL
	movlw	DIRANSELH
	movwf	ANSELH	
;-------------------------------------- inicializa EUSART		
	bank1
	clrf	SPBRGH	
	movlw	d'15'		;cargo 15 para 250k baudios a 16Mhz , BRGH=1 y BRG16=1
	movwf	SPBRG	
	movlw	b'00000100'
	movwf	TXSTA
	bank3
	movlw	b'00001000'
	movwf	BAUDCTL	
	bank0   
	movlw	b'11010000'
	movwf	RCSTA
;--------------------------------------   	
	clrf	INTCON 
	clrf	TMR0
	bsf	T0IE 
	bsf	GIE  
  	goto	Main
;*****************************
;	S U B R R U T I N A S
;*****************************
;Escritura en EE
Wree
	bank2
	movwf	EEADR
	bank3
	bcf	EEPGD
	bsf	WREN
	bcf	GIE
	movlw	0x55
	movwf	EECON2
	movlw	0xAA
	movwf	EECON2
	bsf  	WR
	bsf	GIE
	bcf  	WREN
	bank0
	btfss	EEIF
	goto	$-1	
	bcf  	EEIF
	return	
;-----------------------------------------
;Lectura en EE
Rdeew
	bank2
	movwf	EEADR
	bank3
	bcf	EEPGD
	bsf	RD
	bank2
	movf	EEDATA,w
	bank0
	return
;**************************
;	I N T E R R U P C I O N
;**************************
ServInt				;comienzo servicio de interrupción
	movlw	d'159'		;d'130'	acomodo TMR0 para 80 ciclos d'179'
	addwf	TMR0,f
;======================
;cada 104 ciclos de instruccion osea 26uS,esto quiere decir que cada bit de los
;256 que se compone el modulador,tienen un ancho de 26uS el periodo 
;T=26uSx256=0.006656s,la frecuencia F=1/T=1/0.006656s F=150.2Hz
;.........................................................
;*************************
; DIMERIZADO     
;*************************
;modulador ancho de pulso para los tres colores RGB con Strobo incorporado
	btfss	fPeriodoRGB                                         ; bit test f, skip set
	goto	NoCargaDmxRGB                                 ; ir a NoCarDmxStrobo 
	baltl	DmxStrobo,FRECSTROBO,NoStrobo         ; salto si DmxStrobo es menor que FRECSTROBO, voy a NoStrobo
	movlw	FRECSTROBO                                	;decremento FRECSTROBO veces a cntStrobo
	subwf	cntStrobo,f                                              ; subtract W from f
	bagtb	cntStrobo,DmxStrobo,PreguntaStrobo	; salto si cntStrobo es mayor que DmxStrobo, voy a PreguntaStrobo
	movlw	0xFF                                                       ; muevo l a w , 0xFF
	movwf	cntStrobo                                                ; muevo w a f , cntStrobo
	bbs	fStrobo,Apago                                               ; salto si fStrobo esta en 1 , voy a Apago
	bsf	fStrobo                                                          ; pongo en 1 fStrobo
	goto	PreguntaStrobo	                                   ; voy diecto a PreguntaStrobo
Apago	
	bcf	fStrobo                                                           ; pongo en 0 a fStrobo
PreguntaStrobo
	btfsc	fStrobo                                                   ; bit test f, skip if clear , fStrobo
	goto	NoStrobo                                               ; voy directo a No Strobo
	clrf	cntRojo                                                          ; limpio el cntRojo
	clrf	TempRojo                                                      ; limpio el TempRojo
	clrf	cntVerde                                                         ; limpio el cntverde
	clrf	TempVerde                                                     ; limpio el TempVerde
	clrf	cntAzul                                                            ; limpio el cntAzul
	clrf	TempAzul                                                        ; limpio el TempAzul
	goto	FinStrobo                                                 ;voy directo a FinStrobo	
NoStrobo
	movf	DmxRojo,w                                              ; mueve DmxRojo  a  w
	movwf	cntRojo                                                     ; mueve w  a  cntRojo
	movwf	TempRojo                                                ; mueve  w  a  TempRojo
	movf	DmxVerde,w                                              ; mueve DmxVerde  a  w
	movwf	cntVerde                                                     ; mueve w  a  cntVerde
	movwf	TempVerde                                                ; mueve  w  a  TempVerde
	movf	DmxAzul,w                                              ; mueve DmxAzul  a  w
	movwf	cntAzul                                                     ; mueve w  a  cntAzul
	movwf	TempAzul                                                ; mueve  w  a  TempAzul
FinStrobo
	bcf	fPeriodoRGB                                                   ; pongo en 0 a fPeriodoRGB
NoCargaDmxRGB
	decf	cntRojo,f                                                   ; decremento " resto1 " a cntRojo
	decf	cntVerde,f                                                 ; decremento " resto1 " a cntVerde
	decf	cntAzul,f                                                    ; decremento " resto1 " a cntAzul
;.........................................................
	movf	cntRojo,w                                                  ; muevo cntRojo   a   w
	subwf	TempRojo,w                                             ; sustraer de TempRojo    w
	btfss	_C
	goto	FinPeriodoRojo                                         ; ir a FinPeriodoRojo
	btfsc	_Z
	goto	FinPeriodoRojo                                         ; ir a FinPeriodoRojo
	bsf	pORojo                                                            ; enciende pORojo
	goto	FinRojo                                                     ; ir a FinRojo
FinPeriodoRojo
	bcf	pORojo                                                            ; apaga pORojo
FinRojo	
;.........................................................
	movf	cntVerde,w                                                  ; muevo cntVerde   a   w
	subwf	TempVerde,w                                             ; sustraer de TempVerde    w
	btfss	_C
	goto	FinPeriodoVerde                                         ; ir a FinPeriodoVerde
	btfsc	_Z
	goto	FinPeriodoVerde                                         ; ir a FinPeriodoVerde
	bsf	pOVerde                                                            ; enciende pOVerde
	goto	FinVerde                                                     ; ir a FinVerde
FinPeriodoVerde
	bcf	pOVerde                                                            ; apaga pOVerde
FinVerde
;.........................................................
	movf	cntAzul,w                                                  ; muevo cntAzul   a   w
	subwf	TempAzul,w                                             ; sustraer de TempAzul    w
	btfss	_C
	goto	NoFinPeriodoAzul                                         ; ir a FinPeriodoAzul
	btfsc	_Z
	goto	FinPeriodoAzul                                     ; ir a NoAzulFinPeriodoAzul
                                                                                      ; aca me paso que puse debajo de  _C   FinPeriodoAzul y debajo de  _Z   NoFinPeriodoAzul y dejo de funcionar
	bsf	pOAzul                                                            ; enciende pOAzul
	goto	FinAzul                                                     ; ir a FinAzul
FinPeriodoAzul
	bsf	fPeriodoRGB
NoFinPeriodoAzul
	bcf	pOAzul                                                            ; apaga pOAzul
FinAzul
;*******************
;  Division
;*******************
Division
    clrf           Auxiliar
    clrf           Cociente
    movf        DmxDim,w
    movwf     Auxiliar
Div
    incf           Cociente,1
    movf       .255,w
    subwf      Auxiliar,1
    btfsc       _C
    goto         Div
    decfsz      Cociente,1
;**********************
; Multiplicacion
;**********************
Multiplicar
		clrf	      DmxRojo		         	;borramos para inicializar
		clrf	      Result_H
		movf    DmxDimRojo,f			      ;Si es cero...
		btfsc	_Z			                     ;En Caso que el Factor "B" Sea Cero
		return					        	;volver con resultado= 0
		movf	Cociente,w			       ;cargamos el Factor "A"
Mult_Bucle
		addwf	DmxRojo,f			;Sumamos "A", Tantas veces como sea "B"
		btfsc	_C			               ;Existe Acarreo?...
		incf	       Result_H,f		        	;...Si. Incrementamos el byte Mayor
		decfsz	DmxDimRojo,f			;Termin&#243; la Multiplicaci&#243;n?...
		goto	Mult_Bucle			;... No, Seguimos haciendo sumas.
		return						;Si. Volvemos a la rutina principal


;======================
	decfsz	Tic5ms,f	;comienzo modulo de 5ms	
	goto	FinTimer	
	movlwf	BASE5MS,Tic5ms	
	movf	Tiempo5ms,f	
	btfss	_Z
	decf	Tiempo5ms,f
;cada 5ms
;...............................................
;======================
FinTimer			;fin del TIMER
	mIntEpilog
	retfie
;*****************************
;	M A I N   
;*****************************
Main
;	if	0
	clrf	EstadoA
	bsf	fTareaA
;======================
;	T A R E A   A      		17/12/13 OK	CON MAQUINA DE ESTADOS ************								
;======================
TareaA
	bbc	fTareaA,FinTareaA
;................................................
DespachadorA			;comienzo despachador TareaA
	movfwf	EstadoA,TempA
	movlwf	High TablaDespA,PCLATH
	movlw	Low TablaDespA
	addwf	TempA,w
	btfsc	_C
	incf	PCLATH,F
	movwf	PCL
;................................................
TablaDespA			;Tabla del despachador 
	goto	EstadoA0
	goto	EstadoA1
	goto	EstadoA2
	goto	EstadoA3
	goto	EstadoA4
;................................................
EstadoA0			;E R R O R   S E R I A L   O V E R R U N
	bcf	CREN		;reset the receiver logic
	bsf	CREN		;enable reception again
	incf	EstadoA,f
	goto	FinTareaA
;................................................
EstadoA1			;E S P E R O   P O R   E L   B R E A K
	btfsc	RCIF		
	movf	RCREG,w
	btfss	OERR
	goto	EA1_0
	movlwf	EA0,EstadoA	;Error de Overrun,empiezo todo de nuevo
	goto	FinTareaA
EA1_0
	btfss	FERR
	goto	FinTareaA	;voy a seguir esperando el break 
	movf	RCREG,w	;el break es OK , voy a buscar el star 
	incf	EstadoA,f
	goto	FinTareaA
;................................................
EstadoA2			; I N I C I A   R E G   Y   L E C T U R A   D E   D I P   S W 
	clrf	cntByteH		;el byte es cero,start ok,entonces inicio registros
	clrf	cntByteL
	clrf	NumCh
	movlw	PtrBuffer		;cargo puntero del descriptor
	movwf	FSR
	clrf	DipH		;inicializo solo la parte alta del Dipsw
	clrf	DipL
	btfsc	pIDipSw1
	bsf	DipL,0	
	btfsc	pIDipSw2	
	bsf	DipL,1	
	btfsc	pIDipSw3	
	bsf	DipL,2		;colocarlo en 1 cuando se haga la modificacion		
	btfsc	pIDipSw4	
	bsf	DipL,3
	btfsc	pIDipSw5	
	bsf	DipL,4
	btfsc	pIDipSw6	
	bsf	DipL,5
	btfsc	pIDipSw7	
	bsf	DipL,6
	btfsc	pIDipSw8	
	bsf	DipL,7
	btfsc	pIDipSw9	
	bsf	DipH,0
	incf	EstadoA,f
	goto	FinTareaA
;................................................
EstadoA3			;E S P E R O   P O R   E L   S T A R
	btfss	RCIF		
	goto	FinTareaA	;WaitForStart	;sigo esperando star
	btfss	OERR
	goto	EA3_0
	movlwf	EA0,EstadoA	;Error de Overrun,empiezo todo de nuevo
	goto	FinTareaA
EA3_0
	btfsc	FERR
	goto	FinTareaA	;WaitForStart	;sigo esperando star
	movf	RCREG,w	;entro un byte sin error
	andlw	0xff		;entonces pregunto si es cero 
	btfsc	_Z
	goto	EA3_1
	movlwf	EA1,EstadoA	;si es distinto de cero vuelvo a esperar otro break
	goto	FinTareaA
EA3_1	
	incf	EstadoA,f
	goto	FinTareaA
;................................................
EstadoA4			;E S P E R O   D A T O S
	btfss	FERR
	goto	EA4_0
	movlwf	EA1,EstadoA
EA4_0
	btfss	RCIF		;pregunto si un byte es recibido correctamente
	goto	FinTareaA	;WaitForData	;espero por el dato	
	btfss	OERR		;pregunto si hubo overrun
	goto	EA4_1
	movlwf	EA0,EstadoA	;Error de Overrun,empiezo todo de nuevo
	goto	FinTareaA
EA4_1	
	movf	RCREG,w	;leo el registro y al mismo tiempo borra errores
	movwf	DatoRx		;cargo el dato
	incf	cntByteL,f
	btfsc	_Z
	incf	cntByteH,f
;	movf	DipL,f		;agregar para detectar el canal 0 del dip y no hacer nada
;	btfss	_Z		;tambien habria que borrar los datos de los registros 	
;	goto	EA4_2		;de los moduladores por si cambian el dip a cero con
;	movf	DipH,f		;algun dato en las salidas
;	btfsc	_Z
;	goto	EA4_3	
;EA4_2
	boltb	cntByteH,cntByteL,DipH,DipL,EA4_3 
	bael	NumCh,NUMCH,EA4_3 
	incf	NumCh,f			;incrementa cntcanales
	movfwf	DatoRx,INDF		;cargo con el dato correspondiente al dipsw
	incf	FSR,f			;incremento fsr para cargar el proximo dato
EA4_3					;a partir de aca borrar canales por las dudas
	btfss	cntByteH,1
	goto	FinTareaA
	movlwf	EA1,EstadoA
	goto	FinTareaA
;................................................
FinTareaA
	goto	TareaA
;	endif
;**********************************************************************************
;**********************************************************************************
	if	0
;--------------------------------------
;SIN MAQUINA DE ESTADOS
;--------------------------------------
;E R R O R   S E R I A L   O V E R R U N
ErrSerialOverr			
	bcf	CREN		;reset the receiver logic
	bsf	CREN		;enable reception again
;--------------------------------------
;E S P E R O   P O R   E L   B R E A K
WaitBreak			
	btfsc	RCIF		
	movf	RCREG,w
	btfsc	OERR
	goto	ErrSerialOverr	;Error de Overrun,empiezo todo de nuevo
	btfss	FERR
	goto	WaitBreak	;voy a seguir esperando el break 
	movf	RCREG,w	;el break es OK , voy a buscar el star 
;--------------------------------------
; I N I C I A   R E G     
	clrf	cntByteH		;el byte es cero,start ok,entonces inicio registros
	clrf	cntByteL
	clrf	NumCh
	movlw	PtrBuffer		;cargo puntero del descriptor
	movwf	FSR	
;--------------------------------------
;L E C T U R A   D E   D I P   S W
	clrf	DipH		;inicializo solo la parte alta del Dipsw
	clrf	DipL
	btfsc	pIDipSw1
	bsf	DipL,0	
	btfsc	pIDipSw2	
	bsf	DipL,1	
	btfsc	pIDipSw3	
	bsf	DipL,2		;colocarlo en 1 cuando se haga la modificacion		
	btfsc	pIDipSw4	
	bsf	DipL,3
	btfsc	pIDipSw5	
	bsf	DipL,4
	btfsc	pIDipSw6	
	bsf	DipL,5
	btfsc	pIDipSw7	
	bsf	DipL,6
	btfsc	pIDipSw8	
	bsf	DipL,7
	btfsc	pIDipSw9	
	bsf	DipH,0
;--------------------------------------
;E S P E R O   P O R   E L   S T A R
WaitForStart			
	btfss	RCIF		
	goto	WaitForStart	;sigo esperando star
	btfsc	OERR
	goto	ErrSerialOverr	;Error de Overrun,empiezo todo de nuevo
	btfsc	FERR
	goto	WaitForStart	;sigo esperando star
	movf	RCREG,w	;entro un byte sin error
	andlw	0xff		;entonces pregunto si es cero 
	bnz	WaitBreak	;si es distinto de cero vuelvo a esperar otro break
;--------------------------------------
;E S P E R O   D A T O S
WaitForData
	btfsc	FERR
	goto	WaitBreak
	btfss	RCIF		;pregunto si un byte es recibido correctamente
	goto	WaitForData	;espero por el dato	
	btfsc	OERR		;pregunto si hubo overrun
	goto	ErrSerialOverr	;error de Overrun,empiezo todo de nuevo
	movf	RCREG,w	;leo el registro y al mismo tiempo borra errores
	movwf	DatoRx		;cargo el dato
	incf	cntByteL,f
	btfsc	_Z
	incf	cntByteH,f
	boltb	cntByteH,cntByteL,DipH,DipL,Llegoa512 
	bael	NumCh,NUMCH,Llegoa512 
	incf	NumCh,f			;incrementa cntcanales
	movfwf	DatoRx,INDF		;cargo con el dato correspondiente al dipsw
	incf	FSR,f			;incremento fsr para cargar el proximo dato
Llegoa512 
	btfss	cntByteH,1
	goto	WaitForData
	goto	WaitBreak
	endif
;--------------------------------------
	end
























	
