Autor Tema: Receptor DMX  (Leído 9631 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Aureo

  • PIC10
  • *
  • Mensajes: 9
Receptor DMX
« en: 14 de Junio de 2006, 12:43:48 »
Estoy haciendo un receptor de dmx con un 16f873, se trata de recibir la trama dmx, decodificarla y extrayendo el byte de control del canal efectura un control de modulación de anchura de pulsos sobre tres leds de alto brillo (luz RGB).

Por el momento he decodificado la trama mediante la USART, tal como hablamos en el post del pic16f873 y su usart.

El control lo hago con los dos pwm's que me trae de serie el pic más un tercero que implemento via soft. a partir del tmr0.

Si interesa, ya seguiremos hablando de ello.

Desconectado aitopes

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5100
    • uControl
Re: Receptor DMX
« Respuesta #1 en: 14 de Junio de 2006, 13:20:59 »
Claro que interesa!  :)

Suerte con el proyecto. :mrgreen:
Si cualquier habilidad que aprende un niño será obsoleta antes de que la use, entonces, ¿qué es lo que tiene que aprender? La respuesta es obvia:
La única habilidad competitiva a largo plazo es la habilidad para aprender
“. Seymour Papert

Desconectado Aureo

  • PIC10
  • *
  • Mensajes: 9
Re: Receptor DMX
« Respuesta #2 en: 15 de Junio de 2006, 11:37:50 »
Este es el codigo de tratamiento de la interrupción.
Solo me interesan dos interrupciones, la producida al acabar una recepción del puerto USART y la que me lanze el TMR0 ya que es el temporizador que uso para generarme el PWM que le falta al 873. Uso 3 PWM dos de Hard y el del TMR0 por soft, ya hablaremos más adelante de ello.

El registro FLURI es un registro apuntador que me he creado simplemente para poder llevar la cuenta de lo que ha hecho el programa. Para determinar los estados que ha generado.

Para determinar el numero de canal, al restar el contador con el numero del canal hay tres soluciones posibles que me interesan, puesto que controlo tres canales con el receptor. De esa resta me interesan 0, 1 y 2 ya que será el canal en el que estoy, el siguiente y el tercero que uso. Esos son los 3 canales que he de guardar para su posterior tratemiento.

Ahi va el codigo, a ver que os parece.


;*****************************************RUTINAS DE TRATAMIENTO DE LA INTERRUPCION******


;**INTERRUPCION USART*****ACTUALIZACION DE DUTY DE  MODULACION DE ANCHURA DE PULSOS******
   ;_____________________________________
   BCF      STATUS,RP0   ;CAMBIO AL BANCO 0
   ;_____________________________________

INTER   BTFSC   PIR1,RCIF   ;INTERRUPCION POR RECEPCION?
      GOTO   TMR0PWM      ;NO, MIRA SI LO HA INTERRUMPIDO EL TMR0
      BCF      PIR1,RCIF   ;SI, REPONER EL FLAG DE LA RECEPCION DE DATOS
      BTFSC   RCSTA,FERR   ;ERROR DE TRAMA? SIGNIFICA QUE EL STOP BIT NO ES 1
      GOTO   FIN2      ;SI HAY FERR ES QUE HAY BREAK, SAL DE LA INTERRUPCION
      BTFSC   FLURI,.7   ;SE HAN LEIDO LOS 3 DATOS ?
      GOTO   FIN         ;SI LOS HE LEIDO, ME PIRO DE LA INTERRUPCION HASTA QUE ENTRE EN EL BREAK
      MOVF   RCREG,W      ;LECTURA DEL DATO RECIBIDO      
