TODOPIC
Mecatrónica => DMX512 - Diseños y Proyectos => Mensaje iniciado 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
-
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....
-
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.
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
-
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.
-
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