;*****************************************************************
;receptor dmx - decodifica 3 canales - dos motores pap y velocidad
; Norberto Pellegrini - Todopic Electronica
;*****************************************************************
;24/12/06 12:09a.m. HAY QUE EMPLEAR EL MICRO A 20 MHZ
; verificacion de tiempos y compensacion con NOP de las tramas
;*****************************************************************
list p=16f628
#include p16f628.inc
ERRORLEVEL -302, -307 ;(NO FIGURAN LOS ERRORES DE CAMBIO DE PAGINA)
CBLOCK H'20' ;32 decimal H'0C'
;ASIGNACION DE REGISTRO DE USO GENERAL
CONTA_T ;TIEMPO DEL BREAK, DE 88 uS
CONTABIT ;8 BIT DE DATOS
CHANEL ;CONTADOR DE CANALES LEIDOS POR EL RECEPTOR
DIPSWICH ;seteos de direccion
DIPSWICH_MAS1 ;DIRECCION MAS UNO O SIGUIENTE
DIPSWICH_MAS2 ;DIRECCION MAS DOS
DATOS ;BYTE DE RECEPCION RS485 DE DMX
POSICION
PASOS_PAN
PASOS_TILT
CONTA_PASOS_PAN
CONTA_PASOS_TILT
CONTA_PAN ;CONTADOR DE TABLA DE PASOS DEL MOTOR
CONTA_TILT ;CONTADOR DE LA TABLA DEL SEGUNDO MOTOR
DESTELLO
DESTELLO1 ;SON LOS CONTADORES PARA PRODUCIR EL
DESTELLO2 ;DESTELLO DEL LED INDICADOR DE FALTA DE SEÑAL DMX
VELOCIDAD
COMPENSAR ;TIEMPO A COMPENSAR EN LOS DELAY PARA REDUCIR LA VELOCIDAD AL ESTAR MAS CERCA DE LA POSICION
RESTO
RETARDO
PUERTO ; BYTE AUXILIAR PARA FORMAR EL AND DE LAS SALIDAS AL PUERTO B
LOOP1
LOOP2
LOOP3
ENDC
#DEFINE DMX PORTA,3 ; en el prototipo era 4
#DEFINE FC_PAN PORTA,1
#DEFINE FC_TILT PORTA,2
#DEFINE LED PORTA,0
__CONFIG _HS_OSC & _WDT_ON & _PWRTE_ON & _CP_OFF & _BODEN_ON & _LVP_OFF & _MCLRE_OFF
; osc 20 mhz
;**********************************************************************
RESET org 00h ;el vector de reset es la dirección 00
goto INICIO ;se salta al inicio del programa
;**********************************************************************
org 05h
;*************** SUBRUTINA DE RETARDO DE 2 Us **************
;-------------------------------------------------------------
DEMORA2US ; ES EN REALIDAD DE 1.8 uS PARA COMPENZAR
NOP ;1 uS
NOP
CLRWDT
NOP
NOP ;1 uS
RETURN
;**********************************************************************************
;##################################################################################
;**********************************************************************************
;TABLA DE POSICIONAMIENTO DE LOS MEDIO PASOS DEL MOTOR PAP DE PANORAMICO
TABLA_PAN ADDWF PCL,F
GOTO CORREGIR1
RETLW B'11110001' ;LOS 4 BIT DE MAYOR PESO ESTAN EN UNO PARA HACER BUNA AND ENTRE TABLAS
RETLW B'11110011'
RETLW B'11110010'
RETLW B'11110110'
RETLW B'11110100'
RETLW B'11111100'
RETLW B'11111000'
ULTIMO RETLW B'11111001'
MOVLW .1 ;LIMITE MAXIMO DE LA TABLA
MOVWF CONTA_PAN
GOTO TABLA_PAN+2
;---------------------------------------------------------------------------------------------
CORREGIR1 ;SI ERA CERO, LO PASO AL VALOR 8 DE LA TABLA (LIMITE MINIMO DE LA TABLA)
MOVLW .8
MOVWF CONTA_PAN
GOTO ULTIMO
;************************************************************************************************
;################################################################################################
;************************************************************************************************
;TABLA DE POSICIONAMIENTO DE LOS MEDIO PASOS DEL MOTOR PAP DE TILT
TABLA_TILT ADDWF PCL,F
GOTO CORREGIR2
RETLW B'00011111' ;LOS 4 BIT DE MENOR PESO SON 1 PARA HACER UNA AND ENTRE LAS TABLAS
RETLW B'00111111'
RETLW B'00101111'
RETLW B'01101111'
RETLW B'01001111'
RETLW B'11001111'
RETLW B'10001111'
ULTIMO2 RETLW B'10011111'
MOVLW .1 ;LIMITE MAXIMO DE LA TABLA
MOVWF CONTA_TILT
GOTO TABLA_TILT+2
;---------------------------------------------------------------------------------------------
CORREGIR2 ;SI ERA CERO, LO PASO AL VALOR 8 DE LA TABLA (LIMITE MINIMO DE LA TABLA)
MOVLW .8
MOVWF CONTA_TILT
GOTO ULTIMO2
;************************************************************************************************
;############################ PROGRAMA PRINCIPAL ##############################################
;************************************************************************************************
INICIO
MOVLW 0x07
MOVWF CMCON ;PARA EL 16F628, ELIMINO LOS COMPARADORES, TODAS SALIDAS DIGITALES
BSF STATUS,RP0 ;BANCO 1
MOVLW B'00000000' ; 8 TODAS SALIDAS PARA CONTROLAR 2 MOTORES PAP
MOVWF TRISB
MOVLW B'11111110' ;1 SALIDAS
MOVWF TRISA
BCF STATUS,RP0 ;BANCO 0
CLRF TMR0
; MOVLW B'11111111'
CLRF PORTB ;coloco en cero las salidas
CLRF PORTA
CLRF DATOS
CLRF CHANEL
BCF LED
MOVLW .1
MOVWF CONTA_PASOS_PAN
MOVWF CONTA_PASOS_TILT
MOVWF CONTA_PAN
MOVWF CONTA_TILT
MOVWF PASOS_PAN
MOVWF PASOS_TILT
CALL DEMORA
CLRF PUERTO
CLRF PORTB
CLRWDT
PAGESEL POSICION_CERO
LCALL POSICION_CERO ;BUSQUEDA DE LOS CEROS DE CADA EJE
;*************************************************************************************************
;##################### PULSO DE ARRANQUE O SINCRONISMO BREAK ####################################
;**************************************************************************************************
;ESPERA LA LLEGADA DEL PULSO BREAK, QUE TIENE QUE SER DE AL MENOS 88 uS A 1 SEGUNDO, SINO ES ERROR
;ESTE PULSO BAJO DE 88 uS INDICA EL COMIENZO DE LA TRAMA DMX, QUE ES CICLICA
BREAK
CLRWDT
;------------------------------------------------------------------------------------
MOVLW 0x07
MOVWF CMCON ;PARA EL 16F628, ELIMINO LOS COMPARADORES, TODAS SALIDAS DIGITALES
BSF STATUS,RP0 ;BANCO 1
MOVLW B'00000000' ; 8 entradas PARA ASIGNAR UNA DE LAS 255 DIRECCIONES POSIBLES
MOVWF TRISB
MOVLW B'11111110' ;1 SALIDAS
MOVWF TRISA
BCF STATUS,RP0 ;BANCO 0
PAGESEL DEMORA2US
;------------------------------------------------------------------------------
;LEER EL CANAL DMX SETEADO EN LOS DIP SWICH
MOVLW .1 ;PORTB,W
MOVWF DIPSWICH ;DIRECCION DMX QUE SE ASIGNA EMPLEANDO 8 DIP SWICH (EN BINARIO)
INCF DIPSWICH,W
MOVWF DIPSWICH_MAS1 ;ES UN VALOR MAS DE LA DIRECCION ASIGNADA
INCF DIPSWICH_MAS1,W
MOVWF DIPSWICH_MAS2 ;ES DOS VALORES MAS DE LA DIRECCION ASIGNADA
MOVLW .80
MOVWF CONTA_T
MOVLW .255 ;PARA QUE EMPIECE A CONTAR DESDE EL CANAL CERO
MOVWF CHANEL
;---------------------------------------------------------------------------
CONTINUAR
DECFSZ DESTELLO2,F ;RETARDOS EN LOS DESTELLOS A LA ESPERA DE SEÑAL DMX
GOTO ES_CERO
DECFSZ DESTELLO1,F
GOTO ES_CERO
INCF DESTELLO,F
BCF LED ;MIENTRAS ESTA EN CERO APAGO EL LED INDICADOR DE SE¥AL DMX
BTFSC DESTELLO,2 ; Y QUEDARA DESTELLANDO LENTO
BSF LED
ES_CERO
BTFSC DMX ;ES LA ENTRADA DMX CERO?, SI SALTAR
GOTO BREAK
DECFSZ CONTA_T,F ;SI LLEGA A CERO, ES PORQUE EL BREAK DURO POR LO MENOS 88 uS (80)
GOTO ES_CERO
BTFSS DMX ;ESPERO A QUE TERMINE EL PULSO DE BREAK, POR SI ES MAYOR A 88 US
GOTO $-1 ;Y DETERMINO EL COMIENZO DEL PULSO "MARK" QUE ES ALTO (UNO) DE 8 uS
MARK ; DURACION DE 8 uS EN ALTO
CALL DEMORA2US ;2 uS, VERIFICO A LA MITAD DEL PULSO
BTFSS DMX ; MITAD DEL PRIMER PULSO, LEO SI ESTA EN UNO
GOTO BREAK ;HAY ERROR
CALL DEMORA2US ;FINAL DEL PRIMER PULSO
CALL DEMORA2US ;PRIMER MITAD DEL 2DO PULSO
BTFSS DMX ; MITAD DEL SEGUNDO PULSO
GOTO BREAK ;HAY ERROR
PROX ;<---------SINCRONIZACION DEL PULSO DE START #########################################################
INCF CHANEL,F
;SI EL NUMERO DE CANAL ES XX SETEADO CON LOS DIPSWICH
; VER EL VALOR DE DATA, Y ACTUAR
BTFSC DMX ;ME QUEDO ESPERANDO LOS 2uS FINALES DE MARK
GOTO $-1 ;HASTA QUE APAREZCA EL PULSO BAJO DE START
;AL DETECTAR EL BAJO DE STAR, ME
;CALL DEMORA2US ;DESPLAZO A LA MITAD DEL PRIMER BIT
NOP
CLRWDT
NOP
MOVLW .8
MOVWF CONTABIT ;CADA BIT DURA 4 uS
START ;CAIGO EN LA MITAD DEL PULSO START, QUE TIENE QUE SER BAJO
BSF LED
CLRF DATOS
BTFSC DMX ;SI ES BAJO, ESTA CORRECTO, SI ES UNO, ES ERROR, ASI QUE ESPERO LA PROXIMA SECUENCIA
GOTO BREAK
NOP
CLRWDT
NOP
OTRO
CALL DEMORA2US
; CALL DEMORA2US ; MITAD DEL BIT 0
NOP
NOP
CLRWDT
NOP
RRF DATOS,F
BCF DATOS,7
BTFSC DMX
BSF DATOS,7
DECFSZ CONTABIT,F
GOTO OTRO
; CALL DEMORA2US
CLRWDT
;STOP ;DOS BIT DE STOP EN ALTO, SOLO DETECTO EL PRIMERO Y PROCESO LA INFO
; BTFSS DMX ;MIRO EN LA MITAD DEL PRIMER BIT DE STOP EN ALTO (A LOS 38 uS)
; GOTO BREAK ;HAY ERROR
;-----------------PRIMER CANAL - DATOS DEL CANAL MOTOR PAP PAN
CANAL1
MOVF CHANEL,W
XORWF DIPSWICH,W
BTFSS STATUS,Z
GOTO SIGUIENTE
;TOMO EL DATO DMX PARA EL CONTROL DE PAN
;NOP
;NOP
;NOP
MOVF DATOS,W ;cambio de variable, de dato lo paso a PASOS
MOVWF PASOS_PAN ;PORTB
GOTO PROX
;-----------------SEGUNDO CANAL ------- DATOS DEL CONTROL DE TILT
SIGUIENTE
MOVF CHANEL,W ;VERIFICO EN PRIMER LUGAR,
XORWF DIPSWICH_MAS1,W ;SI LA CUENTA LLEGO A 26 (MAQUINA DE HUMO
BTFSS STATUS,Z ;SI ES IGUAL, SALTA, SINO VA AL PROXIMO
GOTO SIGUIENTE3
;NOP
;NOP
;NOP
MOVF DATOS,W
MOVWF PASOS_TILT
GOTO PROX
;-----------------TERCER CANAL
SIGUIENTE3
MOVF CHANEL,W ;VERIFICO EN PRIMER LUGAR,
XORWF DIPSWICH_MAS2,W ;SI LA CUENTA LLEGO A 26 (MAQUINA DE HUMO
BTFSS STATUS,Z ;SI ES IGUAL, SALTA, SINO VA AL PROXIMO
GOTO PROX ;NO ES NINGUNO DE LOS 3 VALORES, SIGO ESPERANDO AL CANAL CORRESPONDIENTE
MOVF DATOS,W
MOVWF VELOCIDAD ;RETARDOS EN LOS AVANCES DE LOS MOTORES DE PAN Y TILT
GOTO COMPARAR
;****************************************************************************************************
;******** posicionamiento de LOS MOTORES**********************************************************
;****************************************************************************************************
;>>>>>>>>>>> MOTOR DE PAN <<<<<<<<<<<<<<<<<<<<
COMPARAR ;VERIFICA SI LLEGO AL LUGAR PARA DETENERSE, O TIENE QUE GIRAR A DERECHA O IZQUIERDA
; Comparar
CLRF STATUS
MOVF PASOS_PAN,W ;VALOR LEIDO EN DATOS POR DMX
XORWF CONTA_PASOS_PAN,W ;y lo compara con la CONTA_PASOS_PAN QUE ES EL VALOR DE POSICION ACTUAL
BTFSS STATUS,Z ;¨ Son iguales ?
GOTO NOT_EQ1 ;PASOS ES DISTINTO A CUENTA_PASOS, TIENE QUE CALCULAR PARA DONDE GIRAR
GOTO EQ1 ;PASOS ES IGUAL A CUENTA_PASOS, TIENE QUE DETENER MOTOR
EQ1 ;NO SE REALIZA NINGUNA VARIACION EN LOS DELAY PATRONES
; CLRF COMPENSAR ;NO HAY VARIACION DE TIEMPOS, Y DETENER EL MOTOR
GOTO COMPARAR2 ;BREAK ;IR A DETECTAR EL COMIENZO DE LA PROXIMA TRAMA DMX
NOT_EQ1
MOVF PASOS_PAN, W
SUBWF CONTA_PASOS_PAN,W ;F-W GUARDO RESULTADO EN W
BTFSS STATUS, C
GOTO GIRO_DERECHA1
GOTO GIRO_IZQUIERDA1
GIRO_DERECHA1
INCF CONTA_PASOS_PAN,F
INCF CONTA_PAN,F ;CONTADOR DE TABLA DE SECUENCIA PARA EL PAP
MOVLW .255 ;ESTE ERA EL VALOR DEL TEMPORIZADOR
MOVWF COMPENSAR
MOVF CONTA_PASOS_PAN,W
SUBWF PASOS_PAN,W
MOVWF COMPENSAR ; PROPORCIONAL AL RETARDO, MAS LEJOS, MENOS TIEMPO
GOTO COMPARAR2 ;NDP
GIRO_IZQUIERDA1
DECF CONTA_PASOS_PAN,F
DECF CONTA_PAN,F ;CONTADOR DE TABLA DE SECUENCIA PARA EL PAP
MOVLW .255 ;ESTE ERA EL VALOR DEL TEMPORIZADOR
MOVWF RESTO
MOVF PASOS_PAN,W
SUBWF CONTA_PASOS_PAN,W
SUBWF RESTO,W
MOVWF COMPENSAR ;VALOR PROPORCIONAL AL RETARDO, MAS CERCA, MAS TIEMPO
GOTO COMPARAR2 ;NDP
;***********************************************************************************************
;################ POSICIONAMIENTO DEL MOTOR DE TILT ##########################################
;***********************************************************************************************
COMPARAR2 ;VERIFICA SI LLEGO AL LUGAR PARA DETENERSE, O TIENE QUE GIRAR A DERECHA O IZQUIERDA
; Comparar
CLRF STATUS
MOVF PASOS_TILT,W ;
XORWF CONTA_PASOS_TILT,W ;y lo compara con la CONTA_PASOS QUE ES EL VALOR DE POSICION ACTUAL
BTFSS STATUS,Z ;¨ Son iguales ?
GOTO NOT_EQ2 ;PASOS ES DISTINTO A CUENTA_PASOS, TIENE QUE CALCULAR PARA DONDE GIRAR
GOTO EQ2 ;PASOS ES IGUAL A CUENTA_PASOS, TIENE QUE DETENER MOTOR
EQ2 ;NO SE REALIZA NINGUNA VARIACION EN LOS DELAY PATRONES
; CLRF COMPENSAR ;NO HAY VARIACION DE TIEMPOS, Y DETENER EL MOTOR
; GOTO BREAK ;IR A DETECTAR EL COMIENZO DE LA PROXIMA TRAMA DMX
GOTO NDP
NOT_EQ2
MOVF PASOS_TILT, W
SUBWF CONTA_PASOS_TILT,W ;F-W GUARDO RESULTADO EN W
BTFSS STATUS, C
GOTO GIRO_DERECHA2
GOTO GIRO_IZQUIERDA2
GIRO_DERECHA2
INCF CONTA_PASOS_TILT,F
INCF CONTA_TILT,F ;CONTADOR DE TABLA DE SECUENCIA PARA EL PAP
MOVLW .255 ;ESTE ERA EL VALOR DEL TEMPORIZADOR
MOVWF COMPENSAR
MOVF CONTA_PASOS_TILT,W
SUBWF PASOS_TILT,W
MOVWF COMPENSAR ; PROPORCIONAL AL RETARDO, MAS LEJOS, MENOS TIEMPO
GOTO NDP
GIRO_IZQUIERDA2
DECF CONTA_PASOS_TILT,F ;
DECF CONTA_TILT,F ;CONTADOR DE TABLA DE SECUENCIA PARA EL PAP
MOVLW .255 ;ESTE ERA EL VALOR DEL TEMPORIZADOR
MOVWF RESTO
MOVF PASOS_TILT,W
SUBWF CONTA_PASOS_TILT,W
SUBWF RESTO,W
MOVWF COMPENSAR ;VALOR PROPORCIONAL AL RETARDO, MAS CERCA, MAS TIEMPO
GOTO NDP
;************************************************************************************************
NDP MOVF CONTA_PAN,W
PAGESEL TABLA_PAN
LCALL TABLA_PAN
;DEMORA PROPORCIONAL A LA DIFERENCIA ENTRE PASOS, MAS PASOS MENOS DEMORA, ESTA MAS LEJOS...
MOVWF PUERTO
MOVF CONTA_TILT,W
PAGESEL TABLA_TILT
LCALL TABLA_TILT
ANDWF PUERTO,W ;UNO AMBAS SALIDA DE TABLA PARA SALIR POR EL PUERTO B
MOVWF PORTB
; MOVF VELOCIDAD,W ;PASO EL DATO DE VELOCIDAD LEIDO EN EN TERCER CANAL
; MOVWF COMPENSAR ;AL CONTADOR DE DEMORAS COMPENSAR
; CALL DEMORA
GOTO BREAK ;GOTO COMPARAR
;;*********************************************************************************************
DELAY CALL DEMORA ;RETARDO ENTRA PASOS, VARIABLE SEGUN LA DIFERENCIA DE PASOS
DECFSZ COMPENSAR,F ;A MAS PASOS, MENOS DEMORA, AL ESTAR MAS CERCA, INCREMENTA LA DEMORA
GOTO DELAY ;PARA QUE EL MOTOR SE ACERQUE DE FORM MAS SUAVE
RETURN
DEMORA
MOVLW .2
MOVWF LOOP1
OTRO2 NOP
CLRWDT
DECFSZ LOOP1,F
GOTO OTRO2
RETURN
;#################################################################################################
ORG 100H
POSICION_CERO ;EN EL ENCENDIDO, AMBOS EJES GIRAN HASTA ENCONTRAR EL FIN DE CARRERA RESPECTIVO
; Y COLOCAR EN CERO LOS CONTADORES CRRESPONDIENTES
MOVLW .255
MOVWF CONTA_PASOS_TILT
MOVWF CONTA_PASOS_PAN
MOVWF POSICION
BUSCAR_CERO
; GIRO_IZQUIERDA DEL MOTOR DE TILT, EN BUSQUEDA DE LLEGAR AL FIN DE CARRERA, PARA SU POSICION DE CERO
BTFSS FC_TILT ;ESTA TOCANDO EL FIN DE CARRERA DE TILT
GOTO $+3
DECF CONTA_PASOS_TILT,F ;
DECF CONTA_TILT,F ;CONTADOR DE TABLA DE SECUENCIA PARA EL PAP
BTFSS FC_PAN ;ESTA TOCANDO EL FIN DE CARRERA DE PAN
GOTO $+3
DECF CONTA_PASOS_PAN,F ;
DECF CONTA_PAN,F ;CONTADOR DE TABLA DE SECUENCIA PARA EL PAP
MOVF CONTA_PAN,W
PAGESEL TABLA_PAN
LCALL TABLA_PAN
MOVWF PUERTO
MOVF CONTA_TILT,W
PAGESEL TABLA_TILT
LCALL TABLA_TILT
ANDWF PUERTO,W ;UNO AMBAS SALIDA DE TABLA PARA SALIR POR EL PUERTO B
MOVWF PORTB
PAGESEL DELAY2
LCALL DELAY2
LCALL DELAY2
DECFSZ POSICION,F
GOTO BUSCAR_CERO ;REPITE ESTE LOOP UN MAXIMO DE 255 VECES, PARA ASEGURARNOS SI ESTAN EN EL LADO OPUESTO
CLRF CONTA_PASOS_PAN
CLRF CONTA_PASOS_TILT
; INCF CONTA_PASOS_TILT,F ;ME ASEGURO QU TOMEN EL VALOR UNO
; INCF CONTA_PASOS_PAN,F
RETURN
;************************************************************************************************
DELAY2
MOVLW .150
MOVWF LOOP3
MOVLW .100
MOVWF LOOP1
OTRO22 NOP
NOP
NOP
NOP
NOP
NOP
CLRWDT
DECFSZ LOOP1,F
GOTO OTRO22
DECFSZ LOOP3,F
GOTO OTRO22-2
INCF DESTELLO,F
BCF LED
BTFSC DESTELLO,2 ; DESTELLO DEL LED INDICADOR DMX, EN ESTE CASO, INDICA QUE SE ESTA POSICIONANDO A CERO
BSF LED
RETURN
END