;   Si CTRAMA-SWITCH = 0 ->RCREG a dato1 (00)
;   Si CTRAMA-SWITCH = 1 ->RCREG a dato2 (01)
;   Si CTRAMA-SWITCH = 2 ->RCREG a dato3 (10)
;   INCREMENTO EL CONTADOR UNA VEZ HE COMPARADO EL CANAL.
      BTFSC   FLURI,.2   ;SI AUN NO SE HA LEIDO EL DATO 0, MIRALO
      GOTO   LEERDATOS   ;SI YA TENGO EL DATO 0, VAMOS A LEER DATOS
      MOVF    .0,.0
      SUBWF   RCREG      ;RESTO EL BYTE RECIBIDO A 0
      BTFSS   STATUS,C   ;MIRO EL CARRY DE LA RESTA, SI ES 0 ES QUE ES EL DATO 0
      BSF      FLURI,.2
      GOTO    FIN
LEERDATOS               ;SOLO SE ACCEDE SI EL FLAG DEL BREAK Y DEL DATO0 ESTAN A ON
      INCF   CTRAMA      ;INCREMENTO EL CONTADOR DE DATOS ORIGINALMENTE A 0
      MOVF    SWITCH,.0
      SUBWF   CTRAMA
      BTFSC   W,.2
      GOTO   FIN         ;ME SALE DE LA INTERRUPCION
      BTFSC   W,.0      ;SALTA SI (X0)
      CALL   GDATO2      ;GUARDA EL DATO 2
      BTFSS   W,.1      ;SALTA SI(10), NO SALTA(00)
      CALL   GDATO1      ;GUARDA EL DATO 1
      CALL   GDATO3      ;GUARDA EL DATO 3



;****************************************INTERRUPCION DEL TMR0*************************

TMR0PWM
   ;_____________________________________
   BSF      STATUS,RP0   ;CAMBIO AL BANCO 1
   ;_____________________________________
      BTFSC   INTCON,T0IF   ;SI INTERRUPCION DEL TMR0, ACTIVA FLURI.3
      BSF    FLURI,.3   ;FLAG PARA ACTIVAR EL TRATAMIENTO DEL PWMSOFT


FIN      RETFIE            ;ME SALE DE LA INTERRUPCION
FIN2   BCF      FLURI,.7   ;ME PONGO EL FLAG DE NO HE RECIBIDO LOS 3 DATOS
      CLRF   CTRAMA      ;ME PONGO A 0 EL CONTADOR DE DATOS RECIBIDOS
      GOTO   FIN
;***********************************************FIN DE RUTINAS*************************

Desconectado todopic

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3495
    • http://www.todopicelectronica.com.ar
Re: Receptor DMX
« Respuesta #3 en: 02 de Enero de 2007, 15:25:36 »
Hola Amigos, he implementado un receptor DMX pero con un PIC 16F628 corriendo a 20 Mhz, y la lectura esta "hecha a mano"  :D
Esta probada y verificada, y la empleo a modo ON/OFF para el control de una maquina de humo (que no era DMX hasta ahora  :mrgreen: )
Le coloque un dip swich de 8 para setear la direccion DMX, y para valores <128 permanece en OFF, al ser =>128 se activa, es decir, a la mitad del recorrido del potenciometro asignado.
Tengo una consolita Behringer como esta, y posee 2 canales auxiliares (25 y 26) para control de otros artefactos, y justamente trabaja en modo ON/OFF


el programita que escribi es el siguiente:
;*****************************************************************       
;receptor dmx para activar on-off un equipo, maquina de humo etc
; Norberto Pellegrini -
;*****************************************************************
;24/12/06 12:09a.m. HAY QUE EMPLEAR EL MICRO A 20 MHZ
; verificacion de tiempos y compensacion con NOP de las tramas
; cuando el canal asignado, lee un valor DMX >= 128 activa la salida
;si el valor es < a 128 se apaga la salida, es decir funciona on-off
;para dispositivos no dmx , flash, bola de espejos, humo etc
;27/12/06 11:19p.m.  FUNCIONA PERFECTO, LOS 2 CANALES
;*****************************************************************
    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
   DELAY   
   CONTA_T   ;TIEMPO DEL BREAK, DE 88 uS
   CONTABIT   ;8 BIT DE DATOS
   CHANEL
   ADRESS
   DIPSWICH   ;seteos de direccion
   DIPSWICH_MAS   ;DIRECCION MAS UNO O SIGUIENTE
   DATOS
   DESTELLO
   DESTELLO1
   DESTELLO2
   ENDC
   

