TODOPIC

Mecatrónica => DMX512 - Diseños y Proyectos => Mensaje iniciado por: xocas en 16 de Mayo de 2015, 09:20:47

Título: AYUDA DMX 512 Receptor de 27 canales RGB
Publicado por: xocas en 16 de Mayo de 2015, 09:20:47
El tema original (creado por el usuario mattfabiani) se corrompió y me ha resultado imposible rescatarlo tal cual. Os dejo el texto de los mensajes insertados para que podáis continuar:

*******************
mattfabiani:
Este peoyecto lo encontre por internet pero no cuenta con mas informacion que esta, podrian ayudarme a diseñar el programa del PIC?
Sinceramente soy nuevo en esto e inexperto, lo que se de electronica lo aprendi de aficionado.


El proyecto es: DMX 512 Receptor de 27 canales RGB.

Como su nombre indica es un placa con capa física RS485, protocolo de entrada DMX512.
Cantidad de canales 27, la direccion DMX por hardware.
Refresco min @33ms.
Refresco max @100ms.

Canal 1-27  (RGB*9)

El circuito no cuenta con el dip switch para asiganar la direccion DMX si no que se programa en el codigo del PIC lo cual no es problema al menos para el proyecto que yo deseo montar.

KILLERJC:
A no ser que consigas el programa de alguna persona o algun proyecto con el codigo de alguien por aca no creo que nadie se ponga a desarrollarlo desde 0, ya que es demasiado largo.

Se te puede ayudar con algun problema/duda relativamente simple como algun problema en un programa, si es que ya tenes algo hecho. Requiere que sepas del protocolo DMX, e intentar implementar los PWM.
No se como estaran los tiempos de respuestas, pero puede llegar a partes que las tengas que hacer en ASM y no en C. Pero eso depende del programa.

mattfabiani:
Ok, no se nada de programar un PIC jamas hice algo asi pero voy a intentarlo, apenas tengo algo mas o menos armado, en cuanto los tiempos me lo permitan ya que trabajo, estudio y tengo un hogar que atender, voy a ir subiendo lo que voy armando para que me digan los mas expertos si voy por buen camino, gracias por tu comentario KILLERJC.

