TODOPIC
Mecatrónica => DMX512 - Diseños y Proyectos => Mensaje iniciado por: Aureo 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.
-
Claro que interesa! :)
Suerte con el proyecto. :mrgreen:
-
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*************************
-
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
(http://www.behringer.com//LC2412/LC24124_big.jpg)
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 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
(http://www.behringer.com//LC2412/LC24124_big.jpg)
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
-
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
(http://www.behringer.com//LC2412/LC24124_big.jpg)
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