#DEFINE   DMX   PORTA,4
#DEFINE   SALIDA1   PORTA,1
#DEFINE   SALIDA2   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

;**********************************************************************


;*************** 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
;**********************************************************************

INICIO
   
   MOVLW 0x07
   MOVWF CMCON    ;PARA EL 16F628, ELIMINO LOS COMPARADORES, TODAS SALIDAS DIGITALES

   BSF      STATUS,RP0   ;BANCO 1
   MOVLW   B'11111111'   ; 8 entradas PARA ASIGNAR UNA DE LAS 255 DIRECCIONES POSIBLES
   MOVWF   TRISB
   MOVLW   B'11111000'   ;3 SALIDAS
   MOVWF   TRISA
   BCF      STATUS,RP0   ;BANCO 0
   CLRF   TMR0

   MOVLW   B'11111111'
   MOVWF   PORTB      ;coloco en cero las salidas
   MOVWF   PORTA
   CLRF   DATOS
   CLRF   CHANEL
   BCF      SALIDA1
   BCF      SALIDA2
   BCF      LED
      CLRWDT
      
;**************************************************************************************************
;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
   ;LEER EL CANAL DMX SETEADO EN LOS DIP SWICH
   MOVF   PORTB,W
   MOVWF   DIPSWICH   ;DIRECCION DMX QUE SE ASIGNA EMPLEANDO 8 DIP SWICH (EN BINARIO)
   INCF   DIPSWICH,W   
   MOVWF   DIPSWICH_MAS   ;ES UN VALOR MAS DE LA DIRECCION ASIGNADA
   MOVLW   .80
   MOVWF   CONTA_T
   MOVLW   .255   ;PARA QUE EMPIECE A CONTAR DESDE EL CANAL CERO
   MOVWF   CHANEL
   CLRWDT

   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
   ;CALL    DEMORA2US
   NOP
   NOP
   NOP
   CLRWDT
   NOP
   NOP
   NOP
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
   
   MOVF   CHANEL,W      ;VERIFICO EN PRIMER LUGAR,
   XORWF   DIPSWICH,W      ;SI LA CUENTA LLEGO A 25 (MAQUINA DE HUMO
   BTFSS   STATUS,Z      ;SI ES IGUAL, SALTA, SINO VA AL PROXIMO
   GOTO   SIGUIENTE      ;PROX   

   BCF      SALIDA1
   BTFSC   DATOS,7   ;SI ESTA ENCENDIDO EL BIT 7, EL VALOR ES MAYOR O IGUAL A 128, MITAD DEL VALOR DMX EN MODO ON-OFF
   BSF      SALIDA1
   
;-----------------SEGUNDO CANAL
SIGUIENTE


   MOVF   CHANEL,W      ;VERIFICO EN PRIMER LUGAR,
   XORWF   DIPSWICH_MAS,W   ;SI LA CUENTA LLEGO A 26 (MAQUINA DE HUMO
   BTFSS   STATUS,Z      ;SI ES IGUAL, SALTA, SINO VA AL PROXIMO
   GOTO   PROX   

   BCF      SALIDA2
   BTFSC   DATOS,7   ;SI ESTA ENCENDIDO EL BIT 7, EL VALOR ES MAYOR O IGUAL A 128, MITAD DEL VALOR DMX EN MODO ON-OFF
   BSF      SALIDA2

;----------------------------------------



   ;GOTO   PROX
   GOTO   BREAK   ;A LA ESPERA DE UNA NUEVA SECUENCIA DE TRAMAS DMX
   
   

   END



Luego pego una fotito de como quedo el trabajito terminado  :mrgreen:

Un gran abrazo!

Norberto
« Última modificación: 02 de Enero de 2007, 15:30:10 por todopic »
Firmat - Santa Fe - Argentina

www.TodoPic.net

Solo se tiran piedras, al arbol que tiene frutos...

Desconectado ser64

  • PIC10
  • *
  • Mensajes: 4
Re: Receptor DMX
« Respuesta #4 en: 20 de Julio de 2008, 16:43:07 »
Hola Amigos, he implementado un receptor DMX pero con un PIC 16F628 corriendo a 20 Mhz, y la lectura esta "hecha a mano"  :D
Esta probada y verificada, y la empleo a modo ON/OFF para el control de una maquina de humo (que no era DMX hasta ahora  :mrgreen: )
Le coloque un dip swich de 8 para setear la direccion DMX, y para valores <128 permanece en OFF, al ser =>128 se activa, es decir, a la mitad del recorrido del potenciometro asignado.
Tengo una consolita Behringer como esta, y posee 2 canales auxiliares (25 y 26) para control de otros artefactos, y justamente trabaja en modo ON/OFF


el programita que escribi es el siguiente:
;*****************************************************************       
;receptor dmx para activar on-off un equipo, maquina de humo etc
; Norberto Pellegrini -
;*****************************************************************
;24/12/06 12:09a.m. HAY QUE EMPLEAR EL MICRO A 20 MHZ
; verificacion de tiempos y compensacion con NOP de las tramas
; cuando el canal asignado, lee un valor DMX >= 128 activa la salida
;si el valor es < a 128 se apaga la salida, es decir funciona on-off
;para dispositivos no dmx , flash, bola de espejos, humo etc
;27/12/06 11:19p.m.  FUNCIONA PERFECTO, LOS 2 CANALES
;*****************************************************************
    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
   DELAY   
   CONTA_T   ;TIEMPO DEL BREAK, DE 88 uS
   CONTABIT   ;8 BIT DE DATOS
   CHANEL
   ADRESS
   DIPSWICH   ;seteos de direccion
   DIPSWICH_MAS   ;DIRECCION MAS UNO O SIGUIENTE
   DATOS
   DESTELLO
   DESTELLO1
   DESTELLO2
   ENDC
   

#DEFINE   DMX   PORTA,4
#DEFINE   SALIDA1   PORTA,1
#DEFINE   SALIDA2   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

;**********************************************************************


;*************** 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
;**********************************************************************

INICIO
   
   MOVLW 0x07
   MOVWF CMCON    ;PARA EL 16F628, ELIMINO LOS COMPARADORES, TODAS SALIDAS DIGITALES

   BSF      STATUS,RP0   ;BANCO 1
   MOVLW   B'11111111'   ; 8 entradas PARA ASIGNAR UNA DE LAS 255 DIRECCIONES POSIBLES
   MOVWF   TRISB
   MOVLW   B'11111000'   ;3 SALIDAS
   MOVWF   TRISA
   BCF      STATUS,RP0   ;BANCO 0
   CLRF   TMR0

   MOVLW   B'11111111'
   MOVWF   PORTB      ;coloco en cero las salidas
   MOVWF   PORTA
   CLRF   DATOS
   CLRF   CHANEL
   BCF      SALIDA1
   BCF      SALIDA2
   BCF      LED
      CLRWDT
      
;**************************************************************************************************
;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
   ;LEER EL CANAL DMX SETEADO EN LOS DIP SWICH
   MOVF   PORTB,W
   MOVWF   DIPSWICH   ;DIRECCION DMX QUE SE ASIGNA EMPLEANDO 8 DIP SWICH (EN BINARIO)
   INCF   DIPSWICH,W   
   MOVWF   DIPSWICH_MAS   ;ES UN VALOR MAS DE LA DIRECCION ASIGNADA
   MOVLW   .80
   MOVWF   CONTA_T
   MOVLW   .255   ;PARA QUE EMPIECE A CONTAR DESDE EL CANAL CERO
   MOVWF   CHANEL
   CLRWDT

   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
   ;CALL    DEMORA2US
   NOP
   NOP
   NOP
   CLRWDT
   NOP
   NOP
   NOP
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
   
   MOVF   CHANEL,W      ;VERIFICO EN PRIMER LUGAR,
   XORWF   DIPSWICH,W      ;SI LA CUENTA LLEGO A 25 (MAQUINA DE HUMO
   BTFSS   STATUS,Z      ;SI ES IGUAL, SALTA, SINO VA AL PROXIMO
   GOTO   SIGUIENTE      ;PROX   

   BCF      SALIDA1
   BTFSC   DATOS,7   ;SI ESTA ENCENDIDO EL BIT 7, EL VALOR ES MAYOR O IGUAL A 128, MITAD DEL VALOR DMX EN MODO ON-OFF
   BSF      SALIDA1
   
;-----------------SEGUNDO CANAL
SIGUIENTE


   MOVF   CHANEL,W      ;VERIFICO EN PRIMER LUGAR,
   XORWF   DIPSWICH_MAS,W   ;SI LA CUENTA LLEGO A 26 (MAQUINA DE HUMO
   BTFSS   STATUS,Z      ;SI ES IGUAL, SALTA, SINO VA AL PROXIMO
   GOTO   PROX   

   BCF      SALIDA2
   BTFSC   DATOS,7   ;SI ESTA ENCENDIDO EL BIT 7, EL VALOR ES MAYOR O IGUAL A 128, MITAD DEL VALOR DMX EN MODO ON-OFF
   BSF      SALIDA2

;----------------------------------------



   ;GOTO   PROX
   GOTO   BREAK   ;A LA ESPERA DE UNA NUEVA SECUENCIA DE TRAMAS DMX
   
   

   END



Luego pego una fotito de como quedo el trabajito terminado  :mrgreen:

Un gran abrazo!

Norberto




Hola Norberto,la verdad es que me ayudo mucho tu programita para leer la trama DMX ,le hice unas pequeñas modificaciones y obtengo en el puerto c el valor DMX que envia la consola,mi problema es que solo puedo leer hasta la posicion  255,estuve viendo de agregar un bit mas al contador y guardarlo en otro registro a comparar con un dip ( n°9) para 512 ,pero no he podido hacerlo funcionar ,si podes darme alguna sugerencia de como hacerlo te lo agradeceria un monton, siempre programando en asm ya que todavia no se programar en C.
Muchas gracias

Desconectado jahir golbem

  • PIC10
  • *
  • Mensajes: 18
Re: Receptor DMX
« Respuesta #5 en: 02 de Noviembre de 2012, 02:15:42 »
Hola Amigos, he implementado un receptor DMX pero con un PIC 16F628 corriendo a 20 Mhz, y la lectura esta "hecha a mano"  :D
Esta probada y verificada, y la empleo a modo ON/OFF para el control de una maquina de humo (que no era DMX hasta ahora  :mrgreen: )
Le coloque un dip swich de 8 para setear la direccion DMX, y para valores <128 permanece en OFF, al ser =>128 se activa, es decir, a la mitad del recorrido del potenciometro asignado.
Tengo una consolita Behringer como esta, y posee 2 canales auxiliares (25 y 26) para control de otros artefactos, y justamente trabaja en modo ON/OFF


el programita que escribi es el siguiente:
;*****************************************************************       
;receptor dmx para activar on-off un equipo, maquina de humo etc
; Norberto Pellegrini -
;*****************************************************************
;24/12/06 12:09a.m. HAY QUE EMPLEAR EL MICRO A 20 MHZ
; verificacion de tiempos y compensacion con NOP de las tramas
; cuando el canal asignado, lee un valor DMX >= 128 activa la salida
;si el valor es < a 128 se apaga la salida, es decir funciona on-off
;para dispositivos no dmx , flash, bola de espejos, humo etc
;27/12/06 11:19p.m.  FUNCIONA PERFECTO, LOS 2 CANALES
;*****************************************************************
    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
   DELAY   
   CONTA_T   ;TIEMPO DEL BREAK, DE 88 uS
   CONTABIT   ;8 BIT DE DATOS
   CHANEL
   ADRESS
   DIPSWICH   ;seteos de direccion
   DIPSWICH_MAS   ;DIRECCION MAS UNO O SIGUIENTE
   DATOS
   DESTELLO
   DESTELLO1
   DESTELLO2
   ENDC
   

#DEFINE   DMX   PORTA,4
#DEFINE   SALIDA1   PORTA,1
#DEFINE   SALIDA2   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

;**********************************************************************


;*************** 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
;**********************************************************************

INICIO
   
   MOVLW 0x07
   MOVWF CMCON    ;PARA EL 16F628, ELIMINO LOS COMPARADORES, TODAS SALIDAS DIGITALES

   BSF      STATUS,RP0   ;BANCO 1
   MOVLW   B'11111111'   ; 8 entradas PARA ASIGNAR UNA DE LAS 255 DIRECCIONES POSIBLES
   MOVWF   TRISB
   MOVLW   B'11111000'   ;3 SALIDAS
   MOVWF   TRISA
   BCF      STATUS,RP0   ;BANCO 0
   CLRF   TMR0

   MOVLW   B'11111111'
   MOVWF   PORTB      ;coloco en cero las salidas
   MOVWF   PORTA
   CLRF   DATOS
   CLRF   CHANEL
   BCF      SALIDA1
   BCF      SALIDA2
   BCF      LED
      CLRWDT
      
;**************************************************************************************************
;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
   ;LEER EL CANAL DMX SETEADO EN LOS DIP SWICH
   MOVF   PORTB,W
   MOVWF   DIPSWICH   ;DIRECCION DMX QUE SE ASIGNA EMPLEANDO 8 DIP SWICH (EN BINARIO)
   INCF   DIPSWICH,W   
   MOVWF   DIPSWICH_MAS   ;ES UN VALOR MAS DE LA DIRECCION ASIGNADA
   MOVLW   .80
   MOVWF   CONTA_T
   MOVLW   .255   ;PARA QUE EMPIECE A CONTAR DESDE EL CANAL CERO
   MOVWF   CHANEL
   CLRWDT

   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
   ;CALL    DEMORA2US
   NOP
   NOP
   NOP
   CLRWDT
   NOP
   NOP
   NOP
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
   
   MOVF   CHANEL,W      ;VERIFICO EN PRIMER LUGAR,
   XORWF   DIPSWICH,W      ;SI LA CUENTA LLEGO A 25 (MAQUINA DE HUMO
   BTFSS   STATUS,Z      ;SI ES IGUAL, SALTA, SINO VA AL PROXIMO
   GOTO   SIGUIENTE      ;PROX   

   BCF      SALIDA1
   BTFSC   DATOS,7   ;SI ESTA ENCENDIDO EL BIT 7, EL VALOR ES MAYOR O IGUAL A 128, MITAD DEL VALOR DMX EN MODO ON-OFF
   BSF      SALIDA1
   
;-----------------SEGUNDO CANAL
SIGUIENTE


   MOVF   CHANEL,W      ;VERIFICO EN PRIMER LUGAR,
   XORWF   DIPSWICH_MAS,W   ;SI LA CUENTA LLEGO A 26 (MAQUINA DE HUMO
   BTFSS   STATUS,Z      ;SI ES IGUAL, SALTA, SINO VA AL PROXIMO
   GOTO   PROX   

   BCF      SALIDA2
   BTFSC   DATOS,7   ;SI ESTA ENCENDIDO EL BIT 7, EL VALOR ES MAYOR O IGUAL A 128, MITAD DEL VALOR DMX EN MODO ON-OFF
   BSF      SALIDA2

;----------------------------------------



   ;GOTO   PROX
   GOTO   BREAK   ;A LA ESPERA DE UNA NUEVA SECUENCIA DE TRAMAS DMX
   
   

   END



Luego pego una fotito de como quedo el trabajito terminado  :mrgreen:

Un gran abrazo!

Norberto





disculpa amigo tienes tu codigo en ccs o c tengo duda en como dirreccionas el canal del dmx en esta linea
MOVLW   B'11111111'   ; 8 entradas PARA ASIGNAR UNA DE LAS 255 DIRECCIONES POSIBLES
o tienes algun ejemplo en c de como hacerlo...espero puedas ayudarme


 

anything