Nota: Las imágenes se han evitado debido a su excesivo tamaño. Por favor mattfabiani, limita en lo posible el uso de imágenes mayores de 1024px. Gracias
Podéis verlas aquí: Esquema (http://www.pantallafacil.com.ar/files/sch2.png) y PCB (http://www.pantallafacil.com.ar/files/pcb2.png)
*******************

un saludo
Título: Re: AYUDA DMX 512 Receptor de 27 canales RGB
Publicado por: Joseph90 en 16 de Mayo de 2015, 13:44:40
Hola mattfabiani te recomiendo que dividas el problema en partes: la recepción DMX y la parte de PWM, luego lo unes, por supuesto tienes que aprender a programar microcontroladores y estudiar el protocolo DMX512.

Saludos....   
Título: Re: AYUDA DMX 512 Receptor de 27 canales RGB
Publicado por: mattfabiani en 01 de Junio de 2015, 23:38:40
Algunos avances en este proyecto, si alguien con mas experiencia en programacion lo chequea y corrige si es necesario, no fue escrito por mi, esto es trabajo de ivanmzr ( http://neoelectro.wordpress.com )

Si es necesario se puede eliminar el Dip Switch y prefijar la direccion DMX antes de grabar el pic.

 ivanmzr :
------------
"27ch a 20Mhz con un 18F4550 el codigo esta muy desacomodado tambien puse el .hex para que lo pruebes.
Apenas esta semana me puse de nuevo a mejorar el codigo del de 3Ch terminando me pondre con el de 27ch ya que son las mismas subrutinas.
No tengo el diagrama asi que tendras que ver cuales son las salidas donde dice PWMs para abajo y para el DIP switch usa un TTL por que faltaban puertos creo. Tiene varios años asi que ya no me acuerdo bien… "

Esas eran las palabras de " ivanmzr " si alguienme ayuda a hacer las correcciones necesarias les agradecería, arriba en el principio del post esta el esquema del circuito a montar sin Dip Switch lo ideal seria adaptar todo para que funcione con el circuito planteada en un principio. desde ya gracias a todo el grupo.

Código: [Seleccionar]


list p=PIC18F4550                               ; define traget processor
    #include <P18F4550.inc>         ; include processor specific definition
           

    CONFIG CCP2MX = ON            ;RB3    como PWM
    CONFIG WDT = OFF
CONFIG STVREN = ON
CONFIG XINST = OFF
CONFIG CP0 = OFF
CONFIG FCMEN = OFF
CONFIG IESO = OFF
CONFIG PWRT = ON
CONFIG BOR = OFF
CONFIG PBADEN = OFF
CONFIG MCLRE = OFF
CONFIG LVP = OFF
CONFIG WDTPS = 32768 
CONFIG LPT1OSC = OFF
CONFIG DEBUG = OFF
CONFIG FOSC = HS    ; ECIO_EC ó EC_EC 
CONFIG PLLDIV = 1
CONFIG CPUDIV = OSC1_PLL2
    CONFIG USBDIV = 1


#DEFINE DIP9 PORTC,5
#DEFINE DIP10mic PORTC,4
;#DEFINE LEDDMX LATC,6
;#DEFINE BEAT PORTE,0
#DEFINE PS_CLOCK LATE,1
#DEFINE PS_SHIFT_NOT_LOAD LATE,2
#DEFINE PS_DATA PORTE,3



                      ; Variables
  CBLOCK  0x8
CountH                  ; 16-bit counter
CountL
DIS1
DIS2
DIS3
PWM00
PWM01
PWM02
PWM03
PWM04
PWM05
PWM06
PWM07
PWM08

;Puertos B------------------
PWM09
PWM10
PWM11
PWM12
PWM13
PWM14
PWM23
PWM24

;PUERTO D...........
PWM15
PWM16
PWM17
PWM18
PWM19
PWM20
PWM21
PWM22

;PUERTO C...........
PWM25
PWM26
;PUERTO E
PWM27

;....................
CONTADOR
CUENTA
TEMPO
LEDB
LEDD
LEDA
LEDC
;'''''''''''''''''''
;CANALES
CHANNELDMX
CHANNEL01
CHANNEL02
CHANNEL03
CHANNEL04
CHANNEL05
CHANNEL06
CHANNEL07
CHANNEL08
CHANNEL09
CHANNEL10
CHANNEL11
CHANNEL12
CHANNEL13
CHANNEL14
CHANNEL15
CHANNEL16
CHANNEL17
CHANNEL18
CHANNEL19
CHANNEL20
CHANNEL21
CHANNEL22
CHANNEL23
CHANNEL24
CHANNEL25
CHANNEL26
CHANNEL27
;........DIP....
DIPSWITCH
DIPSWITCH256
RETA1
RETA2
RETA3
PSEUDO
AZAR
noDMX
PS_REG ;registros para el 74hc165
PS_CTR ;registros para el 74Hc165
COMPARA
CUENTADIP
    RxBuffer: .512          ; 512 bytes buffer allocation

   ENDC

 ;******************************************************************************
ORG 0x0
goto    Main

ORG 0x00808
INT

RETFIE
   
Main

call    SetupSerial                     ;Setup Serial port and buffers
; call PWRon1
call LEERDIP

   
MainLoop


; dcfsnz CUENTADIP


; call SHOWME
; call LEERDIP


; bra MainLoop

call PWMs

     
; first loop, synchronizing with the transmitter

WaitBreak
call PWMs

btfsc   RCSTA,OERR
call    ERRORoverun
    btfss   PIR1,RCIF
bra WaitBreak
btfss   RCSTA,FERR
bra WaitBreak
movf    RCREG,W
   
    ; second loop, waiting for the START code
WaitForStart
call PWMs ;+++++
btfsc   RCSTA,OERR
bra     RXend
btfss   PIR1,RCIF                       ; wait until a byte is correctly received
bra WaitForStart
btfsc RCSTA,FERR
bra WaitForStart
movf    RCREG,W
; check for the START code value, if it is not 0, ignore the rest of the frame
andlw   0xff
bnz     MainLoop ; ignore the rest of the frame if not zero
; init receive counter and buffer pointer

call PWMs ;Refreso de PWMs +++++++++++++++++++++       
clrf    CountL
clrf    CountH
lfsr    0,RxBuffer

    ; third loop, receiving 512 bytes of data
WaitForData
;call PWMs ;Refreso de PWMs +++++++++++++++++++++
btfsc RCSTA,FERR          ; if a new framing error is detected (error or short frame)
bra     RXend               ; the rest of the frame is ignored and a new synchronization
           
btfsc   RCSTA,OERR
bra     RXend
    call PWMs ;Refreso de PWMs +++++++++++++++++++++

btfss   PIR1,RCIF                       ; wait until a byte is correctly received
bra WaitForData                     ;
movf    RCREG,W                         ;

MoveData

movwf   POSTINC0                        ; move the received data to the buffer
    call PWMs                             ; (auto-incrementing pointer)
incf    CountL,F            ; increment 16-bit counter
btfss   STATUS,C
bra     WaitForData
incf    CountH,F
btfss   CountH,1            ; check if 512 bytes of data received
bra     WaitForData

RXend
lfsr    0,RxBuffer          ; use indirect pointer 0 to address the receiver buffer
GetData
call PWMs

movf   LOW(CHANNEL01),w     
addwf   FSR0L,F
movf   HIGH(CHANNEL01),w
addwfc  FSR0H,F
     
movff   INDF0,CCPR1L        ;PWM 1 Puerto RC2
   
lfsr    0,RxBuffer         
;call PWMs ;Refreso de PWMs +++++++++++++++++++++
   
movf   LOW(CHANNEL02),w
addwf   FSR0L,F
movf   HIGH(CHANNEL02),w
addwfc  FSR0H,F
   
movff   INDF0,CCPR2L  ;PWM 2 Puerto RC1
   
lfsr    0,RxBuffer       
; Ahora se checan los puertos A   
;call PWMs ;Refreso de PWMs +++++++++++++++++++++
;RA0
movf   LOW(CHANNEL03),w   
addwf   FSR0L,F
movf   HIGH(CHANNEL03),w
addwfc  FSR0H,F

movff   INDF0,PWM03 ; se reservan los PWM02 y PWM01 para CCPRxL

lfsr    0,RxBuffer       

;call PWMs ;Refreso de PWMs +++++++++++++++++++++
;RA1
movf   LOW(CHANNEL04),w
addwf   FSR0L,F
movf   HIGH(CHANNEL04),w
addwfc  FSR0H,F

movff   INDF0,PWM04     

lfsr    0,RxBuffer     

    call PWMs ;refresca los PWMs 1er

;RA2
movf   LOW(CHANNEL05),w       
addwf   FSR0L,F
movf   HIGH(CHANNEL05),w
addwfc  FSR0H,F

movff   INDF0,PWM05

lfsr    0,RxBuffer

;call PWMs ;Refreso de PWMs +++++++++++++++++++++

;RA3
movf   LOW(CHANNEL06),w
addwf   FSR0L,F
movf   HIGH(CHANNEL06),w
addwfc  FSR0H,F

movff   INDF0,PWM06   

lfsr    0,RxBuffer   

;call PWMs ;Refreso de PWMs +++++++++++++++++++++

 ;RA4
movf   LOW(CHANNEL07),w
addwf   FSR0L,F
movf   HIGH(CHANNEL07),w
addwfc  FSR0H,F

movff   INDF0,PWM07   

lfsr    0,RxBuffer   

;call PWMs ;Refreso de PWMs +++++++++++++++++++++

  ;RA5
movf   LOW(CHANNEL08),w
addwf   FSR0L,F
movf   HIGH(CHANNEL08),w
addwfc  FSR0H,F

movff   INDF0,PWM08   

lfsr    0,RxBuffer

call PWMs ;Refresca los PWMs 2do

;RB0
movf   LOW(CHANNEL09),w
addwf   FSR0L,F
movf   HIGH(CHANNEL09),w
addwfc  FSR0H,F

movff   INDF0,PWM09

lfsr    0,RxBuffer

;call PWMs ;Refreso de PWMs +++++++++++++++++++++

;RB1
movf   LOW(CHANNEL10),w
addwf   FSR0L,F
movf   HIGH(CHANNEL10),w
addwfc  FSR0H,F

movff   INDF0,PWM10

lfsr    0,RxBuffer

;call PWMs ;Refreso de PWMs +++++++++++++++++++++

;RB2
movf   LOW(CHANNEL11),w
addwf   FSR0L,F
movf   HIGH(CHANNEL11),w
addwfc  FSR0H,F

movff   INDF0,PWM11

lfsr    0,RxBuffer

;call PWMs ;Refreso de PWMs +++++++++++++++++++++
 ;RB3
movf   LOW(CHANNEL12),w
addwf   FSR0L,F
movf   HIGH(CHANNEL12),w
addwfc  FSR0H,F

movff   INDF0,PWM12   

lfsr    0,RxBuffer


  call PWMs ;Refresca PWMs 3er

;RB4
movf   LOW(CHANNEL13),w
addwf   FSR0L,F
movf   HIGH(CHANNEL13),w
addwfc  FSR0H,F

movff   INDF0,PWM13   

lfsr    0,RxBuffer

; call PWMs ;Refreso de PWMs +++++++++++++++++++++

;RB5
movf   LOW(CHANNEL14),w
addwf   FSR0L,F
movf   HIGH(CHANNEL14),w
addwfc  FSR0H,F

movff   INDF0,PWM14   

lfsr    0,RxBuffer

;call PWMs ;Refreso de PWMs +++++++++++++++++++++

;RB6
movf   LOW(CHANNEL15),w
addwf   FSR0L,F
movf   HIGH(CHANNEL15),w
addwfc  FSR0H,F

movff   INDF0,PWM15   

lfsr    0,RxBuffer

;call PWMs ;Refreso de PWMs +++++++++++++++++++++

;RB7
movf   LOW(CHANNEL16),w
addwf   FSR0L,F
movf   HIGH(CHANNEL16),w
addwfc  FSR0H,F

movff   INDF0,PWM16   

lfsr    0,RxBuffer

;call PWMs ;Refreso de PWMs +++++++++++++++++++++

;RD0
movf   LOW(CHANNEL17),w
addwf   FSR0L,F
movf   HIGH(CHANNEL17),w
addwfc  FSR0H,F

movff   INDF0,PWM17   

lfsr    0,RxBuffer

  ;call PWMs ;Refresco PWMs

;RD1
movf   LOW(CHANNEL18),w
addwf   FSR0L,F
movf   HIGH(CHANNEL18),w
addwfc  FSR0H,F

movff   INDF0,PWM18

lfsr    0,RxBuffer 

call PWMs ;Refreso de PWMs +++++++++++++++++++++

 ;RD2
movf   LOW(CHANNEL19),w
addwf   FSR0L,F
movf   HIGH(CHANNEL19),w
addwfc  FSR0H,F

movff   INDF0,PWM19

lfsr    0,RxBuffer

;call PWMs ;Refreso de PWMs +++++++++++++++++++++

;RD3
movf    LOW(CHANNEL20),w
addwf   FSR0L,F
movf    HIGH(CHANNELDMX),w
addwfc  FSR0H,F

movff   INDF0,PWM20

lfsr    0,RxBuffer

;call PWMs ;Refreso de PWMs +++++++++++++++++++++

 ;RD4   
movf   LOW(CHANNEL21),w
addwf   FSR0L,F
movf   HIGH(CHANNEL21),w
addwfc  FSR0H,F

movff   INDF0,PWM21

lfsr    0,RxBuffer
 
;call PWMs ;Refresco PWMs 4to

;RD5
movf   LOW(CHANNEL22),w
addwf   FSR0L,F
movf   HIGH(CHANNEL22),w
addwfc  FSR0H,F

movff   INDF0,PWM22

lfsr    0,RxBuffer   

call PWMs ;Refreso de PWMs +++++++++++++++++++++
;RD6 
movf   LOW(CHANNEL23),w
addwf   FSR0L,F
movf   HIGH(CHANNEL23),w
addwfc  FSR0H,F

movff   INDF0,PWM23   

lfsr    0,RxBuffer   

;call PWMs ;Refreso de PWMs +++++++++++++++++++++
 ;RD7
movf   LOW(CHANNEL24),w
addwf   FSR0L,F
movf   HIGH(CHANNEL24),w
addwfc  FSR0H,F

movff   INDF0,PWM24   

lfsr    0,RxBuffer   
;RC6
movf   LOW(CHANNEL25),w
addwf   FSR0L,F
movf   HIGH(CHANNEL25),w
addwfc  FSR0H,F

movff   INDF0,PWM25

lfsr    0,RxBuffer   

call PWMs ;Refreso de PWMs +++++++++++++++++++++
;RC0 
movf   LOW(CHANNEL26),w
addwf   FSR0L,F
movf   HIGH(CHANNEL26),w
addwfc  FSR0H,F

movff   INDF0,PWM26   

lfsr    0,RxBuffer   

;call PWMs ;Refreso de PWMs +++++++++++++++++++++
 ;RE0
movf   LOW(CHANNEL27),w
addwf   FSR0L,F
movf   HIGH(CHANNEL27),w
addwfc  FSR0H,F

movff   INDF0,PWM27   

lfsr    0,RxBuffer   

    bra MainLoop ; regresa al principal



;************************************************************************
; Setup Serial port and buffers
SetupSerial
           ;Clear the receive buffer
lfsr    0,RxBuffer 
CBloop
clrf    POSTINC0            ; clear INDF register then increment pointer
incf    CountL,F
btfss   STATUS,C
bra     CBloop
incf    CountH,F
   
btfss   CountH,1
bra CBloop 
             
; Setup EUSART
clrf    BAUDCTL
EUSARTaa
; bsf TRISC,7         ; allow the EUSART RX to control pin RC7
; bsf TRISC,6         ; allow the EUSART TX to control pin RC6
CLRF PORTC
CLRF LATC
  movlw   b'10110000'      ; make pin RC1 (CCP2) output
movwf   TRISC 
movlw   0x04                    ; b00000100 Transmision deshabilatada BRGH¨=1
movwf   TXSTA                   ; enable transmission and high baud rate
     
movlw   0x90                    ; b10010000 ó b'11010000' ;
movwf   RCSTA                   ; enable serial port and reception
     
bsf BAUDCTL,BRG16   ; Enable UART for 16-bit Asyn operation
clrf    SPBRGH
   
movlw   .19                             ; Baud rate is 15 para 250KHz for 16MHz Osc. freq.
movwf   SPBRG                   ; 19 para 20Mhz con BRG8


;Setup PWM module
movlw   0x0c            ; configure CCP2 for PWM mode
movwf   CCP1CON
movwf   CCP2CON
   
;Timer2 control
movlw   b'00000101';0x04            ; enable Timer2, select a prescale of 1:1
movwf   T2CON

;PWM period
movlw   0xFF            ; 256 x .25us = 64us period
movwf   PR2

;Temporizador Timer1
movlw   b'00010001'
movwf   T1CON

;Temporizador Timer0
movlw   b'11010100' ; 8bit presaler: 1:4
movwf   T0CON

; init I/O

clrf UCON ;usb control
bsf UCFG,UTRDIS ;desactiva usb
;clrf    PORTB
movlw   b'01000000'
movwf   TRISA
;clrf TRISA
clrf    TRISB
clrf TRISD

movlw 0Ah
movwf ADCON1
MOVLW 03h
movlw 07h
movwf CMCON
clrf TRISE

clrf HIGH(DIPSWITCH)

BcF     INTCON,TMR0IE ;habilita interrupcion en TMR0
BcF     PIE1,TMR1IE    ;habilita interrupcion en TMR1
BcF     INTCON,PEIE    ;habilita interrupciones de perifericos
BcF     INTCON,GIE      ;habilita las interrupcions global

call PWRon1


clrf LATD
clrf LATB
clrf LATA
clrf LATC
clrf CCPR1L 
clrf CCPR2L 
return






PWRon1
movlw .255
movwf LATA
movwf LATD
movwf LATB
movwf CCPR1L
movwf CCPR2L
call DEMORA
call DEMORA

return
   

DEMORA 

movlw   .1
movwf   RETA1
    movlw   .155
    movwf   RETA2
DEMO5   movlw   .155
movwf   RETA3
DEMO1 decfsz  RETA3,1
        goto    DEMO1
        decfsz  RETA2,1
        goto    DEMO5
decfsz  RETA1,1
        goto    DEMO5

return

ERRORoverun
; bsf PORTB,2
call PWMs ;Refreso de PWMs +++++++++++++++++++++
bcf RCSTA,SPEN
bcf RCSTA,CREN
movf RCREG,W         
bsf RCSTA,SPEN
bsf RCSTA,CREN
return


   
PWMs
clrf PWM00
movff TMR0L,TEMPO
movf TEMPO,W
CPFSEQ PWM00,W
bra OKGO
return


OKGO
;----------------------
clrf LEDA ;limpia el registro LEDA para modificarlo y comparalo

movf TEMPO,W ;Puertos A
CPFSLT PWM03,0
bsf LEDA,0

;movf TEMPO,W
CPFSLT PWM04,W
bsf LEDA,1

;movf TEMPO,W
CPFSLT PWM05,W
bsf LEDA,2

;movf TEMPO,W
CPFSLT PWM06,W
bsf LEDA,3

;movf TEMPO,W
CPFSLT PWM07,W
bsf LEDA,4

;movf TEMPO,W
CPFSLT PWM08,W
bsf LEDA,5

movf LEDA,W
CPFSEQ LATA,W ;si no hay cambios en registros
movff LEDA,LATA ;salta el LATCH


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

clrf LEDB ;limpia el registro LEDB para modificarlo y comparalo
movf TEMPO,W ;PUERTOS B
CPFSLT PWM09,W
bsf LEDB,0

;movf TEMPO,W
CPFSLT PWM10,W
bsf LEDB,1

;movf TEMPO,W
CPFSLT PWM11,W
bsf LEDB,2

;movf TEMPO,W
CPFSLT PWM12,W
bsf LEDB,3

;movf TEMPO,W
CPFSLT PWM13,W
bsf LEDB,4

;movf TEMPO,W
CPFSLT PWM14,W
bsf LEDB,5

;movf TEMPO,W
CPFSLT PWM15,W
bsf LEDB,6

;movf TEMPO,W
CPFSLT PWM16,W
bsf LEDB,7

movf LEDB,W
CPFSEQ LATB,W ;si no hay cambios en registros
movff LEDB,LATB


;----------------------------------
clrf LEDD ;limpia el registro LEDD para modificarlo y comparalo

movf TEMPO,W ;PUERTOS D
CPFSLT PWM17,W
bsf LEDD,0

;movf TEMPO,W
CPFSLT PWM18,W
bsf LEDD,1

;movf TEMPO,W
CPFSLT PWM19,W
bsf LEDD,2

;movf TEMPO,W
CPFSLT PWM20,W
bsf LEDD,3

;movf TEMPO,W
CPFSLT PWM21,W
bsf LEDD,4

;movf TEMPO,W
CPFSLT PWM22,W
bsf LEDD,5

;movf TEMPO,W
CPFSLT PWM23,W
bsf LEDD,6

;movf TEMPO,W
CPFSLT PWM24,W
bsf LEDD,7     ;PUERTOS D

movf LEDD,W
CPFSEQ LATD,W ;si no hay cambios en registros
movff LEDD,LATD ;salta el LATCH


;----------------------------
clrf LEDC ;limpia el registro LEDC para modificarlo y comparalo

movf TEMPO,W ;PUERTOS D
CPFSLT PWM25,W
bsf LEDC,0

movf LEDC,W
CPFSEQ LATC,W ;si no hay cambios en registros
movff LEDC,LATC ;salta el LATCH

;........................
movf TEMPO,W

CPFSGT PWM26,W
bSf BAUDCON,SCKP
CPFSLT PWM26,W
bCf BAUDCON,SCKP

movf TEMPO,W

CPFSGT PWM27,W
bcf LATE,0
CPFSLT PWM27,W
bsf LATE,0


return
;-------------------------------------------

;"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
;Lector de DIP switch, se utiliza un DIP 9 en configuracion de matriz
;"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""

LEERDIP

;movlw .
;movwf DIPSWITCH
;bra RecorreDMX

;Assume user has set up PIC, including PORTA I/O direction for each bit
PS_IN ;Entry Label for Parallel to Serial INput
MOVLW D'8' ;8 bits to be read
MOVWF PS_CTR ;Save count
BCF PS_CLOCK ;Ensure that clock is low (may be shared)
BCF PS_SHIFT_NOT_LOAD ;That LOW latched the data for sure
BSF PS_SHIFT_NOT_LOAD ;Now we keep it high so data doesn't change

;Lectura del dato serial transmitido por el 74165. Recibido por PORTA2 del PIC.
PS_LOOP
BTFSS PS_DATA ;Read serial data from port one bit at a time
GOTO GOT_ZERO
BSF STATUS,C ;Load a 1 into carry if bit was a 1
GOTO SHIFT_IN

GOT_ZERO
BCF STATUS,C ;Load a 0 into carry if bit was a 0

SHIFT_IN
  RLCF DIPSWITCH,F ;Assemble bit into Left-shifting byte     ??????-->RRC
  BSF PS_CLOCK ;Shift the data in the 74165 to get ready
;to possibly read the NEXT bit...
  BCF PS_CLOCK ;Terminate the Clock pulse!
  DECFSZ PS_CTR,F ;Update our counter
  GOTO PS_LOOP ;If not done, do next bit

  ;RETURN ;Return with data in PS_IN_REG


btfsc DIP9
call DEMORA
bcf HIGH(DIPSWITCH),0
btfsc DIP9
bsf HIGH(DIPSWITCH),0

clrf COMPARA
movf DIPSWITCH,W
CPFSEQ COMPARA,W ;si no hay cambios en registros
bra RecorreDMX

btfss DIP9
incf DIPSWITCH
bcf HIGH(DIPSWITCH),0



;---------------------------------------------------------
;Convertir EL DIPSWITCH a un Canal
;---------------------------------------------------------
 
RecorreDMX
decf DIPSWITCH,F
movf DIPSWITCH,W
CPFSEQ CHANNELDMX,W ;si no hay cambios en registros
bra GrabarCh
return

GrabarCh
movff DIPSWITCH,CHANNELDMX

movff CHANNELDMX,CHANNEL01
incf CHANNELDMX,F
movff CHANNELDMX,CHANNEL02
incf CHANNELDMX,F
movff CHANNELDMX,CHANNEL03
incf CHANNELDMX,F
movff CHANNELDMX,CHANNEL04
incf CHANNELDMX,F
movff CHANNELDMX,CHANNEL05
incf CHANNELDMX,F
movff CHANNELDMX,CHANNEL06
incf CHANNELDMX,F
movff CHANNELDMX,CHANNEL07
incf CHANNELDMX,F
movff CHANNELDMX,CHANNEL08
incf CHANNELDMX,F
movff CHANNELDMX,CHANNEL09
incf CHANNELDMX,F
movff CHANNELDMX,CHANNEL10
incf CHANNELDMX,F
movff CHANNELDMX,CHANNEL11
incf CHANNELDMX,F
movff CHANNELDMX,CHANNEL12
incf CHANNELDMX,F
movff CHANNELDMX,CHANNEL13
incf CHANNELDMX,F
movff CHANNELDMX,CHANNEL14
incf CHANNELDMX,F
movff CHANNELDMX,CHANNEL15
incf CHANNELDMX,F
movff CHANNELDMX,CHANNEL16
incf CHANNELDMX,F
movff CHANNELDMX,CHANNEL17
incf CHANNELDMX,F
movff CHANNELDMX,CHANNEL18
incf CHANNELDMX,F
movff CHANNELDMX,CHANNEL19
incf CHANNELDMX,F
movff CHANNELDMX,CHANNEL20
incf CHANNELDMX,F
movff CHANNELDMX,CHANNEL21
incf CHANNELDMX,F
movff CHANNELDMX,CHANNEL22
incf CHANNELDMX,F
movff CHANNELDMX,CHANNEL23
incf CHANNELDMX,F
movff CHANNELDMX,CHANNEL24
incf CHANNELDMX,F
movff CHANNELDMX,CHANNEL25
incf CHANNELDMX,F
movff CHANNELDMX,CHANNEL26
incf CHANNELDMX,F
movff CHANNELDMX,CHANNEL27
return



ERRORDMX
movlw .255
movwf LATA
movwf LATD
movwf LATB
return









LIMPIA
clrf LATA
clrf LATD
clrf LATB
clrf CCPR1L
clrf CCPR2L

RETURN




;RUTINAS DE PRUEBAS@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@













SHOWME
movf CHANNEL01,W
CPFSEQ LATD,W ;si no hay cambios en registros
movff CHANNEL01,LATD

btfsc HIGH(CHANNEL01),0
bsf PORTB,0
btfss HIGH(CHANNEL01),0
bcf PORTB,0
return

CANAL
movlw .7
movwf LOW(CHANNELDMX)
movlw .1
movwf HIGH(CHANNELDMX)
return

DELAY
NOP
NOP
NOP
NOP
NOP
return



btfss DIP9
call DEMORA
btfss DIP9
call DEMORA
btfss DIP9
bcf HIGH(DIPSWITCH),0


btfsc DIP9
call DEMORA
btfsc DIP9
call DEMORA
btfsc DIP9
bsf HIGH(DIPSWITCH),0


clrf COMPARA
movf DIPSWITCH,W
CPFSEQ COMPARA,W ;si no hay cambios en registros
bra RecorreDMX

btfss DIP9
incf DIPSWITCH
bcf HIGH(DIPSWITCH),0

END

Título: Re: AYUDA DMX 512 Receptor de 27 canales RGB
Publicado por: KILLERJC en 02 de Junio de 2015, 00:57:31
Ese codigo le faltan VARIAS cosas.
Ni siquiera esta completo, en especial la parte de las interrupciones, hay codigo redundante que sobra.

Pero se puede distinguir 3 cosas claramente.
1 - Recepcion de datos con un buffer de 512bytes (? No se por que tanto, no se si es asi el protocolo DMX
2 - Activacion de PWM ( Muy simple, 2 PWM por HW y 25PWM por soft utilizando un timer y comparando 1 por 1 los registros de los PWM por software y activando las salidas, se podria simplificar un poco mas el codigo usando POSTINC )
3 - Lectura de DIPSWITCH sinceramente no se que quiso hacer ahi, pero tampoco se que pines utiliza, ya que el esquema son todas salidas dejando pocos pines para hacer eso.

Mi mayor problema es que no conozco la trama DMX512, pero eso es lo que vi del archivo.
Lo que si noto es la falta de las interrupciones y un problema principal que es la actualizacion de los PWM. Que estan siendo llamados en cualquier momento y solo se habilita SI el TMR rebalso asi que si es cualquier cosa.

Pero el funcionamiento principal es:

Entra a una interrupcion, incrementa variable TEMPO, luego compara con los registros PWM3 a PWM27 y activa o desactiva las entradas. Fin.
Título: Re:AYUDA DMX 512 Receptor de 27 canales RGB
Publicado por: w3-sistemas en 16 de Enero de 2016, 10:19:23
hola, creo que le estas errando en algo, pero primero unas consultas
27 canales para que dame una idea yo estoy en algo similar con 30 canales
y no utilizo tantas salidas sino 1 sola y unos integrados auxiliares
de mi manera hasta puedo hacer mas de 2000 canales
por eso te consulto para que tantos canales asi veo si te sirve lo mio, saludos